/*******************************************************************************
* Copyright (c) 2008, 2009 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:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
* Patrick Hofer (Noser Engineering AG) - fix for Bug 275685
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.launch;
import java.io.IOException;
import java.util.HashMap;
import java.util.Set;
import org.eclipse.cdt.launch.LaunchUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.linuxtools.internal.valgrind.core.ValgrindCommand;
import org.eclipse.linuxtools.valgrind.launch.IValgrindLaunchDelegate;
import org.eclipse.linuxtools.valgrind.launch.IValgrindOutputDirectoryProvider;
import org.eclipse.linuxtools.valgrind.launch.IValgrindToolPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Version;
public class ValgrindLaunchPlugin extends AbstractUIPlugin {
// The plug-in ID
public static final String PLUGIN_ID = "org.eclipse.linuxtools.valgrind.launch"; //$NON-NLS-1$
public static final String LAUNCH_ID = PLUGIN_ID + ".valgrindLaunch"; //$NON-NLS-1$
public static final String MARKER_TYPE = PLUGIN_ID + ".marker"; //$NON-NLS-1$
public static final String OUTPUT_DIR_EXT_ID = "outputDirectoryProviders"; //$NON-NLS-1$
// Extension point constants
public static final String TOOL_EXT_ID = "valgrindTools"; //$NON-NLS-1$
public static final String TOOL_EXT_DEFAULT = PLUGIN_ID + ".memcheck"; //$NON-NLS-1$
protected static final String EXT_ELEMENT_TOOL = "tool"; //$NON-NLS-1$
protected static final String EXT_ATTR_NAME = "name"; //$NON-NLS-1$
protected static final String EXT_ATTR_ID = "id"; //$NON-NLS-1$
protected static final String EXT_ATTR_PAGE = "page"; //$NON-NLS-1$
protected static final String EXT_ATTR_DELEGATE = "delegate"; //$NON-NLS-1$
protected static final String EXT_ELEMENT_PROVIDER = "provider"; //$NON-NLS-1$
protected static final String EXT_ATTR_CLASS = "class"; //$NON-NLS-1$
public static final Version VER_3_3_0 = new Version(3, 3, 0);
public static final Version VER_3_4_0 = new Version(3, 4, 0);
public static final Version VER_3_6_0 = new Version(3, 6, 0);
private static final Version MIN_VER = VER_3_3_0;
private static final String VERSION_PREFIX = "valgrind-"; //$NON-NLS-1$
private static final char VERSION_DELIMITER = '-';
protected HashMap<String, IConfigurationElement> toolMap;
private ValgrindCommand valgrindCommand;
private ILaunchConfiguration config;
private ILaunch launch;
// The shared instance
private static ValgrindLaunchPlugin plugin;
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
}
@Override
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static ValgrindLaunchPlugin getDefault() {
return plugin;
}
public Version getValgrindVersion(IProject project) throws CoreException {
Version valgrindVersion;
try {
String verString = getValgrindCommand().whichVersion(project);
verString = verString.replace(VERSION_PREFIX, ""); //$NON-NLS-1$
if (verString.indexOf(VERSION_DELIMITER) > 0) {
verString = verString.substring(0, verString.indexOf(VERSION_DELIMITER));
}
if (!verString.isEmpty()) {
valgrindVersion = Version.parseVersion(verString);
} else {
throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, Messages.getString("ValgrindLaunchPlugin.Couldn't_determine_version"))); //$NON-NLS-1$
}
} catch (IOException e) {
IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, Messages.getString("ValgrindLaunchPlugin.Couldn't_determine_version"), e); //$NON-NLS-1$
throw new CoreException(status);
}
// check for minimum supported version
if (valgrindVersion.compareTo(MIN_VER) < 0) {
throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, NLS.bind(Messages.getString("ValgrindLaunchPlugin.Error_min_version"), valgrindVersion.toString(), MIN_VER.toString()))); //$NON-NLS-1$
}
return valgrindVersion;
}
public void setValgrindCommand(ValgrindCommand command) {
valgrindCommand = command;
}
protected ValgrindCommand getValgrindCommand() {
if (valgrindCommand == null) {
valgrindCommand = new ValgrindCommand();
}
return valgrindCommand;
}
public String[] getRegisteredToolIDs() {
Set<String> ids = getToolMap().keySet();
return ids.toArray(new String[ids.size()]);
}
public String getToolName(String id) {
String name = null;
IConfigurationElement config = getToolMap().get(id);
if (config != null) {
name = config.getAttribute(EXT_ATTR_NAME);
}
return name;
}
public IValgrindToolPage getToolPage(String id) throws CoreException {
IValgrindToolPage tab = null;
IConfigurationElement config = getToolMap().get(id);
if (config != null) {
Object obj = config.createExecutableExtension(EXT_ATTR_PAGE);
if (obj instanceof IValgrindToolPage) {
tab = (IValgrindToolPage) obj;
}
}
if (tab == null) {
throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, Messages.getString("ValgrindLaunchPlugin.Cannot_retrieve_page"))); //$NON-NLS-1$
}
return tab;
}
public IValgrindLaunchDelegate getToolDelegate(String id) throws CoreException {
IValgrindLaunchDelegate delegate = null;
IConfigurationElement config = getToolMap().get(id);
if (config != null) {
Object obj = config.createExecutableExtension(EXT_ATTR_DELEGATE);
if (obj instanceof IValgrindLaunchDelegate) {
delegate = (IValgrindLaunchDelegate) obj;
}
}
if (delegate == null) {
throw new CoreException(new Status(IStatus.ERROR, PLUGIN_ID, Messages.getString("ValgrindLaunchPlugin.Cannot_retrieve_delegate"))); //$NON-NLS-1$
}
return delegate;
}
public IValgrindOutputDirectoryProvider getOutputDirectoryProvider() throws CoreException {
IValgrindOutputDirectoryProvider provider = null;
IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, OUTPUT_DIR_EXT_ID);
// if we find more than one provider just take the first one
IConfigurationElement[] configs = extPoint.getConfigurationElements();
for (int i = 0; i < configs.length && provider == null; i++) {
IConfigurationElement config = configs[i];
if (config.getName().equals(EXT_ELEMENT_PROVIDER)) {
Object obj = config.createExecutableExtension(EXT_ATTR_CLASS);
if (obj instanceof IValgrindOutputDirectoryProvider) {
provider = (IValgrindOutputDirectoryProvider) obj;
}
}
}
// if no extender, use default
if (provider == null) {
provider = new ValgrindOutputDirectoryProvider();
}
return provider;
}
public void setCurrentLaunchConfiguration(ILaunchConfiguration config) {
this.config = config;
}
/**
* @return ILaunchConfiguration associated with Valgrind execution
* currently displayed in the Valgrind view.
*/
public ILaunchConfiguration getCurrentLaunchConfiguration() {
return config;
}
public void setCurrentLaunch(ILaunch launch) {
this.launch = launch;
}
/**
* @return ILaunch associated with Valgrind execution currently displayed
* in the Valgrind view.
*/
public ILaunch getCurrentLaunch() {
return launch;
}
public static Shell getActiveWorkbenchShell() {
IWorkbenchWindow window = getDefault().getWorkbench().getActiveWorkbenchWindow();
if (window != null) {
return window.getShell();
}
return null;
}
public static Shell getShell() {
if (getActiveWorkbenchShell() != null) {
return getActiveWorkbenchShell();
}
IWorkbenchWindow[] windows = getDefault().getWorkbench().getWorkbenchWindows();
return windows[0].getShell();
}
IPath parseWSPath(String strpath) throws CoreException {
strpath = LaunchUtils.getStringVariableManager().performStringSubstitution(strpath, false);
IPath path = new Path(strpath);
if (!path.isAbsolute()) {
IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(path);
if (res != null) {
path = res.getLocation();
}
}
return path;
}
private void initializeToolMap() {
toolMap = new HashMap<>();
IExtensionPoint extPoint = Platform.getExtensionRegistry().getExtensionPoint(PLUGIN_ID, ValgrindLaunchPlugin.TOOL_EXT_ID);
IConfigurationElement[] configs = extPoint.getConfigurationElements();
for (IConfigurationElement config : configs) {
if (config.getName().equals(EXT_ELEMENT_TOOL)) {
String id = config.getAttribute(EXT_ATTR_ID);
if (id != null && config.getAttribute(EXT_ATTR_NAME) != null
&& config.getAttribute(EXT_ATTR_PAGE) != null
&& config.getAttribute(EXT_ATTR_DELEGATE) != null) {
toolMap.put(id, config);
}
}
}
}
private HashMap<String, IConfigurationElement> getToolMap() {
if (toolMap == null) {
initializeToolMap();
}
return toolMap;
}
}