001: package org.andromda.metafacades.emf.uml2;
002:
003: import java.util.Collection;
004: import java.util.Iterator;
005:
006: import org.andromda.core.metafacade.MetafacadeImplsException;
007: import org.andromda.metafacades.uml.AssociationEndFacade;
008: import org.andromda.metafacades.uml.ClassifierFacade;
009: import org.andromda.metafacades.uml.Entity;
010: import org.andromda.metafacades.uml.EntityMetafacadeUtils;
011: import org.andromda.metafacades.uml.UMLMetafacadeProperties;
012: import org.andromda.metafacades.uml.UMLProfile;
013: import org.apache.commons.lang.ObjectUtils;
014: import org.apache.commons.lang.StringUtils;
015: import org.eclipse.uml2.Association;
016: import org.eclipse.uml2.Property;
017: import org.eclipse.uml2.Type;
018:
019: /**
020: * MetafacadeLogic implementation for
021: * org.andromda.metafacades.uml.EntityAssociation.
022: *
023: * @see org.andromda.metafacades.uml.EntityAssociation
024: */
025: public class EntityAssociationLogicImpl extends EntityAssociationLogic {
026: public EntityAssociationLogicImpl(final Object metaObject,
027: final String context) {
028: super (metaObject, context);
029: }
030:
031: /**
032: * @see org.andromda.metafacades.uml.EntityAssociation#getTableName()
033: */
034: protected java.lang.String handleGetTableName() {
035: String tableName = null;
036: final Collection ends = this .getAssociationEnds();
037: if (ends != null && !ends.isEmpty()) {
038: final AssociationEndFacade end = (AssociationEndFacade) ends
039: .iterator().next();
040: final ClassifierFacade type = end.getType();
041: if (type != null && end.isMany2Many()) {
042: // - prevent ClassCastException if the association isn't an
043: // Entity
044: if (type instanceof Entity) {
045: final String prefixProperty = UMLMetafacadeProperties.TABLE_NAME_PREFIX;
046: final String tableNamePrefix = this
047: .isConfiguredProperty(prefixProperty) ? ObjectUtils
048: .toString(this
049: .getConfiguredProperty(prefixProperty))
050: : null;
051: tableName = EntityMetafacadeUtils
052: .getSqlNameFromTaggedValue(
053: tableNamePrefix,
054: this ,
055: UMLProfile.TAGGEDVALUE_PERSISTENCE_TABLE,
056: ((Entity) type)
057: .getMaxSqlNameLength(),
058: this
059: .getConfiguredProperty(UMLMetafacadeProperties.SQL_NAME_SEPARATOR));
060: }
061: }
062: }
063: return tableName;
064: }
065:
066: /**
067: * @see org.andromda.metafacades.uml.EntityAssociation#getSchema()
068: */
069: protected String handleGetSchema() {
070: String schemaName = ObjectUtils
071: .toString(this
072: .findTaggedValue(UMLProfile.TAGGEDVALUE_PERSISTENCE_SCHEMA));
073: if (StringUtils.isBlank(schemaName)) {
074: schemaName = ObjectUtils
075: .toString(this
076: .getConfiguredProperty(UMLMetafacadeProperties.SCHEMA_NAME));
077: }
078: return schemaName;
079: }
080:
081: /**
082: * It is an entity association if both ends are entities (have the entity
083: * stereotype
084: */
085: protected boolean handleIsEntityAssociation() {
086: // TODO: There may be a better implementation
087: // But it has to be tested (it may cause a stack overflow.
088: // return (getAssociationEndA().getType() instanceof Entity) &&
089: // (getAssociationEndB().getType() instanceof Entity);
090: if (this .metaObject == null
091: || !(this .metaObject instanceof Association)) {
092: throw new MetafacadeImplsException(
093: "Incorrect metafacade mapping for "
094: + this .toString());
095: }
096: boolean isEntityAssociation = true;
097: for (Iterator ends = ((Association) this .metaObject)
098: .getMemberEnds().iterator(); ends.hasNext();) {
099: final Property prop = (Property) ends.next();
100: final Type propertyType = prop.getType();
101: if (propertyType == null
102: || !UmlUtilities.containsStereotype(propertyType,
103: UMLProfile.STEREOTYPE_ENTITY)) {
104: isEntityAssociation = false;
105: }
106: }
107: return isEntityAssociation;
108: }
109: }
|