001package org.andromda.cartridges.jsf2.metafacades;
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.cartridges.jsf2.JSFGlobals;
010import org.andromda.cartridges.jsf2.JSFProfile;
011import org.andromda.cartridges.jsf2.JSFUtils;
012import org.andromda.metafacades.uml.AttributeFacade;
013import org.andromda.metafacades.uml.FrontEndAction;
014import org.andromda.metafacades.uml.FrontEndForward;
015import org.andromda.metafacades.uml.FrontEndParameter;
016import org.andromda.metafacades.uml.ModelElementFacade;
017import org.andromda.metafacades.uml.UseCaseFacade;
018import org.andromda.utils.StringUtilsHelper;
019import org.apache.commons.lang.ObjectUtils;
020import org.apache.commons.lang.StringUtils;
021
022/**
023 * MetafacadeLogic implementation for org.andromda.cartridges.jsf2.metafacades.JSFView.
024 *
025 * @see org.andromda.cartridges.jsf2.metafacades.JSFView
026 */
027public class JSFViewLogicImpl
028    extends JSFViewLogic
029{
030    private static final long serialVersionUID = 34L;
031    /**
032     * @param metaObject
033     * @param context
034     */
035    public JSFViewLogicImpl(
036        Object metaObject,
037        String context)
038    {
039        super(metaObject, context);
040    }
041
042    /**
043     * @return getMessageKey() + '.' + JSFGlobals.DOCUMENTATION_MESSAGE_KEY_SUFFIX
044     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getDocumentationKey()
045     */
046    protected String handleGetDocumentationKey()
047    {
048        return getMessageKey() + '.' + JSFGlobals.DOCUMENTATION_MESSAGE_KEY_SUFFIX;
049    }
050
051    /**
052     * @return messageKey
053     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getMessageKey()
054     */
055    protected String handleGetMessageKey()
056    {
057        final StringBuilder messageKey = new StringBuilder();
058
059        if (!this.isNormalizeMessages())
060        {
061            final UseCaseFacade useCase = this.getUseCase();
062            if (useCase != null)
063            {
064                messageKey.append(StringUtilsHelper.toResourceMessageKey(useCase.getName()));
065                messageKey.append('.');
066            }
067        }
068
069        messageKey.append(StringUtilsHelper.toResourceMessageKey(getName()));
070        return messageKey.toString();
071    }
072
073    /**
074     * Indicates whether or not we should normalize messages.
075     *
076     * @return true/false
077     */
078    private boolean isNormalizeMessages()
079    {
080        final String normalizeMessages = (String)getConfiguredProperty(JSFGlobals.NORMALIZE_MESSAGES);
081        return Boolean.valueOf(normalizeMessages).booleanValue();
082    }
083
084    /**
085     * @see org.andromda.cartridges.jsf2.metafacades.JSFViewLogic#handleGetMessageValue()
086     */
087    protected String handleGetMessageValue()
088    {
089        return StringUtilsHelper.toPhrase(getName());
090    }
091
092    /**
093     * @return documentationValue
094     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getDocumentationValue()
095     */
096    protected String handleGetDocumentationValue()
097    {
098        final String value = StringUtilsHelper.toResourceMessage(getDocumentation(""));
099        return value == null ? "" : value;
100    }
101
102    /**
103     * @return getMessageKey() + '.' + JSFGlobals.TITLE_MESSAGE_KEY_SUFFIX
104     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getTitleKey()
105     */
106    protected String handleGetTitleKey()
107    {
108        return this.getMessageKey() + '.' + JSFGlobals.TITLE_MESSAGE_KEY_SUFFIX;
109    }
110
111    /**
112     * @return toPhrase(getName())
113     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getTitleValue()
114     */
115    protected String handleGetTitleValue()
116    {
117        return StringUtilsHelper.toPhrase(getName());
118    }
119
120    /**
121     * @return path
122     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getPath()
123     */
124    protected String handleGetPath()
125    {
126        final StringBuilder path = new StringBuilder();
127        final String packageName = this.getPackageName();
128        if (StringUtils.isNotBlank(packageName))
129        {
130            path.append(packageName + '.');
131        }
132        path.append(JSFUtils.toWebResourceName(StringUtils.trimToEmpty(this.getName())).replace(
133                '.',
134                '/'));
135        return '/' + path.toString().replace(
136            '.',
137            '/');
138    }
139
140    /**
141     * @return forwards
142     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getForwards()
143     */
144    protected List<ModelElementFacade> handleGetForwards()
145    {
146        final Map<String, ModelElementFacade> forwards = new LinkedHashMap<String, ModelElementFacade>();
147        for (final FrontEndAction action : this.getActions())
148        {
149            if (action != null && !action.isUseCaseStart())
150            {
151                for (final FrontEndForward forward : action.getActionForwards())
152                {
153                    if (forward instanceof JSFForward)
154                    {
155                        forwards.put(((JSFForward)forward).getName(), forward);
156                    }
157                    else if (forward instanceof JSFAction)
158                    {
159                        forwards.put(((JSFAction)forward).getName(), forward);
160                    }
161                }
162            }
163        }
164        return new ArrayList<ModelElementFacade>(forwards.values());
165    }
166
167    /**
168     * @return tables
169     * @see org.andromda.cartridges.jsf2.metafacades.JSFAction#isTableLink()
170     */
171    protected List<JSFParameter> handleGetTables()
172    {
173        final List<JSFParameter> tables = new ArrayList<JSFParameter>();
174        final List<FrontEndParameter> variables = this.getVariables();
175        for (FrontEndParameter parameter : variables)
176        {
177            if (parameter instanceof JSFParameter)
178            {
179                final JSFParameter variable = (JSFParameter)parameter;
180                if (variable.isTable())
181                {
182                    tables.add(variable);
183                }
184            }
185        }
186        return tables;
187    }
188
189    /**
190     * @return actionForwards
191     * @see org.andromda.cartridges.jsf2.metafacades.JSFViewLogic#getActionForwards()
192     */
193    protected List<JSFForward> handleGetActionForwards()
194    {
195        final List<JSFForward> actionForwards = new ArrayList<JSFForward>(this.getForwards());
196        for (final Iterator<JSFForward> iterator = actionForwards.iterator(); iterator.hasNext();)
197        {
198            if (!(iterator.next() instanceof JSFAction))
199            {
200                iterator.remove();
201            }
202        }
203        return actionForwards;
204    }
205
206    /**
207     * @return populatorName
208     * @see org.andromda.cartridges.jsf2.metafacades.JSFViewLogic#getFullyQualifiedPopulator()
209     */
210    protected String handleGetFullyQualifiedPopulator()
211    {
212        final StringBuilder name = new StringBuilder();
213        final String packageName = this.getPackageName();
214        if (StringUtils.isNotBlank(packageName))
215        {
216            name.append(packageName);
217            name.append('.');
218        }
219        name.append(this.getPopulator());
220        return name.toString();
221    }
222
223    /**
224     * @return populator
225     * @see org.andromda.cartridges.jsf2.metafacades.JSFViewLogic#getPopulator()
226     */
227    protected String handleGetPopulator()
228    {
229        return ObjectUtils.toString(this.getConfiguredProperty(JSFGlobals.VIEW_POPULATOR_PATTERN)).replaceAll(
230            "\\{0\\}",
231            StringUtilsHelper.upperCamelCaseName(this.getName()));
232    }
233
234    /**
235     * @see org.andromda.cartridges.jsf2.metafacades.JSFViewLogic#handleGetFormActions()
236     */
237    protected List<FrontEndAction> handleGetFormActions()
238    {
239        final List<FrontEndAction> actions = new ArrayList<FrontEndAction>(this.getActions());
240        for (final Iterator<FrontEndAction> iterator = actions.iterator(); iterator.hasNext();)
241        {
242            final FrontEndAction action = iterator.next();
243            if (action.getFormFields().isEmpty())
244            {
245                iterator.remove();
246            }
247        }
248        return actions;
249    }
250
251    /**
252     * @return formKey
253     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getFormKey()
254     */
255    protected String handleGetFormKey()
256    {
257        final Object formKeyValue = this.findTaggedValue(JSFProfile.TAGGEDVALUE_ACTION_FORM_KEY);
258        return formKeyValue == null ? ObjectUtils.toString(this.getConfiguredProperty(JSFGlobals.ACTION_FORM_KEY))
259                                    : String.valueOf(formKeyValue);
260    }
261
262    /**
263     * @return getFullyQualifiedPopulator().replace('.', '/')
264     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getPopulatorPath()
265     */
266    protected String handleGetPopulatorPath()
267    {
268        return this.getFullyQualifiedPopulator().replace(
269            '.',
270            '/');
271    }
272
273    /**
274     * @return !getFormActions().isEmpty() || !getVariables().isEmpty()
275     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isPopulatorRequired()
276     */
277    protected boolean handleIsPopulatorRequired()
278    {
279        return !this.getFormActions().isEmpty() || !this.getVariables().isEmpty();
280    }
281
282    /**
283     * @return validationRequired
284     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isPopulatorRequired()
285     */
286    protected boolean handleIsValidationRequired()
287    {
288        boolean required = false;
289        for (final FrontEndAction action : this.getActions())
290        {
291            if (((JSFAction)action).isValidationRequired())
292            {
293                required = true;
294                break;
295            }
296        }
297        return required;
298    }
299
300    /**
301     * @return isPopup
302     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isPopup()
303     */
304    protected boolean handleIsPopup()
305    {
306        return ObjectUtils.toString(this.findTaggedValue(JSFProfile.TAGGEDVALUE_VIEW_TYPE)).equalsIgnoreCase(
307            JSFGlobals.ACTION_TYPE_POPUP);
308    }
309
310    /**
311     * @return nonTableVariablesPresent
312     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isNonTableVariablesPresent()
313     */
314    protected boolean handleIsNonTableVariablesPresent()
315    {
316        boolean present = false;
317        for (final FrontEndParameter variable : this.getVariables())
318        {
319            if (!variable.isTable())
320            {
321                present = true;
322                break;
323            }
324        }
325        return present;
326    }
327
328    /**
329     * @return hasNameOfUseCase
330     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isHasNameOfUseCase()
331     */
332    protected boolean handleIsHasNameOfUseCase()
333    {
334        boolean sameName = false;
335        final ModelElementFacade useCase = this.getUseCase();
336        final String useCaseName = useCase != null ? useCase.getName() : null;
337        if (useCaseName != null && useCaseName.equalsIgnoreCase(this.getName()))
338        {
339            sameName = true;
340        }
341        return sameName;
342    }
343
344    /**
345     * @return backingValueVariables
346     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getBackingValueVariables()
347     */
348    protected List<JSFParameter> handleGetBackingValueVariables()
349    {
350        final Map<String, JSFParameter> variables = new LinkedHashMap<String, JSFParameter>();
351        for (final FrontEndParameter frontEndParameter : this.getAllActionParameters())
352        {
353            if (frontEndParameter instanceof JSFParameter)
354            {
355                final JSFParameter parameter = (JSFParameter)frontEndParameter;
356                final String parameterName = parameter.getName();
357                final Collection<AttributeFacade> attributes = parameter.getAttributes();
358                if (parameter.isBackingValueRequired() || parameter.isSelectable())
359                {
360                    if (parameter.isBackingValueRequired() || parameter.isSelectable())
361                    {
362                        variables.put(parameterName, parameter);
363                    }
364                }
365                else
366                {
367                    boolean hasBackingValue = false;
368                    for (final AttributeFacade attribute : attributes)
369                    {
370                        final JSFAttribute jsfAttribute = (JSFAttribute)attribute;
371                        if (jsfAttribute.isSelectable(parameter) || jsfAttribute.isBackingValueRequired(parameter))
372                        {
373                            hasBackingValue = true;
374                            break;
375                        }
376                    }
377                    if (hasBackingValue)
378                    {
379                        variables.put(parameterName, parameter);
380                    }
381                }
382            }
383        }
384        return new ArrayList<JSFParameter>(variables.values());
385    }
386
387    /**
388     * @return toWebResourceName(this.getUseCase().getName() + "-" + this.getName())
389     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getFromOutcome()
390     */
391    protected String handleGetFromOutcome()
392    {
393        return JSFUtils.toWebResourceName(this.getUseCase().getName() + "-" + this.getName());
394    }
395
396    /**
397     * @return needsFileUpload
398     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#isNeedsFileUpload()
399     */
400    protected boolean handleIsNeedsFileUpload()
401    {
402        if(this.getAllActionParameters().size() == 0)
403        {
404            return false;
405        }
406
407        for (final FrontEndParameter feParameter : this.getAllActionParameters())
408        {
409            if (feParameter instanceof JSFParameter)
410            {
411                final JSFParameter parameter = (JSFParameter)feParameter;
412                if(parameter.isInputFile())
413                {
414                    return true;
415                }
416                if(parameter.isComplex())
417                {
418                    for(final Iterator attributes = parameter.getAttributes().iterator(); attributes.hasNext();)
419                    {
420                        if(((JSFAttribute)attributes.next()).isInputFile())
421                        {
422                            return true;
423                        }
424                    }
425                }
426            }
427        }
428        return false;
429    }
430
431    /**
432     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getFullyQualifiedPageObjectClassPath()
433     */
434    @Override
435    protected String handleGetFullyQualifiedPageObjectClassPath() 
436    {
437        return this.getFullyQualifiedPageObjectClassName().replace(
438                        '.',
439                        '/');
440    }
441
442    /**
443     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getFullyQualifiedPageObjectClassName()
444     */
445    @Override
446    protected String handleGetFullyQualifiedPageObjectClassName() 
447    {
448        final StringBuilder fullyQualifiedName = new StringBuilder();
449        final String packageName = this.getPackageName();
450        if (StringUtils.isNotBlank(packageName))
451        {
452            fullyQualifiedName.append(packageName + '.');
453        }
454        return fullyQualifiedName.append(this.getPageObjectClassName()).toString();
455    }
456
457    /**
458     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getPageObjectClassName()
459     */
460    @Override
461    protected String handleGetPageObjectClassName() 
462    {
463        return StringUtilsHelper.upperCamelCaseName(this.getName());
464    }
465
466    /**
467     * @see org.andromda.cartridges.jsf2.metafacades.JSFView#getPageObjectBeanName()
468     */
469    @Override
470    protected String handleGetPageObjectBeanName() 
471    {
472        return StringUtilsHelper.lowerCamelCaseName(this.getName());
473    }
474}