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