/**********************************************************************
* Copyright (c) 2005-2009 ant4eclipse project team.
*
* 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:
* Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich
**********************************************************************/
package org.ant4eclipse.lib.pde.model.product;
import java.io.InputStream;
import org.ant4eclipse.lib.core.Assure;
import org.ant4eclipse.lib.core.exception.Ant4EclipseException;
import org.ant4eclipse.lib.core.util.Utilities;
import org.ant4eclipse.lib.core.xquery.XQuery;
import org.ant4eclipse.lib.core.xquery.XQueryHandler;
import org.ant4eclipse.lib.pde.PdeExceptionCode;
import org.ant4eclipse.lib.pde.tools.BundleStartRecord;
import org.osgi.framework.Version;
/**
* <p>
* Parser for an eclipse product definition (<code>*.product</code>).
* </p>
*
* @author Daniel Kasmeroglu (Daniel.Kasmeroglu@Kasisoft.net)
*/
public class ProductDefinitionParser {
/**
* <p>
* Creates a product definition from the supplied content.
* </p>
*
* @param inputstream
* The stream which provides the content. Not <code>null</code>.
*
* @return A product definition instance. Not <code>null</code>.
*/
public static final ProductDefinition parseProductDefinition(InputStream inputstream) {
Assure.notNull("inputstream", inputstream);
XQueryHandler queryhandler = new XQueryHandler();
XQuery namequery = queryhandler.createQuery("/product/@name");
XQuery uidquery = queryhandler.createQuery("/product/@uid");
XQuery idquery = queryhandler.createQuery("/product/@id");
XQuery applicationquery = queryhandler.createQuery("/product/@application");
XQuery versionquery = queryhandler.createQuery("/product/@version");
XQuery usefeaturesquery = queryhandler.createQuery("/product/@useFeatures");
XQuery launchernamequery = queryhandler.createQuery("/product/launcher/@name");
XQuery splashquery = queryhandler.createQuery("/product/splash/@location");
XQuery pluginidquery = queryhandler.createQuery("/product/plugins/plugin/@id");
XQuery fragmentquery = queryhandler.createQuery("/product/plugins/plugin/@fragment");
XQuery featureidquery = queryhandler.createQuery("/product/features/feature/@id");
XQuery featureversionquery = queryhandler.createQuery("/product/features/feature/@version");
XQuery configinilinuxquery = queryhandler.createQuery("/product/configIni/linux");
XQuery configinimacosxquery = queryhandler.createQuery("/product/configIni/macosx");
XQuery configinisolarisquery = queryhandler.createQuery("/product/configIni/solaris");
XQuery configiniwin32query = queryhandler.createQuery("/product/configIni/win32");
XQuery programallquery = queryhandler.createQuery("/product/launcherArgs/programArgs");
XQuery programlinuxquery = queryhandler.createQuery("/product/launcherArgs/programArgsLin");
XQuery programmacquery = queryhandler.createQuery("/product/launcherArgs/programArgsMac");
XQuery programsolarisquery = queryhandler.createQuery("/product/launcherArgs/programArgsSol");
XQuery programwinquery = queryhandler.createQuery("/product/launcherArgs/programArgsWin");
XQuery vmargsallquery = queryhandler.createQuery("/product/launcherArgs/vmArgs");
XQuery vmargslinuxquery = queryhandler.createQuery("/product/launcherArgs/vmArgsLin");
XQuery vmargsmacquery = queryhandler.createQuery("/product/launcherArgs/vmArgsMac");
XQuery vmargssolarisquery = queryhandler.createQuery("/product/launcherArgs/vmArgsSol");
XQuery vmargswinquery = queryhandler.createQuery("/product/launcherArgs/vmArgsWin");
XQuery vmlinuxquery = queryhandler.createQuery("/product/vm/linux");
XQuery vmmacosxquery = queryhandler.createQuery("/product/vm/macosx");
XQuery vmsolarisquery = queryhandler.createQuery("/product/vm/solaris");
XQuery vmwin32query = queryhandler.createQuery("/product/vm/win32");
XQuery configidquery = queryhandler.createQuery("/product/configurations/plugin/@id");
XQuery configstartquery = queryhandler.createQuery("/product/configurations/plugin/@autoStart");
XQuery configlevelquery = queryhandler.createQuery("/product/configurations/plugin/@startLevel");
XQueryHandler.queryInputStream(inputstream, queryhandler);
ProductDefinition result = new ProductDefinition();
result.setUid(uidquery.getSingleResult());
result.setName(namequery.getSingleResult());
String versionString = versionquery.getSingleResult();
try {
result.setVersion(new Version(versionString == null || "null".equals(versionString) ? "0.0.0" : versionString));
} catch (Exception e) {
throw new Ant4EclipseException(e, PdeExceptionCode.INVALID_CONFIGURATION_VALUE, versionString, "version");
}
result.setApplication(applicationquery.getSingleResult());
result.setId(idquery.getSingleResult());
result.setLaunchername(launchernamequery.getSingleResult());
result.setSplashplugin(splashquery.getSingleResult());
result.setBasedOnFeatures(Boolean.parseBoolean(usefeaturesquery.getSingleResult()));
result.addConfigIni(ProductOs.linux, configinilinuxquery.getSingleResult());
result.addConfigIni(ProductOs.macosx, configinimacosxquery.getSingleResult());
result.addConfigIni(ProductOs.solaris, configinisolarisquery.getSingleResult());
result.addConfigIni(ProductOs.win32, configiniwin32query.getSingleResult());
String programarg = Utilities.cleanup(programallquery.getSingleResult());
if (programarg != null) {
for (ProductOs os : ProductOs.values()) {
result.addProgramArgs(os, programarg);
}
}
result.addProgramArgs(ProductOs.linux, programlinuxquery.getSingleResult());
result.addProgramArgs(ProductOs.macosx, programmacquery.getSingleResult());
result.addProgramArgs(ProductOs.solaris, programsolarisquery.getSingleResult());
result.addProgramArgs(ProductOs.win32, programwinquery.getSingleResult());
String vmarg = Utilities.cleanup(vmargsallquery.getSingleResult());
if (vmarg != null) {
for (ProductOs os : ProductOs.values()) {
result.addVmArgs(os, vmarg);
}
}
result.addVmArgs(ProductOs.linux, vmargslinuxquery.getSingleResult());
result.addVmArgs(ProductOs.macosx, vmargsmacquery.getSingleResult());
result.addVmArgs(ProductOs.solaris, vmargssolarisquery.getSingleResult());
result.addVmArgs(ProductOs.win32, vmargswinquery.getSingleResult());
result.addVm(ProductOs.linux, vmlinuxquery.getSingleResult());
result.addVm(ProductOs.macosx, vmmacosxquery.getSingleResult());
result.addVm(ProductOs.solaris, vmsolarisquery.getSingleResult());
result.addVm(ProductOs.win32, vmwin32query.getSingleResult());
String[] pluginids = pluginidquery.getResult();
String[] isfragment = fragmentquery.getResult();
for (int i = 0; i < pluginids.length; i++) {
result.addPlugin(pluginids[i], Boolean.parseBoolean(isfragment[i]));
}
String[] featureids = featureidquery.getResult();
String[] featureversions = featureversionquery.getResult();
for (int i = 0; i < featureids.length; i++) {
String version = i < featureversions.length ? featureversions[i] : null;
result.addFeature(featureids[i], version != null && version.length() > 0 ? new Version(version)
: Version.emptyVersion);
}
String[] configids = configidquery.getResult();
String[] configautostarts = configstartquery.getResult();
String[] configlevels = configlevelquery.getResult();
for (int i = 0; i < configids.length; i++) {
BundleStartRecord record = new BundleStartRecord();
record.setId(configids[i]);
record.setAutoStart(Boolean.parseBoolean(configautostarts[i]));
record.setStartLevel(Integer.parseInt(configlevels[i]));
result.addConfigurationRecord(record);
}
validate(result);
return result;
}
/**
* Performs a simple validation of the data currently stored within this description.
*
* @param result
* The product definition instance that needs to be validated.
*/
private static final void validate(ProductDefinition result) {
if ((result.getName() == null) || (result.getName().length() == 0)) {
throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, "", "name");
}
// [GERD - 22.07.2010] The product id is optional!
// if ((result.getId() == null) || (result.getId().length() == 0)) {
// throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, "", "id");
// }
for (ProductOs os : ProductOs.values()) {
String configini = result.getConfigIni(os);
if (configini != null) {
String name = String.format("configIni/%s", os.name());
if (configini.length() == 0) {
throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, "", name);
}
if (configini.charAt(0) != '/') {
// it's not starting with a slash indicating workspace relativity
throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, configini, name);
}
int next = configini.indexOf('/', 1);
if (next == -1) {
// it's not starting with a slash indicating workspace relativity
throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, configini, name);
}
if (next == configini.length() - 1) {
// there's no file path after the project name
throw new Ant4EclipseException(PdeExceptionCode.INVALID_CONFIGURATION_VALUE, configini, name);
}
}
}
}
} /* ENDCLASS */