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.AssociationEndFacade;
014import org.andromda.metafacades.uml.AttributeFacade;
015import org.andromda.metafacades.uml.ClassifierFacade;
016import org.andromda.metafacades.uml.ConstraintFacade;
017import org.andromda.metafacades.uml.DependencyFacade;
018import org.andromda.metafacades.uml.FrontEndAction;
019import org.andromda.metafacades.uml.FrontEndController;
020import org.andromda.metafacades.uml.FrontEndUseCase;
021import org.andromda.metafacades.uml.GeneralizableElementFacade;
022import org.andromda.metafacades.uml.GeneralizationFacade;
023import org.andromda.metafacades.uml.ModelElementFacade;
024import org.andromda.metafacades.uml.ModelFacade;
025import org.andromda.metafacades.uml.OperationFacade;
026import org.andromda.metafacades.uml.PackageFacade;
027import org.andromda.metafacades.uml.StateMachineFacade;
028import org.andromda.metafacades.uml.StereotypeFacade;
029import org.andromda.metafacades.uml.TaggedValueFacade;
030import org.andromda.metafacades.uml.TemplateParameterFacade;
031import org.andromda.metafacades.uml.TypeMappings;
032import org.andromda.translation.ocl.validation.OCLCollections;
033import org.andromda.translation.ocl.validation.OCLExpressions;
034import org.andromda.translation.ocl.validation.OCLIntrospector;
035import org.andromda.translation.ocl.validation.OCLResultEnsurer;
036import org.apache.commons.collections.Transformer;
037import org.apache.log4j.Logger;
038
039/**
040 * A controller is assigned as the context of a use-case. All manual implementation is done in the
041 * controller as Struts actions may result in derferring method calls to this controller.
042 * MetafacadeLogic for StrutsController
043 *
044 * @see StrutsController
045 */
046public abstract class StrutsControllerLogic
047    extends MetafacadeBase
048    implements StrutsController
049{
050    /**
051     * The underlying UML object
052     * @see Object
053     */
054    protected Object metaObject;
055
056    /** Create Metafacade implementation instance using the MetafacadeFactory from the context
057     * @param metaObjectIn
058     * @param context
059     */
060    protected StrutsControllerLogic(Object metaObjectIn, String context)
061    {
062        super(metaObjectIn, getContext(context));
063        this.superFrontEndController =
064           (FrontEndController)
065            MetafacadeFactory.getInstance().createFacadeImpl(
066                    "org.andromda.metafacades.uml.FrontEndController",
067                    metaObjectIn,
068                    getContext(context));
069        this.metaObject = metaObjectIn;
070    }
071
072    /**
073     * The logger instance.
074     */
075    private static final Logger logger = Logger.getLogger(StrutsControllerLogic.class);
076
077    /**
078     * Gets the context for this metafacade logic instance.
079     * @param context String. Set to StrutsController if null
080     * @return context String
081     */
082    private static String getContext(String context)
083    {
084        if (context == null)
085        {
086            context = "org.andromda.cartridges.bpm4struts.metafacades.StrutsController";
087        }
088        return context;
089    }
090
091    private FrontEndController superFrontEndController;
092    private boolean superFrontEndControllerInitialized = false;
093
094    /**
095     * Gets the FrontEndController parent instance.
096     * @return this.superFrontEndController FrontEndController
097     */
098    private FrontEndController getSuperFrontEndController()
099    {
100        if (!this.superFrontEndControllerInitialized)
101        {
102            ((MetafacadeBase)this.superFrontEndController).setMetafacadeContext(this.getMetafacadeContext());
103            this.superFrontEndControllerInitialized = true;
104        }
105        return this.superFrontEndController;
106    }
107
108    /** Reset context only for non-root metafacades
109     * @param context
110     * @see MetafacadeBase#resetMetafacadeContext(String context)
111     */
112    @Override
113    public void resetMetafacadeContext(String context)
114    {
115        if (!this.contextRoot) // reset context only for non-root metafacades
116        {
117            context = getContext(context);  // to have same value as in original constructor call
118            setMetafacadeContext (context);
119            if (this.superFrontEndControllerInitialized)
120            {
121                ((MetafacadeBase)this.superFrontEndController).resetMetafacadeContext(context);
122            }
123        }
124    }
125
126    /**
127     * @return boolean true always
128     * @see StrutsController
129     */
130    public boolean isStrutsControllerMetaType()
131    {
132        return true;
133    }
134
135    // --------------- attributes ---------------------
136
137   /**
138    * @see org.andromda.cartridges.bpm4struts.metafacades.StrutsController#getFullPath()
139    * @return String
140    */
141    protected abstract String handleGetFullPath();
142
143    /**
144     * The full path to this controller (that is the full file system path made up from the package
145     * and name).
146     * @return (String)handleGetFullPath()
147     */
148    public final String getFullPath()
149    {
150        String fullPath1a = null;
151        // fullPath has no pre constraints
152        fullPath1a = handleGetFullPath();
153        // fullPath has no post constraints
154        return fullPath1a;
155    }
156
157    // ------------- associations ------------------
158
159    private List<StrutsSessionObject> __getSessionObjects1r;
160    private boolean __getSessionObjects1rSet = false;
161
162    /**
163     * A controller is assigned as the context of a use-case. All manual implementation is done in
164     * the
165     * controller as Struts actions may result in derferring method calls to this controller.
166     * @return (List<StrutsSessionObject>)handleGetSessionObjects()
167     */
168    public final List<StrutsSessionObject> getSessionObjects()
169    {
170        List<StrutsSessionObject> getSessionObjects1r = this.__getSessionObjects1r;
171        if (!this.__getSessionObjects1rSet)
172        {
173            // strutsController has no pre constraints
174            List result = handleGetSessionObjects();
175            List shieldedResult = this.shieldedElements(result);
176            try
177            {
178                getSessionObjects1r = (List<StrutsSessionObject>)shieldedResult;
179            }
180            catch (ClassCastException ex)
181            {
182                // Bad things happen if the metafacade type mapping in metafacades.xml is wrong - Warn
183                StrutsControllerLogic.logger.warn("incorrect metafacade cast for StrutsControllerLogic.getSessionObjects List<StrutsSessionObject> " + result + ": " + shieldedResult);
184            }
185            // strutsController has no post constraints
186            this.__getSessionObjects1r = getSessionObjects1r;
187            if (isMetafacadePropertyCachingEnabled())
188            {
189                this.__getSessionObjects1rSet = true;
190            }
191        }
192        return getSessionObjects1r;
193    }
194
195    /**
196     * UML Specific type is returned in Collection, transformed by shieldedElements to AndroMDA Metafacade type
197     * @return  List
198     */
199    protected abstract List handleGetSessionObjects();
200
201    private List<StrutsParameter> __getAllArguments2r;
202    private boolean __getAllArguments2rSet = false;
203
204    /**
205     * A controller is assigned as the context of a use-case. All manual implementation is done in
206     * the
207     * controller as Struts actions may result in derferring method calls to this controller.
208     * @return (List<StrutsParameter>)handleGetAllArguments()
209     */
210    public final List<StrutsParameter> getAllArguments()
211    {
212        List<StrutsParameter> getAllArguments2r = this.__getAllArguments2r;
213        if (!this.__getAllArguments2rSet)
214        {
215            // strutsController has no pre constraints
216            List result = handleGetAllArguments();
217            List shieldedResult = this.shieldedElements(result);
218            try
219            {
220                getAllArguments2r = (List<StrutsParameter>)shieldedResult;
221            }
222            catch (ClassCastException ex)
223            {
224                // Bad things happen if the metafacade type mapping in metafacades.xml is wrong - Warn
225                StrutsControllerLogic.logger.warn("incorrect metafacade cast for StrutsControllerLogic.getAllArguments List<StrutsParameter> " + result + ": " + shieldedResult);
226            }
227            // strutsController has no post constraints
228            this.__getAllArguments2r = getAllArguments2r;
229            if (isMetafacadePropertyCachingEnabled())
230            {
231                this.__getAllArguments2rSet = true;
232            }
233        }
234        return getAllArguments2r;
235    }
236
237    /**
238     * UML Specific type is returned in Collection, transformed by shieldedElements to AndroMDA Metafacade type
239     * @return  List
240     */
241    protected abstract List handleGetAllArguments();
242
243    /**
244     * @return true
245     * @see FrontEndController
246     */
247    public boolean isFrontEndControllerMetaType()
248    {
249        return true;
250    }
251
252    /**
253     * @return true
254     * @see ClassifierFacade
255     */
256    public boolean isClassifierFacadeMetaType()
257    {
258        return true;
259    }
260
261    /**
262     * @return true
263     * @see GeneralizableElementFacade
264     */
265    public boolean isGeneralizableElementFacadeMetaType()
266    {
267        return true;
268    }
269
270    /**
271     * @return true
272     * @see ModelElementFacade
273     */
274    public boolean isModelElementFacadeMetaType()
275    {
276        return true;
277    }
278
279    // ----------- delegates to FrontEndController ------------
280    /**
281     * Return the attribute which name matches the parameter
282     * @see ClassifierFacade#findAttribute(String name)
283     */
284    public AttributeFacade findAttribute(String name)
285    {
286        return this.getSuperFrontEndController().findAttribute(name);
287    }
288
289    /**
290     * Those abstraction dependencies for which this classifier is the client.
291     * @see ClassifierFacade#getAbstractions()
292     */
293    public Collection<ClassifierFacade> getAbstractions()
294    {
295        return this.getSuperFrontEndController().getAbstractions();
296    }
297
298    /**
299     * Lists all classes associated to this one and any ancestor classes (through generalization).
300     * There will be no duplicates. The order of the elements is predictable.
301     * @see ClassifierFacade#getAllAssociatedClasses()
302     */
303    public Collection<ClassifierFacade> getAllAssociatedClasses()
304    {
305        return this.getSuperFrontEndController().getAllAssociatedClasses();
306    }
307
308    /**
309     * A collection containing all 'properties' of the classifier and its ancestors.  Properties are
310     * any attributes and navigable connecting association ends.
311     * @see ClassifierFacade#getAllProperties()
312     */
313    public Collection<ModelElementFacade> getAllProperties()
314    {
315        return this.getSuperFrontEndController().getAllProperties();
316    }
317
318    /**
319     * A collection containing all required and/or read-only 'properties' of the classifier and its
320     * ancestors. Properties are any attributes and navigable connecting association ends.
321     * @see ClassifierFacade#getAllRequiredConstructorParameters()
322     */
323    public Collection<ModelElementFacade> getAllRequiredConstructorParameters()
324    {
325        return this.getSuperFrontEndController().getAllRequiredConstructorParameters();
326    }
327
328    /**
329     * Gets the array type for this classifier.  If this classifier already represents an array, it
330     * just returns itself.
331     * @see ClassifierFacade#getArray()
332     */
333    public ClassifierFacade getArray()
334    {
335        return this.getSuperFrontEndController().getArray();
336    }
337
338    /**
339     * The name of the classifier as an array.
340     * @see ClassifierFacade#getArrayName()
341     */
342    public String getArrayName()
343    {
344        return this.getSuperFrontEndController().getArrayName();
345    }
346
347    /**
348     * Lists the classes associated to this one, there is no repitition of classes. The order of the
349     * elements is predictable.
350     * @see ClassifierFacade#getAssociatedClasses()
351     */
352    public Collection<ClassifierFacade> getAssociatedClasses()
353    {
354        return this.getSuperFrontEndController().getAssociatedClasses();
355    }
356
357    /**
358     * Gets the association ends belonging to a classifier.
359     * @see ClassifierFacade#getAssociationEnds()
360     */
361    public List<AssociationEndFacade> getAssociationEnds()
362    {
363        return this.getSuperFrontEndController().getAssociationEnds();
364    }
365
366    /**
367     * Gets the attributes that belong to the classifier.
368     * @see ClassifierFacade#getAttributes()
369     */
370    public List<AttributeFacade> getAttributes()
371    {
372        return this.getSuperFrontEndController().getAttributes();
373    }
374
375    /**
376     * Gets all attributes for the classifier and if 'follow' is true goes up the inheritance
377     * hierarchy and gets the attributes from the super classes as well.
378     * @see ClassifierFacade#getAttributes(boolean follow)
379     */
380    public List<AttributeFacade> getAttributes(boolean follow)
381    {
382        return this.getSuperFrontEndController().getAttributes(follow);
383    }
384
385    /**
386     * The fully qualified name of the classifier as an array.
387     * @see ClassifierFacade#getFullyQualifiedArrayName()
388     */
389    public String getFullyQualifiedArrayName()
390    {
391        return this.getSuperFrontEndController().getFullyQualifiedArrayName();
392    }
393
394    /**
395     * Returns all those operations that could be implemented at this classifier's level. This means
396     * the operations owned by this classifier as well as any realized interface's operations
397     * (recursively) in case this classifier itself is not already an interface, or generalized when
398     * this classifier is an interface.
399     * @see ClassifierFacade#getImplementationOperations()
400     */
401    public Collection<OperationFacade> getImplementationOperations()
402    {
403        return this.getSuperFrontEndController().getImplementationOperations();
404    }
405
406    /**
407     * A comma separated list of the fully qualified names of all implemented interfaces.
408     * @see ClassifierFacade#getImplementedInterfaceList()
409     */
410    public String getImplementedInterfaceList()
411    {
412        return this.getSuperFrontEndController().getImplementedInterfaceList();
413    }
414
415    /**
416     * Those attributes that are scoped to an instance of this class.
417     * @see ClassifierFacade#getInstanceAttributes()
418     */
419    public Collection<AttributeFacade> getInstanceAttributes()
420    {
421        return this.getSuperFrontEndController().getInstanceAttributes();
422    }
423
424    /**
425     * Those operations that are scoped to an instance of this class.
426     * @see ClassifierFacade#getInstanceOperations()
427     */
428    public List<OperationFacade> getInstanceOperations()
429    {
430        return this.getSuperFrontEndController().getInstanceOperations();
431    }
432
433    /**
434     * Those interfaces that are abstractions of this classifier, this basically means this
435     * classifier realizes them.
436     * @see ClassifierFacade#getInterfaceAbstractions()
437     */
438    public Collection<ClassifierFacade> getInterfaceAbstractions()
439    {
440        return this.getSuperFrontEndController().getInterfaceAbstractions();
441    }
442
443    /**
444     * A String representing a new Constructor declaration for this classifier type to be used in a
445     * Java environment.
446     * @see ClassifierFacade#getJavaNewString()
447     */
448    public String getJavaNewString()
449    {
450        return this.getSuperFrontEndController().getJavaNewString();
451    }
452
453    /**
454     * A String representing the null-value for this classifier type to be used in a Java
455     * environment.
456     * @see ClassifierFacade#getJavaNullString()
457     */
458    public String getJavaNullString()
459    {
460        return this.getSuperFrontEndController().getJavaNullString();
461    }
462
463    /**
464     * The other ends of this classifier's association ends which are navigable.
465     * @see ClassifierFacade#getNavigableConnectingEnds()
466     */
467    public Collection<AssociationEndFacade> getNavigableConnectingEnds()
468    {
469        return this.getSuperFrontEndController().getNavigableConnectingEnds();
470    }
471
472    /**
473     * Get the other ends of this classifier's association ends which are navigable and if 'follow'
474     * is true goes up the inheritance hierarchy and gets the super association ends as well.
475     * @see ClassifierFacade#getNavigableConnectingEnds(boolean follow)
476     */
477    public List<AssociationEndFacade> getNavigableConnectingEnds(boolean follow)
478    {
479        return this.getSuperFrontEndController().getNavigableConnectingEnds(follow);
480    }
481
482    /**
483     * Assuming that the classifier is an array, this will return the non array type of the
484     * classifier from
485     * the model.  If the classifier is NOT an array, it will just return itself.
486     * @see ClassifierFacade#getNonArray()
487     */
488    public ClassifierFacade getNonArray()
489    {
490        return this.getSuperFrontEndController().getNonArray();
491    }
492
493    /**
494     * The attributes from this classifier in the form of an operation call (this example would be
495     * in Java): '(String attributeOne, String attributeTwo).  If there were no attributes on the
496     * classifier, the result would be an empty '()'.
497     * @see ClassifierFacade#getOperationCallFromAttributes()
498     */
499    public String getOperationCallFromAttributes()
500    {
501        return this.getSuperFrontEndController().getOperationCallFromAttributes();
502    }
503
504    /**
505     * The operations owned by this classifier.
506     * @see ClassifierFacade#getOperations()
507     */
508    public List<OperationFacade> getOperations()
509    {
510        return this.getSuperFrontEndController().getOperations();
511    }
512
513    /**
514     * A collection containing all 'properties' of the classifier.  Properties are any attributes
515     * and navigable connecting association ends.
516     * @see ClassifierFacade#getProperties()
517     */
518    public List<ModelElementFacade> getProperties()
519    {
520        return this.getSuperFrontEndController().getProperties();
521    }
522
523    /**
524     * Gets all properties (attributes and navigable association ends) for the classifier and if
525     * 'follow' is true goes up the inheritance hierarchy and gets the properties from the super
526     * classes as well.
527     * @see ClassifierFacade#getProperties(boolean follow)
528     */
529    public List getProperties(boolean follow)
530    {
531        return this.getSuperFrontEndController().getProperties(follow);
532    }
533
534    /**
535     * A collection containing all required and/or read-only 'properties' of the classifier. 
536     * Properties are any attributes and navigable connecting association ends.
537     * @see ClassifierFacade#getRequiredConstructorParameters()
538     */
539    public Collection<ModelElementFacade> getRequiredConstructorParameters()
540    {
541        return this.getSuperFrontEndController().getRequiredConstructorParameters();
542    }
543
544    /**
545     * Returns the serial version UID of the underlying model element.
546     * @see ClassifierFacade#getSerialVersionUID()
547     */
548    public long getSerialVersionUID()
549    {
550        return this.getSuperFrontEndController().getSerialVersionUID();
551    }
552
553    /**
554     * Those attributes that are scoped to the definition of this class.
555     * @see ClassifierFacade#getStaticAttributes()
556     */
557    public Collection<AttributeFacade> getStaticAttributes()
558    {
559        return this.getSuperFrontEndController().getStaticAttributes();
560    }
561
562    /**
563     * Those operations that are scoped to the definition of this class.
564     * @see ClassifierFacade#getStaticOperations()
565     */
566    public List<OperationFacade> getStaticOperations()
567    {
568        return this.getSuperFrontEndController().getStaticOperations();
569    }
570
571    /**
572     * This class' superclass, returns the generalization if it is a ClassifierFacade, null
573     * otherwise.
574     * @see ClassifierFacade#getSuperClass()
575     */
576    public ClassifierFacade getSuperClass()
577    {
578        return this.getSuperFrontEndController().getSuperClass();
579    }
580
581    /**
582     * The wrapper name for this classifier if a mapped type has a defined wrapper class (ie. 'long'
583     * maps to 'Long').  If the classifier doesn't have a wrapper defined for it, this method will
584     * return a null.  Note that wrapper mappings must be defined for the namespace by defining the
585     * 'wrapperMappingsUri', this property must point to the location of the mappings file which
586     * maps the primitives to wrapper types.
587     * @see ClassifierFacade#getWrapperName()
588     */
589    public String getWrapperName()
590    {
591        return this.getSuperFrontEndController().getWrapperName();
592    }
593
594    /**
595     * Indicates if this classifier is 'abstract'.
596     * @see ClassifierFacade#isAbstract()
597     */
598    public boolean isAbstract()
599    {
600        return this.getSuperFrontEndController().isAbstract();
601    }
602
603    /**
604     * True if this classifier represents an array type. False otherwise.
605     * @see ClassifierFacade#isArrayType()
606     */
607    public boolean isArrayType()
608    {
609        return this.getSuperFrontEndController().isArrayType();
610    }
611
612    /**
613     * True if the ClassifierFacade is an AssociationClass.
614     * @see ClassifierFacade#isAssociationClass()
615     */
616    public boolean isAssociationClass()
617    {
618        return this.getSuperFrontEndController().isAssociationClass();
619    }
620
621    /**
622     * Returns true if this type represents a Blob type.
623     * @see ClassifierFacade#isBlobType()
624     */
625    public boolean isBlobType()
626    {
627        return this.getSuperFrontEndController().isBlobType();
628    }
629
630    /**
631     * Indicates if this type represents a boolean type or not.
632     * @see ClassifierFacade#isBooleanType()
633     */
634    public boolean isBooleanType()
635    {
636        return this.getSuperFrontEndController().isBooleanType();
637    }
638
639    /**
640     * Indicates if this type represents a char, Character, or java.lang.Character type or not.
641     * @see ClassifierFacade#isCharacterType()
642     */
643    public boolean isCharacterType()
644    {
645        return this.getSuperFrontEndController().isCharacterType();
646    }
647
648    /**
649     * Returns true if this type represents a Clob type.
650     * @see ClassifierFacade#isClobType()
651     */
652    public boolean isClobType()
653    {
654        return this.getSuperFrontEndController().isClobType();
655    }
656
657    /**
658     * True if this classifier represents a collection type. False otherwise.
659     * @see ClassifierFacade#isCollectionType()
660     */
661    public boolean isCollectionType()
662    {
663        return this.getSuperFrontEndController().isCollectionType();
664    }
665
666    /**
667     * True/false depending on whether or not this classifier represents a datatype. A data type is
668     * a type whose instances are identified only by their value. A data type may contain attributes
669     * to support the modeling of structured data types.
670     * @see ClassifierFacade#isDataType()
671     */
672    public boolean isDataType()
673    {
674        return this.getSuperFrontEndController().isDataType();
675    }
676
677    /**
678     * True when this classifier is a date type.
679     * @see ClassifierFacade#isDateType()
680     */
681    public boolean isDateType()
682    {
683        return this.getSuperFrontEndController().isDateType();
684    }
685
686    /**
687     * Indicates if this type represents a Double type or not.
688     * @see ClassifierFacade#isDoubleType()
689     */
690    public boolean isDoubleType()
691    {
692        return this.getSuperFrontEndController().isDoubleType();
693    }
694
695    /**
696     * Indicates whether or not this classifier represents an "EmbeddedValue'.
697     * @see ClassifierFacade#isEmbeddedValue()
698     */
699    public boolean isEmbeddedValue()
700    {
701        return this.getSuperFrontEndController().isEmbeddedValue();
702    }
703
704    /**
705     * True if this classifier is in fact marked as an enumeration.
706     * @see ClassifierFacade#isEnumeration()
707     */
708    public boolean isEnumeration()
709    {
710        return this.getSuperFrontEndController().isEnumeration();
711    }
712
713    /**
714     * Returns true if this type represents a 'file' type.
715     * @see ClassifierFacade#isFileType()
716     */
717    public boolean isFileType()
718    {
719        return this.getSuperFrontEndController().isFileType();
720    }
721
722    /**
723     * Indicates if this type represents a Float type or not.
724     * @see ClassifierFacade#isFloatType()
725     */
726    public boolean isFloatType()
727    {
728        return this.getSuperFrontEndController().isFloatType();
729    }
730
731    /**
732     * Indicates if this type represents an int or Integer or java.lang.Integer type or not.
733     * @see ClassifierFacade#isIntegerType()
734     */
735    public boolean isIntegerType()
736    {
737        return this.getSuperFrontEndController().isIntegerType();
738    }
739
740    /**
741     * True/false depending on whether or not this Classifier represents an interface.
742     * @see ClassifierFacade#isInterface()
743     */
744    public boolean isInterface()
745    {
746        return this.getSuperFrontEndController().isInterface();
747    }
748
749    /**
750     * True if this classifier cannot be extended and represent a leaf in the inheritance tree.
751     * @see ClassifierFacade#isLeaf()
752     */
753    public boolean isLeaf()
754    {
755        return this.getSuperFrontEndController().isLeaf();
756    }
757
758    /**
759     * True if this classifier represents a list type. False otherwise.
760     * @see ClassifierFacade#isListType()
761     */
762    public boolean isListType()
763    {
764        return this.getSuperFrontEndController().isListType();
765    }
766
767    /**
768     * Indicates if this type represents a Long type or not.
769     * @see ClassifierFacade#isLongType()
770     */
771    public boolean isLongType()
772    {
773        return this.getSuperFrontEndController().isLongType();
774    }
775
776    /**
777     * Indicates whether or not this classifier represents a Map type.
778     * @see ClassifierFacade#isMapType()
779     */
780    public boolean isMapType()
781    {
782        return this.getSuperFrontEndController().isMapType();
783    }
784
785    /**
786     * Indicates whether or not this classifier represents a primitive type.
787     * @see ClassifierFacade#isPrimitive()
788     */
789    public boolean isPrimitive()
790    {
791        return this.getSuperFrontEndController().isPrimitive();
792    }
793
794    /**
795     * True if this classifier represents a set type. False otherwise.
796     * @see ClassifierFacade#isSetType()
797     */
798    public boolean isSetType()
799    {
800        return this.getSuperFrontEndController().isSetType();
801    }
802
803    /**
804     * Indicates whether or not this classifier represents a string type.
805     * @see ClassifierFacade#isStringType()
806     */
807    public boolean isStringType()
808    {
809        return this.getSuperFrontEndController().isStringType();
810    }
811
812    /**
813     * Indicates whether or not this classifier represents a time type.
814     * @see ClassifierFacade#isTimeType()
815     */
816    public boolean isTimeType()
817    {
818        return this.getSuperFrontEndController().isTimeType();
819    }
820
821    /**
822     * Returns true if this type is a wrapped primitive type.
823     * @see ClassifierFacade#isWrappedPrimitive()
824     */
825    public boolean isWrappedPrimitive()
826    {
827        return this.getSuperFrontEndController().isWrappedPrimitive();
828    }
829
830    /**
831     * All actions that defer to at least one operation of this controller.
832     * @see FrontEndController#getDeferringActions()
833     */
834    public List<FrontEndAction> getDeferringActions()
835    {
836        return this.getSuperFrontEndController().getDeferringActions();
837    }
838
839    /**
840     * Returns all back-end services referenced by this controller.
841     * @see FrontEndController#getServiceReferences()
842     */
843    public List<DependencyFacade> getServiceReferences()
844    {
845        return this.getSuperFrontEndController().getServiceReferences();
846    }
847
848    /**
849     * Returns the use-case "controlled" by this controller.
850     * @see FrontEndController#getUseCase()
851     */
852    public FrontEndUseCase getUseCase()
853    {
854        return this.getSuperFrontEndController().getUseCase();
855    }
856
857    /**
858     * Finds the tagged value optional searching the entire inheritance hierarchy if 'follow' is set
859     * to true.
860     * @see GeneralizableElementFacade#findTaggedValue(String tagName, boolean follow)
861     */
862    public Object findTaggedValue(String tagName, boolean follow)
863    {
864        return this.getSuperFrontEndController().findTaggedValue(tagName, follow);
865    }
866
867    /**
868     * All generalizations for this generalizable element, goes up the inheritance tree.
869     * @see GeneralizableElementFacade#getAllGeneralizations()
870     */
871    public Collection<GeneralizableElementFacade> getAllGeneralizations()
872    {
873        return this.getSuperFrontEndController().getAllGeneralizations();
874    }
875
876    /**
877     * All specializations (travels down the inheritance hierarchy).
878     * @see GeneralizableElementFacade#getAllSpecializations()
879     */
880    public Collection<GeneralizableElementFacade> getAllSpecializations()
881    {
882        return this.getSuperFrontEndController().getAllSpecializations();
883    }
884
885    /**
886     * Gets the direct generalization for this generalizable element.
887     * @see GeneralizableElementFacade#getGeneralization()
888     */
889    public GeneralizableElementFacade getGeneralization()
890    {
891        return this.getSuperFrontEndController().getGeneralization();
892    }
893
894    /**
895     * Gets the actual links that this generalization element is part of (it plays either the
896     * specialization or generalization).
897     * @see GeneralizableElementFacade#getGeneralizationLinks()
898     */
899    public Collection<GeneralizationFacade> getGeneralizationLinks()
900    {
901        return this.getSuperFrontEndController().getGeneralizationLinks();
902    }
903
904    /**
905     * A comma separated list of the fully qualified names of all generalizations.
906     * @see GeneralizableElementFacade#getGeneralizationList()
907     */
908    public String getGeneralizationList()
909    {
910        return this.getSuperFrontEndController().getGeneralizationList();
911    }
912
913    /**
914     * The element found when you recursively follow the generalization path up to the root. If an
915     * element has no generalization itself will be considered the root.
916     * @see GeneralizableElementFacade#getGeneralizationRoot()
917     */
918    public GeneralizableElementFacade getGeneralizationRoot()
919    {
920        return this.getSuperFrontEndController().getGeneralizationRoot();
921    }
922
923    /**
924     * Return all generalizations (ancestors) from this generalizable element.
925     * @see GeneralizableElementFacade#getGeneralizations()
926     */
927    public Collection<GeneralizableElementFacade> getGeneralizations()
928    {
929        return this.getSuperFrontEndController().getGeneralizations();
930    }
931
932    /**
933     * Gets the direct specializations (i.e. sub elements) for this generalizatble element.
934     * @see GeneralizableElementFacade#getSpecializations()
935     */
936    public Collection<GeneralizableElementFacade> getSpecializations()
937    {
938        return this.getSuperFrontEndController().getSpecializations();
939    }
940
941    /**
942     * Copies all tagged values from the given ModelElementFacade to this model element facade.
943     * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
944     */
945    public void copyTaggedValues(ModelElementFacade element)
946    {
947        this.getSuperFrontEndController().copyTaggedValues(element);
948    }
949
950    /**
951     * Finds the tagged value with the specified 'tagName'. In case there are more values the first
952     * one found will be returned.
953     * @see ModelElementFacade#findTaggedValue(String tagName)
954     */
955    public Object findTaggedValue(String tagName)
956    {
957        return this.getSuperFrontEndController().findTaggedValue(tagName);
958    }
959
960    /**
961     * Returns all the values for the tagged value with the specified name. The returned collection
962     * will contains only String instances, or will be empty. Never null.
963     * @see ModelElementFacade#findTaggedValues(String tagName)
964     */
965    public Collection<Object> findTaggedValues(String tagName)
966    {
967        return this.getSuperFrontEndController().findTaggedValues(tagName);
968    }
969
970    /**
971     * Returns the fully qualified name of the model element. The fully qualified name includes
972     * complete package qualified name of the underlying model element. The templates parameter will
973     * be replaced by the correct one given the binding relation of the parameter to this element.
974     * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
975     */
976    public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
977    {
978        return this.getSuperFrontEndController().getBindedFullyQualifiedName(bindedElement);
979    }
980
981    /**
982     * Gets all constraints belonging to the model element.
983     * @see ModelElementFacade#getConstraints()
984     */
985    public Collection<ConstraintFacade> getConstraints()
986    {
987        return this.getSuperFrontEndController().getConstraints();
988    }
989
990    /**
991     * Returns the constraints of the argument kind that have been placed onto this model. Typical
992     * kinds are "inv", "pre" and "post". Other kinds are possible.
993     * @see ModelElementFacade#getConstraints(String kind)
994     */
995    public Collection<ConstraintFacade> getConstraints(String kind)
996    {
997        return this.getSuperFrontEndController().getConstraints(kind);
998    }
999
1000    /**
1001     * Gets the documentation for the model element, The indent argument is prefixed to each line.
1002     * By default this method wraps lines after 64 characters.
1003     * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
1004     * @see ModelElementFacade#getDocumentation(String indent)
1005     */
1006    public String getDocumentation(String indent)
1007    {
1008        return this.getSuperFrontEndController().getDocumentation(indent);
1009    }
1010
1011    /**
1012     * This method returns the documentation for this model element, with the lines wrapped after
1013     * the specified number of characters, values of less than 1 will indicate no line wrapping is
1014     * required. By default paragraphs are returned as HTML.
1015     * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
1016     * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
1017     */
1018    public String getDocumentation(String indent, int lineLength)
1019    {
1020        return this.getSuperFrontEndController().getDocumentation(indent, lineLength);
1021    }
1022
1023    /**
1024     * This method returns the documentation for this model element, with the lines wrapped after
1025     * the specified number of characters, values of less than 1 will indicate no line wrapping is
1026     * required. HTML style determines if HTML Escaping is applied.
1027     * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
1028     */
1029    public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
1030    {
1031        return this.getSuperFrontEndController().getDocumentation(indent, lineLength, htmlStyle);
1032    }
1033
1034    /**
1035     * The fully qualified name of this model element.
1036     * @see ModelElementFacade#getFullyQualifiedName()
1037     */
1038    public String getFullyQualifiedName()
1039    {
1040        return this.getSuperFrontEndController().getFullyQualifiedName();
1041    }
1042
1043    /**
1044     * Returns the fully qualified name of the model element. The fully qualified name includes
1045     * complete package qualified name of the underlying model element.  If modelName is true, then
1046     * the original name of the model element (the name contained within the model) will be the name
1047     * returned, otherwise a name from a language mapping will be returned.
1048     * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
1049     */
1050    public String getFullyQualifiedName(boolean modelName)
1051    {
1052        return this.getSuperFrontEndController().getFullyQualifiedName(modelName);
1053    }
1054
1055    /**
1056     * Returns the fully qualified name as a path, the returned value always starts with out a slash
1057     * '/'.
1058     * @see ModelElementFacade#getFullyQualifiedNamePath()
1059     */
1060    public String getFullyQualifiedNamePath()
1061    {
1062        return this.getSuperFrontEndController().getFullyQualifiedNamePath();
1063    }
1064
1065    /**
1066     * Gets the unique identifier of the underlying model element.
1067     * @see ModelElementFacade#getId()
1068     */
1069    public String getId()
1070    {
1071        return this.getSuperFrontEndController().getId();
1072    }
1073
1074    /**
1075     * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
1076     * are not represented by other properties, i.e. native, transient, volatile, synchronized,
1077     * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
1078     * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
1079     * JDK5 compiler level.
1080     * @see ModelElementFacade#getKeywords()
1081     */
1082    public Collection<String> getKeywords()
1083    {
1084        return this.getSuperFrontEndController().getKeywords();
1085    }
1086
1087    /**
1088     * UML2: Retrieves a localized label for this named element.
1089     * @see ModelElementFacade#getLabel()
1090     */
1091    public String getLabel()
1092    {
1093        return this.getSuperFrontEndController().getLabel();
1094    }
1095
1096    /**
1097     * The language mappings that have been set for this model element.
1098     * @see ModelElementFacade#getLanguageMappings()
1099     */
1100    public TypeMappings getLanguageMappings()
1101    {
1102        return this.getSuperFrontEndController().getLanguageMappings();
1103    }
1104
1105    /**
1106     * Return the model containing this model element (multiple models may be loaded and processed
1107     * at the same time).
1108     * @see ModelElementFacade#getModel()
1109     */
1110    public ModelFacade getModel()
1111    {
1112        return this.getSuperFrontEndController().getModel();
1113    }
1114
1115    /**
1116     * The name of the model element.
1117     * @see ModelElementFacade#getName()
1118     */
1119    public String getName()
1120    {
1121        return this.getSuperFrontEndController().getName();
1122    }
1123
1124    /**
1125     * Gets the package to which this model element belongs.
1126     * @see ModelElementFacade#getPackage()
1127     */
1128    public ModelElementFacade getPackage()
1129    {
1130        return this.getSuperFrontEndController().getPackage();
1131    }
1132
1133    /**
1134     * The name of this model element's package.
1135     * @see ModelElementFacade#getPackageName()
1136     */
1137    public String getPackageName()
1138    {
1139        return this.getSuperFrontEndController().getPackageName();
1140    }
1141
1142    /**
1143     * Gets the package name (optionally providing the ability to retrieve the model name and not
1144     * the mapped name).
1145     * @see ModelElementFacade#getPackageName(boolean modelName)
1146     */
1147    public String getPackageName(boolean modelName)
1148    {
1149        return this.getSuperFrontEndController().getPackageName(modelName);
1150    }
1151
1152    /**
1153     * Returns the package as a path, the returned value always starts with out a slash '/'.
1154     * @see ModelElementFacade#getPackagePath()
1155     */
1156    public String getPackagePath()
1157    {
1158        return this.getSuperFrontEndController().getPackagePath();
1159    }
1160
1161    /**
1162     * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
1163     * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
1164     * the names of the containing namespaces starting at the root of the hierarchy and ending with
1165     * the name of the NamedElement itself.
1166     * @see ModelElementFacade#getQualifiedName()
1167     */
1168    public String getQualifiedName()
1169    {
1170        return this.getSuperFrontEndController().getQualifiedName();
1171    }
1172
1173    /**
1174     * Gets the root package for the model element.
1175     * @see ModelElementFacade#getRootPackage()
1176     */
1177    public PackageFacade getRootPackage()
1178    {
1179        return this.getSuperFrontEndController().getRootPackage();
1180    }
1181
1182    /**
1183     * Gets the dependencies for which this model element is the source.
1184     * @see ModelElementFacade#getSourceDependencies()
1185     */
1186    public Collection<DependencyFacade> getSourceDependencies()
1187    {
1188        return this.getSuperFrontEndController().getSourceDependencies();
1189    }
1190
1191    /**
1192     * If this model element is the context of an activity graph, this represents that activity
1193     * graph.
1194     * @see ModelElementFacade#getStateMachineContext()
1195     */
1196    public StateMachineFacade getStateMachineContext()
1197    {
1198        return this.getSuperFrontEndController().getStateMachineContext();
1199    }
1200
1201    /**
1202     * The collection of ALL stereotype names for this model element.
1203     * @see ModelElementFacade#getStereotypeNames()
1204     */
1205    public Collection<String> getStereotypeNames()
1206    {
1207        return this.getSuperFrontEndController().getStereotypeNames();
1208    }
1209
1210    /**
1211     * Gets all stereotypes for this model element.
1212     * @see ModelElementFacade#getStereotypes()
1213     */
1214    public Collection<StereotypeFacade> getStereotypes()
1215    {
1216        return this.getSuperFrontEndController().getStereotypes();
1217    }
1218
1219    /**
1220     * Return the TaggedValues associated with this model element, under all stereotypes.
1221     * @see ModelElementFacade#getTaggedValues()
1222     */
1223    public Collection<TaggedValueFacade> getTaggedValues()
1224    {
1225        return this.getSuperFrontEndController().getTaggedValues();
1226    }
1227
1228    /**
1229     * Gets the dependencies for which this model element is the target.
1230     * @see ModelElementFacade#getTargetDependencies()
1231     */
1232    public Collection<DependencyFacade> getTargetDependencies()
1233    {
1234        return this.getSuperFrontEndController().getTargetDependencies();
1235    }
1236
1237    /**
1238     * Get the template parameter for this model element having the parameterName
1239     * @see ModelElementFacade#getTemplateParameter(String parameterName)
1240     */
1241    public Object getTemplateParameter(String parameterName)
1242    {
1243        return this.getSuperFrontEndController().getTemplateParameter(parameterName);
1244    }
1245
1246    /**
1247     * Get the template parameters for this model element
1248     * @see ModelElementFacade#getTemplateParameters()
1249     */
1250    public Collection<TemplateParameterFacade> getTemplateParameters()
1251    {
1252        return this.getSuperFrontEndController().getTemplateParameters();
1253    }
1254
1255    /**
1256     * The visibility (i.e. public, private, protected or package) of the model element, will
1257     * attempt a lookup for these values in the language mappings (if any).
1258     * @see ModelElementFacade#getVisibility()
1259     */
1260    public String getVisibility()
1261    {
1262        return this.getSuperFrontEndController().getVisibility();
1263    }
1264
1265    /**
1266     * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
1267     * is taken into account when searching for the stereotype), false otherwise.
1268     * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
1269     */
1270    public boolean hasExactStereotype(String stereotypeName)
1271    {
1272        return this.getSuperFrontEndController().hasExactStereotype(stereotypeName);
1273    }
1274
1275    /**
1276     * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
1277     * pipe, semicolon, or << >>
1278     * @see ModelElementFacade#hasKeyword(String keywordName)
1279     */
1280    public boolean hasKeyword(String keywordName)
1281    {
1282        return this.getSuperFrontEndController().hasKeyword(keywordName);
1283    }
1284
1285    /**
1286     * Returns true if the model element has the specified stereotype.  If the stereotype itself
1287     * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
1288     * one of the stereotype's ancestors has a matching name this method will return true, false
1289     * otherwise.
1290     * For example, if we have a certain stereotype called <<exception>> and a model element has a
1291     * stereotype called <<applicationException>> which extends <<exception>>, when calling this
1292     * method with 'stereotypeName' defined as 'exception' the method would return true since
1293     * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
1294     * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
1295     * @see ModelElementFacade#hasStereotype(String stereotypeName)
1296     */
1297    public boolean hasStereotype(String stereotypeName)
1298    {
1299        return this.getSuperFrontEndController().hasStereotype(stereotypeName);
1300    }
1301
1302    /**
1303     * True if there are target dependencies from this element that are instances of BindingFacade.
1304     * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
1305     * @see ModelElementFacade#isBindingDependenciesPresent()
1306     */
1307    public boolean isBindingDependenciesPresent()
1308    {
1309        return this.getSuperFrontEndController().isBindingDependenciesPresent();
1310    }
1311
1312    /**
1313     * Indicates if any constraints are present on this model element.
1314     * @see ModelElementFacade#isConstraintsPresent()
1315     */
1316    public boolean isConstraintsPresent()
1317    {
1318        return this.getSuperFrontEndController().isConstraintsPresent();
1319    }
1320
1321    /**
1322     * Indicates if any documentation is present on this model element.
1323     * @see ModelElementFacade#isDocumentationPresent()
1324     */
1325    public boolean isDocumentationPresent()
1326    {
1327        return this.getSuperFrontEndController().isDocumentationPresent();
1328    }
1329
1330    /**
1331     * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
1332     * @see ModelElementFacade#isReservedWord()
1333     */
1334    public boolean isReservedWord()
1335    {
1336        return this.getSuperFrontEndController().isReservedWord();
1337    }
1338
1339    /**
1340     * True is there are template parameters on this model element. For UML2, applies to Class,
1341     * Operation, Property, and Parameter.
1342     * @see ModelElementFacade#isTemplateParametersPresent()
1343     */
1344    public boolean isTemplateParametersPresent()
1345    {
1346        return this.getSuperFrontEndController().isTemplateParametersPresent();
1347    }
1348
1349    /**
1350     * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
1351     * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
1352     * Enumerations and Interfaces, optionally applies on other model elements.
1353     * @see ModelElementFacade#isValidIdentifierName()
1354     */
1355    public boolean isValidIdentifierName()
1356    {
1357        return this.getSuperFrontEndController().isValidIdentifierName();
1358    }
1359
1360    /**
1361     * Searches for the constraint with the specified 'name' on this model element, and if found
1362     * translates it using the specified 'translation' from a translation library discovered by the
1363     * framework.
1364     * @see ModelElementFacade#translateConstraint(String name, String translation)
1365     */
1366    public String translateConstraint(String name, String translation)
1367    {
1368        return this.getSuperFrontEndController().translateConstraint(name, translation);
1369    }
1370
1371    /**
1372     * Translates all constraints belonging to this model element with the given 'translation'.
1373     * @see ModelElementFacade#translateConstraints(String translation)
1374     */
1375    public String[] translateConstraints(String translation)
1376    {
1377        return this.getSuperFrontEndController().translateConstraints(translation);
1378    }
1379
1380    /**
1381     * Translates the constraints of the specified 'kind' belonging to this model element.
1382     * @see ModelElementFacade#translateConstraints(String kind, String translation)
1383     */
1384    public String[] translateConstraints(String kind, String translation)
1385    {
1386        return this.getSuperFrontEndController().translateConstraints(kind, translation);
1387    }
1388
1389    /**
1390     * @see MetafacadeBase#initialize()
1391     */
1392    @Override
1393    public void initialize()
1394    {
1395        this.getSuperFrontEndController().initialize();
1396    }
1397
1398    /**
1399     * @return Object getSuperFrontEndController().getValidationOwner()
1400     * @see MetafacadeBase#getValidationOwner()
1401     */
1402    @Override
1403    public Object getValidationOwner()
1404    {
1405        Object owner = this.getSuperFrontEndController().getValidationOwner();
1406        return owner;
1407    }
1408
1409    /**
1410     * @return String getSuperFrontEndController().getValidationName()
1411     * @see MetafacadeBase#getValidationName()
1412     */
1413    @Override
1414    public String getValidationName()
1415    {
1416        String name = this.getSuperFrontEndController().getValidationName();
1417        return name;
1418    }
1419
1420    /**
1421     * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller must have a name</p>
1422     * <p><b>Error:</b> Each controller must have a name, it cannot be empty.</p>
1423     * <p><b>OCL:</b> context StrutsController inv: name->notEmpty()</p>
1424     * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsController::unique operation names</p>
1425     * <p><b>Error:</b> A controller cannot have different operations with the same name, even if they have a different signature.</p>
1426     * <p><b>OCL:</b> context StrutsController inv: operations->isUnique(name)</p>
1427     * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller name should not resemble the usecase name</p>
1428     * <p><b>Error:</b> The name of this front-end controller resembles the name of the use-case it is associated with. You'll have to rename it in order to avoid naming collisions (generated files will overwrite eachother).</p>
1429     * <p><b>OCL:</b> context StrutsController inv: name <> useCase.activityGraph.firstAction.actionClassName</p>
1430     * @param validationMessages Collection<ModelValidationMessage>
1431     * @see MetafacadeBase#validateInvariants(Collection validationMessages)
1432     */
1433    @Override
1434    public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
1435    {
1436        this.getSuperFrontEndController().validateInvariants(validationMessages);
1437        try
1438        {
1439            final Object contextElement = this.THIS();
1440            boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.notEmpty(OCLIntrospector.invoke(contextElement,"name")));
1441            if (!constraintValid)
1442            {
1443                validationMessages.add(
1444                    new ModelValidationMessage(
1445                        (MetafacadeBase)contextElement ,
1446                        "org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller must have a name",
1447                        "Each controller must have a name, it cannot be empty."));
1448            }
1449        }
1450        catch (Throwable th)
1451        {
1452            Throwable cause = th.getCause();
1453            int depth = 0; // Some throwables have infinite recursion
1454            while (cause != null && depth < 7)
1455            {
1456                th = cause;
1457                depth++;
1458            }
1459            logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller must have a name' ON "
1460                + this.THIS().toString() + ": " + th.getMessage(), th);
1461        }
1462        try
1463        {
1464            final Object contextElement = this.THIS();
1465            boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.isUnique(OCLIntrospector.invoke(contextElement,"operations"),new Transformer(){public Object transform(Object object){return OCLIntrospector.invoke(object,"name");}}));
1466            if (!constraintValid)
1467            {
1468                validationMessages.add(
1469                    new ModelValidationMessage(
1470                        (MetafacadeBase)contextElement ,
1471                        "org::andromda::cartridges::bpm4struts::metafacades::StrutsController::unique operation names",
1472                        "A controller cannot have different operations with the same name, even if they have a different signature."));
1473            }
1474        }
1475        catch (Throwable th)
1476        {
1477            Throwable cause = th.getCause();
1478            int depth = 0; // Some throwables have infinite recursion
1479            while (cause != null && depth < 7)
1480            {
1481                th = cause;
1482                depth++;
1483            }
1484            logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsController::unique operation names' ON "
1485                + this.THIS().toString() + ": " + th.getMessage(), th);
1486        }
1487        try
1488        {
1489            final Object contextElement = this.THIS();
1490            boolean constraintValid = OCLResultEnsurer.ensure(OCLExpressions.notEqual(OCLIntrospector.invoke(contextElement,"name"),OCLIntrospector.invoke(contextElement,"useCase.activityGraph.firstAction.actionClassName")));
1491            if (!constraintValid)
1492            {
1493                validationMessages.add(
1494                    new ModelValidationMessage(
1495                        (MetafacadeBase)contextElement ,
1496                        "org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller name should not resemble the usecase name",
1497                        "The name of this front-end controller resembles the name of the use-case it is associated with. You'll have to rename it in order to avoid naming collisions (generated files will overwrite eachother)."));
1498            }
1499        }
1500        catch (Throwable th)
1501        {
1502            Throwable cause = th.getCause();
1503            int depth = 0; // Some throwables have infinite recursion
1504            while (cause != null && depth < 7)
1505            {
1506                th = cause;
1507                depth++;
1508            }
1509            logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsController::controller name should not resemble the usecase name' ON "
1510                + this.THIS().toString() + ": " + th.getMessage(), th);
1511        }
1512    }
1513
1514    /**
1515     * The property that stores the name of the metafacade.
1516     */
1517    private static final String NAME_PROPERTY = "name";
1518    private static final String FQNAME_PROPERTY = "fullyQualifiedName";
1519
1520    /**
1521     * @see Object#toString()
1522     */
1523    @Override
1524    public String toString()
1525    {
1526        final StringBuilder toString = new StringBuilder(this.getClass().getName());
1527        toString.append("[");
1528        try
1529        {
1530            toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
1531        }
1532        catch (final Throwable tryAgain)
1533        {
1534            try
1535            {
1536                toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
1537            }
1538            catch (final Throwable ignore)
1539            {
1540                // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
1541            }
1542        }
1543        toString.append("]");
1544        return toString.toString();
1545    }
1546}