/* * Initial version copyright 2008 Lockheed Martin Corporation, except * as stated in the file entitled Licensing-Information. * * All modifications copyright 2009-2017 Data Access Technologies, Inc. * * Licensed under the Academic Free License version 3.0 * (http://www.opensource.org/licenses/afl-3.0.php), except as stated * in the file entitled Licensing-Information. */ package fUML.Semantics.Loci.LociL1; import fUML.Debug; import UMLPrimitiveTypes.*; import fUML.Syntax.*; import fUML.Syntax.Classes.Kernel.*; import fUML.Syntax.CommonBehaviors.BasicBehaviors.*; import fUML.Semantics.*; import fUML.Semantics.Classes.Kernel.*; import fUML.Semantics.CommonBehaviors.BasicBehaviors.*; public abstract class ExecutionFactory extends org.modeldriven.fuml.FumlObject { public fUML.Semantics.Loci.LociL1.Locus locus = null; public fUML.Semantics.CommonBehaviors.BasicBehaviors.OpaqueBehaviorExecutionList primitiveBehaviorPrototypes = new fUML.Semantics.CommonBehaviors.BasicBehaviors.OpaqueBehaviorExecutionList(); public fUML.Syntax.Classes.Kernel.PrimitiveTypeList builtInTypes = new fUML.Syntax.Classes.Kernel.PrimitiveTypeList(); public fUML.Semantics.Loci.LociL1.SemanticStrategyList strategies = new fUML.Semantics.Loci.LociL1.SemanticStrategyList(); public fUML.Semantics.CommonBehaviors.BasicBehaviors.Execution createExecution( fUML.Syntax.CommonBehaviors.BasicBehaviors.Behavior behavior, fUML.Semantics.Classes.Kernel.Object_ context) { // Create an execution object for a given behavior. // The execution will take place at the locus of the factory in the // given context. // If the context is empty, the execution is assumed to provide its own // context. Execution execution; if (behavior instanceof OpaqueBehavior) { execution = this .instantiateOpaqueBehaviorExecution((OpaqueBehavior) behavior); } else { execution = (Execution) this.instantiateVisitor(behavior); execution.types.addValue(behavior); execution.createFeatureValues(); } this.locus.add(execution); if (context == null) { execution.context = execution; } else { execution.context = context; } return execution; } // createExecution public fUML.Semantics.Classes.Kernel.Evaluation createEvaluation( fUML.Syntax.Classes.Kernel.ValueSpecification specification) { // Create an evaluation object for a given value specification. // The evaluation will take place at the locus of the factory. Evaluation evaluation = (Evaluation) this .instantiateVisitor(specification); evaluation.specification = specification; evaluation.locus = this.locus; return evaluation; } // createEvaluation public abstract fUML.Semantics.Loci.LociL1.SemanticVisitor instantiateVisitor( fUML.Syntax.Classes.Kernel.Element element); public fUML.Semantics.CommonBehaviors.BasicBehaviors.OpaqueBehaviorExecution instantiateOpaqueBehaviorExecution( fUML.Syntax.CommonBehaviors.BasicBehaviors.OpaqueBehavior behavior) { // Return a copy of the prototype for the primitive behavior execution // of the given opaque behavior. OpaqueBehaviorExecution execution = null; int i = 1; while (execution == null & i <= this.primitiveBehaviorPrototypes.size()) { // Debug.println("[instantiateOpaqueExecution] Checking " + // this.primitiveBehaviorPrototypes.getValue(i).objectId() + "..."); OpaqueBehaviorExecution prototype = this.primitiveBehaviorPrototypes .getValue(i - 1); if (prototype.getBehavior() == behavior) { execution = (OpaqueBehaviorExecution) (prototype.copy()); } i = i + 1; } Debug.println(execution == null, "[instantiateOpaqueExecution] No prototype execution found for " + behavior.name + "."); return execution; } // instantiateOpaqueBehaviorExecution public void addPrimitiveBehaviorPrototype( fUML.Semantics.CommonBehaviors.BasicBehaviors.OpaqueBehaviorExecution execution) { // Add an opaque behavior execution to use as a prototype for // instantiating the corresponding primitive opaque behavior. // Precondition: No primitive behavior prototype for the type of the // given execution should already exist. this.primitiveBehaviorPrototypes.addValue(execution); } // addPrimitiveBehaviorPrototype public void addBuiltInType(fUML.Syntax.Classes.Kernel.PrimitiveType type) { // Add the given primitive type as a built-in type. // Precondition: No built-in type with the same name should already // exist. this.builtInTypes.addValue(type); } // addBuiltInType public fUML.Syntax.Classes.Kernel.PrimitiveType getBuiltInType(String name) { // Return the built-in type with the given name. PrimitiveType type = null; int i = 1; while (type == null & i <= this.builtInTypes.size()) { PrimitiveType primitiveType = this.builtInTypes.getValue(i - 1); if (primitiveType.name.equals(name)) { type = primitiveType; } i = i + 1; } return type; } // getBuiltInType public void setStrategy(fUML.Semantics.Loci.LociL1.SemanticStrategy strategy) { // Set the strategy for a semantic variation point. Any existing // strategy for the same SVP is replaced. int i = this.getStrategyIndex(strategy.getName()); if (i <= this.strategies.size()) { this.strategies.removeValue(i - 1); } this.strategies.addValue(strategy); } // setStrategy public fUML.Semantics.Loci.LociL1.SemanticStrategy getStrategy(String name) { // Get the strategy with the given name. int i = this.getStrategyIndex(name); SemanticStrategy strategy = null; if (i <= this.strategies.size()) { strategy = this.strategies.getValue(i - 1); } return strategy; } // getStrategy public int getStrategyIndex(String name) { // Get the index of the strategy with the given name. // If there is no such strategy, return the size of the strategies list. SemanticStrategyList strategies = this.strategies; int i = 1; boolean unmatched = true; while (unmatched & (i <= strategies.size())) { if (strategies.getValue(i - 1).getName().equals(name)) { unmatched = false; } else { i = i + 1; } } return i; } // getStrategyIndex } // ExecutionFactory