Index: src/org/eclipse/pde/internal/core/product/ProductModelFactory.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/product/ProductModelFactory.java,v retrieving revision 1.13 diff -u -r1.13 ProductModelFactory.java --- src/org/eclipse/pde/internal/core/product/ProductModelFactory.java 2 Jan 2008 15:56:22 -0000 1.13 +++ src/org/eclipse/pde/internal/core/product/ProductModelFactory.java 23 Jul 2008 23:26:03 -0000 @@ -10,19 +10,7 @@ *******************************************************************************/ package org.eclipse.pde.internal.core.product; -import org.eclipse.pde.internal.core.iproduct.IAboutInfo; -import org.eclipse.pde.internal.core.iproduct.IArgumentsInfo; -import org.eclipse.pde.internal.core.iproduct.IConfigurationFileInfo; -import org.eclipse.pde.internal.core.iproduct.IIntroInfo; -import org.eclipse.pde.internal.core.iproduct.IJREInfo; -import org.eclipse.pde.internal.core.iproduct.ILauncherInfo; -import org.eclipse.pde.internal.core.iproduct.IProduct; -import org.eclipse.pde.internal.core.iproduct.IProductFeature; -import org.eclipse.pde.internal.core.iproduct.IProductModel; -import org.eclipse.pde.internal.core.iproduct.IProductModelFactory; -import org.eclipse.pde.internal.core.iproduct.IProductPlugin; -import org.eclipse.pde.internal.core.iproduct.ISplashInfo; -import org.eclipse.pde.internal.core.iproduct.IWindowImages; +import org.eclipse.pde.internal.core.iproduct.*; public class ProductModelFactory implements IProductModelFactory { @@ -54,6 +42,13 @@ } /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProductModelFactory#createPluginConfiguration() + */ + public IProductPluginConfiguration createPluginConfiguration() { + return new ProductPluginConfiguration(fModel); + } + + /* (non-Javadoc) * @see org.eclipse.pde.internal.core.iproduct.IProductModelFactory#createConfigFileInfo() */ public IConfigurationFileInfo createConfigFileInfo() { Index: src/org/eclipse/pde/internal/core/product/Product.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/product/Product.java,v retrieving revision 1.40 diff -u -r1.40 Product.java --- src/org/eclipse/pde/internal/core/product/Product.java 26 Apr 2008 23:28:09 -0000 1.40 +++ src/org/eclipse/pde/internal/core/product/Product.java 23 Jul 2008 23:26:03 -0000 @@ -26,6 +26,7 @@ private IAboutInfo fAboutInfo; private TreeMap fPlugins = new TreeMap(); + private TreeMap fPluginConfigurations = new TreeMap(); private List fFeatures = new ArrayList(); private IConfigurationFileInfo fConfigIniInfo; private IJREInfo fJVMInfo; @@ -201,6 +202,14 @@ writer.println(indent + " "); //$NON-NLS-1$ } + writer.println(indent + " "); //$NON-NLS-1$ + iter = fPluginConfigurations.values().iterator(); + while (iter.hasNext()) { + IProductPluginConfiguration configuration = (IProductPluginConfiguration) iter.next(); + configuration.write(indent + " ", writer); //$NON-NLS-1$ + } + writer.println(indent + " "); //$NON-NLS-1$ + writer.println(); writer.println(""); //$NON-NLS-1$ } @@ -222,6 +231,7 @@ fUseFeatures = false; fAboutInfo = null; fPlugins.clear(); + fPluginConfigurations.clear(); fFeatures.clear(); fConfigIniInfo = null; fWindowImages = null; @@ -256,6 +266,8 @@ parsePlugins(child.getChildNodes()); } else if (name.equals("features")) { //$NON-NLS-1$ parseFeatures(child.getChildNodes()); + } else if (name.equals("configurations")) { //$NON-NLS-1$ + parsePluginConfigurations(child.getChildNodes()); } else if (name.equals("configIni")) { //$NON-NLS-1$ fConfigIniInfo = factory.createConfigFileInfo(); fConfigIniInfo.parse(child); @@ -296,6 +308,19 @@ } } + private void parsePluginConfigurations(NodeList children) { + for (int i = 0; i < children.getLength(); i++) { + Node child = children.item(i); + if (child.getNodeType() == Node.ELEMENT_NODE) { + if (child.getNodeName().equals("pluginConfiguration")) { //$NON-NLS-1$ + IProductPluginConfiguration configuration = getModel().getFactory().createPluginConfiguration(); + configuration.parse(child); + fPluginConfigurations.put(configuration.getId(), configuration); + } + } + } + } + private void parseFeatures(NodeList children) { for (int i = 0; i < children.getLength(); i++) { Node child = children.item(i); @@ -332,16 +357,63 @@ } /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProduct#addPluginConfigurations(org.eclipse.pde.internal.core.iproduct.IPluginConfiguration[]) + */ + public void addPluginConfigurations(IProductPluginConfiguration[] configuration) { + boolean modified = false; + for (int i = 0; i < configuration.length; i++) { + if (configuration[i] == null) + continue; + String id = configuration[i].getId(); + if (id == null || fPluginConfigurations.containsKey(id)) { + configuration[i] = null; + continue; + } + + configuration[i].setModel(getModel()); + fPluginConfigurations.put(id, configuration[i]); + modified = true; + } + if (modified && isEditable()) + fireStructureChanged(configuration, IModelChangedEvent.INSERT); + } + + /* (non-Javadoc) * @see org.eclipse.pde.internal.core.iproduct.IProduct#removePlugins(org.eclipse.pde.internal.core.iproduct.IProductPlugin[]) */ public void removePlugins(IProductPlugin[] plugins) { boolean modified = false; + LinkedList removedConfigurations = new LinkedList(); for (int i = 0; i < plugins.length; i++) { - if (fPlugins.remove(plugins[i].getId()) != null) + final String id = plugins[i].getId(); + if (fPlugins.remove(id) != null) { modified = true; + Object configuration = fPluginConfigurations.remove(id); + if (configuration != null) + removedConfigurations.add(configuration); + } + } + if (isEditable()) { + if (modified) + fireStructureChanged(plugins, IModelChangedEvent.REMOVE); + if (!removedConfigurations.isEmpty()) { + fireStructureChanged((IProductObject[]) removedConfigurations.toArray(new IProductObject[removedConfigurations.size()]), IModelChangedEvent.REMOVE); + } } - if (modified && isEditable()) - fireStructureChanged(plugins, IModelChangedEvent.REMOVE); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProduct#removePluginConfigurations(org.eclipse.pde.internal.core.iproduct.IProductPluginConfiguration[]) + */ + public void removePluginConfigurations(IProductPluginConfiguration[] configurations) { + boolean modified = false; + for (int i = 0; i < configurations.length; i++) { + if (fPluginConfigurations.remove(configurations[i].getId()) != null) { + modified = true; + } + } + if (isEditable() && modified) + fireStructureChanged(configurations, IModelChangedEvent.REMOVE); } /* (non-Javadoc) @@ -352,6 +424,13 @@ } /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProduct#getPluginConfigurations() + */ + public IProductPluginConfiguration[] getPluginConfigurations() { + return (IProductPluginConfiguration[]) fPluginConfigurations.values().toArray(new IProductPluginConfiguration[fPluginConfigurations.size()]); + } + + /* (non-Javadoc) * @see org.eclipse.pde.internal.core.iproduct.IProduct#getConfigurationFileInfo() */ public IConfigurationFileInfo getConfigurationFileInfo() { @@ -485,4 +564,11 @@ fireStructureChanged(feature1, IModelChangedEvent.CHANGE); } + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProduct#findPluginConfiguration(java.lang.String) + */ + public IProductPluginConfiguration findPluginConfiguration(String id) { + return (IProductPluginConfiguration) fPluginConfigurations.get(id); + } + } Index: src/org/eclipse/pde/internal/core/iproduct/IProductModelFactory.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/iproduct/IProductModelFactory.java,v retrieving revision 1.12 diff -u -r1.12 IProductModelFactory.java --- src/org/eclipse/pde/internal/core/iproduct/IProductModelFactory.java 2 Jan 2008 15:56:15 -0000 1.12 +++ src/org/eclipse/pde/internal/core/iproduct/IProductModelFactory.java 23 Jul 2008 23:26:03 -0000 @@ -18,6 +18,8 @@ IProductPlugin createPlugin(); + IProductPluginConfiguration createPluginConfiguration(); + IProductFeature createFeature(); IConfigurationFileInfo createConfigFileInfo(); Index: src/org/eclipse/pde/internal/core/iproduct/IProduct.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.pde.core/src/org/eclipse/pde/internal/core/iproduct/IProduct.java,v retrieving revision 1.31 diff -u -r1.31 IProduct.java --- src/org/eclipse/pde/internal/core/iproduct/IProduct.java 26 Apr 2008 23:28:09 -0000 1.31 +++ src/org/eclipse/pde/internal/core/iproduct/IProduct.java 23 Jul 2008 23:26:03 -0000 @@ -52,14 +52,22 @@ void addFeatures(IProductFeature[] feature); + void addPluginConfigurations(IProductPluginConfiguration[] configurations); + void removePlugins(IProductPlugin[] plugins); void removeFeatures(IProductFeature[] feature); + void removePluginConfigurations(IProductPluginConfiguration[] configurations); + + IProductPluginConfiguration findPluginConfiguration(String id); + IProductPlugin[] getPlugins(); IProductFeature[] getFeatures(); + IProductPluginConfiguration[] getPluginConfigurations(); + void setId(String id); void setVersion(String version); Index: src/org/eclipse/pde/internal/core/iproduct/IProductPluginConfiguration.java =================================================================== RCS file: src/org/eclipse/pde/internal/core/iproduct/IProductPluginConfiguration.java diff -N src/org/eclipse/pde/internal/core/iproduct/IProductPluginConfiguration.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/pde/internal/core/iproduct/IProductPluginConfiguration.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2008 Bartosz Michalik 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Bartosz Michalik (bartosz.michalik@gmail.com) + *******************************************************************************/ +package org.eclipse.pde.internal.core.iproduct; + +/** + * PluginConfiguration description defines plug-in start level, and other properties that can be used + * during product launching/building + * @author Bartosz Michalik + */ +public interface IProductPluginConfiguration extends IProductObject { + public static final String P_AUTO_START = "autostart"; //$NON-NLS-1$ + public static final String P_START_LEVEL = "startLevel"; //$NON-NLS-1$ + + String getId(); + + void setId(String id); + + void setAutoStart(boolean autostart); + + boolean isAutoStart(); + + void setStartLevel(int startLevel); + + int getStartLevel(); + + /** + * Adds property, if property exists is overridden + * @param key + * @param value + * @throws IllegalArgumentException when key or value is empty + */ + void addProperty(String key, String value) throws IllegalArgumentException; + + /** + * @param key + */ + void removeProperty(String key); + + /** + * get property from key + * @param key + * @return property or null + */ + String getProperty(String key); +} Index: src/org/eclipse/pde/internal/core/product/ProductPluginConfiguration.java =================================================================== RCS file: src/org/eclipse/pde/internal/core/product/ProductPluginConfiguration.java diff -N src/org/eclipse/pde/internal/core/product/ProductPluginConfiguration.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ src/org/eclipse/pde/internal/core/product/ProductPluginConfiguration.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2008 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * IBM Corporation - initial API and implementation + * Bartosz Michalik (bartosz.michalik@gmail.com) + *******************************************************************************/ +package org.eclipse.pde.internal.core.product; + +import java.io.PrintWriter; +import java.util.*; +import org.eclipse.pde.internal.core.iproduct.IProductModel; +import org.eclipse.pde.internal.core.iproduct.IProductPluginConfiguration; +import org.w3c.dom.*; + +public class ProductPluginConfiguration extends ProductObject implements IProductPluginConfiguration { + + private static final long serialVersionUID = -3549668957352554876L; + private boolean fAutoStart; + private int fStartLevel; + private String fId; + private Map fPropertiesMap; + + /** + * Only for parsing usage + * @param model + */ + ProductPluginConfiguration(IProductModel model) { + super(model); + fPropertiesMap = new HashMap(); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProductObject#parse(org.w3c.dom.Node) + */ + public void parse(Node node) { + if (node.getNodeType() == Node.ELEMENT_NODE) { + Element element = (Element) node; + fId = element.getAttribute("id"); + fAutoStart = Boolean.parseBoolean(element.getAttribute(P_AUTO_START)); + fStartLevel = Integer.parseInt(element.getAttribute(P_START_LEVEL)); + NodeList children = node.getChildNodes(); + int length = children.getLength(); + for (int i = 0; i < length; ++i) { + Node item = children.item(i); + if (item.getNodeType() == Node.ELEMENT_NODE) { + element = (Element) item; + String key = element.getAttribute("key"); + String value = element.getAttribute("value"); + fPropertiesMap.put(key, value); + } + } + } + + } + + /* (non-Javadoc) + * @see org.eclipse.pde.core.IWritable#write(java.lang.String, java.io.PrintWriter) + */ + public void write(String indent, PrintWriter writer) { + writer.print(""); //$NON-NLS-1$ + else { + writer.println(" >"); //$NON-NLS-1$ + Iterator i = fPropertiesMap.keySet().iterator(); + while (i.hasNext()) { + String key = (String) i.next(); + writer.println(indent + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + writer.println(""); //$NON-NLS-1$ + } + + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#addProperty(java.lang.String, java.lang.String) + */ + public void addProperty(String key, String value) throws IllegalArgumentException { + if (key == null || key.equals("")) //$NON-NLS-1$ + throw new IllegalArgumentException("key cannot empty"); //$NON-NLS-1$ + if (value == null || value.equals("")) //$NON-NLS-1$ + throw new IllegalArgumentException("value cannot empty"); //$NON-NLS-1$ + String oldValue = (String) fPropertiesMap.get(key); + fPropertiesMap.put(key, value); + if (isEditable() && !value.equals(oldValue)) + firePropertyChanged(key, oldValue, value); + + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#getId() + */ + public String getId() { + return fId; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#getProperty(java.lang.String) + */ + public String getProperty(String key) { + return (String) fPropertiesMap.get(key); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#getStartLevel() + */ + public int getStartLevel() { + return fStartLevel; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#isAutoStart() + */ + public boolean isAutoStart() { + return fAutoStart; + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#removeProperty(java.lang.String) + */ + public void removeProperty(String key) { + String oldValue = (String) fPropertiesMap.get(key); + fPropertiesMap.remove(key); + if (isEditable() && oldValue != null) + firePropertyChanged(key, oldValue, null); + + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#setAutoStart(boolean) + */ + public void setAutoStart(boolean autostart) { + boolean oldValue = fAutoStart; + fAutoStart = autostart; + if (isEditable() && oldValue != fAutoStart) + firePropertyChanged(P_AUTO_START, new Boolean(oldValue), new Boolean(fAutoStart)); + + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IPluginConfiguration#setStartLevel(java.lang.String) + */ + public void setStartLevel(int startLevel) { + int oldValue = fStartLevel; + fStartLevel = startLevel; + if (isEditable() && oldValue != fStartLevel) + firePropertyChanged(P_START_LEVEL, new Integer(oldValue), new Integer(fStartLevel)); + } + + /* (non-Javadoc) + * @see org.eclipse.pde.internal.core.iproduct.IProductPluginConfiguration#setId(java.lang.String) + */ + public void setId(String id) { + fId = id; + } + +}