Author: tfmorris
Date: 2008-05-14 07:57:39-0700
New Revision: 14731

Modified:
   
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java
   
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java

Log:
Issue 5084: Enforce aggregation well-formedness 

http://argouml.tigris.org/issues/show_bug.cgi?id=5084

Modified: 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java?view=diff&rev=14731&p1=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java&p2=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java&r1=14730&r2=14731
==============================================================================
--- 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java
  (original)
+++ 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreFactoryMDRImpl.java
  2008-05-14 07:57:39-0700
@@ -598,6 +598,13 @@
         end.setAssociation((UmlAssociation) assoc);
         end.setParticipant((Classifier) type);
         end.setName(name);
+        // UML 1.4 WFR 2.5.3.1 #3 - no aggregation for N-ary associations
+        List<AssociationEnd> ends = ((UmlAssociation) assoc).getConnection();
+        if (ends.size() >= 3) {
+            for (AssociationEnd e : ends) {
+                e.setAggregation(AggregationKindEnum.AK_NONE);
+            }
+        }
         if (multi != null) {
             end.setMultiplicity((Multiplicity) multi);
         } else {

Modified: 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java?view=diff&rev=14731&p1=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java&p2=trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java&r1=14730&r2=14731
==============================================================================
--- 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
   (original)
+++ 
trunk/src/argouml-core-model-mdr/src/org/argouml/model/mdr/CoreHelperMDRImpl.java
   2008-05-14 07:57:39-0700
@@ -2120,7 +2120,15 @@
     public void addConnection(Object handle, Object connection) {
         if (handle instanceof UmlAssociation
                 && connection instanceof AssociationEnd) {
-            ((UmlAssociation) handle).getConnection().add((AssociationEnd) 
connection);
+            List<AssociationEnd> ends = 
+                ((UmlAssociation) handle).getConnection();
+            ends.add((AssociationEnd) connection);
+            // UML 1.4 WFR 2.5.3.1 #3
+            if (ends.size() >= 3) {
+                for (AssociationEnd end : ends) {
+                    end.setAggregation(AggregationKindEnum.AK_NONE);
+                }
+            }
             return;
         }
         if (handle instanceof Link && connection instanceof LinkEnd) {
@@ -2137,6 +2145,14 @@
                 && connection instanceof AssociationEnd) {
             ((UmlAssociation) handle).getConnection().add(position,
                     (AssociationEnd) connection);
+            List<AssociationEnd> ends = 
+                ((UmlAssociation) handle).getConnection();
+            // UML 1.4 WFR 2.5.3.1 #3 - no aggregation for N-ary associations
+            if (ends.size() >= 3) {
+                for (AssociationEnd end : ends) {
+                    end.setAggregation(AggregationKindEnum.AK_NONE);
+                }
+            }
             return;
         }
         /* Strange, but the Link.getConnection() 
@@ -2492,8 +2508,16 @@
     public void setAggregation(Object handle, Object aggregationKind) {
         if (handle instanceof AssociationEnd
                 && aggregationKind instanceof AggregationKind) {
-            ((AssociationEnd) handle).
-                    setAggregation((AggregationKind) aggregationKind);
+            AggregationKind ak = (AggregationKind) aggregationKind;
+            AssociationEnd ae = (AssociationEnd) handle;
+            // We silently ignore requests which conflict with 
+            // UML 1.4 WFR 2.5.3.1 #3 - no aggregation for n-ary associations
+            if (ak == AggregationKindEnum.AK_NONE
+                    || ae.getAssociation().getConnection().size() < 3) {
+                ae.setAggregation(ak);
+            } else {
+                ae.setAggregation(AggregationKindEnum.AK_NONE);
+            }
             return;
         }
         throw new IllegalArgumentException("handle: " + handle
@@ -2626,8 +2650,15 @@
 
     public void setConnections(Object handle, Collection elems) {
         if (handle instanceof UmlAssociation && elems instanceof List) {
-            CollectionHelper.update(
-                    ((UmlAssociation) handle).getConnection(), elems);
+            List<AssociationEnd> ends = 
+                ((UmlAssociation) handle).getConnection();
+            CollectionHelper.update(ends, elems);
+            // UML 1.4 WFR 2.5.3.1 #3 - no aggregation for N-ary associations
+            if (ends.size() >= 3) {
+                for (AssociationEnd end : ends) {
+                    end.setAggregation(AggregationKindEnum.AK_NONE);
+                }
+            }
             return;
         }
         if (handle instanceof Link && elems instanceof List) {

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to