/**
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the Eclipse Public License (EPL).
* Please see the license.txt included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package org.python.pydev.debug.ui.launching;
import java.io.File;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.variables.IStringVariableManager;
import org.eclipse.core.variables.VariablesPlugin;
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.IDebugUIConstants;
import org.python.pydev.core.IInterpreterManager;
import org.python.pydev.debug.core.Constants;
import org.python.pydev.debug.core.PydevDebugPlugin;
import com.aptana.shared_core.io.FileUtils;
import com.aptana.shared_core.string.FastStringBuffer;
/**
* A utility class that creates new {@link ILaunchConfiguration}s.
*
* @author radimkubacki@google.com (Radim Kubacki)
*/
public abstract class LaunchConfigurationCreator {
/**
* Builds a value of a location attribute used in launch configurations.
*
* @param file an array of resources
* @param makeRelative {@code true} to produce path relative to workspace location
* @return default string for the location field
*/
public static String getDefaultLocation(FileOrResource[] file, boolean makeRelative) {
StringBuffer buffer = new StringBuffer();
for (FileOrResource r : file) {
if (buffer.length() > 0) {
buffer.append('|');
}
String loc;
if (r.resource != null) {
if (makeRelative) {
IStringVariableManager varManager = VariablesPlugin.getDefault().getStringVariableManager();
loc = makeFileRelativeToWorkspace(r.resource, varManager);
} else {
loc = r.resource.getLocation().toOSString();
}
} else {
loc = FileUtils.getFileAbsolutePath(r.file.getAbsolutePath());
}
buffer.append(loc);
}
return buffer.toString();
}
public static ILaunchConfigurationWorkingCopy createDefaultLaunchConfiguration(FileOrResource[] resource,
String launchConfigurationType, String location, IInterpreterManager pythonInterpreterManager,
String projName) throws CoreException {
return createDefaultLaunchConfiguration(resource, launchConfigurationType, location, pythonInterpreterManager,
projName, null, "", true);
}
/**
* @param resource only used if captureOutput is true!
* @param location only used if captureOutput is false!
* @param captureOutput determines if the output should be captured or not (if captured a console will be
* shown to it by default)
*/
private static ILaunchConfigurationWorkingCopy createDefaultLaunchConfiguration(FileOrResource[] resource,
String launchConfigurationType, String location, IInterpreterManager pythonInterpreterManager,
String projName, String vmargs, String programArguments, boolean captureOutput) throws CoreException {
ILaunchManager manager = org.eclipse.debug.core.DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationType type = manager.getLaunchConfigurationType(launchConfigurationType);
if (type == null) {
throw new CoreException(PydevDebugPlugin.makeStatus(IStatus.ERROR, "Python launch configuration not found",
null));
}
IStringVariableManager varManager = VariablesPlugin.getDefault().getStringVariableManager();
String name;
String baseDirectory;
String moduleFile;
int resourceType;
if (captureOutput) {
StringBuffer buffer = new StringBuffer(projName);
buffer.append(" ");
StringBuffer resourceNames = new StringBuffer();
for (FileOrResource r : resource) {
if (resourceNames.length() > 0) {
resourceNames.append(" - ");
}
if (r.resource != null) {
resourceNames.append(r.resource.getName());
} else {
resourceNames.append(r.file.getName());
}
}
buffer.append(resourceNames);
name = buffer.toString().trim();
if (resource[0].resource != null) {
// Build the working directory to a path relative to the workspace_loc
baseDirectory = resource[0].resource.getFullPath().removeLastSegments(1).makeRelative().toString();
baseDirectory = varManager.generateVariableExpression("workspace_loc", baseDirectory);
// Build the location to a path relative to the workspace_loc
moduleFile = makeFileRelativeToWorkspace(resource, varManager);
resourceType = resource[0].resource.getType();
} else {
baseDirectory = FileUtils.getFileAbsolutePath(resource[0].file.getParentFile());
// Build the location to a path relative to the workspace_loc
moduleFile = FileUtils.getFileAbsolutePath(resource[0].file);
resourceType = IResource.FILE;
}
} else {
captureOutput = true;
name = location;
baseDirectory = new File(location).getParent();
moduleFile = location;
resourceType = IResource.FILE;
}
name = manager.generateUniqueLaunchConfigurationNameFrom(name);
ILaunchConfigurationWorkingCopy workingCopy = type.newInstance(null, name);
// Python Main Tab Arguments
workingCopy.setAttribute(Constants.ATTR_PROJECT, projName);
workingCopy.setAttribute(Constants.ATTR_RESOURCE_TYPE, resourceType);
workingCopy.setAttribute(Constants.ATTR_INTERPRETER, Constants.ATTR_INTERPRETER_DEFAULT);
workingCopy.setAttribute(Constants.ATTR_LOCATION, moduleFile);
workingCopy.setAttribute(Constants.ATTR_WORKING_DIRECTORY, baseDirectory);
workingCopy.setAttribute(Constants.ATTR_PROGRAM_ARGUMENTS, programArguments);
workingCopy.setAttribute(Constants.ATTR_VM_ARGUMENTS, vmargs);
workingCopy.setAttribute(IDebugUIConstants.ATTR_LAUNCH_IN_BACKGROUND, captureOutput);
workingCopy.setAttribute(DebugPlugin.ATTR_CAPTURE_OUTPUT, captureOutput);
if (resource[0].resource != null) {
workingCopy.setMappedResources(FileOrResource.createIResourceArray(resource));
}
return workingCopy;
}
private static String makeFileRelativeToWorkspace(FileOrResource[] resource, IStringVariableManager varManager) {
FastStringBuffer moduleFile = new FastStringBuffer(80 * resource.length);
for (FileOrResource r : resource) {
if (moduleFile.length() > 0) {
moduleFile.append("|");
}
if (r.resource != null) {
moduleFile.append(makeFileRelativeToWorkspace(r.resource, varManager));
} else {
moduleFile.append(FileUtils.getFileAbsolutePath(r.file));
}
}
return moduleFile.toString();
}
private static String makeFileRelativeToWorkspace(IResource r, IStringVariableManager varManager) {
String m = r.getFullPath().makeRelative().toString();
m = varManager.generateVariableExpression("workspace_loc", m);
return m;
}
}