/** * Returns the fully qualified name, i.e. all package prefixes and then m_name. * * @param separator The separator string to use (optional.) * If not given then the separator is chosen according * to the currently selected active programming language * of import and code generation. * @param includeRoot Whether to prefix the root folder name to the FQN. * See UMLDoc::getRootFolder(). Default: false. * @return The fully qualified name of this UMLObject. */ QString UMLObject::fullyQualifiedName(const QString& separator, bool includeRoot /* = false */) const { QString fqn; if (m_pUMLPackage && m_pUMLPackage != this) { bool skipPackage = false; if (!includeRoot) { UMLDoc *umldoc = UMLApp::app()->document(); if (umldoc->rootFolderType(m_pUMLPackage) != Uml::ModelType::N_MODELTYPES || m_pUMLPackage == umldoc->datatypeFolder()) skipPackage = true; } if (!skipPackage) { QString tempSeparator = separator; if (tempSeparator.isEmpty()) tempSeparator = UMLApp::app()->activeLanguageScopeSeparator(); fqn = m_pUMLPackage->fullyQualifiedName(tempSeparator, includeRoot); fqn.append(tempSeparator); } } fqn.append(m_name); return fqn; }
/** * Resolve referenced objects (if any.) * Needs to be called after all UML objects are loaded from file. * This needs to be done after all model objects are loaded because * some of the xmi.id's might be forward references, i.e. they may * identify model objects which were not yet loaded at the point of * reference. * The default implementation attempts resolution of the m_SecondaryId. * * @return True for success. */ bool UMLObject::resolveRef() { if (m_pSecondary || (m_SecondaryId.isEmpty() && m_SecondaryFallback.isEmpty())) { maybeSignalObjectCreated(); return true; } #ifdef VERBOSE_DEBUGGING uDebug() << m_name << ": m_SecondaryId is " << m_SecondaryId; #endif UMLDoc *pDoc = UMLApp::app()->document(); // In the new, XMI standard compliant save format, // the type is the xmi.id of a UMLClassifier. if (! m_SecondaryId.isEmpty()) { m_pSecondary = pDoc->findObjectById(Uml::ID::fromString(m_SecondaryId)); if (m_pSecondary != NULL) { if (m_pSecondary->baseType() == ot_Stereotype) { m_pStereotype = dynamic_cast<UMLStereotype*>(m_pSecondary.data()); m_pStereotype->incrRefCount(); m_pSecondary = NULL; } m_SecondaryId = QString(); maybeSignalObjectCreated(); return true; } if (m_SecondaryFallback.isEmpty()) { uDebug() << "object with xmi.id=" << m_SecondaryId << " not found, setting to undef"; UMLFolder *datatypes = pDoc->datatypeFolder(); m_pSecondary = Object_Factory::createUMLObject(ot_Datatype, QLatin1String("undef"), datatypes, false); return true; } } if (m_SecondaryFallback.isEmpty()) { uError() << m_name << ": cannot find type with id " << m_SecondaryId; return false; } #ifdef VERBOSE_DEBUGGING uDebug() << m_name << ": could not resolve secondary ID " << m_SecondaryId << ", using secondary fallback " << m_SecondaryFallback; #endif m_SecondaryId = m_SecondaryFallback; // Assume we're dealing with the older Umbrello format where // the type name was saved in the "type" attribute rather // than the xmi.id of the model object of the attribute type. m_pSecondary = pDoc->findUMLObject(m_SecondaryId, ot_UMLObject, this); if (m_pSecondary) { m_SecondaryId = QString(); maybeSignalObjectCreated(); return true; } // Work around Object_Factory::createUMLObject()'s incapability // of on-the-fly scope creation: if (m_SecondaryId.contains(QLatin1String("::"))) { // TODO: Merge Import_Utils::createUMLObject() into Object_Factory::createUMLObject() m_pSecondary = Import_Utils::createUMLObject(ot_UMLObject, m_SecondaryId, m_pUMLPackage); if (m_pSecondary) { if (Import_Utils::newUMLObjectWasCreated()) { maybeSignalObjectCreated(); qApp->processEvents(); uDebug() << "Import_Utils::createUMLObject() created a new type for " << m_SecondaryId; } else { uDebug() << "Import_Utils::createUMLObject() returned an existing type for " << m_SecondaryId; } m_SecondaryId = QString(); return true; } uError() << "Import_Utils::createUMLObject() failed to create a new type for " << m_SecondaryId; return false; } uDebug() << "Creating new type for " << m_SecondaryId; // This is very C++ specific - we rely on some '*' or // '&' to decide it's a ref type. Plus, we don't recognize // typedefs of ref types. bool isReferenceType = (m_SecondaryId.contains(QLatin1Char('*')) || m_SecondaryId.contains(QLatin1Char('&'))); ObjectType ot = ot_Class; if (isReferenceType) { ot = ot_Datatype; } else { if (Model_Utils::isCommonDataType(m_SecondaryId)) ot = ot_Datatype; } m_pSecondary = Object_Factory::createUMLObject(ot, m_SecondaryId, NULL); if (m_pSecondary == NULL) return false; m_SecondaryId = QString(); maybeSignalObjectCreated(); //qApp->processEvents(); return true; }