001// license-header java merge-point
002//
003// Attention: generated code (by MetafacadeLogic.vsl) - do not modify!
004//
005package org.andromda.cartridges.bpm4struts.metafacades;
006
007import java.util.Collection;
008import java.util.List;
009import java.util.Map;
010import org.andromda.core.common.Introspector;
011import org.andromda.core.metafacade.MetafacadeBase;
012import org.andromda.core.metafacade.MetafacadeFactory;
013import org.andromda.core.metafacade.ModelValidationMessage;
014import org.andromda.metafacades.uml.ActionFacade;
015import org.andromda.metafacades.uml.ConstraintFacade;
016import org.andromda.metafacades.uml.DependencyFacade;
017import org.andromda.metafacades.uml.EventFacade;
018import org.andromda.metafacades.uml.FrontEndAction;
019import org.andromda.metafacades.uml.FrontEndActivityGraph;
020import org.andromda.metafacades.uml.FrontEndControllerOperation;
021import org.andromda.metafacades.uml.FrontEndEvent;
022import org.andromda.metafacades.uml.FrontEndExceptionHandler;
023import org.andromda.metafacades.uml.FrontEndParameter;
024import org.andromda.metafacades.uml.FrontEndUseCase;
025import org.andromda.metafacades.uml.GuardFacade;
026import org.andromda.metafacades.uml.ModelElementFacade;
027import org.andromda.metafacades.uml.ModelFacade;
028import org.andromda.metafacades.uml.PackageFacade;
029import org.andromda.metafacades.uml.StateMachineFacade;
030import org.andromda.metafacades.uml.StateVertexFacade;
031import org.andromda.metafacades.uml.StereotypeFacade;
032import org.andromda.metafacades.uml.TaggedValueFacade;
033import org.andromda.metafacades.uml.TemplateParameterFacade;
034import org.andromda.metafacades.uml.TypeMappings;
035import org.andromda.translation.ocl.validation.OCLExpressions;
036import org.andromda.translation.ocl.validation.OCLIntrospector;
037import org.andromda.translation.ocl.validation.OCLResultEnsurer;
038import org.apache.log4j.Logger;
039
040/**
041 * A Struts exception handler intercepts action exceptions and delegates them into a page that will
042 * handle it, by for example simply displaying it.
043 * MetafacadeLogic for StrutsExceptionHandler
044 *
045 * @see StrutsExceptionHandler
046 */
047public abstract class StrutsExceptionHandlerLogic
048    extends MetafacadeBase
049    implements StrutsExceptionHandler
050{
051    /**
052     * The underlying UML object
053     * @see Object
054     */
055    protected Object metaObject;
056
057    /** Create Metafacade implementation instance using the MetafacadeFactory from the context
058     * @param metaObjectIn
059     * @param context
060     */
061    protected StrutsExceptionHandlerLogic(Object metaObjectIn, String context)
062    {
063        super(metaObjectIn, getContext(context));
064        this.superFrontEndExceptionHandler =
065           (FrontEndExceptionHandler)
066            MetafacadeFactory.getInstance().createFacadeImpl(
067                    "org.andromda.metafacades.uml.FrontEndExceptionHandler",
068                    metaObjectIn,
069                    getContext(context));
070        this.superStrutsForward =
071           (StrutsForward)
072            MetafacadeFactory.getInstance().createFacadeImpl(
073                    "org.andromda.cartridges.bpm4struts.metafacades.StrutsForward",
074                    metaObjectIn,
075                    getContext(context));
076        this.metaObject = metaObjectIn;
077    }
078
079    /**
080     * The logger instance.
081     */
082    private static final Logger logger = Logger.getLogger(StrutsExceptionHandlerLogic.class);
083
084    /**
085     * Gets the context for this metafacade logic instance.
086     * @param context String. Set to StrutsExceptionHandler if null
087     * @return context String
088     */
089    private static String getContext(String context)
090    {
091        if (context == null)
092        {
093            context = "org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler";
094        }
095        return context;
096    }
097
098    private FrontEndExceptionHandler superFrontEndExceptionHandler;
099    private boolean superFrontEndExceptionHandlerInitialized = false;
100
101    /**
102     * Gets the FrontEndExceptionHandler parent instance.
103     * @return this.superFrontEndExceptionHandler FrontEndExceptionHandler
104     */
105    protected FrontEndExceptionHandler getSuperFrontEndExceptionHandler()
106    {
107        if (!this.superFrontEndExceptionHandlerInitialized)
108        {
109            ((MetafacadeBase)this.superFrontEndExceptionHandler).setMetafacadeContext(this.getMetafacadeContext());
110            this.superFrontEndExceptionHandlerInitialized = true;
111        }
112        return this.superFrontEndExceptionHandler;
113    }
114
115    private StrutsForward superStrutsForward;
116    private boolean superStrutsForwardInitialized = false;
117
118    /**
119     * Gets the StrutsForward parent instance.
120     * @return this.superStrutsForward StrutsForward
121     */
122    protected StrutsForward getSuperStrutsForward()
123    {
124        if (!this.superStrutsForwardInitialized)
125        {
126            ((MetafacadeBase)this.superStrutsForward).setMetafacadeContext(this.getMetafacadeContext());
127            this.superStrutsForwardInitialized = true;
128        }
129        return this.superStrutsForward;
130    }
131
132    /** Reset context only for non-root metafacades
133     * @param context
134     * @see MetafacadeBase#resetMetafacadeContext(String context)
135     */
136    @Override
137    public void resetMetafacadeContext(String context)
138    {
139        if (!this.contextRoot) // reset context only for non-root metafacades
140        {
141            context = getContext(context);  // to have same value as in original constructor call
142            setMetafacadeContext (context);
143            if (this.superFrontEndExceptionHandlerInitialized)
144            {
145                ((MetafacadeBase)this.superFrontEndExceptionHandler).resetMetafacadeContext(context);
146            }
147            if (this.superStrutsForwardInitialized)
148            {
149                ((MetafacadeBase)this.superStrutsForward).resetMetafacadeContext(context);
150            }
151        }
152    }
153
154    /**
155     * @return boolean true always
156     * @see StrutsExceptionHandler
157     */
158    public boolean isStrutsExceptionHandlerMetaType()
159    {
160        return true;
161    }
162
163    // --------------- attributes ---------------------
164
165   /**
166    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler#getExceptionKey()
167    * @return String
168    */
169    protected abstract String handleGetExceptionKey();
170
171    private String __exceptionKey1a;
172    private boolean __exceptionKey1aSet = false;
173
174    /**
175     * The key to use with this handler's message resource bundle that will retrieve the error
176     * message template for this exception.
177     * @return (String)handleGetExceptionKey()
178     */
179    public final String getExceptionKey()
180    {
181        String exceptionKey1a = this.__exceptionKey1a;
182        if (!this.__exceptionKey1aSet)
183        {
184            // exceptionKey has no pre constraints
185            exceptionKey1a = handleGetExceptionKey();
186            // exceptionKey has no post constraints
187            this.__exceptionKey1a = exceptionKey1a;
188            if (isMetafacadePropertyCachingEnabled())
189            {
190                this.__exceptionKey1aSet = true;
191            }
192        }
193        return exceptionKey1a;
194    }
195
196   /**
197    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler#getExceptionType()
198    * @return String
199    */
200    protected abstract String handleGetExceptionType();
201
202    private String __exceptionType2a;
203    private boolean __exceptionType2aSet = false;
204
205    /**
206     * Fully qualified Java class name of the exception type to register with this handler.
207     * @return (String)handleGetExceptionType()
208     */
209    public final String getExceptionType()
210    {
211        String exceptionType2a = this.__exceptionType2a;
212        if (!this.__exceptionType2aSet)
213        {
214            // exceptionType has no pre constraints
215            exceptionType2a = handleGetExceptionType();
216            // exceptionType has no post constraints
217            this.__exceptionType2a = exceptionType2a;
218            if (isMetafacadePropertyCachingEnabled())
219            {
220                this.__exceptionType2aSet = true;
221            }
222        }
223        return exceptionType2a;
224    }
225
226   /**
227    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler#getExceptionPath()
228    * @return String
229    */
230    protected abstract String handleGetExceptionPath();
231
232    private String __exceptionPath3a;
233    private boolean __exceptionPath3aSet = false;
234
235    /**
236     * The module-relative URI to the resource that will complete the request/response if this
237     * exception occurs.
238     * @return (String)handleGetExceptionPath()
239     */
240    public final String getExceptionPath()
241    {
242        String exceptionPath3a = this.__exceptionPath3a;
243        if (!this.__exceptionPath3aSet)
244        {
245            // exceptionPath has no pre constraints
246            exceptionPath3a = handleGetExceptionPath();
247            // exceptionPath has no post constraints
248            this.__exceptionPath3a = exceptionPath3a;
249            if (isMetafacadePropertyCachingEnabled())
250            {
251                this.__exceptionPath3aSet = true;
252            }
253        }
254        return exceptionPath3a;
255    }
256
257   /**
258    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler#getMessageKey()
259    * @return String
260    */
261    protected abstract String handleGetMessageKey();
262
263    private String __messageKey4a;
264    private boolean __messageKey4aSet = false;
265
266    /**
267     * TODO: Model Documentation for
268     * org.andromda.cartridges.bpm4struts.metafacades.StrutsExceptionHandler.messageKey
269     * @return (String)handleGetMessageKey()
270     */
271    public final String getMessageKey()
272    {
273        String messageKey4a = this.__messageKey4a;
274        if (!this.__messageKey4aSet)
275        {
276            // messageKey has no pre constraints
277            messageKey4a = handleGetMessageKey();
278            // messageKey has no post constraints
279            this.__messageKey4a = messageKey4a;
280            if (isMetafacadePropertyCachingEnabled())
281            {
282                this.__messageKey4aSet = true;
283            }
284        }
285        return messageKey4a;
286    }
287
288    // ------------- associations ------------------
289
290    /**
291     * @return true
292     * @see FrontEndExceptionHandler
293     */
294    public boolean isFrontEndExceptionHandlerMetaType()
295    {
296        return true;
297    }
298
299    /**
300     * @return true
301     * @see StrutsForward
302     */
303    public boolean isStrutsForwardMetaType()
304    {
305        return true;
306    }
307
308    /**
309     * @return true
310     * @see org.andromda.metafacades.uml.FrontEndForward
311     */
312    public boolean isFrontEndForwardMetaType()
313    {
314        return true;
315    }
316
317    /**
318     * @return true
319     * @see org.andromda.metafacades.uml.TransitionFacade
320     */
321    public boolean isTransitionFacadeMetaType()
322    {
323        return true;
324    }
325
326    /**
327     * @return true
328     * @see ModelElementFacade
329     */
330    public boolean isModelElementFacadeMetaType()
331    {
332        return true;
333    }
334
335    // ----------- delegates to FrontEndExceptionHandler ------------
336    /**
337     * Indicatesif this element carries the FrontEndException stereotype.
338     * @see FrontEndExceptionHandler#isFrontEndException()
339     */
340    public boolean isFrontEndException()
341    {
342        return this.getSuperFrontEndExceptionHandler().isFrontEndException();
343    }
344
345    /**
346     * The method name used to delegate to this forward.
347     * @see org.andromda.metafacades.uml.FrontEndForward#getActionMethodName()
348     */
349    public String getActionMethodName()
350    {
351        return this.getSuperFrontEndExceptionHandler().getActionMethodName();
352    }
353
354    /**
355     * The front-end actions directly containing this front-end forward.
356     * @see org.andromda.metafacades.uml.FrontEndForward#getActions()
357     */
358    public List<FrontEndAction> getActions()
359    {
360        return this.getSuperFrontEndExceptionHandler().getActions();
361    }
362
363    /**
364     * The trigger for this front-end forward.
365     * @see org.andromda.metafacades.uml.FrontEndForward#getDecisionTrigger()
366     */
367    public FrontEndEvent getDecisionTrigger()
368    {
369        return this.getSuperFrontEndExceptionHandler().getDecisionTrigger();
370    }
371
372    /**
373     * Tthe set of parameter used during transport in this forward.
374     * @see org.andromda.metafacades.uml.FrontEndForward#getForwardParameters()
375     */
376    public List<FrontEndParameter> getForwardParameters()
377    {
378        return this.getSuperFrontEndExceptionHandler().getForwardParameters();
379    }
380
381    /**
382     * The activity graph which holds this forward if the graph is contained in a FrontEndUseCase.
383     * @see org.andromda.metafacades.uml.FrontEndForward#getFrontEndActivityGraph()
384     */
385    public FrontEndActivityGraph getFrontEndActivityGraph()
386    {
387        return this.getSuperFrontEndExceptionHandler().getFrontEndActivityGraph();
388    }
389
390    /**
391     * The operation to which is called during execution of this front-end forward.
392     * @see org.andromda.metafacades.uml.FrontEndForward#getOperationCall()
393     */
394    public FrontEndControllerOperation getOperationCall()
395    {
396        return this.getSuperFrontEndExceptionHandler().getOperationCall();
397    }
398
399    /**
400     * The use case in which this forward is contained.
401     * @see org.andromda.metafacades.uml.FrontEndForward#getUseCase()
402     */
403    public FrontEndUseCase getUseCase()
404    {
405        return this.getSuperFrontEndExceptionHandler().getUseCase();
406    }
407
408    /**
409     * Indicates if this forward is contained in a FrontEndUseCase.
410     * @see org.andromda.metafacades.uml.FrontEndForward#isContainedInFrontEndUseCase()
411     */
412    public boolean isContainedInFrontEndUseCase()
413    {
414        return this.getSuperFrontEndExceptionHandler().isContainedInFrontEndUseCase();
415    }
416
417    /**
418     * Indicates if this action directly targets a "front-end" view, false otherwise.
419     * @see org.andromda.metafacades.uml.FrontEndForward#isEnteringView()
420     */
421    public boolean isEnteringView()
422    {
423        return this.getSuperFrontEndExceptionHandler().isEnteringView();
424    }
425
426    /**
427     * Indicates if this forward (transition) is coming out of a front-end view.
428     * @see org.andromda.metafacades.uml.FrontEndForward#isExitingView()
429     */
430    public boolean isExitingView()
431    {
432        return this.getSuperFrontEndExceptionHandler().isExitingView();
433    }
434
435    /**
436     * Copies all tagged values from the given ModelElementFacade to this model element facade.
437     * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
438     */
439    public void copyTaggedValues(ModelElementFacade element)
440    {
441        this.getSuperFrontEndExceptionHandler().copyTaggedValues(element);
442    }
443
444    /**
445     * Finds the tagged value with the specified 'tagName'. In case there are more values the first
446     * one found will be returned.
447     * @see ModelElementFacade#findTaggedValue(String tagName)
448     */
449    public Object findTaggedValue(String tagName)
450    {
451        return this.getSuperFrontEndExceptionHandler().findTaggedValue(tagName);
452    }
453
454    /**
455     * Returns all the values for the tagged value with the specified name. The returned collection
456     * will contains only String instances, or will be empty. Never null.
457     * @see ModelElementFacade#findTaggedValues(String tagName)
458     */
459    public Collection<Object> findTaggedValues(String tagName)
460    {
461        return this.getSuperFrontEndExceptionHandler().findTaggedValues(tagName);
462    }
463
464    /**
465     * Returns the fully qualified name of the model element. The fully qualified name includes
466     * complete package qualified name of the underlying model element. The templates parameter will
467     * be replaced by the correct one given the binding relation of the parameter to this element.
468     * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
469     */
470    public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
471    {
472        return this.getSuperFrontEndExceptionHandler().getBindedFullyQualifiedName(bindedElement);
473    }
474
475    /**
476     * Gets all constraints belonging to the model element.
477     * @see ModelElementFacade#getConstraints()
478     */
479    public Collection<ConstraintFacade> getConstraints()
480    {
481        return this.getSuperFrontEndExceptionHandler().getConstraints();
482    }
483
484    /**
485     * Returns the constraints of the argument kind that have been placed onto this model. Typical
486     * kinds are "inv", "pre" and "post". Other kinds are possible.
487     * @see ModelElementFacade#getConstraints(String kind)
488     */
489    public Collection<ConstraintFacade> getConstraints(String kind)
490    {
491        return this.getSuperFrontEndExceptionHandler().getConstraints(kind);
492    }
493
494    /**
495     * Gets the documentation for the model element, The indent argument is prefixed to each line.
496     * By default this method wraps lines after 64 characters.
497     * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
498     * @see ModelElementFacade#getDocumentation(String indent)
499     */
500    public String getDocumentation(String indent)
501    {
502        return this.getSuperFrontEndExceptionHandler().getDocumentation(indent);
503    }
504
505    /**
506     * This method returns the documentation for this model element, with the lines wrapped after
507     * the specified number of characters, values of less than 1 will indicate no line wrapping is
508     * required. By default paragraphs are returned as HTML.
509     * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
510     * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
511     */
512    public String getDocumentation(String indent, int lineLength)
513    {
514        return this.getSuperFrontEndExceptionHandler().getDocumentation(indent, lineLength);
515    }
516
517    /**
518     * This method returns the documentation for this model element, with the lines wrapped after
519     * the specified number of characters, values of less than 1 will indicate no line wrapping is
520     * required. HTML style determines if HTML Escaping is applied.
521     * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
522     */
523    public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
524    {
525        return this.getSuperFrontEndExceptionHandler().getDocumentation(indent, lineLength, htmlStyle);
526    }
527
528    /**
529     * The fully qualified name of this model element.
530     * @see ModelElementFacade#getFullyQualifiedName()
531     */
532    public String getFullyQualifiedName()
533    {
534        return this.getSuperFrontEndExceptionHandler().getFullyQualifiedName();
535    }
536
537    /**
538     * Returns the fully qualified name of the model element. The fully qualified name includes
539     * complete package qualified name of the underlying model element.  If modelName is true, then
540     * the original name of the model element (the name contained within the model) will be the name
541     * returned, otherwise a name from a language mapping will be returned.
542     * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
543     */
544    public String getFullyQualifiedName(boolean modelName)
545    {
546        return this.getSuperFrontEndExceptionHandler().getFullyQualifiedName(modelName);
547    }
548
549    /**
550     * Returns the fully qualified name as a path, the returned value always starts with out a slash
551     * '/'.
552     * @see ModelElementFacade#getFullyQualifiedNamePath()
553     */
554    public String getFullyQualifiedNamePath()
555    {
556        return this.getSuperFrontEndExceptionHandler().getFullyQualifiedNamePath();
557    }
558
559    /**
560     * Gets the unique identifier of the underlying model element.
561     * @see ModelElementFacade#getId()
562     */
563    public String getId()
564    {
565        return this.getSuperFrontEndExceptionHandler().getId();
566    }
567
568    /**
569     * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
570     * are not represented by other properties, i.e. native, transient, volatile, synchronized,
571     * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
572     * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
573     * JDK5 compiler level.
574     * @see ModelElementFacade#getKeywords()
575     */
576    public Collection<String> getKeywords()
577    {
578        return this.getSuperFrontEndExceptionHandler().getKeywords();
579    }
580
581    /**
582     * UML2: Retrieves a localized label for this named element.
583     * @see ModelElementFacade#getLabel()
584     */
585    public String getLabel()
586    {
587        return this.getSuperFrontEndExceptionHandler().getLabel();
588    }
589
590    /**
591     * The language mappings that have been set for this model element.
592     * @see ModelElementFacade#getLanguageMappings()
593     */
594    public TypeMappings getLanguageMappings()
595    {
596        return this.getSuperFrontEndExceptionHandler().getLanguageMappings();
597    }
598
599    /**
600     * Return the model containing this model element (multiple models may be loaded and processed
601     * at the same time).
602     * @see ModelElementFacade#getModel()
603     */
604    public ModelFacade getModel()
605    {
606        return this.getSuperFrontEndExceptionHandler().getModel();
607    }
608
609    /**
610     * The name of the model element.
611     * @see ModelElementFacade#getName()
612     */
613    public String getName()
614    {
615        return this.getSuperFrontEndExceptionHandler().getName();
616    }
617
618    /**
619     * Gets the package to which this model element belongs.
620     * @see ModelElementFacade#getPackage()
621     */
622    public ModelElementFacade getPackage()
623    {
624        return this.getSuperFrontEndExceptionHandler().getPackage();
625    }
626
627    /**
628     * The name of this model element's package.
629     * @see ModelElementFacade#getPackageName()
630     */
631    public String getPackageName()
632    {
633        return this.getSuperFrontEndExceptionHandler().getPackageName();
634    }
635
636    /**
637     * Gets the package name (optionally providing the ability to retrieve the model name and not
638     * the mapped name).
639     * @see ModelElementFacade#getPackageName(boolean modelName)
640     */
641    public String getPackageName(boolean modelName)
642    {
643        return this.getSuperFrontEndExceptionHandler().getPackageName(modelName);
644    }
645
646    /**
647     * Returns the package as a path, the returned value always starts with out a slash '/'.
648     * @see ModelElementFacade#getPackagePath()
649     */
650    public String getPackagePath()
651    {
652        return this.getSuperFrontEndExceptionHandler().getPackagePath();
653    }
654
655    /**
656     * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
657     * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
658     * the names of the containing namespaces starting at the root of the hierarchy and ending with
659     * the name of the NamedElement itself.
660     * @see ModelElementFacade#getQualifiedName()
661     */
662    public String getQualifiedName()
663    {
664        return this.getSuperFrontEndExceptionHandler().getQualifiedName();
665    }
666
667    /**
668     * Gets the root package for the model element.
669     * @see ModelElementFacade#getRootPackage()
670     */
671    public PackageFacade getRootPackage()
672    {
673        return this.getSuperFrontEndExceptionHandler().getRootPackage();
674    }
675
676    /**
677     * Gets the dependencies for which this model element is the source.
678     * @see ModelElementFacade#getSourceDependencies()
679     */
680    public Collection<DependencyFacade> getSourceDependencies()
681    {
682        return this.getSuperFrontEndExceptionHandler().getSourceDependencies();
683    }
684
685    /**
686     * If this model element is the context of an activity graph, this represents that activity
687     * graph.
688     * @see ModelElementFacade#getStateMachineContext()
689     */
690    public StateMachineFacade getStateMachineContext()
691    {
692        return this.getSuperFrontEndExceptionHandler().getStateMachineContext();
693    }
694
695    /**
696     * The collection of ALL stereotype names for this model element.
697     * @see ModelElementFacade#getStereotypeNames()
698     */
699    public Collection<String> getStereotypeNames()
700    {
701        return this.getSuperFrontEndExceptionHandler().getStereotypeNames();
702    }
703
704    /**
705     * Gets all stereotypes for this model element.
706     * @see ModelElementFacade#getStereotypes()
707     */
708    public Collection<StereotypeFacade> getStereotypes()
709    {
710        return this.getSuperFrontEndExceptionHandler().getStereotypes();
711    }
712
713    /**
714     * Return the TaggedValues associated with this model element, under all stereotypes.
715     * @see ModelElementFacade#getTaggedValues()
716     */
717    public Collection<TaggedValueFacade> getTaggedValues()
718    {
719        return this.getSuperFrontEndExceptionHandler().getTaggedValues();
720    }
721
722    /**
723     * Gets the dependencies for which this model element is the target.
724     * @see ModelElementFacade#getTargetDependencies()
725     */
726    public Collection<DependencyFacade> getTargetDependencies()
727    {
728        return this.getSuperFrontEndExceptionHandler().getTargetDependencies();
729    }
730
731    /**
732     * Get the template parameter for this model element having the parameterName
733     * @see ModelElementFacade#getTemplateParameter(String parameterName)
734     */
735    public Object getTemplateParameter(String parameterName)
736    {
737        return this.getSuperFrontEndExceptionHandler().getTemplateParameter(parameterName);
738    }
739
740    /**
741     * Get the template parameters for this model element
742     * @see ModelElementFacade#getTemplateParameters()
743     */
744    public Collection<TemplateParameterFacade> getTemplateParameters()
745    {
746        return this.getSuperFrontEndExceptionHandler().getTemplateParameters();
747    }
748
749    /**
750     * The visibility (i.e. public, private, protected or package) of the model element, will
751     * attempt a lookup for these values in the language mappings (if any).
752     * @see ModelElementFacade#getVisibility()
753     */
754    public String getVisibility()
755    {
756        return this.getSuperFrontEndExceptionHandler().getVisibility();
757    }
758
759    /**
760     * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
761     * is taken into account when searching for the stereotype), false otherwise.
762     * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
763     */
764    public boolean hasExactStereotype(String stereotypeName)
765    {
766        return this.getSuperFrontEndExceptionHandler().hasExactStereotype(stereotypeName);
767    }
768
769    /**
770     * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
771     * pipe, semicolon, or << >>
772     * @see ModelElementFacade#hasKeyword(String keywordName)
773     */
774    public boolean hasKeyword(String keywordName)
775    {
776        return this.getSuperFrontEndExceptionHandler().hasKeyword(keywordName);
777    }
778
779    /**
780     * Returns true if the model element has the specified stereotype.  If the stereotype itself
781     * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
782     * one of the stereotype's ancestors has a matching name this method will return true, false
783     * otherwise.
784     * For example, if we have a certain stereotype called <<exception>> and a model element has a
785     * stereotype called <<applicationException>> which extends <<exception>>, when calling this
786     * method with 'stereotypeName' defined as 'exception' the method would return true since
787     * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
788     * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
789     * @see ModelElementFacade#hasStereotype(String stereotypeName)
790     */
791    public boolean hasStereotype(String stereotypeName)
792    {
793        return this.getSuperFrontEndExceptionHandler().hasStereotype(stereotypeName);
794    }
795
796    /**
797     * True if there are target dependencies from this element that are instances of BindingFacade.
798     * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
799     * @see ModelElementFacade#isBindingDependenciesPresent()
800     */
801    public boolean isBindingDependenciesPresent()
802    {
803        return this.getSuperFrontEndExceptionHandler().isBindingDependenciesPresent();
804    }
805
806    /**
807     * Indicates if any constraints are present on this model element.
808     * @see ModelElementFacade#isConstraintsPresent()
809     */
810    public boolean isConstraintsPresent()
811    {
812        return this.getSuperFrontEndExceptionHandler().isConstraintsPresent();
813    }
814
815    /**
816     * Indicates if any documentation is present on this model element.
817     * @see ModelElementFacade#isDocumentationPresent()
818     */
819    public boolean isDocumentationPresent()
820    {
821        return this.getSuperFrontEndExceptionHandler().isDocumentationPresent();
822    }
823
824    /**
825     * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
826     * @see ModelElementFacade#isReservedWord()
827     */
828    public boolean isReservedWord()
829    {
830        return this.getSuperFrontEndExceptionHandler().isReservedWord();
831    }
832
833    /**
834     * True is there are template parameters on this model element. For UML2, applies to Class,
835     * Operation, Property, and Parameter.
836     * @see ModelElementFacade#isTemplateParametersPresent()
837     */
838    public boolean isTemplateParametersPresent()
839    {
840        return this.getSuperFrontEndExceptionHandler().isTemplateParametersPresent();
841    }
842
843    /**
844     * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
845     * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
846     * Enumerations and Interfaces, optionally applies on other model elements.
847     * @see ModelElementFacade#isValidIdentifierName()
848     */
849    public boolean isValidIdentifierName()
850    {
851        return this.getSuperFrontEndExceptionHandler().isValidIdentifierName();
852    }
853
854    /**
855     * Searches for the constraint with the specified 'name' on this model element, and if found
856     * translates it using the specified 'translation' from a translation library discovered by the
857     * framework.
858     * @see ModelElementFacade#translateConstraint(String name, String translation)
859     */
860    public String translateConstraint(String name, String translation)
861    {
862        return this.getSuperFrontEndExceptionHandler().translateConstraint(name, translation);
863    }
864
865    /**
866     * Translates all constraints belonging to this model element with the given 'translation'.
867     * @see ModelElementFacade#translateConstraints(String translation)
868     */
869    public String[] translateConstraints(String translation)
870    {
871        return this.getSuperFrontEndExceptionHandler().translateConstraints(translation);
872    }
873
874    /**
875     * Translates the constraints of the specified 'kind' belonging to this model element.
876     * @see ModelElementFacade#translateConstraints(String kind, String translation)
877     */
878    public String[] translateConstraints(String kind, String translation)
879    {
880        return this.getSuperFrontEndExceptionHandler().translateConstraints(kind, translation);
881    }
882
883    /**
884     * An action is a named element that is the fundamental unit of executable functionality. The
885     * execution
886     * of an action represents some transformation or processing in the modeled system, be it a
887     * computer
888     * system or otherwise. An action represents a single step within an activity, that is, one that
889     * is not
890     * further decomposed within the activity. An action has pre- and post-conditions.
891     * @see org.andromda.metafacades.uml.TransitionFacade#getEffect()
892     */
893    public ActionFacade getEffect()
894    {
895        return this.getSuperFrontEndExceptionHandler().getEffect();
896    }
897
898    /**
899     * A representation of the model object 'Constraint'. A condition or restriction expressed in
900     * natural
901     * language text or in a machine readable language for the purpose of declaring some of the
902     * semantics
903     * of an element.
904     * @see org.andromda.metafacades.uml.TransitionFacade#getGuard()
905     */
906    public GuardFacade getGuard()
907    {
908        return this.getSuperFrontEndExceptionHandler().getGuard();
909    }
910
911    /**
912     * A representation of the model object 'Vertex'. An abstraction of a node in a state machine
913     * graph. In
914     * general, it can be the source or destination of any number of transitions.
915     * @see org.andromda.metafacades.uml.TransitionFacade#getSource()
916     */
917    public StateVertexFacade getSource()
918    {
919        return this.getSuperFrontEndExceptionHandler().getSource();
920    }
921
922    /**
923     * A representation of the model object 'Vertex'. An abstraction of a node in a state machine
924     * graph. In
925     * general, it can be the source or destination of any number of transitions.
926     * @see org.andromda.metafacades.uml.TransitionFacade#getTarget()
927     */
928    public StateVertexFacade getTarget()
929    {
930        return this.getSuperFrontEndExceptionHandler().getTarget();
931    }
932
933    /**
934     * If a trigger is present on this transition, this event represents that trigger.
935     * @see org.andromda.metafacades.uml.TransitionFacade#getTrigger()
936     */
937    public EventFacade getTrigger()
938    {
939        return this.getSuperFrontEndExceptionHandler().getTrigger();
940    }
941
942    /**
943     * TODO: Model Documentation for
944     * org.andromda.metafacades.uml.TransitionFacade.enteringActionState
945     * @see org.andromda.metafacades.uml.TransitionFacade#isEnteringActionState()
946     */
947    public boolean isEnteringActionState()
948    {
949        return this.getSuperFrontEndExceptionHandler().isEnteringActionState();
950    }
951
952    /**
953     * TODO: Model Documentation for
954     * org.andromda.metafacades.uml.TransitionFacade.enteringDecisionPoint
955     * @see org.andromda.metafacades.uml.TransitionFacade#isEnteringDecisionPoint()
956     */
957    public boolean isEnteringDecisionPoint()
958    {
959        return this.getSuperFrontEndExceptionHandler().isEnteringDecisionPoint();
960    }
961
962    /**
963     * TODO: Model Documentation for
964     * org.andromda.metafacades.uml.TransitionFacade.enteringFinalState
965     * @see org.andromda.metafacades.uml.TransitionFacade#isEnteringFinalState()
966     */
967    public boolean isEnteringFinalState()
968    {
969        return this.getSuperFrontEndExceptionHandler().isEnteringFinalState();
970    }
971
972    /**
973     * TODO: Model Documentation for
974     * org.andromda.metafacades.uml.TransitionFacade.exitingActionState
975     * @see org.andromda.metafacades.uml.TransitionFacade#isExitingActionState()
976     */
977    public boolean isExitingActionState()
978    {
979        return this.getSuperFrontEndExceptionHandler().isExitingActionState();
980    }
981
982    /**
983     * TODO: Model Documentation for
984     * org.andromda.metafacades.uml.TransitionFacade.exitingDecisionPoint
985     * @see org.andromda.metafacades.uml.TransitionFacade#isExitingDecisionPoint()
986     */
987    public boolean isExitingDecisionPoint()
988    {
989        return this.getSuperFrontEndExceptionHandler().isExitingDecisionPoint();
990    }
991
992    /**
993     * TODO: Model Documentation for
994     * org.andromda.metafacades.uml.TransitionFacade.exitingInitialState
995     * @see org.andromda.metafacades.uml.TransitionFacade#isExitingInitialState()
996     */
997    public boolean isExitingInitialState()
998    {
999        return this.getSuperFrontEndExceptionHandler().isExitingInitialState();
1000    }
1001
1002    /**
1003     * TODO: Model Documentation for org.andromda.metafacades.uml.TransitionFacade.triggerPresent
1004     * @see org.andromda.metafacades.uml.TransitionFacade#isTriggerPresent()
1005     */
1006    public boolean isTriggerPresent()
1007    {
1008        return this.getSuperFrontEndExceptionHandler().isTriggerPresent();
1009    }
1010
1011    // ----------- delegates to StrutsForward ------------
1012    /**
1013     * The name for this forward. This name is always lowercase and words are separated using dots,
1014     * not unlike the convention for Java package names.
1015     * @see StrutsForward#getForwardName()
1016     */
1017    public String getForwardName()
1018    {
1019        return this.getSuperStrutsForward().getForwardName();
1020    }
1021
1022    /**
1023     * Returns the path targetted by this forward.
1024     * @see StrutsForward#getForwardPath()
1025     */
1026    public String getForwardPath()
1027    {
1028        return this.getSuperStrutsForward().getForwardPath();
1029    }
1030
1031    /**
1032     * If this forward is guarded (such as with decision points) this method return the name of that
1033     * guard.
1034     * @see StrutsForward#getGuardName()
1035     */
1036    public String getGuardName()
1037    {
1038        return this.getSuperStrutsForward().getGuardName();
1039    }
1040
1041    /**
1042     * Returns the activity graph which holds this action if the graph is contained in a
1043     * FrontEndUseCase.
1044     * @see StrutsForward#getStrutsActivityGraph()
1045     */
1046    public StrutsActivityGraph getStrutsActivityGraph()
1047    {
1048        return this.getSuperStrutsForward().getStrutsActivityGraph();
1049    }
1050
1051    /**
1052     * A map of key=value pairs, one for each success message.
1053     * @see StrutsForward#getSuccessMessages()
1054     */
1055    public Map getSuccessMessages()
1056    {
1057        return this.getSuperStrutsForward().getSuccessMessages();
1058    }
1059
1060    /**
1061     * The resource bundle key of the name for the target element. This method returns the key for
1062     * the use-case or jsp page. If targetting anything else this method returns null.
1063     * @see StrutsForward#getTargetNameKey()
1064     */
1065    public String getTargetNameKey()
1066    {
1067        return this.getSuperStrutsForward().getTargetNameKey();
1068    }
1069
1070    /**
1071     * A map of key=value pairs, one for each warning message.
1072     * @see StrutsForward#getWarningMessages()
1073     */
1074    public Map getWarningMessages()
1075    {
1076        return this.getSuperStrutsForward().getWarningMessages();
1077    }
1078
1079    /**
1080     * True if this action directly targets a JSP page, false otherwise.
1081     * @see StrutsForward#isEnteringPage()
1082     */
1083    public boolean isEnteringPage()
1084    {
1085        return this.getSuperStrutsForward().isEnteringPage();
1086    }
1087
1088    /**
1089     * Whether or not this forward (transition) is coming out of a page.
1090     * @see StrutsForward#isExitingPage()
1091     */
1092    public boolean isExitingPage()
1093    {
1094        return this.getSuperStrutsForward().isExitingPage();
1095    }
1096
1097    /**
1098     * TODO: Model Documentation for
1099     * StrutsForward.successMessagesPresent
1100     * @see StrutsForward#isSuccessMessagesPresent()
1101     */
1102    public boolean isSuccessMessagesPresent()
1103    {
1104        return this.getSuperStrutsForward().isSuccessMessagesPresent();
1105    }
1106
1107    /**
1108     * TODO: Model Documentation for
1109     * StrutsForward.warningMessagesPresent
1110     * @see StrutsForward#isWarningMessagesPresent()
1111     */
1112    public boolean isWarningMessagesPresent()
1113    {
1114        return this.getSuperStrutsForward().isWarningMessagesPresent();
1115    }
1116
1117    /**
1118     * @see MetafacadeBase#initialize()
1119     */
1120    @Override
1121    public void initialize()
1122    {
1123        this.getSuperFrontEndExceptionHandler().initialize();
1124        this.getSuperStrutsForward().initialize();
1125    }
1126
1127    /**
1128     * @return Object getSuperFrontEndExceptionHandler().getValidationOwner()
1129     * @see MetafacadeBase#getValidationOwner()
1130     */
1131    @Override
1132    public Object getValidationOwner()
1133    {
1134        Object owner = this.getSuperFrontEndExceptionHandler().getValidationOwner();
1135        if (owner == null)
1136        {
1137            owner = this.getSuperStrutsForward().getValidationOwner();
1138        }
1139        return owner;
1140    }
1141
1142    /**
1143     * @return String getSuperFrontEndExceptionHandler().getValidationName()
1144     * @see MetafacadeBase#getValidationName()
1145     */
1146    @Override
1147    public String getValidationName()
1148    {
1149        String name = this.getSuperFrontEndExceptionHandler().getValidationName();
1150        if (name == null)
1151        {
1152            name = this.getSuperStrutsForward().getValidationName();
1153        }
1154        return name;
1155    }
1156
1157    /**
1158     * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsExceptionHandler::must target page or final state</p>
1159     * <p><b>Error:</b> When you model an action-exception you must either target a FrontEndView action state or a final state.</p>
1160     * <p><b>OCL:</b> context StrutsExceptionHandler inv: enteringPage = false implies enteringFinalState</p>
1161     * @param validationMessages Collection<ModelValidationMessage>
1162     * @see MetafacadeBase#validateInvariants(Collection validationMessages)
1163     */
1164    @Override
1165    public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
1166    {
1167        this.getSuperFrontEndExceptionHandler().validateInvariants(validationMessages);
1168        this.getSuperStrutsForward().validateInvariants(validationMessages);
1169        try
1170        {
1171            final Object contextElement = this.THIS();
1172            boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLExpressions.equal(OCLIntrospector.invoke(contextElement,"enteringPage"),false))).booleanValue()?Boolean.valueOf(String.valueOf(OCLIntrospector.invoke(contextElement,"enteringFinalState"))).booleanValue():true));
1173            if (!constraintValid)
1174            {
1175                validationMessages.add(
1176                    new ModelValidationMessage(
1177                        (MetafacadeBase)contextElement ,
1178                        "org::andromda::cartridges::bpm4struts::metafacades::StrutsExceptionHandler::must target page or final state",
1179                        "When you model an action-exception you must either target a FrontEndView action state or a final state."));
1180            }
1181        }
1182        catch (Throwable th)
1183        {
1184            Throwable cause = th.getCause();
1185            int depth = 0; // Some throwables have infinite recursion
1186            while (cause != null && depth < 7)
1187            {
1188                th = cause;
1189                depth++;
1190            }
1191            logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsExceptionHandler::must target page or final state' ON "
1192                + this.THIS().toString() + ": " + th.getMessage(), th);
1193        }
1194    }
1195
1196    /**
1197     * The property that stores the name of the metafacade.
1198     */
1199    private static final String NAME_PROPERTY = "name";
1200    private static final String FQNAME_PROPERTY = "fullyQualifiedName";
1201
1202    /**
1203     * @see Object#toString()
1204     */
1205    @Override
1206    public String toString()
1207    {
1208        final StringBuilder toString = new StringBuilder(this.getClass().getName());
1209        toString.append("[");
1210        try
1211        {
1212            toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
1213        }
1214        catch (final Throwable tryAgain)
1215        {
1216            try
1217            {
1218                toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
1219            }
1220            catch (final Throwable ignore)
1221            {
1222                // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
1223            }
1224        }
1225        toString.append("]");
1226        return toString.toString();
1227    }
1228}