From: James P. T. <jpt...@us...> - 2007-08-21 14:09:05
|
Update of /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/RequirementLib In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv29401/Utilities/AAFAnalyzer/RequirementLib Modified Files: Requirement.cpp Requirement.h RequirementLoader.cpp RequirementLoader.h Log Message: First large set of changes to the core analyzer code for this new phase of work: 1. Improve the method by which references are represented in the graph. The original implementation added reference edges from SourceClip objects to the referenced mob, slot, and individual components. That was not exactly as originally as intended and added unnecessarily difficulty when interpreting dumps of the data structure. Now it represents the references exactly as intended by the AAF model, i.e. src clip -> mob -> slot -> component. It no longer resolves components down to just the referenced region, however. I may bring that back in the future. This affected the base Visitor class and the ResolveReferenceVisitor implementation. 2. Improved the dump capability to reflect changes above. It now has the ability to dump the graph of contained objects starting with the header (i.e. the AAF directly) or the combined reference and contained objects starting with the top level composition. The dump also shows whether an object appears because it is contained by a parent or referenced (via a soruce reference) by a parent object. Dumps of the data structure are now very easy to interpret - very important when debugging the application. 3. Major restructuring of the TestResult class hieararchy. I found the original implementation too complicated. Too many things that had to be understood just to add a single result and to maintain the aggregate results. The new code retains the basic TopLevel, PhaseLevel, TestLevel, and DetailLevel result hiearchy but simplifies it such that (only) DetailLevel results report directly against a single requirement. All other higher level results are the aggregate of child results. A single call to consolidate results before they are reported takes care of computing the aggregrates. The interface by which detailed results are added to test level results is simpler. There is now one call to add a detailed result (i.e. report a result for a requirement). The redundant "doc ref" attribute was removed from the results. A document reference is associated with the requirement and that's sufficient. The relationship between test results and there associated test is now simpler and the initial set of covered requirements for a TestLevelTestResult object is now automatically initialized from the associated test. These changes significantly reduced the size and complexity of the test result code and remove a lot of repeated boiler plate code fragments that appeared throughout code base. 4. Some minor rearrangement of certain files to better reflect their role. Move reference resolution related files from EditProtocolTestImpl back down to BaseTestImpl where it was to begin with (it is unrelated to the EP per se). It must execute as part of the load phase (in BaseTestImpl) to build and resolve the test graph so that it can be dumped to verify correctness before moving onto the more detailed EP tests. Renamed TestVisitor to DumpVisitor to better reflect it (evolved) purpose. 5. Modified the default result output to include the reasons why a test failed rather than just information about teh requirement that failed. 6. The changes in item 1 above resovled erroneous mob dependency chain errors that were reported for certain files in the ep 2006 sample file set. See tracker item 1761537 "invalid derivation chain failure for sample file". 7. Resolve tracker item 1771387 "invalid slot id failure". Added REQ_EP_257 to cover this case. 8. Resolve tracker item 1777304 "Unique slot names enforced file wide not per mob. " Sorry for the large comment. This is the result of synchronizing several weeks worth of work saved in my local source repository. Index: RequirementLoader.h =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/RequirementLib/RequirementLoader.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** RequirementLoader.h 18 Jul 2007 05:42:59 -0000 1.5 --- RequirementLoader.h 21 Aug 2007 14:08:34 -0000 1.6 *************** *** 50,65 **** private: ! wstring _currentData; ! wstring _currentId; ! Requirement::RequirementType _currentType; ! wstring _currentTypeAsString; ! Requirement::Category _currentCategory; ! wstring _currentCategoryAsString; ! wstring _currentName; ! wstring _currentDesc; ! wstring _currentDocument; ! wstring _currentVersion; ! wstring _currentSection; map<wstring, Requirement::Category> _categoryMap; --- 50,84 ---- private: ! struct Current ! { ! Current() ! : Data(), ! Id(), ! Type(Requirement::REQ_TYPE_UNDEFINED), ! TypeAsString(), ! Category(Requirement::CAT_UNDEFINED), ! CategoryAsString(), ! Name(), ! Desc(), ! Document(), ! Version(), ! Section() ! {} ! ! wstring Data; ! ! wstring Id; ! Requirement::RequirementType Type; ! wstring TypeAsString; ! Requirement::Category Category; ! wstring CategoryAsString; ! wstring Name; ! wstring Desc; ! wstring Document; ! wstring Version; ! wstring Section; ! }; ! Current _current; map<wstring, Requirement::Category> _categoryMap; Index: Requirement.h =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/RequirementLib/Requirement.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Requirement.h 18 Jul 2007 05:42:59 -0000 1.6 --- Requirement.h 21 Aug 2007 14:08:33 -0000 1.7 *************** *** 41,47 **** typedef shared_ptr<RequirementMap> RequirementMapSP; ! enum RequirementType {FILE, APP, DEFINITION}; ! enum Category {GENERAL, IMPORT_EXPORT, COMPOSITIONAL, METADATA, MIXDOWN, AUXILIARY_FILE, ANNOTATIONS, EFFECT, OPTIONAL_PROPERTIES, STRUCTURED_STORAGE, PROTOCOL, --- 41,47 ---- typedef shared_ptr<RequirementMap> RequirementMapSP; ! enum RequirementType {REQ_TYPE_UNDEFINED, FILE, APP, DEFINITION}; ! enum Category {CAT_UNDEFINED, GENERAL, IMPORT_EXPORT, COMPOSITIONAL, METADATA, MIXDOWN, AUXILIARY_FILE, ANNOTATIONS, EFFECT, OPTIONAL_PROPERTIES, STRUCTURED_STORAGE, PROTOCOL, *************** *** 70,74 **** const wstring& GetSection() const; ! // Conviencie accessors const wstring& GetRequirementTypeAsString() const; const wstring& GetCategoryAsString() const; --- 70,74 ---- const wstring& GetSection() const; ! // Convenience accessors const wstring& GetRequirementTypeAsString() const; const wstring& GetCategoryAsString() const; Index: RequirementLoader.cpp =================================================================== RCS file: /cvsroot/aaf/AAF/Utilities/AAFAnalyzer/RequirementLib/RequirementLoader.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** RequirementLoader.cpp 18 Jul 2007 05:42:59 -0000 1.6 --- RequirementLoader.cpp 21 Aug 2007 14:08:33 -0000 1.7 *************** *** 58,61 **** --- 58,63 ---- RequirementLoader::RequirementLoader() + : _current(), + _categoryMap() { _categoryMap[L"general"] = Requirement::GENERAL; *************** *** 133,136 **** --- 135,141 ---- if ( name == L"requirement" ) { + // Reset _current by assigning a new, empty, Current object. + _current = RequirementLoader::Current(); + wostringstream msg; msg << attribs[1]; *************** *** 142,154 **** if ( type == L"app" ) { ! _currentType = Requirement::APP; } else if ( type == L"file" ) { ! _currentType = Requirement::FILE; } else if ( type == L"def" ) { ! _currentType = Requirement::DEFINITION; } else --- 147,159 ---- if ( type == L"app" ) { ! _current.Type = Requirement::APP; } else if ( type == L"file" ) { ! _current.Type = Requirement::FILE; } else if ( type == L"def" ) { ! _current.Type = Requirement::DEFINITION; } else *************** *** 158,167 **** throw RequirementXMLException(msg.str().c_str() ); } ! _currentTypeAsString = type; if ( _categoryMap.find( category ) != _categoryMap.end() ) { ! _currentCategory = _categoryMap[category]; ! _currentCategoryAsString = category; } else --- 163,172 ---- throw RequirementXMLException(msg.str().c_str() ); } ! _current.TypeAsString = type; if ( _categoryMap.find( category ) != _categoryMap.end() ) { ! _current.Category = _categoryMap[category]; ! _current.CategoryAsString = category; } else *************** *** 175,215 **** else if ( name == L"id" ) { ! _currentData = L""; } else if ( name == L"name" ) { ! _currentData = L""; } else if ( name == L"desc" ) { ! _currentData = L""; } else if ( name == L"doc" ) { ! _currentData = L""; } else if ( name == L"version" ) { ! _currentData = L""; } else if ( name == L"section" ) { ! _currentData = L""; } else if ( name == L"ref" ) { ! _currentData = L""; } else if ( name == L"requirement-set" ) { ! _currentData = L""; } else if ( name == L"requirement-set-name" ) { ! _currentData = L""; } else if ( name == L"requirement-set-version" ) { ! _currentData = L""; } else --- 180,220 ---- else if ( name == L"id" ) { ! _current.Data = L""; } else if ( name == L"name" ) { ! _current.Data = L""; } else if ( name == L"desc" ) { ! _current.Data = L""; } else if ( name == L"doc" ) { ! _current.Data = L""; } else if ( name == L"version" ) { ! _current.Data = L""; } else if ( name == L"section" ) { ! _current.Data = L""; } else if ( name == L"ref" ) { ! _current.Data = L""; } else if ( name == L"requirement-set" ) { ! _current.Data = L""; } else if ( name == L"requirement-set-name" ) { ! _current.Data = L""; } else if ( name == L"requirement-set-version" ) { ! _current.Data = L""; } else *************** *** 228,260 **** { shared_ptr<const Requirement> req(new Requirement( ! _currentId, _currentType, _currentTypeAsString, ! _currentCategory, _currentCategoryAsString, ! _currentName, ! _currentDesc, _currentDocument, _currentVersion, _currentSection )); RequirementRegistry::GetInstance().Register( req ); } else if ( name == L"id" ) { ! _currentId = _currentData; } else if ( name == L"name" ) { ! _currentName = _currentData; } else if ( name == L"desc" ) { ! _currentDesc = _currentData; } else if ( name == L"doc" ) { ! _currentDocument = _currentData; } else if ( name == L"version" ) { ! _currentVersion = _currentData; } else if ( name == L"section" ) { ! _currentSection = _currentData; } else if ( name == L"ref" ) --- 233,265 ---- { shared_ptr<const Requirement> req(new Requirement( ! _current.Id, _current.Type, _current.TypeAsString, ! _current.Category, _current.CategoryAsString, ! _current.Name, ! _current.Desc, _current.Document, _current.Version, _current.Section )); RequirementRegistry::GetInstance().Register( req ); } else if ( name == L"id" ) { ! _current.Id = _current.Data; } else if ( name == L"name" ) { ! _current.Name = _current.Data; } else if ( name == L"desc" ) { ! _current.Desc = _current.Data; } else if ( name == L"doc" ) { ! _current.Document = _current.Data; } else if ( name == L"version" ) { ! _current.Version = _current.Data; } else if ( name == L"section" ) { ! _current.Section = _current.Data; } else if ( name == L"ref" ) *************** *** 286,290 **** void RequirementLoader::EndData(const wstring& contents) { ! _currentData += contents; } --- 291,295 ---- void RequirementLoader::EndData(const wstring& contents) { ! _current.Data += contents; } |