void UmlActivityPartition::write(FileOut & out) { const char * p = (parent()->kind() == aPartition) ? "subpartition" : "group"; out.indent(); out << "<" << p << " xmi:type=\"uml:ActivityPartition\" name=\""; out.quote((const char*)name());//[jasa] ambiguous call out << '"'; out.id(this); if (isDimension()) out << " isDimension=\"true\""; if (isExternal()) out << " isExternal=\"true\""; if (represents() != 0) out.ref(represents(), "represents"); out << ">\n"; out.indent(+1); write_description_properties(out); const Q3PtrVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write(out); out.indent(-1); out.indent(); out << "</" << p << ">\n"; unload(); }
void UmlOpaqueAction::write(FileOut & out) { write_begin(out, "OpaqueAction"); write_end(out, TRUE); Q3CString body; switch(_lang) { case Uml: body = behavior(); break; case Cpp: body = cppBehavior(); break; default: // Java body = javaBehavior(); } if (!body.isEmpty()) { out.indent(); out << "<body>"; out.quote(body); out << "</body>\n"; } write_close(out); }
void UmlAcceptEventAction::write(FileOut & out) { write_begin(out, "AcceptEventAction"); if (isUnmarshall()) out << " isUnmarshall=\"true\""; Q3CString trig; switch (_lang) { case Uml: trig = trigger(); break; case Cpp: trig = cppTrigger(); break; default: // java trig = javaTrigger(); } if (! trig.isEmpty()) { out.ref(this, "trigger", "TRIGGER_"); write_end(out); out.indent(); out << "<trigger xmi:type=\"uml:Trigger\""; out.id_prefix(this, "TRIGGER_"); out << " name=\""; out.quote(trig); out << "\"/>\n"; } else write_end(out); }
void UmlPseudoState::write(FileOut & out) { out.indent(); out << "<subvertex xmi:type=\"uml:Pseudostate\""; out.id(this); if (! name().isEmpty()) { out << " name=\""; out.quote(name()); out << '"'; } out << " kind=\"" << sKind() << "\">\n"; out.indent(+1); write_description_properties(out); while (! _incoming_trans.isEmpty()) _incoming_trans.take(0)->write_in(out); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; for (i = 0; i != n; i += 1) ch[i]->write(out); out.indent(-1); out.indent(); out << "</subvertex>\n"; unload(); }
void UmlReplyAction::write(FileOut & out) { write_begin(out, "ReplyAction"); Q3CString trig; switch (_lang) { case Uml: trig = replyToCall(); break; case Cpp: trig = cppReplyToCall(); break; default: // java trig = javaReplyToCall(); } if (! trig.isEmpty()) { out.ref(this, "replyToCall", "TRIGGER_"); write_end(out); out.indent(); out << "<trigger xmi:type=\"uml:Trigger\""; out.id_prefix(this, "TRIGGER_"); out << " name=\""; out.quote(trig); out << "\"/>\n"; } else write_end(out); }
void UmlActivityAction::write_condition(FileOut & out, Q3CString cond, bool pre) { if (! cond.isEmpty()) { const char * k; const char * K; const char * body; if (pre) { k = "pre"; K = "PRE_"; body = "PRE_BODY_"; } else { k = "post"; K = "POST_"; body = "POST_BODY_"; } out.indent(); out << '<' << k << "condition xmi:type=\"uml:Constraint\""; out.id_prefix(this, K); out << ">\n"; out.indent(); out << "\t<specification xmi:type=\"uml:OpaqueExpression\""; out.id_prefix(this, body); out << " body=\""; out.quote(cond); out << "\"/>\n"; out.indent(); out << "</" << k << "condition>\n"; } }
void UmlUseCaseView::write(FileOut & out) { if (_gen_views) { out.indent(); out << ((_uml_20) ? "<ownedMember" : "<packagedElement") << " xmi:type=\"uml:Package\""; out.id(this); out << " name =\"use case view "; out.quote(name()); out << "\">\n"; out.indent(+1); write_description_properties(out); } const QVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write(out); if (_gen_views) { while (! _relations.isEmpty()) _relations.take(0)->write(out, FALSE); while (! _assocs.isEmpty()) _assocs.take(0)->write_it(out); out.indent(-1); out.indent(); out << ((_uml_20) ? "</ownedMember>\n" : "</packagedElement>\n"); } }
void UmlRegion::write(FileOut & out) { out.indent(); out << "<region xmi:type=\"uml:Region\""; out.id(this); out << " name=\""; out.quote(name()); out << "\">\n"; out.indent(+1); write_description_properties(out); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; for (i = 0; i != n; i += 1) ch[i]->write(out); #if 0 // to bypass Eclipse's bug this is done by the parent state while (! _trans.isEmpty()) _trans.take(0)->write_it(out); #endif out.indent(-1); out.indent(); out << "</region>\n"; unload(); }
void UmlNode::write(FileOut & out) { const char * k = (_uml_20) ? "ownedMember" : "packagedElement"; out.indent(); out << "<" << k << " xmi:type=\"" << ((stereotype() == "device\"") ? "uml:Device" : "uml:Node\""); out.id(this); out << " name=\""; out.quote((const char *)name()); //[jasa] ambiguous call out << "\">\n"; out.indent(+1); write_description_properties(out); const QVector<UmlItem*> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write(out); out.indent(-1); out.indent(); out << "</" << k << ">\n"; unload(); }
bool UmlComponent::write_if_needed(FileOut & out) { parent()->write(out); out.indent(); out << "<UML:Component name=\""; out.quote(name()); out << '"'; out.id(this); out << " visibility=\"public\" isAbstract=\"false\" isActive=\"false\" >\n"; out.indent(+1); write_stereotype(out); write_description_properties(out); out.indent(-1); out.indent(); out << "</UML:Component>\n"; const Q3PtrVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write_if_needed(out); unload(); return TRUE; }
void UmlFormalParameter::write(FileOut & out, UmlClass * cl, int rank, bool uml20) const { out.indent(); out << "<parameter"; out.idref_prefix(cl, "TEMPLPARAM", rank); out << "/>\n"; out.indent(); out << "<ownedParameter xmi:type=\"uml:ClassifierTemplateParameter\""; out.id_prefix(cl, "TEMPLPARAM", rank); out << ">\n"; out.indent(+1); out.indent(); if (uml20) out << "<ownedElement xmi:type=\"uml:Class\""; else out << "<ownedParameteredElement xmi:type=\"uml:Class\""; out.id_prefix(cl, "TEMPLELEM", rank); out << " name=\""; out.quote(name()); out << '"'; out.ref(cl, "templateParameter", "TEMPLPARAM", rank); out << "/>\n"; if (defaultValue().type != 0) UmlItem::write_default_value(out, defaultValue().type->name(), cl, rank); else UmlItem::write_default_value(out, defaultValue().explicit_type, cl, rank); out.indent(-1); out.indent(); out << "</ownedParameter>\n"; }
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 UmlActivityAction::write_end(FileOut & out, bool dontclose) { out << ">\n"; out.indent(+1); Q3CString s = constraint(); if (! s.isEmpty()) { out.indent(); out << "<ownedRule xmi:type=\"uml:Constraint\""; out.id_prefix(this, "CONSTRAINT_"); out.ref(this, "constrainedElement"); out << ">\n"; out.indent(); out << "\t<specification xmi:type=\"uml:OpaqueExpression\""; out.id_prefix(this, "CSPEC_"); out << ">\n"; out.indent(); out << "\t\t<body>"; out.quote(s); out << "</body>\n"; out.indent(); out << "\t</specification>\n"; out.indent(); out << "</ownedRule>\n"; } write_description_properties(out); switch (_lang) { case Uml: write_condition(out, preCondition(), TRUE); write_condition(out, postCondition(), FALSE); break; case Cpp: write_condition(out, cppPreCondition(), TRUE); write_condition(out, cppPostCondition(), FALSE); break; default: // java write_condition(out, javaPreCondition(), TRUE); write_condition(out, javaPostCondition(), FALSE); } const Q3PtrVector<UmlItem> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write(out); write_incoming_flows(out); if (!dontclose) write_close(out); }
void UmlActivityAction::write_begin(FileOut & out, Q3CString k) { out.indent(); out << ((parent()->kind() == anActivity) ? "<node" : "<containedNode") << " xmi:type=\"uml:" << k << '"'; out.id(this); if (!name().isEmpty()){ out << " name=\""; out.quote(name()); out << '"'; } }
void UmlItem::write_stereotype(FileOut & out) { if (! stereotype().isEmpty()) { out.indent(); out << "<UML:ModelElement.stereotype>\n"; out.indent(); out << "\t<UML:Stereotype name=\""; out.quote(stereotype()); out << "\"/>\n"; out.indent(); out << "</UML:ModelElement.stereotype>\n"; switch (_taggedvalue_mode) { case 1: out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); out << "\t<UML:TaggedValue tag=\"stereotype\" value=\""; out.quote(stereotype()); out << "\"/>\n"; out.indent(); out << "</UML:ModelElement.taggedValue>\n"; break; case 2: out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); out << "\t<UML:TaggedValue.tag>stereotype</UML:TaggedValue.tag>\n"; out.indent(); out << "\t<UML:TaggedValue.value>"; out.quote(stereotype()); out << "</UML:TaggedValue.value>\n"; out.indent(); out << "</UML:ModelElement.taggedValue>\n"; } } }
void UmlActivityObject::write(FileOut & out) { const char * k = (parent()->kind() == anActivity) ? "node" : "containedNode"; out.indent(); out << '<' << k << " xmi:type=\"uml:"; WrapperStr st = stereotype(); if (st == "datastore") out << "DataStoreNode"; else if (st == "centralBuffer") out << "CentralBufferNode"; else out << "ObjectNode"; out << "\" name=\""; out.quote(name()); out << '"'; out.id(this); if (isControlType()) out << " isControlType=\"true\""; write_ordering(out); write_selection(out); write_in_state(out); out << ">\n"; out.indent(+1); write_description_properties(out); write_multiplicity(out, multiplicity(), this); UmlItem::write_type(out, type()); const QVector<UmlItem*> ch = children(); unsigned n = ch.size(); for (unsigned i = 0; i != n; i += 1) ch[i]->write(out); write_incoming_flows(out); out.indent(-1); out.indent(); out << "</" << k << ">\n"; unload(); }
void UmlItem::write_description_properties(FileOut & out) { if (_taggedvalue_mode != 0) { if (! description().isEmpty()) { out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); if (_taggedvalue_mode == 1) { out << "\t<UML:TaggedValue tag=\"documentation\" value=\""; out.quote(description()); out << "\"/>\n"; } else { out << "\t<UML:TaggedValue.tag>documentation</UML:TaggedValue.tag>\n"; out.indent(); out << "\t<UML:TaggedValue.value>"; out.quote(description()); out << "</UML:TaggedValue.value>\n"; } out.indent(); out << "</UML:ModelElement.taggedValue>\n"; } const QHash<QByteArray, QByteArray*> up = properties(); QHashIterator<QByteArray, QByteArray*> it(up); while (it.hasNext()) { it.next(); out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); if (_taggedvalue_mode == 1) { out << "\t<UML:TaggedValue tag=\""; out.quote(it.key()); out << "\" value=\""; out.quote(*(it.value())); out << "\"/>\n"; } else { out << "\t<UML:TaggedValue.tag>"; out.quote(it.key()); out << "</UML:TaggedValue.tag>\n"; out.indent(); out << "\t<UML:TaggedValue.value>"; out.quote(*(it.value())); out << "</UML:TaggedValue.value>\n"; } out.indent(); out << "</UML:ModelElement.taggedValue>\n"; // ++it; } } }
void UmlItem::write_description_properties(FileOut & out) { if (_taggedvalue_mode != 0) { if (! description().isEmpty()) { out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); if (_taggedvalue_mode == 1) { out << "\t<UML:TaggedValue tag=\"documentation\" value=\""; out.quote(description()); out << "\"/>\n"; } else { out << "\t<UML:TaggedValue.tag>documentation</UML:TaggedValue.tag>\n"; out.indent(); out << "\t<UML:TaggedValue.value>"; out.quote(description()); out << "</UML:TaggedValue.value>\n"; } out.indent(); out << "</UML:ModelElement.taggedValue>\n"; } const Q3Dict<Q3CString> up = properties(); Q3DictIterator<Q3CString> it(up); while (it.current()) { out.indent(); out << "<UML:ModelElement.taggedValue>\n"; out.indent(); if (_taggedvalue_mode == 1) { out << "\t<UML:TaggedValue tag=\""; out.quote(it.currentKey()); out << "\" value=\""; out.quote(*(it.current())); out << "\"/>\n"; } else { out << "\t<UML:TaggedValue.tag>"; out.quote(it.currentKey()); out << "</UML:TaggedValue.tag>\n"; out.indent(); out << "\t<UML:TaggedValue.value>"; out.quote(*(it.current())); out << "</UML:TaggedValue.value>\n"; } out.indent(); out << "</UML:ModelElement.taggedValue>\n"; ++it; } } }
void UmlActivityObject::write_in_state(FileOut & out) { QCString s = inState(); if (!s.isEmpty()) { UmlState * st = UmlState::find(s); if (st != 0) out.ref(st, "inState"); else { // not legal but ... out << " inState=\""; out.quote(s); out << '"'; } } }
void UmlEntryPointPseudoState::write(FileOut & out) { UmlEntryPointPseudoState * ref = reference(); out.indent(); if (ref != 0) out << "<connection"; else out << "<subvertex xmi:type=\"uml:Pseudostate\""; out.id(this); if (! name().isEmpty()) { out << " name=\""; out.quote(name()); out << '"'; } if (ref != 0) { out.ref(ref, "entry"); out << ">\n"; } else out << " kind=\"entryPoint\">\n"; out.indent(+1); write_description_properties(out); while (! _incoming_trans.isEmpty()) _incoming_trans.take(0)->write_in(out); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; for (i = 0; i != n; i += 1) ch[i]->write(out); out.indent(-1); out.indent(); if (ref != 0) out << "</connection>\n"; else out << "</subvertex>\n"; unload(); }
void UmlItem::write_default_value(FileOut & out, Q3CString v, UmlItem * who, int rank) { if (! v.isEmpty()) { if (v[0] == '=') { v = v.mid(1); if (v.isEmpty()) return; } out.indent(); out << "<defaultValue xmi:type=\"uml:LiteralString\""; if (rank == -1) out.id_prefix(who, "VALUE_"); else out.id_prefix(who, "VALUE", rank); out << " value=\""; out.quote((const char*)v);//[jasa] ambiguous call out << "\"/>\n"; } }
void UmlClassView::write(FileOut & out) { if (!_written) { _written = TRUE; parent()->write(out); if (_gen_views) { out.indent(); out << "<UML:Package"; out.id(this); out << " name =\"Class View "; out.quote(name()); out << "\">\n"; out.indent(+1); write_stereotype(out); write_description_properties(out); out.indent(); out << "<UML:Namespace.ownedElement>\n"; out.indent(+1); } } }
void UmlOnSignalAction::write_signal(FileOut & out) { Q3CString sig; switch (_lang) { case Uml: sig = signal(); break; case Cpp: sig = cppSignal(); break; default: // java sig = javaSignal(); } if (! sig.isEmpty()) { out.indent(); out << "<signal xmi:type=\"uml:Signal\""; out.id_prefix(this, "SIGNAL_"); out << " name=\""; out.quote(sig); out << "\"/>\n"; } }
void UmlTransition::write_it(FileOut & out) { out.indent(); out << "<transition xmi:type=\"uml:Transition\""; out.id(this); if (!name().isEmpty() && (name() != "<transition>")) { out << " name=\""; out.quote(name()); out << '"'; } out.ref(parent(), "source"); out.ref(target(), "target"); if (parent() == target()) out << " kind=\"" << ((isExternal()) ? "external" : "internal") << '"'; out << ">\n"; out.indent(+1); write_description_properties(out); WrapperStr trig; WrapperStr grd; WrapperStr effect; switch (_lang) { case Uml: trig = trigger(); grd = guard(); effect = activity(); break; case Cpp: trig = cppTrigger(); grd = cppGuard(); effect = cppActivity(); break; default: // Java trig = javaTrigger(); grd = javaGuard(); effect = javaActivity(); break; } if (! trig.isEmpty()) { out.indent(); out << "<trigger xmi:type=\"uml:Trigger\""; out.id_prefix(this, "TRIGGER_"); out << " name=\""; out.quote(trig); out << "\"/>\n"; } if (! grd.isEmpty()) { out.indent(); out << "<guard xmi:type=\"uml:Constraint\""; out.id_prefix(this, "GUARD_"); out << ">\n"; out.indent(); out << "\t<specification xmi:type=\"uml:OpaqueExpression\""; out.id_prefix(this, "GUARD_EXPR_"); out << ">\n"; out.indent(); out << "\t\t<body>"; out.quote(grd); out << "</body>\n"; out.indent(); out << "\t</specification>\n"; out.indent(); out << "</guard>\n"; } if (! effect.isEmpty()) { out.indent(); out << "<effect xmi:type=\"uml:Activity\""; out.id_prefix(this, "EFFECT_"); out << ">\n"; out.indent(); out << "\t<body>"; out.quote(effect); out << "</body>\n"; out.indent(); out << "</effect>\n"; } out.indent(-1); out.indent(); out << "</transition>\n"; unload(); }
bool UmlClass::write_if_needed(FileOut & out) { // even if the class doen't have children parent()->write(out); if ((stereotype() == "actor") || ((parent()->kind() != aClassView) && (parent()->kind() != aClass))) // force it to be an actor write_actor(out); else { switch (_lang) { case Cpp: if (cppDecl().isEmpty()) return FALSE; break; case Java: if (javaDecl().isEmpty()) return FALSE; default: break; } bool interf = (stereotype() == "interface"); out.indent(); out << ((interf) ? "<UML:Interface name=\"" : "<UML:Class name=\""); out.quote(name()); out << '"'; out.id(this); out << " visibility=\"public\" isAbstract=\"" << ((isAbstract()) ? "true" : "false") << "\" isActive=\"false\" >\n"; out.indent(+1); if (! interf) write_stereotype(out); write_annotation(out); write_description_properties(out); const QVector<UmlItem*> ch = children(); unsigned n = ch.size(); bool used = FALSE; bool haveRel = FALSE; for (unsigned i = 0; i != n; i += 1) { switch (ch[i]->kind()) { case aNcRelation: break; case aRelation: haveRel = TRUE; break; default: used |= ch[i]->write_if_needed(out); } } if (used) { out.indent(-1); out.indent(); out << "</UML:Classifier.feature>\n"; } out.indent(-1); out.indent(); out << ((interf) ? "</UML:Interface>\n" : "</UML:Class>\n"); if (haveRel) { for (unsigned i = 0; i != n; i += 1) if (ch[i]->kind() == aRelation) used |= ch[i]->write_if_needed(out); } } unload(); return TRUE; }
void UmlState::write(FileOut & out) { anItemKind pkind = parent()->kind(); bool mach = (pkind != aState) && (pkind != aRegion); UmlState * ref = reference(); const char * k; if (mach) { k = (_uml_20) ? "ownedMember" : "packagedElement"; memo_incoming_trans(); } else k = "subvertex"; out.indent(); out << "<" << k << " xmi:type=\"uml:" << ((mach || (stereotype() == "machine")) ? "StateMachine" : "State") << '"'; out.id(this); out << " name=\""; out.quote(name()); out << '"'; if (ref != 0) out.ref(ref, "submachine"); else { if (specification() != 0) out.ref(specification(), "specification"); if (isActive()) out << " isActive=\"true\""; } out << ">\n"; out.indent(+1); write_description_properties(out); if (ref == 0) { QCString doentry; QCString doactivity; QCString doexit; switch (_lang) { case Uml: doentry = entryBehavior(); doactivity = doActivity(); doexit = exitBehavior(); break; case Cpp: doentry = cppEntryBehavior(); doactivity = cppDoActivity(); doexit = cppExitBehavior(); break; default: // Java doentry = javaEntryBehavior(); doactivity = javaDoActivity(); doexit = javaExitBehavior(); break; } if (! doentry.isEmpty()) { out.indent(); out << "<entry xmi:type=\"uml:Activity\""; out.id_prefix(this, "ENTRY_"); out << ">\n"; out.indent(); out << "\t<body>"; out.quote(doentry); out << "</body>\n"; out.indent(); out << "</entry>\n"; } if (! doactivity.isEmpty()) { out.indent(); out << "<doActivity xmi:type=\"uml:Activity\""; out.id_prefix(this, "DOACTIVITY_"); out << ">\n"; out.indent(); out << "\t<body>"; out.quote(doactivity); out << "</body>\n"; out.indent(); out << "</doActivity>\n"; } if (! doexit.isEmpty()) { out.indent(); out << "<exit xmi:type=\"uml:Activity\""; out.id_prefix(this, "EXIT_"); out << ">\n"; out.indent(); out << "\t<body>"; out.quote(doexit); out << "</body>\n"; out.indent(); out << "</exit>\n"; } } while (! _incoming_trans.isEmpty()) _incoming_trans.take(0)->write_in(out); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; bool need_region = FALSE; for (i = 0; i != n; i += 1) { if (ch[i]->kind() != aRegion) { need_region = TRUE; break; } } if (need_region) { if (ref == 0) { out.indent(); out << "<region xmi:type=\"uml:Region\""; out.id_prefix(this, "IMPLICIT_REGION_"); out << " name=\"Bouml_Implicit_Region\">\n"; out.indent(+1); } for (i = 0; i != n; i += 1) if (ch[i]->kind() != aRegion) ch[i]->write(out); #if 0 // to bypass Eclipse's bug while (! _trans.isEmpty()) _trans.take(0)->write_it(out); #endif if (ref == 0) { out.indent(-1); out.indent(); out << "</region>\n"; } } if (ref == 0) { for (i = 0; i != n; i += 1) if (ch[i]->kind() == aRegion) ch[i]->write(out); } #if 1 // to bypass Eclipse's bug while (! _trans.isEmpty()) _trans.take(0)->write_it(out); #endif out.indent(-1); out.indent(); out << "</" << k << ">\n"; unload(); }
void UmlFragment::write_ref(FileOut & out, UmlItem * diagram, Q3PtrList< UmlSequenceMessage > & msgs) { static int rank = 0; out.indent(); out << "<fragment xmi:type=\"uml:InteractionUse\""; out.id_prefix(diagram, "INTERACTIONUSE", ++rank); const Q3PtrVector<UmlClassInstanceReference> & v = UmlBaseFragment::covered(); unsigned n; unsigned index; n = v.count(); if (n != 0) { out << " covered=\""; index = 0; for (;;) { out.ref_only(diagram, v.at(index)->lifeline()); if (++index == n) break; out << " "; } out << '"'; } UmlDiagram * d = refer(); if (d != 0) { switch (d->kind()) { case aSequenceDiagram: case aCollaborationDiagram: out.ref(d, "refersTo", "INTERACTION_"); if (arguments().isEmpty()) out << "/>\n"; else { static int rank = 0; out << ">\n"; out.indent(); out << "\t<argument xmi:type=\"uml:OpaqueExpression\""; out.id_prefix(d, "INTER_ARG_EXPR_", ++rank); out << ">\n"; out.indent(); out << "\t\t<body>"; out.quote(arguments()); out << "</body>\n"; out.indent(); out << "\t</argument>\n"; out.indent(); out << "</fragment>\n"; } break; default: out << "/>\n"; break; } } else out << "/>\n"; // remove internal messages and compartment const Q3PtrVector<UmlFragmentCompartment> & subs = compartments(); n = subs.size(); for (index = 0; index != n; index += 1) subs.at(index)->bypass(msgs); }
bool UmlOperation::write_if_needed(FileOut & out) { QCString decl; switch (_lang) { case Uml: parent()->write(out); out.indent(); out << "<UML:Operation name=\""; out.quote(name()); break; case Cpp: decl = cppDecl(); if (decl.isEmpty()) return FALSE; remove_comments(decl); parent()->write(out); out.indent(); out << "<UML:Operation name=\""; out.quote(true_name(cppDecl())); break; default: // Java decl = javaDecl(); if (decl.isEmpty()) return FALSE; remove_comments(decl); parent()->write(out); out.indent(); out << "<UML:Operation name=\""; out.quote(true_name(javaDecl())); break; } out << '"'; out.id(this); switch (_lang) { case Uml: write_visibility(out); break; case Cpp: write_visibility(out, (cppVisibility() == DefaultVisibility) ? visibility() : cppVisibility()); break; default: // Java if (javaDecl().find("${visibility}") != -1) write_visibility(out, visibility()); break; } write_scope(out); out << " isAbstract=\"" << ((isAbstract()) ? "true" : "false") << "\">\n"; out.indent(+1); write_stereotype(out); write_annotation(out); write_description_properties(out); out.indent(); out << "<UML:BehavioralFeature.parameter>\n"; out.indent(+1); write_return_type(out, decl); if (_lang == Uml) write_uml_params(out); else write_cpp_java_params(out, decl); out.indent(-1); out.indent(); out << "</UML:BehavioralFeature.parameter>\n"; out.indent(-1); out.indent(); out << "</UML:Operation>\n"; unload(); return TRUE; }
void UmlClass::write(FileOut & out) { QCString st = stereotype(); if (st == "metaclass") return; bool is_actor = (st == "actor"); bool is_enum = (st == "enum"); bool is_stereotype = (st == "stereotype") && (parent()->parent()->kind() == aPackage) && (parent()->parent()->stereotype() == "profile"); if (!is_actor) { switch (_lang) { case Cpp: if (cppDecl().isEmpty()) return; break; case Java: if (javaDecl().isEmpty()) return; default: break; } } const char * k = (parent()->kind() == aClass) ? "nestedClassifier" : ((!_uml_20) ? "packagedElement" : ((is_stereotype) ? "ownedStereotype" : "ownedMember")); bool is_assoc_class = (_assoc != 0); out.indent(); out << "<" << k << " xmi:type=\"uml:" << ((is_actor) ? "Actor" : ((is_assoc_class) ? "AssociationClass" : ((st == "interface") ? "Interface" : ((is_enum) ?"Enumeration" : ((is_stereotype) ? "Stereotype" : "Class"))))) << "\" name=\""; out.quote(name()); out << '"'; out.id(this); write_visibility(out); if (isAbstract()) out << " isAbstract=\"true\""; if (isActive()) out << " isActive=\"true\""; out << ">\n"; if (is_assoc_class) _assoc->write_ends(out); out.indent(+1); write_constraint(out); write_annotation(out); write_description_properties(out); if (_gen_extension && (st == "typedef")) { const UmlTypeSpec & base = baseType(); if ((base.type != 0) || !base.explicit_type.isEmpty()) { out.indent(); out << "<xmi:Extension extender=\"Bouml\">\n"; out.indent(); out << "\t<typedef>\n"; out.indent(+2); UmlItem::write_type(out, base, "base"); out.indent(-2); out.indent(); out << "\t</typedef>\n"; out.indent(); out << "</xmi:Extension>\n"; } } write_formals(out); write_actuals(out); const QVector<UmlItem> ch = children(); unsigned n = ch.size(); unsigned i; for (i = 0; i != n; i += 1) ch[i]->write(out); if (is_stereotype) { QCString path; if (propertyValue("stereotypeIconPath", path) && !path.isEmpty()) { out.indent(); out << "<icon xmi:type=\"uml:Image\""; out.id_prefix(this, "Icon_"); out << " location=\"" << path << "\"/>\n"; } } out.indent(-1); out.indent(); out << "</" << k << ">\n"; if (is_stereotype) for (i = 0; i != n; i += 1) if (ch[i]->kind() == aRelation) ((UmlRelation *) ch[i])->write_extension(out); unload(); }
void UmlCollaborationMessage::write(FileOut & out, UmlItem * diagram, const Q3PtrVector< UmlCollaborationMessage > & msgs, unsigned & index) { unsigned sup = msgs.size(); UmlPackage * prj = UmlPackage::getProject(); while (index != sup) { const UmlCollaborationMessage * msg = msgs[index++]; Q3CString pfix = msg->hrank() + "."; unsigned pfixlen = pfix.length(); #define MSG "MSG", msg->itsrank #define SEND "MSGOCCSPECSEND", msg->itsrank #define REC "MSGOCCSPECREC", msg->itsrank #define BEH "BEHEXECSPEC", msg->itsrank #define EXEC "EXECOCCSPEC", msg->itsrank out.indent(); out << "<fragment xmi:type=\"uml:MessageOccurrenceSpecification\""; out.id_prefix(diagram, SEND); out.ref(diagram, "covered", msg->from()->lifeline()); out.ref(prj, "event", (msg->operation() != 0) ? msg->operation()->event(FALSE) : UmlOperation::event("SEND", msg->form())); out.ref(diagram, "message", MSG); out << "/>\n"; out.indent(); out << "<message xmi:type=\"uml:Message\""; out.id_prefix(diagram, MSG); out << " name=\""; out.quote((const char*)((msg->operation() != 0) ? msg->operation()->name() : msg->form()));//[jasa] ambiguous call out << '"'; out.ref(diagram, "sendEvent", SEND); out.ref(diagram, "receiveEvent", REC); out.ref(diagram, "connector", msg->from()->connector(msg->to())); out << "/>\n"; out.indent(); out << "<fragment xmi:type=\"uml:MessageOccurrenceSpecification\""; out.id_prefix(diagram, REC); out.ref(diagram, "covered", msg->to()->lifeline()); out.ref(prj, "event", (msg->operation() != 0) ? msg->operation()->event(TRUE) : UmlOperation::event("REC", msg->form())); out.ref(diagram, "message", MSG); out << "/>\n"; out.indent(); out << "<fragment xmi:type=\"uml:BehaviorExecutionSpecification\""; out.id_prefix(diagram, BEH); out.ref(diagram, "covered", msg->to()->lifeline()); out.ref(diagram, "start", REC); out.ref(diagram, "finish", EXEC); out << "/>\n"; if (index != sup) { Q3CString pfix2 = msgs[index]->hrank() + "."; if ((pfix2.length() > pfixlen) && !strncmp(pfix, pfix2, pfixlen)) write(out, diagram, msgs, index); } out.indent(); out << "<fragment xmi:type=\"uml:ExecutionOccurrenceSpecification\""; out.id_prefix(diagram, EXEC); out.ref(diagram, "covered", msg->to()->lifeline()); out.ref(prj, "event", UmlOperation::event("EXEC", (msg->operation() != 0) ? msg->operation()->name() : msg->form())); out.ref(diagram, "execution", BEH); out << "/>\n"; } }