Available.java Tar.java Tstamp.java setFoo(String) has been deprecated for the affected attributes. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270071 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -98,4 +98,9 @@ | |||
| file="../this_dir_should_never_exist" type="dir"/> | |||
| </target> | |||
| <target name="test19"> | |||
| <available property="test" | |||
| file="available.xml" type="Foo"/> | |||
| </target> | |||
| </project> | |||
| @@ -26,7 +26,11 @@ | |||
| basedir="." | |||
| includes="test5dir"/> | |||
| </target> | |||
| <target name="test6"> | |||
| <tar tarfile="blah" longfile="Foo"/> | |||
| </target> | |||
| <target name="cleanup"> | |||
| <delete file="test4.tar"/> | |||
| <delete file="test5.tar"/> | |||
| @@ -61,6 +61,7 @@ import org.apache.tools.ant.AntClassLoader; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.taskdefs.condition.Condition; | |||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| import org.apache.tools.ant.types.Path; | |||
| import org.apache.tools.ant.types.Reference; | |||
| import org.apache.tools.ant.util.FileUtils; | |||
| @@ -69,6 +70,7 @@ import org.apache.tools.ant.util.FileUtils; | |||
| * Will set the given property if the requested resource is available at runtime. | |||
| * | |||
| * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public class Available extends Task implements Condition { | |||
| @@ -78,7 +80,7 @@ public class Available extends Task implements Condition { | |||
| private String file; | |||
| private Path filepath; | |||
| private String resource; | |||
| private String type; | |||
| private FileDir type; | |||
| private Path classpath; | |||
| private AntClassLoader loader; | |||
| private String value = "true"; | |||
| @@ -101,7 +103,7 @@ public class Available extends Task implements Condition { | |||
| public void setFilepath(Path filepath) { | |||
| createFilepath().append(filepath); | |||
| } | |||
| public Path createFilepath() { | |||
| if (this.filepath == null) { | |||
| this.filepath = new Path(project); | |||
| @@ -131,7 +133,20 @@ public class Available extends Task implements Condition { | |||
| this.resource = resource; | |||
| } | |||
| /** | |||
| * @deprecated setType(String) is deprecated and is replaced with | |||
| * setType(Available.FileDir) to make Ant's Introspection | |||
| * mechanism do the work and also to encapsulate operations on | |||
| * the type in its own class. | |||
| */ | |||
| public void setType(String type) { | |||
| log("DEPRECATED - The setType(String) method has been deprecated." | |||
| + " Use setType(Available.FileDir) instead."); | |||
| this.type = new FileDir(); | |||
| this.type.setValue(type); | |||
| } | |||
| public void setType(FileDir type) { | |||
| this.type = type; | |||
| } | |||
| @@ -144,7 +159,7 @@ public class Available extends Task implements Condition { | |||
| this.project.setProperty(property, value); | |||
| } | |||
| } | |||
| public boolean eval() throws BuildException { | |||
| if (classname == null && file == null && resource == null) { | |||
| throw new BuildException("At least one of (classname|file|resource) is required", location); | |||
| @@ -154,9 +169,6 @@ public class Available extends Task implements Condition { | |||
| if (file == null){ | |||
| throw new BuildException("The type attribute is only valid when specifying the file attribute."); | |||
| } | |||
| if (!type.equalsIgnoreCase("file") && !type.equalsIgnoreCase("dir")){ | |||
| throw new BuildException("Type must be one of either dir or file"); | |||
| } | |||
| } | |||
| if (classpath != null) { | |||
| @@ -168,7 +180,7 @@ public class Available extends Task implements Condition { | |||
| log("Unable to load class " + classname + " to set property " + property, Project.MSG_VERBOSE); | |||
| return false; | |||
| } | |||
| if ((file != null) && !checkFile()) { | |||
| if (type != null) { | |||
| log("Unable to find " + type + " " + file + " to set property " + property, Project.MSG_VERBOSE); | |||
| @@ -177,7 +189,7 @@ public class Available extends Task implements Condition { | |||
| } | |||
| return false; | |||
| } | |||
| if ((resource != null) && !checkResource(resource)) { | |||
| log("Unable to load resource " + resource + " to set property " + property, Project.MSG_VERBOSE); | |||
| return false; | |||
| @@ -197,7 +209,7 @@ public class Available extends Task implements Condition { | |||
| String[] paths = filepath.list(); | |||
| for(int i = 0; i < paths.length; ++i) { | |||
| log("Searching " + paths[i], Project.MSG_DEBUG); | |||
| /* | |||
| /* | |||
| ** filepath can be a list of directory and/or | |||
| ** file names (gen'd via <fileset>) | |||
| ** | |||
| @@ -218,11 +230,11 @@ public class Available extends Task implements Condition { | |||
| if (type == null) { | |||
| log("Found: " + path, Project.MSG_VERBOSE); | |||
| return true; | |||
| } else if (type.equalsIgnoreCase("dir") | |||
| } else if (type.isDir() | |||
| && path.isDirectory()) { | |||
| log("Found directory: " + path, Project.MSG_VERBOSE); | |||
| return true; | |||
| } else if (type.equalsIgnoreCase("file") | |||
| } else if (type.isFile() | |||
| && path.isFile()) { | |||
| log("Found file: " + path, Project.MSG_VERBOSE); | |||
| return true; | |||
| @@ -230,16 +242,16 @@ public class Available extends Task implements Condition { | |||
| // not the requested type | |||
| return false; | |||
| } | |||
| FileUtils fileUtils = FileUtils.newFileUtils(); | |||
| File parent = fileUtils.getParentFile(path); | |||
| // ** full-pathname specified == parent dir of path in list | |||
| if (parent != null && parent.exists() | |||
| if (parent != null && parent.exists() | |||
| && file.equals(parent.getAbsolutePath())) { | |||
| if (type == null) { | |||
| log("Found: " + parent, Project.MSG_VERBOSE); | |||
| return true; | |||
| } else if (type.equalsIgnoreCase("dir")) { | |||
| } else if (type.isDir()) { | |||
| log("Found directory: " + parent, Project.MSG_VERBOSE); | |||
| return true; | |||
| } | |||
| @@ -249,25 +261,25 @@ public class Available extends Task implements Condition { | |||
| // ** simple name specified == path in list + name | |||
| if (path.exists() && path.isDirectory()) { | |||
| if (checkFile(new File(path, file), | |||
| if (checkFile(new File(path, file), | |||
| file + " in " + path)) { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent dir + name | |||
| if (parent != null && parent.exists()) { | |||
| if (checkFile(new File(parent, file), | |||
| if (checkFile(new File(parent, file), | |||
| file + " in " + parent)) { | |||
| return true; | |||
| } | |||
| } | |||
| // ** simple name specified == parent of parent dir + name | |||
| if (parent != null) { | |||
| File grandParent = fileUtils.getParentFile(parent); | |||
| if (grandParent != null && grandParent.exists()) { | |||
| if (checkFile(new File(grandParent, file), | |||
| if (checkFile(new File(grandParent, file), | |||
| file + " in " + grandParent)) { | |||
| return true; | |||
| } | |||
| @@ -280,12 +292,12 @@ public class Available extends Task implements Condition { | |||
| private boolean checkFile(File f, String text) { | |||
| if (type != null) { | |||
| if (type.equalsIgnoreCase("dir")) { | |||
| if (type.isDir()) { | |||
| if( f.isDirectory()) { | |||
| log("Found directory: " + text, Project.MSG_VERBOSE); | |||
| } | |||
| return f.isDirectory(); | |||
| } else if (type.equalsIgnoreCase("file")) { | |||
| } else if (type.isFile()) { | |||
| if( f.isFile()) { | |||
| log("Found file: " + text, Project.MSG_VERBOSE); | |||
| } | |||
| @@ -306,7 +318,7 @@ public class Available extends Task implements Condition { | |||
| if (cL != null) { | |||
| return (cL.getResourceAsStream(resource) != null); | |||
| } else { | |||
| return | |||
| return | |||
| (ClassLoader.getSystemResourceAsStream(resource) != null); | |||
| } | |||
| } | |||
| @@ -333,4 +345,25 @@ public class Available extends Task implements Condition { | |||
| return false; | |||
| } | |||
| } | |||
| public static class FileDir extends EnumeratedAttribute { | |||
| private final static String[] values = {"file", "dir"}; | |||
| public String[] getValues() { | |||
| return values; | |||
| } | |||
| public boolean isDir() { | |||
| return "dir".equalsIgnoreCase(getValue()); | |||
| } | |||
| public boolean isFile() { | |||
| return "file".equalsIgnoreCase(getValue()); | |||
| } | |||
| public String toString() { | |||
| return getValue(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,7 +1,7 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||
| * Copyright (c) 1999 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| @@ -9,7 +9,7 @@ | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| @@ -17,15 +17,15 @@ | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| @@ -63,39 +63,58 @@ import java.util.Enumeration; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.DirectoryScanner; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| import org.apache.tools.ant.util.SourceFileScanner; | |||
| import org.apache.tools.ant.util.MergingMapper; | |||
| import org.apache.tools.tar.TarOutputStream; | |||
| import org.apache.tools.tar.TarConstants; | |||
| import org.apache.tools.tar.TarEntry; | |||
| import org.apache.tools.ant.types.FileSet; | |||
| /** | |||
| * Creates a TAR archive. | |||
| * | |||
| * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public class Tar extends MatchingTask { | |||
| // permissable values for longfile attribute | |||
| /** | |||
| * @deprecated Tar.WARN is deprecated and is replaced with | |||
| * Tar.TarLongFileMode.WARN | |||
| */ | |||
| public final static String WARN = "warn"; | |||
| /** | |||
| * @deprecated Tar.FAIL is deprecated and is replaced with | |||
| * Tar.TarLongFileMode.FAIL | |||
| */ | |||
| public final static String FAIL = "fail"; | |||
| /** | |||
| * @deprecated Tar.TRUNCATE is deprecated and is replaced with | |||
| * Tar.TarLongFileMode.TRUNCATE | |||
| */ | |||
| public final static String TRUNCATE = "truncate"; | |||
| /** | |||
| * @deprecated Tar.GNU is deprecated and is replaced with | |||
| * Tar.TarLongFileMode.GNU | |||
| */ | |||
| public final static String GNU = "gnu"; | |||
| /** | |||
| * @deprecated Tar.OMIT is deprecated and is replaced with | |||
| * Tar.TarLongFileMode.OMIT | |||
| */ | |||
| public final static String OMIT = "omit"; | |||
| private String[] validModes = new String[] {WARN, FAIL, TRUNCATE, GNU, OMIT}; | |||
| File tarFile; | |||
| File baseDir; | |||
| String longFileMode = WARN; | |||
| private TarLongFileMode longFileMode = new TarLongFileMode(); | |||
| Vector filesets = new Vector(); | |||
| Vector fileSetFiles = new Vector(); | |||
| /** | |||
| * Indicates whether the user has been warned about long files already. | |||
| */ | |||
| @@ -106,55 +125,70 @@ public class Tar extends MatchingTask { | |||
| filesets.addElement(fileset); | |||
| return fileset; | |||
| } | |||
| /** | |||
| * This is the name/location of where to create the tar file. | |||
| */ | |||
| public void setTarfile(File tarFile) { | |||
| this.tarFile = tarFile; | |||
| } | |||
| /** | |||
| * This is the base directory to look in for things to tar. | |||
| */ | |||
| public void setBasedir(File baseDir) { | |||
| this.baseDir = baseDir; | |||
| } | |||
| /** | |||
| * Set how to handle long files. | |||
| * | |||
| * Allowable values are | |||
| * truncate - paths are truncated to the maximum length | |||
| * fail - patsh greater than the maximim cause a build exception | |||
| * fail - paths greater than the maximim cause a build exception | |||
| * warn - paths greater than the maximum cause a warning and GNU is used | |||
| * gnu - GNU extensions are used for any paths greater than the maximum. | |||
| * omit - paths greater than the maximum are omitted from the archive | |||
| * @deprecated setLongFile(String) is deprecated and is replaced with | |||
| * setLongFile(Tar.TarLongFileMode) to make Ant's Introspection | |||
| * mechanism do the work and also to encapsulate operations on | |||
| * the mode in its own class. | |||
| */ | |||
| public void setLongfile(String mode) { | |||
| for (int i = 0; i < validModes.length; ++i) { | |||
| if (mode.equalsIgnoreCase(validModes[i])) { | |||
| this.longFileMode = mode; | |||
| return; | |||
| } | |||
| } | |||
| throw new BuildException("The longfile value " + mode + " is not a valid value"); | |||
| log("DEPRECATED - The setLongfile(String) method has been deprecated." | |||
| + " Use setLongfile(Tar.TarLongFileMode) instead."); | |||
| this.longFileMode = new TarLongFileMode(); | |||
| longFileMode.setValue(mode); | |||
| } | |||
| /** | |||
| * Set how to handle long files. | |||
| * | |||
| * Allowable values are | |||
| * truncate - paths are truncated to the maximum length | |||
| * fail - paths greater than the maximim cause a build exception | |||
| * warn - paths greater than the maximum cause a warning and GNU is used | |||
| * gnu - GNU extensions are used for any paths greater than the maximum. | |||
| * omit - paths greater than the maximum are omitted from the archive | |||
| */ | |||
| public void setLongfile(TarLongFileMode mode) { | |||
| this.longFileMode = mode; | |||
| } | |||
| public void execute() throws BuildException { | |||
| if (tarFile == null) { | |||
| throw new BuildException("tarfile attribute must be set!", | |||
| throw new BuildException("tarfile attribute must be set!", | |||
| location); | |||
| } | |||
| if (tarFile.exists() && tarFile.isDirectory()) { | |||
| throw new BuildException("tarfile is a directory!", | |||
| throw new BuildException("tarfile is a directory!", | |||
| location); | |||
| } | |||
| if (tarFile.exists() && !tarFile.canWrite()) { | |||
| throw new BuildException("Can not write to the specified tarfile!", | |||
| throw new BuildException("Can not write to the specified tarfile!", | |||
| location); | |||
| } | |||
| @@ -162,29 +196,29 @@ public class Tar extends MatchingTask { | |||
| if (!baseDir.exists()) { | |||
| throw new BuildException("basedir does not exist!", location); | |||
| } | |||
| // add the main fileset to the list of filesets to process. | |||
| TarFileSet mainFileSet = new TarFileSet(fileset); | |||
| mainFileSet.setDir(baseDir); | |||
| filesets.addElement(mainFileSet); | |||
| } | |||
| if (filesets.size() == 0) { | |||
| throw new BuildException("You must supply either a basdir attribute or some nested filesets.", | |||
| throw new BuildException("You must supply either a basdir attribute or some nested filesets.", | |||
| location); | |||
| } | |||
| // check if tr is out of date with respect to each | |||
| // fileset | |||
| boolean upToDate = true; | |||
| for (Enumeration e = filesets.elements(); e.hasMoreElements();) { | |||
| TarFileSet fs = (TarFileSet)e.nextElement(); | |||
| String[] files = fs.getFiles(project); | |||
| if (!archiveIsUpToDate(files)) { | |||
| upToDate = false; | |||
| } | |||
| for (int i = 0; i < files.length; ++i) { | |||
| if (tarFile.equals(new File(fs.getDir(project), files[i]))) { | |||
| throw new BuildException("A tar file cannot include itself", location); | |||
| @@ -204,18 +238,18 @@ public class Tar extends MatchingTask { | |||
| try { | |||
| tOut = new TarOutputStream(new FileOutputStream(tarFile)); | |||
| tOut.setDebug(true); | |||
| if (longFileMode.equalsIgnoreCase(TRUNCATE)) { | |||
| if (longFileMode.isTruncateMode()) { | |||
| tOut.setLongFileMode(TarOutputStream.LONGFILE_TRUNCATE); | |||
| } | |||
| else if (longFileMode.equalsIgnoreCase(FAIL) || | |||
| longFileMode.equalsIgnoreCase(OMIT)) { | |||
| else if (longFileMode.isFailMode() || | |||
| longFileMode.isOmitMode()) { | |||
| tOut.setLongFileMode(TarOutputStream.LONGFILE_ERROR); | |||
| } | |||
| else { | |||
| // warn or GNU | |||
| tOut.setLongFileMode(TarOutputStream.LONGFILE_GNU); | |||
| } | |||
| longWarningGiven = false; | |||
| for (Enumeration e = filesets.elements(); e.hasMoreElements();) { | |||
| TarFileSet fs = (TarFileSet)e.nextElement(); | |||
| @@ -250,27 +284,27 @@ public class Tar extends MatchingTask { | |||
| if (vPath.length() <= 0) { | |||
| return; | |||
| } | |||
| if (file.isDirectory() && !vPath.endsWith("/")) { | |||
| vPath += "/"; | |||
| } | |||
| try { | |||
| if (vPath.length() >= TarConstants.NAMELEN) { | |||
| if (longFileMode.equalsIgnoreCase(OMIT)) { | |||
| if (longFileMode.isOmitMode()) { | |||
| log("Omitting: "+ vPath, Project.MSG_INFO); | |||
| return; | |||
| } else if (longFileMode.equalsIgnoreCase(WARN)) { | |||
| log("Entry: "+ vPath + " longer than " + | |||
| } else if (longFileMode.isWarnMode()) { | |||
| log("Entry: "+ vPath + " longer than " + | |||
| TarConstants.NAMELEN + " characters.", Project.MSG_WARN); | |||
| if (!longWarningGiven) { | |||
| if (!longWarningGiven) { | |||
| log("Resulting tar file can only be processed successfully" | |||
| + " by GNU compatible tar commands", Project.MSG_WARN); | |||
| longWarningGiven = true; | |||
| } | |||
| } else if (longFileMode.equalsIgnoreCase(FAIL)) { | |||
| } else if (longFileMode.isFailMode()) { | |||
| throw new BuildException( | |||
| "Entry: "+ vPath + " longer than " + | |||
| "Entry: "+ vPath + " longer than " + | |||
| TarConstants.NAMELEN + "characters.", location); | |||
| } | |||
| } | |||
| @@ -280,12 +314,12 @@ public class Tar extends MatchingTask { | |||
| if (!file.isDirectory()) { | |||
| te.setSize(file.length()); | |||
| te.setMode(tarFileSet.getMode()); | |||
| } | |||
| } | |||
| te.setUserName(tarFileSet.getUserName()); | |||
| te.setGroupName(tarFileSet.getGroup()); | |||
| tOut.putNextEntry(te); | |||
| if (!file.isDirectory()) { | |||
| fIn = new FileInputStream(file); | |||
| @@ -296,8 +330,8 @@ public class Tar extends MatchingTask { | |||
| count = fIn.read(buffer, 0, buffer.length); | |||
| } while (count != -1); | |||
| } | |||
| tOut.closeEntry(); | |||
| tOut.closeEntry(); | |||
| } finally { | |||
| if (fIn != null) | |||
| fIn.close(); | |||
| @@ -313,21 +347,21 @@ public class Tar extends MatchingTask { | |||
| public static class TarFileSet extends FileSet { | |||
| private String[] files = null; | |||
| private int mode = 0100644; | |||
| private String userName = ""; | |||
| private String groupName = ""; | |||
| public TarFileSet(FileSet fileset) { | |||
| super(fileset); | |||
| } | |||
| public TarFileSet() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Get a list of files and directories specified in the fileset. | |||
| * @return a list of file and directory names, relative to | |||
| @@ -343,33 +377,79 @@ public class Tar extends MatchingTask { | |||
| System.arraycopy(filesPerSe, 0, files, directories.length, | |||
| filesPerSe.length); | |||
| } | |||
| return files; | |||
| } | |||
| public void setMode(String octalString) { | |||
| this.mode = 0100000 | Integer.parseInt(octalString, 8); | |||
| } | |||
| public int getMode() { | |||
| return mode; | |||
| } | |||
| public void setUserName(String userName) { | |||
| this.userName = userName; | |||
| } | |||
| public String getUserName() { | |||
| return userName; | |||
| } | |||
| public void setGroup(String groupName) { | |||
| this.groupName = groupName; | |||
| } | |||
| public String getGroup() { | |||
| return groupName; | |||
| } | |||
| } | |||
| /** | |||
| * Valid Modes for LongFile attribute to Tar Task | |||
| * | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public static class TarLongFileMode extends EnumeratedAttribute { | |||
| // permissable values for longfile attribute | |||
| public final static String WARN = "warn"; | |||
| public final static String FAIL = "fail"; | |||
| public final static String TRUNCATE = "truncate"; | |||
| public final static String GNU = "gnu"; | |||
| public final static String OMIT = "omit"; | |||
| private final String[] validModes = {WARN, FAIL, TRUNCATE, GNU, OMIT}; | |||
| public TarLongFileMode() { | |||
| super(); | |||
| setValue(WARN); | |||
| } | |||
| public String[] getValues() { | |||
| return validModes; | |||
| } | |||
| public boolean isTruncateMode() { | |||
| return TRUNCATE.equalsIgnoreCase(getValue()); | |||
| } | |||
| public boolean isWarnMode() { | |||
| return WARN.equalsIgnoreCase(getValue()); | |||
| } | |||
| public boolean isGnuMode() { | |||
| return GNU.equalsIgnoreCase(getValue()); | |||
| } | |||
| public boolean isFailMode() { | |||
| return FAIL.equalsIgnoreCase(getValue()); | |||
| } | |||
| public boolean isOmitMode() { | |||
| return OMIT.equalsIgnoreCase(getValue()); | |||
| } | |||
| } | |||
| } | |||
| @@ -58,15 +58,17 @@ import org.apache.tools.ant.Task; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import org.apache.tools.ant.Location; | |||
| import org.apache.tools.ant.types.EnumeratedAttribute; | |||
| import java.util.Vector; | |||
| import java.util.Calendar; | |||
| import java.util.Date; | |||
| import java.util.Locale; | |||
| import java.util.Enumeration; | |||
| import java.util.Calendar; | |||
| import java.util.StringTokenizer; | |||
| import java.util.Hashtable; | |||
| import java.util.Locale; | |||
| import java.util.NoSuchElementException; | |||
| import java.util.StringTokenizer; | |||
| import java.util.TimeZone; | |||
| import java.util.Vector; | |||
| import java.text.SimpleDateFormat; | |||
| /** | |||
| @@ -76,12 +78,13 @@ import java.text.SimpleDateFormat; | |||
| * @author stefano@apache.org | |||
| * @author roxspring@yahoo.com | |||
| * @author conor@cognet.com.au | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| */ | |||
| public class Tstamp extends Task { | |||
| private Vector customFormats = new Vector(); | |||
| private String prefix = ""; | |||
| public void setPrefix(String prefix) { | |||
| this.prefix = prefix; | |||
| if (!this.prefix.endsWith(".")) { | |||
| @@ -119,7 +122,7 @@ public class Tstamp extends Task { | |||
| customFormats.addElement(cts); | |||
| return cts; | |||
| } | |||
| public class CustomFormat | |||
| { | |||
| private TimeZone timeZone; | |||
| @@ -131,22 +134,22 @@ public class Tstamp extends Task { | |||
| private int offset = 0; | |||
| private int field = Calendar.DATE; | |||
| private String prefix=""; | |||
| public CustomFormat(String prefix) | |||
| { | |||
| this.prefix = prefix; | |||
| } | |||
| public void setProperty(String propertyName) | |||
| { | |||
| this.propertyName = prefix + propertyName; | |||
| } | |||
| public void setPattern(String pattern) | |||
| { | |||
| this.pattern = pattern; | |||
| } | |||
| public void setLocale(String locale) | |||
| { | |||
| StringTokenizer st = new StringTokenizer( locale, " \t\n\r\f,"); | |||
| @@ -177,47 +180,35 @@ public class Tstamp extends Task { | |||
| public void setOffset(int offset) { | |||
| this.offset = offset; | |||
| } | |||
| /** | |||
| * @deprecated setUnit(String) is deprecated and is replaced with | |||
| * setUnit(Tstamp.Unit) to make Ant's Introspection | |||
| * mechanism do the work and also to encapsulate operations on | |||
| * the unit in its own class. | |||
| */ | |||
| public void setUnit(String unit) { | |||
| if (unit.equalsIgnoreCase("millisecond")) { | |||
| field = Calendar.MILLISECOND; | |||
| } | |||
| else if (unit.equalsIgnoreCase("second")) { | |||
| field = Calendar.SECOND; | |||
| } | |||
| else if (unit.equalsIgnoreCase("minute")) { | |||
| field = Calendar.MINUTE; | |||
| } | |||
| else if (unit.equalsIgnoreCase("hour")) { | |||
| field = Calendar.HOUR_OF_DAY; | |||
| } | |||
| else if (unit.equalsIgnoreCase("day")) { | |||
| field = Calendar.DATE; | |||
| } | |||
| else if (unit.equalsIgnoreCase("week")) { | |||
| field = Calendar.WEEK_OF_YEAR; | |||
| } | |||
| else if (unit.equalsIgnoreCase("month")) { | |||
| field = Calendar.MONTH; | |||
| } | |||
| else if (unit.equalsIgnoreCase("year")) { | |||
| field = Calendar.YEAR; | |||
| } | |||
| else { | |||
| throw new BuildException(unit + " is not a unit supported by the tstamp task", getLocation()); | |||
| } | |||
| } | |||
| log("DEPRECATED - The setUnit(String) method has been deprecated." | |||
| + " Use setUnit(Tstamp.Unit) instead."); | |||
| Unit u = new Unit(); | |||
| u.setValue(unit); | |||
| field = u.getCalendarField(); | |||
| } | |||
| public void setUnit(Unit unit) { | |||
| field = unit.getCalendarField(); | |||
| } | |||
| public void execute(Project project, Date date, Location location) | |||
| { | |||
| if (propertyName == null) { | |||
| throw new BuildException("property attribute must be provided", location); | |||
| } | |||
| if (pattern == null) { | |||
| throw new BuildException("pattern attribute must be provided", location); | |||
| } | |||
| SimpleDateFormat sdf; | |||
| if (language == null) { | |||
| sdf = new SimpleDateFormat(pattern); | |||
| @@ -240,4 +231,51 @@ public class Tstamp extends Task { | |||
| project.setNewProperty(propertyName, sdf.format(date)); | |||
| } | |||
| } | |||
| public static class Unit extends EnumeratedAttribute { | |||
| private static final String MILLISECOND = "millisecond"; | |||
| private static final String SECOND = "second"; | |||
| private static final String MINUTE = "minute"; | |||
| private static final String HOUR = "hour"; | |||
| private static final String DAY = "day"; | |||
| private static final String WEEK = "week"; | |||
| private static final String MONTH = "month"; | |||
| private static final String YEAR = "year"; | |||
| private final static String[] units = { | |||
| MILLISECOND, | |||
| SECOND, | |||
| MINUTE, | |||
| HOUR, | |||
| DAY, | |||
| WEEK, | |||
| MONTH, | |||
| YEAR | |||
| }; | |||
| private Hashtable calendarFields = new Hashtable(); | |||
| public Unit() { | |||
| calendarFields.put(MILLISECOND, | |||
| new Integer(Calendar.MILLISECOND)); | |||
| calendarFields.put(SECOND, new Integer(Calendar.SECOND)); | |||
| calendarFields.put(MINUTE, new Integer(Calendar.MINUTE)); | |||
| calendarFields.put(HOUR, new Integer(Calendar.HOUR_OF_DAY)); | |||
| calendarFields.put(DAY, new Integer(Calendar.DATE)); | |||
| calendarFields.put(WEEK, new Integer(Calendar.WEEK_OF_YEAR)); | |||
| calendarFields.put(MONTH, new Integer(Calendar.MONTH)); | |||
| calendarFields.put(YEAR, new Integer(Calendar.YEAR)); | |||
| } | |||
| public int getCalendarField() { | |||
| String key = getValue().toLowerCase(); | |||
| Integer i = (Integer) calendarFields.get(key); | |||
| return i.intValue(); | |||
| } | |||
| public String[] getValues() { | |||
| return units; | |||
| } | |||
| } | |||
| } | |||
| @@ -56,96 +56,96 @@ package org.apache.tools.ant.taskdefs; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| /** | |||
| * @author Nico Seessle <nico@seessle.de> | |||
| * @author Nico Seessle <nico@seessle.de> | |||
| */ | |||
| public class AvailableTest extends BuildFileTest { | |||
| public class AvailableTest extends BuildFileTest { | |||
| public AvailableTest(String name) { | |||
| public AvailableTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| } | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/available.xml"); | |||
| } | |||
| // Nothing specified -> Fail | |||
| public void test1() { | |||
| public void test1() { | |||
| expectBuildException("test1", "required argument not specified"); | |||
| } | |||
| // Only property specified -> Fail | |||
| public void test2() { | |||
| public void test2() { | |||
| expectBuildException("test2", "required argument not specified"); | |||
| } | |||
| // Only file specified -> Fail | |||
| public void test3() { | |||
| public void test3() { | |||
| expectBuildException("test3", "required argument not specified"); | |||
| } | |||
| // file doesn't exist -> property 'test' == null | |||
| public void test4() { | |||
| public void test4() { | |||
| executeTarget("test4"); | |||
| assertTrue(project.getProperty("test") == null); | |||
| } | |||
| // file does exist -> property 'test' == 'true' | |||
| public void test5() { | |||
| public void test5() { | |||
| executeTarget("test5"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // resource doesn't exist -> property 'test' == null | |||
| public void test6() { | |||
| public void test6() { | |||
| executeTarget("test6"); | |||
| assertTrue(project.getProperty("test") == null); | |||
| } | |||
| // resource does exist -> property 'test' == 'true' | |||
| public void test7() { | |||
| public void test7() { | |||
| executeTarget("test7"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // class doesn't exist -> property 'test' == null | |||
| public void test8() { | |||
| public void test8() { | |||
| executeTarget("test8"); | |||
| assertTrue(project.getProperty("test") == null); | |||
| } | |||
| // class does exist -> property 'test' == 'true' | |||
| public void test9() { | |||
| public void test9() { | |||
| executeTarget("test9"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // All three specified and all three exist -> true | |||
| public void test10() { | |||
| public void test10() { | |||
| executeTarget("test10"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // All three specified but class missing -> null | |||
| public void test11() { | |||
| public void test11() { | |||
| executeTarget("test11"); | |||
| assertNull(project.getProperty("test")); | |||
| } | |||
| // Specified property-name is "" -> true | |||
| public void test12() { | |||
| public void test12() { | |||
| executeTarget("test12"); | |||
| assertNull(project.getProperty("test")); | |||
| assertEquals("true", project.getProperty("")); | |||
| } | |||
| // Specified file is "" -> invalid files do not exist | |||
| public void test13() { | |||
| public void test13() { | |||
| executeTarget("test13"); | |||
| assertNull(project.getProperty("test")); | |||
| } | |||
| // Specified file is "" actually a directory, so it should pass | |||
| public void test13b() { | |||
| public void test13b() { | |||
| executeTarget("test13b"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| @@ -154,34 +154,39 @@ public class AvailableTest extends BuildFileTest { | |||
| /* | |||
| * returns non null IBM JDK 1.3 Linux | |||
| */ | |||
| // public void test14() { | |||
| // public void test14() { | |||
| // executeTarget("test14"); | |||
| // assertEquals(project.getProperty("test"), null); | |||
| // } | |||
| // Specified class is "" -> can not exist | |||
| public void test15() { | |||
| public void test15() { | |||
| executeTarget("test15"); | |||
| assertNull(project.getProperty("test")); | |||
| } | |||
| // Specified dir is "" -> this is the current directory and should | |||
| // always exist | |||
| public void test16() { | |||
| public void test16() { | |||
| executeTarget("test16"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // Specified dir is "../taskdefs" -> should exist since it's the | |||
| // Specified dir is "../taskdefs" -> should exist since it's the | |||
| // location of the buildfile used... | |||
| public void test17() { | |||
| public void test17() { | |||
| executeTarget("test17"); | |||
| assertEquals("true", project.getProperty("test")); | |||
| } | |||
| // Specified dir is "../this_dir_should_never_exist" -> null | |||
| public void test18() { | |||
| public void test18() { | |||
| executeTarget("test18"); | |||
| assertNull(project.getProperty("test")); | |||
| } | |||
| // Invalid type specified | |||
| public void test19() { | |||
| expectBuildException("test19", "Invalid value for type attribute."); | |||
| } | |||
| } | |||
| @@ -56,37 +56,37 @@ package org.apache.tools.ant.taskdefs; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| /** | |||
| * @author Nico Seessle <nico@seessle.de> | |||
| * @author Nico Seessle <nico@seessle.de> | |||
| */ | |||
| public class TarTest extends BuildFileTest { | |||
| public TarTest(String name) { | |||
| public class TarTest extends BuildFileTest { | |||
| public TarTest(String name) { | |||
| super(name); | |||
| } | |||
| public void setUp() { | |||
| } | |||
| public void setUp() { | |||
| configureProject("src/etc/testcases/taskdefs/tar.xml"); | |||
| } | |||
| public void test1() { | |||
| public void test1() { | |||
| expectBuildException("test1", "required argument not specified"); | |||
| } | |||
| public void test2() { | |||
| public void test2() { | |||
| expectBuildException("test2", "required argument not specified"); | |||
| } | |||
| public void test3() { | |||
| public void test3() { | |||
| expectBuildException("test3", "required argument not specified"); | |||
| } | |||
| public void test4() { | |||
| public void test4() { | |||
| expectBuildException("test4", "tar cannot include itself"); | |||
| } | |||
| public void test5() { | |||
| executeTarget("test5"); | |||
| java.io.File f | |||
| java.io.File f | |||
| = new java.io.File("src/etc/testcases/taskdefs/test5.tar"); | |||
| if (!f.exists()) { | |||
| @@ -94,6 +94,10 @@ public class TarTest extends BuildFileTest { | |||
| } | |||
| } | |||
| public void test6() { | |||
| expectBuildException("test6", "Invalid value specified for longfile attribute."); | |||
| } | |||
| public void tearDown() { | |||
| executeTarget("cleanup"); | |||
| } | |||