blob: 95c92863c81006573ad566bce071c73d4d35e83a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2019 Mia-Software 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:
* Gabriel Barbier (Mia-Software) - initial API and implementation
* Nicolas Bros (Mia-Software) - refactoring for new discovery framework
*******************************************************************************/
package org.eclipse.modisco.infra.discovery.ui.internal.actions;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.modisco.facet.util.emf.core.IBrowserRegistry;
import org.eclipse.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererDescription;
import org.eclipse.modisco.infra.discovery.catalog.DiscovererParameter;
import org.eclipse.modisco.infra.discovery.core.AbstractModelDiscoverer;
import org.eclipse.modisco.infra.discovery.core.IDiscoverer;
import org.eclipse.modisco.infra.discovery.core.IDiscoveryManager;
import org.eclipse.modisco.infra.discovery.core.exception.DiscoveryException;
import org.eclipse.modisco.infra.discovery.launch.LaunchConfiguration;
import org.eclipse.modisco.infra.discovery.ui.Activator;
import org.eclipse.modisco.infra.discovery.ui.Messages;
import org.eclipse.modisco.infra.discovery.ui.internal.dialogs.GenericParametersDialog;
import org.eclipse.modisco.infra.discovery.ui.internal.util.LaunchConfigurationUtils;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class MoDiscoMenuSelectionListener implements SelectionListener {
private final DiscovererDescription fDiscovererDesc;
private final Object[] fSources;
private final Shell shell;
private final LaunchConfigurationUtils lcUtils;
public MoDiscoMenuSelectionListener(final DiscovererDescription discoverer,
final Object[] sourceParameter, final Shell shell) {
this.fDiscovererDesc = discoverer;
this.fSources = sourceParameter;
this.shell = shell;
this.lcUtils = new LaunchConfigurationUtils(discoverer, sourceParameter, shell);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse
* .swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(final SelectionEvent e) {
// we will not use this method
}
private static class ParamsDialogResult {
private final Map<DiscovererParameter, Object> parameterValues;
private final boolean openModel;
private final boolean cancelled;
public ParamsDialogResult(final Map<DiscovererParameter, Object> parameterValues,
final boolean openModel, final boolean cancelled) {
this.parameterValues = parameterValues;
this.openModel = openModel;
this.cancelled = cancelled;
}
public Map<DiscovererParameter, Object> getParameterValues() {
return this.parameterValues;
}
public boolean isOpenModel() {
return this.openModel;
}
public boolean isCancelled() {
return this.cancelled;
}
}
/**
* Open a dialog box to let the user enter parameter values.
*
* @param discoverer
* @param source
*
* @return a map of (param, value), or <code>null</code> if cancelled by the
* user
*/
private ParamsDialogResult chooseParameters(final IDiscoverer<?> discoverer, final Object source) {
List<DiscovererParameter> inParameters = getExpectedInputParameters(this.fDiscovererDesc);
if (inParameters.isEmpty()) {
return new ParamsDialogResult(new HashMap<DiscovererParameter, Object>(), true, false);
}
LaunchConfiguration configurationModel = lcUtils.getLaunchConfigurationModel(source);
boolean showOpenModelCheckbox = (discoverer instanceof AbstractModelDiscoverer<?>);
GenericParametersDialog genericParametersDialog = new GenericParametersDialog(this.shell,
inParameters, getDiscoverer().getId(), showOpenModelCheckbox, configurationModel);
int result = genericParametersDialog.open();
if (result == Window.OK) {
Object[] parameterValues = genericParametersDialog.getParameterValues();
assert parameterValues.length == inParameters.size();
Map<DiscovererParameter, Object> parameterValuesMap = new HashMap<DiscovererParameter, Object>();
for (int i = 0; i < inParameters.size(); i++) {
DiscovererParameter parameter = inParameters.get(i);
parameterValuesMap.put(parameter, parameterValues[i]);
}
lcUtils.saveParameters(parameterValuesMap, genericParametersDialog.isOpenModel());
return new ParamsDialogResult(parameterValuesMap,
genericParametersDialog.isOpenModel(), false);
}
return new ParamsDialogResult(null, false, true);
}
/*
* (non-Javadoc)
*
* @see
* org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt
* .events.SelectionEvent)
*/
public void widgetSelected(final SelectionEvent event) {
final IDiscoverer<?> discoverer = IDiscoveryManager.INSTANCE
.createDiscovererImpl(this.fDiscovererDesc);
final Object[] sources = this.fSources;
for (final Object source : sources) {
final ParamsDialogResult paramsDialogResult = chooseParameters(discoverer, source);
if (paramsDialogResult.isCancelled()) {
return;
}
String name = MoDiscoMenuSelectionListener.this.getDiscoverer().getId();
Job job = new Job(NLS.bind(
Messages.MoDiscoMenuSelectionListener_modiscoDiscovererJobLabel, name)) {
@Override
protected IStatus run(final IProgressMonitor monitor) {
monitor.beginTask(Messages.MoDiscoMenuSelectionListener_discovering,
sources.length * 2);
final Map<DiscovererParameter, Object> parameterValues = paramsDialogResult
.getParameterValues();
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
discovererElement(source, parameterValues, discoverer, monitor);
monitor.worked(1);
if (paramsDialogResult.isOpenModel()) {
openModelEditor(discoverer);
}
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
};
job.setPriority(Job.LONG);
job.setUser(true);
job.schedule();
}
}
protected static void openModelEditor(final IDiscoverer<?> discoverer) {
if (discoverer instanceof AbstractModelDiscoverer<?>) {
AbstractModelDiscoverer<?> modelDiscoverer = (AbstractModelDiscoverer<?>) discoverer;
Resource targetModel = modelDiscoverer.getTargetModel();
if (targetModel != null) {
// avoid null URI (it causes NPEs in EMF)
if (targetModel.getURI() == null) {
DiscovererDescription discovererDescription = IDiscoveryManager.INSTANCE
.getDiscovererDescription(discoverer);
targetModel.setURI(URI.createURI("temp:/" + discovererDescription.getId() //$NON-NLS-1$
+ "/" + System.currentTimeMillis())); //$NON-NLS-1$
}
IBrowserRegistry.INSTANCE.browseResource(targetModel);
}
}
}
protected void discovererElement(final Object element,
final Map<DiscovererParameter, Object> parameterValues,
final IDiscoverer<?> discoverer, final IProgressMonitor monitor) {
try {
for (Entry<DiscovererParameter, Object> paramEntry : parameterValues.entrySet()) {
DiscovererParameter parameter = paramEntry.getKey();
Object value = paramEntry.getValue();
if (value != null) {
IDiscoveryManager.INSTANCE.setValue(parameter, discoverer, value);
}
}
@SuppressWarnings("unchecked")
IDiscoverer<Object> objectDiscoverer = (IDiscoverer<Object>) discoverer;
String name;
DiscovererDescription discovererDescription = IDiscoveryManager.INSTANCE
.getDiscovererDescription(discoverer);
if (discovererDescription != null) {
name = discovererDescription.getId();
} else {
name = discoverer.getClass().getName();
}
monitor.beginTask(
NLS.bind(Messages.MoDiscoMenuSelectionListener_discoveringModel, name),
IProgressMonitor.UNKNOWN);
objectDiscoverer.discoverElement(element, monitor);
} catch (final DiscoveryException e) {
MoDiscoLogger.logError(e, "Error in discovery", Activator.getDefault()); //$NON-NLS-1$
// final String location;
// StackTraceElement[] stackTrace = e.getStackTrace();
// if (stackTrace != null && stackTrace.length > 0) {
// location = "\n" + Messages.MoDiscoMenuSelectionListener_in + stackTrace[0].toString(); //$NON-NLS-1$
// } else {
// location = ""; //$NON-NLS-1$
// }
Display.getDefault().syncExec(new Runnable() {
public void run() {
MessageDialog.openError(
MoDiscoMenuSelectionListener.this.shell,
Messages.MoDiscoMenuSelectionListener_discoveryError,
NLS.bind(Messages.MoDiscoMenuSelectionListener_errorInDiscovery,
e.getLocalizedMessage()));
}
});
}
}
protected DiscovererDescription getDiscoverer() {
return this.fDiscovererDesc;
}
protected static List<DiscovererParameter> getExpectedInputParameters(
final DiscovererDescription discoverer) {
return LaunchConfigurationUtils.getExpectedInputParameters(discoverer);
}
}