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 org.andromda.core.common.Introspector;
010import org.andromda.core.metafacade.MetafacadeBase;
011import org.andromda.core.metafacade.MetafacadeFactory;
012import org.andromda.core.metafacade.ModelValidationMessage;
013import org.andromda.metafacades.uml.ConstraintFacade;
014import org.andromda.metafacades.uml.DependencyFacade;
015import org.andromda.metafacades.uml.EventFacade;
016import org.andromda.metafacades.uml.FinalStateFacade;
017import org.andromda.metafacades.uml.FrontEndFinalState;
018import org.andromda.metafacades.uml.FrontEndParameter;
019import org.andromda.metafacades.uml.FrontEndUseCase;
020import org.andromda.metafacades.uml.ModelElementFacade;
021import org.andromda.metafacades.uml.ModelFacade;
022import org.andromda.metafacades.uml.PackageFacade;
023import org.andromda.metafacades.uml.PartitionFacade;
024import org.andromda.metafacades.uml.StateFacade;
025import org.andromda.metafacades.uml.StateMachineFacade;
026import org.andromda.metafacades.uml.StereotypeFacade;
027import org.andromda.metafacades.uml.TaggedValueFacade;
028import org.andromda.metafacades.uml.TemplateParameterFacade;
029import org.andromda.metafacades.uml.TransitionFacade;
030import org.andromda.metafacades.uml.TypeMappings;
031import org.andromda.translation.ocl.validation.OCLCollections;
032import org.andromda.translation.ocl.validation.OCLIntrospector;
033import org.andromda.translation.ocl.validation.OCLResultEnsurer;
034import org.apache.log4j.Logger;
035
036/**
037 * A final state represents the end of a use-case. In a Struts application this means a transition
038 * into the next use-case.
039 * MetafacadeLogic for StrutsFinalState
040 *
041 * @see StrutsFinalState
042 */
043public abstract class StrutsFinalStateLogic
044    extends MetafacadeBase
045    implements StrutsFinalState
046{
047    /**
048     * The underlying UML object
049     * @see Object
050     */
051    protected Object metaObject;
052
053    /** Create Metafacade implementation instance using the MetafacadeFactory from the context
054     * @param metaObjectIn
055     * @param context
056     */
057    protected StrutsFinalStateLogic(Object metaObjectIn, String context)
058    {
059        super(metaObjectIn, getContext(context));
060        this.superFinalStateFacade =
061           (FinalStateFacade)
062            MetafacadeFactory.getInstance().createFacadeImpl(
063                    "org.andromda.metafacades.uml.FinalStateFacade",
064                    metaObjectIn,
065                    getContext(context));
066        this.superFrontEndFinalState =
067           (FrontEndFinalState)
068            MetafacadeFactory.getInstance().createFacadeImpl(
069                    "org.andromda.metafacades.uml.FrontEndFinalState",
070                    metaObjectIn,
071                    getContext(context));
072        this.metaObject = metaObjectIn;
073    }
074
075    /**
076     * The logger instance.
077     */
078    private static final Logger logger = Logger.getLogger(StrutsFinalStateLogic.class);
079
080    /**
081     * Gets the context for this metafacade logic instance.
082     * @param context String. Set to StrutsFinalState if null
083     * @return context String
084     */
085    private static String getContext(String context)
086    {
087        if (context == null)
088        {
089            context = "org.andromda.cartridges.bpm4struts.metafacades.StrutsFinalState";
090        }
091        return context;
092    }
093
094    private FinalStateFacade superFinalStateFacade;
095    private boolean superFinalStateFacadeInitialized = false;
096
097    /**
098     * Gets the FinalStateFacade parent instance.
099     * @return this.superFinalStateFacade FinalStateFacade
100     */
101    protected FinalStateFacade getSuperFinalStateFacade()
102    {
103        if (!this.superFinalStateFacadeInitialized)
104        {
105            ((MetafacadeBase)this.superFinalStateFacade).setMetafacadeContext(this.getMetafacadeContext());
106            this.superFinalStateFacadeInitialized = true;
107        }
108        return this.superFinalStateFacade;
109    }
110
111    private FrontEndFinalState superFrontEndFinalState;
112    private boolean superFrontEndFinalStateInitialized = false;
113
114    /**
115     * Gets the FrontEndFinalState parent instance.
116     * @return this.superFrontEndFinalState FrontEndFinalState
117     */
118    protected FrontEndFinalState getSuperFrontEndFinalState()
119    {
120        if (!this.superFrontEndFinalStateInitialized)
121        {
122            ((MetafacadeBase)this.superFrontEndFinalState).setMetafacadeContext(this.getMetafacadeContext());
123            this.superFrontEndFinalStateInitialized = true;
124        }
125        return this.superFrontEndFinalState;
126    }
127
128    /** Reset context only for non-root metafacades
129     * @param context
130     * @see MetafacadeBase#resetMetafacadeContext(String context)
131     */
132    @Override
133    public void resetMetafacadeContext(String context)
134    {
135        if (!this.contextRoot) // reset context only for non-root metafacades
136        {
137            context = getContext(context);  // to have same value as in original constructor call
138            setMetafacadeContext (context);
139            if (this.superFinalStateFacadeInitialized)
140            {
141                ((MetafacadeBase)this.superFinalStateFacade).resetMetafacadeContext(context);
142            }
143            if (this.superFrontEndFinalStateInitialized)
144            {
145                ((MetafacadeBase)this.superFrontEndFinalState).resetMetafacadeContext(context);
146            }
147        }
148    }
149
150    /**
151     * @return boolean true always
152     * @see StrutsFinalState
153     */
154    public boolean isStrutsFinalStateMetaType()
155    {
156        return true;
157    }
158
159    // --------------- attributes ---------------------
160
161   /**
162    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsFinalState#getFullPath()
163    * @return String
164    */
165    protected abstract String handleGetFullPath();
166
167    private String __fullPath1a;
168    private boolean __fullPath1aSet = false;
169
170    /**
171     * A final state maps onto a use-case. The full path to this use-case is returned here. In case
172     * no name for this final state was specified the use-case with the application's first use-case
173     * path will be returned.
174     * @return (String)handleGetFullPath()
175     */
176    public final String getFullPath()
177    {
178        String fullPath1a = this.__fullPath1a;
179        if (!this.__fullPath1aSet)
180        {
181            // fullPath has no pre constraints
182            fullPath1a = handleGetFullPath();
183            // fullPath has no post constraints
184            this.__fullPath1a = fullPath1a;
185            if (isMetafacadePropertyCachingEnabled())
186            {
187                this.__fullPath1aSet = true;
188            }
189        }
190        return fullPath1a;
191    }
192
193    // ------------- associations ------------------
194
195    /**
196     * @return true
197     * @see FinalStateFacade
198     */
199    public boolean isFinalStateFacadeMetaType()
200    {
201        return true;
202    }
203
204    /**
205     * @return true
206     * @see FrontEndFinalState
207     */
208    public boolean isFrontEndFinalStateMetaType()
209    {
210        return true;
211    }
212
213    /**
214     * @return true
215     * @see StateFacade
216     */
217    public boolean isStateFacadeMetaType()
218    {
219        return true;
220    }
221
222    /**
223     * @return true
224     * @see org.andromda.metafacades.uml.StateVertexFacade
225     */
226    public boolean isStateVertexFacadeMetaType()
227    {
228        return true;
229    }
230
231    /**
232     * @return true
233     * @see ModelElementFacade
234     */
235    public boolean isModelElementFacadeMetaType()
236    {
237        return true;
238    }
239
240    // ----------- delegates to FinalStateFacade ------------
241    /**
242     * Copies all tagged values from the given ModelElementFacade to this model element facade.
243     * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
244     */
245    public void copyTaggedValues(ModelElementFacade element)
246    {
247        this.getSuperFinalStateFacade().copyTaggedValues(element);
248    }
249
250    /**
251     * Finds the tagged value with the specified 'tagName'. In case there are more values the first
252     * one found will be returned.
253     * @see ModelElementFacade#findTaggedValue(String tagName)
254     */
255    public Object findTaggedValue(String tagName)
256    {
257        return this.getSuperFinalStateFacade().findTaggedValue(tagName);
258    }
259
260    /**
261     * Returns all the values for the tagged value with the specified name. The returned collection
262     * will contains only String instances, or will be empty. Never null.
263     * @see ModelElementFacade#findTaggedValues(String tagName)
264     */
265    public Collection<Object> findTaggedValues(String tagName)
266    {
267        return this.getSuperFinalStateFacade().findTaggedValues(tagName);
268    }
269
270    /**
271     * Returns the fully qualified name of the model element. The fully qualified name includes
272     * complete package qualified name of the underlying model element. The templates parameter will
273     * be replaced by the correct one given the binding relation of the parameter to this element.
274     * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
275     */
276    public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
277    {
278        return this.getSuperFinalStateFacade().getBindedFullyQualifiedName(bindedElement);
279    }
280
281    /**
282     * Gets all constraints belonging to the model element.
283     * @see ModelElementFacade#getConstraints()
284     */
285    public Collection<ConstraintFacade> getConstraints()
286    {
287        return this.getSuperFinalStateFacade().getConstraints();
288    }
289
290    /**
291     * Returns the constraints of the argument kind that have been placed onto this model. Typical
292     * kinds are "inv", "pre" and "post". Other kinds are possible.
293     * @see ModelElementFacade#getConstraints(String kind)
294     */
295    public Collection<ConstraintFacade> getConstraints(String kind)
296    {
297        return this.getSuperFinalStateFacade().getConstraints(kind);
298    }
299
300    /**
301     * Gets the documentation for the model element, The indent argument is prefixed to each line.
302     * By default this method wraps lines after 64 characters.
303     * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
304     * @see ModelElementFacade#getDocumentation(String indent)
305     */
306    public String getDocumentation(String indent)
307    {
308        return this.getSuperFinalStateFacade().getDocumentation(indent);
309    }
310
311    /**
312     * This method returns the documentation for this model element, with the lines wrapped after
313     * the specified number of characters, values of less than 1 will indicate no line wrapping is
314     * required. By default paragraphs are returned as HTML.
315     * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
316     * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
317     */
318    public String getDocumentation(String indent, int lineLength)
319    {
320        return this.getSuperFinalStateFacade().getDocumentation(indent, lineLength);
321    }
322
323    /**
324     * This method returns the documentation for this model element, with the lines wrapped after
325     * the specified number of characters, values of less than 1 will indicate no line wrapping is
326     * required. HTML style determines if HTML Escaping is applied.
327     * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
328     */
329    public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
330    {
331        return this.getSuperFinalStateFacade().getDocumentation(indent, lineLength, htmlStyle);
332    }
333
334    /**
335     * The fully qualified name of this model element.
336     * @see ModelElementFacade#getFullyQualifiedName()
337     */
338    public String getFullyQualifiedName()
339    {
340        return this.getSuperFinalStateFacade().getFullyQualifiedName();
341    }
342
343    /**
344     * Returns the fully qualified name of the model element. The fully qualified name includes
345     * complete package qualified name of the underlying model element.  If modelName is true, then
346     * the original name of the model element (the name contained within the model) will be the name
347     * returned, otherwise a name from a language mapping will be returned.
348     * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
349     */
350    public String getFullyQualifiedName(boolean modelName)
351    {
352        return this.getSuperFinalStateFacade().getFullyQualifiedName(modelName);
353    }
354
355    /**
356     * Returns the fully qualified name as a path, the returned value always starts with out a slash
357     * '/'.
358     * @see ModelElementFacade#getFullyQualifiedNamePath()
359     */
360    public String getFullyQualifiedNamePath()
361    {
362        return this.getSuperFinalStateFacade().getFullyQualifiedNamePath();
363    }
364
365    /**
366     * Gets the unique identifier of the underlying model element.
367     * @see ModelElementFacade#getId()
368     */
369    public String getId()
370    {
371        return this.getSuperFinalStateFacade().getId();
372    }
373
374    /**
375     * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
376     * are not represented by other properties, i.e. native, transient, volatile, synchronized,
377     * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
378     * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
379     * JDK5 compiler level.
380     * @see ModelElementFacade#getKeywords()
381     */
382    public Collection<String> getKeywords()
383    {
384        return this.getSuperFinalStateFacade().getKeywords();
385    }
386
387    /**
388     * UML2: Retrieves a localized label for this named element.
389     * @see ModelElementFacade#getLabel()
390     */
391    public String getLabel()
392    {
393        return this.getSuperFinalStateFacade().getLabel();
394    }
395
396    /**
397     * The language mappings that have been set for this model element.
398     * @see ModelElementFacade#getLanguageMappings()
399     */
400    public TypeMappings getLanguageMappings()
401    {
402        return this.getSuperFinalStateFacade().getLanguageMappings();
403    }
404
405    /**
406     * Return the model containing this model element (multiple models may be loaded and processed
407     * at the same time).
408     * @see ModelElementFacade#getModel()
409     */
410    public ModelFacade getModel()
411    {
412        return this.getSuperFinalStateFacade().getModel();
413    }
414
415    /**
416     * The name of the model element.
417     * @see ModelElementFacade#getName()
418     */
419    public String getName()
420    {
421        return this.getSuperFinalStateFacade().getName();
422    }
423
424    /**
425     * Gets the package to which this model element belongs.
426     * @see ModelElementFacade#getPackage()
427     */
428    public ModelElementFacade getPackage()
429    {
430        return this.getSuperFinalStateFacade().getPackage();
431    }
432
433    /**
434     * The name of this model element's package.
435     * @see ModelElementFacade#getPackageName()
436     */
437    public String getPackageName()
438    {
439        return this.getSuperFinalStateFacade().getPackageName();
440    }
441
442    /**
443     * Gets the package name (optionally providing the ability to retrieve the model name and not
444     * the mapped name).
445     * @see ModelElementFacade#getPackageName(boolean modelName)
446     */
447    public String getPackageName(boolean modelName)
448    {
449        return this.getSuperFinalStateFacade().getPackageName(modelName);
450    }
451
452    /**
453     * Returns the package as a path, the returned value always starts with out a slash '/'.
454     * @see ModelElementFacade#getPackagePath()
455     */
456    public String getPackagePath()
457    {
458        return this.getSuperFinalStateFacade().getPackagePath();
459    }
460
461    /**
462     * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
463     * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
464     * the names of the containing namespaces starting at the root of the hierarchy and ending with
465     * the name of the NamedElement itself.
466     * @see ModelElementFacade#getQualifiedName()
467     */
468    public String getQualifiedName()
469    {
470        return this.getSuperFinalStateFacade().getQualifiedName();
471    }
472
473    /**
474     * Gets the root package for the model element.
475     * @see ModelElementFacade#getRootPackage()
476     */
477    public PackageFacade getRootPackage()
478    {
479        return this.getSuperFinalStateFacade().getRootPackage();
480    }
481
482    /**
483     * Gets the dependencies for which this model element is the source.
484     * @see ModelElementFacade#getSourceDependencies()
485     */
486    public Collection<DependencyFacade> getSourceDependencies()
487    {
488        return this.getSuperFinalStateFacade().getSourceDependencies();
489    }
490
491    /**
492     * If this model element is the context of an activity graph, this represents that activity
493     * graph.
494     * @see ModelElementFacade#getStateMachineContext()
495     */
496    public StateMachineFacade getStateMachineContext()
497    {
498        return this.getSuperFinalStateFacade().getStateMachineContext();
499    }
500
501    /**
502     * The collection of ALL stereotype names for this model element.
503     * @see ModelElementFacade#getStereotypeNames()
504     */
505    public Collection<String> getStereotypeNames()
506    {
507        return this.getSuperFinalStateFacade().getStereotypeNames();
508    }
509
510    /**
511     * Gets all stereotypes for this model element.
512     * @see ModelElementFacade#getStereotypes()
513     */
514    public Collection<StereotypeFacade> getStereotypes()
515    {
516        return this.getSuperFinalStateFacade().getStereotypes();
517    }
518
519    /**
520     * Return the TaggedValues associated with this model element, under all stereotypes.
521     * @see ModelElementFacade#getTaggedValues()
522     */
523    public Collection<TaggedValueFacade> getTaggedValues()
524    {
525        return this.getSuperFinalStateFacade().getTaggedValues();
526    }
527
528    /**
529     * Gets the dependencies for which this model element is the target.
530     * @see ModelElementFacade#getTargetDependencies()
531     */
532    public Collection<DependencyFacade> getTargetDependencies()
533    {
534        return this.getSuperFinalStateFacade().getTargetDependencies();
535    }
536
537    /**
538     * Get the template parameter for this model element having the parameterName
539     * @see ModelElementFacade#getTemplateParameter(String parameterName)
540     */
541    public Object getTemplateParameter(String parameterName)
542    {
543        return this.getSuperFinalStateFacade().getTemplateParameter(parameterName);
544    }
545
546    /**
547     * Get the template parameters for this model element
548     * @see ModelElementFacade#getTemplateParameters()
549     */
550    public Collection<TemplateParameterFacade> getTemplateParameters()
551    {
552        return this.getSuperFinalStateFacade().getTemplateParameters();
553    }
554
555    /**
556     * The visibility (i.e. public, private, protected or package) of the model element, will
557     * attempt a lookup for these values in the language mappings (if any).
558     * @see ModelElementFacade#getVisibility()
559     */
560    public String getVisibility()
561    {
562        return this.getSuperFinalStateFacade().getVisibility();
563    }
564
565    /**
566     * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
567     * is taken into account when searching for the stereotype), false otherwise.
568     * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
569     */
570    public boolean hasExactStereotype(String stereotypeName)
571    {
572        return this.getSuperFinalStateFacade().hasExactStereotype(stereotypeName);
573    }
574
575    /**
576     * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
577     * pipe, semicolon, or << >>
578     * @see ModelElementFacade#hasKeyword(String keywordName)
579     */
580    public boolean hasKeyword(String keywordName)
581    {
582        return this.getSuperFinalStateFacade().hasKeyword(keywordName);
583    }
584
585    /**
586     * Returns true if the model element has the specified stereotype.  If the stereotype itself
587     * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
588     * one of the stereotype's ancestors has a matching name this method will return true, false
589     * otherwise.
590     * For example, if we have a certain stereotype called <<exception>> and a model element has a
591     * stereotype called <<applicationException>> which extends <<exception>>, when calling this
592     * method with 'stereotypeName' defined as 'exception' the method would return true since
593     * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
594     * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
595     * @see ModelElementFacade#hasStereotype(String stereotypeName)
596     */
597    public boolean hasStereotype(String stereotypeName)
598    {
599        return this.getSuperFinalStateFacade().hasStereotype(stereotypeName);
600    }
601
602    /**
603     * True if there are target dependencies from this element that are instances of BindingFacade.
604     * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
605     * @see ModelElementFacade#isBindingDependenciesPresent()
606     */
607    public boolean isBindingDependenciesPresent()
608    {
609        return this.getSuperFinalStateFacade().isBindingDependenciesPresent();
610    }
611
612    /**
613     * Indicates if any constraints are present on this model element.
614     * @see ModelElementFacade#isConstraintsPresent()
615     */
616    public boolean isConstraintsPresent()
617    {
618        return this.getSuperFinalStateFacade().isConstraintsPresent();
619    }
620
621    /**
622     * Indicates if any documentation is present on this model element.
623     * @see ModelElementFacade#isDocumentationPresent()
624     */
625    public boolean isDocumentationPresent()
626    {
627        return this.getSuperFinalStateFacade().isDocumentationPresent();
628    }
629
630    /**
631     * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
632     * @see ModelElementFacade#isReservedWord()
633     */
634    public boolean isReservedWord()
635    {
636        return this.getSuperFinalStateFacade().isReservedWord();
637    }
638
639    /**
640     * True is there are template parameters on this model element. For UML2, applies to Class,
641     * Operation, Property, and Parameter.
642     * @see ModelElementFacade#isTemplateParametersPresent()
643     */
644    public boolean isTemplateParametersPresent()
645    {
646        return this.getSuperFinalStateFacade().isTemplateParametersPresent();
647    }
648
649    /**
650     * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
651     * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
652     * Enumerations and Interfaces, optionally applies on other model elements.
653     * @see ModelElementFacade#isValidIdentifierName()
654     */
655    public boolean isValidIdentifierName()
656    {
657        return this.getSuperFinalStateFacade().isValidIdentifierName();
658    }
659
660    /**
661     * Searches for the constraint with the specified 'name' on this model element, and if found
662     * translates it using the specified 'translation' from a translation library discovered by the
663     * framework.
664     * @see ModelElementFacade#translateConstraint(String name, String translation)
665     */
666    public String translateConstraint(String name, String translation)
667    {
668        return this.getSuperFinalStateFacade().translateConstraint(name, translation);
669    }
670
671    /**
672     * Translates all constraints belonging to this model element with the given 'translation'.
673     * @see ModelElementFacade#translateConstraints(String translation)
674     */
675    public String[] translateConstraints(String translation)
676    {
677        return this.getSuperFinalStateFacade().translateConstraints(translation);
678    }
679
680    /**
681     * Translates the constraints of the specified 'kind' belonging to this model element.
682     * @see ModelElementFacade#translateConstraints(String kind, String translation)
683     */
684    public String[] translateConstraints(String kind, String translation)
685    {
686        return this.getSuperFinalStateFacade().translateConstraints(kind, translation);
687    }
688
689    /**
690     * Events to which is being deferred in this action state.
691     * @see StateFacade#getDeferrableEvents()
692     */
693    public Collection<EventFacade> getDeferrableEvents()
694    {
695        return this.getSuperFinalStateFacade().getDeferrableEvents();
696    }
697
698    /**
699     * Models a situation during which some (usually implicit) invariant condition holds. The states
700     * of
701     * protocol state machines are exposed to the users of their context classifiers. A protocol
702     * state
703     * represents an exposed stable situation of its context classifier: when an instance of the
704     * classifier
705     * is not processing any operation, users of this instance can always know its state
706     * configuration.
707     * @see org.andromda.metafacades.uml.StateVertexFacade#getContainer()
708     */
709    public StateFacade getContainer()
710    {
711        return this.getSuperFinalStateFacade().getContainer();
712    }
713
714    /**
715     * A directed relationship between a source vertex and a target vertex. It may be part of a
716     * compound
717     * transition, which takes the state machine from one state configuration to another,
718     * representing the
719     * complete response of the state machine to an occurrence of an event of a particular type.
720     * @see org.andromda.metafacades.uml.StateVertexFacade#getIncomings()
721     */
722    public Collection<TransitionFacade> getIncomings()
723    {
724        return this.getSuperFinalStateFacade().getIncomings();
725    }
726
727    /**
728     * A directed relationship between a source vertex and a target vertex. It may be part of a
729     * compound
730     * transition, which takes the state machine from one state configuration to another,
731     * representing the
732     * complete response of the state machine to an occurrence of an event of a particular type.
733     * @see org.andromda.metafacades.uml.StateVertexFacade#getOutgoings()
734     */
735    public Collection<TransitionFacade> getOutgoings()
736    {
737        return this.getSuperFinalStateFacade().getOutgoings();
738    }
739
740    /**
741     * The partition (if any) to which this vertex belongs.
742     * @see org.andromda.metafacades.uml.StateVertexFacade#getPartition()
743     */
744    public PartitionFacade getPartition()
745    {
746        return this.getSuperFinalStateFacade().getPartition();
747    }
748
749    /**
750     * State machines can be used to express the behavior of part of a system. Behavior is modeled
751     * as a
752     * traversal of a graph of state nodes interconnected by one or more joined transition arcs that
753     * are
754     * triggered by the dispatching of series of (event) occurrences. During this traversal, the
755     * state
756     * machine executes a series of activities associated with various elements of the state
757     * machine.
758     * @see org.andromda.metafacades.uml.StateVertexFacade#getStateMachine()
759     */
760    public StateMachineFacade getStateMachine()
761    {
762        return this.getSuperFinalStateFacade().getStateMachine();
763    }
764
765    // ----------- delegates to FrontEndFinalState ------------
766    /**
767     * Parameters that are directly entering this final state, they will be able to survive a trip
768     * to the next use-case.
769     * @see FrontEndFinalState#getInterUseCaseParameters()
770     */
771    public List<FrontEndParameter> getInterUseCaseParameters()
772    {
773        return this.getSuperFrontEndFinalState().getInterUseCaseParameters();
774    }
775
776    /**
777     * The use case the final state is "targetting".
778     * @see FrontEndFinalState#getTargetUseCase()
779     */
780    public FrontEndUseCase getTargetUseCase()
781    {
782        return this.getSuperFrontEndFinalState().getTargetUseCase();
783    }
784
785    /**
786     * Indicates if this front end final state is contained within a FrontEndUseCase.
787     * @see FrontEndFinalState#isContainedInFrontEndUseCase()
788     */
789    public boolean isContainedInFrontEndUseCase()
790    {
791        return this.getSuperFrontEndFinalState().isContainedInFrontEndUseCase();
792    }
793
794    /**
795     * @see MetafacadeBase#initialize()
796     */
797    @Override
798    public void initialize()
799    {
800        this.getSuperFinalStateFacade().initialize();
801        this.getSuperFrontEndFinalState().initialize();
802    }
803
804    /**
805     * @return Object getSuperFinalStateFacade().getValidationOwner()
806     * @see MetafacadeBase#getValidationOwner()
807     */
808    @Override
809    public Object getValidationOwner()
810    {
811        Object owner = this.getSuperFinalStateFacade().getValidationOwner();
812        if (owner == null)
813        {
814            owner = this.getSuperFrontEndFinalState().getValidationOwner();
815        }
816        return owner;
817    }
818
819    /**
820     * @return String getSuperFinalStateFacade().getValidationName()
821     * @see MetafacadeBase#getValidationName()
822     */
823    @Override
824    public String getValidationName()
825    {
826        String name = this.getSuperFinalStateFacade().getValidationName();
827        if (name == null)
828        {
829            name = this.getSuperFrontEndFinalState().getValidationName();
830        }
831        return name;
832    }
833
834    /**
835     * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsFinalState::name must uniquely match usecase</p>
836     * <p><b>Error:</b> The name of this final state must not be null and exactly match the name of a use-case. Alternatively it is possible to reference a use-case using an hyperlink (some UML tools support this). In both cases that use-case MUST carry the FrontEndUseCase stereotype. Finally you may also specify an actual hyperlink to an external resource, either in the final state's name, or as a webpage link as supported by some UML tools.</p>
837     * <p><b>OCL:</b> context StrutsFinalState inv: fullPath->notEmpty()</p>
838     * @param validationMessages Collection<ModelValidationMessage>
839     * @see MetafacadeBase#validateInvariants(Collection validationMessages)
840     */
841    @Override
842    public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
843    {
844        this.getSuperFinalStateFacade().validateInvariants(validationMessages);
845        this.getSuperFrontEndFinalState().validateInvariants(validationMessages);
846        try
847        {
848            final Object contextElement = this.THIS();
849            boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.notEmpty(OCLIntrospector.invoke(contextElement,"fullPath")));
850            if (!constraintValid)
851            {
852                validationMessages.add(
853                    new ModelValidationMessage(
854                        (MetafacadeBase)contextElement ,
855                        "org::andromda::cartridges::bpm4struts::metafacades::StrutsFinalState::name must uniquely match usecase",
856                        "The name of this final state must not be null and exactly match the name of a use-case. Alternatively it is possible to reference a use-case using an hyperlink (some UML tools support this). In both cases that use-case MUST carry the FrontEndUseCase stereotype. Finally you may also specify an actual hyperlink to an external resource, either in the final state's name, or as a webpage link as supported by some UML tools."));
857            }
858        }
859        catch (Throwable th)
860        {
861            Throwable cause = th.getCause();
862            int depth = 0; // Some throwables have infinite recursion
863            while (cause != null && depth < 7)
864            {
865                th = cause;
866                depth++;
867            }
868            logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsFinalState::name must uniquely match usecase' ON "
869                + this.THIS().toString() + ": " + th.getMessage(), th);
870        }
871    }
872
873    /**
874     * The property that stores the name of the metafacade.
875     */
876    private static final String NAME_PROPERTY = "name";
877    private static final String FQNAME_PROPERTY = "fullyQualifiedName";
878
879    /**
880     * @see Object#toString()
881     */
882    @Override
883    public String toString()
884    {
885        final StringBuilder toString = new StringBuilder(this.getClass().getName());
886        toString.append("[");
887        try
888        {
889            toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
890        }
891        catch (final Throwable tryAgain)
892        {
893            try
894            {
895                toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
896            }
897            catch (final Throwable ignore)
898            {
899                // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
900            }
901        }
902        toString.append("]");
903        return toString.toString();
904    }
905}