ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dona...@locus.apache.org
Subject cvs commit: jakarta-ant/proposal/frantic/src/org/apache/ant/test SimpleTest.java
Date Mon, 18 Dec 2000 05:59:51 GMT
donaldp     00/12/17 21:59:51

  Added:       proposal/frantic build.bat
               proposal/frantic/src/org/apache/ant AntException.java
               proposal/frantic/src/org/apache/ant/engine
                        AntEngineListener.java AntEvent.java
                        DefaultEngineListener.java
                        HierarchicalHashtable.java TaskEngine.java
                        TaskEngineImpl.java
               proposal/frantic/src/org/apache/ant/tasks BaseTask.java
                        Task.java
               proposal/frantic/src/org/apache/ant/tasks/build Project.java
                        Target.java
               proposal/frantic/src/org/apache/ant/tasks/util Property.java
                        PropertyDump.java
               proposal/frantic/src/org/apache/ant/test SimpleTest.java
  Log:
  A new proposal to shake the tree that unifies everything to a task.
  
  Submitted By: "James Cook" <jimcook@iname.com>
  
  Revision  Changes    Path
  1.1                  jakarta-ant/proposal/frantic/build.bat
  
  Index: build.bat
  ===================================================================
  @echo off
  rem --------------------------------------------------------------------------
  rem build.bat - Build Script for Frantic (lifted from Tomcat...thx guys)
  rem
  rem Environment Variable Prerequisites:
  rem
  rem   JAVA_HOME        Must point at your Java Development Kit [REQUIRED]
  rem
  rem ---------------------------------------------------------------------------
  
  
  rem ----- Save Environment Variables ------------------------------------------
  
  set _CLASSPATH=%CLASSPATH%
  set _CLASSES=%CLASSES%
  
  rem ----- Verify and Set Required Environment Variables -----------------------
  
  if not "%JAVA_HOME%" == "" goto gotJavaHome
  echo You must set JAVA_HOME to point at your Java Development Kit installation
  goto cleanup
  :gotJavaHome
  
  rem ----- Set Up The Runtime Classpath ----------------------------------------
  
  if not "%CLASSPATH%" == "" set CLASSPATH=%CLASSPATH%;
  set CLASSPATH=%CLASSPATH%;./src
  
  rem ----- Execute The Requested Build -----------------------------------------
  
  if not exist dist mkdir dist
  if not exist dist\lib mkdir dist\lib
  if not exist dist\lib\classes mkdir dist\lib\classes
  if not exist dist\doc mkdir dist\doc
  if not exist dist\doc\api mkdir dist\doc\api
  
  set CLASSES=dist\lib\classes
  
  %JAVA_HOME%\bin\javac -d %CLASSES% src/org/apache/ant/test/*.java
  %JAVA_HOME%\bin\jar cvf dist\lib\frantic.jar -C dist\lib\classes .
  
  xcopy website\*.html dist\doc /s /y
  xcopy website\*.gif dist\doc /s /y
  
  %JAVA_HOME%\bin\javadoc -protected -sourcepath src -d dist\doc\api -author org.apache.ant org.apache.ant.engine org.apache.ant.tasks org.apache.ant.tasks.build org.apache.ant.tasks.util
  
  rem ----- Restore Environment Variables ---------------------------------------
  :cleanup
  set CLASSPATH=%_CLASSPATH%
  set CLASSES=%_CLASSES%
  set _CLASSPATH=
  set _CLASSES=
  
  :finish
  
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/AntException.java
  
  Index: AntException.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant;
  
  public class AntException extends Exception {
      
      public AntException() {
          super();
      }
      
      public AntException(String message) {
          super(message);
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/AntEngineListener.java
  
  Index: AntEngineListener.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.engine;
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.tasks.Task;
  
  public interface AntEngineListener extends EventListener {
      
      void engineStart(AntEvent e);
      void engineFinish(AntEvent e);
      
      void taskStart(AntEvent e);
      void taskExecute(AntEvent e);
      void taskFinish(AntEvent e);
      void taskMessage(AntEvent e, String message);
      void taskException(AntEvent e, AntException exception);
      
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/AntEvent.java
  
  Index: AntEvent.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.engine;
  
  
  import java.util.EventObject;
  import org.apache.ant.tasks.Task;
  
  public class AntEvent extends EventObject {
      
      Task task;
      
      public AntEvent(Object source) {
          this(source, null);
      }
      
      public AntEvent(Object source, Task task) {
          super(source);
          this.task = task;
      }
      
      public Task getTask() {
          return task;
      }
      
      public void setTask(Task task) {
          this.task = task;
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/DefaultEngineListener.java
  
  Index: DefaultEngineListener.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.engine;
  
  
  import java.io.*;
  import java.text.*;
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.tasks.Task;
  
  public class DefaultEngineListener implements AntEngineListener {
      
      protected PrintStream       outputStream;
      protected long              startTime;
      
      protected StringBuffer      sb              = new StringBuffer();
      protected int               indentSpaces    = 4;
      protected boolean           indent          = true;
      protected int               curIndent       = 0;
      
      protected SimpleDateFormat  timestamp       = new SimpleDateFormat("HH:mm:ss:SSS");
      
      public DefaultEngineListener() {
          this(System.out);
      }
      
      public DefaultEngineListener(PrintStream outputStream) {
          this.outputStream = outputStream;
      }
      
      public void setIndentSpaces(int spaces) {
          this.indentSpaces = spaces;
      }
      
      public int getIndentSpaces() {
          return indentSpaces;
      }
      
      public void setIndent(boolean on) {
          this.indent = on;
      }
      
      public boolean isIndent() {
          return indent;
      }
      
      protected String padLeft(String s, int length) {
          sb.setLength(0);
          sb.append(s);
          while (sb.length() < length) {
              sb.insert(0, ' ');
          }
          return sb.toString();
      }
      
      protected void output(String message) {
          if (!indent) {
              outputStream.println(message);
              return;
          }
          
          // shouldn't happen, but let's be on the safe side
          if (curIndent < 0) {
              curIndent = 0;
          }
          
          outputStream.println(
                               padLeft(message, message.length() + (indentSpaces * curIndent)));
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                     AntEngineListener Implementation                   //
      ////////////////////////////////////////////////////////////////////////////
      
      public void engineStart(AntEvent e) {
          Date now = new Date();
          output("Engine Started: " + timestamp.format(now));
          startTime = now.getTime();
      }
      
      public void engineFinish(AntEvent e) {
          Date now = new Date();
          long elapsed = System.currentTimeMillis() - startTime;
          
          output("Engine Finished: " + timestamp.format(now));
          output("Elapsed Time: " + (elapsed / 1000F) + " seconds");
      }
      
      public void taskStart(AntEvent e) {
          output("Task Started: " + e.getTask().getFullyQualifiedName());
          curIndent++;
      }
      
      public void taskExecute(AntEvent e){
          output("Task Execution: " + e.getTask().getFullyQualifiedName());
      }
      
      public void taskFinish(AntEvent e){
          curIndent--;
          output("Task Finished: " + e.getTask().getFullyQualifiedName());
      }
      
      public void taskMessage(AntEvent e, String message){
          curIndent++;
          output("Task Message: " + e.getTask().getFullyQualifiedName() + ": " +
                 message);
          curIndent--;
      }
      
      public void taskException(AntEvent e, AntException exception){
          output("Task Exception: " + e.getTask().getFullyQualifiedName() + ": " +
                 exception.getMessage());
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/HierarchicalHashtable.java
  
  Index: HierarchicalHashtable.java
  ===================================================================
  package org.apache.ant.engine;
  
  import java.util.*;
  
  public class HierarchicalHashtable extends Hashtable {
      
      private HierarchicalHashtable parent;
      
      public HierarchicalHashtable() {
          this(null);
      }
      
      public HierarchicalHashtable(HierarchicalHashtable parent) {
          super();
          this.parent = parent;
      }
      
      public HierarchicalHashtable getParent() {
          return parent;
      }
      
      public void setParent(HierarchicalHashtable parent) {
          this.parent = parent;
      }
      
      public List getPropertyNames() {
          ArrayList list = new ArrayList();
          
          Enumeration e = keys();
          while (e.hasMoreElements()) {
              list.add(e.nextElement());
          }
          
          if (getParent() != null) {
              list.addAll(getParent().getPropertyNames());
          }
          
          return list;
      }
      
      public Object getPropertyValue(String name) {
          Object value = get(name);
          if (value == null && getParent() != null) {
              return getParent().getPropertyValue(name);
          }
          return value;
      }
      
      public void setPropertyValue(String name, Object value) {
          put(name, value);
      }
      
      public void removePropertyValue(String name) {
          Object value = get(name);
          if (value == null && getParent() != null) {
              getParent().removePropertyValue(name);
          }
          if (value != null) {
              remove(name);
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/TaskEngine.java
  
  Index: TaskEngine.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.engine;
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.tasks.Task;
  
  /**
   * The TaskEngine interface defines the methods that a TaskEngine are required
   * to implement. This interface is also passed to each Task in order for them to
   * get access to some utility functions like inserting a new Task during a run,
   * or forcing the execution path of Tasks to be modified.
   */
  public interface TaskEngine {
      
      void addAntEngineListener(AntEngineListener listener);
      
      void removeAntEngineListener(AntEngineListener listener);
      
      void execute(Task task) throws AntException;
      
      void execute(Task root, Task task) throws AntException;
      
      void message(Task task, String message);
      
      Task getNextExecuteTask();
      
      /**
       * Returns a list of all property names that the current task stack is aware
       * of. This is a recursive list of all property names.
       */
      List getPropertyNames();
      
      /**
       * May be called to obtain property values that have been defined. Property
       * values are maintained in a hierarchical manner as each task is executed.
       * When a property is requested, if the current execution level does not
       * contain the property, the execution parent is then queried. This
       * continues until there is no where else to go!
       * <p></p>
       * Maybe this should be a Hashtable implementation and be able to return
       * Object? Is that a little overkill considering these values will usually
       * be Strings? Perhaps someone will have a farfetched idea of storing a
       * Task in a property?
       */
      Object getPropertyValue(String name);
      
      /**
       * Adds the name-value pair to this execution stack property list. If the
       * property is declared in parent tasks, I don't really see a reason for not
       * adding it again to this execution list. This would achieve a nice scoped
       * parameter list that is dictated by nesting levels.
       * <p></p>
       * This is against the current Ant (1.2) specification, but I'm not sure why
       * that restriction was there. It would be simple to implement here if it
       * again required.
       */
      void setPropertyValue(String name, Object value);
      
      /**
       * Removes the given property from the property list. I haven't thought too
       * much about the rules behind this method. My current thinking is that the
       * property is removed no matter what level of the execution stack the
       * property was defined in. I think this should be good in most cases. If it
       * ever surfaces that the property should just be unavailable for this stack
       * level (and other's below it), then the implementation can be modified to
       * keep a list of these "unavailable" properties.
       */
      void removePropertyValue(String name);
      
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/engine/TaskEngineImpl.java
  
  Index: TaskEngineImpl.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.engine;
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.tasks.Task;
  
  /**
   * The engine that actually invokes each Task. In addition to specifying a Task
   * to execute, it may be desirable to specify the root Task that will define
   * an execution cycle.
   */
  public class TaskEngineImpl implements TaskEngine {
      
      /**
       * Analagous to a call stack, but with Tasks.
       */
      protected Stack taskStack       = new Stack();;
      
      /**
       * As the task stack is built, a mirror representation will also be
       * contructed that will hold property values.
       */
      protected Stack propertyStack   = new Stack();
      
      /**
       * Keeps track of AntEngineListeners. We don't have to use Vector because we
       * take care of synchronization on the add, remove, and iteration operations.
       */
      protected ArrayList listenerList = new ArrayList();
      
      private int engineLevel = 0;
      
      /**
       * Constructor is private so it cannot be instantiated. Users of this class
       * will get an instance by using the getTaskEngine() method. This will allow
       * us to have a simple Factory implementation. We may use a Singleton
       * implementation, or a collection pool. The choice is up to us.
       */
      private TaskEngineImpl() {
          super();
      }
      
      /**
       * Return a usable instance of a TaskEngine to the requestor. Nothing
       * sophisticated yet, simple doles out a new instance each time.
       */
      public static TaskEngine getTaskEngine() {
          return new TaskEngineImpl();
      }
      
      /**
       * Walk the list of Tasks backwards until the root is reached. Keep track of
       * the Tasks along the way in a Stack. Return null if the root Task is not a
       * parent of the provided Task.
       */
      protected Stack getTaskStack(Task root, Task task) {
          Stack stack = new Stack();
          while (task != null) {
              stack.push(task);
              if (task == root) {
                  return stack;
              }
              task = task.getParent();
          }
          return null;
      }
      
      /**
       * Returns the next Task to be executed from the taskStack. The task is not
       * removed from the Stack.
       */
      public Task getNextExecuteTask() {
          try {
              return (Task)taskStack.peek();
          } catch (EmptyStackException esx) {
              return null;
          }
      }
      
      /**
       * If no root is specified, we will assume that the user wants to execute
       * the Task with no root. This is accomplished by using the Task parameter
       * as its own root.
       */
      public void execute(Task task) throws AntException {
          execute(task, task);
      }
      
      /**
       * This is the workhorse, however it has been made to be very simple. Given
       * the ability to specify a path between root and the target Task, we build
       * a trail of Tasks to connect the two. Next we execute each Task on the way
       * between the two Tasks. Once we arrive at the Task to execute, we execute
       * all of its chlidren.
       */
      public void execute(Task root, Task task) throws AntException {
          fireEngineStart();
          try {
              taskStack = getTaskStack(root, task);;
              if (taskStack == null) {
                  throw new AntException(
                                         "The execution root Task is not an ancestor of the execution Task.");
              }
              
              // Pop thru the stack and execute each Task we come across.
              while (!taskStack.isEmpty()) {
                  executeTask(taskStack);
              }
          } finally {
              fireEngineFinish();
          }
      }
      
      /**
       * A recursive routine that allows all Tasks in the stack to be executed. At
       * the same time, the stack may grow to include new Tasks.
       */
      protected void executeTask(Stack taskStack) throws AntException {
          Task task = (Task)taskStack.pop();
          
          fireTaskStart(task);
          try {
              // Add a new property holder for this task to the property stack. Note
              // that the parent of the new holder is the current stack head.
              if (task.isPropertyContainer()) {
                  if (propertyStack.isEmpty()) {
                      propertyStack.push(new HierarchicalHashtable());
                  } else {
                      propertyStack.push(new HierarchicalHashtable(
                                                                   (HierarchicalHashtable)propertyStack.peek()));
                  }
                  
              }
              
              // Allow Task to do whatever it may need to do before touching its
              // children.
              task.init(this);
              
              // Iterate the Task's children and execute any priority Tasks.
              Task[] tasks = task.getChildren();
              for (int i = 0, c = tasks.length; i < c; i++) {
                  if (tasks[i].getExecutionMode() == Task.EXECUTION_MODE_PRIORITY) {
                      taskStack.push(tasks[i]);
                      executeTask(taskStack);
                  }
              }
              
              // Allow the Task to validate.
              task.validate();
              
              // Finally, execute the Task.
              fireTaskExecute(task);
              task.execute(this);
              
              // We can discard the no londer needed property holder.
              if (task.isPropertyContainer()) {
                  propertyStack.pop();
              }
              
          } catch (AntException ax) {
              fireTaskException(task, ax);
          } finally {
              fireTaskFinish(task);
          }
      }
      
      /**
       * Causes an AntEvent to be generated and fired to all listeners.
       */
      public void message(Task task, String message) {
          fireTaskMessage(task, message);
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                            Listener Support                            //
      ////////////////////////////////////////////////////////////////////////////
      
      public synchronized void addAntEngineListener(AntEngineListener listener) {
          if (!listenerList.contains(listener)) {
              listenerList.add(listener);
          }
      }
      
      public synchronized void removeAntEngineListener(AntEngineListener listener) {
          if (listenerList.contains(listener)) {
              listenerList.remove(listener);
          }
      }
      
      protected synchronized void fireEngineStart() {
          if (engineLevel++ > 0) return;
          AntEvent e = new AntEvent(this);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).engineStart(e);
          }
          
      }
      
      protected synchronized void fireEngineFinish() {
          if (--engineLevel > 0) return;
          AntEvent e = new AntEvent(this);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).engineFinish(e);
          }
          
      }
      
      protected synchronized void fireTaskStart(Task task) {
          AntEvent e = new AntEvent(this, task);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).taskStart(e);
          }
          
      }
      
      protected synchronized void fireTaskExecute(Task task) {
          AntEvent e = new AntEvent(this, task);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).taskExecute(e);
          }
          
      }
      
      protected synchronized void fireTaskFinish(Task task) {
          AntEvent e = new AntEvent(this, task);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).taskFinish(e);
          }
          
      }
      
      protected synchronized void fireTaskMessage(Task task, String message) {
          AntEvent e = new AntEvent(this, task);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).taskMessage(e, message);
          }
          
      }
      
      protected synchronized void fireTaskException(Task task, AntException exception) {
          AntEvent e = new AntEvent(this, task);
          for (int i = 0; i < listenerList.size(); i++) {
              ((AntEngineListener)listenerList.get(i)).taskException(e, exception);
          }
          
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                        Property Support Methods                        //
      ////////////////////////////////////////////////////////////////////////////
      
      /**
       * This is the routine that will perform key substitution. Phrase will come
       * in as "src/${someparam}" and be converted to the appropriate "normalized"
       * string. I suppose while I'm doing this we should support phrases with
       * nested keys, such as "src/${build${token}}". Also, we should properly
       * handle cases where ${someparam} will evaluate to ${anotherparam}.
       * <p></p>
       * One thing that will be different from the Ant 1.2 mechanismoccurs when a
       * parameter value is not found. The substitution routine inserts it back in
       * the phrase unchanged. I have opted to insert a zero-length string
       * instead.
       * <p></p>
       * I should add a switch to the engine that will give the user the ability
       * to throw an exception if a key is not found. Pretty easy, except this
       * method is a strange place for an AntException to be thrown. Perhaps I
       * should use a RuntimeException instead...
       * <p></p>
       * A brief rundown on the logic here:
       *     I check for the first instances of a key prefix.
       *     If none found we return the phrase as is.
       *     If key prefix is found get location of next key prefix and suffix.
       *     If suffix is found first, we have found a key.
       *     If there is no suffix, we return the phrase.
       */
      static final String KEY_PREFIX = "${";
      static final String KEY_SUFFIX = "}";
      protected String substitute(String phrase) {
          StringBuffer sb = new StringBuffer(phrase);
          int startPoint = 0;
          while (startPoint >= 0 && startPoint < phrase.length()) {
              int pre1 = startPoint + phrase.substring(startPoint).indexOf(KEY_PREFIX);
              if (pre1 < 0) break;
              int suf1 = phrase.substring(pre1 + KEY_PREFIX.length()).indexOf(KEY_SUFFIX);
              if (suf1 < 0) break;
              suf1 = suf1 + pre1 + KEY_PREFIX.length();
              int pre2 = phrase.substring(pre1 + KEY_PREFIX.length()).indexOf(KEY_PREFIX);
              if (pre2 < 0) {
                  pre2 = phrase.length() + 1;
              } else {
                  pre2 = pre2 + pre1 + KEY_PREFIX.length();
              }
              
              if (suf1 < pre2) {
                  // we have found a token
                  String key = sb.substring(pre1 + KEY_PREFIX.length(), suf1);
                  sb.delete(pre1, suf1 + 1);
                  Object value = getPropertyValueNoSubstitution(key);
                  if (value != null) {
                      sb.insert(pre1, value.toString());
                  }
                  return substitute(sb.toString());
              }
              startPoint = pre2;
          }
          return sb.toString();
      }
      
      public List getPropertyNames() {
          if (propertyStack.isEmpty()) return new ArrayList();
          HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek();
          return hash.getPropertyNames();
      }
      
      public Object getPropertyValue(String name) {
          if (propertyStack.isEmpty()) return null;
          HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek();
          Object result = hash.getPropertyValue(name);
          if (result instanceof String) {
              return substitute((String)result);
          } else {
              return result;
          }
      }
      
      protected Object getPropertyValueNoSubstitution(String name) {
          if (propertyStack.isEmpty()) return null;
          HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek();
          return hash.getPropertyValue(name);
      }
      
      public void setPropertyValue(String name, Object value) {
          if (propertyStack.isEmpty()) return;
          HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek();
          hash.setPropertyValue(name, value);
      }
      
      public void removePropertyValue(String name) {
          if (propertyStack.isEmpty()) return;
          HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek();
          hash.remove(name);
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/BaseTask.java
  
  Index: BaseTask.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks;
  
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.tasks.Task;
  
  public abstract class BaseTask implements Task {
      
      protected Task parent;
      protected ArrayList children = new ArrayList();
      protected String taskName;
      protected Properties properties = new Properties();
      
      public BaseTask() {
          super();
      }
      
      public void init(TaskEngine engine) throws AntException {
      }
      
      public void execute(TaskEngine engine) throws AntException {
      }
      
  //    abstract public String getTaskTag();
      
      public void validate() throws AntException {}
      
      public String getFullyQualifiedName() {
          if (getParent() == null) return Task.NAME_SEPARATOR + taskName;
          return getParent().getFullyQualifiedName() + Task.NAME_SEPARATOR + taskName;
      }
      
      public int hashCode() {
          return getFullyQualifiedName().hashCode();
      }
      
      public String getTaskName() {
          return taskName;
      }
      
      public void setTaskName(String taskName) {
          this.taskName = taskName;
      }
      
      public int getExecutionMode() {
          return Task.EXECUTION_MODE_PRIORITY;
      }
      
      public String getAttributeValue(String name) {
          /**@todo: Implement this org.apache.ant.Task method*/
          throw new java.lang.UnsupportedOperationException("Method getAttributeValue() not yet implemented.");
      }
      
      public Task getParent() {
          return parent;
      }
      
      /**
       * We have to trust the developers to not screw up the hierarchy by changing
       * the parent of a Task when it is a child of another.
       */
      public void setParent(Task parent) {
          this.parent = parent;
      }
      
      public Task[] getChildren() {
          return (Task[])children.toArray(new Task[children.size()]);
      }
      
      public void addChild(Task task) {
          children.add(task);
          task.setParent(this);
      }
      
      public void removeChild(Task task) {
          children.remove(task);
      }
      
      public Task getRootTask() {
          if (getParent() != null) {
              return getParent().getRootTask();
          }
          return this;
      }
      
      protected Task getTaskByName(String taskName) {
          Task[] tasks = getChildren();
          for (int i = 0, c = tasks.length; i < c; i++) {
              if (tasks[i].getTaskName().equals(taskName)) {
                  return tasks[i];
              }
          }
          return null;
      }
      
      public Task getTask(String taskPath) {
          taskPath = taskPath.trim();
          int slashPos = taskPath.indexOf("/");
          
          // starts with '/'
          if (slashPos == 0) {
              return getRootTask().getTask(taskPath.substring(slashPos + 1));
          } else
              
              // starts with '../'
              if (taskPath.startsWith("../") || taskPath.equals("..")) {
                  return getParent().getTask(taskPath.substring(3));
              } else
                  
                  // starts with './'
                  if (taskPath.startsWith("./") || taskPath.equals(".")) {
                      return getTask(taskPath.substring(2));
                  } else
                      
                      // starts with 'some_level/'
                      if (slashPos > 0) {
                          String levelName = taskPath.substring(0, slashPos);
                          return getTaskByName(levelName).getTask(taskPath.substring(slashPos + 1));
                      }
          
          // there are no more directories; what remains is the name of the task
          if (slashPos < 0) {
              if (taskPath.length() == 0) return this;
              return getTaskByName(taskPath);
          }
          return null;
      }
      
      public boolean isPropertyContainer() {
          return false;
      }
      
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/Task.java
  
  Index: Task.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks;
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  
  /**
   * Task is the core interface for all structures that will be processed by the
   * TaskEngine.
   */
  public interface Task {
      
      public static final int EXECUTION_MODE_IMPLICIT = 0;
      public static final int EXECUTION_MODE_EXPLICIT = 1;
      public static final int EXECUTION_MODE_PRIORITY = 2;
      
      public static final char NAME_SEPARATOR = '/';
      
      /**
       * Causes the existing Task implementation to execute.
       */
      void execute(TaskEngine engine) throws AntException;
      
      /**
       * Called when the Task first gets "noticed" by the TaskEngine.
       */
      void init(TaskEngine engine) throws AntException;
      
      /**
       * Each Task should have the ability to validate its state. This would be
       * invoked by the TaskEngine prior to commencing an execution cycle.
       */
      void validate() throws AntException;
      
      /**
       * Just a simple name used to identify a Task. This name is only sufficient
       * for simple debugging and GUI output. It does not uniquely identify a
       * Task.
       *
       * @see #getFullyQualifiedName
       */
      String getTaskName();
      
      /**
       * Although this method seems to tie the concept of XML "tags", it is not
       * necessarily so. The tag name will serve as a general description of the
       * type of tag represented by this class instance. It is primarily used by
       * Tasks with sub-Tasks that are not assigned to a specific class
       * implementation.
       *
       * @see org.apache.ant.tasks.UnknownTask
       */
  //    String getTaskTag();
      
      /**
       * A mechanism for locating a task relative to the current task. This
       * navigation sceme will mimic a typical OS system. '..' will move back
       * a level in the Task tree. If taskPath begins with '/' then the root node
       * will be used as a starting point.
       * <p></p>
       * Returns null of no task is found at this location.
       */
      Task getTask(String taskPath);
      
      /**
       * Proceed backwards through the nodes until we come across the first Task
       * in the tree. This is the root Task.
       */
      Task getRootTask();
      
      /**
       * The "fully-qualified" name of a Task is the Task's name, prepended by its
       * parent's name, prepended by its parent's name, etc. This method may be
       * used by the Task's hashCode() method to calculate a hash that will
       * uniquely identify a Task.
       */
      String getFullyQualifiedName();
      
      /**
       * Determines whether this Task is executed whenever its parent is executed,
       * or if its execution must be specifically requested.
       * <p></p>
       * <dl><dt>EXECUTION_MODE_EXPLICIT</dt>
       * <dd>Requires interaction by the TaskEngine in order to execute.</dd>
       * <dt>EXECUTION_MODE_IMPLICIT</dt>
       * <dd>This Task is automatically executed when its parent is
       * executed.</dd>
       * <dt>EXECUTION_MODE_PRIORITY</dt>
       * <dd>These Tasks are executed prior to its parent's execution</dd></dl>
       * <p></p>
       * The default mode should probably be EXECUTION_MODE_IMPLICIT. In the
       * build domain of Ant, every Task below a Task will normally be executed.
       * The major exception to this is the Target. When a Project Task is
       * executed, all Target Tasks do <i>not</i> automatically fire, however all
       * Property Tasks <i>do</i> execute.
       */
      int getExecutionMode();
      
      /**
       * Determines whether a Task is suitable for holding property values.
       */
      boolean isPropertyContainer();
      
      /**
       * Each Task will hold its attributes in some manner. This method will allow
       * the Task implementation to return the value of its attribute.
       */
      String getAttributeValue(String name);
      
      /**
       * Returns this Task's parent Task. If this Task is the root Task, then this
       * method will return null.
       */
      Task getParent();
      
      /**
       * Sets the Task's parent.
       */
      void setParent(Task parent);
      
      /**
       * Returns the an array of Task objects that are subordinate to this Task.
       */
      Task[] getChildren();
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/build/Project.java
  
  Index: Project.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks.build;
  
  
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.tasks.BaseTask;
  import org.apache.ant.tasks.Task;
  
  public class Project extends BaseTask {
      
      private String def;
      private String basedir;
      
      public Project() {
          super();
      }
      
      public String getDefault() {
          return def;
      }
      
      public void setDefault(String newDefault) {
          def = newDefault;
      }
      
      public void setBasedir(String newBasedir) {
          basedir = newBasedir;
      }
      
      public String getBasedir() {
          return basedir;
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                        BaseTask Implementation                         //
      ////////////////////////////////////////////////////////////////////////////
      
      public void init(TaskEngine engine) throws AntException {
      }
      
      /**
       * Here is where we check and see if there are any Targets specified. We do
       * this by peeking into the known taskStack and checking to see if a Target
       * is next to be executed. If not, we add our default Target to the list.
       */
      public void execute(TaskEngine engine) throws AntException {
          // see if it is necessary to invoke the default task
          Task task = engine.getNextExecuteTask();
          if (task == null && getDefault() != null) {
              Task defaultTask = getTask(getDefault());
              if (defaultTask != null) {
                  engine.execute(defaultTask);
              }
          }
      }
      
      public boolean isPropertyContainer() {
          return true;
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/build/Target.java
  
  Index: Target.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks.build;
  
  
  
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.tasks.BaseTask;
  import org.apache.ant.tasks.Task;
  
  public class Target extends BaseTask {
      
      private String depends;
      private String ifCond;
      private String unlessCond;
      
      public Target() {
          super();
      }
      
      public String getIf() {
          return ifCond;
      }
      
      public void setIf(String condition) {
          this.ifCond = condition;
      }
      
      public String getUnless() {
          return unlessCond;
      }
      
      public void setUnless(String condition) {
          this.unlessCond = condition;
      }
      
      public void setDepends(String newDepends) {
          this.depends = newDepends;
      }
      
      public String getDepends() {
          return depends;
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                        BaseTask Implementation                         //
      ////////////////////////////////////////////////////////////////////////////
      
      public int getExecutionMode() {
          return Task.EXECUTION_MODE_EXPLICIT;
      }
      
      /**
       * Note that dependencies are executed before the task at hand.
       */
      public void execute(TaskEngine engine) throws AntException {
          if (getDepends() != null && getDepends().length() > 0) {
              Task dependencyTask = getTask(getDepends());
              if (dependencyTask == null) {
                  throw new AntException(
                                         "Cannot find dependency, " + getDepends() + " from Task.");
              }
              
              engine.execute(dependencyTask);
          }
      }
      
      public boolean isPropertyContainer() {
          return true;
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/util/Property.java
  
  Index: Property.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks.util;
  
  
  
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.tasks.BaseTask;
  
  public class Property extends BaseTask {
      
      private String value;
      private String name;
      
      public Property() {
          super();
      }
      
      public String getValue() {
          return value;
      }
      
      public void setValue(String value) {
          this.value = value;
      }
      
      public void setName(String name) {
          this.name = name;
      }
      
      public String getName() {
          return name;
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                        BaseTask Implementation                         //
      ////////////////////////////////////////////////////////////////////////////
      
      public void execute(TaskEngine engine) throws AntException {
          if (getParent() == null) {
              throw new AntException("A Property Task must have a parent Task.");
          }
          engine.setPropertyValue(getName(), getValue());
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/tasks/util/PropertyDump.java
  
  Index: PropertyDump.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.tasks.util;
  
  
  
  import java.util.*;
  import org.apache.ant.AntException;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.tasks.BaseTask;
  
  public class PropertyDump extends BaseTask {
      
      public PropertyDump() {
          super();
      }
      
      ////////////////////////////////////////////////////////////////////////////
      //                        BaseTask Implementation                         //
      ////////////////////////////////////////////////////////////////////////////
      
      public void execute(TaskEngine engine) throws AntException {
          List propNames = engine.getPropertyNames();
          for (Iterator i = propNames.iterator(); i.hasNext();) {
              String name = (String)i.next();
              String value = engine.getPropertyValue(name).toString();
              engine.message(this, name + " = " + value);
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/proposal/frantic/src/org/apache/ant/test/SimpleTest.java
  
  Index: SimpleTest.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999, 2000 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    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
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    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", "Tomcat", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.ant.test;
  
  
  
  
  import org.apache.ant.AntException;
  import org.apache.ant.engine.DefaultEngineListener;
  import org.apache.ant.engine.TaskEngine;
  import org.apache.ant.engine.TaskEngineImpl;
  import org.apache.ant.tasks.Task;
  import org.apache.ant.tasks.build.Project;
  import org.apache.ant.tasks.build.Target;
  import org.apache.ant.tasks.util.Property;
  import org.apache.ant.tasks.util.PropertyDump;
  
  public class SimpleTest {
      
      Task target;
      
      public SimpleTest() {
          try {
              Task rootTask = buildProject();
              TaskEngine engine = TaskEngineImpl.getTaskEngine();
              engine.addAntEngineListener(new DefaultEngineListener());
              engine.execute(rootTask, target);
          } catch (AntException ax) {
              ax.printStackTrace(System.err);
          }
      }
      
      protected Task buildProject() {
          Project project = new Project();
          project.setTaskName("project");
          project.setBasedir("somedir");
          project.setDefault("build");
          
          Property property1 = new Property();
          property1.setTaskName("prop1");
          property1.setName("basedir");
          property1.setValue("/org/apache");
          project.addChild(property1);
          
          Property property2 = new Property();
          property2.setTaskName("prop2");
          property2.setName("dir1");
          property2.setValue("${basedir}/ant");
          project.addChild(property2);
          
          Target target1 = new Target();
          target1.setTaskName("clean");
          project.addChild(target1);
          
          PropertyDump pd = new PropertyDump();
          pd.setTaskName("dump");
          target1.addChild(pd);
          
          Target target2 = new Target();
          target2.setTaskName("prepare");
          target2.setDepends("../clean");
          project.addChild(target2);
          
          Property property3 = new Property();
          property3.setTaskName("prop3");
          property3.setName("dir2");
          property3.setValue("${dir1}/tasks");
          target2.addChild(property3);
          
          Target target3 = new Target();
          target3.setTaskName("build");
          target3.setDepends("../prepare");
          project.addChild(target3);
          
          Property property4 = new Property();
          property4.setTaskName("prop4");
          property4.setName("dir3");
          property4.setValue("r2}");
          target3.addChild(property4);
          
          Property property5 = new Property();
          property5.setTaskName("prop5");
          property5.setName("dir4");
          property5.setValue("${di${dir3}");
          target3.addChild(property5);
          
          target = target2;
          
          return project;
      }
      
      public static void main(String[] args) {
          SimpleTest simpleTest1 = new SimpleTest();
      }
  }
  
  
  

Mime
View raw message