01: // THIS SOFTWARE IS PROVIDED BY SOFTARIS PTY.LTD. AND OTHER METABOSS
02: // CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
03: // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
04: // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTARIS PTY.LTD.
05: // OR OTHER METABOSS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
06: // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
07: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
08: // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
09: // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
10: // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
11: // EVEN IF SOFTARIS PTY.LTD. OR OTHER METABOSS CONTRIBUTORS ARE ADVISED OF THE
12: // POSSIBILITY OF SUCH DAMAGE.
13: //
14: // Copyright 2000-2005 © Softaris Pty.Ltd. All Rights Reserved.
15: package com.metaboss.sdlctools.models.impl.metabossmodel.enterprisemodel.systemimplementationmodel;
16:
17: import java.util.Collection;
18: import java.util.HashMap;
19: import java.util.Iterator;
20: import java.util.Map;
21:
22: import javax.jmi.reflect.ConstraintViolationException;
23:
24: import org.netbeans.mdr.handlers.ClassProxyHandler;
25: import org.netbeans.mdr.storagemodel.StorableClass;
26:
27: import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AggregationType;
28: import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AggregationTypeEnum;
29: import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AssociationRole;
30: import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AssociationRoleClass;
31: import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.Entity;
32:
33: public abstract class AssociationRoleClassImpl extends
34: ClassProxyHandler implements AssociationRoleClass {
35: // Required constructor
36: protected AssociationRoleClassImpl(StorableClass storable) {
37: super (storable);
38: }
39:
40: // Verify certain constraints
41: protected Collection _verify(Collection pViolations) {
42: // First call superclass
43: Collection lViolations = super ._verify(pViolations);
44:
45: // Constraint #1 - there could only be at most one association role with aggregation type of composition
46: // pointing to the same entity
47: {
48: // Iterate through all association roles and collect roles which have
49: // aggregation type of composition, store them in the map keyed on referencing entity and
50: // create exception for each time when there is a duplicate
51: Map lEntityOwnersMap = new HashMap();
52: Collection lAssociationRoles = refAllOfType();
53: for (Iterator lAssociationRolesIterator = lAssociationRoles
54: .iterator(); lAssociationRolesIterator.hasNext();) {
55: AssociationRole lAssociationRole = (AssociationRole) lAssociationRolesIterator
56: .next();
57: AggregationType lAssociationRoleAggregationType = lAssociationRole
58: .getAggregationType();
59: if (lAssociationRoleAggregationType != null
60: && lAssociationRoleAggregationType
61: .equals(AggregationTypeEnum.COMPOSITION)) {
62: Entity lOwnedEntity = lAssociationRole
63: .getOppositeRole().getEntity();
64: if (lEntityOwnersMap.containsKey(lOwnedEntity)) {
65: // Came across the case where one entity has multiple owners
66: // this is not allowed. Generate ConstraintViolationException if there
67: // was none generated before that
68: Boolean lHaveProducedExceptionBefore = (Boolean) lEntityOwnersMap
69: .get(lOwnedEntity);
70: if (!lHaveProducedExceptionBefore
71: .booleanValue()) {
72: lViolations
73: .add(new ConstraintViolationException(
74: lOwnedEntity, lOwnedEntity
75: .refMetaObject(),
76: "Entity has more than one owner. Entity may have at most one owner."));
77: lEntityOwnersMap.put(lOwnedEntity,
78: new Boolean(true));
79: }
80: } else {
81: // Mark that we have come across this entity once before
82: lEntityOwnersMap.put(lOwnedEntity, new Boolean(
83: false));
84: }
85: }
86: }
87: }
88: return lViolations;
89: }
90: }
|