LIBSBML_CPP_NAMESPACE_BEGIN /* * takes an annotation that has been read into the model * identifies the RDF elements * and creates a List of CVTerms from the annotation */ void RDFAnnotationParser::parseRDFAnnotation(const XMLNode * annotation, List * CVTerms) { if (annotation == NULL) return; const string& name = annotation->getName(); const XMLNode* RDFTop = NULL; unsigned int n = 0; CVTerm * term; if (CVTerms == NULL) CVTerms = new List(); // need to find the RDF desciption opening annotation if (name == "annotation" && annotation->getNumChildren() > 0) { while (n < annotation->getNumChildren()) { const string &name1 = annotation->getChild(n).getName(); if (name1 == "RDF") { if (annotation->getChild(n).getNumChildren() > 0) { if (annotation->getChild(n).getChild(0).getName() == "Description") { RDFTop = &(annotation->getChild(n).getChild(0)); break; } } } n++; } } // find qualifier nodes and create CVTerms n = 0; if (RDFTop != NULL) { while (n < RDFTop->getNumChildren()) { const string &name2 = RDFTop->getChild(n).getPrefix(); if (name2 == "bqbiol" || name2 == "bqmodel") { term = new CVTerm(RDFTop->getChild(n)); if (term->getResources()->getLength() > 0) CVTerms->add((void *)term); } n++; } } }
/* * internal sub function that derives the cvterms from the annotation */ void RDFAnnotationParser::deriveCVTermsFromAnnotation( const XMLNode * annotation, List * CVTerms) { if (annotation == NULL) return; // the annotation passed in may have a toplevel annotation tag BUT // it may not be- so need to check // if it isnt then it must be RDF or we do not have an rdf annotation bool topLevelIsAnnotation = false; if (annotation->getName() == "annotation") { topLevelIsAnnotation = true; } CVTerm * term; if (CVTerms == NULL) CVTerms = new List(); const XMLNode* RDFDesc = NULL; if (topLevelIsAnnotation == true) { RDFDesc = &(annotation->getChild("RDF").getChild("Description")); } else { if (annotation->getName() == "RDF") { RDFDesc = &(annotation->getChild("Description")); } } // find qualifier nodes and create CVTerms unsigned int n = 0; if (RDFDesc != NULL) { while (n < RDFDesc->getNumChildren()) { const string &name2 = RDFDesc->getChild(n).getPrefix(); if (name2 == "bqbiol" || name2 == "bqmodel") { term = new CVTerm(RDFDesc->getChild(n)); if (term->getResources()->getLength() > 0) CVTerms->add((void *)term); } n++; } } // rest modified flags for (n = 0; n < CVTerms->getSize(); n++) { static_cast<CVTerm*>(CVTerms->get(n))->resetModifiedFlags(); } }
XMLNode * RDFAnnotationParser::createCVTerms(const SBase * object) { if (object == NULL) return NULL; /* create the basic triples */ XMLTriple li_triple = XMLTriple("li", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf"); XMLTriple bag_triple = XMLTriple("Bag", "http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf"); /* attributes */ XMLAttributes blank_att = XMLAttributes(); /* tokens */ XMLToken bag_token = XMLToken(bag_triple, blank_att); std::string prefix; std::string name; std::string uri; XMLAttributes *resources; XMLNode *description = createRDFDescription(object); /* loop through the cv terms and add */ /* want to add these in blocks of same qualifier */ if (object->getCVTerms()) { for (unsigned int n = 0; n < object->getCVTerms()->getSize(); n++) { CVTerm* current = static_cast <CVTerm *> (object->getCVTerms()->get(n)); if (current == NULL) continue; if (current->getQualifierType() == MODEL_QUALIFIER) { prefix = "bqmodel"; uri = "http://biomodels.net/model-qualifiers/"; const char* term = ModelQualifierType_toString( current->getModelQualifierType()); if (term == NULL) return NULL; name = term; } else if (current ->getQualifierType() == BIOLOGICAL_QUALIFIER) { prefix = "bqbiol"; uri = "http://biomodels.net/biological-qualifiers/"; const char* term = BiolQualifierType_toString( current->getBiologicalQualifierType()); if (term == NULL) return NULL; name = term; } else { continue; } resources = current->getResources(); XMLNode bag(bag_token); for (int r = 0; r < resources->getLength(); r++) { XMLAttributes att; att.add(resources->getName(r), resources->getValue(r)); XMLToken li_token(li_triple, att); li_token.setEnd(); XMLNode li(li_token); bag.addChild(li); } XMLTriple type_triple(name, uri, prefix); XMLToken type_token(type_triple, blank_att); XMLNode type(type_token); type.addChild(bag); description->addChild(type); } } return description; }