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