libCERTI/XmlParser.cc | 138 ++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 126 insertions(+), 12 deletions(-) diff --git a/libCERTI/XmlParser.cc b/libCERTI/XmlParser.cc index 2273a78..aa665a0 100644 --- a/libCERTI/XmlParser.cc +++ b/libCERTI/XmlParser.cc @@ -160,17 +160,82 @@ XmlParser::parseClass(ObjectClass* parent) xmlNodePtr prev = cur ; /* note how objectHandle counter is incremented */ - ObjectClass* current = new ObjectClass(std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)),freeObjectClassHandle++); + CleanXmlGetProp temp = CleanXmlGetProp(cur,ATTRIBUTE_NAME); + std::string lObjectClassName = ""; + if (!temp) + { + D.Out(pdTrace, "Invalid FOM file structure - ObjectClass not found"); + //try to load a 1516e FOM file instead + xmlNodePtr temp = cur->children ; + while (temp != NULL) + { + if ((!xmlStrcmp(temp->name, ATTRIBUTE_NAME))) + { + if (temp->children && temp->children->content) + { + lObjectClassName = std::string((char*)temp->children->content); + break; + } + else + { + throw CouldNotOpenFED("Invalid FOM file structure - ObjectClassName not found"); + } + } + temp = temp->next ; + } + + if (temp == NULL) + { + //cout << "Invalid FOM file structure - ObjectClass not found" << endl ; + throw CouldNotOpenFED("Invalid FOM file structure - ObjectClass not found"); + } + } + else + { + lObjectClassName = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); + } + + ObjectClass* current = new ObjectClass(lObjectClassName,freeObjectClassHandle++); root->addObjectClass(current, parent); cur = cur->xmlChildrenNode ; while (cur != NULL) { // Attributes - if ((!xmlStrcmp(cur->name, NODE_ATTRIBUTE))) { - std::string name = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); + if ((!xmlStrcmp(cur->name, NODE_ATTRIBUTE))) + { + std::string lAttributeName=""; + + CleanXmlGetProp tempattribute = CleanXmlGetProp(cur,ATTRIBUTE_NAME); + + if (tempattribute) + { + lAttributeName = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); + } + else + { + //try to load a 1516e FOM file instead + xmlNodePtr temp = cur->children ; + while (temp != NULL) + { + if ((!xmlStrcmp(temp->name, ATTRIBUTE_NAME))) + { + if (temp->children && temp->children->content) + { + lAttributeName = std::string((char*)temp->children->content); + break; + } + else + { + throw CouldNotOpenFED("Invalid FOM file structure - ObjectClassName not found"); + } + } + temp = temp->next ; + } + } + AttributeHandle attributeHandle = current->getHandleClassAttributeMap().size() + 1; - ObjectClassAttribute *attr = new ObjectClassAttribute(name, attributeHandle); + ObjectClassAttribute *attr = new ObjectClassAttribute(lAttributeName, attributeHandle); // Transportation xmlChar* xtransport = xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION); @@ -228,16 +293,40 @@ void XmlParser::parseInteraction(Interaction* parent) { Debug(D, pdTrace) << "New Interaction Class" << endl; - std::string name; + std::string lInteractionName; TransportType transport; OrderType order; xmlNodePtr prev = cur ; // Name - name = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); - + if (CleanXmlGetProp(cur,ATTRIBUTE_NAME)) + { + lInteractionName = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); + } + else + { + //try to load a 1516e FOM file instead + xmlNodePtr temp = cur->children ; + while (temp != NULL) + { + if ((!xmlStrcmp(temp->name, ATTRIBUTE_NAME))) + { + if (temp->children && temp->children->content) + { + lInteractionName = std::string((char*)temp->children->content); + break; + } + else + { + throw CouldNotOpenFED("Invalid FOM file structure - Name not found"); + } + } + temp = temp->next ; + } + } // Transportation + transport = BEST_EFFORT ; //default xmlChar* xtransport = xmlGetProp(cur, ATTRIBUTE_TRANSPORTATION); if (!xmlStrcmp(xtransport, VALUE_RELIABLE)) { transport = RELIABLE ; @@ -251,6 +340,7 @@ XmlParser::parseInteraction(Interaction* parent) // Order xmlChar* xorder = xmlGetProp(cur, ATTRIBUTE_ORDER); + order = RECEIVE; //default; if (!xmlStrcmp(xorder, VALUE_TSO)) { order = TIMESTAMP ; } @@ -259,8 +349,8 @@ XmlParser::parseInteraction(Interaction* parent) order = RECEIVE ; } } - xmlFree(xorder); - Interaction* current = new Interaction(name,freeInteractionClassHandle++,transport,order); + if (xorder) xmlFree(xorder); + Interaction* current = new Interaction(lInteractionName,freeInteractionClassHandle++,transport,order); // Routing space char *space = (char *) xmlGetProp(cur, ATTRIBUTE_SPACE); @@ -275,7 +365,7 @@ XmlParser::parseInteraction(Interaction* parent) } current->setSpace(h); } - xmlFree(space); + if (space) xmlFree(space); // Add to interactions list, and build inheritance relation root->addInteractionClass(current,parent); @@ -283,8 +373,32 @@ XmlParser::parseInteraction(Interaction* parent) cur = cur->xmlChildrenNode ; while (cur != NULL) { if ((!xmlStrcmp(cur->name, NODE_PARAMETER))) { - std::string name(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); - Parameter *param = new Parameter(name, freeParameterHandle++); + std::string nameAttr; + if (CleanXmlGetProp(cur,ATTRIBUTE_NAME)) + { + nameAttr = std::string(CleanXmlGetProp(cur,ATTRIBUTE_NAME)); + } + else + { + xmlNodePtr temp = cur->children ; + while (temp != NULL) + { + if ((!xmlStrcmp(temp->name, ATTRIBUTE_NAME))) + { + if (temp->children && temp->children->content) + { + nameAttr = std::string((char*)temp->children->content); + break; + } + else + { + throw CouldNotOpenFED("Invalid FOM file structure - Name not found"); + } + } + temp = temp->next ; + } + } + Parameter *param = new Parameter(nameAttr, freeParameterHandle++); current->addParameter(param); } // Subinteraction