/** @cond doxygenLibsbmlInternal */ void CompModelPlugin::renameIDs(List* allElements, const string& prefix) { if (prefix=="") return; //Nothing to prepend. vector<pair<string, string> > renamedSIds; vector<pair<string, string> > renamedUnitSIds; vector<pair<string, string> > renamedMetaIds; // if a custom prefix transformer was specified, then set the // current prefix if (isSetTransformer()) mTransformer->setPrefix(prefix); for (unsigned long el=0; el < allElements->getSize(); ++el) { SBase* element = static_cast<SBase*>(allElements->get((unsigned int)el)); string id = element->getId(); string metaid = element->getMetaId(); // if a custom prefix transformer was specified, use it, other wise // default to the sbase method. if (isSetTransformer()) element->transformIdentifiers(mTransformer); else element->prependStringToAllIdentifiers(prefix); if (element->getTypeCode() == SBML_LOCAL_PARAMETER) { element->setId(id); //Change it back. This would perhaps be better served by overriding 'prependStringToAllIdentifiers' but hey. } string newid = element->getId(); string newmetaid = element->getMetaId(); if (id != newid) { int type = element->getTypeCode(); if (type==SBML_UNIT_DEFINITION) { renamedUnitSIds.push_back(make_pair(id, newid)); } else if (type==SBML_COMP_PORT) { //Do nothing--these can only be referenced from outside the Model, so they need to be handled specially. // (In the default case, we throw them away). } else { //This is a little dangerous, but hey! What's a little danger between friends! //(What we are assuming is that any attribute you can get with 'getId' is of the type 'SId') renamedSIds.push_back(make_pair(id, newid)); } } if (metaid != newmetaid) { renamedMetaIds.push_back(make_pair(metaid, newmetaid)); } } for (unsigned long el=0; el<allElements->getSize(); el++) { SBase* element = static_cast<SBase*>(allElements->get((unsigned int)el)); for (size_t id=0; id<renamedSIds.size(); id++) { element->renameSIdRefs(renamedSIds[id].first, renamedSIds[id].second); } for (size_t uid=0; uid<renamedUnitSIds.size(); uid++) { element->renameUnitSIdRefs(renamedUnitSIds[uid].first, renamedUnitSIds[uid].second); } for (size_t mid=0; mid<renamedMetaIds.size(); mid++) { element->renameMetaIdRefs(renamedMetaIds[mid].first, renamedMetaIds[mid].second); } } }