HI,

attached is a tentative patch that allow a Task object to run
asychronously. I have tested the patch on Solaris and win2k and
everything works fine (without breaking backward compatibility).

To use the functionality, you just have to add to a task the spawn
attribute, e.g.:

<exec dir="c:/src/jakarta-tomcat-5/build/bin/" executable="sh" spawn="true">

Since some task needs a couple of seconds to start/stop, I also added a
spawnWaitUntil attribute where you can set the time required before
moving to the next Task.

I did no wrote a <spawn> task because I think the functionality should
be available to every Task. For now I did not add the functionality to
Java, Javac, Jar.

Let me know what you think. At least I have something use when <gump>ing tomcat :-)

Thanks,

-- Jeanfrancois

Index: src/main/org/apache/tools/ant/Task.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/Task.java,v
retrieving revision 1.36
diff -u -r1.36 Task.java
--- src/main/org/apache/tools/ant/Task.java     22 Aug 2002 17:32:21 -0000      
1.36
+++ src/main/org/apache/tools/ant/Task.java     21 Jan 2003 20:14:49 -0000
@@ -119,6 +119,19 @@
      * its type.
      */
     private boolean invalid;
+    
+    /**
+     * Spawn a new process without waiting for the process to comnplete
+     * This attribute implements asynchronous task behaviour.
+     */
+    protected boolean spawnProcess = false;
+    
+    
+    /**
+     * Let a spawning task start properly before moving to another task.
+     */
+    protected long spawnWaitUntil = 500;
+    
 
     /** Sole constructor. */
     public Task() {
@@ -194,6 +207,44 @@
      */
     public String getDescription() {
         return description;
+    }
+    
+    
+    /**
+     * Launch this execution without waiting for the process to complete.
+     * @param spawnProcess true if exec should launch the process and move to 
+     * the next task
+     *                     false if exec should wait before moving to the next 
+     *  process (false by default)
+     */
+    public void setSpawn(boolean spawnProcess){
+        this.spawnProcess = spawnProcess;
+    }
+    
+    /**
+     * Return true if the process can be spawned.
+     * @return true if the process can be spawned.
+     */
+    public boolean getSpawn(){
+        return spawnProcess;
+    }
+    
+    /**
+     * Time required before moving to the next process.
+     * @param spawnWaitUntil time, in milisecond, before executing the next 
+     * process.
+     */
+    public void setSpawnWaitUntil(long spawnWaitUntil){
+        this.spawnWaitUntil = spawnWaitUntil;
+    }    
+    
+    /**
+     * Return the time before a process will be launched when spawn 
+     * attribute is set.
+     * @return  the time before a process will be launched
+     */
+     public long getSpawnWaitUntil(){
+        return spawnWaitUntil;
     }
 
     /**
Index: src/main/org/apache/tools/ant/taskdefs/ExecTask.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/ExecTask.java,v
retrieving revision 1.42
diff -u -r1.42 ExecTask.java
--- src/main/org/apache/tools/ant/taskdefs/ExecTask.java        25 Jul 2002 
15:21:04 -0000      1.42
+++ src/main/org/apache/tools/ant/taskdefs/ExecTask.java        21 Jan 2003 
20:14:49 -0000
@@ -97,7 +97,8 @@
     private String resultProperty;
     private boolean failIfExecFails = true;
     private boolean append = false;
-
+       
+    
     /**
      * Controls whether the VM (1.3 and above) is used to execute the
      * command
@@ -306,6 +307,9 @@
         exe.setAntRun(getProject());
         exe.setWorkingDirectory(dir);
         exe.setVMLauncher(vmLauncher);
+        exe.setSpawnProcess(getSpawn());
+        exe.setSpawnWaitUntil(getSpawnWaitUntil());
+
         String[] environment = env.getVariables();
         if (environment != null) {
             for (int i = 0; i < environment.length; i++) {
Index: src/main/org/apache/tools/ant/taskdefs/Execute.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Execute.java,v
retrieving revision 1.48
diff -u -r1.48 Execute.java
--- src/main/org/apache/tools/ant/taskdefs/Execute.java 27 Sep 2002 08:18:51 
-0000      1.48
+++ src/main/org/apache/tools/ant/taskdefs/Execute.java 21 Jan 2003 20:14:50 
-0000
@@ -73,6 +73,7 @@
  *
  * @author [EMAIL PROTECTED]
  * @author <a href="mailto:[EMAIL PROTECTED]">Jeff Tulley</a>
+ * @author [EMAIL PROTECTED]
  *
  * @since Ant 1.2
  *
@@ -91,6 +92,17 @@
     private File workingDirectory = null;
     private Project project = null;
     private boolean newEnvironment = false;
+    
+    /**
+     * Spawn a new process without waiting for the process to comnplete
+     * This attribute implements asynchronous task behaviour.
+     */
+    private boolean spawnProcess = false;
+    
+    /**
+     * Let a spawning task start properly before moving to another task.
+     */
+    private long spawnWaitUntil = 500;
 
     /** Controls whether the VM is used to launch commands, where possible */
     private boolean useVMLauncher = true;
@@ -396,6 +408,26 @@
     public void setVMLauncher(boolean useVMLauncher) {
         this.useVMLauncher = useVMLauncher;
     }
+    
+    /**
+     * Launch this execution without waiting for the process to complete.
+     * @param spawnProcess true if exec should launch the process and move to 
+     * the next task
+     *                     false if exec should wait before moving to the next 
+     *  process (false by default)
+     */
+    public void setSpawnProcess(boolean spawnProcess){
+        this.spawnProcess = spawnProcess;
+    }
+    
+    /**
+     * Time required before moving to the next process.
+     * @param spawnWaitUntil time, in milisecond, before executing the next 
+     * process.
+     */
+    public void setSpawnWaitUntil(long spawnWaitUntil){
+        this.spawnWaitUntil = spawnWaitUntil;
+    }
 
     /**
      * Creates a process that runs a command.
@@ -431,11 +463,14 @@
         final Process process = launch(project, getCommandline(),
                                        getEnvironment(), workingDirectory,
                                        useVMLauncher);
-
+                                     
         try {
             streamHandler.setProcessInputStream(process.getOutputStream());
             streamHandler.setProcessOutputStream(process.getInputStream());
             streamHandler.setProcessErrorStream(process.getErrorStream());
+            if ( spawnProcess ){
+                streamHandler.setWaitUntilStoping(spawnWaitUntil);
+            }
         } catch (IOException e) {
             process.destroy();
             throw e;
@@ -449,8 +484,22 @@
         if (watchdog != null) {
             watchdog.start(process);
         }
-        waitFor(process);
-
+        
+        // Do not use the Process.waitFor since it doesn't work the same way
+        // depending on the patform it run on.
+        if ( spawnProcess ) {
+            try{
+                // Give the asych task a chance to start before moving on.
+                synchronized(this){
+                    wait(spawnWaitUntil);
+                }
+            } catch (java.lang.Exception ex){
+                ex.printStackTrace();
+            }
+        } else {
+            waitFor(process);
+        }
+        
         // remove the process to the list of those to destroy if the VM exits
         //
         processDestroyer.remove(process);
@@ -458,14 +507,16 @@
         if (watchdog != null) {
             watchdog.stop();
         }
+
         streamHandler.stop();
         if (watchdog != null) {
             watchdog.checkException();
         }
+        
         return getExitValue();
     }
-
-    protected void waitFor(Process process) {
+    
+    protected void waitFor(final Process process) {
         try {
             process.waitFor();
             setExitValue(process.exitValue());
Index: src/main/org/apache/tools/ant/taskdefs/ExecuteStreamHandler.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/ExecuteStreamHandler.java,v
retrieving revision 1.5
diff -u -r1.5 ExecuteStreamHandler.java
--- src/main/org/apache/tools/ant/taskdefs/ExecuteStreamHandler.java    25 Jul 
2002 15:21:04 -0000      1.5
+++ src/main/org/apache/tools/ant/taskdefs/ExecuteStreamHandler.java    21 Jan 
2003 20:14:50 -0000
@@ -98,4 +98,10 @@
      * Stop handling of the streams - will not be restarted.
      */
     void stop();
+    
+    
+    /**
+     * Wait this value before stoping thr process.
+     */
+    void setWaitUntilStoping(long waitUntil);
 }
Index: src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java,v
retrieving revision 1.13
diff -u -r1.13 JikesOutputParser.java
--- src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java       25 Jul 
2002 15:21:05 -0000      1.13
+++ src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java       21 Jan 
2003 20:14:50 -0000
@@ -203,4 +203,13 @@
     protected boolean getErrorFlag() {
         return errorFlag;
     }
+    
+    /** 
+     * Wait this value before stoping thr process.
+     */
+    public void setWaitUntilStoping(long waitUntil) {
+        // Not used
+    }    
+    
+    
 }
Index: src/main/org/apache/tools/ant/taskdefs/ProcessDestroyer.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/ProcessDestroyer.java,v
retrieving revision 1.4
diff -u -r1.4 ProcessDestroyer.java
--- src/main/org/apache/tools/ant/taskdefs/ProcessDestroyer.java        15 Apr 
2002 13:36:17 -0000      1.4
+++ src/main/org/apache/tools/ant/taskdefs/ProcessDestroyer.java        21 Jan 
2003 20:14:50 -0000
@@ -126,4 +126,5 @@
             }
         }
     }
+    
 }
Index: src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java,v
retrieving revision 1.7
diff -u -r1.7 PumpStreamHandler.java
--- src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java       25 Jul 
2002 15:21:05 -0000      1.7
+++ src/main/org/apache/tools/ant/taskdefs/PumpStreamHandler.java       21 Jan 
2003 20:14:50 -0000
@@ -74,6 +74,8 @@
 
     private OutputStream out, err;
 
+    private long waitUntil = 0;
+    
     public PumpStreamHandler(OutputStream out, OutputStream err) {
         this.out = out;
         this.err = err;
@@ -99,6 +101,10 @@
 
     public void setProcessInputStream(OutputStream os) {
     }
+    
+    public void setWaitUntilStoping(long waitUntil){
+        this.waitUntil = waitUntil;
+    }
 
 
     public void start() {
@@ -108,12 +114,9 @@
 
 
     public void stop() {
-        try {
-            inputThread.join();
-        } catch (InterruptedException e) {}
-        try {
-            errorThread.join();
-        } catch (InterruptedException e) {}
+        join(inputThread);
+        join(errorThread);
+ 
         try {
             err.flush();
         } catch (IOException e) {}
@@ -136,6 +139,16 @@
 
     protected void createProcessErrorPump(InputStream is, OutputStream os) {
         errorThread = createPump(is, os);
+    }
+    
+    private void join(Thread thread){
+        try {
+            if (waitUntil > 0) {
+                thread.join(waitUntil);
+            } else {
+                thread.join();
+            }
+        } catch (InterruptedException e) {}        
     }
 
 
Index: src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCreateTask.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCreateTask.java,v
retrieving revision 1.12
diff -u -r1.12 CCMCreateTask.java
--- src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCreateTask.java      
25 Jul 2002 15:21:12 -0000      1.12
+++ src/main/org/apache/tools/ant/taskdefs/optional/ccm/CCMCreateTask.java      
21 Jan 2003 20:14:50 -0000
@@ -362,6 +362,13 @@
         } // end of try-catch
 
     }
+    
+    /** 
+     * Wait this value before stoping thr process.
+     */
+    public void setWaitUntilStoping(long waitUntil) {
+        // Not used
+    } 
 
 }
 
Index: 
src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java,v
retrieving revision 1.20
diff -u -r1.20 BorlandDeploymentTool.java
--- 
src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java  
    8 Nov 2002 16:37:44 -0000       1.20
+++ 
src/main/org/apache/tools/ant/taskdefs/optional/ejb/BorlandDeploymentTool.java  
    21 Jan 2003 20:14:51 -0000
@@ -536,5 +536,12 @@
             log("[java2iiop] " + s, Project.MSG_DEBUG);
         } // end of if ()
     }
+    
+    /** 
+     * Wait this value before stoping thr process.
+     */
+    public void setWaitUntilStoping(long waitUntil) {
+        // Not used
+    } 
 }
 
Index: 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MAuditStreamHandler.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/metamata/MAuditStreamHandler.java,v
retrieving revision 1.7
diff -u -r1.7 MAuditStreamHandler.java
--- 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MAuditStreamHandler.java
   25 Jul 2002 15:21:17 -0000      1.7
+++ 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MAuditStreamHandler.java
   21 Jan 2003 20:14:51 -0000
@@ -255,4 +255,11 @@
         violations.addElement(entry);
     }
 
+    
+    /** 
+     * Wait this value before stoping thr process.
+     */
+    public void setWaitUntilStoping(long waitUntil) {
+        // Not used
+    } 
 }
Index: 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MMetricsStreamHandler.java
===================================================================
RCS file: 
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/metamata/MMetricsStreamHandler.java,v
retrieving revision 1.9
diff -u -r1.9 MMetricsStreamHandler.java
--- 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MMetricsStreamHandler.java
 25 Jul 2002 15:21:17 -0000      1.9
+++ 
src/main/org/apache/tools/ant/taskdefs/optional/metamata/MMetricsStreamHandler.java
 21 Jan 2003 20:14:52 -0000
@@ -354,6 +354,13 @@
             return indent;
         }
     }
+        
+    /** 
+     * Wait this value before stoping thr process.
+     */
+    public void setWaitUntilStoping(long waitUntil) {
+        // Not used
+    } 
 }
 
 class MetricsElement {
@@ -441,5 +448,8 @@
         }
         return new MetricsElement(indent, name, metrics);
     }
+    
+
+    
 }
 

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to