|
From: <jpi...@us...> - 2011-12-21 14:34:50
|
Revision: 3716
http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3716&view=rev
Author: jpilgrim
Date: 2011-12-21 14:34:39 +0000 (Wed, 21 Dec 2011)
Log Message:
-----------
Fixed a problem with categories.
Categories are now extracted from site.xml. A default category is created if no site.xml is found or if some features are not mapped to any other category.
Modified Paths:
--------------
trunk/LWJGL/eclipse-update/org.lwjgl.build/anttasks.jar
trunk/LWJGL/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java
Modified: trunk/LWJGL/eclipse-update/org.lwjgl.build/anttasks.jar
===================================================================
(Binary files differ)
Modified: trunk/LWJGL/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java
===================================================================
--- trunk/LWJGL/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java 2011-12-20 19:06:52 UTC (rev 3715)
+++ trunk/LWJGL/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java 2011-12-21 14:34:39 UTC (rev 3716)
@@ -17,13 +17,19 @@
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.StringWriter;
import java.math.BigInteger;
import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
@@ -94,26 +100,11 @@
protected final XPath xpath = XPathFactory.newInstance().newXPath();
- public class FeatureInfo {
-
- public String getClassifier() {
- return "org.eclipse.update.feature";
- }
-
- public String getContentType() {
- return "application/zip";
- }
-
- public String getRootElementName() {
- return "feature";
- }
-
+ public abstract class XMLBasedInfo {
public Document doc;
- public int size;
+ abstract public String getRootElementName();
- public File jarFile;
-
public String xpath(String path) {
if (path.startsWith("/"))
return StandalonePublisher.this.xpath(doc, path);
@@ -139,7 +130,77 @@
return Collections.emptyList();
}
}
+ }
+ public class SiteInfo extends XMLBasedInfo {
+ /**
+ * {@inheritDoc}
+ * @see org.lwjgl.ant.StandalonePublisher.XMLBasedInfo#getRootElementName()
+ */
+ @Override
+ public String getRootElementName() {
+ return "site";
+ }
+ }
+
+ public static class CategoryInfo {
+ String id;
+
+ String name;
+
+ String label;
+
+ String description = "";
+
+ List<FeatureInfo> required = new ArrayList<StandalonePublisher.FeatureInfo>(
+ 5);
+
+ public String getVersion() {
+ String version = "0.0.0";
+ for (FeatureInfo featureInfo : required) {
+ String v = featureInfo.getVersion();
+ if (version.compareTo(v) < 0) {
+ version = v; // quick hack, not really correct
+ }
+ }
+ return version;
+
+ }
+
+ String getID() {
+ if (id == null) {
+ String timeStamp = new SimpleDateFormat("yyyyMMddHHmm")
+ .format(new Date());
+ id = timeStamp + "." + name;
+ }
+ return id;
+ }
+
+ public String getLabel() {
+ if (label==null || label.isEmpty()) return name;
+ return label;
+ }
+
+ }
+
+ public class FeatureInfo extends XMLBasedInfo {
+
+ public String getClassifier() {
+ return "org.eclipse.update.feature";
+ }
+
+ public String getContentType() {
+ return "application/zip";
+ }
+
+ public String getRootElementName() {
+ return "feature";
+ }
+
+ public int size;
+
+ public File jarFile;
+
/**
* @return
*/
@@ -366,7 +427,89 @@
}
+ protected Collection<CategoryInfo> readSite(
+ DocumentBuilder documentBuilder, FeatureInfo[] featureInfos)
+ throws Exception {
+
+ File f = new File(updateSiteFolder + File.separator + "site.xml");
+ if (!f.exists()) {
+ f = new File(updateSiteFolder + File.separator + "category.xml");
+ }
+
+ Map<String, FeatureInfo> featuresById = new HashMap<String, StandalonePublisher.FeatureInfo>();
+ for (FeatureInfo featureInfo : featureInfos) {
+ featuresById.put(featureInfo.getID(), featureInfo);
+ }
+
+ Map<String, CategoryInfo> categoryInfos = new HashMap<String, CategoryInfo>();
+ Map<String, String> featureToGroup = new HashMap<String, String>();
+
+ if (f.exists()) {
+ SiteInfo site = new SiteInfo();
+ site.doc = readXML(documentBuilder, new FileInputStream(f));
+
+ List<Node> categories = site.xpathNods("//site//category-def");
+ for (Node category : categories) {
+ CategoryInfo categoryInfo = new CategoryInfo();
+ categoryInfo.name = xpath(category, "@name");
+ categoryInfo.label = xpath(category, "@label");
+ categoryInfo.description = xpath(category, "description/text()");
+ categoryInfos.put(categoryInfo.name, categoryInfo);
+ }
+
+ List<Node> features = site.xpathNods("//site//feature");
+ for (Node feature : features) {
+ featureToGroup.put(xpath(feature, "@id"),
+ xpath(feature, "category/@name"));
+ }
+
+ }
+
+ // sort features to their category:
+ List<String> sortedFeatures = new ArrayList<String>();
+ for (String id : featuresById.keySet()) {
+ String categoryName = featureToGroup.get(id);
+ if (categoryName != null) {
+ CategoryInfo categoryInfo = categoryInfos.get(categoryName);
+ categoryInfo.required.add(featuresById.get(id));
+ sortedFeatures.add(id);
+ }
+ }
+ for (String id : sortedFeatures) {
+ featuresById.remove(id);
+ }
+
+ if (!featuresById.isEmpty()) {
+ CategoryInfo categoryInfo = categoryInfos.get(this.repositoryName);
+ if (categoryInfo == null) {
+ categoryInfo = new CategoryInfo();
+ categoryInfo.name = this.repositoryName;
+ categoryInfo.label = this.repositoryName;
+ categoryInfo.description = "";
+ categoryInfos.put(categoryInfo.name, categoryInfo);
+ }
+
+ for (FeatureInfo featureInfo : featuresById.values()) {
+ categoryInfo.required.add(featureInfo);
+ }
+
+ }
+
+ return categoryInfos.values();
+ }
+
/**
+ * @param i_documentBuilder
+ * @param i_fileInputStream
+ * @return
+ */
+ protected Document readXML(DocumentBuilder docBuilder, InputStream is)
+ throws Exception {
+ Document doc = docBuilder.parse(is);
+ return doc;
+ }
+
+ /**
* @param docBuilder
* @param jis
* @param jarEntry
@@ -445,7 +588,12 @@
bundleInfos[i] = readBundle(locations[i]);
}
- writeContent(featureInfos, bundleInfos);
+ DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance()
+ .newDocumentBuilder();
+ Collection<CategoryInfo> categoryInfos = readSite(docBuilder,
+ featureInfos);
+
+ writeContent(featureInfos, bundleInfos, categoryInfos);
writeArtifacts(featureInfos, bundleInfos);
}
@@ -453,10 +601,12 @@
/**
* @param i_featureInfos
* @param i_bundleInfos
+ * @param i_categoryInfos
* @throws Exception
*/
protected void writeContent(FeatureInfo[] i_featureInfos,
- BundleInfo[] i_bundleInfos) throws Exception {
+ BundleInfo[] i_bundleInfos, Collection<CategoryInfo> i_categoryInfos)
+ throws Exception {
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
@@ -499,6 +649,11 @@
for (BundleInfo bundleInfo : i_bundleInfos) {
units.add(createUnitForBundle(bundleInfo));
}
+
+
+ for (CategoryInfo categoryInfo : i_categoryInfos) {
+ units.add(createUnitForCategory(categoryInfo));
+ }
addList(repository, "units", units);
//dump(content);
@@ -632,17 +787,18 @@
String jarFileNameString = targetFile;
int pos = jarFileNameString.lastIndexOf('.');
if (pos > 0) {
- jarFileNameString = jarFileNameString.substring(0, pos) + ".jar";
+ jarFileNameString = jarFileNameString.substring(0, pos)
+ + ".jar";
} else {
jarFileNameString += ".jar";
}
-
+
JarOutputStream target = new JarOutputStream(new FileOutputStream(
jarFileNameString));
-
+
pos = targetFile.lastIndexOf(File.separatorChar);
- if (pos>0) {
- targetFile = targetFile.substring(pos+1);
+ if (pos > 0) {
+ targetFile = targetFile.substring(pos + 1);
}
JarEntry entry = new JarEntry(targetFile);
@@ -798,6 +954,78 @@
}
/**
+ * @param i_categoryInfo
+ * @return
+ */
+ private Element createUnitForCategory(CategoryInfo info) {
+ String version = info.getVersion();
+ String id = info.getID();
+ /*
+ <unit id="201112211149.GEF3D" version="1.0.0.08-77cLX4vE7UEMMMUUMMMlL">
+ */
+ Element unit = createElement("unit", //
+ "id", id, //
+ "version", version);
+ /*
+ <properties size="3">
+ <property name="org.eclipse.equinox.p2.name" value="GEF3D"/>
+ <property name="org.eclipse.equinox.p2.description" value="GEF3D"/>
+ <property name="org.eclipse.equinox.p2.type.category" value="true"/>
+ </properties>
+ */
+ addList(unit,
+ "properties",
+ createElement("property", "name",
+ "org.eclipse.equinox.p2.name", "value",
+ info.getLabel()),
+ createElement("property", "name",
+ "org.eclipse.equinox.p2.description", "value",
+ info.description),
+ createElement("property", "name",
+ "org.eclipse.equinox.p2.type.category", "value",
+ "true"));
+ /*
+ <provides size="1">
+ <provided namespace="org.eclipse.equinox.p2.iu" name="201112211149.GEF3D" version="1.0.0.08-77cLX4vE7UEMMMUUMMMlL"/>
+ </provides>
+ */
+ addList(unit, "provides",
+ createElement("provided",
+ "namespace", "org.eclipse.equinox.p2.iu",
+ "name", id,
+ "version", version));
+
+ /*
+ <requires size="4">
+ <required namespace="org.eclipse.equinox.p2.iu" name="org.eclipse.gef3d.sdk.feature.group" range="[0.8.1.201112211149,0.8.1.201112211149]"/>
+ <required namespace="org.eclipse.equinox.p2.iu" name="org.eclipse.gef3d.feature.group" range="[0.8.1.201112211149,0.8.1.201112211149]"/>
+ ...
+ </requires>
+ */
+ List<Element> requires = new ArrayList<Element>();
+ for (FeatureInfo featureInfo: info.required) {
+ String featureVersion = featureInfo.xpath("@version");
+ String featureName = featureInfo.xpath("@id") + ".feature.group";
+ Element required = createElement("required",
+ "namespace", "org.eclipse.equinox.p2.iu", //
+ "name", featureName, //
+ "range", "[" + featureVersion +"," + featureVersion + "]"
+ );
+ requires.add(required);
+ }
+ addList(unit, "requires", requires);
+
+ /*
+ <touchpoint id="null" version="0.0.0"/>
+ </unit>
+ */
+ addElement(unit, "touchpoint", "id", "null", "version", "0.0.0");
+
+ return unit;
+
+ }
+
+ /**
* @param i_bundleInfo
* @return
* @throws Exception
@@ -1212,7 +1440,8 @@
// publisher.repositoryURI = "http://lwjgl.org/update";
try {
publisher.execute();
- System.out.println("Successfull created p2 metadata in " + publisher.updateSiteFolder);
+ System.out.println("Successfull created p2 metadata in "
+ + publisher.updateSiteFolder);
} catch (Exception ex) {
System.err.println("Error creating p2 metadata: ");
System.err.println(ex);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|