/******************************************************************************* * Copyright (c) 2013 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.windup.ui.internal.launch; import static org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants.ATTR_PROJECT_NAME; import static org.jboss.tools.windup.model.domain.WorkspaceResourceUtils.getProjectsFromSelection; import static org.jboss.tools.windup.model.domain.WindupConstants.DEFAULT; import static org.jboss.tools.windup.model.domain.WindupConstants.LAUNCH_TYPE; import static org.jboss.tools.windup.ui.internal.Messages.errorConfiguringWindup; import static org.jboss.tools.windup.ui.internal.Messages.selectExistinConfiguration; import static org.jboss.tools.windup.ui.internal.Messages.selectLaunchConfiguration; import java.text.Collator; import java.util.List; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; 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.debug.ui.DebugUITools; import org.eclipse.debug.ui.IDebugModelPresentation; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.window.Window; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import org.jboss.tools.windup.model.domain.ModelService; import org.jboss.tools.windup.model.domain.WindupConstants; import org.jboss.tools.windup.ui.WindupUIPlugin; import org.jboss.tools.windup.windup.ConfigurationElement; import com.google.common.collect.Lists; /** * Utility for launching Windup. */ public class LaunchUtils { public static void launch(ISelection selection, String mode, ModelService modelService) { List<IProject> projects = getProjectsFromSelection(selection); if (!projects.isEmpty()) { IProject project = projects.get(0); launch(project, mode, modelService); } } public static void launch(IEditorPart editor, String mode, ModelService modelService) { IProject project = LaunchUtils.getProjectFromEditor(editor).getProject(); launch(project, mode, modelService); } public static IProject getProjectFromEditor(IEditorPart editor) { IEditorInput input = editor.getEditorInput(); if (!(input instanceof IFileEditorInput)) { return null; } return ((IFileEditorInput)input).getFile().getProject(); } private static void launch(IProject project, String mode, ModelService modelService) { ILaunchConfiguration currentConfig = computeConfiguration(project, modelService); if (currentConfig != null) { DebugUITools.launch(currentConfig, mode); } } private static ILaunchConfiguration computeConfiguration(IProject project, ModelService modelService) { ILaunchConfiguration currentConfig = null; LaunchConfig launchConfig = new LaunchConfig(project); try { List<ILaunchConfiguration> candidates = collectCandidates(launchConfig); if (candidates.isEmpty()) { currentConfig = createConfiguration(launchConfig, modelService); } else if (candidates.size() == 1) { currentConfig = candidates.get(0); } else { currentConfig = chooseConfiguration(candidates); } } catch (CoreException e) { MessageDialog.openError(null, errorConfiguringWindup, e.getMessage()); } return currentConfig; } private static ILaunchConfiguration chooseConfiguration(List<ILaunchConfiguration> configList) { IDebugModelPresentation labelProvider = DebugUITools.newDebugModelPresentation(); ElementListSelectionDialog dialog= new ElementListSelectionDialog( WindupUIPlugin.getActiveWorkbenchShell(), labelProvider); dialog.setElements(configList.toArray()); dialog.setTitle(selectLaunchConfiguration); dialog.setMessage(selectExistinConfiguration); dialog.setMultipleSelection(false); int result = dialog.open(); labelProvider.dispose(); if (result == Window.OK) { return (ILaunchConfiguration) dialog.getFirstResult(); } return null; } private static List<ILaunchConfiguration> collectCandidates(LaunchConfig launchConfig) throws CoreException { List<ILaunchConfiguration> candidates = Lists.newArrayList(); ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); for (ILaunchConfiguration configuration : launchManager.getLaunchConfigurations()) { if (launchConfig.matches(configuration)) { candidates.add(configuration); } } return candidates; } public static ILaunchConfiguration createConfiguration(LaunchConfig config, ModelService modelService) throws CoreException { String name = config.project.getName(); ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); ILaunchConfigurationType configType = launchManager.getLaunchConfigurationType(LAUNCH_TYPE); ILaunchConfigurationWorkingCopy wc = configType.newInstance(null, launchManager.generateLaunchConfigurationName(name)); wc.setAttribute(ATTR_PROJECT_NAME, config.project.getName()); ConfigurationElement configuration = modelService.findConfiguration(name); if (configuration == null) { configuration = modelService.createConfiguration(config.project.getName()); } boolean exists = configuration.getInputs().stream().filter(i -> { return i.getName().equals(name); } ).findAny().isPresent(); if (!exists) { modelService.createInput(configuration, Lists.newArrayList(config.project)); } return wc.doSave(); } private static class LaunchConfig { private IProject project; private LaunchConfig(IProject project) { this.project = project; } private boolean matches(ILaunchConfiguration other) throws CoreException { return WindupConstants.LAUNCH_TYPE.equals(other.getType().getIdentifier()) && Collator.getInstance().equals(project.getName(), other.getAttribute(ATTR_PROJECT_NAME, DEFAULT)); } } }