blob: 46d715e3ed3908e12e900ff157b7cdf5cece92aa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 Borland Software Corporation 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:
* Borland Software Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.stdlib;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QVTOEnvironment;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalEvaluationEnv;
import org.eclipse.m2m.internal.qvt.oml.ast.env.QvtOperationalStdLibrary;
import org.eclipse.m2m.internal.qvt.oml.evaluator.ModuleInstance;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtInterruptedExecutionException;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtRuntimeException;
import org.eclipse.m2m.internal.qvt.oml.evaluator.TransformationInstance.InternalTransformation;
import org.eclipse.m2m.internal.qvt.oml.stdlib.model.ExceptionInstance;
import org.eclipse.m2m.internal.qvt.oml.stdlib.model.StatusInstance;
import org.eclipse.m2m.internal.qvt.oml.stdlib.model.StdlibFactory;
import org.eclipse.ocl.types.OCLStandardLibrary;
public class TransformationOperations extends AbstractContextualOperations {
static final String TRANSFORM_NAME = "transform"; //$NON-NLS-1$
static final String PARALLEL_TRANSFORM_NAME = "parallelTransform"; //$NON-NLS-1$
static final String WAIT_NAME = "wait"; //$NON-NLS-1$
public TransformationOperations(AbstractQVTStdlib library) {
super(library, library.getTransformationClass());
}
@Override
protected OperationProvider[] getOperations() {
QVTOEnvironment environment = getStdlib().getEnvironment();
OCLStandardLibrary<EClassifier> oclStdLibrary = environment.getOCLStandardLibrary();
EClassifier statusList = environment.getTypeResolver().resolveListType(oclStdLibrary.getT());
return new OwnedOperationProvider[] {
new OwnedOperationProvider(createTransformHandler(getStdlib()), TRANSFORM_NAME, getStdlib().getStatusClass()),
new OwnedOperationProvider(UNSUPPORTED_OPER, PARALLEL_TRANSFORM_NAME, getStdlib().getStatusClass()),
new OwnedOperationProvider(UNSUPPORTED_OPER, WAIT_NAME, new String[] { "statusList" }, //$NON-NLS-1$
oclStdLibrary.getOclVoid(), statusList)
};
}
private static CallHandler createTransformHandler(final AbstractQVTStdlib stdlib) {
return new CallHandler() {
public Object invoke(ModuleInstance module, Object source, Object[] args, QvtOperationalEvaluationEnv evalEnv) {
ModuleInstance moduleInstance = (ModuleInstance) source;
CallHandler mainHandler = moduleInstance.getAdapter(InternalTransformation.class).getTransformationHandler();
if(mainHandler == null) {
// module has no main operation => return invalid
return CallHandlerAdapter.getInvalidResult(evalEnv);
}
StdlibFactory stdlibFactory = QvtOperationalStdLibrary.INSTANCE.getStdlibFactory();
// Note: !!!! exception throw from here is captured by MDT OCL and turned into OCLInvalid
try {
mainHandler.invoke(moduleInstance, source, args, evalEnv);
} catch(QvtInterruptedExecutionException e) {
throw e;
} catch(QvtRuntimeException e) {
ExceptionInstance raisedException = stdlibFactory.createException(QvtOperationalStdLibrary.INSTANCE.getExceptionClass(),
e.getLocalizedMessage(), e.getQvtStackTrace());
StatusInstance status = stdlibFactory.createFailure(raisedException);
return status;
}
return stdlibFactory.createSuccess();
}
};
}
}