/** * Override parent implementation: The secondary data is not for the * UMLAssociation itself but for its role B object. */ void setTypeReferences(UMLObject *item, const QString& quid, const QString& type) { UMLAssociation *assoc = static_cast<UMLAssociation*>(item); if (!quid.isEmpty()) { assoc->getUMLRole(Uml::B)->setSecondaryId(quid); } if (!type.isEmpty()) { assoc->getUMLRole(Uml::B)->setSecondaryFallback(type); } }
/** * Create an Umbrello object from a PetalNode of the Logical View. * * @return True for success. * Given a PetalNode for which the mapping to Umbrello is not yet * implemented umbrellify() is a no-op but also returns true. */ bool umbrellify(PetalNode *node, UMLPackage *parentPkg = NULL) { if (node == NULL) { uError() << "umbrellify: node is NULL"; return false; } QStringList args = node->initialArgs(); QString objType = args[0]; QString name = clean(args[1]); Uml::IDType id = quid(node); if (objType == "Class_Category") { UMLObject *o = Import_Utils::createUMLObject(UMLObject::ot_Package, name, parentPkg); o->setID(id); PetalNode *logical_models = node->findAttribute("logical_models").node; if (logical_models) { UMLPackage *localParent = static_cast<UMLPackage*>(o); PetalNode::NameValueList atts = logical_models->attributes(); for (int i = 0; i < atts.count(); ++i) { umbrellify(atts[i].second.node, localParent); } } else if (!handleControlledUnit(node, name, id, parentPkg)) { uDebug() << "umbrellify: handling of " << objType << " " << name << " is not yet implemented"; } } else if (objType == "Class") { UMLObject *o = Import_Utils::createUMLObject(UMLObject::ot_Class, name, parentPkg); o->setID(id); UMLClassifier *c = static_cast<UMLClassifier*>(o); // set stereotype QString stereotype = clean(node->findAttribute("stereotype").string); if (!stereotype.isEmpty()) { if (stereotype.toLower() == "interface") c->setBaseType(UMLObject::ot_Interface); else c->setStereotype(stereotype); } // insert attributes AttributesReader attReader(c); attReader.read(node, c->name()); // insert operations OperationsReader opReader(c); opReader.read(node, c->name()); // insert generalizations SuperclassesReader superReader(c); superReader.read(node, c->name()); // insert realizations RealizationsReader realReader(c); realReader.read(node, c->name()); } else if (objType == "Association") { PetalNode *roles = node->findAttribute("roles").node; if (node == NULL) { uError() << "umbrellify: cannot find roles of Association"; return false; } UMLAssociation *assoc = new UMLAssociation(Uml::AssociationType::UniAssociation); PetalNode::NameValueList roleList = roles->attributes(); for (uint i = 0; i <= 1; ++i) { PetalNode *roleNode = roleList[i].second.node; if (roleNode == NULL) { uError() << "umbrellify: roleNode of Association is NULL"; return false; } if (roleNode->name() != "Role") { uDebug() << "umbrellify(" << name << "): expecting Role, found \"" << roleNode->name(); continue; } // index 0 corresponds to Umbrello roleB // index 1 corresponds to Umbrello roleA UMLRole *role = assoc->getUMLRole((Uml::Role_Type) !i); QStringList initialArgs = roleNode->initialArgs(); if (initialArgs.count() > 1) { QString roleName = clean(initialArgs[1]); if (! roleName.startsWith(QLatin1String("$UNNAMED"))) role->setName(roleName); } role->setID(quid(roleNode)); QString quidref = quidu(roleNode); QString type = clean(roleNode->findAttribute("supplier").string); if (!quidref.isEmpty()) { role->setSecondaryId(quidref); } if (!type.isEmpty()) { role->setSecondaryFallback(type); } QString label = clean(roleNode->findAttribute("label").string); if (!label.isEmpty()) { role->setName(label); } QString client_cardinality = clean(roleNode->findAttribute("client_cardinality").string); if (!client_cardinality.isEmpty()) { role->setMultiplicity(client_cardinality); } QString is_navigable = clean(roleNode->findAttribute("is_navigable").string); if (is_navigable == "FALSE") { assoc->setAssociationType(Uml::AssociationType::Association); } QString is_aggregate = clean(roleNode->findAttribute("is_aggregate").string); if (is_aggregate == "TRUE") { assoc->setAssociationType(Uml::AssociationType::Aggregation); } QString containment = clean(roleNode->findAttribute("Containment").string); if (containment == "By Value") { assoc->setAssociationType(Uml::AssociationType::Composition); } QString doc = roleNode->findAttribute("documentation").string; if (! doc.isEmpty()) role->setDoc(doc); } UMLApp::app()->document()->addAssociation(assoc); } else { uDebug() << "umbrellify: object type " << objType << " is not yet implemented"; } return true; }
/** * Set the class attributes of this object from * the passed element node. */ void CodeParameter::setAttributesFromNode ( QDomElement & root) { // set local attributes, parent object first QString idStr = root.attribute("parent_id","-1"); Uml::IDType id = STR2ID(idStr); // always disconnect m_parentObject->disconnect(this); // now, what is the new object we want to set? UMLObject * obj = UMLApp::app()->document()->findObjectById(id); if(obj) { // FIX..one day. // Ugh. This is UGLY, but we have to do it this way because UMLRoles // don't go into the document list of UMLobjects, and have the same // ID as their parent UMLAssociations. So..the drill is then special // for Associations..in that case we need to find out which role will // serve as the parameter here. The REAL fix, of course, would be to // treat UMLRoles on a more even footing, but im not sure how that change // might ripple throughout the code and cause problems. Thus, since the // change appears to be needed for only this part, I'll do this crappy // change instead. -b.t. UMLAssociation * assoc = dynamic_cast<UMLAssociation*>(obj); if(assoc) { // In this case we init with indicated role child obj. UMLRole * role = 0; int role_id = root.attribute("role_id","-1").toInt(); if(role_id == 1) role = assoc->getUMLRole(Uml::A); else if(role_id == 0) role = assoc->getUMLRole(Uml::B); else uError() << "corrupt save file? " << "cant get proper UMLRole for codeparameter uml id:" << ID2STR(id) << " w/role_id:" << role_id; // init using UMLRole obj initFields ( m_parentDocument, role); } else initFields ( m_parentDocument, obj); // just the regular approach } else uError() << "Cant load CodeParam: parentUMLObject w/id:" << ID2STR(id) << " not found, corrupt save file?"; // other attribs now setInitialValue(root.attribute("initialValue","")); // load comment now // by looking for our particular child element QDomNode node = root.firstChild(); QDomElement element = node.toElement(); bool gotComment = false; while( !element.isNull() ) { QString tag = element.tagName(); if( tag == "header" ) { QDomNode cnode = element.firstChild(); QDomElement celem = cnode.toElement(); getComment()->loadFromXMI(celem); gotComment = true; break; } node = element.nextSibling(); element = node.toElement(); } if(!gotComment) uWarning()<<" loadFromXMI : Warning: unable to initialize CodeComment in codeparam:"<<this; }