blob: 9886cf0e6a32f9ac8a6382d0a31f519113e5a07e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.l10n;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Properties;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
//import org.netbeans.nbbuild.XMLUtil;
//import org.netbeans.nbbuild.AutoUpdate;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.Copy;
import org.apache.tools.ant.taskdefs.Delete;
import org.apache.tools.ant.taskdefs.Jar;
import org.apache.tools.ant.taskdefs.Mkdir;
import org.apache.tools.ant.taskdefs.SignJar;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.ZipFileSet;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
public class Package extends Task {
private Path classpath;
private boolean pError = false;
HashMap<String, Vector<String>> nbms = new HashMap<String, Vector<String>>();
File srcDir = null;
private String jarSignerMaxMemory = "96m";
/** Set the location of <samp>jhall.jar</samp> or <samp>jsearch.jar</samp> (JavaHelp tools library). */
public Path createClasspath() {
// JavaHelp release notes say jhtools.jar is enough, but class NoClassDefFoundError
// on javax.help.search.IndexBuilder when I tried it...
if (classpath == null) {
classpath = new Path(getProject());
}
return classpath.createPath();
}
public void setSrc(File f) {
srcDir = f;
}
File distDir = null;
public void setDist(File d) {
distDir = d;
}
File nbmsDistDir = null;
public void setNbmsDist(File d) {
nbmsDistDir = d;
}
String locales;
/** Set a comma-separated list of locales. */
public void setLocales(String l) {
locales = l;
}
File nbmsLocation = null;
public void setNBMs(File f) {
nbmsLocation = f;
}
public File keystore;
public String storepass, alias;
/** Path to the keystore (private key). */
public void setKeystore(File f) {
keystore = f;
}
/** Password for the keystore.
* If a question mark (<samp>?</samp>), the NBM will not be signed
* and a warning will be printed.
*/
public void setStorepass(String s) {
storepass = s;
}
/** Alias for the private key. */
public void setAlias(String s) {
alias = s;
}
public void execute() throws BuildException {
// Create all localized jars
StringTokenizer tokenizer = new StringTokenizer(locales.trim(), ", ");
while (tokenizer.hasMoreTokens()) {
String loc = tokenizer.nextToken();
processLocale(loc);
}
// // Deal with NBMs creation
// DirectoryScanner ds = new DirectoryScanner();
// ds.setBasedir(nbmsLocation);
// ds.setIncludes(new String[]{"**/*.nbm"});
// ds.scan();
// Mkdir mkdir = (Mkdir) getProject().createTask("mkdir");
// Copy copy = (Copy) getProject().createTask("copy");
// File tmpDir = new File("tmp");
// tmpDir.mkdir();
// for (String nbm : ds.getIncludedFiles()) {
// String nbmName = nbm.substring(nbm.lastIndexOf(File.separator) + 1, nbm.lastIndexOf("."));
// Vector<String> nbmFiles = nbms.get(nbmName);
// if (nbmFiles == null) {
// log("There is no localization content for NBM: " + nbmName);
// continue;
// }
// String cluster = nbm.substring(0, nbm.indexOf(File.separator));
// File destNbmDir = new File(nbmsDistDir, cluster);
// File destNbmFile = new File(destNbmDir, nbmName + ".nbm");
// if (!destNbmDir.isDirectory()) {
// mkdir.setDir(destNbmDir);
// mkdir.execute();
// }
// copy.setFile(new File(nbmsLocation, nbm));
// copy.setTodir(destNbmDir);
// copy.execute();
//
// Jar jar = (Jar) getProject().createTask("jar");
// jar.setUpdate(true);
// jar.setDestFile(destNbmFile);
// ZipFileSet zfs = new ZipFileSet();
// zfs.setDir(new File(distDir, cluster));
// zfs.setPrefix("netbeans");
// zfs.appendIncludes(nbmFiles.toArray(new String[]{""}));
// jar.addFileset(zfs);
//
// //Process InfoXMLs
// tokenizer = new StringTokenizer(locales.trim(), ", ");
// while (tokenizer.hasMoreTokens()) {
// String loc = tokenizer.nextToken();
// try {
// File jarF = new File(distDir, cluster + File.separator + "modules" + File.separator + "locale" + File.separator + nbmName + "_" + loc + ".jar");
// if (!jarF.isFile()) {
// log("No " + loc + " localization for " + nbmName);
// continue;
// }
// //Find localized bundle
// JarFile jarFile = new JarFile(new File(distDir, cluster + File.separator + "modules" + File.separator + "locale" + File.separator + nbmName + "_" + loc + ".jar"));
// Properties p = new Properties();
// ZipEntry bundleentry = jarFile.getEntry(nbmName.replace('-', '/') + File.separator + "Bundle_" + loc + ".properties");
// if (bundleentry == null) {
// //Read it from the NBM and module's jar manifest
// JarFile nbmFile = new JarFile(destNbmFile);
// String jarEntryName = "netbeans/modules/" + nbmName + ".jar";
// ZipEntry ze = nbmFile.getEntry(jarEntryName);
// InputStream is;
// if(ze == null) {
// //NBM is packed with pack200
// ze = nbmFile.getEntry(jarEntryName + ".pack.gz");
// if(ze!=null) {
// File packedJar = File.createTempFile(nbmName, ".jar.pack.gz", tmpDir);
// File unpackedJar = File.createTempFile(nbmName, ".jar", tmpDir);
// unpackedJar.deleteOnExit();
// packedJar.deleteOnExit();
// InputStream fis = nbmFile.getInputStream(ze);
// BufferedOutputStream bof = new BufferedOutputStream(new FileOutputStream(packedJar));
// byte [] buffer = new byte [4096];
// int read = 0;
// while ((read = fis.read(buffer)) != -1) {
// bof.write(buffer, 0, read);
// }
// bof.close();
// fis.close();
// AutoUpdate.unpack200(packedJar, unpackedJar);
// is = new FileInputStream(unpackedJar);
// } else {
// throw new BuildException("Cannot find neither " +
// jarEntryName + ".pack.gz nor " +
// jarEntryName + " entry in " + nbmFile.getName());
// }
// } else {
// is = nbmFile.getInputStream(ze);
// }
//
// File tmpJar = File.createTempFile("module", ".jar", tmpDir);
// BufferedOutputStream bof = new BufferedOutputStream(new FileOutputStream(tmpJar));
// int ch = 0;
// while ((ch = is.read()) != -1) {
// bof.write(ch);
// }
// bof.close();
// is.close();
// JarFile moduleJar = new JarFile(tmpJar);
// String bundlename = moduleJar.getManifest().getMainAttributes().getValue("OpenIDE-Module-Localizing-Bundle");
// String bfname = bundlename.substring(0, bundlename.lastIndexOf('.'));
// String bfext = bundlename.substring(bundlename.lastIndexOf('.'));
// bundlename = bfname + "_" + loc + bfext;
// bundleentry = jarFile.getEntry(bundlename);
// moduleJar.close();
// tmpJar.delete();
// }
// if (bundleentry != null) {
// InputStream is = jarFile.getInputStream(bundleentry);
// try {
// p.load(is);
// } finally {
// is.close();
// }
// // Open the original info XML
// JarFile nbmFile = new JarFile(destNbmFile);
// Document doc = XMLUtil.parse(new InputSource(nbmFile.getInputStream(nbmFile.getEntry("Info/info.xml"))), false, false, new ErrorCatcher(), null);
// Element manifest = (Element) doc.getElementsByTagName("manifest").item(0);
//
// // Now pick up attributes from the bundle and put them to the info.xml
// for (String attr : new String[]{"OpenIDE-Module-Name", "OpenIDE-Module-Display-Category", "OpenIDE-Module-Short-Description", "OpenIDE-Module-Long-Description"}) {
// String value = p.getProperty(attr);
// if (value != null) {
// manifest.setAttribute(attr, value);
// }
// }
// File infofile = new File(tmpDir, "info_" + loc + ".xml");
// OutputStream infoStream = new FileOutputStream(infofile);
// XMLUtil.write(doc, infoStream);
// infoStream.close();
// zfs = new ZipFileSet();
// zfs.setDir(tmpDir);
// zfs.setPrefix("Info/locale");
// zfs.appendIncludes(new String[]{"info_" + loc + ".xml"});
// jar.addFileset(zfs);
// } else {
// log("Can't find localizing bundle for " + nbmName);
// }
// } catch (IOException ex) {
// log("Problems with reading localization bundles for " + loc + ", NBM: " + nbmName, ex, Project.MSG_WARN);
//
// } catch (SAXException saxe) {
// log("Problem with creating localized info.xml for " + loc + ", NBM: " + nbmName, saxe, Project.MSG_WARN);
// }
//
// }
// jar.execute();
//
// if (keystore != null && storepass != null && alias != null) {
// if (!keystore.isFile()) {
// continue;
// }
// SignJar signjar = (SignJar) getProject().createTask("signjar");
// try { // Signatures changed in various Ant versions.
//
// try {
// SignJar.class.getMethod("setKeystore", File.class).invoke(signjar, keystore);
// } catch (NoSuchMethodException x) {
// SignJar.class.getMethod("setKeystore", String.class).invoke(signjar, keystore.getAbsolutePath());
// }
// try {
// SignJar.class.getMethod("setJar", File.class).invoke(signjar, destNbmFile);
// } catch (NoSuchMethodException x) {
// SignJar.class.getMethod("setJar", String.class).invoke(signjar, destNbmFile.getAbsolutePath());
// }
// } catch (BuildException x) {
// throw x;
// } catch (Exception x) {
// throw new BuildException(x);
// }
// signjar.setStorepass(storepass);
// signjar.setAlias(alias);
// signjar.setLocation(getLocation());
// signjar.setMaxmemory(this.jarSignerMaxMemory);
// signjar.init();
// signjar.execute();
// }
// }
// Delete delete = (Delete) getProject().createTask("delete");
// delete.setDir(tmpDir);
// delete.execute();
}
void processLocale(String locale) throws BuildException {
DirectoryScanner ds = new DirectoryScanner();
// File baseSrcDir = new File(srcDir, locale);
File baseSrcDir = srcDir;
// if (!baseSrcDir.exists()) {
// log("No files for locale: " + locale);
// return;
// }
ds.setBasedir(baseSrcDir);
String[] includes = new String[]{"*/*/*", "*/*/ext/*", "*/*/ext/locale/*", "*/*/netbeans/*/*", "*/*/netbeans/*/locale/*", "*/*/netbeans/*/nblib/*", "*/*/netbeans/*/extra/*", "*/*/docs/*", "*/*/locale/*", "*/*/netbeans/config/*/*"};
String[] excludes = new String[]{"other/**", "*/*/netbeans", "*/*/netbeans/*", "*/*/netbeans/*/locale", "*/*/netbeans/*/nblib", "*/*/netbeans/*/extra", "*/*/docs", "*/*/ext", "*/*/ext/locale", "*/*/locale", "*/*/netbeans/config/*"};
ds.setIncludes(includes);
ds.setExcludes(excludes);
ds.scan();
Jar jar = (Jar) getProject().createTask("jar");
Mkdir mkdir = (Mkdir) getProject().createTask("mkdir");
Task locJH = getProject().createTask("locjhindexer");
for (String dir : ds.getIncludedDirectories()) {
String name = dir.substring(dir.lastIndexOf(File.separator) + 1);
name = name.replaceAll("^vw-rh", "visualweb-ravehelp-rave_nbpack");
name = name.replaceAll("^vw-", "visualweb-");
String nbm = dir.substring(dir.indexOf(File.separator) + 1);
nbm = nbm.substring(0, nbm.indexOf(File.separator));
String cluster = dir.substring(0, dir.indexOf(File.separator));
String subPath = dir.substring((cluster + File.separator + nbm + File.separator).length() - 1, dir.lastIndexOf(File.separator));
if (!subPath.startsWith(File.separator + "netbeans")) {
subPath = File.separator + "modules" + subPath;
if (!name.startsWith("org-") && !(subPath.endsWith(File.separator + "ext") || subPath.endsWith(File.separator + "ext" + File.separator + "locale"))) {
name = "org-netbeans-modules-" + name;
} else {
// Handle exception from ext/
if (name.startsWith("web-httpmonitor") || name.startsWith("deployment-deviceanywhere")) {
name = "org-netbeans-modules-" + name;
}
}
} else {
subPath = subPath.substring((File.separator + "netbeans").length());
//Handle exceptions form nblib
if (name.startsWith("j2ee-ant") || name.startsWith("deployment-deviceanywhere") || name.startsWith("mobility-project") || name.startsWith("java-j2seproject-copylibstask")) {
name = "org-netbeans-modules-" + name;
}
}
nbm = nbm.replaceAll("^vw-rh", "visualweb-ravehelp-rave_nbpack");
nbm = nbm.replaceAll("^vw-", "visualweb-");
if (!nbm.startsWith("org-") && !nbm.startsWith("com-")) {
nbm = "org-netbeans-modules-" + nbm;
}
cluster = cluster.replaceAll("^vw", "visualweb");
if (subPath.matches(".*/docs$")) {
ds.setBasedir(new File(baseSrcDir, dir));
ds.setIncludes(new String[]{"**/*.hs"});
ds.setExcludes(new String[]{""});
ds.scan();
if (ds.getIncludedFilesCount() != 1) {
throw new BuildException("Can't find .hs file for " + name + " module.");
}
File hsFile = new File(new File(baseSrcDir, dir), ds.getIncludedFiles()[0]);
File baseJHDir = hsFile.getParentFile();
try {
System.out.println("Basedir: " + baseJHDir.getAbsolutePath());
locJH.getClass().getMethod("setBasedir", File.class).invoke(locJH, baseJHDir);
locJH.getClass().getMethod("setLocales", String.class).invoke(locJH, locale);
locJH.getClass().getMethod("setDbdir", String.class).invoke(locJH, "JavaHelpSearch");
((Path)locJH.getClass().getMethod("createClasspath").invoke(locJH)).add(classpath);
} catch (Exception ex) {
throw new BuildException("Can't run locJHInxeder", ex);
}
locJH.execute();
}
if (!subPath.endsWith("locale")) {
subPath += File.separator + "locale";
}
String jarFileName = name + "_" + locale + ".jar";
// File distJarDir = new File(distDir.getAbsolutePath(), cluster + subPath);
File distJarDir = distDir;
mkdir.setDir(distJarDir);
mkdir.execute();
jar.setBasedir(new File(baseSrcDir, dir));
jar.setDestFile(new File(distJarDir, jarFileName));
jar.execute();
Vector<String> nbmFiles = nbms.get(nbm);
if (nbmFiles == null) {
nbmFiles = new Vector<String>();
nbms.put(nbm, nbmFiles);
}
nbmFiles.add(subPath.substring(1) + File.separator + jarFileName);
}
ds.setBasedir(baseSrcDir);
ds.setIncludes(includes);
ds.setExcludes(excludes);
ds.scan();
Copy copy = (Copy) getProject().createTask("copy");
for (String file : ds.getIncludedFiles()) {
String name = file.substring(file.lastIndexOf(File.separator) + 1);
name = name.replaceAll("^vw-rh", "visualweb-ravehelp-rave_nbpack");
name = name.replaceAll("^vw-", "visualweb-");
String nbm = file.substring(file.indexOf(File.separator) + 1);
nbm = nbm.substring(0, nbm.indexOf(File.separator));
String cluster = file.substring(0, file.indexOf(File.separator));
String subPath = file.substring((cluster + File.separator + nbm + File.separator).length() - 1, file.lastIndexOf(File.separator));
if (!subPath.startsWith(File.separator + "netbeans")) {
subPath = File.separator + "modules" + subPath;
} else {
subPath = subPath.substring((File.separator + "netbeans").length());
}
nbm = nbm.replaceAll("^vw-rh", "visualweb-ravehelp-rave_nbpack");
nbm = nbm.replaceAll("^vw-", "visualweb-");
if (!nbm.startsWith("org") || !nbm.startsWith("com")) {
nbm = "org-netbeans-modules-" + nbm;
}
cluster = cluster.replaceAll("^vw", "visualweb");
File distFileDir = new File(distDir.getAbsolutePath(), cluster + subPath);
mkdir.setDir(distFileDir);
mkdir.execute();
copy.setFile(new File(baseSrcDir, file));
copy.setTodir(distFileDir);
copy.execute();
Vector<String> nbmFiles = nbms.get(nbm);
if (nbmFiles == null) {
nbmFiles = new Vector<String>();
nbms.put(nbm, nbmFiles);
}
nbmFiles.add(subPath.substring(1) + File.separator + file);
}
}
class ErrorCatcher implements ErrorHandler {
public void error(SAXParseException e) {
// normally a validity error
pError = true;
}
public void warning(SAXParseException e) {
//parseFailed = true;
}
public void fatalError(SAXParseException e) {
pError = true;
}
}
}