/** * This is really an auxiliary method for loadFromMDL() but is kept in a * separate file to reflect that it is not coupled with the parser * (other than by the PetalNode.) * * @param root the root of the tree * @return true for success. */ bool petalTree2Uml(PetalNode *root) { if (root == NULL) { uError() << "petalTree2Uml: root is NULL"; return false; } if (root->name() != "Design") { uError() << "petalTree2Uml: expecting root name Design"; return false; } //*************************** import Logical View ******************************** PetalNode *root_category = root->findAttribute("root_category").node; if (root_category == NULL) { uError() << "petalTree2Uml: cannot find root_category"; return false; } if (root_category->name() != "Class_Category") { uError() << "petalTree2Uml: expecting root_category object Class_Category"; return false; } PetalNode *logical_models = root_category->findAttribute("logical_models").node; if (logical_models == NULL) { uError() << "petalTree2Uml: cannot find logical_models"; return false; } UMLDoc *umldoc = UMLApp::app()->document(); umldoc->setCurrentRoot(Uml::ModelType::Logical); Import_Utils::assignUniqueIdOnCreation(false); PetalNode::NameValueList atts = logical_models->attributes(); for (int i = 0; i < atts.count(); ++i) { umbrellify(atts[i].second.node); } // Shorthand for UMLApp::app()->listView() UMLListView *lv = UMLApp::app()->listView(); //*************************** import Use Case View ******************************** umldoc->setCurrentRoot(Uml::ModelType::UseCase); importView(root, "root_usecase_package", "logical_models", lv->theUseCaseView()); //*************************** import Component View ******************************* umldoc->setCurrentRoot(Uml::ModelType::Component); importView(root, "root_subsystem", "physical_models", lv->theComponentView()); //*************************** import Deployment View ****************************** umldoc->setCurrentRoot(Uml::ModelType::Deployment); importView(root, "process_structure", "ProcsNDevs", lv->theDeploymentView()); //*************************** wrap up ******************************** umldoc->setCurrentRoot(Uml::ModelType::Logical); Import_Utils::assignUniqueIdOnCreation(true); umldoc->resolveTypes(); return true; }
/** * Parse a file into the PetalNode internal tree representation * and then create Umbrello objects by traversing the tree. * * @return In case of error: NULL * In case of success with non NULL parentPkg: pointer to UMLPackage created for controlled unit * In case of success with NULL parentPkg: pointer to root folder of Logical View */ UMLPackage* loadFromMDL(QFile& file, UMLPackage *parentPkg /* = 0 */) { if (parentPkg == NULL) { QString fName = file.fileName(); int lastSlash = fName.lastIndexOf(QLatin1Char('/')); if (lastSlash > 0) { dirPrefix = fName.left(lastSlash + 1); } } QTextStream stream(&file); stream.setCodec("ISO 8859-1"); QString line; PetalNode *root = NULL; uint nClosures_sav = nClosures; uint linum_sav = linum; nClosures = 0; linum = 0; while (!(line = stream.readLine()).isNull()) { linum++; if (line.contains(QRegExp(QLatin1String("^\\s*\\(object Petal")))) { bool finish = false; // Nested loop determines character set to use while (!(line = stream.readLine()).isNull()) { linum++; // CHECK: do we need petal version info? if (line.contains(QLatin1Char(')'))) { finish = true; line = line.replace(QLatin1String(QLatin1String(")")), QString()); } QStringList a = line.trimmed().split(QRegExp(QLatin1String("\\s+"))); if (a.size() == 2 && a[0] == QLatin1String("charSet")) { const QString& charSet = a[1]; if (!charSet.contains(QRegExp(QLatin1String("^\\d+$")))) { uWarning() << "Unimplemented charSet " << charSet; if (finish) break; continue; } const int charSetNum = charSet.toInt(); switch (charSetNum) { case 0: // ASCII ; case 1: // Default SETCODEC("System"); case 2: // Symbol ; // @todo SETCODEC("what"); case 77: // Mac SETCODEC("macintosh"); case 128: // ShiftJIS (Japanese) SETCODEC("Shift_JIS"); case 129: // Hangul (Korean) SETCODEC("EUC-KR"); case 130: // Johab (Korean) SETCODEC("EUC-KR"); case 134: // GB2312 (Chinese) SETCODEC("GB18030"); // "Don't use GB2312 here" (Ralf H.) case 136: // ChineseBig5 SETCODEC("Big5"); case 161: // Greek SETCODEC("windows-1253"); case 162: // Turkish SETCODEC("windows-1254"); case 163: // Vietnamese SETCODEC("windows-1258"); case 177: // Hebrew SETCODEC("windows-1255"); case 178: // Arabic SETCODEC("windows-1256"); case 186: // Baltic SETCODEC("windows-1257"); case 204: // Russian SETCODEC("windows-1251"); case 222: // Thai SETCODEC("TIS-620"); case 238: // EastEurope SETCODEC("windows-1250"); case 255: // OEM (extended ASCII) SETCODEC("windows-1252"); default: uWarning() << "Unimplemented charSet number" << charSetNum; } } if (finish) break; } if (line.isNull()) break; } else { QRegExp objectRx(QLatin1String("^\\s*\\(object ")); if (line.contains(objectRx)) { nClosures = 0; QStringList initialArgs = scan(line); initialArgs.pop_front(); // remove opening parenthesis root = readAttributes(initialArgs, stream); break; } } } file.close(); nClosures = nClosures_sav; linum = linum_sav; if (root == NULL) return NULL; if (parentPkg) { UMLPackage *child = petalTree2Uml(root, parentPkg); delete root; return child; } if (root->name() != QLatin1String("Design")) { uError() << "expecting root name Design"; delete root; return NULL; } Import_Utils::assignUniqueIdOnCreation(false); UMLDoc *umldoc = UMLApp::app()->document(); //*************************** import Logical View ********************************* umldoc->setCurrentRoot(Uml::ModelType::Logical); UMLPackage *logicalView = umldoc->rootFolder(Uml::ModelType::Logical); importView(root, logicalView, QLatin1String("root_category"), QLatin1String("logical_models"), QLatin1String("Class_Category"), QLatin1String("logical_presentations")); //*************************** import Use Case View ******************************** umldoc->setCurrentRoot(Uml::ModelType::UseCase); UMLPackage *useCaseView = umldoc->rootFolder(Uml::ModelType::UseCase); importView(root, useCaseView, QLatin1String("root_usecase_package"), QLatin1String("logical_models"), QLatin1String("Class_Category"), QLatin1String("logical_presentations")); //*************************** import Component View ******************************* umldoc->setCurrentRoot(Uml::ModelType::Component); UMLPackage *componentView = umldoc->rootFolder(Uml::ModelType::Component); importView(root, componentView, QLatin1String("root_subsystem"), QLatin1String("physical_models"), QLatin1String("SubSystem"), QLatin1String("physical_presentations")); //*************************** import Deployment View ****************************** umldoc->setCurrentRoot(Uml::ModelType::Deployment); UMLPackage *deploymentView = umldoc->rootFolder(Uml::ModelType::Deployment); importView(root, deploymentView, QLatin1String("process_structure"), QLatin1String("ProcsNDevs"), QLatin1String("Processes")); //*************************** wrap up ******************************** delete root; umldoc->setCurrentRoot(Uml::ModelType::Logical); Import_Utils::assignUniqueIdOnCreation(true); umldoc->resolveTypes(); return logicalView; }