View Javadoc
1   // license-header java merge-point
2   //
3   // Attention: generated code (by MetafacadeLogic.vsl) - do not modify!
4   //
5   package org.andromda.cartridges.jbpm.metafacades;
6   
7   import java.util.Collection;
8   import java.util.List;
9   import org.andromda.core.common.Introspector;
10  import org.andromda.core.metafacade.MetafacadeBase;
11  import org.andromda.core.metafacade.MetafacadeFactory;
12  import org.andromda.core.metafacade.ModelValidationMessage;
13  import org.andromda.metafacades.uml.ActionFacade;
14  import org.andromda.metafacades.uml.ActionStateFacade;
15  import org.andromda.metafacades.uml.ConstraintFacade;
16  import org.andromda.metafacades.uml.DependencyFacade;
17  import org.andromda.metafacades.uml.EventFacade;
18  import org.andromda.metafacades.uml.ModelElementFacade;
19  import org.andromda.metafacades.uml.ModelFacade;
20  import org.andromda.metafacades.uml.PackageFacade;
21  import org.andromda.metafacades.uml.PartitionFacade;
22  import org.andromda.metafacades.uml.StateFacade;
23  import org.andromda.metafacades.uml.StateMachineFacade;
24  import org.andromda.metafacades.uml.StereotypeFacade;
25  import org.andromda.metafacades.uml.TaggedValueFacade;
26  import org.andromda.metafacades.uml.TemplateParameterFacade;
27  import org.andromda.metafacades.uml.TransitionFacade;
28  import org.andromda.metafacades.uml.TypeMappings;
29  import org.andromda.translation.ocl.validation.OCLCollections;
30  import org.andromda.translation.ocl.validation.OCLExpressions;
31  import org.andromda.translation.ocl.validation.OCLIntrospector;
32  import org.andromda.translation.ocl.validation.OCLResultEnsurer;
33  import org.apache.commons.collections.Predicate;
34  import org.apache.log4j.Logger;
35  
36  /**
37   * TODO: Model Documentation for org.andromda.cartridges.jbpm.metafacades.JBpmNode
38   * MetafacadeLogic for JBpmNode
39   *
40   * @see JBpmNode
41   */
42  public abstract class JBpmNodeLogic
43      extends MetafacadeBase
44      implements JBpmNode
45  {
46      /**
47       * The underlying UML object
48       * @see Object
49       */
50      protected Object metaObject;
51  
52      /** Create Metafacade implementation instance using the MetafacadeFactory from the context
53       * @param metaObjectIn
54       * @param context
55       */
56      protected JBpmNodeLogic(Object metaObjectIn, String context)
57      {
58          super(metaObjectIn, getContext(context));
59          this.superJBpmEventState =
60             (JBpmEventState)
61              MetafacadeFactory.getInstance().createFacadeImpl(
62                      "org.andromda.cartridges.jbpm.metafacades.JBpmEventState",
63                      metaObjectIn,
64                      getContext(context));
65          this.superActionStateFacade =
66             (ActionStateFacade)
67              MetafacadeFactory.getInstance().createFacadeImpl(
68                      "org.andromda.metafacades.uml.ActionStateFacade",
69                      metaObjectIn,
70                      getContext(context));
71          this.metaObject = metaObjectIn;
72      }
73  
74      /**
75       * The logger instance.
76       */
77      private static final Logger logger = Logger.getLogger(JBpmNodeLogic.class);
78  
79      /**
80       * Gets the context for this metafacade logic instance.
81       * @param context String. Set to JBpmNode if null
82       * @return context String
83       */
84      private static String getContext(String context)
85      {
86          if (context == null)
87          {
88              context = "org.andromda.cartridges.jbpm.metafacades.JBpmNode";
89          }
90          return context;
91      }
92  
93      private JBpmEventState superJBpmEventState;
94      private boolean superJBpmEventStateInitialized = false;
95  
96      /**
97       * Gets the JBpmEventState parent instance.
98       * @return this.superJBpmEventState JBpmEventState
99       */
100     protected JBpmEventState getSuperJBpmEventState()
101     {
102         if (!this.superJBpmEventStateInitialized)
103         {
104             ((MetafacadeBase)this.superJBpmEventState).setMetafacadeContext(this.getMetafacadeContext());
105             this.superJBpmEventStateInitialized = true;
106         }
107         return this.superJBpmEventState;
108     }
109 
110     private ActionStateFacade superActionStateFacade;
111     private boolean superActionStateFacadeInitialized = false;
112 
113     /**
114      * Gets the ActionStateFacade parent instance.
115      * @return this.superActionStateFacade ActionStateFacade
116      */
117     protected ActionStateFacade getSuperActionStateFacade()
118     {
119         if (!this.superActionStateFacadeInitialized)
120         {
121             ((MetafacadeBase)this.superActionStateFacade).setMetafacadeContext(this.getMetafacadeContext());
122             this.superActionStateFacadeInitialized = true;
123         }
124         return this.superActionStateFacade;
125     }
126 
127     /** Reset context only for non-root metafacades
128      * @param context
129      * @see MetafacadeBase#resetMetafacadeContext(String context)
130      */
131     @Override
132     public void resetMetafacadeContext(String context)
133     {
134         if (!this.contextRoot) // reset context only for non-root metafacades
135         {
136             context = getContext(context);  // to have same value as in original constructor call
137             setMetafacadeContext (context);
138             if (this.superJBpmEventStateInitialized)
139             {
140                 ((MetafacadeBase)this.superJBpmEventState).resetMetafacadeContext(context);
141             }
142             if (this.superActionStateFacadeInitialized)
143             {
144                 ((MetafacadeBase)this.superActionStateFacade).resetMetafacadeContext(context);
145             }
146         }
147     }
148 
149     /**
150      * @return boolean true always
151      * @see JBpmNode
152      */
153     public boolean isJBpmNodeMetaType()
154     {
155         return true;
156     }
157 
158     // --------------- attributes ---------------------
159 
160    /**
161     * @see org.andromda.cartridges.jbpm.metafacades.JBpmNode#isTaskNode()
162     * @return boolean
163     */
164     protected abstract boolean handleIsTaskNode();
165 
166     private boolean __taskNode1a;
167     private boolean __taskNode1aSet = false;
168 
169     /**
170      * TODO: Model Documentation for org.andromda.cartridges.jbpm.metafacades.JBpmNode.taskNode
171      * @return (boolean)handleIsTaskNode()
172      */
173     public final boolean isTaskNode()
174     {
175         boolean taskNode1a = this.__taskNode1a;
176         if (!this.__taskNode1aSet)
177         {
178             // taskNode has no pre constraints
179             taskNode1a = handleIsTaskNode();
180             // taskNode has no post constraints
181             this.__taskNode1a = taskNode1a;
182             if (isMetafacadePropertyCachingEnabled())
183             {
184                 this.__taskNode1aSet = true;
185             }
186         }
187         return taskNode1a;
188     }
189 
190     // ------------- associations ------------------
191 
192     private JBpmSwimlane __getSwimlane1r;
193     private boolean __getSwimlane1rSet = false;
194 
195     /**
196      * TODO: Model Documentation for org.andromda.cartridges.jbpm.metafacades.JBpmNode
197      * @return (JBpmSwimlane)handleGetSwimlane()
198      */
199     public final JBpmSwimlane getSwimlane()
200     {
201         JBpmSwimlane getSwimlane1r = this.__getSwimlane1r;
202         if (!this.__getSwimlane1rSet)
203         {
204             // jBpmNode has no pre constraints
205             Object result = handleGetSwimlane();
206             MetafacadeBase shieldedResult = this.shieldedElement(result);
207             try
208             {
209                 getSwimlane1r = (JBpmSwimlane)shieldedResult;
210             }
211             catch (ClassCastException ex)
212             {
213                 // Bad things happen if the metafacade type mapping in metafacades.xml is wrong - Warn
214                 JBpmNodeLogic.logger.warn("incorrect metafacade cast for JBpmNodeLogic.getSwimlane JBpmSwimlane " + result + ": " + shieldedResult);
215             }
216             // jBpmNode has no post constraints
217             this.__getSwimlane1r = getSwimlane1r;
218             if (isMetafacadePropertyCachingEnabled())
219             {
220                 this.__getSwimlane1rSet = true;
221             }
222         }
223         return getSwimlane1r;
224     }
225 
226     /**
227      * UML Specific type is transformed by shieldedElements to AndroMDA Metafacade type
228      * @return Object
229      */
230     protected abstract Object handleGetSwimlane();
231 
232     /**
233      * @return true
234      * @see JBpmEventState
235      */
236     public boolean isJBpmEventStateMetaType()
237     {
238         return true;
239     }
240 
241     /**
242      * @return true
243      * @see ActionStateFacade
244      */
245     public boolean isActionStateFacadeMetaType()
246     {
247         return true;
248     }
249 
250     /**
251      * @return true
252      * @see StateFacade
253      */
254     public boolean isStateFacadeMetaType()
255     {
256         return true;
257     }
258 
259     /**
260      * @return true
261      * @see org.andromda.cartridges.jbpm.metafacades.JBpmStateVertex
262      */
263     public boolean isJBpmStateVertexMetaType()
264     {
265         return true;
266     }
267 
268     /**
269      * @return true
270      * @see org.andromda.metafacades.uml.StateVertexFacade
271      */
272     public boolean isStateVertexFacadeMetaType()
273     {
274         return true;
275     }
276 
277     /**
278      * @return true
279      * @see ModelElementFacade
280      */
281     public boolean isModelElementFacadeMetaType()
282     {
283         return true;
284     }
285 
286     // ----------- delegates to JBpmEventState ------------
287     /**
288      * TODO: Model Documentation for JBpmAction
289      * @see JBpmEventState#getAfterSignals()
290      */
291     public List<JBpmAction> getAfterSignals()
292     {
293         return this.getSuperJBpmEventState().getAfterSignals();
294     }
295 
296     /**
297      * TODO: Model Documentation for JBpmAction
298      * @see JBpmEventState#getBeforeSignals()
299      */
300     public List<JBpmAction> getBeforeSignals()
301     {
302         return this.getSuperJBpmEventState().getBeforeSignals();
303     }
304 
305     /**
306      * TODO: Model Documentation for JBpmAction
307      * @see JBpmEventState#getNodeEnters()
308      */
309     public List<JBpmAction> getNodeEnters()
310     {
311         return this.getSuperJBpmEventState().getNodeEnters();
312     }
313 
314     /**
315      * TODO: Model Documentation for JBpmAction
316      * @see JBpmEventState#getNodeLeaves()
317      */
318     public List<JBpmAction> getNodeLeaves()
319     {
320         return this.getSuperJBpmEventState().getNodeLeaves();
321     }
322 
323     /**
324      * TODO: Model Documentation for JBpmAction
325      * @see JBpmEventState#getTasks()
326      */
327     public List<JBpmAction> getTasks()
328     {
329         return this.getSuperJBpmEventState().getTasks();
330     }
331 
332     /**
333      * TODO: Model Documentation for JBpmAction
334      * @see JBpmEventState#getTimers()
335      */
336     public List<JBpmAction> getTimers()
337     {
338         return this.getSuperJBpmEventState().getTimers();
339     }
340 
341     /**
342      * Copies all tagged values from the given ModelElementFacade to this model element facade.
343      * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
344      */
345     public void copyTaggedValues(ModelElementFacade element)
346     {
347         this.getSuperJBpmEventState().copyTaggedValues(element);
348     }
349 
350     /**
351      * Finds the tagged value with the specified 'tagName'. In case there are more values the first
352      * one found will be returned.
353      * @see ModelElementFacade#findTaggedValue(String tagName)
354      */
355     public Object findTaggedValue(String tagName)
356     {
357         return this.getSuperJBpmEventState().findTaggedValue(tagName);
358     }
359 
360     /**
361      * Returns all the values for the tagged value with the specified name. The returned collection
362      * will contains only String instances, or will be empty. Never null.
363      * @see ModelElementFacade#findTaggedValues(String tagName)
364      */
365     public Collection<Object> findTaggedValues(String tagName)
366     {
367         return this.getSuperJBpmEventState().findTaggedValues(tagName);
368     }
369 
370     /**
371      * Returns the fully qualified name of the model element. The fully qualified name includes
372      * complete package qualified name of the underlying model element. The templates parameter will
373      * be replaced by the correct one given the binding relation of the parameter to this element.
374      * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
375      */
376     public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
377     {
378         return this.getSuperJBpmEventState().getBindedFullyQualifiedName(bindedElement);
379     }
380 
381     /**
382      * Gets all constraints belonging to the model element.
383      * @see ModelElementFacade#getConstraints()
384      */
385     public Collection<ConstraintFacade> getConstraints()
386     {
387         return this.getSuperJBpmEventState().getConstraints();
388     }
389 
390     /**
391      * Returns the constraints of the argument kind that have been placed onto this model. Typical
392      * kinds are "inv", "pre" and "post". Other kinds are possible.
393      * @see ModelElementFacade#getConstraints(String kind)
394      */
395     public Collection<ConstraintFacade> getConstraints(String kind)
396     {
397         return this.getSuperJBpmEventState().getConstraints(kind);
398     }
399 
400     /**
401      * Gets the documentation for the model element, The indent argument is prefixed to each line.
402      * By default this method wraps lines after 64 characters.
403      * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
404      * @see ModelElementFacade#getDocumentation(String indent)
405      */
406     public String getDocumentation(String indent)
407     {
408         return this.getSuperJBpmEventState().getDocumentation(indent);
409     }
410 
411     /**
412      * This method returns the documentation for this model element, with the lines wrapped after
413      * the specified number of characters, values of less than 1 will indicate no line wrapping is
414      * required. By default paragraphs are returned as HTML.
415      * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
416      * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
417      */
418     public String getDocumentation(String indent, int lineLength)
419     {
420         return this.getSuperJBpmEventState().getDocumentation(indent, lineLength);
421     }
422 
423     /**
424      * This method returns the documentation for this model element, with the lines wrapped after
425      * the specified number of characters, values of less than 1 will indicate no line wrapping is
426      * required. HTML style determines if HTML Escaping is applied.
427      * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
428      */
429     public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
430     {
431         return this.getSuperJBpmEventState().getDocumentation(indent, lineLength, htmlStyle);
432     }
433 
434     /**
435      * The fully qualified name of this model element.
436      * @see ModelElementFacade#getFullyQualifiedName()
437      */
438     public String getFullyQualifiedName()
439     {
440         return this.getSuperJBpmEventState().getFullyQualifiedName();
441     }
442 
443     /**
444      * Returns the fully qualified name of the model element. The fully qualified name includes
445      * complete package qualified name of the underlying model element.  If modelName is true, then
446      * the original name of the model element (the name contained within the model) will be the name
447      * returned, otherwise a name from a language mapping will be returned.
448      * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
449      */
450     public String getFullyQualifiedName(boolean modelName)
451     {
452         return this.getSuperJBpmEventState().getFullyQualifiedName(modelName);
453     }
454 
455     /**
456      * Returns the fully qualified name as a path, the returned value always starts with out a slash
457      * '/'.
458      * @see ModelElementFacade#getFullyQualifiedNamePath()
459      */
460     public String getFullyQualifiedNamePath()
461     {
462         return this.getSuperJBpmEventState().getFullyQualifiedNamePath();
463     }
464 
465     /**
466      * Gets the unique identifier of the underlying model element.
467      * @see ModelElementFacade#getId()
468      */
469     public String getId()
470     {
471         return this.getSuperJBpmEventState().getId();
472     }
473 
474     /**
475      * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
476      * are not represented by other properties, i.e. native, transient, volatile, synchronized,
477      * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
478      * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
479      * JDK5 compiler level.
480      * @see ModelElementFacade#getKeywords()
481      */
482     public Collection<String> getKeywords()
483     {
484         return this.getSuperJBpmEventState().getKeywords();
485     }
486 
487     /**
488      * UML2: Retrieves a localized label for this named element.
489      * @see ModelElementFacade#getLabel()
490      */
491     public String getLabel()
492     {
493         return this.getSuperJBpmEventState().getLabel();
494     }
495 
496     /**
497      * The language mappings that have been set for this model element.
498      * @see ModelElementFacade#getLanguageMappings()
499      */
500     public TypeMappings getLanguageMappings()
501     {
502         return this.getSuperJBpmEventState().getLanguageMappings();
503     }
504 
505     /**
506      * Return the model containing this model element (multiple models may be loaded and processed
507      * at the same time).
508      * @see ModelElementFacade#getModel()
509      */
510     public ModelFacade getModel()
511     {
512         return this.getSuperJBpmEventState().getModel();
513     }
514 
515     /**
516      * The name of the model element.
517      * @see ModelElementFacade#getName()
518      */
519     public String getName()
520     {
521         return this.getSuperJBpmEventState().getName();
522     }
523 
524     /**
525      * Gets the package to which this model element belongs.
526      * @see ModelElementFacade#getPackage()
527      */
528     public ModelElementFacade getPackage()
529     {
530         return this.getSuperJBpmEventState().getPackage();
531     }
532 
533     /**
534      * The name of this model element's package.
535      * @see ModelElementFacade#getPackageName()
536      */
537     public String getPackageName()
538     {
539         return this.getSuperJBpmEventState().getPackageName();
540     }
541 
542     /**
543      * Gets the package name (optionally providing the ability to retrieve the model name and not
544      * the mapped name).
545      * @see ModelElementFacade#getPackageName(boolean modelName)
546      */
547     public String getPackageName(boolean modelName)
548     {
549         return this.getSuperJBpmEventState().getPackageName(modelName);
550     }
551 
552     /**
553      * Returns the package as a path, the returned value always starts with out a slash '/'.
554      * @see ModelElementFacade#getPackagePath()
555      */
556     public String getPackagePath()
557     {
558         return this.getSuperJBpmEventState().getPackagePath();
559     }
560 
561     /**
562      * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
563      * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
564      * the names of the containing namespaces starting at the root of the hierarchy and ending with
565      * the name of the NamedElement itself.
566      * @see ModelElementFacade#getQualifiedName()
567      */
568     public String getQualifiedName()
569     {
570         return this.getSuperJBpmEventState().getQualifiedName();
571     }
572 
573     /**
574      * Gets the root package for the model element.
575      * @see ModelElementFacade#getRootPackage()
576      */
577     public PackageFacade getRootPackage()
578     {
579         return this.getSuperJBpmEventState().getRootPackage();
580     }
581 
582     /**
583      * Gets the dependencies for which this model element is the source.
584      * @see ModelElementFacade#getSourceDependencies()
585      */
586     public Collection<DependencyFacade> getSourceDependencies()
587     {
588         return this.getSuperJBpmEventState().getSourceDependencies();
589     }
590 
591     /**
592      * If this model element is the context of an activity graph, this represents that activity
593      * graph.
594      * @see ModelElementFacade#getStateMachineContext()
595      */
596     public StateMachineFacade getStateMachineContext()
597     {
598         return this.getSuperJBpmEventState().getStateMachineContext();
599     }
600 
601     /**
602      * The collection of ALL stereotype names for this model element.
603      * @see ModelElementFacade#getStereotypeNames()
604      */
605     public Collection<String> getStereotypeNames()
606     {
607         return this.getSuperJBpmEventState().getStereotypeNames();
608     }
609 
610     /**
611      * Gets all stereotypes for this model element.
612      * @see ModelElementFacade#getStereotypes()
613      */
614     public Collection<StereotypeFacade> getStereotypes()
615     {
616         return this.getSuperJBpmEventState().getStereotypes();
617     }
618 
619     /**
620      * Return the TaggedValues associated with this model element, under all stereotypes.
621      * @see ModelElementFacade#getTaggedValues()
622      */
623     public Collection<TaggedValueFacade> getTaggedValues()
624     {
625         return this.getSuperJBpmEventState().getTaggedValues();
626     }
627 
628     /**
629      * Gets the dependencies for which this model element is the target.
630      * @see ModelElementFacade#getTargetDependencies()
631      */
632     public Collection<DependencyFacade> getTargetDependencies()
633     {
634         return this.getSuperJBpmEventState().getTargetDependencies();
635     }
636 
637     /**
638      * Get the template parameter for this model element having the parameterName
639      * @see ModelElementFacade#getTemplateParameter(String parameterName)
640      */
641     public Object getTemplateParameter(String parameterName)
642     {
643         return this.getSuperJBpmEventState().getTemplateParameter(parameterName);
644     }
645 
646     /**
647      * Get the template parameters for this model element
648      * @see ModelElementFacade#getTemplateParameters()
649      */
650     public Collection<TemplateParameterFacade> getTemplateParameters()
651     {
652         return this.getSuperJBpmEventState().getTemplateParameters();
653     }
654 
655     /**
656      * The visibility (i.e. public, private, protected or package) of the model element, will
657      * attempt a lookup for these values in the language mappings (if any).
658      * @see ModelElementFacade#getVisibility()
659      */
660     public String getVisibility()
661     {
662         return this.getSuperJBpmEventState().getVisibility();
663     }
664 
665     /**
666      * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
667      * is taken into account when searching for the stereotype), false otherwise.
668      * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
669      */
670     public boolean hasExactStereotype(String stereotypeName)
671     {
672         return this.getSuperJBpmEventState().hasExactStereotype(stereotypeName);
673     }
674 
675     /**
676      * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
677      * pipe, semicolon, or << >>
678      * @see ModelElementFacade#hasKeyword(String keywordName)
679      */
680     public boolean hasKeyword(String keywordName)
681     {
682         return this.getSuperJBpmEventState().hasKeyword(keywordName);
683     }
684 
685     /**
686      * Returns true if the model element has the specified stereotype.  If the stereotype itself
687      * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
688      * one of the stereotype's ancestors has a matching name this method will return true, false
689      * otherwise.
690      * For example, if we have a certain stereotype called <<exception>> and a model element has a
691      * stereotype called <<applicationException>> which extends <<exception>>, when calling this
692      * method with 'stereotypeName' defined as 'exception' the method would return true since
693      * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
694      * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
695      * @see ModelElementFacade#hasStereotype(String stereotypeName)
696      */
697     public boolean hasStereotype(String stereotypeName)
698     {
699         return this.getSuperJBpmEventState().hasStereotype(stereotypeName);
700     }
701 
702     /**
703      * True if there are target dependencies from this element that are instances of BindingFacade.
704      * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
705      * @see ModelElementFacade#isBindingDependenciesPresent()
706      */
707     public boolean isBindingDependenciesPresent()
708     {
709         return this.getSuperJBpmEventState().isBindingDependenciesPresent();
710     }
711 
712     /**
713      * Indicates if any constraints are present on this model element.
714      * @see ModelElementFacade#isConstraintsPresent()
715      */
716     public boolean isConstraintsPresent()
717     {
718         return this.getSuperJBpmEventState().isConstraintsPresent();
719     }
720 
721     /**
722      * Indicates if any documentation is present on this model element.
723      * @see ModelElementFacade#isDocumentationPresent()
724      */
725     public boolean isDocumentationPresent()
726     {
727         return this.getSuperJBpmEventState().isDocumentationPresent();
728     }
729 
730     /**
731      * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
732      * @see ModelElementFacade#isReservedWord()
733      */
734     public boolean isReservedWord()
735     {
736         return this.getSuperJBpmEventState().isReservedWord();
737     }
738 
739     /**
740      * True is there are template parameters on this model element. For UML2, applies to Class,
741      * Operation, Property, and Parameter.
742      * @see ModelElementFacade#isTemplateParametersPresent()
743      */
744     public boolean isTemplateParametersPresent()
745     {
746         return this.getSuperJBpmEventState().isTemplateParametersPresent();
747     }
748 
749     /**
750      * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
751      * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
752      * Enumerations and Interfaces, optionally applies on other model elements.
753      * @see ModelElementFacade#isValidIdentifierName()
754      */
755     public boolean isValidIdentifierName()
756     {
757         return this.getSuperJBpmEventState().isValidIdentifierName();
758     }
759 
760     /**
761      * Searches for the constraint with the specified 'name' on this model element, and if found
762      * translates it using the specified 'translation' from a translation library discovered by the
763      * framework.
764      * @see ModelElementFacade#translateConstraint(String name, String translation)
765      */
766     public String translateConstraint(String name, String translation)
767     {
768         return this.getSuperJBpmEventState().translateConstraint(name, translation);
769     }
770 
771     /**
772      * Translates all constraints belonging to this model element with the given 'translation'.
773      * @see ModelElementFacade#translateConstraints(String translation)
774      */
775     public String[] translateConstraints(String translation)
776     {
777         return this.getSuperJBpmEventState().translateConstraints(translation);
778     }
779 
780     /**
781      * Translates the constraints of the specified 'kind' belonging to this model element.
782      * @see ModelElementFacade#translateConstraints(String kind, String translation)
783      */
784     public String[] translateConstraints(String kind, String translation)
785     {
786         return this.getSuperJBpmEventState().translateConstraints(kind, translation);
787     }
788 
789     /**
790      * Events to which is being deferred in this action state.
791      * @see StateFacade#getDeferrableEvents()
792      */
793     public Collection<EventFacade> getDeferrableEvents()
794     {
795         return this.getSuperJBpmEventState().getDeferrableEvents();
796     }
797 
798     /**
799      * Models a situation during which some (usually implicit) invariant condition holds. The states
800      * of
801      * protocol state machines are exposed to the users of their context classifiers. A protocol
802      * state
803      * represents an exposed stable situation of its context classifier: when an instance of the
804      * classifier
805      * is not processing any operation, users of this instance can always know its state
806      * configuration.
807      * @see org.andromda.metafacades.uml.StateVertexFacade#getContainer()
808      */
809     public StateFacade getContainer()
810     {
811         return this.getSuperJBpmEventState().getContainer();
812     }
813 
814     /**
815      * A directed relationship between a source vertex and a target vertex. It may be part of a
816      * compound
817      * transition, which takes the state machine from one state configuration to another,
818      * representing the
819      * complete response of the state machine to an occurrence of an event of a particular type.
820      * @see org.andromda.metafacades.uml.StateVertexFacade#getIncomings()
821      */
822     public Collection<TransitionFacade> getIncomings()
823     {
824         return this.getSuperJBpmEventState().getIncomings();
825     }
826 
827     /**
828      * A directed relationship between a source vertex and a target vertex. It may be part of a
829      * compound
830      * transition, which takes the state machine from one state configuration to another,
831      * representing the
832      * complete response of the state machine to an occurrence of an event of a particular type.
833      * @see org.andromda.metafacades.uml.StateVertexFacade#getOutgoings()
834      */
835     public Collection<TransitionFacade> getOutgoings()
836     {
837         return this.getSuperJBpmEventState().getOutgoings();
838     }
839 
840     /**
841      * The partition (if any) to which this vertex belongs.
842      * @see org.andromda.metafacades.uml.StateVertexFacade#getPartition()
843      */
844     public PartitionFacade getPartition()
845     {
846         return this.getSuperJBpmEventState().getPartition();
847     }
848 
849     /**
850      * State machines can be used to express the behavior of part of a system. Behavior is modeled
851      * as a
852      * traversal of a graph of state nodes interconnected by one or more joined transition arcs that
853      * are
854      * triggered by the dispatching of series of (event) occurrences. During this traversal, the
855      * state
856      * machine executes a series of activities associated with various elements of the state
857      * machine.
858      * @see org.andromda.metafacades.uml.StateVertexFacade#getStateMachine()
859      */
860     public StateMachineFacade getStateMachine()
861     {
862         return this.getSuperJBpmEventState().getStateMachine();
863     }
864 
865     // ----------- delegates to ActionStateFacade ------------
866     /**
867      * The entry action for this action state (if any).
868      * @see ActionStateFacade#getEntry()
869      */
870     public ActionFacade getEntry()
871     {
872         return this.getSuperActionStateFacade().getEntry();
873     }
874 
875     /**
876      * @see MetafacadeBase#initialize()
877      */
878     @Override
879     public void initialize()
880     {
881         this.getSuperJBpmEventState().initialize();
882         this.getSuperActionStateFacade().initialize();
883     }
884 
885     /**
886      * @return Object getSuperJBpmEventState().getValidationOwner()
887      * @see MetafacadeBase#getValidationOwner()
888      */
889     @Override
890     public Object getValidationOwner()
891     {
892         Object owner = this.getSuperJBpmEventState().getValidationOwner();
893         if (owner == null)
894         {
895             owner = this.getSuperActionStateFacade().getValidationOwner();
896         }
897         return owner;
898     }
899 
900     /**
901      * @return String getSuperJBpmEventState().getValidationName()
902      * @see MetafacadeBase#getValidationName()
903      */
904     @Override
905     public String getValidationName()
906     {
907         String name = this.getSuperJBpmEventState().getValidationName();
908         if (name == null)
909         {
910             name = this.getSuperActionStateFacade().getValidationName();
911         }
912         return name;
913     }
914 
915     /**
916      * <p><b>Constraint:</b> org::andromda::cartridges::jbpm::metafacades::JBpmState::state name is required</p>
917      * <p><b>Error:</b> The name of a state (action state) cannot be empty.</p>
918      * <p><b>OCL:</b> context JBpmState inv: name->notEmpty()</p>
919      * <p><b>Constraint:</b> org::andromda::cartridges::jbpm::metafacades::JBpmNode::outgoing transitions need names when there is more than one exiting a node</p>
920      * <p><b>Error:</b> When more than one transition is exiting a node it is required for them all to have a non-empty name.</p>
921      * <p><b>OCL:</b> context JBpmNode inv: outgoings->size() > 1 implies outgoings->forAll(name->notEmpty())</p>
922      * <p><b>Constraint:</b> org::andromda::cartridges::jbpm::metafacades::JBpmNode::name must not conflict with definition</p>
923      * <p><b>Error:</b> The name of this node's class will conflict with the name of the interface it is implementing, which is derived from the use-case name. Please either change the name of this node or the name of the encapsulating use-case.</p>
924      * <p><b>OCL:</b> context JBpmNode inv: name <> processDefinition.nodeInterfaceName</p>
925      * @param validationMessages Collection<ModelValidationMessage>
926      * @see MetafacadeBase#validateInvariants(Collection validationMessages)
927      */
928     @Override
929     public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
930     {
931         this.getSuperJBpmEventState().validateInvariants(validationMessages);
932         this.getSuperActionStateFacade().validateInvariants(validationMessages);
933         try
934         {
935             final Object contextElement = this.THIS();
936             boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.notEmpty(OCLIntrospector.invoke(contextElement,"name")));
937             if (!constraintValid)
938             {
939                 validationMessages.add(
940                     new ModelValidationMessage(
941                         (MetafacadeBase)contextElement ,
942                         "org::andromda::cartridges::jbpm::metafacades::JBpmState::state name is required",
943                         "The name of a state (action state) cannot be empty."));
944             }
945         }
946         catch (Throwable th)
947         {
948             Throwable cause = th.getCause();
949             int depth = 0; // Some throwables have infinite recursion
950             while (cause != null && depth < 7)
951             {
952                 th = cause;
953                 depth++;
954             }
955             logger.error("Error validating constraint 'org::andromda::cartridges::jbpm::metafacades::JBpmState::state name is required' ON "
956                 + this.THIS().toString() + ": " + th.getMessage(), th);
957         }
958         try
959         {
960             final Object contextElement = this.THIS();
961             boolean constraintValid = OCLResultEnsurer.ensure((Boolean.valueOf(String.valueOf(OCLExpressions.greater(OCLCollections.size(OCLIntrospector.invoke(contextElement,"outgoings")),1))).booleanValue()?OCLCollections.forAll(OCLIntrospector.invoke(contextElement,"outgoings"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf(OCLCollections.notEmpty(OCLIntrospector.invoke(object,"name")))).booleanValue();}}):true));
962             if (!constraintValid)
963             {
964                 validationMessages.add(
965                     new ModelValidationMessage(
966                         (MetafacadeBase)contextElement ,
967                         "org::andromda::cartridges::jbpm::metafacades::JBpmNode::outgoing transitions need names when there is more than one exiting a node",
968                         "When more than one transition is exiting a node it is required for them all to have a non-empty name."));
969             }
970         }
971         catch (Throwable th)
972         {
973             Throwable cause = th.getCause();
974             int depth = 0; // Some throwables have infinite recursion
975             while (cause != null && depth < 7)
976             {
977                 th = cause;
978                 depth++;
979             }
980             logger.error("Error validating constraint 'org::andromda::cartridges::jbpm::metafacades::JBpmNode::outgoing transitions need names when there is more than one exiting a node' ON "
981                 + this.THIS().toString() + ": " + th.getMessage(), th);
982         }
983         try
984         {
985             final Object contextElement = this.THIS();
986             boolean constraintValid = OCLResultEnsurer.ensure(OCLExpressions.notEqual(OCLIntrospector.invoke(contextElement,"name"),OCLIntrospector.invoke(contextElement,"processDefinition.nodeInterfaceName")));
987             if (!constraintValid)
988             {
989                 validationMessages.add(
990                     new ModelValidationMessage(
991                         (MetafacadeBase)contextElement ,
992                         "org::andromda::cartridges::jbpm::metafacades::JBpmNode::name must not conflict with definition",
993                         "The name of this node's class will conflict with the name of the interface it is implementing, which is derived from the use-case name. Please either change the name of this node or the name of the encapsulating use-case."));
994             }
995         }
996         catch (Throwable th)
997         {
998             Throwable cause = th.getCause();
999             int depth = 0; // Some throwables have infinite recursion
1000             while (cause != null && depth < 7)
1001             {
1002                 th = cause;
1003                 depth++;
1004             }
1005             logger.error("Error validating constraint 'org::andromda::cartridges::jbpm::metafacades::JBpmNode::name must not conflict with definition' ON "
1006                 + this.THIS().toString() + ": " + th.getMessage(), th);
1007         }
1008     }
1009 
1010     /**
1011      * The property that stores the name of the metafacade.
1012      */
1013     private static final String NAME_PROPERTY = "name";
1014     private static final String FQNAME_PROPERTY = "fullyQualifiedName";
1015 
1016     /**
1017      * @see Object#toString()
1018      */
1019     @Override
1020     public String toString()
1021     {
1022         final StringBuilder toString = new StringBuilder(this.getClass().getName());
1023         toString.append("[");
1024         try
1025         {
1026             toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
1027         }
1028         catch (final Throwable tryAgain)
1029         {
1030             try
1031             {
1032                 toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
1033             }
1034             catch (final Throwable ignore)
1035             {
1036                 // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
1037             }
1038         }
1039         toString.append("]");
1040         return toString.toString();
1041     }
1042 }