[Uml-devel] branches/KDE/3.5/kdesdk/umbrello
Oliver Kellogg
okellogg at users.sourceforge.net
Sat Apr 28 14:10:41 UTC 2007
SVN commit 658784 by okellogg:
Apply attachment 20435 by Jose Gutierrez:
> * generate correct type and field name for associations
> * use rolenames for field name associations
> * use attributes in role (AS)
> * insert docs
Thanks Jose for contributing.
BUG:144788
M +1 -0 ChangeLog
M +56 -17 umbrello/codegenerators/aswriter.cpp
M +12 -2 umbrello/codegenerators/aswriter.h
M +46 -22 umbrello/codegenerators/jswriter.cpp
M +11 -2 umbrello/codegenerators/jswriter.h
--- branches/KDE/3.5/kdesdk/umbrello/ChangeLog #658783:658784
@@ -34,6 +34,7 @@
* Sequence diagram crashes during message inserting (144293)
* No synchronisation of comments when round-tripping (144346)
* Crash when loading xmi with actor as object of sequence diagram (144442)
+* ActionScript/JavaScript association code generation error (144788)
Version 1.5.61
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/aswriter.cpp #658783:658784
@@ -156,30 +156,19 @@
if (forceSections() || !aggregations.isEmpty ())
{
as << m_endl << m_indentation << "/**Aggregations: */" << m_endl;
- for (UMLAssociation *a = aggregations.first(); a; a = aggregations.next())
- {
- QString nm(cleanName(a->getObject(Uml::A)->getName()));
- if (a->getMulti(Uml::A).isEmpty())
- as << m_indentation << "this.m_" << nm << " = new " << nm << " ();" << m_endl;
- else
- as << m_indentation << "this.m_" << nm.lower() << " = new Array ();" << m_endl;
- }
+ writeAssociation(classname, aggregations , as );
+
}
+
if( forceSections() || !compositions.isEmpty())
{
as << m_endl << m_indentation << "/**Compositions: */" << m_endl;
- for(UMLAssociation *a = compositions.first(); a; a = compositions.next())
- {
- QString nm(cleanName(a->getObject(Uml::A)->getName()));
- if(a->getMulti(Uml::A).isEmpty())
- as << m_indentation << "this.m_" << nm << " = new " << nm << " ();" << m_endl;
- else
- as << m_indentation << "this.m_" << nm.lower() << " = new Array ();" << m_endl;
- }
+ writeAssociation(classname, compositions , as );
}
+
as << m_endl;
+ as << m_indentation << "/**Protected: */" << m_endl;
- as << m_indentation << "/**Protected: */" << m_endl;
if (isClass) {
UMLAttributeList atl = c->getAttributeList();
for (UMLAttribute *at = atl.first(); at ; at = atl.next())
@@ -239,6 +228,56 @@
////////////////////////////////////////////////////////////////////////////////////
// Helper Methods
+
+void ASWriter::writeAssociation(QString& classname, UMLAssociationList& assocList , QTextStream &as )
+{
+ for(UMLAssociation *a = assocList.first(); a; a = assocList.next())
+ {
+ // association side
+ Uml::Role_Type role = a->getObject(Uml::A)->getName() == classname ? Uml::B:Uml::A;
+
+ QString roleName(cleanName(a->getRoleName(role)));
+
+ if (!roleName.isEmpty()) {
+
+ // association doc
+ if (forceDoc() || !a->getDoc().isEmpty()) {
+ as << m_indentation << "/**" << m_endl
+ << formatDoc(a->getDoc(), m_indentation + " * ")
+ << m_indentation << " */" << m_endl;
+ }
+
+ // role doc
+ if (forceDoc() || !a->getRoleDoc(role).isEmpty()) {
+ as << m_indentation << "/**" << m_endl
+ << formatDoc(a->getRoleDoc(role), m_indentation + " * ")
+ << m_indentation << " */" << m_endl;
+ }
+
+ bool okCvt;
+ int nMulti = a->getMulti(role).toInt(&okCvt,10);
+ bool isNotMulti = a->getMulti(role).isEmpty() || (okCvt && nMulti == 1);
+
+ QString typeName(cleanName(a->getObject(role)->getName()));
+
+ if (isNotMulti)
+ as << m_indentation << "this.m_" << roleName << " = new " << typeName << "();" << m_endl;
+ else
+ as << m_indentation << "this.m_" << roleName << " = new Array();" << m_endl;
+
+ // role visibility
+ if (a->getVisibility(role) == Uml::Visibility::Private)
+ {
+ as << m_indentation << "ASSetPropFlags (this, \"m_" << roleName << "\", 7);" << m_endl;
+ }
+ else if (a->getVisibility(role)== Uml::Visibility::Protected)
+ {
+ as << m_indentation << "ASSetPropFlags (this, \"m_" << roleName << "\", 1);" << m_endl;
+ }
+ }
+ }
+}
+
void ASWriter::writeOperations(QString classname, UMLOperationList *opList, QTextStream &as)
{
UMLOperation *op;
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/aswriter.h #658783:658784
@@ -20,6 +20,7 @@
#include "simplecodegenerator.h"
#include "../umloperationlist.h"
+#include "../umlassociationlist.h"
/**
* class ASWriter is a ActionScript code generator for UMLClassifier objects
@@ -63,8 +64,17 @@
* @param opList the list of operations
* @param as output stream for the AS file
*/
- void writeOperations(QString classname, UMLOperationList *opList,
- QTextStream &as);
+ void writeOperations(QString classname, UMLOperationList *opList, QTextStream &as);
+
+ /**
+ * write a list of associations
+ *
+ * @param classname the name of the class
+ * @param assocList the list of associations
+ * @param as output stream for the AS file
+ */
+ void writeAssociation(QString& classname, UMLAssociationList& assoclist , QTextStream &as);
+
};
#endif //ASWRITER
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/jswriter.cpp #658783:658784
@@ -153,33 +153,15 @@
if (forceSections() || !aggregations.isEmpty ())
{
js << m_endl << m_indentation << "/**Aggregations: */" << m_endl;
- for (UMLAssociation* a = aggregations.first(); a; a = aggregations.next())
- {
- UMLObject *b = a->getObject(Uml::B);
- if (b == c)
- continue; // we need to be at the "A" side and the other guy at "B"
- QString nm(cleanName(b->getName()));
- if (a->getMulti(Uml::B).isEmpty())
- js << m_indentation << "this.m_" << nm << " = new " << nm << " ();" << m_endl;
- else
- js << m_indentation << "this.m_" << nm.lower() << " = new Array ();" << m_endl;
- }
+ writeAssociation(classname, aggregations , js );
+
}
UMLAssociationList compositions = c->getCompositions();
if( forceSections() || !compositions.isEmpty())
{
js << m_endl << m_indentation << "/**Compositions: */" << m_endl;
- for (UMLAssociation *a = compositions.first(); a; a = compositions.next())
- {
- UMLObject *b = a->getObject(Uml::B);
- if (b == c)
- continue; // we need to be at the "A" side and the other guy at "B"
- QString nm(cleanName(b->getName()));
- if (a->getMulti(Uml::B).isEmpty())
- js << m_indentation << "this.m_" << nm << " = new "<< nm << " ();" << m_endl;
- else
- js << m_indentation << "this.m_" << nm.lower() << " = new Array ();" << m_endl;
- }
+ writeAssociation(classname, compositions , js );
+
}
js << m_endl;
js << "}" << m_endl;
@@ -201,6 +183,48 @@
////////////////////////////////////////////////////////////////////////////////////
// Helper Methods
+void JSWriter::writeAssociation(QString& classname, UMLAssociationList& assocList , QTextStream &js)
+{
+ for (UMLAssociation *a = assocList.first(); a; a = assocList.next()) {
+ // association side
+ Uml::Role_Type role = (a->getObject(Uml::A)->getName() == classname ? Uml::B : Uml::A);
+
+ QString roleName(cleanName(a->getRoleName(role)));
+
+ if (!roleName.isEmpty()) {
+
+ // association doc
+ if (forceDoc() || !a->getDoc().isEmpty())
+ {
+ js << m_indentation << "/**" << m_endl
+ << formatDoc(a->getDoc(), m_indentation + " * ")
+ << m_indentation << " */" << m_endl;
+ }
+
+ // role doc
+ if (forceDoc() || !a->getRoleDoc(role).isEmpty())
+ {
+ js << m_indentation << "/**" << m_endl
+ << formatDoc(a->getRoleDoc(role), m_indentation + " * ")
+ << m_indentation << " */" << m_endl;
+ }
+
+ bool okCvt;
+ int nMulti = a->getMulti(role).toInt(&okCvt,10);
+ bool isNotMulti = a->getMulti(role).isEmpty() || (okCvt && nMulti == 1);
+
+ QString typeName(cleanName(a->getObject(role)->getName()));
+
+ if (isNotMulti)
+ js << m_indentation << "this.m_" << roleName << " = new " << typeName << "();" << m_endl;
+ else
+ js << m_indentation << "this.m_" << roleName << " = new Array();" << m_endl;
+
+ // role visibility
+ }
+ }
+}
+
void JSWriter::writeOperations(QString classname, UMLOperationList *opList, QTextStream &js)
{
UMLOperation *op;
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/jswriter.h #658783:658784
@@ -20,6 +20,7 @@
#include "simplecodegenerator.h"
#include "../umloperationlist.h"
+#include "../umlassociationlist.h"
/**
* class JSWriter is a JavaScript code generator for UMLClassifier objects
@@ -62,8 +63,16 @@
* @param opList the list of operations
* @param js output stream for the JS file
*/
- void writeOperations(QString classname, UMLOperationList *opList,
- QTextStream &js);
+ void writeOperations(QString classname, UMLOperationList *opList, QTextStream &js);
+
+ /**
+ * write a list of associations
+ *
+ * @param classname the name of the class
+ * @param assocList the list of associations
+ * @param as output stream for the AS file
+ */
+ void writeAssociation(QString& classname, UMLAssociationList& assoclist , QTextStream &js);
};
#endif //JSWRITER
More information about the umbrello-devel
mailing list