mbenson 2005/02/22 10:32:40 Modified: . Tag: ANT_16_BRANCH WHATSNEW src/etc/testcases/taskdefs Tag: ANT_16_BRANCH pathconvert.xml docs/manual/CoreTasks Tag: ANT_16_BRANCH pathconvert.html src/main/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH PathConvert.java src/testcases/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH PathConvertTest.java Log: Merge pathconvert doesn't require targetos|dirsep|pathsep. Revision Changes Path No revision No revision 1.503.2.182 +3 -0 ant/WHATSNEW Index: WHATSNEW =================================================================== RCS file: /home/cvs/ant/WHATSNEW,v retrieving revision 1.503.2.181 retrieving revision 1.503.2.182 diff -u -r1.503.2.181 -r1.503.2.182 --- WHATSNEW 22 Feb 2005 15:30:40 -0000 1.503.2.181 +++ WHATSNEW 22 Feb 2005 18:32:40 -0000 1.503.2.182 @@ -99,6 +99,9 @@ * Recursive token expansion in a filterset can now be disabled by setting its recurse attribute to false. +* Pathconvert no longer requires that one of (targetos|pathsep|dirsep) + be set; platform defaults are used when this is the case. + Fixed bugs: ----------- No revision No revision 1.1.2.2 +4 -0 ant/src/etc/testcases/taskdefs/pathconvert.xml Index: pathconvert.xml =================================================================== RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/pathconvert.xml,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- pathconvert.xml 20 Apr 2004 22:32:28 -0000 1.1.2.1 +++ pathconvert.xml 22 Feb 2005 18:32:40 -0000 1.1.2.2 @@ -18,4 +18,8 @@ </pathconvert> </target> + <target name="testnotargetos"> + <pathconvert property="result" refid="testpath" /> + </target> + </project> No revision No revision 1.12.2.4 +3 -6 ant/docs/manual/CoreTasks/pathconvert.html Index: pathconvert.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/pathconvert.html,v retrieving revision 1.12.2.3 retrieving revision 1.12.2.4 diff -u -r1.12.2.3 -r1.12.2.4 --- pathconvert.html 20 Apr 2004 22:32:29 -0000 1.12.2.3 +++ pathconvert.html 22 Feb 2005 18:32:40 -0000 1.12.2.4 @@ -8,7 +8,7 @@ <body> -<h2><a name="foreach">Pathconvert</a></h2> +<h2><a name="pathconvert">Pathconvert</a></h2> <h3>Description</h3> <p>Converts a nested <code><path></code> or reference to a Path, FileSet, DirSet, or FileList into a path @@ -41,10 +41,7 @@ <code>pathsep</code> and <code>dirsep</code> according to the specified target architecture. </td> - <td valign="top" align="center"> - Yes, unless <code>pathsep</code> and/or - <code>dirsep</code> are specified. - </td> + <td valign="top" align="center">No</td> </tr> <tr> <td valign="top">dirsep</td> @@ -186,7 +183,7 @@ </p> <hr> -<p align="center">Copyright © 2001-2004 The Apache Software Foundation. +<p align="center">Copyright © 2001-2005 The Apache Software Foundation. All rights Reserved.</p> </body> </html> No revision No revision 1.27.2.7 +59 -133 ant/src/main/org/apache/tools/ant/taskdefs/PathConvert.java Index: PathConvert.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/PathConvert.java,v retrieving revision 1.27.2.6 retrieving revision 1.27.2.7 diff -u -r1.27.2.6 -r1.27.2.7 --- PathConvert.java 7 Feb 2005 10:51:34 -0000 1.27.2.6 +++ PathConvert.java 22 Feb 2005 18:32:40 -0000 1.27.2.7 @@ -89,13 +89,12 @@ private Mapper mapper = null; /** - * constructor + * Construct a new instance of the PathConvert task. */ public PathConvert() { onWindows = Os.isFamily("dos"); } - /** * Helper class, holds the nested <map> values. Elements will look like * this: <map from="d:" to="/foo"/> @@ -105,39 +104,40 @@ */ public class MapEntry { - /** Set the "from" attribute of the map entry */ + // Members + private String from = null; + private String to = null; + /** - * the prefix string to search for; required. + * Set the "from" attribute of the map entry. + * @param from the prefix string to search for; required. * Note that this value is case-insensitive when the build is * running on a Windows platform and case-sensitive when running on * a Unix platform. - * @param from the prefix string to search for */ public void setFrom(String from) { this.from = from; } /** - * The replacement text to use when from is matched; required. - * @param to new prefix + * Set the replacement text to use when from is matched; required. + * @param to new prefix. */ public void setTo(String to) { this.to = to; } - /** - * Apply this map entry to a given path element + * Apply this map entry to a given path element. * - * @param elem Path element to process - * @return String Updated path element after mapping + * @param elem Path element to process. + * @return String Updated path element after mapping. */ public String apply(String elem) { if (from == null || to == null) { throw new BuildException("Both 'from' and 'to' must be set " + "in a map entry"); } - // If we're on windows, then do the comparison ignoring case String cmpElem = onWindows ? elem.toLowerCase() : elem; String cmpFrom = onWindows ? from.toLowerCase() : from; @@ -145,96 +145,70 @@ // If the element starts with the configured prefix, then // convert the prefix to the configured 'to' value. - if (cmpElem.startsWith(cmpFrom)) { - int len = from.length(); - - if (len >= elem.length()) { - elem = to; - } else { - elem = to + elem.substring(len); - } - } - - return elem; + return cmpElem.startsWith(cmpFrom) + ? to + elem.substring(from.length()) : elem; } - - // Members - private String from = null; - private String to = null; } - /** - * an enumeration of supported targets: - * windows", "unix", "netware", and "os/2". + * An enumeration of supported targets: + * "windows", "unix", "netware", and "os/2". */ public static class TargetOs extends EnumeratedAttribute { /** - * @return the list of values for this enumerated attribute + * @return the list of values for this enumerated attribute. */ public String[] getValues() { return new String[]{"windows", "unix", "netware", "os/2", "tandem"}; } } - /** - * Create a nested PATH element - * @return a Path to be used by ant reflection + * Create a nested PATH element. + * @return a Path to be used by Ant reflection. */ public Path createPath() { - if (isReference()) { throw noChildrenAllowed(); } - if (path == null) { path = new Path(getProject()); } return path.createPath(); } - /** - * Create a nested MAP element - * @return a Map to configure + * Create a nested MAP element. + * @return a Map to configure. */ public MapEntry createMap() { - MapEntry entry = new MapEntry(); - prefixMap.addElement(entry); return entry; } - /** * Set targetos to a platform to one of - * "windows", "unix", "netware", or "os/2". - * - * Required unless unless pathsep and/or dirsep are specified. - * - * @deprecated use the method taking a TargetOs argument instead + * "windows", "unix", "netware", or "os/2"; + * current platform settings are used by default. + * @deprecated use the method taking a TargetOs argument instead. * @see #setTargetos(PathConvert.TargetOs) */ public void setTargetos(String target) { TargetOs to = new TargetOs(); - to.setValue(target); setTargetos(to); } - /** * Set targetos to a platform to one of - * "windows", "unix", "netware", or "os/2"; required unless - * unless pathsep and/or dirsep are specified. + * "windows", "unix", "netware", or "os/2"; + * current platform settings are used by default. * @param target the target os * * @since Ant 1.5 */ public void setTargetos(TargetOs target) { - targetOS = target.getValue(); // Currently, we deal with only two path formats: Unix and Windows @@ -248,10 +222,9 @@ } /** - * Set setonempty - * - * If false, don't set the new property if the result is the empty string. - * @param setonempty true or false + * Set whether the specified property will be set if the result + * is the empty string. + * @param setonempty true or false. * * @since Ant 1.5 */ @@ -260,33 +233,28 @@ } /** - * The property into which the converted path will be placed. - * @param p the property name + * Set the name of the property into which the converted path will be placed. + * @param p the property name. */ public void setProperty(String p) { property = p; } - /** - * Adds a reference to a Path, FileSet, DirSet, or FileList defined - * elsewhere. - * @param r the reference to a path, fileset, dirset or filelist + * Add a reference to a Path, FileSet, DirSet, or FileList defined elsewhere. + * @param r the reference to a path, fileset, dirset or filelist. */ public void setRefid(Reference r) { if (path != null) { throw noChildrenAllowed(); } - refid = r; } - /** - * Set the default path separator string; - * defaults to current JVM - * [EMAIL PROTECTED] java.io.File#pathSeparator File.pathSeparator} - * @param sep path separator string + * Set the default path separator string; defaults to current JVM + * [EMAIL PROTECTED] java.io.File#pathSeparator File.pathSeparator}. + * @param sep path separator string. */ public void setPathSep(String sep) { pathSep = sep; @@ -295,25 +263,24 @@ /** * Set the default directory separator string; - * defaults to current JVM [EMAIL PROTECTED] java.io.File#separator File.separator} - * @param sep directory separator string + * defaults to current JVM [EMAIL PROTECTED] java.io.File#separator File.separator}. + * @param sep directory separator string. */ public void setDirSep(String sep) { dirSep = sep; } - /** - * Has the refid attribute of this element been set? - * @return true if refid is valid + * Learn whether the refid attribute of this element been set. + * @return true if refid is valid. */ public boolean isReference() { return refid != null; } - - /** Do the execution. - * @throws BuildException if something is invalid + /** + * Do the execution. + * @throws BuildException if something is invalid. */ public void execute() throws BuildException { Path savedPath = path; @@ -324,31 +291,21 @@ // If we are a reference, create a Path from the reference if (isReference()) { path = new Path(getProject()).createPath(); - Object obj = refid.getReferencedObject(getProject()); if (obj instanceof Path) { path.setRefid(refid); } else if (obj instanceof FileSet) { - FileSet fs = (FileSet) obj; - - path.addFileset(fs); + path.addFileset((FileSet) obj); } else if (obj instanceof DirSet) { - DirSet ds = (DirSet) obj; - - path.addDirset(ds); + path.addDirset((DirSet) obj); } else if (obj instanceof FileList) { - FileList fl = (FileList) obj; - - path.addFilelist(fl); - + path.addFilelist((FileList) obj); } else { throw new BuildException("'refid' does not refer to a " - + "path, fileset, dirset, or " - + "filelist."); + + "path, fileset, dirset, or filelist."); } } - validateSetup(); // validate our setup // Currently, we deal with only two path formats: Unix and Windows @@ -377,11 +334,8 @@ } elems = (String[]) ret.toArray(new String[] {}); } - for (int i = 0; i < elems.length; i++) { - String elem = elems[i]; - - elem = mapElement(elem); // Apply the path prefix map + String elem = mapElement(elems[i]); // Apply the path prefix map // Now convert the path and file separator characters from the // current os to the target os. @@ -389,35 +343,21 @@ if (i != 0) { rslt.append(pathSep); } - StringTokenizer stDirectory = new StringTokenizer(elem, fromDirSep, true); - String token = null; while (stDirectory.hasMoreTokens()) { - token = stDirectory.nextToken(); - - if (fromDirSep.equals(token)) { - rslt.append(dirSep); - } else { - rslt.append(token); - } + String token = stDirectory.nextToken(); + rslt.append(fromDirSep.equals(token) ? dirSep : token); } } - // Place the result into the specified property, // unless setonempty == false - String value = rslt.toString(); - if (setonempty) { + if (setonempty || rslt.length() > 0) { + String value = rslt.toString(); log("Set property " + property + " = " + value, Project.MSG_VERBOSE); getProject().setNewProperty(property, value); - } else { - if (rslt.length() > 0) { - log("Set property " + property + " = " + value, - Project.MSG_VERBOSE); - getProject().setNewProperty(property, value); - } } } finally { path = savedPath; @@ -426,14 +366,13 @@ } } - /** * Apply the configured map to a path element. The map is used to convert * between Windows drive letters and Unix paths. If no map is configured, * then the input string is returned unchanged. * - * @param elem The path element to apply the map to - * @return String Updated element + * @param elem The path element to apply the map to. + * @return String Updated element. */ private String mapElement(String elem) { @@ -457,14 +396,13 @@ } } } - return elem; } /** * Add a mapper to convert the file names. * - * @param mapper a <code>Mapper</code> value + * @param mapper a <code>Mapper</code> value. */ public void addMapper(Mapper mapper) { if (this.mapper != null) { @@ -475,8 +413,8 @@ } /** - * A nested filenamemapper - * @param fileNameMapper the mapper to add + * Add a nested filenamemapper. + * @param fileNameMapper the mapper to add. * @since Ant 1.6.3 */ public void add(FileNameMapper fileNameMapper) { @@ -489,25 +427,16 @@ /** * Validate that all our parameters have been properly initialized. * - * @throws BuildException if something is not setup properly + * @throws BuildException if something is not set up properly. */ private void validateSetup() throws BuildException { if (path == null) { throw new BuildException("You must specify a path to convert"); } - if (property == null) { throw new BuildException("You must specify a property"); } - - // Must either have a target OS or both a dirSep and pathSep - - if (targetOS == null && pathSep == null && dirSep == null) { - throw new BuildException("You must specify at least one of " - + "targetOS, dirSep, or pathSep"); - } - // Determine the separator strings. The dirsep and pathsep attributes // override the targetOS settings. String dsep = File.separator; @@ -517,25 +446,22 @@ psep = targetWindows ? ";" : ":"; dsep = targetWindows ? "\\" : "/"; } - if (pathSep != null) { // override with pathsep= psep = pathSep; } - if (dirSep != null) { // override with dirsep= dsep = dirSep; } - pathSep = psep; dirSep = dsep; } - /** * Creates an exception that indicates that this XML element must not have * child elements if the refid attribute is set. + * @return BuildException. */ private BuildException noChildrenAllowed() { return new BuildException("You must not specify nested <path> " No revision No revision 1.1.2.2 +5 -1 ant/src/testcases/org/apache/tools/ant/taskdefs/PathConvertTest.java Index: PathConvertTest.java =================================================================== RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/PathConvertTest.java,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -r1.1.2.1 -r1.1.2.2 --- PathConvertTest.java 20 Apr 2004 22:32:28 -0000 1.1.2.1 +++ PathConvertTest.java 22 Feb 2005 18:32:40 -0000 1.1.2.2 @@ -1,5 +1,5 @@ /* - * Copyright 2004 The Apache Software Foundation. + * Copyright 2004-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,6 +43,10 @@ test("testmapper"); } + public void testNoTargetOs() { + executeTarget("testnotargetos"); + } + private void test(String target) { executeTarget(target); assertPropertyEquals("result", "test#" + BUILD_FILENAME);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]