// THIS SOFTWARE IS PROVIDED BY SOFTARIS PTY.LTD. AND OTHER METABOSS
// CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
// BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTARIS PTY.LTD.
// OR OTHER METABOSS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF SOFTARIS PTY.LTD. OR OTHER METABOSS CONTRIBUTORS ARE ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Copyright 2000-2005 Softaris Pty.Ltd. All Rights Reserved.
package com.metaboss.sdlctools.models.impl.metabossmodel.enterprisemodel.systemimplementationmodel;
import java.util.Collection;
import java.util.List;
import javax.jmi.reflect.ConstraintViolationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.netbeans.mdr.storagemodel.StorableObject;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AggregationType;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AggregationTypeEnum;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.Association;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AssociationRole;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AssociationRoleCardinality;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.AssociationRoleCardinalityEnum;
import com.metaboss.sdlctools.models.metabossmodel.enterprisemodel.systemimplementationmodel.Entity;
public abstract class AssociationRoleImpl extends PrimaryKeyElementImpl implements AssociationRole
{
// Commons Logging instance.
private static final Log sLogger = LogFactory.getLog(AssociationRoleImpl.class);
// Required constructor
protected AssociationRoleImpl(StorableObject storable)
{
super(storable);
}
// Verify certain constraints
protected Collection _verify(Collection pViolations)
{
// First call superclass
Collection lViolations = super._verify(pViolations);
// Constraint #1 - the association role with aggregation type of composition
// can only have 'one and only one' multiplicity
{
AggregationType lAssociationRoleAggregationType = getAggregationType();
if (lAssociationRoleAggregationType != null && lAssociationRoleAggregationType.equals(AggregationTypeEnum.COMPOSITION))
{
if (!getCardinality().equals(AssociationRoleCardinalityEnum.ONE))
lViolations.add(new ConstraintViolationException(this,refMetaObject(),"AssociationRole with aggregation type of 'Composition' has unsupported cardinality. Only 'exactly one' cardinality is supported."));
}
}
return lViolations;
}
// Returns true if this association has plural cardinality
public boolean isPlural()
{
AssociationRoleCardinality lCardinality = getCardinality();
return lCardinality != null && (lCardinality.equals(AssociationRoleCardinalityEnum.ZERO_TO_MANY) || lCardinality.equals(AssociationRoleCardinalityEnum.ONE_TO_MANY));
}
// Returns true if this association has singular cardinality
public boolean isSingular()
{
AssociationRoleCardinality lCardinality = getCardinality();
return lCardinality != null && (lCardinality.equals(AssociationRoleCardinalityEnum.ZERO_OR_ONE) || lCardinality.equals(AssociationRoleCardinalityEnum.ONE));
}
// Returns true if this association has optional cardinality
public boolean isOptional()
{
AssociationRoleCardinality lCardinality = getCardinality();
return lCardinality != null && (lCardinality.equals(AssociationRoleCardinalityEnum.ZERO_TO_MANY) || lCardinality.equals(AssociationRoleCardinalityEnum.ZERO_OR_ONE));
}
// Returns true if this association has mandatory cardinality
public boolean isMandatory()
{
AssociationRoleCardinality lCardinality = getCardinality();
return lCardinality != null && (lCardinality.equals(AssociationRoleCardinalityEnum.ONE_TO_MANY) || lCardinality.equals(AssociationRoleCardinalityEnum.ONE));
}
/** Returns the role on the other side of the association */
public AssociationRole getOppositeRole()
{
Association lAssociation = ((AssociationRole)this).getAssociation();
if (lAssociation == null)
return null; // Model has a problem unable to get the opposite role
List lAssociationRoles = lAssociation.getRoles();
if (lAssociationRoles.size() != 2)
return null; // Model has a problem unable to get the opposite role
int lOppositeRoleIndex = lAssociationRoles.indexOf(this) == 0 ? 1 : 0;
return (AssociationRole)lAssociationRoles.get(lOppositeRoleIndex);
}
/** Returns the entity, which references this role. In other words - an entity playing the opposite role in the association */
public Entity getReferencingEntity()
{
AssociationRole lOppositeRole = getOppositeRole();
return lOppositeRole != null ? lOppositeRole.getEntity() : null;
}
}
|