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