ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bode...@apache.org
Subject cvs commit: jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/taskdefs Input.java
Date Thu, 18 Apr 2002 12:10:15 GMT
bodewig     02/04/18 05:10:15

  Modified:    proposal/sandbox/input/src/main/org/apache/tools/ant
                        Main.java Project.java
               proposal/sandbox/input/src/main/org/apache/tools/ant/input
                        DefaultInputHandler.java InputHandler.java
                        InputRequest.java MultipleChoiceInputRequest.java
                        PropertyFileInputHandler.java
               proposal/sandbox/input/src/main/org/apache/tools/ant/taskdefs
                        Input.java
  Log:
  Cleanup
  
  Revision  Changes    Path
  1.2       +167 -122  jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/Main.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Main.java	25 Feb 2002 16:10:15 -0000	1.1
  +++ Main.java	18 Apr 2002 12:10:14 -0000	1.2
  @@ -82,7 +82,7 @@
   public class Main {
   
       /** The default build file name. */
  -    public final static String DEFAULT_BUILD_FILENAME = "build.xml";
  +    public static final String DEFAULT_BUILD_FILENAME = "build.xml";
   
       /** Our current message output status. Follows Project.MSG_XXX. */
       private int msgOutputLevel = Project.MSG_INFO;
  @@ -91,10 +91,10 @@
       private File buildFile; /* null */
   
       /** Stream to use for logging. */
  -    private PrintStream out = System.out;
  +    private static PrintStream out = System.out;
   
       /** Stream that we are using for logging error messages. */
  -    private PrintStream err = System.err;
  +    private static PrintStream err = System.err;
   
       /** The build targets. */
       private Vector targets = new Vector(5);
  @@ -104,13 +104,13 @@
   
       /** Names of classes to add as listeners to project. */
       private Vector listeners = new Vector(5);
  -    
  +
       /** File names of property files to load on startup. */
       private Vector propertyFiles = new Vector(5);
  -    
  +
       /**
  -     * The Ant logger class. There may be only one logger. It will have 
  -     * the right to use the 'out' PrintStream. The class must implements the 
  +     * The Ant logger class. There may be only one logger. It will have
  +     * the right to use the 'out' PrintStream. The class must implements the
        * BuildLogger interface.
        */
       private String loggerClassname = null;
  @@ -135,15 +135,21 @@
       private boolean readyToRun = false;
   
       /**
  -     * Whether or not we should only parse and display the project help 
  +     * Whether or not we should only parse and display the project help
        * information.
        */
       private boolean projectHelp = false;
   
       /**
  -     * Prints the message of the Throwable if it (the message) is not 
  +     * Is a logfile being used?  This is used to
  +     * check if the output streams must be closed.
  +     */
  +    private static boolean isLogFileUsed = false;
  +
  +    /**
  +     * Prints the message of the Throwable if it (the message) is not
        * <code>null</code>.
  -     * 
  +     *
        * @param t Throwable to print the message of.
        *          Must not be <code>null</code>.
        */
  @@ -158,12 +164,12 @@
        * Creates a new instance of this class using the
        * arguments specified, gives it any extra user properties which have been
        * specified, and then runs the build using the classloader provided.
  -     * 
  +     *
        * @param args Command line arguments. Must not be <code>null</code>.
  -     * @param additionalUserProperties Any extra properties to use in this 
  -     *        build. May be <code>null</code>, which is the equivalent to 
  +     * @param additionalUserProperties Any extra properties to use in this
  +     *        build. May be <code>null</code>, which is the equivalent to
        *        passing in an empty set of properties.
  -     * @param coreLoader Classloader used for core classes. May be 
  +     * @param coreLoader Classloader used for core classes. May be
        *        <code>null</code> in which case the system classloader is used.
        */
       public static void start(String[] args, Properties additionalUserProperties,
  @@ -172,19 +178,20 @@
   
           try {
               m = new Main(args);
  -        } catch(Throwable exc) {
  +        } catch (Throwable exc) {
               printMessage(exc);
               System.exit(1);
           }
   
           if (additionalUserProperties != null) {
  -            for (Enumeration e = additionalUserProperties.keys(); e.hasMoreElements(); ) {
  +            for (Enumeration e = additionalUserProperties.keys();
  +                    e.hasMoreElements();) {
                   String key = (String) e.nextElement();
                   String property = additionalUserProperties.getProperty(key);
                   m.definedProps.put(key, property);
               }
           }
  -        
  +
           try {
               m.runBuild(coreLoader);
               System.exit(0);
  @@ -193,13 +200,30 @@
                   printMessage(be);
               }
               System.exit(1);
  -        } catch(Throwable exc) {
  +        } catch (Throwable exc) {
               exc.printStackTrace();
               printMessage(exc);
               System.exit(1);
  +        } finally {
  +            if (isLogFileUsed) {
  +                if (out != null) {
  +                    try {
  +                        out.close();
  +                    } catch (final Exception e) {
  +                        //ignore
  +                    }
  +                }
  +                if (err != null) {
  +                    try {
  +                        err.close();
  +                    } catch (final Exception e) {
  +                        //ignore
  +                    }
  +                }
  +            }
           }
       }
  -                                        
  +
       /**
        * Command line entry point. This method kicks off the building
        * of a project object and executes a build using either a given
  @@ -216,11 +240,11 @@
       // BuildException is thrown. What's the rationale for when to do
       // what?
       /**
  -     * Sole constructor, which parses and deals with command line 
  +     * Sole constructor, which parses and deals with command line
        * arguments.
  -     * 
  +     *
        * @param args Command line arguments. Must not be <code>null</code>.
  -     * 
  +     *
        * @exception BuildException if the specified build file doesn't exist
        *                           or is a directory.
        */
  @@ -249,15 +273,17 @@
                   msgOutputLevel = Project.MSG_DEBUG;
               } else if (arg.equals("-logfile") || arg.equals("-l")) {
                   try {
  -                    File logFile = new File(args[i+1]);
  +                    File logFile = new File(args[i + 1]);
                       i++;
                       out = new PrintStream(new FileOutputStream(logFile));
                       err = out;
                       System.setOut(out);
                       System.setErr(out);
  +                    isLogFileUsed = true;
                   } catch (IOException ioe) {
  -                    String msg = "Cannot write on the specified log file. " +
  -                        "Make sure the path exists and you have write permissions.";
  +                    String msg = "Cannot write on the specified log file. "
  +                        + "Make sure the path exists and you have write "
  +                        + "permissions.";
                       System.out.println(msg);
                       return;
                   } catch (ArrayIndexOutOfBoundsException aioobe) {
  @@ -266,9 +292,10 @@
                       System.out.println(msg);
                       return;
                   }
  -            } else if (arg.equals("-buildfile") || arg.equals("-file") || arg.equals("-f")) {
  +            } else if (arg.equals("-buildfile") || arg.equals("-file")
  +                       || arg.equals("-f")) {
                   try {
  -                    buildFile = new File(args[i+1]);
  +                    buildFile = new File(args[i + 1]);
                       i++;
                   } catch (ArrayIndexOutOfBoundsException aioobe) {
                       String msg = "You must specify a buildfile when " +
  @@ -278,7 +305,7 @@
                   }
               } else if (arg.equals("-listener")) {
                   try {
  -                    listeners.addElement(args[i+1]);
  +                    listeners.addElement(args[i + 1]);
                       i++;
                   } catch (ArrayIndexOutOfBoundsException aioobe) {
                       String msg = "You must specify a classname when " +
  @@ -303,35 +330,35 @@
                   String value = null;
                   int posEq = name.indexOf("=");
                   if (posEq > 0) {
  -                    value = name.substring(posEq+1);
  +                    value = name.substring(posEq + 1);
                       name = name.substring(0, posEq);
  -                } else if (i < args.length-1) {
  +                } else if (i < args.length - 1) {
                       value = args[++i];
                          }
   
                   definedProps.put(name, value);
               } else if (arg.equals("-logger")) {
                   if (loggerClassname != null) {
  -                    System.out.println("Only one logger class may be specified.");
  +                    System.out.println("Only one logger class may "
  +                        + " be specified.");
                       return;
                   }
                   try {
                       loggerClassname = args[++i];
  -                } 
  -                catch (ArrayIndexOutOfBoundsException aioobe) {
  +                } catch (ArrayIndexOutOfBoundsException aioobe) {
                       System.out.println("You must specify a classname when " +
                                          "using the -logger argument");
                       return;
                   }
               } else if (arg.equals("-inputhandler")) {
                   if (inputHandlerClassname != null) {
  -                    System.out.println("Only one input handler class may be specified.");
  +                    System.out.println("Only one input handler class may " +
  +                                       "be specified.");
                       return;
                   }
                   try {
                       inputHandlerClassname = args[++i];
  -                } 
  -                catch (ArrayIndexOutOfBoundsException aioobe) {
  +                } catch (ArrayIndexOutOfBoundsException aioobe) {
                       System.out.println("You must specify a classname when " +
                                          "using the -inputhandler argument");
                       return;
  @@ -343,14 +370,14 @@
                   projectHelp = true;
               } else if (arg.equals("-find")) {
                   // eat up next arg if present, default to build.xml
  -                if (i < args.length-1) {
  +                if (i < args.length - 1) {
                       searchForThis = args[++i];
                   } else {
                       searchForThis = DEFAULT_BUILD_FILENAME;
                   }
               } else if (arg.startsWith("-propertyfile")) {
                   try {
  -                    propertyFiles.addElement(args[i+1]);
  +                    propertyFiles.addElement(args[i + 1]);
                       i++;
                   } catch (ArrayIndexOutOfBoundsException aioobe) {
                       String msg = "You must specify a property filename when " +
  @@ -369,12 +396,12 @@
                   targets.addElement(arg);
               }
           }
  -        
  +
           // if buildFile was not specified on the command line,
           if (buildFile == null) {
               // but -find then search for it
               if (searchForThis != null) {
  -                buildFile = findBuildFile(System.getProperty("user.dir"), 
  +                buildFile = findBuildFile(System.getProperty("user.dir"),
                                             searchForThis);
               } else {
                   buildFile = new File(DEFAULT_BUILD_FILENAME);
  @@ -396,17 +423,17 @@
           }
   
           // Load the property files specified by -propertyfile
  -        for (int propertyFileIndex=0;
  +        for (int propertyFileIndex = 0;
                propertyFileIndex < propertyFiles.size();
                propertyFileIndex++) {
  -            String filename = (String) propertyFiles.elementAt(propertyFileIndex);
  +            String filename
  +                = (String) propertyFiles.elementAt(propertyFileIndex);
               Properties props = new Properties();
               FileInputStream fis = null;
               try {
                   fis = new FileInputStream(filename);
                   props.load(fis);
  -            }
  -            catch (IOException e) {
  +            } catch (IOException e) {
                   System.out.println("Could not load property file "
                      + filename + ": " + e.getMessage());
               } finally {
  @@ -417,7 +444,7 @@
                   }
                 }
               }
  -            
  +
               // ensure that -D properties take precedence
               Enumeration propertyNames = props.propertyNames();
               while (propertyNames.hasMoreElements()) {
  @@ -445,7 +472,7 @@
           filename = file.getParent();
   
           if (filename != null && msgOutputLevel >= Project.MSG_VERBOSE) {
  -            System.out.println("Searching in "+filename);
  +            System.out.println("Searching in " + filename);
           }
   
           return (filename == null) ? null : new File(filename);
  @@ -463,34 +490,35 @@
        *               Must not be <code>null</code>.
        * @param suffix  Suffix filename to look for in parents.
        *                Must not be <code>null</code>.
  -     * 
  +     *
        * @return A handle to the build file if one is found
        *
        * @exception BuildException if no build file is found
        */
  -    private File findBuildFile(String start, String suffix) throws BuildException {
  +    private File findBuildFile(String start, String suffix)
  +         throws BuildException {
           if (msgOutputLevel >= Project.MSG_INFO) {
               System.out.println("Searching for " + suffix + " ...");
           }
   
           File parent = new File(new File(start).getAbsolutePath());
           File file = new File(parent, suffix);
  -        
  +
           // check if the target file exists in the current directory
           while (!file.exists()) {
               // change to parent directory
               parent = getParentFile(parent);
  -            
  +
               // if parent is null, then we are at the root of the fs,
               // complain that we can't find the build file.
               if (parent == null) {
                   throw new BuildException("Could not locate a build file!");
               }
  -            
  +
               // refresh our file handle
               file = new File(parent, suffix);
           }
  -        
  +
           return file;
       }
   
  @@ -498,11 +526,11 @@
        * Executes the build. If the constructor for this instance failed
        * (e.g. returned after issuing a warning), this method returns
        * immediately.
  -     * 
  +     *
        * @param coreLoader The classloader to use to find core classes.
        *                   May be <code>null</code>, in which case the
        *                   system classloader is used.
  -     * 
  +     *
        * @exception BuildException if the build fails
        */
       private void runBuild(ClassLoader coreLoader) throws BuildException {
  @@ -532,11 +560,11 @@
               // use a system manager that prevents from System.exit()
               // only in JDK > 1.1
               SecurityManager oldsm = null;
  -            if ( !Project.JAVA_1_0.equals(Project.getJavaVersion()) &&
  -                !Project.JAVA_1_1.equals(Project.getJavaVersion()) ){
  +            if (!Project.JAVA_1_0.equals(Project.getJavaVersion()) &&
  +                !Project.JAVA_1_1.equals(Project.getJavaVersion())){
                   oldsm = System.getSecurityManager();
   
  -                //SecurityManager can not be installed here for backwards 
  +                //SecurityManager can not be installed here for backwards
                   //compatability reasons (PD). Needs to be loaded prior to
                   //ant class if we are going to implement it.
                   //System.setSecurityManager(new NoExitSecurityManager());
  @@ -554,17 +582,19 @@
                   // set user-define properties
                   Enumeration e = definedProps.keys();
                   while (e.hasMoreElements()) {
  -                    String arg = (String)e.nextElement();
  -                    String value = (String)definedProps.get(arg);
  +                    String arg = (String) e.nextElement();
  +                    String value = (String) definedProps.get(arg);
                       project.setUserProperty(arg, value);
                   }
  -                
  -                project.setUserProperty("ant.file" , buildFile.getAbsolutePath() );
  -                
  +
  +                project.setUserProperty("ant.file",
  +                    buildFile.getAbsolutePath());
  +
                   // first use the ProjectHelper to create the project object
                   // from the given build file.
  -                String noParserMessage = 
  -                    "No JAXP compliant XML parser found. Please visit http://xml.apache.org for a suitable parser";
  +                String noParserMessage = "No JAXP compliant XML parser found. "
  +                    + "Please visit http://xml.apache.org "
  +                    + "for a suitable parser";
                   try {
                       Class.forName("javax.xml.parsers.SAXParserFactory");
                       ProjectHelper.configureProject(project, buildFile);
  @@ -578,18 +608,17 @@
   
                   if (projectHelp) {
                       printDescription(project);
  -                    printTargets(project, msgOutputLevel > Project.MSG_INFO );
  +                    printTargets(project, msgOutputLevel > Project.MSG_INFO);
                       return;
                   }
  -                
  +
                   // make sure that we have a target to execute
                   if (targets.size() == 0) {
                       targets.addElement(project.getDefaultTarget());
                   }
  -                
  +
                   project.executeTargets(targets);
  -            }
  -            finally {
  +            } finally {
                   // put back the original security manager
                   //The following will never eval to true. (PD)
                   if (oldsm != null){
  @@ -599,16 +628,13 @@
                   System.setOut(out);
                   System.setErr(err);
               }
  -        }
  -        catch(RuntimeException exc) {
  +        } catch (RuntimeException exc) {
               error = exc;
               throw exc;
  -        }
  -        catch(Error err) {
  +        } catch (Error err) {
               error = err;
               throw err;
  -        }
  -        finally {
  +        } finally {
               if (!projectHelp) {
                   project.fireBuildFinished(error);
               }
  @@ -618,7 +644,7 @@
       /**
        * Adds the listeners specified in the command line arguments,
        * along with the default listener, to the specified project.
  -     * 
  +     *
        * @param project The project to add listeners to.
        *                Must not be <code>null</code>.
        */
  @@ -633,9 +659,9 @@
                   BuildListener listener =
                       (BuildListener) Class.forName(className).newInstance();
                   project.addBuildListener(listener);
  -            }
  -            catch(Throwable exc) {
  -                throw new BuildException("Unable to instantiate listener " + className, exc);
  +            } catch (Throwable exc) {
  +                throw new BuildException("Unable to instantiate listener "
  +                    + className, exc);
               }
           }
       }
  @@ -654,48 +680,51 @@
               handler = new DefaultInputHandler();
           } else {
               try {
  -                handler = (InputHandler)(Class.forName(inputHandlerClassname).newInstance());
  -            }
  -            catch (ClassCastException e) {
  +                handler = (InputHandler)
  +                    (Class.forName(inputHandlerClassname).newInstance());
  +            } catch (ClassCastException e) {
                   String msg = "The specified input handler class " 
                       + inputHandlerClassname 
                       + " does not implement the InputHandler interface";
                   throw new BuildException(msg);
               }
               catch (Exception e) {
  -                String msg = "Unable to instantiate specified input handler class " 
  -                    + inputHandlerClassname + " : " + e.getClass().getName();
  +                String msg = "Unable to instantiate specified input handler "
  +                    + "class " + inputHandlerClassname + " : " 
  +                    + e.getClass().getName();
                   throw new BuildException(msg);
               }
           }
           project.setInputHandler(handler);
       }
   
  -    // XXX: (Jon Skeet) Any reason for writing a message and then using a bare 
  +    // XXX: (Jon Skeet) Any reason for writing a message and then using a bare
       // RuntimeException rather than just using a BuildException here? Is it
  -    // in case the message could end up being written to no loggers (as the loggers
  -    // could have failed to be created due to this failure)?
  +    // in case the message could end up being written to no loggers (as the
  +    // loggers could have failed to be created due to this failure)?
       /**
  -     *  Creates the default build logger for sending build events to the ant log.
  +     * Creates the default build logger for sending build events to the ant
  +     * log.
  +     *
  +     * @return the logger instance for this build.
        */
       private BuildLogger createLogger() {
           BuildLogger logger = null;
           if (loggerClassname != null) {
               try {
  -                logger = (BuildLogger)(Class.forName(loggerClassname).newInstance());
  -            }
  -            catch (ClassCastException e) {
  -                System.err.println("The specified logger class " + loggerClassname +
  -                                         " does not implement the BuildLogger interface");
  +                logger = (BuildLogger) (Class.forName(loggerClassname).newInstance());
  +            } catch (ClassCastException e) {
  +                System.err.println("The specified logger class "
  +                    + loggerClassname
  +                    + " does not implement the BuildLogger interface");
                   throw new RuntimeException();
  -            }
  -            catch (Exception e) {
  -                System.err.println("Unable to instantiate specified logger class " +
  -                                           loggerClassname + " : " + e.getClass().getName());
  +            } catch (Exception e) {
  +                System.err.println("Unable to instantiate specified logger "
  +                    + "class " + loggerClassname + " : " 
  +                    + e.getClass().getName());
                   throw new RuntimeException();
               }
  -        }
  -        else {
  +        } else {
               logger = new DefaultLogger();
           }
   
  @@ -736,7 +765,7 @@
   
       /**
        * Prints the Ant version information to <code>System.out</code>.
  -     * 
  +     *
        * @exception BuildException if the version information is unavailable
        */
       private static void printVersion() throws BuildException {
  @@ -752,10 +781,10 @@
        * Returns the Ant version information, if available. Once the information
        * has been loaded once, it's cached and returned from the cache on future
        * calls.
  -     * 
  -     * @return the Ant version information as a String 
  +     *
  +     * @return the Ant version information as a String
        *         (always non-<code>null</code>)
  -     * 
  +     *
        * @exception BuildException if the version information is unavailable
        */
       public static synchronized String getAntVersion() throws BuildException {
  @@ -766,7 +795,7 @@
                       Main.class.getResourceAsStream("/org/apache/tools/ant/version.txt");
                   props.load(in);
                   in.close();
  -                
  +
                   String lSep = System.getProperty("line.separator");
                   StringBuffer msg = new StringBuffer();
                   msg.append("Apache Ant version ");
  @@ -785,9 +814,9 @@
       }
   
        /**
  -      * Prints the description of a project (if there is one) to 
  +      * Prints the description of a project (if there is one) to
         * <code>System.out</code>.
  -      * 
  +      *
         * @param project The project to display a description of.
         *                Must not be <code>null</code>.
         */
  @@ -798,9 +827,9 @@
       }
   
       /**
  -     * Prints a list of all targets in the specified project to 
  +     * Prints a list of all targets in the specified project to
        * <code>System.out</code>, optionally including subtargets.
  -     * 
  +     *
        * @param project The project to display a description of.
        *                Must not be <code>null</code>.
        * @param printSubTargets Whether or not subtarget names should also be
  @@ -820,7 +849,7 @@
           Vector subNames = new Vector();
   
           while (ptargets.hasMoreElements()) {
  -            currentTarget = (Target)ptargets.nextElement();
  +            currentTarget = (Target) ptargets.nextElement();
               targetName = currentTarget.getName();
               targetDescription = currentTarget.getDescription();
               // maintain a sorted list of targets
  @@ -838,31 +867,32 @@
           }
   
           printTargets(topNames, topDescriptions, "Main targets:", maxLength);
  -        
  -        if( printSubTargets ) {
  +
  +        if (printSubTargets) {
               printTargets(subNames, null, "Subtargets:", 0);
           }
   
           String defaultTarget = project.getDefaultTarget();
  -        if (defaultTarget != null && !"".equals(defaultTarget)) { // shouldn't need to check but...
  -            System.out.println( "Default target: " + defaultTarget );
  +        if (defaultTarget != null && !"".equals(defaultTarget)) {
  +            // shouldn't need to check but...
  +            System.out.println("Default target: " + defaultTarget);
           }
       }
   
       /**
        * Searches for the correct place to insert a name into a list so as
        * to keep the list sorted alphabetically.
  -     * 
  +     *
        * @param names The current list of names. Must not be <code>null</code>.
        * @param name  The name to find a place for.
        *              Must not be <code>null</code>.
  -     * 
  +     *
        * @return the correct place in the list for the given name
        */
       private static int findTargetPosition(Vector names, String name) {
           int res = names.size();
  -        for (int i=0; i<names.size() && res == names.size(); i++) {
  -            if (name.compareTo((String)names.elementAt(i)) < 0) {
  +        for (int i = 0; i < names.size() && res == names.size(); i++) {
  +            if (name.compareTo((String) names.elementAt(i)) < 0) {
                   res = i;
               }
           }
  @@ -871,23 +901,38 @@
   
       /**
        * Writes a formatted list of target names to <code>System.out</code>
  -     * with an optional description
  +     * with an optional description.
  +     *
  +     * @param names The names to be printed.
  +     *              Must not be <code>null</code>.
  +     * @param descriptions The associated target descriptions.
  +     *                     May be <code>null</code>, in which case
  +     *                     no descriptions are displayed.
  +     *                     If non-<code>null</code>, this should have
  +     *                     as many elements as <code>names</code>.
  +     * @param heading The heading to display.
  +     *                Should not be <code>null</code>.
  +     * @param maxlen The maximum length of the names of the targets.
  +     *               If descriptions are given, they are padded to this
  +     *               position so they line up (so long as the names really
  +     *               <i>are</i> shorter than this).
        */
  -    private static void printTargets(Vector names, Vector descriptions, String heading, int maxlen) {
  +    private static void printTargets(Vector names, Vector descriptions,
  +                                     String heading, int maxlen) {
           // now, start printing the targets and their descriptions
           String lSep = System.getProperty("line.separator");
           // got a bit annoyed that I couldn't find a pad function
           String spaces = "    ";
  -        while (spaces.length()<maxlen) {
  +        while (spaces.length() < maxlen) {
               spaces += spaces;
           }
           StringBuffer msg = new StringBuffer();
           msg.append(heading + lSep + lSep);
  -        for (int i=0; i<names.size(); i++) {
  +        for (int i = 0; i < names.size(); i++) {
               msg.append(" ");
               msg.append(names.elementAt(i));
               if (descriptions != null) {
  -                msg.append(spaces.substring(0, maxlen - ((String)names.elementAt(i)).length() + 2));
  +                msg.append(spaces.substring(0, maxlen - ((String) names.elementAt(i)).length() + 2));
                   msg.append(descriptions.elementAt(i));
               }
               msg.append(lSep);
  
  
  
  1.2       +173 -129  jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/Project.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Project.java	25 Feb 2002 16:10:15 -0000	1.1
  +++ Project.java	18 Apr 2002 12:10:14 -0000	1.2
  @@ -68,6 +68,7 @@
   import org.apache.tools.ant.types.FilterSet; 
   import org.apache.tools.ant.types.FilterSetCollection; 
   import org.apache.tools.ant.util.FileUtils; 
  +import org.apache.tools.ant.util.JavaEnvUtils;
   import org.apache.tools.ant.input.InputHandler;
   
   /**
  @@ -82,51 +83,48 @@
    *
    * @author duncan@x180.com
    *
  - * @version $Revision: 1.1 $
  + * @version $Revision: 1.2 $
    */
   
   public class Project {
   
       /** Message priority of "error". */
  -    public final static int MSG_ERR = 0;
  +    public static final int MSG_ERR = 0;
       /** Message priority of "warning". */
  -    public final static int MSG_WARN = 1;
  +    public static final int MSG_WARN = 1;
       /** Message priority of "information". */
  -    public final static int MSG_INFO = 2;
  +    public static final int MSG_INFO = 2;
       /** Message priority of "verbose". */
  -    public final static int MSG_VERBOSE = 3;
  +    public static final int MSG_VERBOSE = 3;
       /** Message priority of "debug". */
  -    public final static int MSG_DEBUG = 4;
  +    public static final int MSG_DEBUG = 4;
   
       /** 
        * Constant for the "visiting" state, used when
        * traversing a DFS of target dependencies.
        */
  -    private final static String VISITING = "VISITING";
  +    private static final String VISITING = "VISITING";
       /** 
        * Constant for the "visited" state, used when
        * traversing a DFS of target dependencies.
        */
  -    private final static String VISITED = "VISITED";
  -
  -    /** Version of currently running VM. */
  -    private static String javaVersion;
  +    private static final String VISITED = "VISITED";
   
       /** Version constant for Java 1.0 */
  -    public final static String JAVA_1_0 = "1.0";
  +    public static final String JAVA_1_0 = JavaEnvUtils.JAVA_1_0;
       /** Version constant for Java 1.1 */
  -    public final static String JAVA_1_1 = "1.1";
  +    public static final String JAVA_1_1 = JavaEnvUtils.JAVA_1_1;
       /** Version constant for Java 1.2 */
  -    public final static String JAVA_1_2 = "1.2";
  +    public static final String JAVA_1_2 = JavaEnvUtils.JAVA_1_2;
       /** Version constant for Java 1.3 */
  -    public final static String JAVA_1_3 = "1.3";
  +    public static final String JAVA_1_3 = JavaEnvUtils.JAVA_1_3;
       /** Version constant for Java 1.4 */
  -    public final static String JAVA_1_4 = "1.4";
  +    public static final String JAVA_1_4 = JavaEnvUtils.JAVA_1_4;
   
       /** Default filter start token. */
  -    public final static String TOKEN_START = FilterSet.DEFAULT_TOKEN_START;
  +    public static final String TOKEN_START = FilterSet.DEFAULT_TOKEN_START;
       /** Default filter end token. */
  -    public final static String TOKEN_END = FilterSet.DEFAULT_TOKEN_END;
  +    public static final String TOKEN_END = FilterSet.DEFAULT_TOKEN_END;
   
       /** Name of this project. */
       private String name;
  @@ -166,7 +164,9 @@
        * contains one FilterSet, but the wrapper is needed in order to
        * make it easier to use the FileUtils interface.
        */
  -    private FilterSetCollection globalFilters = new FilterSetCollection(globalFilterSet);
  +    private FilterSetCollection globalFilters 
  +        = new FilterSetCollection(globalFilterSet);
  +        
       /** Project base directory. */
       private File baseDir;
   
  @@ -207,31 +207,6 @@
           return inputHandler;
       }
   
  -    static {
  -
  -        // Determine the Java version by looking at available classes
  -        // java.lang.CharSequence was introduced in JDK 1.4
  -        // java.lang.StrictMath was introduced in JDK 1.3
  -        // java.lang.ThreadLocal was introduced in JDK 1.2
  -        // java.lang.Void was introduced in JDK 1.1
  -        // Count up version until a NoClassDefFoundError ends the try
  -
  -        try {
  -            javaVersion = JAVA_1_0;
  -            Class.forName("java.lang.Void");
  -            javaVersion = JAVA_1_1;
  -            Class.forName("java.lang.ThreadLocal");
  -            javaVersion = JAVA_1_2;
  -            Class.forName("java.lang.StrictMath");
  -            javaVersion = JAVA_1_3;
  -            Class.forName("java.lang.CharSequence");
  -            javaVersion = JAVA_1_4;
  -        } catch (ClassNotFoundException cnfe) {
  -            // swallow as we've hit the max class version that
  -            // we have
  -        }
  -    }
  -
       /** Instance of a utility class to use for file operations. */
       private FileUtils fileUtils;
   
  @@ -272,9 +247,11 @@
                       Class taskClass = Class.forName(value);
                       addTaskDefinition(key, taskClass);
                   } catch (NoClassDefFoundError ncdfe) {
  -                    log("Could not load a dependent class (" + ncdfe.getMessage() + ") for task " + key, MSG_DEBUG); 
  +                    log("Could not load a dependent class (" 
  +                        + ncdfe.getMessage() + ") for task " + key, MSG_DEBUG); 
                   } catch (ClassNotFoundException cnfe) {
  -                    log("Could not load class (" + value + ") for task " + key, MSG_DEBUG); 
  +                    log("Could not load class (" + value 
  +                        + ") for task " + key, MSG_DEBUG); 
                   }
               }
           } catch (IOException ioe) {
  @@ -283,7 +260,7 @@
   
           String dataDefs = "/org/apache/tools/ant/types/defaults.properties";
   
  -        try{
  +        try {
               Properties props = new Properties();
               InputStream in = this.getClass().getResourceAsStream(dataDefs);
               if (in == null) { 
  @@ -481,6 +458,10 @@
       /**
        * Sets a property unless it is already defined as a user property
        * (in which case the method returns silently).
  +     *
  +     * @param name The name of the property. 
  +     *             Must not be <code>null</code>.
  +     * @param value The property value. Must not be <code>null</code>.
        */
       private void setPropertyInternal(String name, String value) {
           if (null != userProperties.get(name)) {
  @@ -517,8 +498,8 @@
        *         by values, or <code>null</code> if the given string is
        *         <code>null</code>.
        * 
  -     * @exception BuildException if the given value has an unclosed property name,
  -     *                           e.g. <code>${xxx</code>
  +     * @exception BuildException if the given value has an unclosed 
  +     *                           property name, e.g. <code>${xxx</code>
        */
       public String replaceProperties(String value)
           throws BuildException { 
  @@ -544,7 +525,8 @@
   
       /**
        * Returns a copy of the properties table.
  -     * @return a hashtable containing all properties (including user properties).
  +     * @return a hashtable containing all properties 
  +     *         (including user properties).
        */
       public Hashtable getProperties() {
           Hashtable propertiesCopy = new Hashtable();
  @@ -656,6 +638,8 @@
        * 
        * @param token The token to filter.
        *              Must not be <code>null</code>.
  +     * @param value The replacement value.
  +     *              Must not be <code>null</code>.
        * @deprecated Use getGlobalFilterSet().addFilter(token,value)
        * 
        * @see #getGlobalFilterSet()
  @@ -710,13 +694,15 @@
       public void setBaseDir(File baseDir) throws BuildException {
           baseDir = fileUtils.normalize(baseDir.getAbsolutePath());
           if (!baseDir.exists()) { 
  -            throw new BuildException("Basedir " + baseDir.getAbsolutePath() + " does not exist");
  +            throw new BuildException("Basedir " + baseDir.getAbsolutePath() 
  +                + " does not exist");
           }
           if (!baseDir.isDirectory()) { 
  -            throw new BuildException("Basedir " + baseDir.getAbsolutePath() + " is not a directory");
  +            throw new BuildException("Basedir " + baseDir.getAbsolutePath() 
  +                + " is not a directory");
           }
           this.baseDir = baseDir;
  -        setPropertyInternal( "basedir", this.baseDir.getPath());
  +        setPropertyInternal("basedir", this.baseDir.getPath());
           String msg = "Project base dir set to: " + this.baseDir;
           log(msg, MSG_VERBOSE);
       }
  @@ -741,9 +727,10 @@
       /**
        * Returns the version of Java this class is running under.
        * @return the version of Java as a String, e.g. "1.1"
  +     * @see org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion
        */
       public static String getJavaVersion() {
  -        return javaVersion;
  +        return JavaEnvUtils.getJavaVersion();
       }
   
       /**
  @@ -754,17 +741,19 @@
        *
        * @exception BuildException if this Java version is not supported
        * 
  -     * @see #getJavaVersion()
  +     * @see org.apache.tools.ant.util.JavaEnvUtils#getJavaVersion
        */
       public void setJavaVersionProperty() throws BuildException {
  +        String javaVersion = JavaEnvUtils.getJavaVersion();
           setPropertyInternal("ant.java.version", javaVersion);
   
           // sanity check
  -        if (javaVersion == JAVA_1_0) {
  +        if (javaVersion == JavaEnvUtils.JAVA_1_0) {
               throw new BuildException("Ant cannot work on Java 1.0");
           }
   
  -        log("Detected Java version: " + javaVersion + " in: " + System.getProperty("java.home"), MSG_VERBOSE);
  +        log("Detected Java version: " + javaVersion + " in: " 
  +            + System.getProperty("java.home"), MSG_VERBOSE);
   
           log("Detected OS: " + System.getProperty("os.name"), MSG_VERBOSE);
       }
  @@ -803,8 +792,9 @@
        *
        * @see #checkTaskClass(Class)
        */
  -    public void addTaskDefinition(String taskName, Class taskClass) throws BuildException {
  -        Class old = (Class)taskClassDefinitions.get(taskName);
  +    public void addTaskDefinition(String taskName, Class taskClass) 
  +         throws BuildException {
  +        Class old = (Class) taskClassDefinitions.get(taskName);
           if (null != old) {
               if (old.equals(taskClass)) {
                   log("Ignoring override for task " + taskName 
  @@ -812,7 +802,7 @@
                       MSG_VERBOSE);
                   return;
               } else {
  -                log("Trying to override old definition of task "+taskName, 
  +                log("Trying to override old definition of task " + taskName, 
                       MSG_WARN);
                   invalidateCreatedTasks(taskName);
               }
  @@ -829,31 +819,35 @@
        * Ant task implementation classes must be public, concrete, and have 
        * a no-arg constructor.
        * 
  +     * @param taskClass The class to be checked. 
  +     *                  Must not be <code>null</code>.
  +     *
        * @exception BuildException if the class is unsuitable for being an Ant 
  -     *                           task. An error level message is logged before 
  +     *                           task. An error level message is logged before
        *                           this exception is thrown.
        */
       public void checkTaskClass(final Class taskClass) throws BuildException {
  -        if(!Modifier.isPublic(taskClass.getModifiers())) {
  +        if (!Modifier.isPublic(taskClass.getModifiers())) {
               final String message = taskClass + " is not public";
               log(message, Project.MSG_ERR);
               throw new BuildException(message);
           }
  -        if(Modifier.isAbstract(taskClass.getModifiers())) {
  +        if (Modifier.isAbstract(taskClass.getModifiers())) {
               final String message = taskClass + " is abstract";
               log(message, Project.MSG_ERR);
               throw new BuildException(message);
           }
           try {
  -            taskClass.getConstructor( null );
  +            taskClass.getConstructor(null);
               // don't have to check for public, since
               // getConstructor finds public constructors only.
  -        } catch(NoSuchMethodException e) {
  -            final String message = "No public no-arg constructor in " + taskClass;
  +        } catch (NoSuchMethodException e) {
  +            final String message = "No public no-arg constructor in " 
  +                + taskClass;
               log(message, Project.MSG_ERR);
               throw new BuildException(message);
           }
  -        if( !Task.class.isAssignableFrom(taskClass) ) {
  +        if (!Task.class.isAssignableFrom(taskClass)) {
               TaskAdapter.checkTaskClass(taskClass, this);
           }
       }
  @@ -879,11 +873,11 @@
        * 
        * @param typeName The name of the datatype.
        *                 Must not be <code>null</code>.
  -     * @param taskClass The full name of the class implementing the datatype.
  +     * @param typeClass The full name of the class implementing the datatype.
        *                  Must not be <code>null</code>.
        */
       public void addDataTypeDefinition(String typeName, Class typeClass) {
  -        Class old = (Class)dataClassDefinitions.get(typeName);
  +        Class old = (Class) dataClassDefinitions.get(typeName);
           if (null != old) {
               if (old.equals(typeClass)) {
                   log("Ignoring override for datatype " + typeName 
  @@ -891,19 +885,20 @@
                       MSG_VERBOSE);
                   return;
               } else {
  -                log("Trying to override old definition of datatype "+typeName, 
  -                    MSG_WARN);
  +                log("Trying to override old definition of datatype " 
  +                    + typeName, MSG_WARN);
               }
           }
   
  -        String msg = " +User datatype: " + typeName + "     " + typeClass.getName();
  +        String msg = " +User datatype: " + typeName + "     " 
  +            + typeClass.getName();
           log(msg, MSG_DEBUG);
           dataClassDefinitions.put(typeName, typeClass);
       }
   
       /**
  -     * Returns the current datatype definition hashtable. The returned hashtable is 
  -     * "live" and so should not be modified.
  +     * Returns the current datatype definition hashtable. The returned 
  +     * hashtable is "live" and so should not be modified.
        * 
        * @return a map of from datatype name to implementing class 
        *         (String to Class). 
  @@ -922,10 +917,10 @@
        * 
        * @see Project#addOrReplaceTarget
        */
  -    public void addTarget(Target target) {
  +    public void addTarget(Target target) throws BuildException {
           String name = target.getName();
           if (targets.get(name) != null) {
  -            throw new BuildException("Duplicate target: `"+name+"'");
  +            throw new BuildException("Duplicate target: `" + name + "'");
           }
           addOrReplaceTarget(name, target);
       }
  @@ -945,7 +940,7 @@
        public void addTarget(String targetName, Target target)
            throws BuildException {
            if (targets.get(targetName) != null) {
  -             throw new BuildException("Duplicate target: `"+targetName+"'");
  +             throw new BuildException("Duplicate target: `" + targetName + "'");
            }
            addOrReplaceTarget(targetName, target);
        }
  @@ -1008,14 +1003,14 @@
           try {
               Object o = c.newInstance();
               Task task = null;
  -            if( o instanceof Task ) {
  -               task=(Task)o;
  +            if (o instanceof Task) {
  +               task = (Task) o;
               } else {
                   // "Generic" Bean - use the setter pattern
                   // and an Adapter
  -                TaskAdapter taskA=new TaskAdapter();
  -                taskA.setProxy( o );
  -                task=taskA;
  +                TaskAdapter taskA = new TaskAdapter();
  +                taskA.setProxy(o);
  +                task = taskA;
               }
               task.setProject(this);
               task.setTaskType(taskType);
  @@ -1080,7 +1075,7 @@
       /**
        * Creates a new instance of a data type.
        * 
  -     * @param taskType The name of the data type to create an instance of.
  +     * @param typeName The name of the data type to create an instance of.
        *                 Must not be <code>null</code>.
        * 
        * @return an instance of the specified data type, or <code>null</code> if
  @@ -1116,7 +1111,7 @@
                    o = ctor.newInstance(new Object[] {this});
               }
               if (o instanceof ProjectComponent) {
  -                ((ProjectComponent)o).setProject(this);
  +                ((ProjectComponent) o).setProject(this);
               }
               String msg = "   +DataType: " + typeName;
               log (msg, MSG_DEBUG);
  @@ -1146,7 +1141,7 @@
           Throwable error = null;
   
           for (int i = 0; i < targetNames.size(); i++) {
  -            executeTarget((String)targetNames.elementAt(i));
  +            executeTarget((String) targetNames.elementAt(i));
           }
       }
   
  @@ -1160,15 +1155,13 @@
        *        or information (<code>false</code>).
        */
       public void demuxOutput(String line, boolean isError) {
  -        Task task = (Task)threadTasks.get(Thread.currentThread());
  +        Task task = (Task) threadTasks.get(Thread.currentThread());
           if (task == null) {
               fireMessageLogged(this, line, isError ? MSG_ERR : MSG_INFO);
  -        }
  -        else {
  +        } else {
               if (isError) {
                   task.handleErrorOutput(line);
  -            }
  -            else {
  +            } else {
                   task.handleOutput(line);
               }
           }
  @@ -1221,6 +1214,8 @@
        *                 respect to. May be <code>null</code>, in which case
        *                 the current directory is used.
        *
  +     * @return the resolved File. 
  +     * 
        * @deprecated
        */
       public File resolveFile(String fileName, File rootDir) {
  @@ -1235,6 +1230,9 @@
        *
        * @param fileName The name of the file to resolve. 
        *                 Must not be <code>null</code>.
  +     *
  +     * @return the resolved File. 
  +     * 
        */
       public File resolveFile(String fileName) {
           return fileUtils.resolveFile(baseDir, fileName);
  @@ -1257,7 +1255,7 @@
        * @see PathTokenizer
        */
       public static String translatePath(String toProcess) {
  -        if ( toProcess == null || toProcess.length() == 0 ) {
  +        if (toProcess == null || toProcess.length() == 0) {
               return "";
           }
   
  @@ -1289,7 +1287,8 @@
        *
        * @deprecated
        */
  -    public void copyFile(String sourceFile, String destFile) throws IOException {
  +    public void copyFile(String sourceFile, String destFile) 
  +          throws IOException {
           fileUtils.copyFile(sourceFile, destFile);
       }
   
  @@ -1310,7 +1309,8 @@
        */
       public void copyFile(String sourceFile, String destFile, boolean filtering)
           throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null);
       }
   
       /**
  @@ -1333,7 +1333,8 @@
        */
       public void copyFile(String sourceFile, String destFile, boolean filtering,
                            boolean overwrite) throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null, overwrite);
       }
   
       /**
  @@ -1362,8 +1363,8 @@
       public void copyFile(String sourceFile, String destFile, boolean filtering,
                            boolean overwrite, boolean preserveLastModified)
           throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, 
  -                           overwrite, preserveLastModified);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null, overwrite, preserveLastModified);
       }
   
       /**
  @@ -1400,7 +1401,8 @@
        */
       public void copyFile(File sourceFile, File destFile, boolean filtering)
           throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null);
       }
   
       /**
  @@ -1417,13 +1419,14 @@
        * @param overwrite Whether or not the destination file should be 
        *                  overwritten if it already exists.
        * 
  -     * @exception IOException 
  +     * @exception IOException if the file cannot be copied.
        *
        * @deprecated
        */
       public void copyFile(File sourceFile, File destFile, boolean filtering,
                            boolean overwrite) throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, overwrite);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null, overwrite);
       }
   
       /**
  @@ -1445,32 +1448,35 @@
        *                             the resulting file should be set to that
        *                             of the source file.
        * 
  -     * @exception IOException if the copying fails
  +     * @exception IOException if the file cannot be copied.
        *
        * @deprecated
        */
       public void copyFile(File sourceFile, File destFile, boolean filtering,
                            boolean overwrite, boolean preserveLastModified)
           throws IOException {
  -        fileUtils.copyFile(sourceFile, destFile, filtering ? globalFilters : null, 
  -                           overwrite, preserveLastModified);
  +        fileUtils.copyFile(sourceFile, destFile, 
  +            filtering ? globalFilters : null, overwrite, preserveLastModified);
       }
   
       /**
        * Calls File.setLastModified(long time) on Java above 1.1, and logs
        * a warning on Java 1.1.
        * 
  -     * @param File The file to set the last modified time on.
  +     * @param file The file to set the last modified time on.
        *             Must not be <code>null</code>.
        *
  +     * @param time the required modification time.
  +     * 
        * @deprecated
        * 
        * @exception BuildException if the last modified time cannot be set
        *                           despite running on a platform with a version 
        *                           above 1.1.
        */
  -    public void setFileLastModified(File file, long time) throws BuildException {
  -        if (getJavaVersion() == JAVA_1_1) {
  +    public void setFileLastModified(File file, long time) 
  +         throws BuildException {
  +        if (JavaEnvUtils.getJavaVersion() == JavaEnvUtils.JAVA_1_1) {
               log("Cannot change the modification time of " + file
                   + " in JDK 1.1", Project.MSG_WARN);
               return;
  @@ -1526,18 +1532,18 @@
           // build Target.
   
           tsort(root, targets, state, visiting, ret);
  -        log("Build sequence for target `"+root+"' is "+ret, MSG_VERBOSE);
  -        for (Enumeration en=targets.keys(); en.hasMoreElements();) {
  -            String curTarget = (String)(en.nextElement());
  +        log("Build sequence for target `" + root + "' is " + ret, MSG_VERBOSE);
  +        for (Enumeration en = targets.keys(); en.hasMoreElements();) {
  +            String curTarget = (String) en.nextElement();
               String st = (String) state.get(curTarget);
               if (st == null) {
                   tsort(curTarget, targets, state, visiting, ret);
  -            }
  -            else if (st == VISITING) {
  -                throw new RuntimeException("Unexpected node in visiting state: "+curTarget);
  +            } else if (st == VISITING) {
  +                throw new RuntimeException("Unexpected node in visiting state: "
  +                    + curTarget);
               }
           }
  -        log("Complete build sequence is "+ret, MSG_VERBOSE);
  +        log("Complete build sequence is " + ret, MSG_VERBOSE);
           return ret;
       }
   
  @@ -1588,7 +1594,7 @@
           state.put(root, VISITING);
           visiting.push(root);
   
  -        Target target = (Target)(targets.get(root));
  +        Target target = (Target) targets.get(root);
   
           // Make sure we exist
           if (target == null) {
  @@ -1597,7 +1603,7 @@
               sb.append("' does not exist in this project. ");
               visiting.pop();
               if (!visiting.empty()) {
  -                String parent = (String)visiting.peek();
  +                String parent = (String) visiting.peek();
                   sb.append("It is used from target `");
                   sb.append(parent);
                   sb.append("'.");
  @@ -1606,14 +1612,13 @@
               throw new BuildException(new String(sb));
           }
   
  -        for (Enumeration en=target.getDependencies(); en.hasMoreElements();) {
  +        for (Enumeration en = target.getDependencies(); en.hasMoreElements();) {
               String cur = (String) en.nextElement();
  -            String m=(String)state.get(cur);
  +            String m = (String) state.get(cur);
               if (m == null) {
                   // Not been visited
                   tsort(cur, targets, state, visiting, ret);
  -            }
  -            else if (m == VISITING) {
  +            } else if (m == VISITING) {
                   // Currently visiting this node, so have a cycle
                   throw makeCircularException(cur, visiting);
               }
  @@ -1621,14 +1626,16 @@
   
           String p = (String) visiting.pop();
           if (root != p) {
  -            throw new RuntimeException("Unexpected internal error: expected to pop "+root+" but got "+p);
  +            throw new RuntimeException("Unexpected internal error: expected to "
  +                + "pop " + root + " but got " + p);
           }
           state.put(root, VISITED);
           ret.addElement(target);
       }
   
       /**
  -     * Builds an appropriate exception detailing a specified circular dependency.
  +     * Builds an appropriate exception detailing a specified circular 
  +     * dependency.
        * 
        * @param end The dependency to stop at. Must not be <code>null</code>.
        * @param stk A stack of dependencies. Must not be <code>null</code>.
  @@ -1640,10 +1647,10 @@
           sb.append(end);
           String c;
           do {
  -            c = (String)stk.pop();
  +            c = (String) stk.pop();
               sb.append(" <- ");
               sb.append(c);
  -        } while(!c.equals(end));
  +        } while (!c.equals(end));
           return new BuildException(new String(sb));
       }
   
  @@ -1654,12 +1661,17 @@
        * @param value The value of the reference. Must not be <code>null</code>.
        */
       public void addReference(String name, Object value) {
  -        if (null != references.get(name)) {
  +        Object old = references.get(name);
  +        if (old == value) {
  +            // no warning, this is not changing anything
  +            return;
  +        }
  +        if (old != null) {
               log("Overriding previous definition of reference to " + name, 
                   MSG_WARN);
           }
           log("Adding reference: " + name + " -> " + value, MSG_DEBUG);
  -        references.put(name,value);
  +        references.put(name, value);
       }
   
       /**
  @@ -1792,7 +1804,7 @@
        */
       protected void fireTaskStarted(Task task) {
           // register this as the current task on the current thread.
  -        threadTasks.put(Thread.currentThread(), task);
  +        registerThreadTask(Thread.currentThread(), task);
           BuildEvent event = new BuildEvent(task);
           for (int i = 0; i < listeners.size(); i++) {
               BuildListener listener = (BuildListener) listeners.elementAt(i);
  @@ -1811,7 +1823,7 @@
        *                  a successful build.
        */
       protected void fireTaskFinished(Task task, Throwable exception) {
  -        threadTasks.remove(Thread.currentThread());
  +        registerThreadTask(Thread.currentThread(), null);
           System.out.flush();
           System.err.flush();
           BuildEvent event = new BuildEvent(task);
  @@ -1832,7 +1844,8 @@
        * @param message  The message to send. Should not be <code>null</code>.
        * @param priority The priority of the message.
        */
  -    private void fireMessageLoggedEvent(BuildEvent event, String message, int priority) {
  +    private void fireMessageLoggedEvent(BuildEvent event, String message, 
  +                                        int priority) {
           event.setMessage(message, priority);
           for (int i = 0; i < listeners.size(); i++) {
               BuildListener listener = (BuildListener) listeners.elementAt(i);
  @@ -1849,7 +1862,8 @@
        * @param message  The message to send. Should not be <code>null</code>.
        * @param priority The priority of the message.
        */
  -    protected void fireMessageLogged(Project project, String message, int priority) {
  +    protected void fireMessageLogged(Project project, String message, 
  +                                     int priority) {
           BuildEvent event = new BuildEvent(project);
           fireMessageLoggedEvent(event, message, priority);
       }
  @@ -1863,7 +1877,8 @@
        * @param message  The message to send. Should not be <code>null</code>.
        * @param priority The priority of the message.
        */
  -    protected void fireMessageLogged(Target target, String message, int priority) {
  +    protected void fireMessageLogged(Target target, String message, 
  +                                     int priority) {
           BuildEvent event = new BuildEvent(target);
           fireMessageLoggedEvent(event, message, priority);
       }
  @@ -1881,4 +1896,33 @@
           BuildEvent event = new BuildEvent(task);
           fireMessageLoggedEvent(event, message, priority);
       }
  +
  +    /**
  +     * Register a task as the current task for a thread.
  +     * If the task is null, the thread's entry is removed.
  +     *
  +     * @param thread the thread on which the task is registered.
  +     * @param task the task to be registered.
  +     * @since 1.102, Ant 1.5
  +     */
  +    public void registerThreadTask(Thread thread, Task task) {
  +        if (task != null) {
  +            threadTasks.put(thread, task);
  +        } else {
  +            threadTasks.remove(thread);
  +        }
  +    }
  +    
  +    /**
  +     * Get the current task assopciated with a thread, if any
  +     *
  +     * @param thread the thread for which the task is required.
  +     * @return the task which is currently registered for the given thread or
  +     *         null if no task is registered. 
  +     */
  +    public Task getThreadTask(Thread thread) {
  +        return (Task) threadTasks.get(thread);
  +    }
  +    
  +    
   }
  
  
  
  1.4       +9 -5      jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/DefaultInputHandler.java
  
  Index: DefaultInputHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/DefaultInputHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultInputHandler.java	8 Mar 2002 08:32:28 -0000	1.3
  +++ DefaultInputHandler.java	18 Apr 2002 12:10:14 -0000	1.4
  @@ -66,7 +66,8 @@
    * Prompts on System.out, reads input from System.in
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.3 $
  + * @version $Revision: 1.4 $
  + * @since Ant 1.5
    */
   public class DefaultInputHandler implements InputHandler {
       
  @@ -76,6 +77,10 @@
       public DefaultInputHandler() {
       }
   
  +    /**
  +     * Prompts and requests input.  May loop until a valid input has
  +     * been entered.
  +     */
       public void handleInput(InputRequest request) throws BuildException {
           String prompt = getPrompt(request);
           BufferedReader in = 
  @@ -95,7 +100,7 @@
       /**
        * Constructs user prompt from a request.
        *
  -     * <p>This implemenation adds (choice1,choice2,choice3,...) to the
  +     * <p>This implementation adds (choice1,choice2,choice3,...) to the
        * prompt for <code>MultipleChoiceInputRequest</code>s.</p>
        *
        * @param request the request to construct the prompt for.
  @@ -110,12 +115,11 @@
                   ((MultipleChoiceInputRequest) request).getChoices().elements();
               boolean first = true;
               while (enum.hasMoreElements()) {
  -                if (first) {
  -                    first = false;
  -                } else {
  +                if (!first) {
                       sb.append(",");
                   }
                   sb.append(enum.nextElement());
  +                first = false;
               }
               sb.append(")");
               prompt = sb.toString();
  
  
  
  1.3       +2 -1      jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/InputHandler.java
  
  Index: InputHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/InputHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InputHandler.java	26 Feb 2002 10:29:29 -0000	1.2
  +++ InputHandler.java	18 Apr 2002 12:10:14 -0000	1.3
  @@ -58,7 +58,8 @@
    * Plugin to Ant to handle requests for user input.
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
  + * @since Ant 1.5
    */
   public interface InputHandler {
   
  
  
  
  1.3       +2 -1      jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/InputRequest.java
  
  Index: InputRequest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/InputRequest.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- InputRequest.java	26 Feb 2002 10:29:29 -0000	1.2
  +++ InputRequest.java	18 Apr 2002 12:10:14 -0000	1.3
  @@ -58,7 +58,8 @@
    * Encapsulates an input request.
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
  + * @since Ant 1.5
    */
   public class InputRequest {
       private String prompt;
  
  
  
  1.3       +6 -2      jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java
  
  Index: MultipleChoiceInputRequest.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/MultipleChoiceInputRequest.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- MultipleChoiceInputRequest.java	26 Feb 2002 10:29:29 -0000	1.2
  +++ MultipleChoiceInputRequest.java	18 Apr 2002 12:10:14 -0000	1.3
  @@ -60,7 +60,8 @@
    * Encapsulates an input request.
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
  + * @since Ant 1.5
    */
   public class MultipleChoiceInputRequest extends InputRequest {
       private Vector choices = new Vector();
  @@ -79,12 +80,15 @@
       }
   
       /**
  -     * The possible values.
  +     * @return The possible values.
        */
       public Vector getChoices() {
           return choices;
       }
   
  +    /**
  +     * @return true if the input is one of the allowed values.
  +     */
       public boolean isInputValid() {
           return choices.contains(getInput());
       }
  
  
  
  1.3       +14 -3     jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java
  
  Index: PropertyFileInputHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/input/PropertyFileInputHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PropertyFileInputHandler.java	26 Feb 2002 10:29:29 -0000	1.2
  +++ PropertyFileInputHandler.java	18 Apr 2002 12:10:14 -0000	1.3
  @@ -65,7 +65,8 @@
    * system property ant.input.properties, the prompt is the key for input.
    *
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
  - * @version $Revision: 1.2 $
  + * @version $Revision: 1.3 $
  + * @since Ant 1.5
    */
   public class PropertyFileInputHandler implements InputHandler {
       private Properties props = null;
  @@ -81,6 +82,12 @@
       public PropertyFileInputHandler() {
       }
   
  +    /**
  +     * Picks up the input from a property, using the prompt as the
  +     * name of the property.
  +     *
  +     * @exception BuildException if no property of that name can be found.
  +     */
       public void handleInput(InputRequest request) throws BuildException {
           readProps();
           Object o = props.get(request.getPrompt());
  @@ -95,13 +102,17 @@
           }
       }
   
  +    /**
  +     * Reads the properties file if it hasn't already been read.
  +     */
       private synchronized void readProps() throws BuildException {
           if (props == null) {
               String propsFile = System.getProperty(FILE_NAME_KEY);
               if (propsFile == null) {
                   throw new BuildException("System property "
                                            + FILE_NAME_KEY
  -                                         + " for PropertyFileInputHandler not set");
  +                                         + " for PropertyFileInputHandler not"
  +                                         + " set");
               }
               
               props = new Properties();
  @@ -109,7 +120,7 @@
               try {
                   props.load(new FileInputStream(propsFile));
               } catch (IOException e) {
  -                throw new BuildException("Couldn't load "+propsFile, e);
  +                throw new BuildException("Couldn't load " + propsFile, e);
               }
           }
       }
  
  
  
  1.3       +3 -6      jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/taskdefs/Input.java
  
  Index: Input.java
  ===================================================================
  RCS file: /home/cvs/jakarta-ant/proposal/sandbox/input/src/main/org/apache/tools/ant/taskdefs/Input.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Input.java	11 Apr 2002 14:43:05 -0000	1.2
  +++ Input.java	18 Apr 2002 12:10:15 -0000	1.3
  @@ -70,6 +70,8 @@
    * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
    *
    * @since Ant 1.5
  + *
  + * @ant.task category="control"
    */
   public class Input extends Task {
       private String validargs = null;
  @@ -136,12 +138,7 @@
           getProject().getInputHandler().handleInput(request);
   
           if (addproperty != null) {
  -            if (project.getProperty(addproperty) == null) {
  -                project.setNewProperty(addproperty, request.getInput());
  -            } else {
  -                log("Override ignored for " + addproperty,
  -                    Project.MSG_VERBOSE);
  -            }
  +            project.setNewProperty(addproperty, request.getInput());
           }
       }
   
  
  
  

--
To unsubscribe, e-mail:   <mailto:ant-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:ant-dev-help@jakarta.apache.org>


Mime
View raw message