{section: ClassAd Conversion Todo List}

This is the set of tasks that need to be done to convert from old to new {quote:ClassAds}. Code changes for this {quote:ToDo} list should be associated with ticket #619.


{subsection: Pre-Transition Tasks}

*: Check in Varghese's {quote:ClassAdList} class that works with new {quote:ClassAds}. *DONE*

*: Add a method to Varghese's new {quote:ClassAdList} to move an ad from one list to another. *DONE*

*: Add or fix compatibility for following old {quote:ClassAd} methods:
*:: Block {quote:#1} *[3 days]*:
*::: ClassAd::Assign() *DONE*
*::: ClassAd::LookupString(MyString) *DONE*
*::: ClassAd::Insert(const char*) *DONE*
*::: ClassAd::Insert(const char*,ExprTree*) *DONE*
*::: ClassAd::Lookup() *DONE*
*::: ClassAd::put() *Theoretically code complete, needs testing.*
*::: ClassAd::initFromStream() *Theoretically code complete, needs testing.*
*::: ClassAd::AssignExpr() *DONE*
*::: ClassAd::clear() *DONE*
*::: ClassAd::EvalString(const char*, const class AttrList*, char**) *DONE*
*::: ClassAd::EvalString(const char*, const class AttrList*, MyString&) *DONE*
*::: ClassAd::NextNameOriginal() *DONE*
*::: ClassAd::ResetName() *DONE*
*:: Block {quote:#2} *[4 days]*:
*::: ClassAd::sPrintExpr() *DONE*
*::: ClassAd::NextExpr() *DONE*
*::: ClassAd::NextDirtyExpr() *DONE*
*::: ClassAd::SetDirtyFlag() *DONE, needs callsite changes*
*::: ClassAd::GetDirtyFlag() *DONE, needs callsite changes*
*::: ClassAd::ClearAllDirtyFlags() *DONE*
*::: ClassAd::GetReferences() *INCOMPLETE*
*::: ClassAd::ChainCollapse() *DONE*
*::: ClassAd::EscapeStringValue() *DONE, will need callsite changes*
*::: ClassAd::CopyAttribute() *DONE, needs callsite changes*
*::: ClassAd::fPrintAsXML() *DONE*
*::: ClassAd::sPrintAsXML() *DONE*
*::: ClassAd::IsValidAttrValue() *DONE*
*::: ExprTree::DeepCopy() *DONE*

*: Write helper functions for these methods which we can't emulate transparently *[4 hours]*:
*:: ExprTree::PrintToNewStr() *DONE*
*:: ExprTree::PrintToStr() *DONE*
*:: ExprTree::EvalTree() *DONE, needs callsite changes*

*: Write compatibility versions of these free-standing functions that are part of old {quote:ClassAds}:
*:: int Parse(const char*s, MyString&name, ExprTree*&tree, int*pos = NULL) *DONE*
*:: int ParseClassAdRvalExpr(const char*s, ExprTree*&tree, int*pos = NULL) *DONE*
*:: const char * ExprTreeToString( ExprTree*expr ) *DONE*
*:: bool EvalBool(ClassAd *ad, const char *constraint)
*:: bool EvalBool(AttrList * ad, ExprTree * tree)
*:: bool ClassAdsAreSame( ClassAd * ad1, ClassAd * ad2,
StringList * ignored_attrs=NULL, bool verbose=false )
*:: bool IsAMatch(const ClassAd * ad1, const ClassAd * ad2)
*:: bool IsAHalfMatch(const ClassAd * request, const ClassAd * offer)

*: Add {quote:ClassAds} functions that are in old {quote:ClassAds} but not in new {quote:ClassAds} *[2 days]*:
*:: *Note: these are known as FunctionStringlistFOO, and are in condor_ast.cpp*
*:: stringListSize()
*:: stringListSum()
*:: stringListAve()
*:: stringListMin()
*:: stringListMax()
*:: stringListMember()
*:: stringListIMember()
*:: stringListRegexpMember()

*: Arrange header and make files so that switching between old and new {quote:ClassAds} can be done with the flip of a switch. *[1 day]*.

*: Fix up the one or two callsites in matchmaker.cpp that move an ad from one {quote:ClassAdList} to another *[4 hours]*.

*: The following methods will need some fixing at the callsites *[5 days]*:
*:: ExprTree::RArg() *DONE*
*:: ExprTree::LArg() *DONE*
*:: ExprTree::PrintToNewStr() *DONE*
*:: ExprTree::EvalTree() *DONE*
*:: ClassAd(char*,char) *DONE*
*:: ExprTree::PrintToStr() *DONE*
*:: ExprTree::MyType()
*:: ClassAd::ExchangeExpressions() *DONE*
*:: ClassAd::unchain() *DONE*
*:: ClassAd::RestoreChain() *DONE*
*:: AttrList::put()
*:: AttrList::initFromStream()

{subsection: Post-Transition Tasks}

*: As time permits, rewrite callsites to make {quote:CompatClassAd} unnecessary. The modified callsites can either use native new {quote:ClassAd} methods or newly-written free-standing functions.
*:: Replace all usage of attribute {quote:CurrentTime} with {quote:ClassAd} function time(). This can start before the flag day.