public static void transform(URL url, OutputStream os) throws Exception { // Build dom document Document doc = parse(url); // Heuristicly retrieve name and version String name = getPath(url); int idx = name.lastIndexOf('/'); if (idx >= 0) { name = name.substring(idx + 1); } String[] str = DeployerUtils.extractNameVersionType(name); // Create manifest Manifest m = new Manifest(); m.getMainAttributes().putValue("Manifest-Version", "2"); m.getMainAttributes().putValue(Constants.BUNDLE_MANIFESTVERSION, "2"); m.getMainAttributes().putValue(Constants.BUNDLE_SYMBOLICNAME, str[0]); m.getMainAttributes().putValue(Constants.BUNDLE_VERSION, str[1]); String importPkgs = getImportPackages(analyze(new DOMSource(doc))); if (importPkgs != null && importPkgs.length() > 0) { m.getMainAttributes().putValue(Constants.IMPORT_PACKAGE, importPkgs); } m.getMainAttributes().putValue(Constants.DYNAMICIMPORT_PACKAGE, "*"); // Extract manifest entries from the DOM NodeList l = doc.getElementsByTagName("manifest"); if (l != null) { for (int i = 0; i < l.getLength(); i++) { Element e = (Element) l.item(i); String text = e.getTextContent(); Properties props = new Properties(); props.load(new ByteArrayInputStream(text.trim().getBytes())); Enumeration en = props.propertyNames(); while (en.hasMoreElements()) { String k = (String) en.nextElement(); String v = props.getProperty(k); m.getMainAttributes().putValue(k, v); } e.getParentNode().removeChild(e); } } JarOutputStream out = new JarOutputStream(os); ZipEntry e = new ZipEntry(JarFile.MANIFEST_NAME); out.putNextEntry(e); m.write(out); out.closeEntry(); e = new ZipEntry("OSGI-INF/"); out.putNextEntry(e); e = new ZipEntry("OSGI-INF/blueprint/"); out.putNextEntry(e); out.closeEntry(); // check .xml file extension if (!name.endsWith(".xml")) { name += ".xml"; } e = new ZipEntry("OSGI-INF/blueprint/" + name); out.putNextEntry(e); // Copy the new DOM XmlUtils.transform(new DOMSource(doc), new StreamResult(out)); out.closeEntry(); out.close(); }
public static Set<String> analyze(Source source) throws Exception { Set<String> refers = new TreeSet<String>(); ByteArrayOutputStream bout = new ByteArrayOutputStream(); Result r = new StreamResult(bout); XmlUtils.transform( new StreamSource(BlueprintTransformer.class.getResourceAsStream("extract.xsl")), source, r); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); bout.close(); BufferedReader br = new BufferedReader(new InputStreamReader(bin)); String line = br.readLine(); while (line != null) { line = line.trim(); if (line.length() > 0) { String parts[] = line.split("\\s*,\\s*"); for (int i = 0; i < parts.length; i++) { int n = parts[i].lastIndexOf('.'); if (n > 0) { String pkg = parts[i].substring(0, n); if (!pkg.startsWith("java.")) { refers.add(pkg); } } } } line = br.readLine(); } br.close(); return refers; }