/** * Copyright (c) 2011-2012 Eclipse contributors and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.eclipse.emf.ecore.xcore.interpreter; import java.lang.reflect.InvocationTargetException; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EOperation; import org.eclipse.emf.ecore.EParameter; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.util.CancelIndicator; import org.eclipse.xtext.xbase.XBlockExpression; import org.eclipse.xtext.xbase.interpreter.IEvaluationResult; import org.eclipse.xtext.xbase.interpreter.impl.DefaultEvaluationContext; public class XcoreInvocationDelegate implements EOperation.Internal.InvocationDelegate { private XcoreInterpreter interpreter; private XBlockExpression body; private EOperation eOperation; public void initialize(XBlockExpression body, EOperation operation, XcoreInterpreter interpreter) { this.body = body; this.eOperation = operation; if (interpreter != null) { this.interpreter = interpreter; } } public Object dynamicInvoke(InternalEObject target, EList<?> arguments) throws InvocationTargetException { if (body == null) { throw new IllegalStateException("coudn't find exeutable Xbase body"); } DefaultEvaluationContext context = new DefaultEvaluationContext(); context.newValue(QualifiedName.create("this"), target); if (arguments != null) { for (int i = 0; i < arguments.size(); i++) { Object arg = arguments.get(i); EParameter parameter = eOperation.getEParameters().get(i); context.newValue(QualifiedName.create(parameter.getName()), arg); } } IEvaluationResult result = interpreter.evaluate(body, context, CancelIndicator.NullImpl); if (result.getException() != null) { throw new InvocationTargetException(result.getException()); } else { return result.getResult(); } } }