retaining backwards compatibility. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267585 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -67,11 +67,12 @@ import java.util.*; | |||
| public class Copydir extends Task { | |||
| public File srcDir; | |||
| public File destDir; | |||
| private File srcDir; | |||
| private File destDir; | |||
| private String[] includes; | |||
| private String[] excludes; | |||
| private boolean useDefaultExcludes = true; | |||
| private Hashtable filecopyList = new Hashtable(); | |||
| private Vector ignoreList = new Vector(); | |||
| public void setSrc(String src) { | |||
| srcDir = project.resolveFile(src); | |||
| @@ -81,8 +82,85 @@ public class Copydir extends Task { | |||
| destDir = project.resolveFile(dest); | |||
| } | |||
| /** | |||
| * Sets the set of include patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param includes the string containing the include patterns | |||
| */ | |||
| public void setIncludes(String includes) { | |||
| if (includes != null && includes.length() > 0) { | |||
| Vector tmpIncludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(includes, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpIncludes.addElement(pattern); | |||
| } | |||
| } | |||
| this.includes = new String[tmpIncludes.size()]; | |||
| for (int i = 0; i < tmpIncludes.size(); i++) { | |||
| this.includes[i] = (String)tmpIncludes.elementAt(i); | |||
| } | |||
| } else { | |||
| this.includes = null; | |||
| } | |||
| } | |||
| /** | |||
| * Sets the set of exclude patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param excludes the string containing the exclude patterns | |||
| */ | |||
| public void setExcludes(String excludes) { | |||
| if (excludes != null && excludes.length() > 0) { | |||
| Vector tmpExcludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(excludes, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpExcludes.addElement(pattern); | |||
| } | |||
| } | |||
| this.excludes = new String[tmpExcludes.size()]; | |||
| for (int i = 0; i < tmpExcludes.size(); i++) { | |||
| this.excludes[i] = (String)tmpExcludes.elementAt(i); | |||
| } | |||
| } else { | |||
| this.excludes = null; | |||
| } | |||
| } | |||
| /** | |||
| * Sets whether default exclusions should be used or not. | |||
| * | |||
| * @param useDefaultExcludes "true" or "on" when default exclusions should | |||
| * be used, "false" or "off" when they | |||
| * shouldn't be used. | |||
| */ | |||
| public void setDefaultexcludes(String useDefaultExcludes) { | |||
| this.useDefaultExcludes = Project.toBoolean(useDefaultExcludes); | |||
| } | |||
| public void execute() throws BuildException { | |||
| scanDir(srcDir, destDir); | |||
| if (srcDir == null) { | |||
| throw new BuildException("srcdir attribute must be set!"); | |||
| } | |||
| if (!srcDir.exists()) { | |||
| throw new BuildException("srcdir does not exist!"); | |||
| } | |||
| DirectoryScanner ds = new DirectoryScanner(); | |||
| ds.setBasedir(srcDir); | |||
| ds.setIncludes(includes); | |||
| ds.setExcludes(excludes); | |||
| if (useDefaultExcludes) { | |||
| ds.addDefaultExcludes(); | |||
| } | |||
| ds.scan(); | |||
| String[] files = ds.getIncludedFiles(); | |||
| scanDir(srcDir, destDir, files); | |||
| if (filecopyList.size() > 0) { | |||
| project.log("Copying " + filecopyList.size() + " files to " | |||
| + destDir.getAbsolutePath()); | |||
| @@ -115,38 +193,32 @@ public class Copydir extends Task { | |||
| @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
| */ | |||
| public void setIgnore(String ignoreString) { | |||
| ignoreString = ignoreString; | |||
| project.log("The ignore attribute is deprecated. "+ | |||
| "Please use the excludes attribute.", | |||
| Project.MSG_WARN); | |||
| if (ignoreString != null && ignoreString.length() > 0) { | |||
| StringTokenizer tok = | |||
| new StringTokenizer(ignoreString, ", ", false); | |||
| Vector tmpExcludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(ignoreString, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| ignoreList.addElement ( tok.nextToken().trim() ); | |||
| tmpExcludes.addElement("**/"+tok.nextToken().trim()+"/**"); | |||
| } | |||
| this.excludes = new String[tmpExcludes.size()]; | |||
| for (int i = 0; i < tmpExcludes.size(); i++) { | |||
| this.excludes[i] = (String)tmpExcludes.elementAt(i); | |||
| } | |||
| } else { | |||
| this.excludes = null; | |||
| } | |||
| } | |||
| private void scanDir(File from, File to) { | |||
| String[] list = from.list(new DesirableFilter()); | |||
| if (list == null) { | |||
| project.log("Source directory " + srcDir.getAbsolutePath() | |||
| + " does not exist.", "copydir", Project.MSG_WARN); | |||
| return; | |||
| } | |||
| for (int i = 0; i < list.length; i++) { | |||
| String filename = list[i]; | |||
| private void scanDir(File from, File to, String[] files) { | |||
| for (int i = 0; i < files.length; i++) { | |||
| String filename = files[i]; | |||
| File srcFile = new File(from, filename); | |||
| File destFile = new File(to, filename); | |||
| if ( ! ignoreList.contains(filename) ) { | |||
| if (srcFile.isDirectory()) { | |||
| scanDir(srcFile, destFile); | |||
| } else { | |||
| if (srcFile.lastModified() > destFile.lastModified()) { | |||
| filecopyList.put(srcFile.getAbsolutePath(), | |||
| if (srcFile.lastModified() > destFile.lastModified()) { | |||
| filecopyList.put(srcFile.getAbsolutePath(), | |||
| destFile.getAbsolutePath()); | |||
| } | |||
| } | |||
| } else { | |||
| project.log("Copydir Ignored: " + filename, Project.MSG_VERBOSE); | |||
| } | |||
| } | |||
| } | |||
| @@ -87,7 +87,7 @@ public class Jar extends Zip { | |||
| if (manifest != null) { | |||
| ZipEntry ze = new ZipEntry("META-INF/"); | |||
| zOut.putNextEntry(ze); | |||
| zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); | |||
| super.zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); | |||
| } else { | |||
| ZipEntry ze = new ZipEntry("META-INF/"); | |||
| zOut.putNextEntry(ze); | |||
| @@ -100,14 +100,22 @@ public class Jar extends Zip { | |||
| } | |||
| protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | |||
| throws IOException | |||
| throws IOException | |||
| { | |||
| // First add directory to zip entry | |||
| if( ! "META-INF/".equals(vPath) ) { | |||
| // we already added a META-INF | |||
| ZipEntry ze = new ZipEntry(vPath); | |||
| zOut.putNextEntry(ze); | |||
| // First add directory to zip entry | |||
| if(!vPath.equals("META-INF/")) { | |||
| // we already added a META-INF | |||
| ZipEntry ze = new ZipEntry(vPath); | |||
| zOut.putNextEntry(ze); | |||
| } | |||
| } | |||
| protected void zipFile(File file, ZipOutputStream zOut, String vPath) | |||
| throws IOException | |||
| { | |||
| // We already added a META-INF/MANIFEST.MF | |||
| if (!vPath.equals("META-INF/MANIFEST.MF")) { | |||
| super.zipFile(file, zOut, vPath); | |||
| } | |||
| super.zipDir(dir, zOut, vPath); | |||
| } | |||
| } | |||
| @@ -98,6 +98,9 @@ public class Javac extends Task { | |||
| private String target; | |||
| private String bootclasspath; | |||
| private String extdirs; | |||
| private String[] includes; | |||
| private String[] excludes; | |||
| private boolean useDefaultExcludes = true; | |||
| private Vector compileList = new Vector(); | |||
| private Hashtable filecopyList = new Hashtable(); | |||
| @@ -193,22 +196,91 @@ public class Javac extends Task { | |||
| } | |||
| /** | |||
| * Executes the task. | |||
| * Sets the set of include patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param includes the string containing the include patterns | |||
| */ | |||
| public void setIncludes(String includes) { | |||
| if (includes != null && includes.length() > 0) { | |||
| Vector tmpIncludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(includes, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| tmpIncludes.addElement(tok.nextToken().trim()); | |||
| } | |||
| this.includes = new String[tmpIncludes.size()]; | |||
| for (int i = 0; i < tmpIncludes.size(); i++) { | |||
| this.includes[i] = (String)tmpIncludes.elementAt(i); | |||
| } | |||
| } else { | |||
| this.includes = null; | |||
| } | |||
| } | |||
| public void execute() throws BuildException { | |||
| /** | |||
| * Sets the set of exclude patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param excludes the string containing the exclude patterns | |||
| */ | |||
| public void setExcludes(String excludes) { | |||
| if (excludes != null && excludes.length() > 0) { | |||
| Vector tmpExcludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(excludes, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| tmpExcludes.addElement(tok.nextToken().trim()); | |||
| } | |||
| this.excludes = new String[tmpExcludes.size()]; | |||
| for (int i = 0; i < tmpExcludes.size(); i++) { | |||
| this.excludes[i] = (String)tmpExcludes.elementAt(i); | |||
| } | |||
| } else { | |||
| this.excludes = null; | |||
| } | |||
| } | |||
| /** | |||
| * Sets whether default exclusions should be used or not. | |||
| * | |||
| * @param useDefaultExcludes "true" or "on" when default exclusions should | |||
| * be used, "false" or "off" when they | |||
| * shouldn't be used. | |||
| */ | |||
| public void setDefaultexcludes(String useDefaultExcludes) { | |||
| this.useDefaultExcludes = Project.toBoolean(useDefaultExcludes); | |||
| } | |||
| /** | |||
| * Executes the task. | |||
| */ | |||
| public void execute() throws BuildException { | |||
| // first off, make sure that we've got a srcdir and destdir | |||
| if (srcDir == null || destDir == null ) { | |||
| String msg = "srcDir and destDir attributes must be set!"; | |||
| throw new BuildException(msg); | |||
| if (srcDir == null) { | |||
| throw new BuildException("srcdir attribute must be set!"); | |||
| } | |||
| if (!srcDir.exists()) { | |||
| throw new BuildException("srcdir does not exist!"); | |||
| } | |||
| if (destDir == null) { | |||
| throw new BuildException("destdir attribute must be set!"); | |||
| } | |||
| // scan source and dest dirs to build up both copy lists and | |||
| // compile lists | |||
| scanDir(srcDir, destDir); | |||
| DirectoryScanner ds = new DirectoryScanner(); | |||
| ds.setBasedir(srcDir); | |||
| ds.setIncludes(includes); | |||
| ds.setExcludes(excludes); | |||
| if (useDefaultExcludes) { | |||
| ds.addDefaultExcludes(); | |||
| } | |||
| ds.scan(); | |||
| String[] files = ds.getIncludedFiles(); | |||
| scanDir(srcDir, destDir, files); | |||
| // compile the source files | |||
| @@ -262,33 +334,21 @@ public class Javac extends Task { | |||
| * support files to be copied. | |||
| */ | |||
| private void scanDir(File srcDir, File destDir) { | |||
| String[] list = srcDir.list(new DesirableFilter()); | |||
| int len = (list==null ? 0 : list.length); | |||
| for (int i = 0; i < len; i++) { | |||
| String filename = list[i]; | |||
| File srcFile = new File(srcDir, filename); | |||
| File destFile = new File(destDir, filename); | |||
| if (srcFile.isDirectory()) { | |||
| // it's a dir, scan that recursively | |||
| scanDir(srcFile, destFile); | |||
| } else { | |||
| // it's a file, see if we compile it or just copy it | |||
| if (filename.endsWith(".java")) { | |||
| File classFile = | |||
| new File(destDir, | |||
| filename.substring(0, | |||
| filename.indexOf(".java")) | |||
| private void scanDir(File srcDir, File destDir, String files[]) { | |||
| for (int i = 0; i < files.length; i++) { | |||
| File srcFile = new File(srcDir, files[i]); | |||
| if (files[i].endsWith(".java")) { | |||
| File classFile = new File(destDir, files[i].substring(0, | |||
| files[i].indexOf(".java")) | |||
| + ".class"); | |||
| if (srcFile.lastModified() > classFile.lastModified()) { | |||
| compileList.addElement(srcFile.getAbsolutePath()); | |||
| } | |||
| } else { | |||
| File destFile = new File(destDir, files[i]); | |||
| if (srcFile.lastModified() > destFile.lastModified()) { | |||
| filecopyList.put(srcFile.getAbsolutePath(), | |||
| destFile.getAbsolutePath()); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -74,10 +74,10 @@ public class Zip extends Task { | |||
| private File zipFile; | |||
| private File baseDir; | |||
| private Vector items = new Vector(); | |||
| private String[] includes; | |||
| private String[] excludes; | |||
| private boolean useDefaultExcludes = true; | |||
| private File manifest; | |||
| private Vector ignoreList = new Vector(); | |||
| private boolean allItems = false; | |||
| protected String archiveType = "zip"; | |||
| /** | |||
| @@ -107,15 +107,28 @@ public class Zip extends Task { | |||
| ignore lists are easier than include lists. ;-) | |||
| */ | |||
| public void setItems(String itemString) { | |||
| if ( itemString.equals("*") ) { | |||
| allItems = true; | |||
| project.log("The items attribute is deprecated. "+ | |||
| "Please use the includes attribute.", | |||
| Project.MSG_WARN); | |||
| if (itemString == null || itemString.equals("*")) { | |||
| includes = new String[1]; | |||
| includes[0] = "**"; | |||
| } else { | |||
| StringTokenizer tok = new StringTokenizer(itemString, ",", false); | |||
| Vector tmpIncludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(itemString, ", "); | |||
| while (tok.hasMoreTokens()) { | |||
| items.addElement(tok.nextToken().trim()); | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpIncludes.addElement(pattern+"/**"); | |||
| } | |||
| } | |||
| this.includes = new String[tmpIncludes.size()]; | |||
| for (int i = 0; i < tmpIncludes.size(); i++) { | |||
| this.includes[i] = (String)tmpIncludes.elementAt(i); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| List of filenames and directory names to not | |||
| include in the final .jar file. They should be either | |||
| @@ -130,49 +143,127 @@ public class Zip extends Task { | |||
| @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
| */ | |||
| public void setIgnore(String ignoreString) { | |||
| ignoreString = ignoreString; | |||
| if (ignoreString != null && ignoreString.length() > 0) { | |||
| StringTokenizer tok = | |||
| new StringTokenizer(ignoreString, ", ", false); | |||
| project.log("The ignore attribute is deprecated. "+ | |||
| "Please use the excludes attribute.", | |||
| Project.MSG_WARN); | |||
| if (ignoreString == null) { | |||
| this.excludes = null; | |||
| } else { | |||
| Vector tmpExcludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(ignoreString, ", "); | |||
| while (tok.hasMoreTokens()) { | |||
| ignoreList.addElement ( tok.nextToken().trim() ); | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpExcludes.addElement("**/"+pattern+"/**"); | |||
| } | |||
| } | |||
| this.excludes = new String[tmpExcludes.size()]; | |||
| for (int i = 0; i < tmpExcludes.size(); i++) { | |||
| this.excludes[i] = (String)tmpExcludes.elementAt(i); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Sets the set of include patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param includes the string containing the include patterns | |||
| */ | |||
| public void setIncludes(String includes) { | |||
| if (includes == null) { | |||
| this.includes = null; | |||
| } else { | |||
| Vector tmpIncludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(includes, ", "); | |||
| while (tok.hasMoreTokens()) { | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpIncludes.addElement(pattern); | |||
| } | |||
| } | |||
| this.includes = new String[tmpIncludes.size()]; | |||
| for (int i = 0; i < tmpIncludes.size(); i++) { | |||
| this.includes[i] = (String)tmpIncludes.elementAt(i); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Sets the set of exclude patterns. Patterns may be separated by a comma | |||
| * or a space. | |||
| * | |||
| * @param excludes the string containing the exclude patterns | |||
| */ | |||
| public void setExcludes(String excludes) { | |||
| if (excludes == null) { | |||
| this.excludes = null; | |||
| } else { | |||
| Vector tmpExcludes = new Vector(); | |||
| StringTokenizer tok = new StringTokenizer(excludes, ", ", false); | |||
| while (tok.hasMoreTokens()) { | |||
| String pattern = tok.nextToken().trim(); | |||
| if (pattern.length() > 0) { | |||
| tmpExcludes.addElement(pattern); | |||
| } | |||
| } | |||
| this.excludes = new String[tmpExcludes.size()]; | |||
| for (int i = 0; i < tmpExcludes.size(); i++) { | |||
| this.excludes[i] = (String)tmpExcludes.elementAt(i); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Sets whether default exclusions should be used or not. | |||
| * | |||
| * @param useDefaultExcludes "true" or "on" when default exclusions should | |||
| * be used, "false" or "off" when they | |||
| * shouldn't be used. | |||
| */ | |||
| public void setDefaultexcludes(String useDefaultExcludes) { | |||
| this.useDefaultExcludes = Project.toBoolean(useDefaultExcludes); | |||
| } | |||
| public void execute() throws BuildException { | |||
| project.log("Building " + archiveType + ": " + zipFile.getAbsolutePath()); | |||
| project.log("Building "+ archiveType +": "+ zipFile.getAbsolutePath()); | |||
| if (baseDir == null) { | |||
| throw new BuildException("basedir attribute must be set!"); | |||
| } | |||
| if (!baseDir.exists()) { | |||
| throw new BuildException("basedir does not exist!"); | |||
| } | |||
| DirectoryScanner ds = new DirectoryScanner(); | |||
| ds.setBasedir(baseDir); | |||
| ds.setIncludes(includes); | |||
| ds.setExcludes(excludes); | |||
| if (useDefaultExcludes) { | |||
| ds.addDefaultExcludes(); | |||
| } | |||
| ds.scan(); | |||
| String[] files = ds.getIncludedFiles(); | |||
| String[] dirs = ds.getIncludedDirectories(); | |||
| try { | |||
| ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile)); | |||
| initZipOutputStream(zOut); | |||
| if ( allItems ) { | |||
| String[] lst = baseDir.list(); | |||
| for (int i=0;i<lst.length;i++) { | |||
| items.addElement(lst[i]); | |||
| } | |||
| initZipOutputStream(zOut); | |||
| for (int i = 0; i < dirs.length; i++) { | |||
| File f = new File(baseDir,dirs[i]); | |||
| String name = dirs[i].replace(File.separatorChar,'/')+"/"; | |||
| zipDir(f, zOut, name); | |||
| } | |||
| // add items | |||
| Enumeration e = items.elements(); | |||
| while (e.hasMoreElements()) { | |||
| String s = (String)e.nextElement(); | |||
| // check to make sure item is not in ignore list | |||
| // shouldn't be ignored here, but just want to make sure | |||
| if (! ignoreList.contains(s)) { | |||
| File f = new File(baseDir, s); | |||
| if (f.isDirectory()) { | |||
| zipDir(f, zOut, s + "/"); | |||
| } else { | |||
| zipFile(f, zOut, s); | |||
| } | |||
| } else { | |||
| project.log("Ignoring: " + s, Project.MSG_WARN); | |||
| } | |||
| for (int i = 0; i < files.length; i++) { | |||
| File f = new File(baseDir,files[i]); | |||
| String name = files[i].replace(File.separatorChar,'/'); | |||
| zipFile(f, zOut, name); | |||
| } | |||
| // close up | |||
| // close up | |||
| zOut.close(); | |||
| } catch (IOException ioe) { | |||
| String msg = "Problem creating " + archiveType + " " + ioe.getMessage(); | |||
| @@ -181,29 +272,14 @@ public class Zip extends Task { | |||
| } | |||
| protected void initZipOutputStream(ZipOutputStream zOut) | |||
| throws IOException, BuildException | |||
| throws IOException, BuildException | |||
| { | |||
| zOut.setMethod(ZipOutputStream.DEFLATED); | |||
| zOut.setMethod(ZipOutputStream.DEFLATED); | |||
| } | |||
| protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | |||
| throws IOException | |||
| { | |||
| String[] list = dir.list(); | |||
| for (int i = 0; i < list.length; i++) { | |||
| String f = list[i]; | |||
| // check to make sure item is not in ignore list | |||
| if (! ignoreList.contains(f)) { | |||
| File file = new File(dir, f); | |||
| if (file.isDirectory()) { | |||
| zipDir(file, zOut, vPath + f + "/"); | |||
| } else { | |||
| zipFile(file, zOut, vPath + f); | |||
| } | |||
| } else { | |||
| project.log("Ignoring: " + f, Project.MSG_WARN); | |||
| } | |||
| } | |||
| } | |||
| protected void zipFile(InputStream in, ZipOutputStream zOut, String vPath) | |||
| @@ -211,7 +287,7 @@ public class Zip extends Task { | |||
| { | |||
| ZipEntry ze = new ZipEntry(vPath); | |||
| zOut.putNextEntry(ze); | |||
| byte[] buffer = new byte[8 * 1024]; | |||
| int count = 0; | |||
| do { | |||
| @@ -219,7 +295,7 @@ public class Zip extends Task { | |||
| count = in.read(buffer, 0, buffer.length); | |||
| } while (count != -1); | |||
| } | |||
| protected void zipFile(File file, ZipOutputStream zOut, String vPath) | |||
| throws IOException | |||
| { | |||