void checkBooleans(SBMLDocument* doc, set<string>& components, set<string>& tests) { if (doc->getLevel() < 3) { return; } if (doc->getVersion() < 2) { return; } SBMLDocument* translatedDoc = doc->clone(); if (translatedDoc->setLevelAndVersion(3, 1, true)) { //Successful translation means that there is no use of booleans in numeric contexts, or visa versa. return; } SBMLErrorLog* errlog = translatedDoc->getErrorLog(); if (errlog->contains(10209) || errlog->contains(10210) || errlog->contains(10211) || errlog->contains(10212) || errlog->contains(10213) || errlog->contains(10217) || errlog->contains(98006) || errlog->contains(21202) || errlog->contains(21001)) { tests.insert("BoolNumericSwap"); } }
END_TEST START_TEST (test_comp_flatten_unknown_20) { SBMLDocument* doc = TestFlattenedUnknownAbortNone("unknown20.xml", "unknown20_flat.xml"); SBMLErrorLog* errors = doc->getErrorLog(); fail_unless(errors->getNumErrors() == 4); fail_unless(errors->contains(RequiredPackagePresent) == true); fail_unless(errors->contains(CompFlatteningNotRecognisedReqd) == true); fail_unless(errors->contains(CompIdRefMayReferenceUnknownPackage) == true); delete doc; }
END_TEST START_TEST (test_comp_flatten_unknown_17) { SBMLDocument* doc = TestFlattenedUnknownNoValidate("unknown17.xml", "unknown17_flat.xml"); SBMLErrorLog* errors = doc->getErrorLog(); fail_unless(errors->getNumErrors() == 3); fail_unless(errors->contains(UnrequiredPackagePresent) == true); fail_unless(errors->contains(CompFlatteningNotRecognisedNotReqd) == true); fail_unless(errors->contains(CompIdRefMayReferenceUnknownPackage) == true); delete doc; }
END_TEST START_TEST (test_comp_flatten_unknown_withValidation_20) { SBMLDocument* doc = TestFlattenedUnknownValidateFailsFlattening("unknown20.xml"); SBMLErrorLog* errors = doc->getErrorLog(); //fail_unless(errors->getNumErrors() == 7); fail_unless(errors->contains(RequiredPackagePresent) == true); fail_unless(errors->contains(CompFlatteningNotRecognisedReqd) == true); //fail_unless(errors->contains(CompLineNumbersUnreliable) == true); //fail_unless(errors->contains(CompIdRefMayReferenceUnknownPackage) == true); delete doc; }
END_TEST START_TEST (test_comp_flatten_unknown_21) { string filename(TestDataDirectory); //string filename("C:\\Development\\libsbml\\src\\sbml\\packages\\comp\\util\\test\\test-data\\"); ConversionProperties props; props.addOption("flatten comp"); props.addOption("basePath", filename); props.addOption("performValidation", false); SBMLConverter* converter = SBMLConverterRegistry::getInstance().getConverterFor(props); // load document string cfile = filename + "flatten_fail_unknown.xml"; SBMLDocument* doc = readSBMLFromFile(cfile.c_str()); // fail if there is no model (readSBMLFromFile always returns a valid document) fail_unless(doc->getModel() != NULL); // write the doc before we attempt conversion string newModel = writeSBMLToStdString(doc); converter->setDocument(doc); int result = converter->convert(); // we should fail because we are testing the restoreNamespaces function fail_unless(result == LIBSBML_OPERATION_FAILED); string flatModel = writeSBMLToStdString(doc); fail_unless(flatModel == newModel); delete converter; SBMLErrorLog* errors = doc->getErrorLog(); fail_unless(errors->getNumErrors() == 2); fail_unless(errors->contains(RequiredPackagePresent) == true); fail_unless(errors->contains(CompFlatteningNotRecognisedReqd) == true); //fail_unless(errors->contains(CompModelFlatteningFailed) == true); //fail_unless(errors->contains(CompSubmodelMustReferenceModel) == true); delete doc; }
END_TEST START_TEST(test_SBMLErrorLog_removeAll) { SBMLErrorLog log; // add errors log.add(SBMLError(1234, 2, 4)); log.add(SBMLError(1234, 2, 4)); log.add(SBMLError(1234, 2, 4)); log.add(SBMLError(1234, 2, 4)); fail_unless(log.contains(1234) == true); log.remove(1234); fail_unless(log.contains(1234) == true); log.removeAll(1234); fail_unless(log.contains(1234) == false); }
END_TEST START_TEST (test_comp_flatten_unknown_withValidation_19) { SBMLDocument* doc = TestFlattenedUnknownValidate("unknown19.xml", "unknown19_flat.xml"); SBMLErrorLog* errors = doc->getErrorLog(); fail_unless(errors->getNumErrors() == 4); //fail_unless(errors->contains(UnrequiredPackagePresent) == true); fail_unless(errors->contains(CompFlatteningNotRecognisedNotReqd) == true); delete doc; }
int CompModelPlugin::saveAllReferencedElements(set<SBase*> uniqueRefs, set<SBase*> replacedBys) { SBMLDocument* doc = getSBMLDocument(); Model* model = static_cast<Model*>(getParentSBMLObject()); if (model==NULL) { if (doc) { string error = "Unable to discover any referenced elements in CompModelPlugin::saveAllReferencedElements: no Model parent of the 'comp' model plugin."; doc->getErrorLog()->logPackageError("comp", CompModelFlatteningFailed, getPackageVersion(), getLevel(), getVersion(), error); } return LIBSBML_OPERATION_FAILED; } int ret = LIBSBML_OPERATION_SUCCESS; //Get a list of everything, pull out anything that's a deletion, replacement, or port, and save what they're pointing to. //At the same time, make sure that no two things point to the same thing. set<SBase*> RE_deletions = set<SBase*>(); //Deletions only point to things in the same model. List* allElements = model->getAllElements(); string modname = "the main model in the document"; if (model->isSetId()) { modname = "the model '" + model->getId() + "'"; } set<SBase*> todelete; for (unsigned int el=0; el<allElements->getSize(); el++) { SBase* element = static_cast<SBase*>(allElements->get(el)); int type = element->getTypeCode(); if (type==SBML_COMP_DELETION || type==SBML_COMP_REPLACEDBY || type==SBML_COMP_REPLACEDELEMENT || type==SBML_COMP_PORT) { //Don't worry about SBML_COMP_SBASEREF because they're all children of one of the above types. SBaseRef* reference = static_cast<SBaseRef*>(element); ReplacedElement* re = static_cast<ReplacedElement*>(element); ret = reference->saveReferencedElement(); if (ret != LIBSBML_OPERATION_SUCCESS) { if (type != SBML_COMP_REPLACEDBY && doc) { SBMLErrorLog* errlog = doc->getErrorLog(); SBMLError* lasterr = const_cast<SBMLError*> (doc->getErrorLog()->getError(doc->getNumErrors()-1)); if ( (errlog->contains(UnrequiredPackagePresent) || errlog->contains(RequiredPackagePresent))) { if ( lasterr->getErrorId() == CompIdRefMustReferenceObject) { //Change the error into a warning string fullmsg = lasterr->getMessage() + " However, this may be because of the unrecognized " + "package present in this document: ignoring this " + "element and flattening anyway."; errlog->remove(lasterr->getErrorId()); errlog->logPackageError("comp", CompIdRefMayReferenceUnknownPackage, getPackageVersion(), getLevel(), getVersion(), fullmsg, element->getLine(), element->getColumn(), LIBSBML_SEV_WARNING); } else if ( lasterr->getErrorId() == CompMetaIdRefMustReferenceObject) { //Change the error into a warning string fullmsg = lasterr->getMessage() + " However, this may be because of the unrecognized " + "package present in this document: ignoring this " + "element and flattening anyway."; errlog->remove(lasterr->getErrorId()); errlog->logPackageError("comp", CompMetaIdRefMayReferenceUnknownPkg, getPackageVersion(), getLevel(), getVersion(), fullmsg, element->getLine(), element->getColumn(), LIBSBML_SEV_WARNING); } } //Whether or not we could figure out the error, we can always still continue flattening. todelete.insert(element); continue; } else { delete allElements; return ret; } } SBase* direct = reference->getDirectReference(); bool adddirect = true; if (type == SBML_COMP_REPLACEDBY) { SBase* rbParent = reference->getParentSBMLObject(); if (uniqueRefs.insert(rbParent).second == false) { if (doc) { string error = "Error discovered in CompModelPlugin::saveAllReferencedElements when checking " + modname + ": a <" + rbParent->getElementName() + "> "; if (direct->isSetId()) { error += "with the id '" + rbParent->getId() + "'"; if (rbParent->isSetMetaId()) { error += ", and the metaid '" + rbParent->getMetaId() + "'"; } } else if (rbParent->isSetMetaId()) { error += "with the metaId '" + rbParent->getMetaId() + "'"; } error += " has a <replacedBy> child and is also pointed to by a <port>, <deletion>, <replacedElement>, or one or more <replacedBy> objects."; doc->getErrorLog()->logPackageError("comp", CompNoMultipleReferences, getPackageVersion(), getLevel(), getVersion(), error); } delete allElements; return LIBSBML_OPERATION_FAILED; } adddirect = replacedBys.insert(direct).second; } if (type==SBML_COMP_REPLACEDELEMENT && re->isSetDeletion()) { adddirect = RE_deletions.insert(direct).second; } if (adddirect) { if (uniqueRefs.insert(direct).second == false) { if (doc) { string error = "Error discovered in CompModelPlugin::saveAllReferencedElements when checking " + modname + ": "; if (replacedBys.find(direct) != replacedBys.end()) { error += "one or more <replacedBy> elements, plus a <deletion>, <replacedElement>, or <port> element"; } else if (RE_deletions.find(direct) != RE_deletions.end()) { error += "one or more <replacedElement> elements using a 'deletion' attribute, plus a <deletion>, <replacedElement>, or <port> element"; } else { error += "multiple <deletion>, <replacedElement>, and/or <port> elements"; } error += " point directly to the <" + direct->getElementName() + "> "; if (direct->isSetId()) { error += "with the id '" + direct->getId() + "'"; if (direct->isSetMetaId()) { error += ", and the metaid '" + direct->getMetaId() + "'"; } error += "."; } else if (direct->isSetMetaId()) { error += "with the metaId '" + direct->getMetaId() + "'."; } doc->getErrorLog()->logPackageError("comp", CompNoMultipleReferences, getPackageVersion(), getLevel(), getVersion(), error); } delete allElements; return LIBSBML_OPERATION_FAILED; } } } } for(set<SBase*>::iterator el=todelete.begin(); el != todelete.end(); el++) { (*el)->removeFromParentAndDelete(); } delete allElements; //Now call saveAllReferencedElements for all instantiated submodels. for (unsigned long sm=0; sm<getNumSubmodels(); ++sm) { Model* sub = getSubmodel((unsigned int)sm)->getInstantiation(); if (sub==NULL) { return LIBSBML_OPERATION_FAILED; } CompModelPlugin* subplug = static_cast<CompModelPlugin*>(sub->getPlugin(getPrefix())); if (subplug==NULL) { return LIBSBML_OPERATION_FAILED; } ret = subplug->saveAllReferencedElements(uniqueRefs, replacedBys); if (ret != LIBSBML_OPERATION_SUCCESS) { return ret; } } return LIBSBML_OPERATION_SUCCESS; }
/* * Performs a set of semantic consistency checks on the document. Query * the results by calling getNumErrors() and getError(). * * @return the number of failed checks (errors) encountered. */ unsigned int SBMLInternalValidator::checkConsistency (bool writeDocument) { unsigned int nerrors = 0; unsigned int total_errors = 0; //if (getLevel() == 3) //{ // logError(L3NotSupported); // return 1; //} /* determine which validators to run */ bool id = ((mApplicableValidators & 0x01) == 0x01); bool sbml = ((mApplicableValidators & 0x02) == 0x02); bool sbo = ((mApplicableValidators & 0x04) == 0x04); bool math = ((mApplicableValidators & 0x08) == 0x08); bool units = ((mApplicableValidators & 0x10) == 0x10); bool over = ((mApplicableValidators & 0x20) == 0x20); bool practice = ((mApplicableValidators & 0x40) == 0x40); /* taken the state machine concept out for now if (LibSBMLStateMachine::isActive()) { units = LibSBMLStateMachine::getUnitState(); } */ IdentifierConsistencyValidator id_validator; ConsistencyValidator validator; SBOConsistencyValidator sbo_validator; MathMLConsistencyValidator math_validator; UnitConsistencyValidator unit_validator; OverdeterminedValidator over_validator; ModelingPracticeValidator practice_validator; SBMLDocument *doc; SBMLErrorLog *log = getErrorLog(); if (writeDocument) { char* sbmlString = writeSBMLToString(getDocument()); log->clearLog(); doc = readSBMLFromString(sbmlString); free (sbmlString); } else { doc = getDocument(); } /* calls each specified validator in turn * - stopping when errors are encountered */ if (id) { id_validator.init(); nerrors = id_validator.validate(*doc); if (nerrors > 0) { unsigned int origNum = log->getNumErrors(); log->add( id_validator.getFailures() ); if (origNum > 0 && log->contains(InvalidUnitIdSyntax) == true) { /* do not log dangling ref */ while (log->contains(DanglingUnitSIdRef) == true) { log->remove(DanglingUnitSIdRef); nerrors--; } total_errors += nerrors; if (nerrors > 0) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } else if (log->contains(DanglingUnitSIdRef) == false) { total_errors += nerrors; if (writeDocument) SBMLDocument_free(doc); return total_errors; } else { bool onlyDangRef = true; for (unsigned int a = 0; a < log->getNumErrors(); a++) { if (log->getError(a)->getErrorId() != DanglingUnitSIdRef) { onlyDangRef = false; break; } } total_errors += nerrors; if (onlyDangRef == false) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } } } if (sbml) { validator.init(); nerrors = validator.validate(*doc); total_errors += nerrors; if (nerrors > 0) { log->add( validator.getFailures() ); /* only want to bail if errors not warnings */ if (log->getNumFailsWithSeverity(LIBSBML_SEV_ERROR) > 0) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } } if (sbo) { sbo_validator.init(); nerrors = sbo_validator.validate(*doc); total_errors += nerrors; if (nerrors > 0) { log->add( sbo_validator.getFailures() ); /* only want to bail if errors not warnings */ if (log->getNumFailsWithSeverity(LIBSBML_SEV_ERROR) > 0) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } } if (math) { math_validator.init(); nerrors = math_validator.validate(*doc); total_errors += nerrors; if (nerrors > 0) { log->add( math_validator.getFailures() ); /* at this point bail if any problems * unit checks may crash if there have been math errors/warnings */ if (writeDocument) SBMLDocument_free(doc); return total_errors; } } if (units) { unit_validator.init(); nerrors = unit_validator.validate(*doc); total_errors += nerrors; if (nerrors > 0) { log->add( unit_validator.getFailures() ); /* only want to bail if errors not warnings */ if (log->getNumFailsWithSeverity(LIBSBML_SEV_ERROR) > 0) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } } /* do not even try if there have been unit warnings * changed this as would have bailed */ if (over) { over_validator.init(); nerrors = over_validator.validate(*doc); total_errors += nerrors; if (nerrors > 0) { log->add( over_validator.getFailures() ); /* only want to bail if errors not warnings */ if (log->getNumFailsWithSeverity(LIBSBML_SEV_ERROR) > 0) { if (writeDocument) SBMLDocument_free(doc); return total_errors; } } } if (practice) { practice_validator.init(); nerrors = practice_validator.validate(*doc); if (nerrors > 0) { unsigned int errorsAdded = 0; const std::list<SBMLError> practiceErrors = practice_validator.getFailures(); list<SBMLError>::const_iterator end = practiceErrors.end(); list<SBMLError>::const_iterator iter; for (iter = practiceErrors.begin(); iter != end; ++iter) { if (SBMLError(*iter).getErrorId() != 80701) { log->add( SBMLError(*iter) ); errorsAdded++; } else { if (units) { log->add( SBMLError(*iter) ); errorsAdded++; } } } total_errors += errorsAdded; } } if (writeDocument) SBMLDocument_free(doc); return total_errors; }
/* * Reads the expected attributes into the member data variables */ void AnalyticVolume::readAttributes(const XMLAttributes& attributes, const ExpectedAttributes& expectedAttributes) { unsigned int level = getLevel(); unsigned int version = getVersion(); unsigned int pkgVersion = getPackageVersion(); unsigned int numErrs; bool assigned = false; SBMLErrorLog* log = getErrorLog(); if (static_cast<ListOfAnalyticVolumes*>(getParentSBMLObject())->size() < 2) { numErrs = log->getNumErrors(); for (int n = numErrs-1; n >= 0; n--) { if (log->getError(n)->getErrorId() == UnknownPackageAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownPackageAttribute); log->logPackageError("spatial", SpatialAnalyticGeometryLOAnalyticVolumesAllowedAttributes, pkgVersion, level, version, details); } else if (log->getError(n)->getErrorId() == UnknownCoreAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownCoreAttribute); log->logPackageError("spatial", SpatialAnalyticGeometryLOAnalyticVolumesAllowedCoreAttributes, pkgVersion, level, version, details); } } } SBase::readAttributes(attributes, expectedAttributes); numErrs = log->getNumErrors(); for (int n = numErrs-1; n >= 0; n--) { if (log->getError(n)->getErrorId() == UnknownPackageAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownPackageAttribute); log->logPackageError("spatial", SpatialAnalyticVolumeAllowedAttributes, pkgVersion, level, version, details); } else if (log->getError(n)->getErrorId() == UnknownCoreAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownCoreAttribute); log->logPackageError("spatial", SpatialAnalyticVolumeAllowedCoreAttributes, pkgVersion, level, version, details); } } // // id SId (use = "required" ) // assigned = attributes.readInto("id", mId); if (assigned == true) { if (mId.empty() == true) { logEmptyString(mId, level, version, "<AnalyticVolume>"); } else if (SyntaxChecker::isValidSBMLSId(mId) == false) { logError(SpatialIdSyntaxRule, level, version, "The id '" + mId + "' does " "not conform to the syntax."); } } else { std::string message = "Spatial attribute 'id' is missing from the " "<AnalyticVolume> element."; log->logPackageError("spatial", SpatialAnalyticVolumeAllowedAttributes, pkgVersion, level, version, message); } // // functionType enum (use = "required" ) // std::string functiontype; assigned = attributes.readInto("functionType", functiontype); if (assigned == true) { if (functiontype.empty() == true) { logEmptyString(functiontype, level, version, "<AnalyticVolume>"); } else { mFunctionType = FunctionKind_fromString(functiontype.c_str()); if (FunctionKind_isValid(mFunctionType) == 0) { std::string msg = "The functionType on the <AnalyticVolume> "; if (isSetId()) { msg += "with id '" + getId() + "'"; } msg += "is '" + functiontype + "', which is not a valid option."; log->logPackageError("spatial", SpatialAnalyticVolumeFunctionTypeMustBeFunctionKindEnum, pkgVersion, level, version, msg); } } } else { std::string message = "Spatial attribute 'functionType' is missing."; log->logPackageError("spatial", SpatialAnalyticVolumeAllowedAttributes, pkgVersion, level, version, message); } // // ordinal int (use = "optional" ) // numErrs = log->getNumErrors(); mIsSetOrdinal = attributes.readInto("ordinal", mOrdinal); if ( mIsSetOrdinal == false) { if (log->getNumErrors() == numErrs + 1 && log->contains(XMLAttributeTypeMismatch)) { log->remove(XMLAttributeTypeMismatch); std::string message = "Spatial attribute 'ordinal' from the " "<AnalyticVolume> element must be an integer."; log->logPackageError("spatial", SpatialAnalyticVolumeOrdinalMustBeInteger, pkgVersion, level, version, message); } } // // domainType SIdRef (use = "required" ) // assigned = attributes.readInto("domainType", mDomainType); if (assigned == true) { if (mDomainType.empty() == true) { logEmptyString(mDomainType, level, version, "<AnalyticVolume>"); } else if (SyntaxChecker::isValidSBMLSId(mDomainType) == false) { logError(SpatialAnalyticVolumeDomainTypeMustBeDomainType, level, version, "The attribute domainType='" + mDomainType + "' does not conform to the " "syntax."); } } else { std::string message = "Spatial attribute 'domainType' is missing from the " "<AnalyticVolume> element."; log->logPackageError("spatial", SpatialAnalyticVolumeAllowedAttributes, pkgVersion, level, version, message); } }
/* * Reads the expected attributes into the member data variables */ void ListOfGlobalRenderInformation::readAttributes(const XMLAttributes& attributes, const ExpectedAttributes& expectedAttributes) { unsigned int level = getLevel(); unsigned int version = getVersion(); unsigned int pkgVersion = getPackageVersion(); unsigned int numErrs; SBMLErrorLog* log = getErrorLog(); ListOf::readAttributes(attributes, expectedAttributes); if (log) { numErrs = log->getNumErrors(); for (int n = numErrs-1; n >= 0; n--) { if (log->getError(n)->getErrorId() == UnknownPackageAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownPackageAttribute); log->logPackageError("render", RenderListOfLayoutsLOGlobalRenderInformationAllowedAttributes, pkgVersion, level, version, details, getLine(), getColumn()); } else if (log->getError(n)->getErrorId() == UnknownCoreAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownCoreAttribute); log->logPackageError("render", RenderListOfLayoutsLOGlobalRenderInformationAllowedCoreAttributes, pkgVersion, level, version, details, getLine(), getColumn()); } } } // // majorVersion uint (use = "optional" ) // if (log) { numErrs = log->getNumErrors(); } mIsSetMajorVersion = attributes.readInto("versionMajor", mMajorVersion); if ( mIsSetMajorVersion == false && log) { if (log->getNumErrors() == numErrs + 1 && log->contains(XMLAttributeTypeMismatch)) { log->remove(XMLAttributeTypeMismatch); std::string message = "Render attribute 'versionMajor' from the " "<ListOfGlobalRenderInformation> element must be an integer."; log->logPackageError("render", RenderListOfLayoutsVersionMajorMustBeNonNegativeInteger, pkgVersion, level, version, message, getLine(), getColumn()); } } // // minorVersion uint (use = "optional" ) // if (log) { numErrs = log->getNumErrors(); } mIsSetMinorVersion = attributes.readInto("versionMinor", mMinorVersion); if ( mIsSetMinorVersion == false && log) { if (log->getNumErrors() == numErrs + 1 && log->contains(XMLAttributeTypeMismatch)) { log->remove(XMLAttributeTypeMismatch); std::string message = "Render attribute 'versionMinor' from the " "<ListOfGlobalRenderInformation> element must be an integer."; log->logPackageError("render", RenderListOfLayoutsVersionMinorMustBeNonNegativeInteger, pkgVersion, level, version, message, getLine(), getColumn()); } } }
/** @cond doxygenLibsbmlInternal */ int CompFlatteningConverter::validateFlatDocument(Model * flatmodel, unsigned int pkgVersion, unsigned int level, unsigned int version) { int result; // create a dummyDocument that will mirror what the user options are // we need the dummyDoc to know things about unknown packages // but dont want the original model/error log SBMLDocument dummy = SBMLDocument(*(mDocument)); dummy.setModel(NULL); dummy.getErrorLog()->clearLog(); // Otherwise, transfer only errors 1090107->1090110 SBMLErrorLog* log = mDocument->getErrorLog(); for (unsigned int en=0; en<log->getNumErrors(); en++) { unsigned int errid = mDocument->getError(en)->getErrorId(); if (errid == CompFlatteningNotRecognisedNotReqd || errid == CompFlatteningNotRecognisedReqd || errid == CompFlatteningNotImplementedNotReqd || errid == CompFlatteningNotImplementedReqd) { dummy.getErrorLog()->add(*(mDocument->getError(en))); } } log->clearLog(); result = reconstructDocument(flatmodel, dummy, true ); if (result != LIBSBML_OPERATION_SUCCESS) { //delete flatmodel; restoreNamespaces(); return result; } //Now check to see if the flat model is valid // run regular validation on the flattened document if requested. // override comp flattening if necessary CompSBMLDocumentPlugin * dummyPlugin = static_cast<CompSBMLDocumentPlugin*> (dummy.getPlugin("comp")); if (dummyPlugin != NULL) { dummyPlugin->setOverrideCompFlattening(true); } std::string sbml = writeSBMLToStdString(&dummy); SBMLDocument *tempdoc = readSBMLFromString(sbml.c_str()); unsigned int errors = tempdoc->getErrorLog()->getNumFailsWithSeverity(LIBSBML_SEV_ERROR); // take out the error about a requiredpackage // if the user has specified to not abort for any packages // NOTE: we cannot actually remove it since the flattening code // uses it to check whether references might come from // other packages if (getAbortForNone() == true) { if (tempdoc->getErrorLog()->contains(RequiredPackagePresent)) { errors--; } } if (errors > 0) { // we have serious errors so we are going to bail on the // flattening - log ONLY the errors //Transfer the errors to mDocument and don't reset the model. if (log->contains(CompLineNumbersUnreliable) == false) { log->logPackageError("comp", CompLineNumbersUnreliable, pkgVersion, level, version); } std::string message = "Errors that follow relate to the flattened "; message += "document produced using the CompFlatteningConverter."; log->logPackageError("comp", CompFlatModelNotValid, pkgVersion, level, version); unsigned int nerrors = tempdoc->getErrorLog()->getNumErrors(); for (unsigned int n = 0; n < nerrors; n++) { const SBMLError* error = tempdoc->getError(n); if (error->getSeverity() >= LIBSBML_SEV_ERROR) { log->add( *(error) ); } if (error->getErrorId() >= CompFlatteningNotRecognisedNotReqd && error->getErrorId() <= CompFlatteningNotImplementedReqd) { log->add( *(error) ); } else if (error->getErrorId() == UnrequiredPackagePresent || error->getErrorId() == RequiredPackagePresent) { log->add( *(error) ); } } //delete flatmodel; restoreNamespaces(); delete tempdoc; return LIBSBML_CONV_INVALID_SRC_DOCUMENT; } else { delete tempdoc; } dummy.checkConsistency(); if (dummyPlugin != NULL) { dummyPlugin->setOverrideCompFlattening(false); } errors = dummy.getErrorLog()->getNumFailsWithSeverity(LIBSBML_SEV_ERROR); if (errors > 0) { // we have serious errors so we are going to bail on the // flattening - log ONLY the errors //Transfer the errors to mDocument and don't reset the model. if (log->contains(CompLineNumbersUnreliable) == false) { log->logPackageError("comp", CompLineNumbersUnreliable, pkgVersion, level, version); } std::string message = "Errors that follow relate to the flattened "; message += "document produced using the CompFlatteningConverter."; log->logPackageError("comp", CompFlatModelNotValid, pkgVersion, level, version); unsigned int nerrors = dummy.getErrorLog()->getNumErrors(); for (unsigned int n = 0; n < nerrors; n++) { const SBMLError* error = dummy.getError(n); if (error->getSeverity() >= LIBSBML_SEV_ERROR) { log->add( *(error) ); } if (error->getErrorId() >= CompFlatteningNotRecognisedNotReqd && error->getErrorId() <= CompFlatteningNotImplementedReqd) { log->add( *(error) ); } else if (error->getErrorId() == UnrequiredPackagePresent || error->getErrorId() == RequiredPackagePresent) { log->add( *(error) ); } } //delete flatmodel; restoreNamespaces(); return LIBSBML_CONV_INVALID_SRC_DOCUMENT; } else { // put any warnings into the document that will be have the // flat model unsigned int nerrors = dummy.getErrorLog()->getNumErrors(); for (unsigned int n = 0; n < nerrors; n++) { const SBMLError* error = dummy.getError(n); log->add( *(error) ); } return LIBSBML_OPERATION_SUCCESS; } }
/* * Reads the expected attributes into the member data variables */ void Output::readAttributes(const XMLAttributes& attributes, const ExpectedAttributes& expectedAttributes) { unsigned int level = getLevel(); unsigned int version = getVersion(); unsigned int pkgVersion = getPackageVersion(); unsigned int numErrs; bool assigned = false; SBMLErrorLog* log = getErrorLog(); if (static_cast<ListOfOutputs*>(getParentSBMLObject())->size() < 2) { numErrs = log->getNumErrors(); for (int n = numErrs-1; n >= 0; n--) { if (log->getError(n)->getErrorId() == UnknownPackageAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownPackageAttribute); log->logPackageError("qual", QualTransitionLOOutputsAllowedAttributes, pkgVersion, level, version, details); } else if (log->getError(n)->getErrorId() == UnknownCoreAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownCoreAttribute); log->logPackageError("qual", QualTransitionLOOutputsAllowedCoreAttributes, pkgVersion, level, version, details); } } } SBase::readAttributes(attributes, expectedAttributes); numErrs = log->getNumErrors(); for (int n = numErrs-1; n >= 0; n--) { if (log->getError(n)->getErrorId() == UnknownPackageAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownPackageAttribute); log->logPackageError("qual", QualOutputAllowedAttributes, pkgVersion, level, version, details); } else if (log->getError(n)->getErrorId() == UnknownCoreAttribute) { const std::string details = log->getError(n)->getMessage(); log->remove(UnknownCoreAttribute); log->logPackageError("qual", QualOutputAllowedCoreAttributes, pkgVersion, level, version, details); } } // // id SId (use = "optional" ) // assigned = attributes.readInto("id", mId); if (assigned == true) { if (mId.empty() == true) { logEmptyString(mId, level, version, "<Output>"); } else if (SyntaxChecker::isValidSBMLSId(mId) == false) { logError(QualIdSyntaxRule, level, version, "The id '" + mId + "' does not " "conform to the syntax."); } } // // qualitativeSpecies SIdRef (use = "required" ) // assigned = attributes.readInto("qualitativeSpecies", mQualitativeSpecies); if (assigned == true) { if (mQualitativeSpecies.empty() == true) { logEmptyString(mQualitativeSpecies, level, version, "<Output>"); } else if (SyntaxChecker::isValidSBMLSId(mQualitativeSpecies) == false) { logError(QualOutputQualitativeSpeciesMustBeQualitativeSpecies, level, version, "The attribute qualitativeSpecies='" + mQualitativeSpecies + "' " "does not conform to the syntax."); } } else { std::string message = "Qual attribute 'qualitativeSpecies' is missing from " "the <Output> element."; log->logPackageError("qual", QualOutputAllowedAttributes, pkgVersion, level, version, message); } // // transitionEffect enum (use = "required" ) // std::string transitioneffect; assigned = attributes.readInto("transitionEffect", transitioneffect); if (assigned == true) { if (transitioneffect.empty() == true) { logEmptyString(transitioneffect, level, version, "<Output>"); } else { mTransitionEffect = TransitionOutputEffect_fromString(transitioneffect.c_str()); if (TransitionOutputEffect_isValid(mTransitionEffect) == 0) { std::string msg = "The transitionEffect on the <Output> "; if (isSetId()) { msg += "with id '" + getId() + "'"; } msg += "is '" + transitioneffect + "', which is not a valid option."; log->logPackageError("qual", QualOutputTransitionEffectMustBeTransitionOutputEffectEnum, pkgVersion, level, version, msg); } } } else { std::string message = "Qual attribute 'transitionEffect' is missing."; log->logPackageError("qual", QualOutputAllowedAttributes, pkgVersion, level, version, message); } // // name string (use = "optional" ) // assigned = attributes.readInto("name", mName); if (assigned == true) { if (mName.empty() == true) { logEmptyString(mName, level, version, "<Output>"); } } // // outputLevel int (use = "optional" ) // numErrs = log->getNumErrors(); mIsSetOutputLevel = attributes.readInto("outputLevel", mOutputLevel); if ( mIsSetOutputLevel == false) { if (log->getNumErrors() == numErrs + 1 && log->contains(XMLAttributeTypeMismatch)) { log->remove(XMLAttributeTypeMismatch); std::string message = "Qual attribute 'outputLevel' from the <Output> " "element must be an integer."; log->logPackageError("qual", QualOutputOutputLevelMustBeInteger, pkgVersion, level, version, message); } } }