org.eclipse.ocl.uml
Class UMLEvaluationEnvironment

java.lang.Object
  extended by org.eclipse.ocl.AbstractEvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
      extended by org.eclipse.ocl.uml.UMLEvaluationEnvironment
All Implemented Interfaces:
EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>, EvaluationEnvironment.Enumerations<org.eclipse.uml2.uml.EnumerationLiteral>, Customizable, Adaptable

public class UMLEvaluationEnvironment
extends AbstractEvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
implements EvaluationEnvironment.Enumerations<org.eclipse.uml2.uml.EnumerationLiteral>

Implementation of the EvaluationEnvironment for evaluation of OCL expressions on instances of UML models (i.e., on M0 models).

Author:
Christian W. Damus (cdamus)

Nested Class Summary
 
Nested classes/interfaces inherited from class org.eclipse.ocl.AbstractEvaluationEnvironment
AbstractEvaluationEnvironment.AbstractTuple<O,P>
 
Nested classes/interfaces inherited from interface org.eclipse.ocl.EvaluationEnvironment
EvaluationEnvironment.Enumerations<EL>
 
Constructor Summary
UMLEvaluationEnvironment(EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject> parent)
          Initializes me with my parent evaluation environment (nesting scope).
UMLEvaluationEnvironment(UMLEnvironmentFactory factory)
          Initializes me.
 
Method Summary
 java.lang.Object callOperation(org.eclipse.uml2.uml.Operation operation, int opcode, java.lang.Object source, java.lang.Object[] args)
          Implements the inherited method by attempting to find an appropriate Java method in the actual type of the source object and invoking it.
 java.util.Map<org.eclipse.uml2.uml.Class,java.util.Set<org.eclipse.emf.ecore.EObject>> createExtentMap(java.lang.Object object)
          Creates an extent map for invocation of OclType.allInstances() using the specified object as a context from which to find the scope in which OCL classifier extents are defined.
 Tuple<org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property> createTuple(org.eclipse.uml2.uml.Classifier type, java.util.Map<org.eclipse.uml2.uml.Property,java.lang.Object> values)
          Creates a new tuple instance.
protected  org.eclipse.emf.ecore.EClassifier getEClassifier(org.eclipse.uml2.uml.Classifier umlClassifier, java.lang.Object element)
          Looks up the Ecore definition of the specified UML classifier, using the specified element as a context for finding profile applications in the case that the classifier is a stereotype or some other type in a Profile.
protected  EvaluationMode getEffectiveEvaluationMode()
          Queries my effective evaluation mode which is just my assigned mode, unless I am EvaluationMode.ADAPTIVE.
protected  EvaluationMode getEffectiveEvaluationMode(java.lang.Object context)
          Queries my effective evaluation mode which is just my assigned mode, unless I am EvaluationMode.ADAPTIVE.
protected  org.eclipse.emf.ecore.EPackage getEPackage(org.eclipse.uml2.uml.Package pkg)
          Looks up the Ecore definition of the specified UML package.
protected  org.eclipse.emf.ecore.EPackage.Registry getEPackageRegistry()
          Obtains my package registry for looking up the Ecore definitions of UML packages.
protected  java.lang.Object getInvalidResult()
          Obtains the language-binding-specific representation of the predefined OclInvalid object.
protected  java.lang.reflect.Method getJavaMethodFor(org.eclipse.uml2.uml.Operation operation, java.lang.Object receiver)
          Returns the java method that corresponds to the supplied EOperation
 org.eclipse.uml2.uml.Classifier getType(java.lang.Object object)
          Queries the type of the specified object.
 java.lang.Object getValue(org.eclipse.uml2.uml.EnumerationLiteral enumerationLiteral)
          Implements the interface by finding the corresponding Enumerator value in a generated (or dynamic) EMF implementation, else the same enumeration literal (supporting the instance-specification model case).
 boolean isKindOf(java.lang.Object object, org.eclipse.uml2.uml.Classifier classifier)
          Queries whether an object is an instance of the specified classifier or some specialization thereof.
 boolean isTypeOf(java.lang.Object object, org.eclipse.uml2.uml.Classifier classifier)
          Queries whether an object's type is the specified classifier.
 java.lang.Object navigateAssociationClass(org.eclipse.uml2.uml.Classifier associationClass, org.eclipse.uml2.uml.Property navigationSource, java.lang.Object source)
          Obtains the instance of the specified association class that links the specified source element, optionally via the specified property.
 java.lang.Object navigateProperty(org.eclipse.uml2.uml.Property property, java.util.List<?> qualifiers, java.lang.Object source)
          Obtains the value of the specified operation, for the given source element, according to the particular metamodel semantics.
 
Methods inherited from class org.eclipse.ocl.AbstractEvaluationEnvironment
add, basicGetOptions, clear, clearOptions, getAdapter, getOptions, getParent, getValue, getValueOf, isEnabled, overrides, putOptions, remove, removeOption, removeOptions, replace, setOption, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Constructor Detail

UMLEvaluationEnvironment

public UMLEvaluationEnvironment(UMLEnvironmentFactory factory)
Initializes me.


UMLEvaluationEnvironment

public UMLEvaluationEnvironment(EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject> parent)
Initializes me with my parent evaluation environment (nesting scope).

Parameters:
parent - my parent (nesting scope); must not be null
Method Detail

getEPackageRegistry

protected final org.eclipse.emf.ecore.EPackage.Registry getEPackageRegistry()
Obtains my package registry for looking up the Ecore definitions of UML packages.

Returns:
my package registry

getEffectiveEvaluationMode

protected EvaluationMode getEffectiveEvaluationMode()
Queries my effective evaluation mode which is just my assigned mode, unless I am EvaluationMode.ADAPTIVE. In that case, I derive an effective evaluation mode from my self context variable.

Note that my effective evaluation mode is inherited from my parent evaluation environment, if I have one.

Returns:
my effective evaluation mode
Since:
1.2
See Also:
AbstractEvaluationEnvironment.getParent(), getEffectiveEvaluationMode(Object)

getEffectiveEvaluationMode

protected EvaluationMode getEffectiveEvaluationMode(java.lang.Object context)
Queries my effective evaluation mode which is just my assigned mode, unless I am EvaluationMode.ADAPTIVE. In that case, I derive an effective evaluation mode from the specified context object.

Note that my effective evaluation mode is inherited from my parent evaluation environment, if I have one.

Returns:
a context object
Since:
1.2
See Also:
AbstractEvaluationEnvironment.getParent()

callOperation

public java.lang.Object callOperation(org.eclipse.uml2.uml.Operation operation,
                                      int opcode,
                                      java.lang.Object source,
                                      java.lang.Object[] args)
                               throws java.lang.IllegalArgumentException
Description copied from class: AbstractEvaluationEnvironment
Implements the inherited method by attempting to find an appropriate Java method in the actual type of the source object and invoking it. On failure to find or invoke the method (e.g., an exception), the OclInvalid result is returned.

Specified by:
callOperation in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Overrides:
callOperation in class AbstractEvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
operation - the operation to invoke
opcode - the operation code, if this is an OCL Standard Library operation (which this environment overrides)
source - the source element on which the operation is invoked
args - the arguments, or an empty array if none
Returns:
the result of the Java method invocation, or OclInvalid on failure of the method invocation
Throws:
java.lang.IllegalArgumentException - if the operation is not supported by this environment

getJavaMethodFor

protected java.lang.reflect.Method getJavaMethodFor(org.eclipse.uml2.uml.Operation operation,
                                                    java.lang.Object receiver)
Description copied from class: AbstractEvaluationEnvironment
Returns the java method that corresponds to the supplied EOperation

Specified by:
getJavaMethodFor in class AbstractEvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
operation - the operation
Returns:
a java method

getInvalidResult

protected java.lang.Object getInvalidResult()
Description copied from class: AbstractEvaluationEnvironment
Obtains the language-binding-specific representation of the predefined OclInvalid object.

Specified by:
getInvalidResult in class AbstractEvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Returns:
OclInvalid

navigateProperty

public java.lang.Object navigateProperty(org.eclipse.uml2.uml.Property property,
                                         java.util.List<?> qualifiers,
                                         java.lang.Object source)
                                  throws java.lang.IllegalArgumentException
Description copied from interface: EvaluationEnvironment
Obtains the value of the specified operation, for the given source element, according to the particular metamodel semantics.

Specified by:
navigateProperty in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
property - the property to navigate
qualifiers - the association-end qualifier values, or an empty list if none
source - the source element owning the property value
Returns:
the property value
Throws:
java.lang.IllegalArgumentException - if the property is not supported by the element or by this environment

navigateAssociationClass

public java.lang.Object navigateAssociationClass(org.eclipse.uml2.uml.Classifier associationClass,
                                                 org.eclipse.uml2.uml.Property navigationSource,
                                                 java.lang.Object source)
                                          throws java.lang.IllegalArgumentException
Description copied from interface: EvaluationEnvironment
Obtains the instance of the specified association class that links the specified source element, optionally via the specified property.

Specified by:
navigateAssociationClass in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
associationClass - the association class to navigate to
navigationSource - in case of ambiguity, the property of the source element's classifier through which to navigate to the association class
source - the source element from which to navigate
Returns:
the association class instance
Throws:
java.lang.IllegalArgumentException - if the association class is not associated with the source element, or is not supported by this environment

createTuple

public Tuple<org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property> createTuple(org.eclipse.uml2.uml.Classifier type,
                                                                                       java.util.Map<org.eclipse.uml2.uml.Property,java.lang.Object> values)
Description copied from interface: EvaluationEnvironment
Creates a new tuple instance.

Specified by:
createTuple in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
type - the type (a TupleType) of the tuple to be created
values - a mapping of the tuple parts
Returns:
the new tuple instance

createExtentMap

public java.util.Map<org.eclipse.uml2.uml.Class,java.util.Set<org.eclipse.emf.ecore.EObject>> createExtentMap(java.lang.Object object)
Description copied from interface: EvaluationEnvironment
Creates an extent map for invocation of OclType.allInstances() using the specified object as a context from which to find the scope in which OCL classifier extents are defined. This scope may be a resource, resource set, or some metamodel-specific scope. Note that in the case that the object is not an EObject but is, instead, some primitive type, then this may be difficult to determine.

Clients are encouraged to do what they can to optimize this mapping, by lazy initialization of key-value pairs, workspace indices, or whatever means is available. Note that the map will only ever be accessed by key (Map.get(java.lang.Object)); it will never be queried for all entries, all keys, all values, etc. This knowledge could help optimization.

Specified by:
createExtentMap in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
object - a context object in the scope that covers the OCL classifier extents
Returns:
the extent map

isKindOf

public boolean isKindOf(java.lang.Object object,
                        org.eclipse.uml2.uml.Classifier classifier)
Description copied from interface: EvaluationEnvironment
Queries whether an object is an instance of the specified classifier or some specialization thereof.

Specified by:
isKindOf in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
object - an object
classifier - a classifier
Returns:
true if the specified classifier is the object's type or some supertype thereof; false, otherwise

isTypeOf

public boolean isTypeOf(java.lang.Object object,
                        org.eclipse.uml2.uml.Classifier classifier)
Description copied from interface: EvaluationEnvironment
Queries whether an object's type is the specified classifier.

Specified by:
isTypeOf in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
object - an object
classifier - a classifier
Returns:
true if ths specified classifier is the object's type; false, otherwise

getType

public org.eclipse.uml2.uml.Classifier getType(java.lang.Object object)
Description copied from interface: EvaluationEnvironment
Queries the type of the specified object.

Specified by:
getType in interface EvaluationEnvironment<org.eclipse.uml2.uml.Classifier,org.eclipse.uml2.uml.Operation,org.eclipse.uml2.uml.Property,org.eclipse.uml2.uml.Class,org.eclipse.emf.ecore.EObject>
Parameters:
object - an object
Returns:
its type

getEPackage

protected org.eclipse.emf.ecore.EPackage getEPackage(org.eclipse.uml2.uml.Package pkg)
Looks up the Ecore definition of the specified UML package.

Parameters:
pkg - a UML package
Returns:
its Ecore definition, or null if not found

getEClassifier

protected org.eclipse.emf.ecore.EClassifier getEClassifier(org.eclipse.uml2.uml.Classifier umlClassifier,
                                                           java.lang.Object element)
Looks up the Ecore definition of the specified UML classifier, using the specified element as a context for finding profile applications in the case that the classifier is a stereotype or some other type in a Profile. Finding the Ecore definition of a profile type requires finding the actual applied version of the profile.

Parameters:
umlClassifier - a UML classifier
element - an element in the context of which the OCL evaluation is being performed
Returns:
the corresponding Ecore classifier, or null if not found

getValue

public java.lang.Object getValue(org.eclipse.uml2.uml.EnumerationLiteral enumerationLiteral)
Implements the interface by finding the corresponding Enumerator value in a generated (or dynamic) EMF implementation, else the same enumeration literal (supporting the instance-specification model case).

Specified by:
getValue in interface EvaluationEnvironment.Enumerations<org.eclipse.uml2.uml.EnumerationLiteral>
Parameters:
enumerationLiteral - the enumeration literal model element
Returns:
the corresponding run-time instance
Since:
1.2