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;
  }
 protected static Document parse(URL url) throws Exception {
   return XmlUtils.parse(url.toString());
 }