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]
