001package org.andromda.metafacades.uml14;
002
003import java.util.List;
004import org.andromda.metafacades.uml.AssociationEndFacade;
005import org.andromda.metafacades.uml.MetafacadeUtils;
006import org.andromda.metafacades.uml.UMLMetafacadeProperties;
007import org.apache.commons.lang.StringUtils;
008import org.omg.uml.foundation.core.AssociationClass;
009import org.omg.uml.foundation.core.AssociationEnd;
010import org.omg.uml.foundation.core.UmlAssociation;
011
012/**
013 * Metaclass facade implementation.
014 * @author Bob Fields
015 */
016public class AssociationFacadeLogicImpl
017    extends AssociationFacadeLogic
018{
019    private static final long serialVersionUID = 34L;
020    /**
021     * @param metaObject
022     * @param context
023     */
024    public AssociationFacadeLogicImpl(
025        UmlAssociation metaObject,
026        String context)
027    {
028        super(metaObject, context);
029    }
030
031    /**
032     * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEnds()
033     */
034    @Override
035    public List<AssociationEnd> handleGetAssociationEnds()
036    {
037        return metaObject.getConnection();
038    }
039
040    /**
041     * @see org.andromda.metafacades.uml14.ModelElementFacadeLogic#handleGetName()
042     */
043    public String handleGetName()
044    {
045        String name = super.handleGetName();
046
047        // if the name isn't defined, use the relation name
048        if (StringUtils.isEmpty(name))
049        {
050            name = this.handleGetRelationName();
051        }
052        return name;
053    }
054
055    /**
056     * @see org.andromda.metafacades.uml.AssociationFacade#getRelationName()
057     */
058    @Override
059    public String handleGetRelationName()
060    {
061        //Avoid StackOverflow with getName calling shieldedElements.
062        /* final String firstEnd = this.handleGetAssociationEndA().getName();
063        String secondEnd = "";
064        if (!(metaObject.getConnection().size()>1))
065        {
066            secondEnd = this.handleGetAssociationEndB().getName();
067        }
068        return MetafacadeUtils.toRelationName(
069            (firstEnd==null ? "" : firstEnd),
070            (secondEnd==null ? "" : secondEnd),
071            String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR))); */
072        /*final AssociationEndFacade firstEnd = (AssociationEndFacade)this.shieldedElement(this.handleGetAssociationEndA());
073        final AssociationEndFacade secondEnd = (AssociationEndFacade)this.shieldedElement(this.handleGetAssociationEndB());
074        return MetafacadeUtils.toRelationName(
075            firstEnd.getName(),
076            secondEnd.getName(),
077            String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR))); */
078        final AssociationEndFacade firstEnd = this.getAssociationEndA();
079        final AssociationEndFacade secondEnd = this.getAssociationEndB();
080        //System.out.println("firstEnd=" + firstEnd + " secondEnd=" + secondEnd);
081        final String nameA = firstEnd==null ? "" :firstEnd.getName();
082        final String nameB = secondEnd==null ? "" : secondEnd.getName();
083        //System.out.println("nameA=" + nameA + " nameB=" + nameB);
084        return MetafacadeUtils.toRelationName(
085                nameA,
086                nameB,
087            String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR)));
088    }
089
090    /**
091     * @see org.andromda.metafacades.uml.AssociationFacade#isMany2Many()
092     */
093    @Override
094    protected boolean handleIsMany2Many()
095    {
096        return (this.getAssociationEnds().iterator().next()).isMany2Many();
097    }
098
099    /**
100     * @see org.andromda.metafacades.uml.AssociationFacade#isAssociationClass()
101     */
102    @Override
103    protected boolean handleIsAssociationClass()
104    {
105        return AssociationClass.class.isAssignableFrom(this.metaObject.getClass());
106    }
107
108    /**
109     * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEndA()
110     */
111    @Override
112    protected AssociationEnd handleGetAssociationEndA()
113    {
114        List<AssociationEnd> ends = this.handleGetAssociationEnds();
115        if (!ends.isEmpty())
116        {
117            return ends.get(0);
118        }
119        else
120        {
121            return null;
122        }
123    }
124
125    /**
126     * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEndB()
127     */
128    @Override
129    protected AssociationEnd handleGetAssociationEndB()
130    {
131        List<AssociationEnd> ends = this.handleGetAssociationEnds();
132        if (ends.size()>1)
133        {
134            return ends.get(1);
135        }
136        else
137        {
138            return null;
139        }
140    }
141
142    /**
143     * @see org.andromda.metafacades.uml.AssociationFacade#isAbstract()
144     */
145    @Override
146    protected boolean handleIsAbstract()
147    {
148        return this.metaObject.isAbstract();
149    }
150
151    /**
152     *
153     * @return true always
154     * @see org.andromda.metafacades.uml.AssociationFacade#isBinary()
155     */
156    @Override
157    protected boolean handleIsBinary()
158    {
159        return true;
160    }
161
162    /**
163     *
164     * @return false always
165     * @see org.andromda.metafacades.uml.AssociationFacade#isDerived()
166     */
167    @Override
168    protected boolean handleIsDerived()
169    {
170        return false;
171    }
172
173    /**
174     * @see org.andromda.metafacades.uml.AssociationFacade#isLeaf
175     */
176    @Override
177    protected boolean handleIsLeaf()
178    {
179        return this.metaObject.isLeaf();
180    }
181}