blob: 8145776c093df492f61605067cf1bd7d0c1fcfa5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 Willink Transformations 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
*
* Contributors:
* R.Dvorak and others - QVTo debugger framework
* E.D.Willink - revised API for OCL/QVTi debugger framework
*******************************************************************************/
package org.eclipse.qvtd.debug.evaluator;
import java.io.IOException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.debug.vm.evaluator.IVMEvaluator;
import org.eclipse.ocl.pivot.utilities.MetamodelManager;
import org.eclipse.ocl.pivot.utilities.NameUtil;
import org.eclipse.qvtd.pivot.qvtbase.Transformation;
import org.eclipse.qvtd.pivot.qvtbase.TypedModel;
import org.eclipse.qvtd.pivot.qvtimperative.ImperativeModel;
import org.eclipse.qvtd.pivot.qvtimperative.evaluation.QVTiTransformationAnalysis;
import org.eclipse.qvtd.xtext.qvtimperative.utilities.QVTiXtextEvaluator;
public class QVTiVMEvaluator implements IVMEvaluator
{
/* public static @NonNull EObject loadContext(@NonNull MetamodelManager metamodelManager, @NonNull URI contextURI) throws IOException {
EObject eObject = metamodelManager.getExternalResourceSet().getEObject(contextURI, true);
if (eObject == null) {
throw new IOException("Nothing loadable as '" + contextURI + "'");
}
return eObject;
}
public static @NonNull ExpressionInOCL loadExpression(@NonNull MetamodelManager metamodelManager, @NonNull URI constraintURI, boolean keepDebug) throws IOException {
EObject eObject = metamodelManager.getASResourceSet().getEObject(constraintURI, true);
return loadExpression(eObject, constraintURI);
}
public static @NonNull ExpressionInOCL loadExpression(EObject eObject, URI constraintURI)
throws IOException {
if (eObject == null) {
throw new IOException("Nothing loadable as '" + constraintURI + "'");
}
if (!(eObject instanceof Constraint)) {
throw new IOException("Constraint rather than " + eObject.eClass().getName() + " expected as '" + constraintURI + "'");
}
OpaqueExpression specification = ((Constraint)eObject).getSpecification();
if (specification != null) {
ExpressionInOCL expressionInOCL = specification.getExpressionInOCL();
if (expressionInOCL != null) {
return expressionInOCL;
}
}
throw new IOException("Missing OCL expression " + eObject.eClass().getName() + " expected as '" + constraintURI + "'");
} */
protected final @NonNull MetamodelManager metamodelManager;
protected final @NonNull Transformation transformation;
protected final @NonNull QVTiVMEnvironmentFactory vmEnvironmentFactory;
protected final @NonNull QVTiVMModelManager vmModelManager;
private boolean suspendOnStartup = false;
private QVTiVMEvaluator(@NonNull QVTiVMEnvironmentFactory vmEnvironmentFactory, @NonNull Transformation transformation) {
this.vmEnvironmentFactory = vmEnvironmentFactory;
this.metamodelManager = vmEnvironmentFactory.getEnvironmentFactory().getMetamodelManager();
this.transformation = transformation;
QVTiTransformationAnalysis transformationAnalysis = vmEnvironmentFactory.getEnvironmentFactory().createTransformationAnalysis();
transformationAnalysis.analyzeTransformation(transformation);
this.vmModelManager = vmEnvironmentFactory.createVMModelManager(transformationAnalysis);
}
public QVTiVMEvaluator(@NonNull QVTiVMEnvironmentFactory vmEnvironmentFactory, @NonNull URI transformationURI) throws IOException {
this(vmEnvironmentFactory, QVTiXtextEvaluator.loadTransformation(ImperativeModel.class, vmEnvironmentFactory.getEnvironmentFactory(), transformationURI, vmEnvironmentFactory.keepDebug()));
}
public void createModel(@NonNull String name, @NonNull URI modelURI, String contentType) {
TypedModel typedModel = NameUtil.getNameable(transformation.getModelParameter(), name);
if (typedModel == null) {
throw new IllegalStateException("Unknown TypedModel '" + name + "'");
}
Resource resource = vmEnvironmentFactory.getEnvironmentFactory().getResourceSet().createResource(modelURI, contentType);
if (resource != null) {
vmModelManager.addModel(typedModel, resource);
}
}
public void dispose() {
vmModelManager.dispose();
}
public Boolean execute() {
Transformation transformation = getTransformation();
IQVTiVMEvaluationEnvironment evalEnv = vmEnvironmentFactory.createVMEvaluationEnvironment(transformation, vmModelManager);
QVTiVMRootEvaluationVisitor visitor = vmEnvironmentFactory.createVMEvaluationVisitor(evalEnv);
visitor.start(suspendOnStartup);
return (Boolean) transformation.accept(visitor);
}
@Override
public @NonNull Transformation getDebuggable() {
return getTransformation();
}
public final @NonNull QVTiVMEnvironmentFactory getEnvironmentFactory() {
return vmEnvironmentFactory;
}
public final @NonNull MetamodelManager getMetamodelManager() {
return metamodelManager;
}
public @NonNull Transformation getTransformation() {
return transformation;
}
public final @NonNull QVTiVMModelManager getVMModelManager() {
return vmModelManager;
}
public void loadModel(@NonNull String name, @NonNull URI modelURI, String contentType) {
TypedModel typedModel = NameUtil.getNameable(transformation.getModelParameter(), name);
if (typedModel == null) {
throw new IllegalStateException("Unknown TypedModel '" + name + "'");
}
Resource resource;
if (contentType == null) {
resource = vmEnvironmentFactory.getEnvironmentFactory().getResourceSet().getResource(modelURI, true);
}
else {
resource = vmEnvironmentFactory.getEnvironmentFactory().getResourceSet().createResource(modelURI, contentType);
try {
resource.load(null);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (resource != null) {
vmModelManager.addModel(typedModel, resource);
}
}
@Override
public void saveModels() {}
@Override
public void setSuspendOnStartUp(boolean suspendOnStartup) {
this.suspendOnStartup = suspendOnStartup;
}
}