blob: cdbe0b3f01a88b0e03f5f2758146bc6d6ee77764 [file] [log] [blame]
package org.eclipse.modisco.infra.discovery.ui.internal.util;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.infra.discovery.catalog.DirectionKind;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererDescription;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererParameter;
import org.eclipse.modisco.infra.discovery.core.IDiscoveryManager;
import org.eclipse.modisco.infra.discovery.core.exception.DiscoveryException;
import org.eclipse.modisco.infra.discovery.core.internal.catalog.DiscovererRegistry;
import org.eclipse.modisco.infra.discovery.launch.LaunchConfiguration;
import org.eclipse.modisco.infra.discovery.launch.LaunchFactory;
import org.eclipse.modisco.infra.discovery.launch.ParameterValue;
import org.eclipse.modisco.infra.discovery.ui.Activator;
import org.eclipse.swt.widgets.Shell;
public class LaunchConfigurationUtils {
private final DiscovererDescription fDiscovererDesc;
private final Object[] fSources;
private final Shell shell;
public LaunchConfigurationUtils(final DiscovererDescription discoverer, final Object[] sourceParameter,
final Shell shell) {
this.fDiscovererDesc = discoverer;
this.fSources = sourceParameter;
this.shell = shell;
}
public void saveParameters(final Map<DiscovererParameter, Object> parameterValuesMap,
final boolean openModel) {
if (this.fSources.length != 1) {
return;
}
Object source = this.fSources[0];
LaunchConfiguration launchConfiguration = getLaunchConfigurationModel(source);
IResource iResource = getIResourceFromSource(source);
if (iResource == null) {
return;
}
launchConfiguration.setDiscoverer(this.fDiscovererDesc);
launchConfiguration.setSource(iResource);
launchConfiguration.setOpenModelAfterDiscovery(openModel);
launchConfiguration.getParameterValues().clear();
for (Entry<DiscovererParameter, Object> entry : parameterValuesMap.entrySet()) {
ParameterValue parameterValue = LaunchFactory.eINSTANCE.createParameterValue();
parameterValue.setParameter(entry.getKey());
parameterValue.setValue(entry.getValue());
launchConfiguration.getParameterValues().add(parameterValue);
}
try {
launchConfiguration.eResource().save(Collections.emptyMap());
} catch (IOException e) {
MoDiscoLogger.logError(e, Activator.getDefault());
}
}
public LaunchConfiguration getLaunchConfigurationModel(final Object source) {
if (this.fDiscovererDesc == null || this.fDiscovererDesc.getId() == null) {
return null;
}
IResource iresource = getIResourceFromSource(source);
IPath stateLocation = Activator.getDefault().getStateLocation();
IPath launchParametersFile = stateLocation.append("launchParameters"); //$NON-NLS-1$
ResourceSet resourceSet = new ResourceSetImpl();
URI resourceURI = URI.createFileURI(launchParametersFile.toOSString());
Resource resource;
if (new File(launchParametersFile.toOSString()).exists()) {
resource = resourceSet.getResource(resourceURI, true);
} else {
resource = resourceSet.createResource(resourceURI);
}
// must be in the registry's ResourceSet in order to resolve proxies
EList<Resource> registryResources = DiscovererRegistry.INSTANCE.getResourceSet()
.getResources();
if (!registryResources.contains(resource)) {
registryResources.add(resource);
}
if (iresource != null) {
EList<EObject> contents = resource.getContents();
// try to find an existing LaunchConfiguration for the
// couple (discoverer, source)
for (EObject eObject : contents) {
if (eObject instanceof LaunchConfiguration) {
LaunchConfiguration launchConfiguration = (LaunchConfiguration) eObject;
DiscovererDescription discoverer = launchConfiguration.getDiscoverer();
if (discoverer != null) {
String discovererID = discoverer.getId();
if (this.fDiscovererDesc.getId() == discovererID) {
if (iresource.equals(launchConfiguration.getSource())) {
return launchConfiguration;
}
}
}
} else {
MoDiscoLogger.logError("expected " + LaunchConfiguration.class.getSimpleName(), //$NON-NLS-1$
Activator.getDefault());
}
}
}
// not found => create a new one
LaunchConfiguration launchConfiguration = LaunchFactory.eINSTANCE
.createLaunchConfiguration();
launchConfiguration.setOpenModelAfterDiscovery(true);
resource.getContents().add(launchConfiguration);
// initialize parameters that have default values
EList<DiscovererParameter> parameters = this.fDiscovererDesc.getParameterDefinitions();
for (DiscovererParameter parameter : parameters) {
if (IDiscoveryManager.INSTANCE.hasInitialValue(parameter, this.fDiscovererDesc)) {
Object initialValue;
try {
initialValue = IDiscoveryManager.INSTANCE.getInitialValue(parameter,
this.fDiscovererDesc, source);
ParameterValue parameterValue = LaunchFactory.eINSTANCE.createParameterValue();
parameterValue.setParameter(parameter);
parameterValue.setValue(initialValue);
launchConfiguration.getParameterValues().add(parameterValue);
} catch (DiscoveryException e) {
MoDiscoLogger.logError(e, Activator.getDefault());
}
}
}
return launchConfiguration;
}
public static IResource getIResourceFromSource(final Object source) {
IResource iresource = null;
if (source instanceof IResource) {
iresource = (IResource) source;
} else {
iresource = (IResource) Platform.getAdapterManager()
.getAdapter(source, IResource.class);
}
if (iresource == null) {
return null;
}
return iresource;
}
public static List<DiscovererParameter> getExpectedInputParameters(
final DiscovererDescription discoverer) {
List<DiscovererParameter> inParameters = new ArrayList<DiscovererParameter>();
Collection<DiscovererParameter> params = discoverer.getParameterDefinitions();
for (DiscovererParameter param : params) {
if (param.getDirection() == DirectionKind.IN
|| param.getDirection() == DirectionKind.INOUT) {
inParameters.add(param);
}
}
return inParameters;
}
public DiscovererDescription getDiscoverer() {
return this.fDiscovererDesc;
}
}