/*******************************************************************************
* Copyright (c) 2012 Red Hat Inc.
* All rights reserved. This program and the accompanying materials
* are 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:
* Sami Wagiaalla <swagiaal@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.systemtap.ui.ide.launcher;
import java.util.ArrayList;
import java.util.LinkedList;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
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.ILaunchShortcut2;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.linuxtools.internal.systemtap.ui.ide.editors.stp.PathEditorInput;
import org.eclipse.linuxtools.profiling.launch.ProfileLaunchShortcut;
import org.eclipse.linuxtools.systemtap.graphing.ui.widgets.ExceptionErrorDialog;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ide.ResourceUtil;
public class SystemTapScriptLaunchShortcut extends ProfileLaunchShortcut implements ILaunchShortcut2 {
@Override
public void launch(IEditorPart editor, String mode) {
String path;
String project = null;
if(editor.getEditorInput() instanceof PathEditorInput){
path = ((PathEditorInput)editor.getEditorInput()).getPath().toString();
} else {
IFile file = ResourceUtil.getFile(editor.getEditorInput());
path = file.getLocation().toString();
project = file.getProject().getName();
}
this.searchAndLaunch(path, project);
}
@Override
public void launch(ISelection selection, String mode) {
IFile file = (IFile)((TreeSelection)selection).getFirstElement();
String path = file.getLocation().toOSString();
String project = file.getProject().getName();
this.searchAndLaunch(path, project);
}
private void searchAndLaunch(String path, String project){
ILaunchConfiguration configuration = findLaunchConfiguration(path, project);
if (configuration == null){
return;
}
try {
configuration.launch(ILaunchManager.RUN_MODE, new NullProgressMonitor());
} catch (CoreException e) {
ExceptionErrorDialog.openError(Messages.SystemTapScriptLaunchShortcut_couldNotLaunchScript, e);
}
}
private ILaunchConfiguration findLaunchConfiguration(String scriptPath, String scriptProject) {
ILaunchConfiguration configuration = null;
ArrayList<ILaunchConfiguration> candidateConfigurations = new ArrayList<>();
try {
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfiguration[] configs = launchManager
.getLaunchConfigurations(getLaunchConfigType());
for (ILaunchConfiguration config: configs){
if (config.getAttribute(SystemTapScriptLaunchConfigurationTab.SCRIPT_PATH_ATTR, "").equals(scriptPath)){ //$NON-NLS-1$
candidateConfigurations.add(config);
}
}
int candidateCount = candidateConfigurations.size();
if (candidateCount == 0) {
LinkedList<String> configNames = new LinkedList<>();
configs = launchManager.getLaunchConfigurations();
for (ILaunchConfiguration config : configs) {
configNames.add(config.getName());
}
String configName = (scriptProject == null ? "" : scriptProject + " ") //$NON-NLS-1$ //$NON-NLS-2$
+ Path.fromOSString(scriptPath).lastSegment();
String wcName = configName;
int conflict_index, conflict_count = 0;
while ((conflict_index = configNames.indexOf(wcName)) != -1) {
wcName = configName.concat(String.format(" (%d)", ++conflict_count)); //$NON-NLS-1$
configNames.remove(conflict_index);
}
ILaunchConfigurationType type = getLaunchConfigType();
ILaunchConfigurationWorkingCopy wc = type.newInstance(null, wcName);
wc.setAttribute(SystemTapScriptLaunchConfigurationTab.SCRIPT_PATH_ATTR, scriptPath);
configuration = wc.doSave();
} else if (candidateCount == 1) {
configuration = candidateConfigurations.get(0);
} else {
configuration = chooseConfiguration(candidateConfigurations,
ILaunchManager.RUN_MODE);
}
} catch (CoreException e) {
ExceptionErrorDialog.openError(Messages.SystemTapScriptLaunchShortcut_couldNotFindConfig, e);
}
return configuration;
}
@Override
protected ILaunchConfigurationType getLaunchConfigType() {
return getLaunchManager().getLaunchConfigurationType(
SystemTapScriptLaunchConfigurationDelegate.CONFIGURATION_TYPE);
}
@Override
protected void setDefaultProfileAttributes(ILaunchConfigurationWorkingCopy wc) {
}
@Override
public ILaunchConfiguration[] getLaunchConfigurations(ISelection selection) {
return null;
}
@Override
public ILaunchConfiguration[] getLaunchConfigurations(IEditorPart editorpart) {
return null;
}
@Override
public IResource getLaunchableResource(ISelection selection) {
return null;
}
@Override
public IResource getLaunchableResource(IEditorPart editorpart) {
return null;
}
}