blob: 9c6321d8f1460cf471841dbb165462df4214efc2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2010 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
* EclipseSource Corporation - ongoing enhancements
* Benjamin Cabe <benjamin.cabe@anyware-tech.com> - bug 265931
*******************************************************************************/
package org.eclipse.pde.internal.core.product;
import java.io.PrintWriter;
import java.util.*;
import org.eclipse.pde.core.IModelChangedEvent;
import org.eclipse.pde.internal.core.iproduct.*;
import org.w3c.dom.*;
public class Product extends ProductObject implements IProduct {
private static final long serialVersionUID = 1L;
private String fId;
private String fProductId;
private String fName;
private String fApplication;
private String fVersion;
private IAboutInfo fAboutInfo;
private TreeMap fPlugins = new TreeMap();
private TreeMap fPluginConfigurations = new TreeMap();
private TreeMap fConfigurationProperties = new TreeMap();
private List fFeatures = new ArrayList();
private IConfigurationFileInfo fConfigIniInfo;
private IJREInfo fJVMInfo;
private boolean fUseFeatures;
private boolean fIncludeLaunchers;
private IWindowImages fWindowImages;
private ISplashInfo fSplashInfo;
private ILauncherInfo fLauncherInfo;
private IArgumentsInfo fLauncherArgs;
private IIntroInfo fIntroInfo;
private ILicenseInfo fLicenseInfo;
public Product(IProductModel model) {
super(model);
fIncludeLaunchers = true;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getId()
*/
public String getId() {
return fId;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getProductId()
*/
public String getProductId() {
return fProductId;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getName()
*/
public String getName() {
return fName;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getVersion()
*/
public String getVersion() {
return fVersion;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getApplication()
*/
public String getApplication() {
return fApplication;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getDefiningPluginId()
*/
public String getDefiningPluginId() {
if (fProductId == null)
return null;
int dot = fProductId.lastIndexOf('.');
return (dot != -1) ? fProductId.substring(0, dot) : null;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setId(java.lang.String)
*/
public void setId(String id) {
String old = fId;
fId = id;
if (isEditable())
firePropertyChanged(P_UID, old, fId);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setProductId(java.lang.String)
*/
public void setProductId(String id) {
String old = fProductId;
fProductId = id;
if (isEditable())
firePropertyChanged(P_ID, old, fProductId);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setVersion(java.lang.String)
*/
public void setVersion(String version) {
String old = fVersion;
fVersion = version;
if (isEditable())
firePropertyChanged(P_VERSION, old, fVersion);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setName(java.lang.String)
*/
public void setName(String name) {
String old = fName;
fName = name;
if (isEditable())
firePropertyChanged(P_NAME, old, fName);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setAboutInfo(org.eclipse.pde.internal.core.iproduct.IAboutInfo)
*/
public void setAboutInfo(IAboutInfo info) {
fAboutInfo = info;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setApplication(java.lang.String)
*/
public void setApplication(String application) {
String old = fApplication;
fApplication = application;
if (isEditable())
firePropertyChanged(P_APPLICATION, old, fApplication);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.product.ProductObject#write(java.lang.String, java.io.PrintWriter)
*/
public void write(String indent, PrintWriter writer) {
writer.print(indent + "<product"); //$NON-NLS-1$
if (fName != null && fName.length() > 0)
writer.print(" " + P_NAME + "=\"" + getWritableString(fName) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (fId != null && fId.length() > 0)
writer.print(" " + P_UID + "=\"" + fId + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (fProductId != null && fProductId.length() > 0)
writer.print(" " + P_ID + "=\"" + fProductId + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (fApplication != null && fApplication.length() > 0)
writer.print(" " + P_APPLICATION + "=\"" + fApplication + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (fVersion != null && fVersion.length() > 0)
writer.print(" " + P_VERSION + "=\"" + fVersion + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
writer.print(" " + P_USEFEATURES + "=\"" + Boolean.toString(fUseFeatures) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
writer.print(" " + P_INCLUDE_LAUNCHERS + "=\"" + Boolean.toString(fIncludeLaunchers) + "\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
writer.println(">"); //$NON-NLS-1$
if (fAboutInfo != null) {
writer.println();
fAboutInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fConfigIniInfo != null) {
writer.println();
fConfigIniInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fLauncherArgs != null) {
writer.println();
fLauncherArgs.write(indent + " ", writer); //$NON-NLS-1$
}
if (fWindowImages != null) {
writer.println();
fWindowImages.write(indent + " ", writer); //$NON-NLS-1$
}
if (fSplashInfo != null) {
writer.println();
fSplashInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fLauncherInfo != null) {
writer.println();
fLauncherInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fIntroInfo != null) {
writer.println();
fIntroInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fJVMInfo != null) {
writer.println();
fJVMInfo.write(indent + " ", writer); //$NON-NLS-1$
}
if (fLicenseInfo != null) {
writer.println();
fLicenseInfo.write(indent + " ", writer); //$NON-NLS-1$
}
writer.println();
writer.println(indent + " <plugins>"); //$NON-NLS-1$
Iterator iter = fPlugins.values().iterator();
while (iter.hasNext()) {
IProductPlugin plugin = (IProductPlugin) iter.next();
plugin.write(indent + " ", writer); //$NON-NLS-1$
}
writer.println(indent + " </plugins>"); //$NON-NLS-1$
if (fFeatures.size() > 0) {
writer.println();
writer.println(indent + " <features>"); //$NON-NLS-1$
iter = fFeatures.iterator();
while (iter.hasNext()) {
IProductFeature feature = (IProductFeature) iter.next();
feature.write(indent + " ", writer); //$NON-NLS-1$
}
writer.println(indent + " </features>"); //$NON-NLS-1$
}
writer.println();
if (fPluginConfigurations.size() > 0) {
writer.println(indent + " <configurations>"); //$NON-NLS-1$
iter = fPluginConfigurations.values().iterator();
while (iter.hasNext()) {
IPluginConfiguration configuration = (IPluginConfiguration) iter.next();
configuration.write(indent + " ", writer); //$NON-NLS-1$
}
iter = fConfigurationProperties.values().iterator();
while (iter.hasNext()) {
IConfigurationProperty property = (IConfigurationProperty) iter.next();
property.write(indent + " ", writer); //$NON-NLS-1$
}
writer.println(indent + " </configurations>"); //$NON-NLS-1$
}
writer.println();
writer.println("</product>"); //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getAboutInfo()
*/
public IAboutInfo getAboutInfo() {
return fAboutInfo;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#reset()
*/
public void reset() {
fApplication = null;
fId = null;
fProductId = null;
fName = null;
fUseFeatures = false;
fIncludeLaunchers = true;
fAboutInfo = null;
fPlugins.clear();
fPluginConfigurations.clear();
fConfigurationProperties.clear();
fFeatures.clear();
fConfigIniInfo = null;
fWindowImages = null;
fSplashInfo = null;
fLauncherInfo = null;
fLauncherArgs = null;
fIntroInfo = null;
fJVMInfo = null;
fLicenseInfo = null;
}
/* (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 && node.getNodeName().equals("product")) { //$NON-NLS-1$
Element element = (Element) node;
fApplication = element.getAttribute(P_APPLICATION);
fProductId = element.getAttribute(P_ID);
fId = element.getAttribute(P_UID);
fName = element.getAttribute(P_NAME);
fVersion = element.getAttribute(P_VERSION);
fUseFeatures = "true".equals(element.getAttribute(P_USEFEATURES)); //$NON-NLS-1$
String launchers = element.getAttribute(P_INCLUDE_LAUNCHERS);
fIncludeLaunchers = ("true".equals(launchers) || launchers.length() == 0); //$NON-NLS-1$
NodeList children = node.getChildNodes();
IProductModelFactory factory = getModel().getFactory();
for (int i = 0; i < children.getLength(); i++) {
Node child = children.item(i);
if (child.getNodeType() == Node.ELEMENT_NODE) {
String name = child.getNodeName();
if (name.equals("aboutInfo")) { //$NON-NLS-1$
fAboutInfo = factory.createAboutInfo();
fAboutInfo.parse(child);
} else if (name.equals("plugins")) { //$NON-NLS-1$
parsePlugins(child.getChildNodes());
} else if (name.equals("features")) { //$NON-NLS-1$
parseFeatures(child.getChildNodes());
} else if (name.equals("configurations")) { //$NON-NLS-1$
parseConfigations(child.getChildNodes());
} else if (name.equals("configIni")) { //$NON-NLS-1$
fConfigIniInfo = factory.createConfigFileInfo();
fConfigIniInfo.parse(child);
} else if (name.equals("windowImages")) { //$NON-NLS-1$
fWindowImages = factory.createWindowImages();
fWindowImages.parse(child);
} else if (name.equals("splash")) { //$NON-NLS-1$
fSplashInfo = factory.createSplashInfo();
fSplashInfo.parse(child);
} else if (name.equals("launcher")) { //$NON-NLS-1$
fLauncherInfo = factory.createLauncherInfo();
fLauncherInfo.parse(child);
} else if (name.equals("launcherArgs")) { //$NON-NLS-1$
fLauncherArgs = factory.createLauncherArguments();
fLauncherArgs.parse(child);
} else if (name.equals("intro")) { //$NON-NLS-1$
fIntroInfo = factory.createIntroInfo();
fIntroInfo.parse(child);
} else if (name.equals("vm")) { //$NON-NLS-1$
fJVMInfo = factory.createJVMInfo();
fJVMInfo.parse(child);
} else if (name.equals("license")) { //$NON-NLS-1$
fLicenseInfo = factory.createLicenseInfo();
fLicenseInfo.parse(child);
}
}
}
}
}
private void parsePlugins(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("plugin")) { //$NON-NLS-1$
IProductPlugin plugin = getModel().getFactory().createPlugin();
plugin.parse(child);
fPlugins.put(plugin.getId(), plugin);
}
}
}
}
private void parseConfigations(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("plugin")) { //$NON-NLS-1$
IPluginConfiguration configuration = getModel().getFactory().createPluginConfiguration();
configuration.parse(child);
fPluginConfigurations.put(configuration.getId(), configuration);
}
if (child.getNodeName().equals("property")) { //$NON-NLS-1$
IConfigurationProperty property = getModel().getFactory().createConfigurationProperty();
property.parse(child);
fConfigurationProperties.put(property.getName(), property);
}
}
}
}
private void parseFeatures(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("feature")) { //$NON-NLS-1$
IProductFeature feature = getModel().getFactory().createFeature();
feature.parse(child);
fFeatures.add(feature);
}
}
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#addPlugin(org.eclipse.pde.internal.core.iproduct.IProductPlugin)
*/
public void addPlugins(IProductPlugin[] plugins) {
boolean modified = false;
for (int i = 0; i < plugins.length; i++) {
if (plugins[i] == null)
continue;
String id = plugins[i].getId();
if (id == null || fPlugins.containsKey(id)) {
plugins[i] = null;
continue;
}
plugins[i].setModel(getModel());
fPlugins.put(id, plugins[i]);
modified = true;
}
if (modified && isEditable())
fireStructureChanged(plugins, IModelChangedEvent.INSERT);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#addPluginConfigurations(org.eclipse.pde.internal.core.iproduct.IPluginConfiguration[])
*/
public void addPluginConfigurations(IPluginConfiguration[] 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#addConfigurationProperties(org.eclipse.pde.internal.core.iproduct.IConfigurationProperty[])
*/
public void addConfigurationProperties(IConfigurationProperty[] properties) {
boolean modified = false;
for (int i = 0; i < properties.length; i++) {
if (properties[i] == null)
continue;
String name = properties[i].getName();
if (name == null || fConfigurationProperties.containsKey(name)) {
continue;
}
properties[i].setModel(getModel());
fConfigurationProperties.put(name, properties[i]);
modified = true;
}
if (modified && isEditable())
fireStructureChanged(properties, 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++) {
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);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#removePluginConfigurations(org.eclipse.pde.internal.core.iproduct.IProductPluginConfiguration[])
*/
public void removePluginConfigurations(IPluginConfiguration[] 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)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#removeConfigurationProperties(org.eclipse.pde.internal.core.iproduct.IConfigurationProperty[])
*/
public void removeConfigurationProperties(IConfigurationProperty[] properties) {
boolean modified = false;
for (int i = 0; i < properties.length; i++) {
if (fConfigurationProperties.remove(properties[i].getName()) != null) {
modified = true;
}
}
if (isEditable() && modified)
fireStructureChanged(properties, IModelChangedEvent.REMOVE);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getPlugins()
*/
public IProductPlugin[] getPlugins() {
return (IProductPlugin[]) fPlugins.values().toArray(new IProductPlugin[fPlugins.size()]);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getPluginConfigurations()
*/
public IPluginConfiguration[] getPluginConfigurations() {
return (IPluginConfiguration[]) fPluginConfigurations.values().toArray(new IPluginConfiguration[fPluginConfigurations.size()]);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getConfigurationProperties()
*/
public IConfigurationProperty[] getConfigurationProperties() {
return (IConfigurationProperty[]) fConfigurationProperties.values().toArray(new IConfigurationProperty[fConfigurationProperties.size()]);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#getConfigurationFileInfo()
*/
public IConfigurationFileInfo getConfigurationFileInfo() {
return fConfigIniInfo;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#setConfigurationFileInfo(org.eclipse.pde.internal.core.iproduct.IConfigurationFileInfo)
*/
public void setConfigurationFileInfo(IConfigurationFileInfo info) {
fConfigIniInfo = info;
}
public boolean useFeatures() {
return fUseFeatures;
}
public void setUseFeatures(boolean use) {
boolean old = fUseFeatures;
fUseFeatures = use;
if (isEditable())
firePropertyChanged(P_USEFEATURES, Boolean.toString(old), Boolean.toString(fUseFeatures));
}
public boolean containsPlugin(String id) {
return fPlugins.containsKey(id);
}
public boolean containsFeature(String id) {
IProductFeature[] features = getFeatures();
for (int i = 0; i < features.length; i++) {
if (features[i].getId().equals(id))
return true;
}
return false;
}
public IWindowImages getWindowImages() {
return fWindowImages;
}
public void setWindowImages(IWindowImages images) {
fWindowImages = images;
}
public ISplashInfo getSplashInfo() {
return fSplashInfo;
}
public void setSplashInfo(ISplashInfo info) {
fSplashInfo = info;
}
public ILauncherInfo getLauncherInfo() {
return fLauncherInfo;
}
public void setLauncherInfo(ILauncherInfo info) {
fLauncherInfo = info;
}
public void addFeatures(IProductFeature[] features) {
boolean modified = false;
for (int i = 0; i < features.length; i++) {
if (features[i] == null)
continue;
String id = features[i].getId();
if (fFeatures.contains((id))) {
features[i] = null;
continue;
}
features[i].setModel(getModel());
fFeatures.add(features[i]);
modified = true;
}
if (modified && isEditable())
fireStructureChanged(features, IModelChangedEvent.INSERT);
}
public void removeFeatures(IProductFeature[] features) {
boolean modified = false;
for (int i = 0; i < features.length; i++) {
if (features[i].getId() != null) {
fFeatures.remove(features[i]);
modified = true;
}
}
if (modified && isEditable())
fireStructureChanged(features, IModelChangedEvent.REMOVE);
}
public IProductFeature[] getFeatures() {
return (IProductFeature[]) fFeatures.toArray(new IProductFeature[fFeatures.size()]);
}
public IArgumentsInfo getLauncherArguments() {
return fLauncherArgs;
}
public void setLauncherArguments(IArgumentsInfo info) {
fLauncherArgs = info;
}
public IIntroInfo getIntroInfo() {
return fIntroInfo;
}
public void setIntroInfo(IIntroInfo introInfo) {
fIntroInfo = introInfo;
}
public IJREInfo getJREInfo() {
return fJVMInfo;
}
public void setJREInfo(IJREInfo info) {
fJVMInfo = info;
}
public ILicenseInfo getLicenseInfo() {
return fLicenseInfo;
}
public void setLicenseInfo(ILicenseInfo info) {
fLicenseInfo = info;
}
public void swap(IProductFeature feature1, IProductFeature feature2) {
int index1 = fFeatures.indexOf(feature1);
int index2 = fFeatures.indexOf(feature2);
if (index1 == -1 || index2 == -1)
return;
fFeatures.set(index2, feature1);
fFeatures.set(index1, feature2);
fireStructureChanged(feature1, IModelChangedEvent.CHANGE);
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.iproduct.IProduct#findPluginConfiguration(java.lang.String)
*/
public IPluginConfiguration findPluginConfiguration(String id) {
return (IPluginConfiguration) fPluginConfigurations.get(id);
}
public boolean includeLaunchers() {
return fIncludeLaunchers;
}
public void setIncludeLaunchers(boolean include) {
boolean old = fIncludeLaunchers;
fIncludeLaunchers = include;
if (isEditable())
firePropertyChanged(P_INCLUDE_LAUNCHERS, Boolean.toString(old), Boolean.toString(fIncludeLaunchers));
}
}