001package org.andromda.metafacades.uml14;
002
003import java.util.ArrayList;
004import java.util.Collection;
005import java.util.Iterator;
006import java.util.LinkedHashMap;
007import java.util.List;
008import java.util.Map;
009import org.andromda.metafacades.uml.FrontEndActivityGraph;
010import org.andromda.metafacades.uml.FrontEndForward;
011import org.andromda.metafacades.uml.FrontEndParameter;
012import org.andromda.metafacades.uml.FrontEndUseCase;
013import org.andromda.metafacades.uml.TransitionFacade;
014import org.andromda.metafacades.uml.UMLProfile;
015import org.andromda.metafacades.uml.UseCaseFacade;
016import org.apache.commons.lang.StringUtils;
017
018/**
019 * MetafacadeLogic implementation for org.andromda.metafacades.uml.FrontEndFinalState.
020 *
021 * @see org.andromda.metafacades.uml.FrontEndFinalState
022 * @author Bob Fields
023 */
024public class FrontEndFinalStateLogicImpl
025    extends FrontEndFinalStateLogic
026{
027    private static final long serialVersionUID = -3707764533520958069L;
028
029    /**
030     * @param metaObject
031     * @param context
032     */
033    public FrontEndFinalStateLogicImpl (Object metaObject, String context)
034    {
035        super (metaObject, context);
036    }
037
038    /**
039     * @see org.andromda.metafacades.uml.FrontEndFinalState#isContainedInFrontEndUseCase()
040     */
041    @Override
042    protected boolean handleIsContainedInFrontEndUseCase()
043    {
044        return this.getStateMachine() instanceof FrontEndActivityGraph;
045    }
046
047    /**
048     * @see org.andromda.metafacades.uml14.ModelElementFacadeLogicImpl#handleGetName()
049     */
050    @Override
051    public String handleGetName()
052    {
053        String name = super.handleGetName();
054        if (name == null)
055        {
056            FrontEndUseCase useCase = this.getTargetUseCase();
057            if (useCase != null)
058            {
059                name = useCase.getName();
060            }
061        }
062        return name;
063    }
064
065    /**
066     * @see org.andromda.metafacades.uml.FrontEndFinalState#getTargetUseCase()
067     */
068    @Override
069    protected Object handleGetTargetUseCase()
070    {
071        Object targetUseCase = null;
072
073        // first check if there is a hyperlink from this final state to a use-case
074        // this works at least in MagicDraw
075        final Object taggedValue = this.findTaggedValue(UMLProfile.TAGGEDVALUE_MODEL_HYPERLINK);
076        if (taggedValue != null)
077        {
078            if (taggedValue instanceof FrontEndActivityGraph)
079            {
080                targetUseCase = ((FrontEndActivityGraph)taggedValue).getUseCase();
081            }
082            else if (taggedValue instanceof FrontEndUseCase)
083            {
084                targetUseCase = taggedValue;
085            }
086        }
087
088        // maybe the name points to a use-case ?
089        if (targetUseCase == null)
090        {
091            final String name = super.handleGetName();
092            if (StringUtils.isNotBlank(name))
093            {
094                final UseCaseFacade useCase = getModel().findUseCaseByName(name);
095                if (useCase instanceof FrontEndUseCase)
096                {
097                    targetUseCase = useCase;
098                }
099            }
100        }
101        return targetUseCase;
102    }
103
104    /**
105     * @see org.andromda.metafacades.uml.FrontEndFinalState#getInterUseCaseParameters()
106     */
107    @Override
108    protected List<FrontEndParameter> handleGetInterUseCaseParameters()
109    {
110        // we don't want to list parameters with the same name to we use a hash map
111        final Map<String, FrontEndParameter> parameterMap = new LinkedHashMap<String, FrontEndParameter>();
112
113        final Collection<TransitionFacade> transitions = getIncomings();
114        for (final Iterator<TransitionFacade> transitionIterator = transitions.iterator(); transitionIterator.hasNext();)
115        {
116            final FrontEndForward forward = (FrontEndForward)transitionIterator.next();
117            final List<FrontEndParameter> forwardParameters = forward.getForwardParameters();
118            for (int i = 0; i < forwardParameters.size(); i++)
119            {
120                final FrontEndParameter parameter = forwardParameters.get(i);
121                parameterMap.put(parameter.getName(), parameter);
122            }
123        }
124
125        return new ArrayList<FrontEndParameter>(parameterMap.values());
126    }
127}