/*
* Initial version copyright 2008 Lockheed Martin Corporation, except
* as stated in the file entitled Licensing-Information.
*
* Modifications:
* Copyright 2009-2013 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.
*
* Contributors:
* MDS
*
*/
package org.modeldriven.fuml.environment;
import org.modeldriven.fuml.repository.Repository;
import UMLPrimitiveTypes.UnlimitedNatural;
import fUML.Debug;
import fUML.Semantics.Classes.Kernel.BooleanValue;
import fUML.Semantics.Classes.Kernel.DataValue;
import fUML.Semantics.Classes.Kernel.EnumerationValue;
import fUML.Semantics.Classes.Kernel.FeatureValueList;
import fUML.Semantics.Classes.Kernel.IntegerValue;
import fUML.Semantics.Classes.Kernel.PrimitiveValue;
import fUML.Semantics.Classes.Kernel.RealValue;
import fUML.Semantics.Classes.Kernel.Reference;
import fUML.Semantics.Classes.Kernel.StringValue;
import fUML.Semantics.Classes.Kernel.StructuredValue;
import fUML.Semantics.Classes.Kernel.UnlimitedNaturalValue;
import fUML.Semantics.Classes.Kernel.Value;
import fUML.Semantics.Classes.Kernel.ValueList;
import fUML.Semantics.CommonBehaviors.Communications.SignalInstance;
import fUML.Semantics.Loci.LociL1.Executor;
import fUML.Semantics.Loci.LociL1.Locus;
import fUML.Syntax.Classes.Kernel.Class_;
import fUML.Syntax.Classes.Kernel.Classifier;
import fUML.Syntax.Classes.Kernel.DataType;
import fUML.Syntax.Classes.Kernel.Element;
import fUML.Syntax.Classes.Kernel.Enumeration;
import fUML.Syntax.Classes.Kernel.PrimitiveType;
import fUML.Syntax.Classes.Kernel.StructuralFeature;
import fUML.Syntax.CommonBehaviors.BasicBehaviors.Behavior;
import fUML.Syntax.CommonBehaviors.Communications.Signal;
public class Environment {
private static Environment instance = null;
public Locus locus = null;
private PrimitiveType Boolean = null;
private PrimitiveType String = null;
private PrimitiveType Integer = null;
private PrimitiveType Real = null;
private PrimitiveType UnlimitedNatural = null;
private Environment(ExecutionFactory factory) {
this.locus = new Locus();
this.locus.setFactory(factory);
this.locus.setExecutor(new Executor());
this.locus.factory
.setStrategy(new fUML.Semantics.Classes.Kernel.RedefinitionBasedDispatchStrategy());
this.locus.factory
.setStrategy(new fUML.Semantics.CommonBehaviors.Communications.FIFOGetNextEventStrategy());
this.locus.factory
.setStrategy(new fUML.Semantics.Loci.LociL1.FirstChoiceStrategy());
this.Boolean = this.addBuiltInType("Boolean");
this.String = this.addBuiltInType("String");
this.Integer = this.addBuiltInType("Integer");
this.Real = this.addBuiltInType("Real");
this.UnlimitedNatural = this.addBuiltInType("UnlimitedNatural");
}
private PrimitiveType addBuiltInType(String name) {
PrimitiveType type = (PrimitiveType)Repository.INSTANCE.
getClassifierByName(name).getDelegate();
this.locus.factory.addBuiltInType(type);
return type;
}
public static Environment getInstance() {
return getInstance(new ExecutionFactory()); // Uses local subclass for ExecutionFactory
}
public static Environment getInstance(ExecutionFactory factory)
{
if (instance == null)
initializeInstance(factory);
return instance;
}
private static synchronized void initializeInstance(ExecutionFactory factory)
{
if (instance == null)
instance = new Environment(factory);
}
public Behavior findBehavior(String name)
{
org.modeldriven.fuml.repository.Element elem = Repository.INSTANCE.findElementByName(name);
if (elem != null) {
if (elem.getDelegate() instanceof Behavior)
return (Behavior)elem.getDelegate();
else
throw new EnvironmentException("Element '" + name + "' is not a Behavior, it is a '"
+ elem.getDelegate().getClass().getSimpleName() + "'");
}
else
return null;
}
public Element findElementById(String id)
{
org.modeldriven.fuml.repository.Element elem = Repository.INSTANCE.findElementById(id);
if (elem != null)
return elem.getDelegate();
else
return null;
}
public int getBehaviorCount()
{
return Repository.INSTANCE.getElementCount(Behavior.class);
}
public String[] getBehaviorNames()
{
return Repository.INSTANCE.getElementNames(Behavior.class);
}
public PrimitiveType getBoolean() {
return this.Boolean;
}
public PrimitiveType getString() {
return this.String;
}
public PrimitiveType getInteger() {
return this.Integer;
}
public PrimitiveType getReal() {
return this.Real;
}
public PrimitiveType getUnlimitedNatural() {
return this.UnlimitedNatural;
}
public PrimitiveValue makePrimitiveValue(Classifier classifier) {
PrimitiveType type = (PrimitiveType) classifier;
PrimitiveValue primitiveValue = null;
if (type == this.Boolean) {
primitiveValue = new BooleanValue();
} else if (type == this.Integer) {
primitiveValue = new IntegerValue();
} else if (type == this.Real) {
primitiveValue = new RealValue();
} else if (type == this.String) {
primitiveValue = new StringValue();
} else if (type == this.UnlimitedNatural) {
primitiveValue = new UnlimitedNaturalValue();
((UnlimitedNaturalValue) primitiveValue).value = new UnlimitedNatural();
}
if (primitiveValue != null) {
primitiveValue.type = type;
} else {
Debug.println("[makePrimitiveValue] " + type.name
+ " not understood.");
}
return primitiveValue;
}
public EnumerationValue makeEnumerationValue(Classifier classifier) {
Enumeration type = (Enumeration) classifier;
EnumerationValue enumerationValue = new EnumerationValue();
enumerationValue.type = type;
enumerationValue.literal = type.ownedLiteral.getValue(0);
return enumerationValue;
}
public fUML.Semantics.Classes.Kernel.StructuredValue makeStructuredValue(
fUML.Syntax.Classes.Kernel.Classifier classifier) {
StructuredValue structuredValue = null;
if (classifier instanceof DataType) {
structuredValue = new DataValue();
((DataValue) structuredValue).type = (DataType) classifier;
structuredValue.createFeatureValues();
} else if (classifier instanceof Class_) {
structuredValue = new Reference();
((Reference) structuredValue).referent = this.locus
.instantiate((Class_) classifier);
} else if (classifier instanceof Signal) {
structuredValue = new SignalInstance();
((SignalInstance) structuredValue).type = (Signal) classifier;
structuredValue.createFeatureValues();
}
FeatureValueList featureValues = structuredValue.getFeatureValues();
for (int i = 0; i < featureValues.size(); i++) {
StructuralFeature feature = featureValues.getValue(i).feature;
ValueList valueList = new ValueList();
valueList.addValue(this
.makeValue((Classifier) (feature.typedElement.type)));
structuredValue.setFeatureValue(feature, valueList, 0);
}
return structuredValue;
}
public Value makeValue(Classifier type) {
if (type == null) {
return this.makePrimitiveValue(this.String);
} else if (type instanceof PrimitiveType) {
return this.makePrimitiveValue(type);
} else if (type instanceof Enumeration) {
return this.makeEnumerationValue(type);
} else {
return this.makeStructuredValue(type);
}
} // makeValue
}