001package org.andromda.cartridges.jsf.metafacades;
002
003import java.util.Collection;
004import java.util.Collections;
005import java.util.Iterator;
006import java.util.LinkedHashMap;
007import java.util.Map;
008import org.andromda.cartridges.jsf.JSFGlobals;
009import org.andromda.cartridges.jsf.JSFProfile;
010import org.andromda.cartridges.jsf.JSFUtils;
011import org.andromda.metafacades.uml.StateVertexFacade;
012import org.andromda.utils.StringUtilsHelper;
013
014/**
015 * MetafacadeLogic implementation for org.andromda.cartridges.jsf.metafacades.JSFForward.
016 *
017 * @see org.andromda.cartridges.jsf.metafacades.JSFForward
018 */
019public class JSFForwardLogicImpl
020    extends JSFForwardLogic
021{
022    private static final long serialVersionUID = 34L;
023    /**
024     * @param metaObject
025     * @param context
026     */
027    public JSFForwardLogicImpl(Object metaObject, String context)
028    {
029        super(metaObject, context);
030    }
031
032    /**
033     * @see org.andromda.metafacades.uml.ModelElementFacade#getName()
034     */
035    public String getName()
036    {
037        StringBuilder name = new StringBuilder(super.getName());
038        final Object target = this.getTarget();
039        if (target instanceof JSFFinalState)
040        {
041            name.append(JSFGlobals.USECASE_FORWARD_NAME_SUFFIX);
042        }
043        else
044        {
045            name.insert(0, this.getUseCase().getName() + "-");
046        }
047        return JSFUtils.toWebResourceName(name.toString());
048    }
049
050    /**
051     * @return forwardPath
052     * @see org.andromda.cartridges.jsf.metafacades.JSFForward#getPath()
053     */
054    protected String handleGetPath()
055    {
056        String forwardPath = null;
057        final StateVertexFacade target = getTarget();
058        if (this.isEnteringView())
059        {
060            forwardPath = ((JSFView)target).getPath();
061        }
062        else if (this.isEnteringFinalState())
063        {
064            forwardPath = ((JSFFinalState)target).getPath();
065        }
066
067        return forwardPath;
068    }
069
070    /**
071     * @see org.andromda.cartridges.jsf.metafacades.JSFForwardLogic#handleIsSuccessMessagesPresent()
072     */
073    protected boolean handleIsSuccessMessagesPresent()
074    {
075        return !this.getSuccessMessages().isEmpty();
076    }
077
078    /**
079     * @see org.andromda.cartridges.jsf.metafacades.JSFForwardLogic#handleIsWarningMessagesPresent()
080     */
081    protected boolean handleIsWarningMessagesPresent()
082    {
083        return !this.getWarningMessages().isEmpty();
084    }
085
086    /**
087     * Collects specific messages in a map.
088     *
089     * @param taggedValue the tagged value from which to read the message
090     * @return maps message keys to message values, but only those that match the arguments
091     *         will have been recorded
092     */
093    @SuppressWarnings("unchecked")
094    private Map<String, String> getMessages(String taggedValue)
095    {
096        Map<String, String> messages;
097
098        final Collection taggedValues = this.findTaggedValues(taggedValue);
099        if (taggedValues.isEmpty())
100        {
101            messages = Collections.EMPTY_MAP;
102        }
103        else
104        {
105            messages = new LinkedHashMap<String, String>(); // we want to keep the order
106
107            for (final Iterator iterator = taggedValues.iterator(); iterator.hasNext();)
108            {
109                final String value = (String)iterator.next();
110                messages.put(StringUtilsHelper.toResourceMessageKey(value), value);
111            }
112        }
113
114        return messages;
115    }
116
117    /**
118     * @see org.andromda.cartridges.jsf.metafacades.JSFForwardLogic#handleGetSuccessMessages()
119     */
120    protected Map handleGetSuccessMessages()
121    {
122        return this.getMessages(JSFProfile.TAGGEDVALUE_ACTION_SUCCESS_MESSAGE);
123    }
124
125    /**
126     * @see org.andromda.cartridges.jsf.metafacades.JSFForwardLogic#handleGetWarningMessages()
127     */
128    protected Map handleGetWarningMessages()
129    {
130        return this.getMessages(JSFProfile.TAGGEDVALUE_ACTION_WARNING_MESSAGE);
131    }
132
133    /**
134     * @return getTarget() instanceof JSFFinalState
135     * @see org.andromda.cartridges.jsf.metafacades.JSFForward#isFinalStateTarget()
136     */
137    protected boolean handleIsFinalStateTarget()
138    {
139        return this.getTarget() instanceof JSFFinalState;
140    }
141
142    /**
143     * @return getName()
144     * @see org.andromda.cartridges.jsf.metafacades.JSFForward#getFromOutcome()
145     */
146    protected String handleGetFromOutcome()
147    {
148        return this.getName();
149    }
150}