/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package org.netbeans.nbbuild; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.LineNumberReader; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; 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.Delete; import org.apache.tools.ant.taskdefs.Expand; import org.apache.tools.ant.taskdefs.Zip; import org.apache.tools.ant.types.FileSet; import org.apache.tools.ant.types.ZipFileSet; import org.apache.tools.ant.types.selectors.SelectorUtils; /** * This task was created to create L10N kits. * The xml to call this task might look like: * <l10nTask nbmsdir="nbms" tmpdir="tmp" patternsFile="l10n.patterns" * kitFile="build/l10n.zip"/> * * * Resulting kitFile will contain the files according the patterns * from patternsFile * * @author Michal Zlamal */ public class L10nTask extends Task { File nbmsDir = null; File tmpDir = null; File patternsFile = null; File kitFile = null; public void execute() throws BuildException { LineNumberReader lnr = null; try { if (nbmsDir == null) { throw new BuildException("Required variable not set. Set 'nbmsdir' in the calling build script file"); } if (!nbmsDir.exists() || !nbmsDir.isDirectory()) { throw new BuildException("'nbmsdir' has to exist and be directory where are all NBMs stored"); } if (patternsFile == null) { throw new BuildException("Required variable not set. Set 'patternsFile' in the calling build script file"); } if (!patternsFile.exists() || !patternsFile.isFile()) { throw new BuildException("'patternsFile' has to exist and be file with patterns what should be included in the kit"); } if (kitFile == null) { throw new BuildException("Required variable not set. Set 'kitFile' in the calling build script file"); } lnr = new LineNumberReader(new FileReader(patternsFile)); String line = null; Map<String, Set<String>> includes = new HashMap<String, Set<String>>(); Map<String, Set<String>> excludes = new HashMap<String, Set<String>>(); Set<String> excludeFiles = new HashSet<String>(); //Read all the patterns from patternsFile while ((line = lnr.readLine()) != null) { if (line.trim().length() == 0) { continue; } if (line.startsWith("#")) continue; if (!line.startsWith("exclude ")) { //Include pattern String[] p = line.split(":"); if (p.length != 2) { if (line.endsWith(":")) { includes.put(line.substring(0, line.length() - 1), null); continue; } else { throw new BuildException("Wrong pattern '" + line + "' found in pattern file: " + patternsFile.getAbsolutePath()); } } Set<String> files = includes.get(p[0]); if (files == null) { files = new HashSet<String>(); includes.put(p[0], files); } files.add(p[1]); } else { //Exlude pattern line = line.substring("exclude ".length()); String[] p = line.split(":"); if (p.length != 2) { if (line.endsWith(":")) { excludes.put(line.substring(0, line.length() - 1), null); excludeFiles.add(line.substring(0, line.length() - 1)); continue; } else { throw new BuildException("Wrong pattern '" + line + "' found in pattern file: " + patternsFile.getAbsolutePath()); } } Set<String> files = excludes.get(p[0]); if (files == null) { files = new HashSet<String>(); excludes.put(p[0], files); } files.add(p[1]); } } lnr.close(); //Unzip all the NBMs DirectoryScanner ds = new DirectoryScanner(); ds.setBasedir(nbmsDir); ds.setIncludes(new String[]{"**/*.nbm"}); ds.scan(); String[] nbms = ds.getIncludedFiles(); Expand unzip = (Expand) getProject().createTask("unzip"); for (String nbm : nbms) { File nbmFile = new File(nbmsDir, nbm); File nbmDir = new File(tmpDir, nbm); nbmDir.mkdirs(); unzip.setSrc(nbmFile); unzip.setDest(nbmDir); unzip.execute(); DirectoryScanner packGzDs = new DirectoryScanner(); final String suffix = ".jar.pack.gz"; packGzDs.setBasedir(nbmDir); packGzDs.setIncludes(new String[]{"**/*" + suffix}); packGzDs.scan(); for(String packedJar : packGzDs.getIncludedFiles()) { File packedJarFile = new File(nbmDir, packedJar); File unpackedJarFile = new File(nbmDir, packedJar.substring(0, packedJar.length() - suffix.length()) + ".jar"); log("Unpacking " + packedJar + " to " + unpackedJarFile, Project.MSG_VERBOSE); AutoUpdate.unpack200(packedJarFile, unpackedJarFile); packedJarFile.delete(); } } ds.setBasedir(tmpDir); String[] includesKeys = includes.keySet().toArray(new String[]{""}); String[] excludesKeys = excludes.keySet().toArray(new String[]{""}); if (includesKeys[0] != null) { ds.setIncludes(includesKeys); } if (excludeFiles.size() > 0) { ds.setExcludes(excludeFiles.toArray(new String[]{""})); } //Go though all the found files maching the first part of the pattern ds.scan(); if (kitFile.exists()) { kitFile.delete(); } Zip zip = (Zip) getProject().createTask("zip"); zip.setDestFile(kitFile); for (String filePath : ds.getIncludedFiles()) { String file = filePath.replace("\\", "/"); ZipFileSet zipFileSet = new ZipFileSet(); boolean matching = false; for (String include : includesKeys) { if (SelectorUtils.matchPath(include, file)) { Set<String> incPattern = includes.get(include); if (incPattern != null) { matching = true; zipFileSet.appendIncludes(incPattern.toArray(new String[]{""})); } else { FileSet fileSet = new FileSet(); fileSet.setDir(tmpDir); fileSet.setIncludes(file); zip.addFileset(fileSet); } } } if (matching) { for (String exclude : excludesKeys) { if (SelectorUtils.matchPath(exclude, file)) { Set<String> excPattern = excludes.get(exclude); if (excPattern != null) { zipFileSet.appendExcludes(excPattern.toArray(new String[]{""})); } } } File oneFile = new File(tmpDir, file); zipFileSet.setSrc(oneFile); file = file.replaceAll("^visualweb","vw"); file = file.replaceAll("visualweb-","vw-"); file = file.replaceAll("ravehelp-rave_nbpack","rh"); file = file.replaceAll("org-netbeans-modules-", ""); file = file.replaceAll("/netbeans/modules/", "/"); file = file.replaceAll("\\.nbm/", "/"); file = file.replaceAll("\\.jar", ""); zipFileSet.setPrefix(file); zip.addZipfileset(zipFileSet); } } zip.execute(); Delete delete = (Delete) getProject().createTask("delete"); delete.setDir(tmpDir); delete.execute(); } catch (FileNotFoundException ex) { Logger.getLogger(L10nTask.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(L10nTask.class.getName()).log(Level.SEVERE, null, ex); } finally { try { if (lnr!=null) { lnr.close(); } } catch (IOException ex) { Logger.getLogger(L10nTask.class.getName()).log(Level.SEVERE, null, ex); } } } public void setNbmsdir(File nbmsDir) { this.nbmsDir = nbmsDir; } public void setTmpdir(File tmpDir) { this.tmpDir = tmpDir; } public void setPatternsFile(File patternsFile) { this.patternsFile = patternsFile; } public void setKitFile(File kitFile) { this.kitFile = kitFile; } }