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