Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.debug.core/core/org/eclipse/debug/internal')
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java4
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties4
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java13
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java183
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java272
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java35
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java124
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java141
-rw-r--r--org.eclipse.debug.core/core/org/eclipse/debug/internal/core/groups/GroupMemberChangeListener.java3
9 files changed, 719 insertions, 60 deletions
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java
index c93185478..535a8d628 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.java
@@ -8,6 +8,7 @@
* Contributors:
* IBM - Initial API and implementation
* Anton Kosyakov (Itemis AG) - Bug 438621 - [step filtering] Provide an extension point to enhance methods step filtering.
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -68,6 +69,9 @@ public class DebugCoreMessages extends NLS {
public static String LaunchConfigurationWorkingCopy_1;
public static String LaunchConfigurationWorkingCopy_2;
public static String LaunchConfigurationWorkingCopy_3;
+ public static String LaunchConfigurationWorkingCopy_6;
+ public static String LaunchConfigurationWorkingCopy_7;
+ public static String LaunchConfigurationWorkingCopy_8;
public static String LaunchDelegate_0;
public static String LaunchDelegate_1;
public static String LaunchDelegate_2;
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties
index 988bdef8a..446354429 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/DebugCoreMessages.properties
@@ -8,6 +8,7 @@
# Contributors:
# IBM Corporation - initial API and implementation
# Anton Kosyakov (Itemis AG) - Bug 438621 - [step filtering] Provide an extension point to enhance methods step filtering.
+# Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
###############################################################################
Breakpoint_no_associated_marker=Breakpoint does not have an associated marker.
@@ -79,6 +80,9 @@ LaunchConfigurationWorkingCopy_1=Writing local file
LaunchConfigurationWorkingCopy_2=Creating new file {0}.launch in workspace
LaunchConfigurationWorkingCopy_3=Setting contents of {0}.launch
LaunchConfigurationWorkingCopy_4=Unable to obtain storage to write launch configuration
+LaunchConfigurationWorkingCopy_6=The launch configuration must be a prototype
+LaunchConfigurationWorkingCopy_7=Unable to set a launch configuration prototype on a launch configuration working copy
+LaunchConfigurationWorkingCopy_8=Writing local file
LaunchManager__0__occurred_while_reading_launch_configuration_file__1___1={0} occurred while reading launch configuration file: {1}.
LaunchManager_Invalid_launch_configuration_index__18=Invalid launch configuration index.
LaunchManager_does_not_exist=Launch configuration {0} at {1} does not exist.
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java
index 2e225285e..1948399de 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/IConfigurationElementConstants.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2017 IBM Corporation and others.
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -341,4 +342,14 @@ public interface IConfigurationElementConstants {
* <p>Equal to the word: <code>editorInput</code></p>
*/
public static final String EDITOR_INPUT = "editorInput"; //$NON-NLS-1$
+
+ /**
+ * The allowPrototypes node name for a configuration element
+ * <p>
+ * Equal to the word: <code>allowPrototypes</code>
+ * </p>
+ *
+ * @since 3.12
+ */
+ public static final String ALLOW_PROTOTYPES = "allowPrototypes"; //$NON-NLS-1$
}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
index e6a15dfc7..df33c3472 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfiguration.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2014 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* 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
@@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Sascha Radike - bug 56642
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -17,6 +18,7 @@ import java.io.IOException;
import java.io.StringReader;
import java.net.URI;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -109,6 +111,22 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
public static final String ATTR_PREFERRED_LAUNCHERS = DebugPlugin.getUniqueIdentifier() + ".preferred_launchers"; //$NON-NLS-1$
/**
+ * Launch configuration attribute storing a memento identifying the prototype
+ * this configuration was made from, possibly <code>null</code>.
+ *
+ * @since 3.12
+ */
+ public static final String ATTR_PROTOTYPE = DebugPlugin.getUniqueIdentifier() + ".ATTR_PROTOTYPE"; //$NON-NLS-1$
+
+ /**
+ * Launch configuration attribute storing if this configuration is a
+ * prototype or not.
+ *
+ * @since 3.12
+ */
+ public static final String IS_PROTOTYPE = DebugPlugin.getUniqueIdentifier() + ".IS_PROTOTYPE"; //$NON-NLS-1$
+
+ /**
* Status handler to prompt in the UI thread
*
* @since 3.3
@@ -142,6 +160,12 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
private IContainer fContainer;
/**
+ * If this configuration is a prototype.
+ * @since 3.12
+ */
+ private boolean fIsPrototype;
+
+ /**
* Constructs a launch configuration with the given name. The configuration
* is stored in the given container or locally with workspace metadata if
* the specified container is <code>null</code>.
@@ -151,9 +175,24 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
* @since 3.5
*/
protected LaunchConfiguration(String name, IContainer container) {
+ this(name, container, false);
+ }
+
+ /**
+ * Constructs a launch configuration with the given name. The configuration
+ * is stored in the given container or locally with workspace metadata if
+ * the specified container is <code>null</code>.
+ *
+ * @param name launch configuration name
+ * @param container parent container or <code>null</code>
+ * @param prototype if the configuration is a prototype or not
+ * @since 3.12
+ */
+ protected LaunchConfiguration(String name, IContainer container, boolean prototype) {
initialize();
setName(name);
setContainer(container);
+ fIsPrototype = prototype;
}
/**
@@ -170,11 +209,11 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
* @since 3.5
*/
protected LaunchConfiguration(IFile file) {
- this(getSimpleName(file.getName()), file.getParent());
+ this(getSimpleName(file.getName()), file.getParent(), isPrototype(file));
}
/**
- * Given a name that ends with .launch, return the simple name of the configuration.
+ * Given a name that ends with .launch or .prototype, return the simple name of the configuration.
*
* @param fileName the name to parse
* @return simple name
@@ -184,6 +223,8 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
IPath path = new Path(fileName);
if(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equals(path.getFileExtension())) {
return path.removeFileExtension().toString();
+ } else if (ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION.equals(path.getFileExtension())) {
+ return path.removeFileExtension().toString();
}
return fileName;
}
@@ -304,6 +345,23 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
}
}
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#delete(int)
+ */
+ @Override
+ public void delete(int flag) throws CoreException {
+ if (flag == UPDATE_PROTOTYPE_CHILDREN && isPrototype()) {
+ // clear back pointers to this configuration
+ Collection<ILaunchConfiguration> children = getPrototypeChildren();
+ for (ILaunchConfiguration child : children) {
+ ILaunchConfigurationWorkingCopy childWC = child.getWorkingCopy();
+ childWC.setPrototype(null, false);
+ childWC.doSave();
+ }
+ }
+ delete();
+ }
+
/**
* Returns whether this configuration is equal to the
* given configuration. Two configurations are equal if
@@ -449,12 +507,16 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
* Returns the simple file name of this launch configuration.
*
* @return the simple file name of this launch configuration - for example
- * "Abc.launch"
+ * "Abc.launch" or "Abc.prototype"
*/
protected String getFileName() {
StringBuffer buf = new StringBuffer(getName());
buf.append('.');
- buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
+ if (isPrototype()) {
+ buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION);
+ } else {
+ buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
+ }
return buf.toString();
}
@@ -994,5 +1056,116 @@ public class LaunchConfiguration extends PlatformObject implements ILaunchConfig
return getName();
}
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#getPrototype()
+ */
+ @Override
+ public ILaunchConfiguration getPrototype() throws CoreException {
+ String memento = getAttribute(ATTR_PROTOTYPE, (String)null);
+ if (memento != null) {
+ LaunchConfiguration prototype = new LaunchConfiguration(memento);
+ prototype.setIsPrototype(true);
+ return prototype;
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#getPrototypeChildren()
+ */
+ @Override
+ public Collection<ILaunchConfiguration> getPrototypeChildren() throws CoreException {
+ ILaunchConfiguration[] configurations = getLaunchManager().getLaunchConfigurations(getType());
+ List<ILaunchConfiguration> proteges = new ArrayList<ILaunchConfiguration>();
+ for (int i = 0; i < configurations.length; i++) {
+ ILaunchConfiguration config = configurations[i];
+ if (this.equals(config.getPrototype())) {
+ proteges.add(config);
+ }
+ }
+ return proteges;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#isPrototype()
+ */
+ @Override
+ public boolean isPrototype() {
+ return fIsPrototype;
+ }
+
+ /**
+ * Set the prototype state of this configuration.
+ *
+ * @param isPrototype the prototype state.
+ *
+ * @since 3.12
+ */
+ protected void setIsPrototype(boolean isPrototype) {
+ fIsPrototype = isPrototype;
+ }
+
+ /**
+ * Check if the given file is a launch configuration prototype or not.
+ *
+ * @param file the given {@link IFile}.
+ * @return <code>true</code> if the given file is a launch configuration
+ * prototype, false otherwise.
+ *
+ * @since 3.12
+ */
+ protected static boolean isPrototype(IFile file) {
+ if (ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION.equals(file.getFileExtension())) {
+ return true;
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#getKind()
+ */
+ @Override
+ public int getKind() throws CoreException {
+ if (fIsPrototype) {
+ return PROTOTYPE;
+ }
+ return CONFIGURATION;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#isAttributeModified(java.lang.String)
+ */
+ @Override
+ public boolean isAttributeModified(String attribute) throws CoreException {
+ ILaunchConfiguration prototype = getPrototype();
+ if (prototype != null) {
+ Object prototypeValue = prototype.getAttributes().get(attribute);
+ Object attributeValue = getAttributes().get(attribute);
+ return !LaunchConfigurationInfo.compareAttribute(attribute, prototypeValue, attributeValue);
+ }
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see
+ * org.eclipse.debug.core.ILaunchConfiguration#getPrototypeVisibleAttributes
+ * ()
+ */
+ @Override
+ public Set<String> getPrototypeVisibleAttributes() throws CoreException {
+ return getInfo().getVisibleAttributes();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#
+ * setPrototypeAttributeVisibility(java.lang.String, boolean)
+ */
+ @Override
+ public void setPrototypeAttributeVisibility(String attribute, boolean visible) throws CoreException {
+ getInfo().setAttributeVisibility(attribute, visible);
+ }
}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
index 1692d6101..72aa2114d 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationInfo.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* 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
@@ -7,12 +7,14 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -22,6 +24,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+import java.util.stream.Collectors;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
@@ -31,6 +34,7 @@ import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationType;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -60,6 +64,8 @@ public class LaunchConfigurationInfo {
private static final String INT_ATTRIBUTE = "intAttribute"; //$NON-NLS-1$
private static final String STRING_ATTRIBUTE = "stringAttribute"; //$NON-NLS-1$
private static final String TYPE = "type"; //$NON-NLS-1$
+ private static final String PROTOTYPE = "prototype"; //$NON-NLS-1$
+ private static final String VISIBLE_ATTRIBUTES = "visibleAttributes"; //$NON-NLS-1$
/**
* This configurations attribute table. Keys are <code>String</code>s and
@@ -76,6 +82,26 @@ public class LaunchConfigurationInfo {
private ILaunchConfigurationType fType;
/**
+ * Whether this configuration is a prototype
+ */
+ private boolean fIsPrototype = false;
+
+ /**
+ * This launch configuration's prototype (can be <code>null</code> if this launch configuration is already a prototype).
+ */
+ private ILaunchConfiguration fPrototype;
+
+ /**
+ * This prototype's visible attributes (can be <code>null</code> if launch configuration is not a prototype).
+ */
+ private Set<String> fVisibleAttributes;
+
+ /**
+ * Static access to the launch manager.
+ */
+ private static LaunchManager fgLaunchManager = (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
+
+ /**
* Whether running on Sun 1.4 VM - see bug 110215
*/
private static boolean fgIsSun14x = false;
@@ -270,6 +296,18 @@ public class LaunchConfigurationInfo {
}
/**
+ * Returns the raw object from the attribute table or <code>null</code> if none.
+ *
+ * @param key attribute key
+ * @return raw attribute value
+ *
+ * @since 3.12
+ */
+ protected Object getObjectAttribute(String key) {
+ return getAttributeTable().get(key);
+ }
+
+ /**
* Returns the <code>java.util.Map</code> attribute with the given key or
* the given default value if undefined.
* @param key the name of the attribute
@@ -316,6 +354,28 @@ public class LaunchConfigurationInfo {
return fType;
}
+ /**
+ * Sets this configuration's prototype.
+ *
+ * @param prototype
+ * launch configuration prototype
+ *
+ * @since 3.12
+ */
+ protected void setPrototype(ILaunchConfiguration prototype) {
+ fPrototype = prototype;
+ }
+
+ /**
+ * Returns this configuration's prototype, if it exists.
+ *
+ * @return launch configuration prototype (can be <code>null</code>)
+ *
+ * @since 3.12
+ */
+ protected ILaunchConfiguration getPrototype() {
+ return fPrototype;
+ }
/**
* Returns a copy of this info object
@@ -326,6 +386,9 @@ public class LaunchConfigurationInfo {
LaunchConfigurationInfo copy = new LaunchConfigurationInfo();
copy.setType(getType());
copy.setAttributeTable(getAttributes());
+ copy.setIsPrototype(isPrototype());
+ copy.setPrototype(getPrototype());
+ copy.setVisibleAttributes(getVisibleAttributes());
return copy;
}
@@ -350,8 +413,14 @@ public class LaunchConfigurationInfo {
protected void setAttribute(String key, Object value) {
if (value == null) {
getAttributeTable().remove(key);
+ setAttributeVisibility(key, false);
} else {
- getAttributeTable().put(key, value);
+ Object attribute = getAttributeTable().put(key, value);
+ // If attribute is new in the table and the configuration is a
+ // prototype, then add it to the visible attributes
+ if (attribute == null && fIsPrototype) {
+ setAttributeVisibility(key, true);
+ }
}
}
@@ -376,6 +445,13 @@ public class LaunchConfigurationInfo {
configRootElement.setAttribute(TYPE, getType().getIdentifier());
+ ILaunchConfiguration prototype = getPrototype();
+ if (prototype != null) {
+ configRootElement.setAttribute(PROTOTYPE, prototype.getName());
+ } else if (isPrototype()) {
+ configRootElement.setAttribute(VISIBLE_ATTRIBUTES, getVisibleAttributes().stream().collect(Collectors.joining(", "))); //$NON-NLS-1$
+ }
+
for (String key : getAttributeTable().keySet()) {
if (key == null) {
throw new DebugException(
@@ -509,6 +585,19 @@ public class LaunchConfigurationInfo {
* @throws CoreException if a problem is encountered
*/
protected void initializeFromXML(Element root) throws CoreException {
+ initializeFromXML(root, false);
+ }
+
+ /**
+ * Initializes the mapping of attributes from the XML file
+ *
+ * @param root the root node from the XML document
+ * @param isPrototype if the XML file corresponds to a prototype
+ * @throws CoreException if a problem is encountered
+ *
+ * @since 3.12
+ */
+ protected void initializeFromXML(Element root, boolean isPrototype) throws CoreException {
if (!root.getNodeName().equalsIgnoreCase(LAUNCH_CONFIGURATION)) {
throw getInvalidFormatDebugException();
}
@@ -555,6 +644,27 @@ public class LaunchConfigurationInfo {
}
}
}
+
+ if (isPrototype) {
+ setIsPrototype(true);
+ String visibleAttributes = root.getAttribute(VISIBLE_ATTRIBUTES);
+ if (visibleAttributes != null && visibleAttributes.length() > 0) {
+ String[] split = visibleAttributes.split(", "); //$NON-NLS-1$
+ setVisibleAttributes(new HashSet<>(Arrays.asList(split)));
+ }
+ } else {
+ setIsPrototype(false);
+ String prototype = root.getAttribute(PROTOTYPE);
+ if (prototype != null && prototype.length() > 0) {
+ ILaunchConfiguration[] launchConfigurations = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(ILaunchConfiguration.PROTOTYPE);
+ for (ILaunchConfiguration iLaunchConfiguration : launchConfigurations) {
+ if (prototype.equals(iLaunchConfiguration.getName())) {
+ setPrototype(iLaunchConfiguration);
+ break;
+ }
+ }
+ }
+ }
}
/**
@@ -730,6 +840,13 @@ public class LaunchConfigurationInfo {
return false;
}
+ // In case of a prototype, make sure the visible attributes are the same
+ if (isPrototype() != other.isPrototype()) {
+ return false;
+ } else if (isPrototype() && !getVisibleAttributes().equals(other.getVisibleAttributes())) {
+ return false;
+ }
+
// Make sure the attributes are the same
return compareAttributes(fAttributes, other.getAttributeTable());
}
@@ -743,42 +860,63 @@ public class LaunchConfigurationInfo {
* @return whether the two attribute maps are equal
*/
protected boolean compareAttributes(TreeMap<String, Object> map1, TreeMap<String, Object> map2) {
- LaunchManager manager = (LaunchManager)DebugPlugin.getDefault().getLaunchManager();
if (map1.size() == map2.size()) {
Iterator<String> attributes = map1.keySet().iterator();
while (attributes.hasNext()) {
String key = attributes.next();
Object attr1 = map1.get(key);
Object attr2 = map2.get(key);
- if (attr2 == null) {
+ if (!compareAttribute(key, attr1, attr2)) {
return false;
}
- Comparator<Object> comp = manager.getComparator(key);
- if (comp == null) {
- if (fgIsSun14x) {
- if(attr2 instanceof String & attr1 instanceof String) {
- // this is a hack for bug 110215, on SUN 1.4.x, \r
- // is stripped off when the stream is written to the
- // DOM
- // this is not the case for 1.5.x, so to be safe we
- // are stripping \r off all strings before we
- // compare for equality
- attr1 = ((String)attr1).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
- attr2 = ((String)attr2).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
- if (!attr1.equals(attr2)) {
- return false;
- }
- } else {
- if (comp.compare(attr1, attr2) != 0) {
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether the two attributes are equal, considering comparator extensions.
+ *
+ * @param key attribute key
+ * @param attr1 attribute value
+ * @param attr2 attribute value to compare to, possibly <code>null</code>
+ * @return whether equivalent
+ *
+ * @since 3.12
+ */
+ protected static boolean compareAttribute(String key, Object attr1, Object attr2) {
+ if (attr2 == null) {
+ return false;
+ }
+ Comparator<Object> comp = fgLaunchManager.getComparator(key);
+ if (comp == null) {
+ String strAttr1 = null;
+ String strAttr2 = null;
+ if (fgIsSun14x) {
+ if(attr2 instanceof String & attr1 instanceof String) {
+ // this is a hack for bug 110215, on SUN 1.4.x, \r
+ // is stripped off when the stream is written to the
+ // DOM
+ // this is not the case for 1.5.x, so to be safe we
+ // are stripping \r off all strings before we
+ // compare for equality
+ strAttr1 = ((String)attr1).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ strAttr2 = ((String)attr2).replaceAll("\\r", ""); //$NON-NLS-1$ //$NON-NLS-2$
+ if (!strAttr1.equals(strAttr2)) {
return false;
}
}
}
- return true;
+ if (strAttr1 == null && strAttr2 == null && !attr1.equals(attr2)) {
+ return false;
+ }
+ } else {
+ if (comp.compare(attr1, attr2) != 0) {
+ return false;
+ }
}
- return false;
+ return true;
}
/**
@@ -815,5 +953,89 @@ public class LaunchConfigurationInfo {
}
return null;
}
+
+ /**
+ * Sets whether this info is a prototype.
+ *
+ * @param isPrototype
+ *
+ * @since 3.12
+ */
+ protected void setIsPrototype(boolean isPrototype) {
+ fIsPrototype = isPrototype;
+ }
+
+ /**
+ * Returns whether this info is a prototype.
+ *
+ * @return whether a prototype
+ *
+ * @since 3.12
+ */
+ protected boolean isPrototype() {
+ return fIsPrototype;
+ }
+
+ /**
+ * Get the visible attributes of this prototype (return <code>null</code> if
+ * the launch configuration is not a prototype).
+ *
+ * @return the visible attributes of this prototype (return
+ * <code>null</code> if the launch configuration is not a
+ * prototype).
+ *
+ * @since 3.12
+ */
+ protected Set<String> getVisibleAttributes() {
+ if (!isPrototype()) {
+ return null;
+ } else if (fVisibleAttributes == null) {
+ initializeVisibleAttributes();
+ }
+ return fVisibleAttributes;
+ }
+
+ /**
+ * Initialize the visible attributes of this launch configuration. All
+ * attributes are visible by default.
+ *
+ * @since 3.12
+ */
+ private void initializeVisibleAttributes() {
+ fVisibleAttributes = new HashSet<>(getAttributeTable().keySet());
+ }
+
+ /**
+ * Set the visible attributes of this prototype. Do not call this method on
+ * a launch configuration that is not a prototype.
+ *
+ * @param visibleAttributes the visible attributes
+ *
+ * @since 3.12
+ */
+ protected void setVisibleAttributes(Set<String> visibleAttributes) {
+ if (visibleAttributes != null) {
+ fVisibleAttributes = new HashSet<>(visibleAttributes);
+ }
+ }
+
+ /**
+ * Set visibility of the given attribute. Do not call this method on a
+ * launch configuration that is not a prototype.
+ *
+ * @param attribute the given attribute
+ * @param visible the visibility
+ *
+ * @since 3.12
+ */
+ protected void setAttributeVisibility(String attribute, boolean visible) {
+ if (fVisibleAttributes != null) {
+ if (visible) {
+ fVisibleAttributes.add(attribute);
+ } else {
+ fVisibleAttributes.remove(attribute);
+ }
+ }
+ }
}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
index 8848883ed..cd7595266 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationType.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2013 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -518,5 +519,37 @@ public class LaunchConfigurationType extends PlatformObject implements ILaunchCo
void resetPreferredDelegates() {
fPreferredDelegates = null;
}
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationType#getPrototypes()
+ */
+ @Override
+ public ILaunchConfiguration[] getPrototypes() throws CoreException {
+ return DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(this, ILaunchConfiguration.PROTOTYPE);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationType#newPrototypeInstance(org.eclipse.core.resources.IContainer, java.lang.String)
+ */
+ @Override
+ public ILaunchConfigurationWorkingCopy newPrototypeInstance(IContainer container, String name) throws CoreException {
+ LaunchConfigurationWorkingCopy wc = new LaunchConfigurationWorkingCopy(container, name, this, true);
+ return wc;
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationType#supportsPrototypes()
+ */
+ @Override
+ public boolean supportsPrototypes() {
+ String allowPrototypesString = fElement.getAttribute(IConfigurationElementConstants.ALLOW_PROTOTYPES);
+ if (allowPrototypesString != null) {
+ if (allowPrototypesString.equalsIgnoreCase("true")) { //$NON-NLS-1$
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
index cbf77aabf..ec489c414 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchConfigurationWorkingCopy.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2015 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* 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
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -16,6 +17,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -91,7 +93,7 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
* working copy's attributes based on the original configuration
*/
protected LaunchConfigurationWorkingCopy(LaunchConfiguration original) throws CoreException {
- super(original.getName(), original.getContainer());
+ super(original.getName(), original.getContainer(), original.isPrototype());
copyFrom(original);
setOriginal(original);
fSuppressChange = false;
@@ -117,7 +119,7 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
* working copy's attributes based on the original configuration
*/
protected LaunchConfigurationWorkingCopy(LaunchConfigurationWorkingCopy parent) throws CoreException {
- super(parent.getName(), parent.getContainer());
+ super(parent.getName(), parent.getContainer(), parent.isPrototype());
copyFrom(parent);
setOriginal((LaunchConfiguration) parent.getOriginal());
fParent = parent;
@@ -136,7 +138,7 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
* working copy's attributes based on the original configuration
*/
protected LaunchConfigurationWorkingCopy(LaunchConfiguration original, String name) throws CoreException {
- super(name, original.getContainer());
+ super(name, original.getContainer(), original.isPrototype());
copyFrom(original);
fSuppressChange = false;
}
@@ -151,9 +153,26 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
* @param type the type of this working copy
*/
protected LaunchConfigurationWorkingCopy(IContainer container, String name, ILaunchConfigurationType type) {
- super(name, container);
+ this(container, name, type, false);
+ }
+
+ /**
+ * Constructs a new working copy to be created in the specified
+ * location.
+ *
+ * @param container the container that the configuration will be created in
+ * or <code>null</code> if to be local
+ * @param name the name of the new launch configuration
+ * @param type the type of this working copy
+ * @param prototype if this copy is a prototype or not
+ *
+ * @since 3.12
+ */
+ protected LaunchConfigurationWorkingCopy(IContainer container, String name, ILaunchConfigurationType type, boolean prototype) {
+ super(name, container, prototype);
setInfo(new LaunchConfigurationInfo());
getInfo().setType(type);
+ getInfo().setIsPrototype(prototype);
fSuppressChange = false;
}
@@ -227,7 +246,7 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
lmonitor.done();
}
}
- return new LaunchConfiguration(getName(), getContainer());
+ return new LaunchConfiguration(getName(), getContainer(), isPrototype());
}
/**
@@ -241,7 +260,7 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
// set up from/to information if this is a move
boolean moved = (!isNew() && isMoved());
if (moved) {
- ILaunchConfiguration to = new LaunchConfiguration(getName(), getContainer());
+ ILaunchConfiguration to = new LaunchConfiguration(getName(), getContainer(), isPrototype());
ILaunchConfiguration from = getOriginal();
getLaunchManager().setMovedFromTo(from, to);
}
@@ -379,9 +398,9 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
}
// notify of add/change for both local and shared configurations - see bug 288368
if (added) {
- getLaunchManager().launchConfigurationAdded(new LaunchConfiguration(getName(), getContainer()));
+ getLaunchManager().launchConfigurationAdded(new LaunchConfiguration(getName(), getContainer(), isPrototype()));
} else {
- getLaunchManager().launchConfigurationChanged(new LaunchConfiguration(getName(), getContainer()));
+ getLaunchManager().launchConfigurationChanged(new LaunchConfiguration(getName(), getContainer(), isPrototype()));
}
}
finally {
@@ -462,6 +481,15 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
}
/**
+ * @see ILaunchConfigurationWorkingCopy#setAttribute(String, Object)
+ */
+ @Override
+ public void setAttribute(String attributeName, Object value) {
+ getInfo().setAttribute(attributeName, value);
+ setDirty();
+ }
+
+ /**
* @see ILaunchConfigurationWorkingCopy#getOriginal()
*/
@Override
@@ -755,5 +783,81 @@ public class LaunchConfigurationWorkingCopy extends LaunchConfiguration implemen
public Object removeAttribute(String attributeName) {
return getInfo().removeAttribute(attributeName);
}
-}
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#copyAttributes(org.eclipse.debug.core.ILaunchConfiguration)
+ */
+ @Override
+ public void copyAttributes(ILaunchConfiguration prototype) throws CoreException {
+ Map<String, Object> map = prototype.getAttributes();
+ LaunchConfigurationInfo info = getInfo();
+ info.setPrototype(prototype);
+ Set<String> prototypeVisibleAttributes = prototype.getPrototypeVisibleAttributes();
+ if (prototypeVisibleAttributes != null) {
+ prototypeVisibleAttributes.forEach(key -> {
+ Object value = map.get(key);
+ if (value != null) {
+ info.setAttribute(key, value);
+ }
+ });
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#setTemplate(org.eclipse.debug.core.ILaunchConfiguration, boolean)
+ */
+ @Override
+ public void setPrototype(ILaunchConfiguration prototype, boolean copy) throws CoreException {
+ if (prototype != null && !prototype.isPrototype()) {
+ throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_6));
+ }
+ if (prototype != null && prototype.isWorkingCopy()) {
+ throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_7));
+ }
+ if (prototype == null) {
+ getInfo().setPrototype(null);
+ removeAttribute(ATTR_PROTOTYPE);
+ } else {
+ if (isPrototype()) {
+ throw new CoreException(new Status(IStatus.ERROR, DebugPlugin.getUniqueIdentifier(), DebugCoreMessages.LaunchConfigurationWorkingCopy_8));
+ }
+ getInfo().setPrototype(prototype);
+ if (copy) {
+ copyAttributes(prototype);
+ }
+ setAttribute(ATTR_PROTOTYPE, prototype.getMemento());
+ setAttribute(IS_PROTOTYPE, false);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfigurationWorkingCopy#doSave(int)
+ */
+ @Override
+ public ILaunchConfiguration doSave(int flag) throws CoreException {
+ Collection<ILaunchConfiguration> children = null;
+ if (UPDATE_PROTOTYPE_CHILDREN == flag) {
+ if (!isNew() && isMoved() && getParent() == null) {
+ children = getOriginal().getPrototypeChildren();
+ }
+ }
+ ILaunchConfiguration saved = doSave();
+ if (children != null) {
+ for (ILaunchConfiguration child : children) {
+ ILaunchConfigurationWorkingCopy wc = child.getWorkingCopy();
+ wc.setPrototype(saved, false);
+ wc.doSave();
+ }
+ }
+ return saved;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchConfiguration#setAttributeVisibility(String, boolean)
+ */
+ @Override
+ public void setPrototypeAttributeVisibility(String attribute, boolean visible) throws CoreException {
+ super.setPrototypeAttributeVisibility(attribute, visible);
+ setDirty();
+ }
+}
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
index 32cdb6a01..f7078181f 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/LaunchManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
* 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
@@ -12,6 +12,7 @@
* attempt to disconnect debug targets before terminating them
* Alena Laskavaia - Bug 259281
* Marc Khouzam - Bug 313143: Preferred Launch Delegate not recovered from preferences
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core;
@@ -34,6 +35,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -378,7 +380,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
IResource resource = delta.getResource();
if (resource instanceof IFile) {
IFile file = (IFile)resource;
- if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equals(file.getFileExtension())) {
+ if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equals(file.getFileExtension()) || ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION.equals(file.getFileExtension())) {
ILaunchConfiguration handle = new LaunchConfiguration(file);
switch (delta.getKind()) {
case IResourceDelta.ADDED :
@@ -476,7 +478,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
@Override
public boolean visit(IResourceProxy proxy) {
if (proxy.getType() == IResource.FILE) {
- if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equalsIgnoreCase(proxy.requestFullPath().getFileExtension())) {
+ if (ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION.equalsIgnoreCase(proxy.requestFullPath().getFileExtension()) | ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION.equalsIgnoreCase(proxy.requestFullPath().getFileExtension())) {
fList.add(proxy.requestResource());
}
return false;
@@ -947,12 +949,33 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
ParserConfigurationException,
IOException,
SAXException {
+ return createInfoFromXML(stream, false);
+ }
+
+ /**
+ * Return a LaunchConfigurationInfo object initialized from XML contained in
+ * the specified stream. Simply pass out any exceptions encountered so that
+ * caller can deal with them. This is important since caller may need access
+ * to the actual exception.
+ *
+ * @param stream the {@link InputStream} to read from
+ * @param isPrototype if the XML corresponds to a prototype
+ * @return the new {@link LaunchConfigurationInfo}
+ * @throws CoreException if a problem is encountered
+ * @throws ParserConfigurationException if the stream fails to parse
+ * @throws IOException if there is a problem handling the given stream or
+ * writing the new info file
+ * @throws SAXException if there is a SAX parse exception
+ *
+ * @since 3.12
+ */
+ protected LaunchConfigurationInfo createInfoFromXML(InputStream stream, boolean isPrototype) throws CoreException, ParserConfigurationException, IOException, SAXException {
Element root = null;
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
parser.setErrorHandler(new DefaultHandler());
root = parser.parse(new InputSource(stream)).getDocumentElement();
LaunchConfigurationInfo info = new LaunchConfigurationInfo();
- info.initializeFromXML(root);
+ info.initializeFromXML(root, isPrototype);
return info;
}
@@ -1011,23 +1034,37 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
IPath containerPath = LOCAL_LAUNCH_CONFIGURATION_CONTAINER_PATH;
final File directory = containerPath.toFile();
if (directory.isDirectory()) {
- FilenameFilter filter = new FilenameFilter() {
+ List<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>();
+ FilenameFilter configFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return dir.equals(directory) &&
name.endsWith(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
}
};
- File[] files = directory.listFiles(filter);
- if (files.length > 0) {
- List<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>(10);
+ File[] configFiles = directory.listFiles(configFilter);
+ if (configFiles.length > 0) {
+ LaunchConfiguration config = null;
+ for (int i = 0; i < configFiles.length; i++) {
+ config = new LaunchConfiguration(LaunchConfiguration.getSimpleName(configFiles[i].getName()), null, false);
+ configs.add(config);
+ }
+ }
+ FilenameFilter prototypeFilter = new FilenameFilter() {
+ @Override
+ public boolean accept(File dir, String name) {
+ return dir.equals(directory) && name.endsWith(ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION);
+ }
+ };
+ File[] prototypeFiles = directory.listFiles(prototypeFilter);
+ if (prototypeFiles.length > 0) {
LaunchConfiguration config = null;
- for (int i = 0; i < files.length; i++) {
- config = new LaunchConfiguration(LaunchConfiguration.getSimpleName(files[i].getName()), null);
+ for (int i = 0; i < prototypeFiles.length; i++) {
+ config = new LaunchConfiguration(LaunchConfiguration.getSimpleName(prototypeFiles[i].getName()), null, true);
configs.add(config);
}
- return configs;
}
+ return configs;
}
return Collections.EMPTY_LIST;
}
@@ -1160,7 +1197,8 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
*/
protected synchronized String[] getAllSortedConfigNames() {
if (fSortedConfigNames == null) {
- ILaunchConfiguration[] configs = getLaunchConfigurations();
+ List<ILaunchConfiguration> collection = getAllLaunchConfigurations();
+ ILaunchConfiguration[] configs = collection.toArray(new ILaunchConfiguration[collection.size()]);
fSortedConfigNames = new String[configs.length];
for (int i = 0; i < configs.length; i++) {
fSortedConfigNames[i] = configs[i].getName();
@@ -1368,7 +1406,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
BufferedInputStream stream = null;
try {
stream = new BufferedInputStream(store.openInputStream(EFS.NONE, null));
- info = createInfoFromXML(stream);
+ info = createInfoFromXML(stream, isPrototype(store));
synchronized (this) {
fLaunchConfigurations.put(config, info);
}
@@ -1403,6 +1441,38 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
}
/**
+ * Check if the given {@link IFileStore} is a prototype.
+ *
+ * @param store the given {@link IFileStore}
+ * @return <code>true</code> if the given {@link IFileStore} is a prototype,
+ * <code>false</code> otherwise.
+ *
+ * @since 3.12
+ */
+ private boolean isPrototype(IFileStore store) {
+ if (store.getName().endsWith("." + ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION)) { //$NON-NLS-1$
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Check if the given {@link File} is a prototype.
+ *
+ * @param file the given {@link File}
+ * @return <code>true</code> if the given {@link File} is a prototype,
+ * <code>false</code> otherwise.
+ *
+ * @since 3.12
+ */
+ private boolean isPrototype(File file) {
+ if (file.getName().endsWith("." + ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION)) { //$NON-NLS-1$
+ return true;
+ }
+ return false;
+ }
+
+ /**
* @see ILaunchManager#getLaunchConfiguration(IFile)
*/
@Override
@@ -1425,8 +1495,33 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
*/
@Override
public synchronized ILaunchConfiguration[] getLaunchConfigurations() {
+ return getLaunchConfigurations(ILaunchConfiguration.CONFIGURATION);
+ }
+
+ /**
+ * @see org.eclipse.debug.core.ILaunchManager#getLaunchConfigurations(int)
+ */
+ @Override
+ public ILaunchConfiguration[] getLaunchConfigurations(int kinds) {
List<ILaunchConfiguration> allConfigs = getAllLaunchConfigurations();
- return allConfigs.toArray(new ILaunchConfiguration[allConfigs.size()]);
+ if (((kinds & ILaunchConfiguration.CONFIGURATION) > 0) && ((kinds & ILaunchConfiguration.PROTOTYPE) > 0)) {
+ // all kinds
+ return allConfigs.toArray(new ILaunchConfiguration[allConfigs.size()]);
+ } else {
+ List<ILaunchConfiguration> select = new ArrayList<ILaunchConfiguration>(allConfigs.size());
+ Iterator<ILaunchConfiguration> iterator = allConfigs.iterator();
+ while (iterator.hasNext()) {
+ ILaunchConfiguration config = iterator.next();
+ try {
+ if ((config.getKind() & kinds) > 0) {
+ select.add(config);
+ }
+ } catch (CoreException e) {
+ DebugPlugin.log(e);
+ }
+ }
+ return select.toArray(new ILaunchConfiguration[select.size()]);
+ }
}
/**
@@ -1434,9 +1529,17 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
*/
@Override
public synchronized ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type) throws CoreException {
+ return getLaunchConfigurations(type, ILaunchConfiguration.CONFIGURATION);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.debug.core.ILaunchManager#getLaunchConfigurations(org.eclipse.debug.core.ILaunchConfigurationType, int)
+ */
+ @Override
+ public synchronized ILaunchConfiguration[] getLaunchConfigurations(ILaunchConfigurationType type, int kinds) throws CoreException {
List<ILaunchConfiguration> configs = new ArrayList<ILaunchConfiguration>();
for (ILaunchConfiguration config : getAllLaunchConfigurations()) {
- if (config.getType().equals(type)) {
+ if (config.getType().equals(type) && ((config.getKind() & kinds) > 0)) {
configs.add(config);
}
}
@@ -2571,7 +2674,11 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
if (!config.isLocal()) {
StringBuffer buf = new StringBuffer(config.getName());
buf.append('.');
- buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
+ if (config.isPrototype()) {
+ buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_PROTOTYPE_FILE_EXTENSION);
+ } else {
+ buf.append(ILaunchConfiguration.LAUNCH_CONFIGURATION_FILE_EXTENSION);
+ }
sharedConfigs.put(buf.toString(), config);
}
}
@@ -2592,7 +2699,7 @@ public class LaunchManager extends PlatformObject implements ILaunchManager, IRe
boolean added = !target.exists();
try {
copyFile(source, target);
- ILaunchConfiguration configuration = new LaunchConfiguration(LaunchConfiguration.getSimpleName(source.getName()), null);
+ ILaunchConfiguration configuration = new LaunchConfiguration(LaunchConfiguration.getSimpleName(source.getName()), null, isPrototype(source));
ILaunchConfiguration shared = sharedConfigs.get(target.getName());
if (shared != null) {
setMovedFromTo(shared, configuration);
diff --git a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/groups/GroupMemberChangeListener.java b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/groups/GroupMemberChangeListener.java
index 3208b538b..55d63d0ca 100644
--- a/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/groups/GroupMemberChangeListener.java
+++ b/org.eclipse.debug.core/core/org/eclipse/debug/internal/core/groups/GroupMemberChangeListener.java
@@ -7,6 +7,7 @@
*
* Contributors:
* SSI Schaefer IT Solutions GmbH
+ * Axel Richard (Obeo) - Bug 41353 - Launch configurations prototypes
*******************************************************************************/
package org.eclipse.debug.internal.core.groups;
@@ -40,7 +41,7 @@ public class GroupMemberChangeListener implements ILaunchConfigurationListener {
return;
}
try {
- for (ILaunchConfiguration c : DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(type)) {
+ for (ILaunchConfiguration c : DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations(type, ILaunchConfiguration.CONFIGURATION | ILaunchConfiguration.PROTOTYPE)) {
List<GroupLaunchElement> elements = GroupLaunchConfigurationDelegate.createLaunchElements(c);
boolean updated = false;
for (GroupLaunchElement e : elements) {

Back to the top