001// license-header java merge-point 002// 003// Attention: generated code (by MetafacadeLogic.vsl) - do not modify! 004// 005package org.andromda.cartridges.bpm4struts.metafacades; 006 007import java.util.Collection; 008import org.andromda.core.common.Introspector; 009import org.andromda.core.metafacade.MetafacadeBase; 010import org.andromda.core.metafacade.MetafacadeFactory; 011import org.andromda.core.metafacade.ModelValidationMessage; 012import org.andromda.metafacades.uml.ActionStateFacade; 013import org.andromda.metafacades.uml.ConstraintFacade; 014import org.andromda.metafacades.uml.DependencyFacade; 015import org.andromda.metafacades.uml.FinalStateFacade; 016import org.andromda.metafacades.uml.FrontEndAction; 017import org.andromda.metafacades.uml.FrontEndActivityGraph; 018import org.andromda.metafacades.uml.FrontEndController; 019import org.andromda.metafacades.uml.ModelElementFacade; 020import org.andromda.metafacades.uml.ModelFacade; 021import org.andromda.metafacades.uml.ObjectFlowStateFacade; 022import org.andromda.metafacades.uml.PackageFacade; 023import org.andromda.metafacades.uml.PartitionFacade; 024import org.andromda.metafacades.uml.PseudostateFacade; 025import org.andromda.metafacades.uml.StateFacade; 026import org.andromda.metafacades.uml.StateMachineFacade; 027import org.andromda.metafacades.uml.StereotypeFacade; 028import org.andromda.metafacades.uml.TaggedValueFacade; 029import org.andromda.metafacades.uml.TemplateParameterFacade; 030import org.andromda.metafacades.uml.TransitionFacade; 031import org.andromda.metafacades.uml.TypeMappings; 032import org.andromda.metafacades.uml.UseCaseFacade; 033import org.andromda.translation.ocl.validation.OCLCollections; 034import org.andromda.translation.ocl.validation.OCLIntrospector; 035import org.andromda.translation.ocl.validation.OCLResultEnsurer; 036import org.apache.log4j.Logger; 037 038/** 039 * Represents the activity graph describing the details of a Struts use-case. 040 * MetafacadeLogic for StrutsActivityGraph 041 * 042 * @see StrutsActivityGraph 043 */ 044public abstract class StrutsActivityGraphLogic 045 extends MetafacadeBase 046 implements StrutsActivityGraph 047{ 048 /** 049 * The underlying UML object 050 * @see Object 051 */ 052 protected Object metaObject; 053 054 /** Create Metafacade implementation instance using the MetafacadeFactory from the context 055 * @param metaObjectIn 056 * @param context 057 */ 058 protected StrutsActivityGraphLogic(Object metaObjectIn, String context) 059 { 060 super(metaObjectIn, getContext(context)); 061 this.superFrontEndActivityGraph = 062 (FrontEndActivityGraph) 063 MetafacadeFactory.getInstance().createFacadeImpl( 064 "org.andromda.metafacades.uml.FrontEndActivityGraph", 065 metaObjectIn, 066 getContext(context)); 067 this.metaObject = metaObjectIn; 068 } 069 070 /** 071 * The logger instance. 072 */ 073 private static final Logger logger = Logger.getLogger(StrutsActivityGraphLogic.class); 074 075 /** 076 * Gets the context for this metafacade logic instance. 077 * @param context String. Set to StrutsActivityGraph if null 078 * @return context String 079 */ 080 private static String getContext(String context) 081 { 082 if (context == null) 083 { 084 context = "org.andromda.cartridges.bpm4struts.metafacades.StrutsActivityGraph"; 085 } 086 return context; 087 } 088 089 private FrontEndActivityGraph superFrontEndActivityGraph; 090 private boolean superFrontEndActivityGraphInitialized = false; 091 092 /** 093 * Gets the FrontEndActivityGraph parent instance. 094 * @return this.superFrontEndActivityGraph FrontEndActivityGraph 095 */ 096 private FrontEndActivityGraph getSuperFrontEndActivityGraph() 097 { 098 if (!this.superFrontEndActivityGraphInitialized) 099 { 100 ((MetafacadeBase)this.superFrontEndActivityGraph).setMetafacadeContext(this.getMetafacadeContext()); 101 this.superFrontEndActivityGraphInitialized = true; 102 } 103 return this.superFrontEndActivityGraph; 104 } 105 106 /** Reset context only for non-root metafacades 107 * @param context 108 * @see MetafacadeBase#resetMetafacadeContext(String context) 109 */ 110 @Override 111 public void resetMetafacadeContext(String context) 112 { 113 if (!this.contextRoot) // reset context only for non-root metafacades 114 { 115 context = getContext(context); // to have same value as in original constructor call 116 setMetafacadeContext (context); 117 if (this.superFrontEndActivityGraphInitialized) 118 { 119 ((MetafacadeBase)this.superFrontEndActivityGraph).resetMetafacadeContext(context); 120 } 121 } 122 } 123 124 /** 125 * @return boolean true always 126 * @see StrutsActivityGraph 127 */ 128 public boolean isStrutsActivityGraphMetaType() 129 { 130 return true; 131 } 132 133 // ------------- associations ------------------ 134 135 private StrutsAction __getFirstAction1r; 136 private boolean __getFirstAction1rSet = false; 137 138 /** 139 * Represents the activity graph describing the details of a Struts use-case. 140 * @return (StrutsAction)handleGetFirstAction() 141 */ 142 public final StrutsAction getFirstAction() 143 { 144 StrutsAction getFirstAction1r = this.__getFirstAction1r; 145 if (!this.__getFirstAction1rSet) 146 { 147 // strutsActivityGraph has no pre constraints 148 Object result = handleGetFirstAction(); 149 MetafacadeBase shieldedResult = this.shieldedElement(result); 150 try 151 { 152 getFirstAction1r = (StrutsAction)shieldedResult; 153 } 154 catch (ClassCastException ex) 155 { 156 // Bad things happen if the metafacade type mapping in metafacades.xml is wrong - Warn 157 StrutsActivityGraphLogic.logger.warn("incorrect metafacade cast for StrutsActivityGraphLogic.getFirstAction StrutsAction " + result + ": " + shieldedResult); 158 } 159 // strutsActivityGraph has no post constraints 160 this.__getFirstAction1r = getFirstAction1r; 161 if (isMetafacadePropertyCachingEnabled()) 162 { 163 this.__getFirstAction1rSet = true; 164 } 165 } 166 return getFirstAction1r; 167 } 168 169 /** 170 * UML Specific type is transformed by shieldedElements to AndroMDA Metafacade type 171 * @return Object 172 */ 173 protected abstract Object handleGetFirstAction(); 174 175 /** 176 * @return true 177 * @see FrontEndActivityGraph 178 */ 179 public boolean isFrontEndActivityGraphMetaType() 180 { 181 return true; 182 } 183 184 /** 185 * @return true 186 * @see org.andromda.metafacades.uml.ActivityGraphFacade 187 */ 188 public boolean isActivityGraphFacadeMetaType() 189 { 190 return true; 191 } 192 193 /** 194 * @return true 195 * @see StateMachineFacade 196 */ 197 public boolean isStateMachineFacadeMetaType() 198 { 199 return true; 200 } 201 202 /** 203 * @return true 204 * @see ModelElementFacade 205 */ 206 public boolean isModelElementFacadeMetaType() 207 { 208 return true; 209 } 210 211 // ----------- delegates to FrontEndActivityGraph ------------ 212 /** 213 * The set of action states contained in this activity graph. 214 * @see org.andromda.metafacades.uml.ActivityGraphFacade#getActionStates() 215 */ 216 public Collection<ActionStateFacade> getActionStates() 217 { 218 return this.getSuperFrontEndActivityGraph().getActionStates(); 219 } 220 221 /** 222 * The set of object flow states contained in this activity graph. 223 * @see org.andromda.metafacades.uml.ActivityGraphFacade#getObjectFlowStates() 224 */ 225 public Collection<ObjectFlowStateFacade> getObjectFlowStates() 226 { 227 return this.getSuperFrontEndActivityGraph().getObjectFlowStates(); 228 } 229 230 /** 231 * The set of partitions contained in this activity graph. Partitions are also known as 232 * swimlanes in UML. 233 * @see org.andromda.metafacades.uml.ActivityGraphFacade#getPartitions() 234 */ 235 public Collection<PartitionFacade> getPartitions() 236 { 237 return this.getSuperFrontEndActivityGraph().getPartitions(); 238 } 239 240 /** 241 * The use-case owning this activity graph. 242 * @see org.andromda.metafacades.uml.ActivityGraphFacade#getUseCase() 243 */ 244 public UseCaseFacade getUseCase() 245 { 246 return this.getSuperFrontEndActivityGraph().getUseCase(); 247 } 248 249 /** 250 * The controller context for this activity graph. This controller can be the target of 251 * deferrable events in the action states and transitions in this graph. 252 * @see FrontEndActivityGraph#getController() 253 */ 254 public FrontEndController getController() 255 { 256 return this.getSuperFrontEndActivityGraph().getController(); 257 } 258 259 /** 260 * This is the initial action encountered in this activity graph. This is the one and only 261 * transition coming out of the initial state. 262 * @see FrontEndActivityGraph#getInitialAction() 263 */ 264 public FrontEndAction getInitialAction() 265 { 266 return this.getSuperFrontEndActivityGraph().getInitialAction(); 267 } 268 269 /** 270 * True if this element is contained in a FrontEndUseCase. 271 * @see FrontEndActivityGraph#isContainedInFrontEndUseCase() 272 */ 273 public boolean isContainedInFrontEndUseCase() 274 { 275 return this.getSuperFrontEndActivityGraph().isContainedInFrontEndUseCase(); 276 } 277 278 /** 279 * Copies all tagged values from the given ModelElementFacade to this model element facade. 280 * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element) 281 */ 282 public void copyTaggedValues(ModelElementFacade element) 283 { 284 this.getSuperFrontEndActivityGraph().copyTaggedValues(element); 285 } 286 287 /** 288 * Finds the tagged value with the specified 'tagName'. In case there are more values the first 289 * one found will be returned. 290 * @see ModelElementFacade#findTaggedValue(String tagName) 291 */ 292 public Object findTaggedValue(String tagName) 293 { 294 return this.getSuperFrontEndActivityGraph().findTaggedValue(tagName); 295 } 296 297 /** 298 * Returns all the values for the tagged value with the specified name. The returned collection 299 * will contains only String instances, or will be empty. Never null. 300 * @see ModelElementFacade#findTaggedValues(String tagName) 301 */ 302 public Collection<Object> findTaggedValues(String tagName) 303 { 304 return this.getSuperFrontEndActivityGraph().findTaggedValues(tagName); 305 } 306 307 /** 308 * Returns the fully qualified name of the model element. The fully qualified name includes 309 * complete package qualified name of the underlying model element. The templates parameter will 310 * be replaced by the correct one given the binding relation of the parameter to this element. 311 * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement) 312 */ 313 public String getBindedFullyQualifiedName(ModelElementFacade bindedElement) 314 { 315 return this.getSuperFrontEndActivityGraph().getBindedFullyQualifiedName(bindedElement); 316 } 317 318 /** 319 * Gets all constraints belonging to the model element. 320 * @see ModelElementFacade#getConstraints() 321 */ 322 public Collection<ConstraintFacade> getConstraints() 323 { 324 return this.getSuperFrontEndActivityGraph().getConstraints(); 325 } 326 327 /** 328 * Returns the constraints of the argument kind that have been placed onto this model. Typical 329 * kinds are "inv", "pre" and "post". Other kinds are possible. 330 * @see ModelElementFacade#getConstraints(String kind) 331 */ 332 public Collection<ConstraintFacade> getConstraints(String kind) 333 { 334 return this.getSuperFrontEndActivityGraph().getConstraints(kind); 335 } 336 337 /** 338 * Gets the documentation for the model element, The indent argument is prefixed to each line. 339 * By default this method wraps lines after 64 characters. 340 * This method is equivalent to <code>getDocumentation(indent, 64)</code>. 341 * @see ModelElementFacade#getDocumentation(String indent) 342 */ 343 public String getDocumentation(String indent) 344 { 345 return this.getSuperFrontEndActivityGraph().getDocumentation(indent); 346 } 347 348 /** 349 * This method returns the documentation for this model element, with the lines wrapped after 350 * the specified number of characters, values of less than 1 will indicate no line wrapping is 351 * required. By default paragraphs are returned as HTML. 352 * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>. 353 * @see ModelElementFacade#getDocumentation(String indent, int lineLength) 354 */ 355 public String getDocumentation(String indent, int lineLength) 356 { 357 return this.getSuperFrontEndActivityGraph().getDocumentation(indent, lineLength); 358 } 359 360 /** 361 * This method returns the documentation for this model element, with the lines wrapped after 362 * the specified number of characters, values of less than 1 will indicate no line wrapping is 363 * required. HTML style determines if HTML Escaping is applied. 364 * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle) 365 */ 366 public String getDocumentation(String indent, int lineLength, boolean htmlStyle) 367 { 368 return this.getSuperFrontEndActivityGraph().getDocumentation(indent, lineLength, htmlStyle); 369 } 370 371 /** 372 * The fully qualified name of this model element. 373 * @see ModelElementFacade#getFullyQualifiedName() 374 */ 375 public String getFullyQualifiedName() 376 { 377 return this.getSuperFrontEndActivityGraph().getFullyQualifiedName(); 378 } 379 380 /** 381 * Returns the fully qualified name of the model element. The fully qualified name includes 382 * complete package qualified name of the underlying model element. If modelName is true, then 383 * the original name of the model element (the name contained within the model) will be the name 384 * returned, otherwise a name from a language mapping will be returned. 385 * @see ModelElementFacade#getFullyQualifiedName(boolean modelName) 386 */ 387 public String getFullyQualifiedName(boolean modelName) 388 { 389 return this.getSuperFrontEndActivityGraph().getFullyQualifiedName(modelName); 390 } 391 392 /** 393 * Returns the fully qualified name as a path, the returned value always starts with out a slash 394 * '/'. 395 * @see ModelElementFacade#getFullyQualifiedNamePath() 396 */ 397 public String getFullyQualifiedNamePath() 398 { 399 return this.getSuperFrontEndActivityGraph().getFullyQualifiedNamePath(); 400 } 401 402 /** 403 * Gets the unique identifier of the underlying model element. 404 * @see ModelElementFacade#getId() 405 */ 406 public String getId() 407 { 408 return this.getSuperFrontEndActivityGraph().getId(); 409 } 410 411 /** 412 * UML2: Retrieves the keywords for this element. Used to modify implementation properties which 413 * are not represented by other properties, i.e. native, transient, volatile, synchronized, 414 * (added annotations) override, deprecated. Can also be used to suppress compiler warnings: 415 * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require 416 * JDK5 compiler level. 417 * @see ModelElementFacade#getKeywords() 418 */ 419 public Collection<String> getKeywords() 420 { 421 return this.getSuperFrontEndActivityGraph().getKeywords(); 422 } 423 424 /** 425 * UML2: Retrieves a localized label for this named element. 426 * @see ModelElementFacade#getLabel() 427 */ 428 public String getLabel() 429 { 430 return this.getSuperFrontEndActivityGraph().getLabel(); 431 } 432 433 /** 434 * The language mappings that have been set for this model element. 435 * @see ModelElementFacade#getLanguageMappings() 436 */ 437 public TypeMappings getLanguageMappings() 438 { 439 return this.getSuperFrontEndActivityGraph().getLanguageMappings(); 440 } 441 442 /** 443 * Return the model containing this model element (multiple models may be loaded and processed 444 * at the same time). 445 * @see ModelElementFacade#getModel() 446 */ 447 public ModelFacade getModel() 448 { 449 return this.getSuperFrontEndActivityGraph().getModel(); 450 } 451 452 /** 453 * The name of the model element. 454 * @see ModelElementFacade#getName() 455 */ 456 public String getName() 457 { 458 return this.getSuperFrontEndActivityGraph().getName(); 459 } 460 461 /** 462 * Gets the package to which this model element belongs. 463 * @see ModelElementFacade#getPackage() 464 */ 465 public ModelElementFacade getPackage() 466 { 467 return this.getSuperFrontEndActivityGraph().getPackage(); 468 } 469 470 /** 471 * The name of this model element's package. 472 * @see ModelElementFacade#getPackageName() 473 */ 474 public String getPackageName() 475 { 476 return this.getSuperFrontEndActivityGraph().getPackageName(); 477 } 478 479 /** 480 * Gets the package name (optionally providing the ability to retrieve the model name and not 481 * the mapped name). 482 * @see ModelElementFacade#getPackageName(boolean modelName) 483 */ 484 public String getPackageName(boolean modelName) 485 { 486 return this.getSuperFrontEndActivityGraph().getPackageName(modelName); 487 } 488 489 /** 490 * Returns the package as a path, the returned value always starts with out a slash '/'. 491 * @see ModelElementFacade#getPackagePath() 492 */ 493 public String getPackagePath() 494 { 495 return this.getSuperFrontEndActivityGraph().getPackagePath(); 496 } 497 498 /** 499 * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the 500 * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from 501 * the names of the containing namespaces starting at the root of the hierarchy and ending with 502 * the name of the NamedElement itself. 503 * @see ModelElementFacade#getQualifiedName() 504 */ 505 public String getQualifiedName() 506 { 507 return this.getSuperFrontEndActivityGraph().getQualifiedName(); 508 } 509 510 /** 511 * Gets the root package for the model element. 512 * @see ModelElementFacade#getRootPackage() 513 */ 514 public PackageFacade getRootPackage() 515 { 516 return this.getSuperFrontEndActivityGraph().getRootPackage(); 517 } 518 519 /** 520 * Gets the dependencies for which this model element is the source. 521 * @see ModelElementFacade#getSourceDependencies() 522 */ 523 public Collection<DependencyFacade> getSourceDependencies() 524 { 525 return this.getSuperFrontEndActivityGraph().getSourceDependencies(); 526 } 527 528 /** 529 * If this model element is the context of an activity graph, this represents that activity 530 * graph. 531 * @see ModelElementFacade#getStateMachineContext() 532 */ 533 public StateMachineFacade getStateMachineContext() 534 { 535 return this.getSuperFrontEndActivityGraph().getStateMachineContext(); 536 } 537 538 /** 539 * The collection of ALL stereotype names for this model element. 540 * @see ModelElementFacade#getStereotypeNames() 541 */ 542 public Collection<String> getStereotypeNames() 543 { 544 return this.getSuperFrontEndActivityGraph().getStereotypeNames(); 545 } 546 547 /** 548 * Gets all stereotypes for this model element. 549 * @see ModelElementFacade#getStereotypes() 550 */ 551 public Collection<StereotypeFacade> getStereotypes() 552 { 553 return this.getSuperFrontEndActivityGraph().getStereotypes(); 554 } 555 556 /** 557 * Return the TaggedValues associated with this model element, under all stereotypes. 558 * @see ModelElementFacade#getTaggedValues() 559 */ 560 public Collection<TaggedValueFacade> getTaggedValues() 561 { 562 return this.getSuperFrontEndActivityGraph().getTaggedValues(); 563 } 564 565 /** 566 * Gets the dependencies for which this model element is the target. 567 * @see ModelElementFacade#getTargetDependencies() 568 */ 569 public Collection<DependencyFacade> getTargetDependencies() 570 { 571 return this.getSuperFrontEndActivityGraph().getTargetDependencies(); 572 } 573 574 /** 575 * Get the template parameter for this model element having the parameterName 576 * @see ModelElementFacade#getTemplateParameter(String parameterName) 577 */ 578 public Object getTemplateParameter(String parameterName) 579 { 580 return this.getSuperFrontEndActivityGraph().getTemplateParameter(parameterName); 581 } 582 583 /** 584 * Get the template parameters for this model element 585 * @see ModelElementFacade#getTemplateParameters() 586 */ 587 public Collection<TemplateParameterFacade> getTemplateParameters() 588 { 589 return this.getSuperFrontEndActivityGraph().getTemplateParameters(); 590 } 591 592 /** 593 * The visibility (i.e. public, private, protected or package) of the model element, will 594 * attempt a lookup for these values in the language mappings (if any). 595 * @see ModelElementFacade#getVisibility() 596 */ 597 public String getVisibility() 598 { 599 return this.getSuperFrontEndActivityGraph().getVisibility(); 600 } 601 602 /** 603 * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance 604 * is taken into account when searching for the stereotype), false otherwise. 605 * @see ModelElementFacade#hasExactStereotype(String stereotypeName) 606 */ 607 public boolean hasExactStereotype(String stereotypeName) 608 { 609 return this.getSuperFrontEndActivityGraph().hasExactStereotype(stereotypeName); 610 } 611 612 /** 613 * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma, 614 * pipe, semicolon, or << >> 615 * @see ModelElementFacade#hasKeyword(String keywordName) 616 */ 617 public boolean hasKeyword(String keywordName) 618 { 619 return this.getSuperFrontEndActivityGraph().hasKeyword(keywordName); 620 } 621 622 /** 623 * Returns true if the model element has the specified stereotype. If the stereotype itself 624 * does not match, then a search will be made up the stereotype inheritance hierarchy, and if 625 * one of the stereotype's ancestors has a matching name this method will return true, false 626 * otherwise. 627 * For example, if we have a certain stereotype called <<exception>> and a model element has a 628 * stereotype called <<applicationException>> which extends <<exception>>, when calling this 629 * method with 'stereotypeName' defined as 'exception' the method would return true since 630 * <<applicationException>> inherits from <<exception>>. If you want to check if the model 631 * element has the exact stereotype, then use the method 'hasExactStereotype' instead. 632 * @see ModelElementFacade#hasStereotype(String stereotypeName) 633 */ 634 public boolean hasStereotype(String stereotypeName) 635 { 636 return this.getSuperFrontEndActivityGraph().hasStereotype(stereotypeName); 637 } 638 639 /** 640 * True if there are target dependencies from this element that are instances of BindingFacade. 641 * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies. 642 * @see ModelElementFacade#isBindingDependenciesPresent() 643 */ 644 public boolean isBindingDependenciesPresent() 645 { 646 return this.getSuperFrontEndActivityGraph().isBindingDependenciesPresent(); 647 } 648 649 /** 650 * Indicates if any constraints are present on this model element. 651 * @see ModelElementFacade#isConstraintsPresent() 652 */ 653 public boolean isConstraintsPresent() 654 { 655 return this.getSuperFrontEndActivityGraph().isConstraintsPresent(); 656 } 657 658 /** 659 * Indicates if any documentation is present on this model element. 660 * @see ModelElementFacade#isDocumentationPresent() 661 */ 662 public boolean isDocumentationPresent() 663 { 664 return this.getSuperFrontEndActivityGraph().isDocumentationPresent(); 665 } 666 667 /** 668 * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript. 669 * @see ModelElementFacade#isReservedWord() 670 */ 671 public boolean isReservedWord() 672 { 673 return this.getSuperFrontEndActivityGraph().isReservedWord(); 674 } 675 676 /** 677 * True is there are template parameters on this model element. For UML2, applies to Class, 678 * Operation, Property, and Parameter. 679 * @see ModelElementFacade#isTemplateParametersPresent() 680 */ 681 public boolean isTemplateParametersPresent() 682 { 683 return this.getSuperFrontEndActivityGraph().isTemplateParametersPresent(); 684 } 685 686 /** 687 * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++, 688 * JavaScript. Contains no spaces, special characters etc. Constraint always applied on 689 * Enumerations and Interfaces, optionally applies on other model elements. 690 * @see ModelElementFacade#isValidIdentifierName() 691 */ 692 public boolean isValidIdentifierName() 693 { 694 return this.getSuperFrontEndActivityGraph().isValidIdentifierName(); 695 } 696 697 /** 698 * Searches for the constraint with the specified 'name' on this model element, and if found 699 * translates it using the specified 'translation' from a translation library discovered by the 700 * framework. 701 * @see ModelElementFacade#translateConstraint(String name, String translation) 702 */ 703 public String translateConstraint(String name, String translation) 704 { 705 return this.getSuperFrontEndActivityGraph().translateConstraint(name, translation); 706 } 707 708 /** 709 * Translates all constraints belonging to this model element with the given 'translation'. 710 * @see ModelElementFacade#translateConstraints(String translation) 711 */ 712 public String[] translateConstraints(String translation) 713 { 714 return this.getSuperFrontEndActivityGraph().translateConstraints(translation); 715 } 716 717 /** 718 * Translates the constraints of the specified 'kind' belonging to this model element. 719 * @see ModelElementFacade#translateConstraints(String kind, String translation) 720 */ 721 public String[] translateConstraints(String kind, String translation) 722 { 723 return this.getSuperFrontEndActivityGraph().translateConstraints(kind, translation); 724 } 725 726 /** 727 * Represents a model element. It may be an Element or NamedElement. A named element is an 728 * element in a 729 * model that may have a name. An element is a constituent of a model. As such, it has the 730 * capability 731 * of owning other elements. 732 * @see StateMachineFacade#getContextElement() 733 */ 734 public ModelElementFacade getContextElement() 735 { 736 return this.getSuperFrontEndActivityGraph().getContextElement(); 737 } 738 739 /** 740 * A special kind of state signifying that the enclosing region is completed. If the enclosing 741 * region 742 * is directly contained in a state machine and all other regions in the state machine also are 743 * completed, then it means that the entire state machine is completed. 744 * @see StateMachineFacade#getFinalStates() 745 */ 746 public Collection<FinalStateFacade> getFinalStates() 747 { 748 return this.getSuperFrontEndActivityGraph().getFinalStates(); 749 } 750 751 /** 752 * The first initial state (if any) found in this activity graph. Although technically many 753 * initial states per graph are allowed, it makes sense to have only one, for this reason we 754 * provide this property. 755 * @see StateMachineFacade#getInitialState() 756 */ 757 public PseudostateFacade getInitialState() 758 { 759 return this.getSuperFrontEndActivityGraph().getInitialState(); 760 } 761 762 /** 763 * An abstraction that encompasses different types of transient vertices in the state machine 764 * graph. 765 * @see StateMachineFacade#getInitialStates() 766 */ 767 public Collection<PseudostateFacade> getInitialStates() 768 { 769 return this.getSuperFrontEndActivityGraph().getInitialStates(); 770 } 771 772 /** 773 * The first transition on the first initial state found for this activity graph. 774 * @see StateMachineFacade#getInitialTransition() 775 */ 776 public TransitionFacade getInitialTransition() 777 { 778 return this.getSuperFrontEndActivityGraph().getInitialTransition(); 779 } 780 781 /** 782 * An abstraction that encompasses different types of transient vertices in the state machine 783 * graph. 784 * @see StateMachineFacade#getPseudostates() 785 */ 786 public Collection<PseudostateFacade> getPseudostates() 787 { 788 return this.getSuperFrontEndActivityGraph().getPseudostates(); 789 } 790 791 /** 792 * Models a situation during which some (usually implicit) invariant condition holds. The states 793 * of 794 * protocol state machines are exposed to the users of their context classifiers. A protocol 795 * state 796 * represents an exposed stable situation of its context classifier: when an instance of the 797 * classifier 798 * is not processing any operation, users of this instance can always know its state 799 * configuration. 800 * @see StateMachineFacade#getStates() 801 */ 802 public Collection<StateFacade> getStates() 803 { 804 return this.getSuperFrontEndActivityGraph().getStates(); 805 } 806 807 /** 808 * A directed relationship between a source vertex and a target vertex. It may be part of a 809 * compound 810 * transition, which takes the state machine from one state configuration to another, 811 * representing the 812 * complete response of the state machine to an occurrence of an event of a particular type. 813 * @see StateMachineFacade#getTransitions() 814 */ 815 public Collection<TransitionFacade> getTransitions() 816 { 817 return this.getSuperFrontEndActivityGraph().getTransitions(); 818 } 819 820 /** 821 * @see MetafacadeBase#initialize() 822 */ 823 @Override 824 public void initialize() 825 { 826 this.getSuperFrontEndActivityGraph().initialize(); 827 } 828 829 /** 830 * @return Object getSuperFrontEndActivityGraph().getValidationOwner() 831 * @see MetafacadeBase#getValidationOwner() 832 */ 833 @Override 834 public Object getValidationOwner() 835 { 836 Object owner = this.getSuperFrontEndActivityGraph().getValidationOwner(); 837 return owner; 838 } 839 840 /** 841 * @return String getSuperFrontEndActivityGraph().getValidationName() 842 * @see MetafacadeBase#getValidationName() 843 */ 844 @Override 845 public String getValidationName() 846 { 847 String name = this.getSuperFrontEndActivityGraph().getValidationName(); 848 return name; 849 } 850 851 /** 852 * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::graph must have an action modeled on it's initial state</p> 853 * <p><b>Error:</b> Each activity graph must have an action transition exiting the initial state, this is the minimum required.</p> 854 * <p><b>OCL:</b> context StrutsActivityGraph inv: firstAction->notEmpty()</p> 855 * <p><b>Constraint:</b> org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::front end graph must have a controller context</p> 856 * <p><b>Error:</b> An activity graph must have a controller class context to which (optionally) operations can be deferred. Make sure this graph's use-case has the FrontEndUseCase stereotype.</p> 857 * <p><b>OCL:</b> context FrontEndActivityGraph inv: controller->notEmpty()</p> 858 * @param validationMessages Collection<ModelValidationMessage> 859 * @see MetafacadeBase#validateInvariants(Collection validationMessages) 860 */ 861 @Override 862 public void validateInvariants(Collection<ModelValidationMessage> validationMessages) 863 { 864 this.getSuperFrontEndActivityGraph().validateInvariants(validationMessages); 865 try 866 { 867 final Object contextElement = this.THIS(); 868 boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.notEmpty(OCLIntrospector.invoke(contextElement,"firstAction"))); 869 if (!constraintValid) 870 { 871 validationMessages.add( 872 new ModelValidationMessage( 873 (MetafacadeBase)contextElement , 874 "org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::graph must have an action modeled on it's initial state", 875 "Each activity graph must have an action transition exiting the initial state, this is the minimum required.")); 876 } 877 } 878 catch (Throwable th) 879 { 880 Throwable cause = th.getCause(); 881 int depth = 0; // Some throwables have infinite recursion 882 while (cause != null && depth < 7) 883 { 884 th = cause; 885 depth++; 886 } 887 logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::graph must have an action modeled on it's initial state' ON " 888 + this.THIS().toString() + ": " + th.getMessage(), th); 889 } 890 try 891 { 892 final Object contextElement = this.THIS(); 893 boolean constraintValid = OCLResultEnsurer.ensure(OCLCollections.notEmpty(OCLIntrospector.invoke(contextElement,"controller"))); 894 if (!constraintValid) 895 { 896 validationMessages.add( 897 new ModelValidationMessage( 898 (MetafacadeBase)contextElement , 899 "org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::front end graph must have a controller context", 900 "An activity graph must have a controller class context to which (optionally) operations can be deferred. Make sure this graph's use-case has the FrontEndUseCase stereotype.")); 901 } 902 } 903 catch (Throwable th) 904 { 905 Throwable cause = th.getCause(); 906 int depth = 0; // Some throwables have infinite recursion 907 while (cause != null && depth < 7) 908 { 909 th = cause; 910 depth++; 911 } 912 logger.error("Error validating constraint 'org::andromda::cartridges::bpm4struts::metafacades::StrutsActivityGraph::front end graph must have a controller context' ON " 913 + this.THIS().toString() + ": " + th.getMessage(), th); 914 } 915 } 916 917 /** 918 * The property that stores the name of the metafacade. 919 */ 920 private static final String NAME_PROPERTY = "name"; 921 private static final String FQNAME_PROPERTY = "fullyQualifiedName"; 922 923 /** 924 * @see Object#toString() 925 */ 926 @Override 927 public String toString() 928 { 929 final StringBuilder toString = new StringBuilder(this.getClass().getName()); 930 toString.append("["); 931 try 932 { 933 toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY)); 934 } 935 catch (final Throwable tryAgain) 936 { 937 try 938 { 939 toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY)); 940 } 941 catch (final Throwable ignore) 942 { 943 // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property 944 } 945 } 946 toString.append("]"); 947 return toString.toString(); 948 } 949}