blob: 54cf0264aced553d853e01b258b8f5c09e61a167 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2018 Red Hat, Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat Incorporated - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.rpmstubby.model;
import java.util.Properties;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
/**
* Gives easy access to data from the eclipse feature.xml file.
*
*/
public class FeatureModel {
private Document docroot;
private XPath xpath;
private Properties featureProperties;
/**
* Instantiates the model with the given XML document and preparing the
* XPath evaluation environment.
*
* @param docroot
* The document to query.
* @param featureProperties The properties as loaded by feature.properties.
*/
public FeatureModel(Document docroot, Properties featureProperties) {
this.docroot = docroot;
this.featureProperties = featureProperties;
xpath = XPathFactory.newInstance().newXPath();
}
private String xpathEval(String path) {
String result = "";
try {
result = xpath.evaluate(path, docroot);
} catch (XPathExpressionException e) {
//ignore, empty string is fine on missing path
}
return result;
}
/**
* Get value for a given key from the feature.properties file, if the key
* don't start with '%' we just return the given key.
*
* @param key
* to find in feature.properties
* @return the value
*/
private String resolveFeatureProperties(String key) {
if (key != null && key.trim().startsWith("%")) {
return featureProperties.getProperty(key.trim().replaceAll("%", ""));
} else {
return key;
}
}
/**
* Returns the package name.
* It is calculated by using the feature id last segment unless the last segment
* is feature in which case the previous one is used.
* @return The package name.
*/
public String getSimplePackageName() {
String packageName = xpathEval("/feature/@id");
String[] packageItems = packageName.split("\\.");
String name = packageItems[packageItems.length - 1];
if (name.equalsIgnoreCase("feature")) {
name = packageItems[packageItems.length - 2];
}
return name;
}
/**
* The simple package name with "eclipse-" prepended to make better RPM package name.
* @return The package
*/
public String getPackageName() {
return "eclipse-"+getSimplePackageName();
}
/**
* Returns the feature id as retrieved with /feature/@id xpath.
* @return The feature id.
*/
public String getFeatureId() {
return xpathEval("/feature/@id");
}
/**
* Returns the version as retrieved by /feature/@version xpath with .qualifier removed if any.
*
* @return The version of the feature.
*/
public String getVersion() {
String version = xpathEval("/feature/@version");
version = version.replaceAll(".qualifier", "");
return version;
}
/**
* Returns the summary as retrieved by /feature/@label xpath.
*
* @return The package summary.
*/
public String getSummary() {
return resolveFeatureProperties(xpathEval("/feature/@label"));
}
/**
* Returns the license.
* The algorithm is to look at /feature/license and/or /feature/license/@url and look for epl or cpl.
* Otherwise #FIX ME comment is returned
* @return The license of the feature.
*/
public String getLicense() {
String urlString = resolveFeatureProperties(xpathEval("/feature/license/@url"));
String urlAnotation = resolveFeatureProperties(xpathEval("/feature/license"));
String license = "#FIXME";
if ((urlString != null && urlAnotation != null)) {
if ((urlString.indexOf("epl") > -1 || urlAnotation
.indexOf("epl") > -1)) {
license = "EPL";
} else if ((urlString.indexOf("cpl") > -1 || urlAnotation
.indexOf("cpl") > -1)) {
license = "CPL";
}
}
return license;
}
/**
* Returns the url as fetched from /feature/description/@url xpath if any.
* @return The url.
*/
public String getURL() {
return xpathEval("/feature/description/@url");
}
/**
* Returns the description as fetched by /feature/description and resolved from feature.properties if needed.
*
* @return The description.
*/
public String getDescription() {
return resolveFeatureProperties(xpathEval("/feature/description"));
}
}