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