From a91da9efa68ae7b4809aea1a82e4ca1cbd66efd9 Mon Sep 17 00:00:00 2001 From: Jens von Pilgrim Date: Wed, 21 Dec 2011 14:34:39 +0000 Subject: [PATCH] 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. --- eclipse-update/org.lwjgl.build/anttasks.jar | Bin 24325 -> 28580 bytes .../org/lwjgl/ant/StandalonePublisher.java | 279 ++++++++++++++++-- 2 files changed, 254 insertions(+), 25 deletions(-) diff --git a/eclipse-update/org.lwjgl.build/anttasks.jar b/eclipse-update/org.lwjgl.build/anttasks.jar index 0ef27104498758eddf7aeaee365273d0ea8d0d67..c728f2ed6e646d3ee3a04e6798cce64795eae812 100644 GIT binary patch delta 20078 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 diff --git a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java b/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java index ff1adc4e..8068ddbd 100644 --- a/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java +++ b/eclipse-update/org.lwjgl.build/src/java/org/lwjgl/ant/StandalonePublisher.java @@ -17,13 +17,19 @@ import java.io.FileFilter; 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,25 +100,10 @@ public class StandalonePublisher extends Task { 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; - - public File jarFile; + abstract public String getRootElementName(); public String xpath(String path) { if (path.startsWith("/")) @@ -139,6 +130,76 @@ public class StandalonePublisher extends Task { 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 required = new ArrayList( + 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,6 +427,88 @@ public class StandalonePublisher extends Task { } + protected Collection 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 featuresById = new HashMap(); + for (FeatureInfo featureInfo : featureInfos) { + featuresById.put(featureInfo.getID(), featureInfo); + } + + Map categoryInfos = new HashMap(); + Map featureToGroup = new HashMap(); + + if (f.exists()) { + SiteInfo site = new SiteInfo(); + site.doc = readXML(documentBuilder, new FileInputStream(f)); + + List 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 features = site.xpathNods("//site//feature"); + for (Node feature : features) { + featureToGroup.put(xpath(feature, "@id"), + xpath(feature, "category/@name")); + } + + } + + // sort features to their category: + List sortedFeatures = new ArrayList(); + 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 @@ -445,7 +588,12 @@ public class StandalonePublisher extends Task { bundleInfos[i] = readBundle(locations[i]); } - writeContent(featureInfos, bundleInfos); + DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() + .newDocumentBuilder(); + Collection categoryInfos = readSite(docBuilder, + featureInfos); + + writeContent(featureInfos, bundleInfos, categoryInfos); writeArtifacts(featureInfos, bundleInfos); } @@ -453,10 +601,12 @@ public class StandalonePublisher extends Task { /** * @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 i_categoryInfos) + throws Exception { DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); @@ -499,6 +649,11 @@ public class StandalonePublisher extends Task { 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 @@ public class StandalonePublisher extends Task { 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); @@ -797,6 +953,78 @@ public class StandalonePublisher extends Task { return unit; } + /** + * @param i_categoryInfo + * @return + */ + private Element createUnitForCategory(CategoryInfo info) { + String version = info.getVersion(); + String id = info.getID(); + /* + + */ + Element unit = createElement("unit", // + "id", id, // + "version", version); + /* + + + + + + */ + 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")); + /* + + + + */ + addList(unit, "provides", + createElement("provided", + "namespace", "org.eclipse.equinox.p2.iu", + "name", id, + "version", version)); + + /* + + + + ... + + */ + List requires = new ArrayList(); + 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); + + /* + + + */ + addElement(unit, "touchpoint", "id", "null", "version", "0.0.0"); + + return unit; + + } + /** * @param i_bundleInfo * @return @@ -1212,7 +1440,8 @@ public class StandalonePublisher extends Task { // 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);