void UmlRelation::search_class_assoc() { if (side(TRUE) != this) return; switch (relationKind()) { case aGeneralisation: case aRealization: case aDependency: break; default: { UmlTypeSpec a = association(); if (a.type != 0) { // not generated for actors UmlItem * p = parent(); if (p->stereotype() != "actor") { do { p = p->parent(); } while (p->kind() == aClass); if (p->kind() == aClassView) _assoc_class = a.type->set_assoc(this); } } } } }
void UmlRelation::write(FileOut & out, bool inside) { switch (relationKind()) { case aGeneralisation: if (inside) write_generalization(out); break; case aRealization: if (inside) parent()->memo_relation(this); else write_realization(out); break; case aDependency: if (inside) parent()->memo_relation(this); else write_dependency(out); break; default: // don't generate them for actors { UmlItem * p = parent(); if (p->stereotype() == "actor") return; do { p = p->parent(); } while (p->kind() == aClass); UmlItem * op = roleType(); if (op->stereotype() == "actor") return; do { op = op->parent(); } while (op->kind() == aClass); if ((p->kind() == aClassView) && (op->kind() == aClassView)) { if (inside) write_relation_as_attribute(out); else // note : it is the first side write_relation(out); } } break; } }
UmlAttribute * UmlAttribute::search_attr(UmlClass * cl, const Q3CString & name) { UmlItem * x = cl->search_for_att_rel(name); if (x == 0) return 0; else if (x->kind() == anAttribute) return (UmlAttribute *) x; switch (((UmlRelation *) x)->relationKind()) { case aDirectionalAssociation: case aDirectionalAggregation: case aDirectionalAggregationByValue: x->deleteIt(); break; case anAssociation: case anAggregation: case anAggregationByValue: if (x == ((UmlRelation *) x)->side(TRUE)) ((UmlRelation *) x)->side(FALSE)->set_unidir(); else ((UmlRelation *) x)->set_unidir(); break; default: break; } return 0; }
static UmlAttribute * search_attr(Class * container, const WrapperStr & name) { UmlItem * x = container->get_uml()->search_for_att_rel(name); if (x == 0) return 0; else if (x->kind() == anAttribute) return (UmlAttribute *) x; switch (((UmlRelation *) x)->relationKind()) { case aDirectionalAssociation: case aDirectionalAggregation: case aDirectionalAggregationByValue: x->deleteIt(); break; case anAssociation: case anAggregation: case anAggregationByValue: if (x == ((UmlRelation *) x)->side(TRUE)) ((UmlRelation *) x)->side(FALSE)->set_unidir(); else ((UmlRelation *) x)->set_unidir(); break; default: break; } return 0; }
UmlClass * UmlClass::addMetaclass(WrapperStr mclname, const char * mclpath) { UmlPackage * pack = (UmlPackage *) parent()->parent(); // is a package const Q3PtrVector<UmlItem> ch = pack->children(); unsigned n = ch.size(); UmlClass * r = 0; for (unsigned i = 0; i != n; i += 1) { UmlItem * x = ch[i]; if ((x->kind() == aClassView) && !strncmp(x->name(), "meta classes", 12) && ((r = UmlClass::create(x, mclname)) != 0)) break; } if (r == 0) { WrapperStr s = "meta classes"; UmlItem * v = 0; while ((v = UmlClassView::create(pack, s)) == 0) s += "_"; r = UmlClass::create(v, mclname); } r->set_Stereotype("metaclass"); if (mclpath != 0) r->set_PropertyValue("metaclassPath", mclpath); return r; }
UmlItem * UmlClass::search_for_att_rel(const WrapperStr & name) { const QVector<UmlItem*> & ch = UmlItem::children(); QVectorIterator<UmlItem*> it(ch); while(it.hasNext()) { UmlItem* item = it.next(); switch (item->kind()) { case anAttribute: if (item->name() == name) return item; break; case aRelation: if (((UmlRelation *) item)->roleName() == name) return item; break; default: break; } } return 0; }
static UmlRelation * search_rel(Class * container, const WrapperStr & name, UmlClass * dest, const WrapperStr & st) { UmlItem * x = container->get_uml()->search_for_att_rel(name); if (x == 0) return 0; else if (x->kind() == anAttribute) { ((UmlAttribute *) x)->deleteIt(); return 0; } else { UmlRelation * r1 = ((UmlRelation *) x)->side(TRUE); UmlRelation * r2 = (r1 != x) ? ((UmlRelation *) x) : ((UmlRelation *) x)->side(FALSE); if ((((UmlRelation *) x)->roleType() == dest) && ((r2 == 0) || st.isEmpty() || (((UmlRelation *) x)->stereotype() == st) || (((x == r1) ? r2 : r1)->javaDecl().find("${stereotype}") == -1))) return (UmlRelation *) x; // rel target or new stereotype not compatible with other side if (x != r1) r1->set_unidir(); else if (r2 == 0) r1->deleteIt(); else r2->set_unidir(); return 0; } }
UmlPackage * UmlArtifact::package() { UmlItem * parent = this->parent(); while (parent->kind() != aPackage) parent = parent->parent(); return (UmlPackage *) parent; }
int main(int argc, char ** argv) { if (argc != 2) return 0; if (UmlCom::connect(QCString(argv[1]).toUInt())) { try { //UmlCom::with_ack(FALSE); UmlCom::trace("<b>C++ reverse</b> release 2.15<br>"); UmlCom::traceAutoRaise(FALSE); UmlItem * item = UmlCom::targetItem(); if (item->kind() != aPackage) UmlCom::trace("<font face=helvetica><b>must be applied on a <i>package</i></b></font><br><hr><br>"); else { char * argv = 0; int argc = 0; QApplication * app = new QApplication(argc, &argv); Package::init((UmlPackage *) item, app); QCString f; if (UmlPackage::getProject()->propertyValue("#file", f)) Lex::defines(f); // add c++ catalog like java ? int n; Package::scan_dirs(n); if (n != 0) { CppSettings::set_UseDefaults(TRUE); Package::send_dirs(n, TRUE); Statistic::produce(); } } } catch (...) { } try { // socket may be already closed UmlCom::message(""); UmlCom::showTrace(); UmlCom::bye(0); // application must not be deleted } catch (...) { } } UmlCom::close(); return 0; }
void UmlArtifact::write(FileOut & out) { const char * k = (_uml_20) ? "ownedMember" : "packagedElement"; out.indent(); out << "<" << k << " xmi:type=\"uml:Artifact\""; out.id(this); out << " name=\""; out.quote((const char *)name()); //[jasa] ambiguous call out << "\">\n"; out.indent(+1); write_description_properties(out); const Q3PtrVector<UmlItem> ch = children(); unsigned i; unsigned n = ch.size(); unsigned rank = 0; for (i = 0; i != n; i += 1) { UmlItem * x = ch[i]; if ((x->kind() == aNcRelation) && (x->stereotype() == "manifest") && (((UmlNcRelation *) x)->relationKind() == aDependency)) write_manifest(out, ((UmlNcRelation *) x)->target(), "dependency", ++rank); else ch[i]->write(out); } if (stereotype() == "source") { const Q3PtrVector<UmlClass> & cls = associatedClasses(); n = cls.size(); for (i = 0; i != n; i += 1) write_manifest(out, cls[i], "source", ++rank); } else { const Q3PtrVector<UmlArtifact> & arts = associatedArtifacts(); n = arts.size(); for (i = 0; i != n; i += 1) write_manifest(out, arts[i], 0, ++rank); } out.indent(-1); out.indent(); out << "</" << k << ">\n"; unload(); }
void UmlClass::solveGeneralizationDependencyRealization(int context, WrapperStr idref, WrapperStr label, WrapperStr constraint) { QMap<QString, UmlItem *>::Iterator it = All.find(idref); if (it != All.end()) { static const struct { aRelationKind rk; const char * err; } r[] = { { aGeneralisation, "cannot create generalization from '" }, { aDependency, "cannot create dependency from '" }, { aRealization, "cannot create realization from '" }, { aDependency, "cannot create usage from '" }, { aDependency, "cannot create import from '" } }; UmlItem * target = *it; UmlItem * rel; if (target->kind() == aClass) rel = UmlRelation::create(r[context].rk, this, (UmlClass *) target); else rel = UmlNcRelation::create(r[context].rk, this, target); if (rel == 0) UmlCom::trace(r[context].err + name() + "' to '" + target->name() + "'<br>"); else { if (!label.isEmpty()) rel->set_Name(label); if (!constraint.isEmpty() && (target->kind() == aClass)) ((UmlRelation *) rel)->set_Constraint(constraint); if (context == 3) rel->set_Stereotype("use"); } } else if (!FileIn::isBypassedId(idref)) UmlCom::trace("relation : unknown target reference '" + idref + "'<br>"); }
void UmlClass::uml2java(bool rec) { if (isJavaExternal()) set_JavaDecl(JavaSettings::externalClassDecl()); else { QCString st = JavaSettings::classStereotype(stereotype()); UmlItem * pack = parent()->parent(); while (pack->kind() != aPackage) pack = pack->parent(); if ((st == "stereotype") || (st == "metaclass") || (pack->stereotype() == "profile")) { set_CppDecl(""); return; } if (st == "enum_pattern") set_JavaDecl(JavaSettings::enumPatternDecl()); else if (st == "enum") set_JavaDecl(JavaSettings::enumDecl()); else if (st == "interface") set_JavaDecl(JavaSettings::interfaceDecl()); else if (st == "@interface") { QCString s = JavaSettings::interfaceDecl(); int index = s.find("interface"); if (index != -1) s.insert(index, '@'); set_JavaDecl(s); } else if (st == "ignored") { set_JavaDecl(""); return; } else set_JavaDecl(JavaSettings::classDecl()); if (rec) { const QVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->uml2java(rec); } if (parent()->kind() == aClassView) // not nested artifact()->set_JavaSource(JavaSettings::sourceContent()); } }
bool UmlClass::isAppliedStereotype(Token & tk, WrapperStr & prof_st, Q3ValueList<WrapperStr> & base_v) { static Q3Dict<WrapperStr> stereotypes; static Q3Dict<Q3ValueList<WrapperStr> > bases; WrapperStr s = tk.what(); WrapperStr * st = stereotypes[s]; if (st != 0) { prof_st = *st; base_v = *bases[s]; return TRUE; } base_v.clear(); if (tk.xmiType().isEmpty() && (getFct(tk) == 0)) { int index = s.find(':'); if ((index != -1) && ((index != 3) || ((s.left(3) != "uml") && (s.left(3) != "xmi")))) { UmlClass * cl = findStereotype(s, FALSE); if (cl != 0) { const Q3PtrVector<UmlItem> ch = cl->children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) { UmlItem * x = ch[i]; if ((x->kind() == aRelation) && (((UmlRelation *) x)->relationKind() == aDirectionalAssociation) && (((UmlRelation *) x)->roleType()->stereotype() == "metaclass")) base_v.append("base_" + ((UmlRelation *) x)->roleType()->name().lower()); } if (base_v.isEmpty()) base_v.append("base_element"); prof_st = cl->parent()->parent()->name() + ":" + cl->name(); stereotypes.insert(s, new WrapperStr(prof_st)); bases.insert(s, new Q3ValueList<WrapperStr>(base_v)); return TRUE; } } } return FALSE; }
void UmlClass::uml2cpp(bool rec) { if (isCppExternal()) set_CppDecl(CppSettings::externalClassDecl()); else { QCString st = CppSettings::classStereotype(stereotype()); UmlItem * pack = parent()->parent(); while (pack->kind() != aPackage) pack = pack->parent(); if ((st == "stereotype") || (st == "metaclass") || (pack->stereotype() == "profile")) { set_CppDecl(""); return; } if (st == "enum") set_CppDecl(CppSettings::enumDecl()); else if (st == "union") set_CppDecl(CppSettings::unionDecl()); else if (st == "struct") set_CppDecl(CppSettings::structDecl()); else if (st == "typedef") set_CppDecl(CppSettings::typedefDecl()); else if (st == "ignored") { set_CppDecl(""); return; } else set_CppDecl(CppSettings::classDecl()); if (rec) { const QVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->uml2cpp(rec); } if (parent()->kind() == aClassView) { // not nested UmlArtifact * art = artifact(); art->set_CppSource(CppSettings::sourceContent()); art->set_CppHeader(CppSettings::headerContent()); } } }
void UmlClass::uml2idl(bool rec) { if (isIdlExternal()) set_IdlDecl(IdlSettings::externalClassDecl()); else { QCString st = IdlSettings::classStereotype(stereotype()); UmlItem * pack = parent()->parent(); while (pack->kind() != aPackage) pack = pack->parent(); if ((st == "stereotype") || (st == "metaclass") || (pack->stereotype() == "profile")) { set_CppDecl(""); return; } if (st == "struct") set_IdlDecl(IdlSettings::structDecl()); else if (st == "union") set_IdlDecl(IdlSettings::unionDecl()); else if (st == "enum") set_IdlDecl(IdlSettings::enumDecl()); else if (st == "exception") set_IdlDecl(IdlSettings::exceptionDecl()); else if (st == "typedef") set_IdlDecl(IdlSettings::typedefDecl()); else if (st == "interface") set_IdlDecl(IdlSettings::interfaceDecl()); else if (st == "ignored") { set_IdlDecl(""); return; } else set_IdlDecl(IdlSettings::valuetypeDecl()); if (rec) { const QVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->uml2idl(rec); } if (parent()->kind() == aClassView) // not nested artifact()->set_IdlSource(IdlSettings::sourceContent()); } }
UmlExtraClassMember * UmlClass::search_for_extra(const WrapperStr & name, const WrapperStr & decl) { const QVector<UmlItem*> & ch = UmlItem::children(); QVectorIterator<UmlItem*> it(ch); while(it.hasNext()) { UmlItem* item = it.next(); if ((item->kind() == anExtraClassMember) && (item->name() == name) && !neq(((UmlExtraClassMember *) item)->cppDecl(), decl)) return (UmlExtraClassMember *) item; } return 0; }
void UmlArtifact::solveManifestation(WrapperStr s, WrapperStr idref) { QMap<WrapperStr, UmlItem *>::Iterator it = All.find(idref); if (it == All.end()) { if (!FileIn::isBypassedId(idref)) UmlCom::trace("manifestation : unknown utilized element reference '" + idref + "'<br>"); return; } UmlItem * target = *it; if (!FromBouml || (s != "dependency")) { switch (target->kind()) { case aClass: if (s != "source") break; else if (stereotype().isEmpty()) set_Stereotype("source"); else if (stereotype() != "source") break; addAssociatedClass((UmlClass *) target); return; case anArtifact: if (!FromBouml) break; addAssociatedArtifact((UmlArtifact *) target); return; default: break; } } UmlNcRelation * rel = UmlNcRelation::create(aDependency, this, target); if (rel == 0) UmlCom::trace("cannot create manifestation from '" + name() + "' to '" + target->name() + "'"); else rel->set_Stereotype("manifest"); }
void UmlPackage::subArtifacts(QList<UmlArtifact *> &l, QByteArray name, QByteArray deplview_name) { UmlDeploymentView * deplview; foreach (deplview, _deplviews){ if (deplview->baseName() == deplview_name) { const QVector<UmlItem*> ch = deplview->children(); int i; for (i = 0; i != ch.size(); i += 1) { UmlItem * it = ch[i]; if ((it->kind() == anArtifact) && (it->name() == name)) l.append((UmlArtifact *) it); } } } }
void UmlClass::get_extended(QValueList<QCString> & r) { r.clear(); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; for (i = 0; i != n; i += 1) { UmlItem * x = ch[i]; if ((x->kind() == aRelation) && (((UmlRelation *) x)->relationKind() == aDirectionalAssociation) && (((UmlRelation *) x)->roleType()->stereotype() == "metaclass")) r.append(((UmlRelation *) x)->roleType()->name()); } if (r.isEmpty()) r.append("Element"); }
void UmlClass::uml2php(bool rec) { if (isPhpExternal()) set_PhpDecl(PhpSettings::externalClassDecl()); else { QCString st = PhpSettings::classStereotype(stereotype()); UmlItem * pack = parent()->parent(); while (pack->kind() != aPackage) pack = pack->parent(); if ((st == "stereotype") || (st == "metaclass") || (pack->stereotype() == "profile")) { set_CppDecl(""); return; } if (st == "enum") set_PhpDecl(PhpSettings::enumDecl()); else if (st == "interface") set_PhpDecl(PhpSettings::interfaceDecl()); else if (st == "ignored") { set_PhpDecl(""); return; } else set_PhpDecl(PhpSettings::classDecl()); if (rec) { const QVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->uml2php(rec); } if (parent()->kind() == aClassView) // not nested artifact()->set_PhpSource(PhpSettings::sourceContent()); } }
void Package::update_class_list(WrapperStr pack, UmlItem * container) { const Q3PtrVector<UmlItem> & ch = container->children(); for (unsigned i = 0; i != ch.size(); i += 1) { UmlItem * it = ch[i]; switch (it->kind()) { case aClass: user_classes.replace(pack + it->name(), (UmlClass *) it); update_class_list(pack + it->name() + ".", (UmlClass *) it); break; case aClassView: update_class_list(pack, it); default: break; } } }
UmlRelation * UmlClass::search_for_inherit(UmlClass * mother) { const QVector<UmlItem*> & ch = UmlItem::children(); QVectorIterator<UmlItem*> it(ch); while(it.hasNext()) { UmlItem* item = it.next(); if ((item->kind() == aRelation) && (((UmlRelation *) item)->roleType() == mother)) { switch (((UmlRelation *) item)->relationKind()) { case aGeneralisation: case aRealization: return (UmlRelation *) item; default: break; } } } return 0; }
UmlPackage * Package::get_uml(bool mandatory) { if (uml == 0) { const char * name = text(0); Package * pa = (Package *) parent(); UmlPackage * uml_pa = pa->get_uml(); // will end on project Q3PtrVector<UmlItem> ch = uml_pa->children(); for (unsigned index = 0; index != ch.size(); index += 1) { UmlItem * it = ch[index]; if ((it->kind() == aPackage) && (it->name() == name)) return uml = (UmlPackage *) it; } if ((uml = UmlBasePackage::create(uml_pa, name)) == 0) { if (!mandatory) return 0; #ifdef REVERSE UmlCom::trace(WrapperStr("<font face=helvetica><b>cannot create package <i>") + name + "</i> under package <i>" + uml_pa->name() + "</b></font><br>"); UmlCom::message(""); throw 0; #else QMessageBox::critical(0, "Fatal Error", QString("<font face=helvetica><b>cannot create package <i>") + name + "</i> under package <i>" + ((const char *) uml_pa->name()) + "</b></font><br>"); QApplication::exit(1); #endif } } return uml; }
int main(int argc, char ** argv) { if (argc != 2) return 0; if (UmlCom::connect(Q3CString(argv[1]).toUInt())) { try { //UmlCom::with_ack(FALSE); UmlCom::trace("<b>Php reverse</b> release 1.8.1<br><hr>"); UmlCom::traceAutoRaise(FALSE); UmlItem * item = UmlCom::targetItem(); if (item->kind() != aPackage) UmlCom::trace("<font face=helvetica><b>must be applied on a <i>package</i></b></font><br><hr><br>"); else { char * argv = 0; int argc = 0; QApplication * app = new QApplication(argc, &argv); Package::init((UmlPackage *) item, app); QString here = QDir::currentDirPath(); /* QString path; QFile fp(QDir::home().absFilePath(".boumlcat")); if (fp.open(IO_ReadOnly)) { QTextStream ts(&fp); path = ts.readLine(); fp.close(); } while (!(path = QFileDialog::getOpenFileName(path, "*.cat", 0, 0, "select a php catalog file to read it, or cancel")) .isEmpty()) { QFile f(path); if (f.open(IO_ReadOnly)) { if (fp.open(IO_WriteOnly)) { QTextStream ts(&fp); ts.writeRawBytes((const char *) path, path.length()); ts.writeRawBytes("\n", 1); } QDataStream dt(&f); Package::get_root()->restore_children(dt); } } */ QDir::setCurrent(here); Package * p = Package::scan_dir(); if (p != 0) { PhpSettings::set_UseDefaults(TRUE); p->send_dir(TRUE); Statistic::produce(); } } } catch (...) { } try { // socket may be already closed UmlCom::message(""); UmlCom::showTrace(); UmlCom::bye(0); // application must not be deleted } catch (...) { } } UmlCom::close(); // application must not be deleted return 0; }
int main(int argc, char ** argv) { if (argc != 2) return 0; if (UmlCom::connect(QCString(argv[1]).toUInt())) { try { //UmlCom::with_ack(FALSE); UmlCom::trace("<b>Java reverse</b> release 2.18<br><hr>"); UmlCom::traceAutoRaise(FALSE); UmlItem * item = UmlCom::targetItem(); if (item->kind() != aPackage) UmlCom::trace("<font face=helvetica><b>must be applied on a <i>package</i></b></font><br><hr><br>"); else { char * argv = 0; int argc = 0; QApplication * app = new QApplication(argc, &argv); Package::init((UmlPackage *) item, app); QString here = QDir::currentDirPath(); QString path; // note : QFile fp(QDir::home().absFilePath(".boumlcat")) doesn't work // if the path contains non latin1 characters, for instance cyrillic ! QString s = QDir::home().absFilePath(".boumlcat"); FILE * fp = fopen((const char *) s, "r"); if (fp != 0) { char line[512]; if (fgets(line, sizeof(line) - 1, fp) != 0) { remove_crlf(line); path = line; } fclose(fp); } while (!(path = QFileDialog::getOpenFileName(path, "*.cat", 0, 0, "select a java catalog file to read it, or cancel")) .isEmpty()) { QFile f(path); if (f.open(IO_ReadOnly)) { if ((fp = fopen((const char *) s, "w")) != 0) { fwrite((const char *) path, 1, path.length(), fp); fputc('\n', fp); fclose(fp); } QDataStream dt(&f); Package::get_root()->restore_children(dt); } } QDir::setCurrent(here); int n; Package * p = Package::scan_dir(n); if (p != 0) { JavaSettings::set_UseDefaults(TRUE); p->send_dir(n); Statistic::produce(); } } } catch (...) { } try { // socket may be already closed UmlCom::message(""); UmlCom::showTrace(); UmlCom::bye(0); // application must not be deleted } catch (...) { } } UmlCom::close(); // application must not be deleted return 0; }
void UmlClass::generate_decl(QTextOStream & f_h, Q3CString indent) { context.append(this); bool removed = FALSE; Q3PtrVector<UmlItem> ch = children(); const unsigned sup = ch.size(); const Q3CString & stereotype = cpp_stereotype(); bool a_typedef = (stereotype == "typedef"); bool an_enum = (stereotype == "enum"); const Q3ValueList<UmlFormalParameter> formals = this->formals(); const Q3ValueList<UmlActualParameter> actuals = this->actuals(); unsigned index; const char * p = cppDecl(); const char * pp = 0; const char * sep; bool nestedp = parent()->kind() == aClass; if (nestedp) indent += " "; while ((*p == ' ') || (*p == '\t')) indent += *p++; if (*p != '#') f_h << indent; for (;;) { if (*p == 0) { if (pp == 0) break; // comment management done p = pp; pp = 0; if (*p == 0) break; if (*p != '#') f_h << indent; } if (*p == '\n') { f_h << *p++; if (*p && (*p != '#') && strncmp(p, "${members}", 10) && strncmp(p, "${items}", 8)) f_h << indent; } else if (*p == '@') manage_alias(p, f_h); else if (*p != '$') f_h << *p++; else if (!strncmp(p, "${comment}", 10)) manage_comment(p, pp, CppSettings::isGenerateJavadocStyleComment()); else if (!strncmp(p, "${description}", 14)) manage_description(p, pp); else if (! strncmp(p, "${name}", 7)) { p += 7; f_h << name(); } else if (a_typedef) { if (!strncmp(p, "${type}", 7)) { p += 7; UmlClass::write(f_h, baseType(), FALSE); UmlClass * cl = baseType().type; if ((cl != 0) && !actuals.isEmpty()) { Q3ValueList<UmlActualParameter>::ConstIterator ita; BooL need_space = FALSE; for (ita = actuals.begin(); ita != actuals.end(); ++ita) if ((*ita).superClass() == cl) if (! (*ita).generate(f_h, need_space)) // no specified value break; if (need_space) f_h << " >"; else f_h << '>'; } } else // strange f_h << *p++; } else if (an_enum) { if (!strncmp(p, "${items}", 8)) { p += 8; // items declaration aVisibility current_visibility = DefaultVisibility; unsigned max = sup - 1; BooL first = TRUE; for (index = 0; index < sup; index += 1) { UmlItem * it = ch[index]; switch (it->kind()) { case aClass: case aNcRelation: break; default: if (! ((UmlClassItem *) it)->cppDecl().isEmpty()) ((UmlClassItem *) it)->generate_decl(current_visibility, f_h, stereotype, indent, first, index == max); } } if (*p == '}') f_h << indent; } else // strange f_h << *p++; } else if (! strncmp(p, "${template}", 11)) { p += 11; // template if (!formals.isEmpty()) { sep = "template<"; const char * sep2 = "<"; BooL need_space = FALSE; Q3ValueList<UmlFormalParameter>::ConstIterator itf; for (itf = formals.begin(); itf != formals.end(); ++itf) (*itf).generate(f_h, sep, sep2, need_space); f_h << ((need_space) ? " >\n" : ">\n"); if (nestedp) f_h << indent; } else if (name().find('<') != -1) { f_h << "template<>\n"; if (nestedp) f_h << indent; } } else if (! strncmp(p, "${inherit}", 10)) { p += 10; // inherit sep = " : "; for (index = 0; index != sup; index += 1) { UmlItem * x = ch[index]; if ((x->kind() == aRelation) && !((UmlRelation *) ch[index])->cppDecl().isEmpty()) ((UmlRelation *) x)->generate_inherit(sep, f_h, actuals, stereotype); } } else if (! strncmp(p, "${members}", 10)) { p += 10; // members declaration aVisibility current_visibility; current_visibility = ((stereotype == "struct") || (stereotype == "union")) ? PublicVisibility : DefaultVisibility; unsigned last = sup - 1; BooL first = TRUE; for (index = 0; index != sup; index += 1) { UmlItem * it = ch[index]; if ((it->kind() != aNcRelation) && ! ((UmlClassItem *) it)->cppDecl().isEmpty()) ((UmlClassItem *) it)->generate_decl(current_visibility, f_h, stereotype, indent, first, index == last); } if (*p == '}') f_h << indent; } else if (!strncmp(p, "${inlines}", 10)) { p += 10; context.removeLast(); removed = TRUE; if (! nestedp) { // inline operations definition // template class members Q3CString templates; Q3CString cl_names; Q3CString templates_tmplop; Q3CString cl_names_tmplop; spec(templates, cl_names, templates_tmplop, cl_names_tmplop); for (index = 0; index != sup; index += 1) if (ch[index]->kind() != aNcRelation) ((UmlClassItem *) ch[index]) ->generate_def(f_h, indent, TRUE, templates, cl_names, templates_tmplop, cl_names_tmplop); } if (*p == '\n') p += 1; } else // strange f_h << *p++; } if (! removed) context.removeLast(); }
void UmlTransition::generate(Q3PtrList<UmlTransition> trs, UmlClass * machine, UmlClass * anystate, UmlState * state, Q3CString & body, Q3CString indent, bool completion) { UmlTransition * tr; bool guard = FALSE; for (tr = trs.first(); tr != 0; tr = trs.next()) { body += indent; if (!tr->cppGuard().isEmpty()) { // manage guard body += ((tr == trs.getFirst()) ? "if (" : "else if (") + tr->cppGuard() + ") {\n"; guard = TRUE; } else // no gard : it is the last transition, may be the first body += ((tr == trs.getFirst()) ? "{\n" : "else {\n"); // the target state UmlItem * tg = tr->target(); bool self_external = (state == tg) && tr->isExternal(); while (tg->kind() != aState) tg = tg->parent(); // the parent common to the current and the target state UmlState * common = state; if (self_external) { // execute exit behavior if (!state->cppExitBehavior().isEmpty()) body += indent + " _doexit(stm);\n"; } else { bool fromExit = // the exit behavior is made entering in the exit point (tr->parent()->kind() == anExitPointPseudoState); // compute common parent and manage exit behavior if (tr->target()->kind() != aTerminatePseudoState) { while (!((UmlState *) tg)->inside(common)) { if (!fromExit && !common->cppExitBehavior().isEmpty()) body += indent + " stm" + common->path() + "._doexit(stm);\n"; fromExit = FALSE; switch (common->parent()->kind()) { case aState: common = (UmlState *) common->parent(); break; case aRegion: common = (UmlState *) common->parent()->parent(); break; default: UmlCom::trace("Error : transition from '" + state->name() + "' goes outside the state machine"); throw 0; } } } } // manage transition activity if (!tr->cppActivity().isEmpty()) body += "#ifdef VERBOSE_STATE_MACHINE\n" + indent + " puts(\"DEBUG : execute activity of transition " + tr->name() + "\");\n#endif\n" + tr->cppActivity(); // manage entry behavior if (self_external) { if (state->needCreate()) body += indent + " create(stm);\n"; } else if (tr->target()->kind() != aTerminatePseudoState) { if (tg != common) { Q3CString enter; UmlState * tg_parent; // the enter behavior of the target state will be managed // generating a call to create for (tg_parent = (UmlState *) tg->parent(); tg_parent != common; tg_parent = (UmlState *) tg_parent->parent()) if (!tg_parent->cppEntryBehavior().isEmpty()) enter.insert(0, (const char *)(indent + " stm" + tg_parent->path() + "._doentry(stm);\n")); //[rageek] ambiguous if (!enter.isEmpty()) body += enter; } // set the current state if needed if (tg != state) body += indent + " stm._set_currentState(stm" + ((UmlState *) tg)->path() + ");\n#ifdef VERBOSE_STATE_MACHINE\n" + indent + " puts(\"DEBUG : current state is now " + ((UmlState *) tg)->prettyPath() + "\");\n#endif\n"; } // do the transition if (tr->target()->kind() == aState) { if ((tg != state) && ((UmlState *) tg)->needCreate()) body += indent + " stm" + ((UmlState *) tg)->path() + ".create(stm);\n"; } else tr->target()->generate(machine, anystate, ((UmlState *) tg), body, indent + " "); if (completion) body += indent + " return (bool) 1;\n"; body += indent + "}\n"; } if (completion && guard) body += indent + "return (bool) 0;\n"; }
void UmlClass::generate(QTextOStream & f, QCString indent) { QVector<UmlItem> ch = children(); const QValueList<UmlActualParameter> actuals = this->actuals(); const unsigned sup = ch.size(); const QCString & stereotype = java_stereotype(); bool an_enum_pattern = (stereotype == "enum_pattern"); bool an_enum = (stereotype == "enum"); unsigned index; const char * p = javaDecl(); const char * pp = 0; const char * sep; while ((*p == ' ') || (*p == '\t')) indent += *p++; f << indent; for (;;) { if (*p == 0) { if (pp == 0) break; // comment management done p = pp; pp = 0; if (*p == 0) break; f << indent; } if (*p == '\n') { f << *p++; if (*p && strncmp(p, "${members}", 10) && strncmp(p, "${items}", 8) && strncmp(p, "${cases}", 8)) f << indent; } else if (*p == '@') manage_alias(p, f); else if (*p != '$') f << *p++; else if (!strncmp(p, "${comment}", 10)) manage_comment(p, pp, JavaSettings::isGenerateJavadocStyleComment()); else if (!strncmp(p, "${description}", 14)) manage_description(p, pp); else if (!strncmp(p, "${public}", 9)) { p += 9; if (visibility() == PublicVisibility) f << "public "; } else if (!strncmp(p, "${visibility}", 13)) { p += 13; generate_visibility(f, ""); } else if (!strncmp(p, "${final}", 8)) { p += 8; if (isJavaFinal()) f << "final "; } else if (!strncmp(p, "${abstract}", 11)) { p += 11; if (isAbstract()) f << "abstract "; } else if (! strncmp(p, "${name}", 7)) { p += 7; f << name(); generate_formals(f); } else if (!strncmp(p, "${@}", 4)) { p += 4; if (pp != 0) f << "${@}"; else if (! javaAnnotations().isEmpty()) { pp = p; p = javaAnnotations(); } } else if (an_enum_pattern) { if (!strncmp(p, "${members}", 10)) { p += 10; int current_value = 0; QCString name = this->name(); for (index = 0; index != sup; index += 1) if ((ch[index]->kind() != aNcRelation) && !((UmlClassItem *) ch[index])->javaDecl().isEmpty()) ((UmlClassItem *) ch[index])-> generate_enum_pattern_item(f, current_value, name, indent); if (*p == '}') f << indent; } else if (!strncmp(p, "${cases}", 8)) { p += 8; for (index = 0; index != sup; index += 1) if ((ch[index]->kind() != aNcRelation) && !((UmlClassItem *) ch[index])->javaDecl().isEmpty()) ((UmlClassItem *) ch[index])->generate_enum_pattern_case(f, indent); } else // strange f << *p++; } else if (! strncmp(p, "${extends}", 10)) { p += 10; // extends sep = " extends "; for (index = 0; index != sup; index += 1) { UmlItem * x = ch[index]; if (x->kind() == aRelation) ((UmlRelation *) x)->generate_extends(sep, f, actuals, stereotype); } } else if (! strncmp(p, "${implements}", 13)) { p += 13; if (stereotype != "interface") { // implements sep = " implements "; for (index = 0; index != sup; index += 1) { UmlItem * x = ch[index]; if (x->kind() == aRelation) ((UmlRelation *) x)->generate_implements(sep, f, actuals, stereotype); } } } else if (! strncmp(p, "${members}", 10)) { p += 10; // members if (an_enum) { for (index = 0; index != sup; index += 1) { if (ch[index]->kind() != aNcRelation) { UmlClassItem * it = (UmlClassItem *)ch[index]; if (! it->javaDecl().isEmpty()) it->generate_enum_member(f, indent); } } } else { for (index = 0; index != sup; index += 1) { UmlItem * it = ch[index]; if (it->kind() == aClass) { if (! ((UmlClass *) it)->javaDecl().isEmpty()) { ((UmlClass *) it)->generate(f, indent + " "); f << '\n'; } } else if ((it->kind() != aNcRelation) && !((UmlClassItem *) it)->javaDecl().isEmpty()) ((UmlClassItem *) it)->generate(f, stereotype, indent); } } if (*p == '}') f << indent; } else if (an_enum && ! strncmp(p, "${items}", 8)) { p += 8; // enums items BooL first = TRUE; for (index = 0; index != sup; index += 1) { if (ch[index]->kind() != aNcRelation) { UmlClassItem * it = (UmlClassItem *)ch[index]; if (! it->javaDecl().isEmpty()) it->generate_enum_item(f, indent, first); } } if (*p == '}') f << indent; } else // strange f << *p++; } }
int main(int argc, char ** argv) { if (argc != 2) return 0; if (UmlCom::connect(Q3CString(argv[1]).toUInt())) { bool aborted = TRUE; try { UmlCom::trace("<b>C++ roundtrip</b> release 1.3<br>"); UmlCom::traceAutoRaise(FALSE); char * argv = 0; int argc = 0; QApplication * app = new QApplication(argc, &argv); UmlItem * item = UmlCom::targetItem(); int n; switch (item->kind()) { default: UmlCom::trace("<font face=helvetica><b>must be applied on a <i>package, class view, deployment view, artifact</i> or <i>class</i></b></font><br>"); aborted = FALSE; throw 0; case aPackage: n = ((UmlPackage *) item)->count_roundtriped(); break; case aClassView: case aDeploymentView: case anArtifact: n = 1; break; case aClass: if (item->parent()->kind() != aClassView) { UmlCom::trace("<font face=helvetica><b>can't be applied on a <i>class</i> nested or out of a <i>class view</i></b></font><br>"); aborted = FALSE; throw 0; } n = 1; break; } UmlPackage * project = UmlPackage::getProject(); UmlCom::trace("<font face=helvetica>Upload project ...</font>"); Package::init(project, app); UmlCom::trace("<font face=helvetica>...done</font><br>"); UmlCom::message(""); Package::set_step(0, n); UmlCom::trace("<font face=helvetica>Preparation...</font>"); if (!item->set_roundtrip_expected() && (QMessageBox::warning(0, "Roundtrip", "Some elements to roundtrip are read-only and will not be updated\n\n" "Roundtrip anyway ?", "Yes", "No", QString::null, 1, 1) != 0)) { aborted = FALSE; throw 0; } Package::set_step(0, -1); UmlCom::trace("<font face=helvetica>...done</font><br>"); if ((item->kind() == aPackage) && !UmlArtifact::is_roundtrip_usefull()) { UmlCom::trace("<font face=helvetica>you don't ask for to roundtrip artifact(s)<br><br>" "probably you want to do a <i>reverse</i> rather than a <i>roundtrip</i></font><br>"); aborted = FALSE; throw 0; } Q3CString f; if (project->propertyValue("#file", f)) Lex::defines(f); n = 0; item->scan_it(n); CppSettings::set_UseDefaults(TRUE); project->set_childrenVisible(FALSE); item->send_it(n); UmlOperation::force_defs(); Statistic::produce(); // umark all { Q3PtrVector<UmlItem> marked = UmlItem::markedItems(); UmlItem ** v = marked.data(); UmlItem ** const vsup = v + marked.size(); for (;v != vsup; v += 1) (*v)->set_isMarked(FALSE); } Q3PtrList<UmlItem> useless; item->mark_useless(useless); if (!useless.isEmpty() && (QMessageBox::warning(0, "C++ roundtrip", "The marked elements are useless because they don't\n" "correspond to something in the roundtriped files\n\n\n" "Delete them ?", "Yes", "No", QString::null, 1, 1) == 0)) { Q3PtrListIterator<UmlItem> iter(useless); do { if (iter.current()->isMarked()) iter.current()->deleteIt(); } while (++iter, iter.current() != 0); } project->set_childrenVisible(TRUE); item->set_childrenVisible(TRUE); // re select it aborted = FALSE; } catch (...) { } try { // socket may be already closed if (aborted) UmlCom::trace("<font face=helvetica><br><b>Rountrip aborted!</b></font><br>"); UmlCom::message(""); UmlCom::showTrace(); UmlCom::bye((aborted) ? 1 : 0); // application must not be deleted } catch (...) { } } UmlCom::close(); // application must not be deleted return 0; }