blob: 553434bd0bce460b78451457dac3ceb139e92c7b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 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
*******************************************************************************/
package org.eclipse.m2m.internal.qvt.oml.runtime.launch;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.emf.common.util.BasicDiagnostic;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.m2m.internal.qvt.oml.TransformationRunner;
import org.eclipse.m2m.internal.qvt.oml.ast.env.ModelExtentContents;
import org.eclipse.m2m.internal.qvt.oml.common.MdaException;
import org.eclipse.m2m.internal.qvt.oml.common.launch.IQvtLaunchConstants;
import org.eclipse.m2m.internal.qvt.oml.common.launch.TargetUriData;
import org.eclipse.m2m.internal.qvt.oml.common.launch.TargetUriData.TargetType;
import org.eclipse.m2m.internal.qvt.oml.emf.util.EmfUtil;
import org.eclipse.m2m.internal.qvt.oml.emf.util.ModelContent;
import org.eclipse.m2m.internal.qvt.oml.evaluator.QvtRuntimeException;
import org.eclipse.m2m.internal.qvt.oml.runtime.QvtRuntimePlugin;
import org.eclipse.m2m.internal.qvt.oml.runtime.project.QvtTransformation;
import org.eclipse.m2m.internal.qvt.oml.runtime.util.MiscUtil;
import org.eclipse.m2m.internal.qvt.oml.trace.Trace;
import org.eclipse.m2m.qvt.oml.ExecutionContext;
import org.eclipse.m2m.qvt.oml.ExecutionContextImpl;
import org.eclipse.m2m.qvt.oml.util.Log;
import org.eclipse.m2m.qvt.oml.util.WriterLog;
import org.eclipse.osgi.util.NLS;
public class QvtLaunchUtil {
private QvtLaunchUtil() {}
public static ILaunchConfigurationType getInMemoryLaunchConfigurationType() {
ILaunchManager manager = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationType type = manager.getLaunchConfigurationType(InMemoryQvtLaunchConfigurationDelegate.LAUNCH_CONFIGURATION_TYPE_ID);
if (type == null) {
throw new RuntimeException("No launch configuration for id " + InMemoryQvtLaunchConfigurationDelegate.LAUNCH_CONFIGURATION_TYPE_ID); //$NON-NLS-1$
}
return type;
}
public static List<TargetUriData> getTargetUris(ILaunchConfiguration configuration) throws CoreException {
int elemCount = configuration.getAttribute(IQvtLaunchConstants.ELEM_COUNT, 0);
List<TargetUriData> targetUris = new ArrayList<TargetUriData>(elemCount);
for (int i = 0; i < elemCount; ++i) {
TargetUriData targetData = QvtLaunchUtil.getTargetUriData(configuration, i+1);
targetUris.add(targetData);
}
return targetUris;
}
public static String getTransformationURI(ILaunchConfiguration configuration) throws CoreException {
return configuration.getAttribute(IQvtLaunchConstants.MODULE, (String) null);
}
public static String getTraceFileURI(ILaunchConfiguration configuration) throws CoreException {
return configuration.getAttribute(IQvtLaunchConstants.TRACE_FILE, (String) null);
}
public static boolean shouldGenerateTraceFile(ILaunchConfiguration configuration) throws CoreException {
return configuration.getAttribute(IQvtLaunchConstants.USE_TRACE_FILE, false);
}
public static boolean isIncrementalUpdate(ILaunchConfiguration configuration) throws CoreException {
return configuration.getAttribute(IQvtLaunchConstants.IS_INCREMENTAL_UPDATE, false);
}
public static TargetUriData getTargetUriData(ILaunchConfiguration configuration, int index) throws CoreException {
TargetUriData.TargetType targetType = TargetUriData.TargetType.NEW_MODEL;
try {
targetType = TargetType.valueOf(configuration.getAttribute(getIndexedName(IQvtLaunchConstants.TARGET_TYPE, index), "NEW_MODEL")); //$NON-NLS-1$
}
catch (Exception e) {
targetType = TargetUriData.TargetType.NEW_MODEL;
}
String uri = configuration.getAttribute(getIndexedName(IQvtLaunchConstants.TARGET_MODEL, index), ""); //$NON-NLS-1$
String feature = configuration.getAttribute(getIndexedName(IQvtLaunchConstants.FEATURE_NAME, index), ""); //$NON-NLS-1$
boolean clearContents = configuration.getAttribute(getIndexedName(IQvtLaunchConstants.CLEAR_CONTENTS, index), true);
TargetUriData.ContentProvider contentProvider = null;
if (configuration.getAttributes() != null) {
contentProvider = (TargetUriData.ContentProvider) configuration.getAttributes().get(getIndexedName(IQvtLaunchConstants.CONTENT_PROVIDER, index));
}
return new TargetUriData(targetType, uri, feature, clearContents, contentProvider);
}
public static void saveTargetUriData(ILaunchConfigurationWorkingCopy configuration, List<TargetUriData> targetData) {
int index = 1;
for (TargetUriData targetUri : targetData) {
QvtLaunchUtil.saveTargetUriData(configuration, targetUri, index);
++index;
}
}
public static void saveTargetUriData(ILaunchConfigurationWorkingCopy configuration, TargetUriData targetData, int index) {
configuration.setAttribute(getIndexedName(IQvtLaunchConstants.TARGET_TYPE, index), targetData.getTargetType().toString());
configuration.setAttribute(getIndexedName(IQvtLaunchConstants.TARGET_MODEL, index), targetData.getUriString());
configuration.setAttribute(getIndexedName(IQvtLaunchConstants.FEATURE_NAME, index), targetData.getFeature());
configuration.setAttribute(getIndexedName(IQvtLaunchConstants.CLEAR_CONTENTS, index), targetData.isClearContents());
if (targetData.getContentProvider() != null) {
try {
Map<String, Object> attributes = new LinkedHashMap<String, Object>(configuration.getAttributes());
attributes.put(getIndexedName(IQvtLaunchConstants.CONTENT_PROVIDER, index), targetData.getContentProvider());
configuration.setAttributes(attributes);
} catch (CoreException e) {
}
}
}
public static Map<String, Object> getConfigurationProperty(ILaunchConfiguration configuration) {
return loadConfigurationProperties(configuration);
}
public static ExecutionContext createContext(ILaunchConfiguration configuration) {
return createContext(configuration, Log.NULL_LOG, new NullProgressMonitor());
}
public static ExecutionContext createContext(ILaunchConfiguration configuration, Log log, IProgressMonitor monitor) {
return createContext(getConfigurationProperty(configuration), log, monitor);
}
public static ExecutionContext createContext(Map<String, Object> configProps) {
return createContext(configProps, Log.NULL_LOG);
}
public static ExecutionContext createContext(Map<String, Object> configProps, Log log) {
return createContext(configProps, log, new NullProgressMonitor());
}
public static ExecutionContext createContext(Map<String, Object> configProps, Log log, IProgressMonitor monitor) {
ExecutionContextImpl context = new ExecutionContextImpl();
if (configProps != null) {
for (String name : configProps.keySet()) {
context.setConfigProperty(name, configProps.get(name));
}
}
context.setLog(log);
context.setProgressMonitor(monitor);
return context;
}
public static Map<String, Object> loadConfigurationProperties(ILaunchConfiguration configuration) {
Map<String, Object> map;
try {
Map<String, String> configProps = configuration.getAttribute(IQvtLaunchConstants.CONFIGURATION_PROPERTIES, Collections.<String, String>emptyMap());
map = new LinkedHashMap<String, Object>(configProps);
} catch (CoreException e) {
map = Collections.<String, Object>emptyMap();
QvtRuntimePlugin.getDefault().getLog().log(MiscUtil.makeErrorStatus(e));
}
return map;
}
public static Map<String, Object> getConfigProperties(ExecutionContext context) {
Map<String, Object> props = new HashMap<String, Object>();
for(String name : context.getConfigPropertyNames()) {
props.put(name, context.getConfigProperty(name));
}
return props;
}
private static String getIndexedName(String name, int index){
if (index == 0) {
return name;
}
return name + index;
}
public static void doLaunch(QvtTransformation transformation, ILaunchConfiguration configuration, ExecutionContext context) throws CoreException {
List<TargetUriData> targetUris = getTargetUris(configuration);
List<URI> paramUris = new ArrayList<URI>(targetUris.size());
for(TargetUriData data : targetUris) {
paramUris.add(data.getUri());
}
String traceFile = getTraceFileURI(configuration);
doLaunch(transformation, paramUris, toUri(traceFile), context, shouldGenerateTraceFile(configuration), isIncrementalUpdate(configuration));
}
@Deprecated
public static void doLaunch(QvtTransformation transformation, List<ModelContent> inObjs, Map<String, Object> configProps,
List<ModelExtentContents> outExtents, List<EObject> outMainParams, List<Trace> outTraces, List<String> outConsole) throws MdaException {
IStatus status = QvtValidator.validateTransformation(transformation, inObjs, null);
if (status.getSeverity() > IStatus.WARNING) {
throw new MdaException(status);
}
final StringWriter consoleLogger = new StringWriter();
ExecutionContext context = createContext(configProps, new WriterLog(consoleLogger));
org.eclipse.m2m.internal.qvt.oml.runtime.generator.TransformationRunner.In in =
new org.eclipse.m2m.internal.qvt.oml.runtime.generator.TransformationRunner.In(
inObjs.toArray(new ModelContent[inObjs.size()]), context);
org.eclipse.m2m.internal.qvt.oml.runtime.generator.TransformationRunner.Out out = transformation.run(in);
outExtents.addAll(out.getExtents());
for (Object outValue : out.getOutParamValues()) {
if (outValue instanceof EObject) {
outMainParams.add((EObject) outValue);
}
else {
outMainParams.add(null);
}
}
if (out.getTrace() != null) {
outTraces.add(out.getTrace());
}
outConsole.add(consoleLogger.getBuffer().toString());
}
public static void doLaunch(final QvtTransformation transf, List<URI> paramUris, URI traceUri, ExecutionContext context,
boolean isSaveTrace, boolean isIncrementalUpdate) throws CoreException {
TransformationRunner runner = new QvtTransformationRunner(transf, paramUris);
runner.setTraceFile(traceUri);
runner.setSaveTrace(isSaveTrace && traceUri != null);
runner.setIncrementalUpdate(isIncrementalUpdate && traceUri != null);
Diagnostic diag = runner.execute(context);
IStatus status = BasicDiagnostic.toIStatus(diag);
if (!status.isOK()) {
Throwable e = diag.getException();
// ensure stack trace access by propagating QvtRuntimeException
if (e instanceof QvtRuntimeException) {
throw (QvtRuntimeException) e;
}
throw new CoreException(status);
}
}
private static URI toUri(String uriString) throws CoreException {
if(uriString == null || uriString.length() == 0) {
return null;
}
URI uri = EmfUtil.makeUri(uriString);
if(uri == null) {
throw new CoreException(new Status(IStatus.ERROR, QvtRuntimePlugin.ID, NLS.bind(Messages.QvtValidator_InvalidUri, uriString)));
}
return uri;
}
private static class QvtTransformationRunner extends TransformationRunner {
public QvtTransformationRunner(QvtTransformation transf, List<URI> paramUris) {
super(transf, paramUris);
}
}
}