[Uml-devel] branches/KDE/3.5/kdesdk/umbrello
Oliver Kellogg
okellogg at users.sourceforge.net
Sat Feb 24 07:22:05 UTC 2007
SVN commit 636790 by okellogg:
Attachment 19796 from Antoine Dopffer adds code generation for UniAssociation
in C++and Java. I modified the patch for role B as described in comment #8.
Many thanks Antoine for your work.
BUG:72042
M +1 -0 ChangeLog
M +29 -0 umbrello/classifier.cpp
M +5 -0 umbrello/classifier.h
M +4 -1 umbrello/codegenerators/classifierinfo.cpp
M +1 -0 umbrello/codegenerators/classifierinfo.h
M +10 -0 umbrello/codegenerators/cppwriter.cpp
M +7 -3 umbrello/codegenerators/javawriter.cpp
--- branches/KDE/3.5/kdesdk/umbrello/ChangeLog #636789:636790
@@ -4,6 +4,7 @@
* C# Code Generation and export (53368)
* Java interface inheritance, abstract classes and generics in code generation
(53376)
+* Code generation ignores unidirectional association (72042)
* %date% and %time% not being parsed (96612)
* Operations of the Interface are not implemented in the class automatically
(111593)
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/classifier.cpp #636789:636790
@@ -833,6 +833,33 @@
return m_isRef;
}
+UMLAssociationList UMLClassifier::getUniAssociationToBeImplemented() {
+ UMLAssociationList associations = getSpecificAssocs(Uml::at_UniAssociation);
+ UMLAssociationList uniAssocListToBeImplemented;
+
+ for(UMLAssociation *a = associations.first(); a; a = associations.next()) {
+ if (a->getObjectId(Uml::B) == getID())
+ continue; // we need to be at the A side
+
+ QString roleNameB = a->getRoleName(Uml::B);
+ if (!roleNameB.isEmpty()) {
+ UMLAttributeList atl = getAttributeList();
+ bool found = false;
+ //make sure that an attribute with the same name doesn't already exist
+ for (UMLAttribute *at = atl.first(); at ; at = atl.next()) {
+ if (at->getName() == roleNameB) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ uniAssocListToBeImplemented.append(a);
+ }
+ }
+ }
+ return uniAssocListToBeImplemented;
+}
+
void UMLClassifier::saveToXMI(QDomDocument & qDoc, QDomElement & qElement) {
QString tag;
switch (m_BaseType) {
@@ -986,4 +1013,6 @@
return totalSuccess;
}
+
+
#include "classifier.moc"
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/classifier.h #636789:636790
@@ -436,6 +436,11 @@
*/
UMLClassifierListItem* makeChildObject(const QString& xmiTag);
+ /**
+ * Return the list of unidirectional association that should show up in the code
+ */
+ virtual UMLAssociationList getUniAssociationToBeImplemented();
+
signals:
/** Signals that a new UMLOperation has been added to the classifer.
*/
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/classifierinfo.cpp #636789:636790
@@ -85,6 +85,9 @@
plainAssociations = c->getSpecificAssocs(Uml::at_Association); // BAD! only way to get "general" associations.
plainAssociations.setAutoDelete(false);
+ uniAssociations = c->getUniAssociationToBeImplemented();
+ uniAssociations.setAutoDelete(false);
+
aggregations = c->getAggregations();
aggregations.setAutoDelete(false);
@@ -92,7 +95,7 @@
compositions.setAutoDelete(false);
// set some summary information about the classifier now
- hasAssociations = plainAssociations.count() > 0 || aggregations.count() > 0 || compositions.count() > 0;
+ hasAssociations = plainAssociations.count() > 0 || aggregations.count() > 0 || compositions.count() > 0 || uniAssociations.count() > 0;
hasAttributes = atpub.count() > 0 || atprot.count() > 0 || atpriv.count() > 0
|| static_atpub.count() > 0
|| static_atprot.count() > 0
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/classifierinfo.h #636789:636790
@@ -65,6 +65,7 @@
* Lists of types of associations this classifier has
*/
UMLAssociationList plainAssociations;
+ UMLAssociationList uniAssociations;
UMLAssociationList aggregations;
UMLAssociationList compositions;
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/cppwriter.cpp #636789:636790
@@ -183,6 +183,8 @@
// associations
writeAssociationMethods(m_classifierInfo->plainAssociations, permitScope,
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
+ writeAssociationMethods(m_classifierInfo->uniAssociations, permitScope,
+ true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
writeAssociationMethods(m_classifierInfo->aggregations, permitScope,
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
writeAssociationMethods(m_classifierInfo->compositions, permitScope,
@@ -200,6 +202,7 @@
// associations
writeAssociationDecls(m_classifierInfo->plainAssociations, permitScope, c->getID(), stream);
+ writeAssociationDecls(m_classifierInfo->uniAssociations, permitScope, c->getID(), stream);
writeAssociationDecls(m_classifierInfo->aggregations, permitScope, c->getID(), stream);
writeAssociationDecls(m_classifierInfo->compositions, permitScope, c->getID(), stream);
@@ -279,6 +282,8 @@
// public
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Public, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
+ writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Public, false,
+ !INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Public, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Public, false,
@@ -287,6 +292,8 @@
// protected
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Protected, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
+ writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Protected, false,
+ !INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Protected, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Protected, false,
@@ -296,6 +303,8 @@
// private
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Private, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
+ writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Private, false,
+ !INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Private, false,
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Private, false,
@@ -349,6 +358,7 @@
{
// write all includes we need to include other classes, that arent us.
printAssociationIncludeDecl (m_classifierInfo->plainAssociations, c->getID(), cpp);
+ printAssociationIncludeDecl (m_classifierInfo->uniAssociations, c->getID(), cpp);
printAssociationIncludeDecl (m_classifierInfo->aggregations, c->getID(), cpp);
printAssociationIncludeDecl (m_classifierInfo->compositions, c->getID(), cpp);
--- branches/KDE/3.5/kdesdk/umbrello/umbrello/codegenerators/javawriter.cpp #636789:636790
@@ -115,10 +115,12 @@
// another preparation, determine what we have
UMLAssociationList associations = c->getSpecificAssocs(Uml::at_Association); // BAD! only way to get "general" associations.
+ UMLAssociationList uniAssociations = c->getUniAssociationToBeImplemented();
+
UMLAssociationList aggregations = c->getAggregations();
UMLAssociationList compositions = c->getCompositions();
- bool hasAssociations = aggregations.count() > 0 || associations.count() > 0 || compositions.count() > 0;
+ bool hasAssociations = aggregations.count() > 0 || associations.count() > 0 || compositions.count() > 0 || uniAssociations.count() > 0;
bool hasAttributes = (atl.count() > 0);
bool hasAccessorMethods = hasAttributes || hasAssociations;
bool hasOperationMethods = (c->getOpList().count() > 0);
@@ -188,6 +190,7 @@
writeAttributeDecls(atpub, atprot, atpriv, java);
writeAssociationDecls(associations, c->getID(), java);
+ writeAssociationDecls(uniAssociations, c->getID(), java);
writeAssociationDecls(aggregations, c->getID(), java);
writeAssociationDecls(compositions, c->getID(), java);
@@ -232,6 +235,7 @@
// first: determine the name of the other class
writeAssociationMethods(associations, c, java);
+ writeAssociationMethods(uniAssociations, c, java);
writeAssociationMethods(aggregations, c, java);
writeAssociationMethods(compositions, c, java);
@@ -527,7 +531,7 @@
// multiplicity object that we don't have to figure out what it means via regex.
if(multi.isEmpty() || multi.contains(QRegExp("^[01]$")))
{
- QString fieldVarName = roleName.replace(0, 1, roleName.left(1).lower());
+ QString fieldVarName = "m_" + roleName.replace(0, 1, roleName.left(1).lower());
java<<startline<<scope<<" "<<fieldClassName<<" "<<fieldVarName<<";";
}
else
@@ -586,7 +590,7 @@
{
if(multi.isEmpty() || multi.contains(QRegExp("^[01]$")))
{
- QString fieldVarName = "m_" + roleName.lower();
+ QString fieldVarName = "m_" + roleName.replace(0, 1, roleName.left(1).lower());
writeSingleAttributeAccessorMethods(fieldClassName, fieldVarName, roleName,
description, visib, change, false, java);
}
More information about the umbrello-devel
mailing list