blob: 02312995e9f6d5be232b1830ddbeb99127156e5e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2019 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 v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Borland Software Corporation - initial API and implementation
* Christopher Gerking - bug 537609
*******************************************************************************/
package org.eclipse.m2m.qvt.oml.runtime.util;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.m2m.internal.qvt.oml.ast.env.ModelExtentContents;
import org.eclipse.m2m.internal.qvt.oml.ast.parser.QvtOperationalParserUtil;
import org.eclipse.m2m.internal.qvt.oml.common.MdaException;
import org.eclipse.m2m.internal.qvt.oml.compiler.CompiledUnit;
import org.eclipse.m2m.internal.qvt.oml.compiler.QvtCompilerOptions;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.m2m.internal.qvt.oml.emf.util.URIUtils;
import org.eclipse.m2m.internal.qvt.oml.runtime.QvtRuntimePlugin;
import org.eclipse.m2m.internal.qvt.oml.runtime.launch.QvtLaunchUtil;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtCompilerFacade;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtInterpretedTransformation;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtModule;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation.TransformationParameter;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation.TransformationParameter.DirectionKind;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.TransformationUtil;
import org.eclipse.m2m.internal.qvt.oml.runtime.util.Messages;
import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
import org.eclipse.m2m.qvt.oml.TransformationExecutor;
import org.eclipse.osgi.util.NLS;
/**
* @author sboyko
*
* @noextend This class is not intended to be subclassed by clients.
* @deprecated use {@link TransformationExecutor} class instead
*/
@Deprecated
public class QvtoTransformationHelper {
/**
* This interface provides read-only access to the contents of a model extent.
*/
public interface ModelExtent {
/**
* Gets the elements which were initially contained at the creation time of this extent.
*/
List<EObject> getInitialElements();
/**
* Gets all the root objects of the current extent contents.
* Note: The result may include the original objects if not removed or moved to container.
*/
List<EObject> getAllRootElements();
}
public static interface TransfExecutionResult {
/**
*
* @return List of resources (model extents) created for each 'inout' / 'out' model parameter. Extent contains root objects only.
* <br>Model parameter comes from 'transformation' definition: <br> <code>transformation T(inout model1 : ecore, out model2 : uml);</code>
*/
List<ModelExtent> getOutModelExtents();
/**
*
* @return List of transformation output parameters created for each 'out' parameter of transformation's entry operation.
* <br>Output parameter comes from transformation's main() operation: <br> <code>main(out outParam : ecore::EPackage@model1) { .. }</code>
*/
List<EObject> getOutParameters();
/**
*
* @return Console output produced by transformation.
*/
String getConsoleOutput();
}
/**
* @param transfUri uri of the transformation script: <br>
* files like <code>file:/</code> <br>
* platform resources like <code>platform:/resource/</code> <br>
* platform plugins like <code>platform:/plugin/</code> <br>
*/
public QvtoTransformationHelper(URI transfUri) {
myTransfUri = transfUri;
}
public QvtoTransformationHelper(IFile qvtoFile) {
this(URI.createPlatformResourceURI(qvtoFile.getFullPath().toString(), false));
}
public TransfExecutionResult executeTransformation(final List<? extends EObject> inObjects, final Map<String, Object> inConfigProperties, ResourceSet metamodelResourceSet) throws CoreException {
try {
if (metamodelResourceSet == null) {
metamodelResourceSet = new ResourceSetImpl();
}
QvtModule qvtModule = TransformationUtil.getQvtModule(myTransfUri);
final List<ModelExtentContents> outExtents = new ArrayList<ModelExtentContents>();
final List<EObject> outMainParams = new ArrayList<EObject>();
final List<Trace> outTraces = new ArrayList<Trace>(1);
final List<String> outConsole = new ArrayList<String>(1);
final QvtInterpretedTransformation transf = new QvtInterpretedTransformation(qvtModule);
QvtCompilerOptions options = new QvtCompilerOptions();
options.setGenerateCompletionData(false);
//options.setMetamodelResourceSet(wrappedMetamodelResourceSet);
transf.setQvtCompilerOptions(options);
List<ModelContent> inModels = new ArrayList<ModelContent>(inObjects.size());
for (EObject inObj : inObjects) {
inModels.add(new ModelContent(Collections.singletonList(inObj)));
}
QvtLaunchUtil.doLaunch(transf, inModels, inConfigProperties,
outExtents, outMainParams, outTraces, outConsole);
transf.cleanup();
final List<ModelExtent> extents = new ArrayList<ModelExtent>();
for (ModelExtentContents nextExtent : outExtents) {
final ModelExtentContents internExtent = nextExtent;
ModelExtent modelExtent = new ModelExtent() {
public List<EObject> getAllRootElements() {
return internExtent.getAllRootElements();
}
public List<EObject> getInitialElements() {
return internExtent.getInitialElements();
}
};
extents.add(modelExtent);
}
return new TransfExecutionResult() {
public List<ModelExtent> getOutModelExtents() {
return extents;
}
public List<EObject> getOutParameters() {
return outMainParams;
}
public String getConsoleOutput() {
return outConsole.isEmpty() ? "" : outConsole.get(0); //$NON-NLS-1$
}
};
}
catch (MdaException e) {
throw new CoreException(e.getStatus() != null ? e.getStatus() : new Status(IStatus.ERROR, QvtRuntimePlugin.ID, e.getMessage()));
}
catch (Exception e) {
throw new CoreException(new Status(IStatus.ERROR, QvtRuntimePlugin.ID, e.getMessage()));
}
}
/**
*
* @return List(Transformation File URI)
* <ul>
* <li> File URI is workspace-relative created with URI.createPlatformResourceURI() call
* <li> All returned file URIs necessarily belong to single workspace plugin
* </ul>
* @throws CoreException in case file URI cannot be converted to workspace-relative scheme
*/
public List<URI> getImportedTransformations() throws CoreException {
try {
List<URI> importUris = new ArrayList<URI>();
QvtCompilerOptions compilerOptions = new QvtCompilerOptions();
compilerOptions.setGenerateCompletionData(true);
CompiledUnit compiledUnit = QvtCompilerFacade.getCompiledModule(myTransfUri, compilerOptions, null).getCompiledModule();
{
IFile file = URIUtils.getFile(compiledUnit.getURI());
if (file == null) {
throw new MdaException(NLS.bind(Messages.ImportedTransformation_NoWsFileForLocation, compiledUnit.getURI().toPlatformString(true)));
}
importUris.add(compiledUnit.getURI());
}
Set<CompiledUnit> imports = new LinkedHashSet<CompiledUnit>();
QvtOperationalParserUtil.collectAllImports(compiledUnit, imports);
for (CompiledUnit importedUnit : imports) {
URI unitURI = importedUnit.getURI();
IFile ifile = URIUtils.getFile(unitURI);
if (ifile == null) {
continue;
}
importUris.add(URI.createPlatformResourceURI(ifile.getFullPath().toString(), false));
}
return importUris;
}
catch (MdaException e) {
throw new CoreException(new Status(IStatus.ERROR, QvtRuntimePlugin.ID, e.getMessage()));
}
}
public List<String> getInputModelExtensions() throws CoreException {
try {
QvtModule qvtModule = TransformationUtil.getQvtModule(myTransfUri);
List<String> extensions = new ArrayList<String>();
for (TransformationParameter param : qvtModule.getParameters()) {
if (param.getDirectionKind() == DirectionKind.OUT) {
continue;
}
if (!param.getMetamodels().isEmpty()) {
extensions.add(param.getMetamodels().get(0).getName());
}
}
return extensions;
}
catch (MdaException e) {
throw new CoreException(new Status(IStatus.ERROR, QvtRuntimePlugin.ID, e.getMessage()));
}
}
private final URI myTransfUri;
}