package gov.nasa.jpl.mbee.mdk.ocl; import gov.nasa.jpl.mbee.mdk.util.Debug; import org.eclipse.emf.ecore.*; import org.eclipse.ocl.EvaluationEnvironment; import org.eclipse.ocl.ecore.EcoreEnvironmentFactory; import org.eclipse.ocl.ecore.EcoreEvaluationEnvironment; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * Custom class for customizing environment, allows many operations to be added * to evaluation context * * @author cinyoung */ public class DocGenEvaluationEnvironment extends EcoreEvaluationEnvironment { // keep track of all the added private List<DocGenOperation> docGenOperations = new ArrayList<DocGenOperation>(); DocGenEvaluationEnvironment() { super(); } /** * @param factory */ public DocGenEvaluationEnvironment(EcoreEnvironmentFactory factory) { super(factory); } DocGenEvaluationEnvironment( EvaluationEnvironment<EClassifier, EOperation, EStructuralFeature, EClass, EObject> parent) { super(parent); } @Override public Object callOperation(EOperation operation, int opcode, Object source, Object[] args) { for (DocGenOperation op : docGenOperations) { if (operation.getEAnnotation(op.getAnnotationName()) != null) { if (op.getName().equals(operation.getName()) && op.getParameters().size() == (args == null ? 0 : args.length)) { return op.callOperation(source, args); } } } return super.callOperation(operation, opcode, source, args); } public void addDgOperation(DocGenOperation docGenOperation) { docGenOperations.add(docGenOperation); } /* * (non-Javadoc) * * @see * org.eclipse.ocl.ecore.EcoreEvaluationEnvironment#getJavaMethodFor(org * .eclipse.emf.ecore.EOperation, java.lang.Object) * * This is overridden because the EString EClass instance wasn't mapping * it's Java instance class to String.class as it should, resulting in a * NullPointer exception */ @Override protected Method getJavaMethodFor(EOperation operation, Object receiver) { return getJavaMethodFor(operation, receiver, false); } protected Method getJavaMethodFor(EOperation operation, Object receiver, boolean recursing) { Method result = null; try { result = super.getJavaMethodFor(operation, receiver); } catch (Throwable e) { if (!recursing && operation != null && operation.getEContainingClass() != null) { EClass container = operation.getEContainingClass(); Class<?> containerClass = container.getInstanceClass(); if (containerClass == null) { if (container.getName().startsWith("String")) { container.setInstanceClass(String.class); } return getJavaMethodFor(operation, receiver, true); } } Debug.error(true, true, "Couldn't get java method for EOperation, " + operation); } return result; } }