Author: trygvis
Date: Thu Sep 22 14:57:56 2005
New Revision: 291024

URL: http://svn.apache.org/viewcvs?rev=291024&view=rev
Log:
Fixing 36287: "Generalize ProcessDestroyer"
Patch by Niklas Gustavsson.
o Making the ProcessDestroyer an interface and and moving all the code to
  ShutdownHookProcessDestroyer. 
o Adding myself as a developer.

Added:
    
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
   (with props)
Modified:
    jakarta/commons/sandbox/exec/trunk/pom.xml
    
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
    
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
    
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java

Modified: jakarta/commons/sandbox/exec/trunk/pom.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/pom.xml?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/pom.xml (original)
+++ jakarta/commons/sandbox/exec/trunk/pom.xml Thu Sep 22 14:57:56 2005
@@ -12,10 +12,10 @@
       <version>1.0.4</version>
     </dependency>
     <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>3.8.1</version>
-        <scope>test</scope>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>3.8.1</version>
+      <scope>test</scope>
     </dependency>
   </dependencies>
   <developers>
@@ -26,6 +26,13 @@
       <organization>Apache</organization>
       <timezone>+10</timezone>
     </developer>
+    <developer>
+      <id>trygvis</id>
+      <name>Trygve Laugst&oslash;</name>
+      <email>trygvis AT apache DOT org</email>
+      <organization>Apache</organization>
+      <timezone>+1</timezone>
+    </developer>
   </developers>
   <contributors>
     <contributor>
@@ -100,4 +107,3 @@
     <url>http://issues.apache.org/bugzilla/</url>
   </issueManagement>
 </project>
-

Modified: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
 (original)
+++ 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
 Thu Sep 22 14:57:56 2005
@@ -58,7 +58,7 @@
             .createVMLauncher();
 
     /** Used to destroy processes when the VM exits. */
-    private static ProcessDestroyer processDestroyer = new ProcessDestroyer();
+    private static ProcessDestroyer processDestroyer = new 
ShutdownHookProcessDestroyer();
 
     /**
      * ByteArrayOutputStream#toString doesn't seem to work reliably on OS/390,
@@ -216,14 +216,11 @@
      *            the environment for the command
      * @param dir
      *            the working directory for the command
-     * @param useVM
-     *            use the built-in exec command for JDK 1.3 if available.
      * @return the process started
      * @throws IOException
      *             forwarded from the particular launcher used
      */
-    public static Process launch(final CommandLine command,
-            final Environment env, final File dir)
+    public static Process launch(final CommandLine command, final Environment 
env, final File dir)
             throws IOException {
         CommandLauncher launcher = vmLauncher;
 
@@ -311,7 +308,7 @@
         }
 
         OutputStream dummyOut = new OutputStream() {
-            public void write(final int b) throws IOException {
+            public void write(final int b) {
             }
         };
 

Modified: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
 (original)
+++ 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
 Thu Sep 22 14:57:56 2005
@@ -17,160 +17,36 @@
 
 package org.apache.commons.exec;
 
-import java.util.Enumeration;
-import java.util.Vector;
-
 /**
- * Destroys all registered <code>Process</code>es when the VM exits.
+ * Destroys all registered @link java.lang.Process after a certain event,
+ * typically when the VM exits 
+ * (@see org.apache.commons.exec.ShutdownHookProcessDestroyer).
  */
-class ProcessDestroyer implements Runnable {
-
-       private Vector processes = new Vector();
-
-       private ProcessDestroyerImpl destroyProcessThread = null;
-
-       // whether or not this ProcessDestroyer has been registered as a
-       // shutdown hook
-       private boolean added = false;
-
-       // whether or not this ProcessDestroyer is currently running as
-       // shutdown hook
-       private boolean running = false;
-
-       private class ProcessDestroyerImpl extends Thread {
-               private boolean shouldDestroy = true;
-
-               public ProcessDestroyerImpl() {
-                       super("ProcessDestroyer Shutdown Hook");
-               }
-
-               public void run() {
-                       if (shouldDestroy) {
-                               ProcessDestroyer.this.run();
-                       }
-               }
-
-               public void setShouldDestroy(final boolean shouldDestroy) {
-                       this.shouldDestroy = shouldDestroy;
-               }
-       }
-
-       /**
-        * Constructs a <code>ProcessDestroyer</code> and obtains
-        * <code>Runtime.addShutdownHook()</code> and
-        * <code>Runtime.removeShutdownHook()</code> through reflection. The
-        * ProcessDestroyer manages a list of processes to be destroyed when 
the VM
-        * exits. If a process is added when the list is empty, this
-        * <code>ProcessDestroyer</code> is registered as a shutdown hook. If
-        * removing a process results in an empty list, the
-        * <code>ProcessDestroyer</code> is removed as a shutdown hook.
-        */
-       public ProcessDestroyer() {
-       }
-
-       /**
-        * Registers this <code>ProcessDestroyer</code> as a shutdown hook, uses
-        * reflection to ensure pre-JDK 1.3 compatibility.
-        */
-       private void addShutdownHook() {
-               if (!running) {
-                       destroyProcessThread = new ProcessDestroyerImpl();
-                       
Runtime.getRuntime().addShutdownHook(destroyProcessThread);
-                       added = true;
-               }
-       }
+public interface ProcessDestroyer {
 
        /**
-        * Removes this <code>ProcessDestroyer</code> as a shutdown hook, uses
-        * reflection to ensure pre-JDK 1.3 compatibility
-        */
-       private void removeShutdownHook() {
-               if (added && !running) {
-                       boolean removed = 
Runtime.getRuntime().removeShutdownHook(
-                                       destroyProcessThread);
-                       if (!removed) {
-                               // System.err.println("Could not remove 
shutdown hook");
-                               // TODO should we just ignore?
-                       }
-                       /*
-                        * start the hook thread, a unstarted thread may not be 
eligible for
-                        * garbage collection Cf.: 
http://developer.java.sun.com/developer/
-                        * bugParade/bugs/4533087.html
-                        */
-
-                       destroyProcessThread.setShouldDestroy(false);
-                       destroyProcessThread.start();
-                       // this should return quickly, since it basically is a 
NO-OP.
-                       try {
-                               destroyProcessThread.join(20000);
-                       } catch (InterruptedException ie) {
-                               // the thread didn't die in time
-                               // it should not kill any processes unexpectedly
-                       }
-                       destroyProcessThread = null;
-                       added = false;
-               }
-       }
-
-       /**
-        * Returns whether or not the ProcessDestroyer is registered as as 
shutdown
-        * hook
-        * 
-        * @return true if this is currently added as shutdown hook
-        */
-       public boolean isAddedAsShutdownHook() {
-               return added;
-       }
-
-       /**
-        * Returns <code>true</code> if the specified <code>Process</code> was
-        * successfully added to the list of processes to destroy upon VM exit.
+        * Returns <code>true</code> if the specified 
+        * @link java.lang.Process was
+        * successfully added to the list of processes to be destroy.
         * 
         * @param process
-        *            the process to add
-        * @return <code>true</code> if the specified <code>Process</code> was
-        *         successfully added
-        */
-       public boolean add(final Process process) {
-               synchronized (processes) {
-                       // if this list is empty, register the shutdown hook
-                       if (processes.size() == 0) {
-                               addShutdownHook();
-                       }
-                       processes.addElement(process);
-                       return processes.contains(process);
-               }
-       }
-
-       /**
-        * Returns <code>true</code> if the specified <code>Process</code> was
-        * successfully removed from the list of processes to destroy upon VM 
exit.
+        *      the process to add
+        * @return <code>true</code> if the specified 
+        *              @link java.lang.Process was
+        *      successfully added
+        */
+       boolean add(Process process);
+       
+       /**
+        * Returns <code>true</code> if the specified 
+        * @link java.lang.Process was
+        * successfully removed from the list of processes to be destroy.
         * 
         * @param process
         *            the process to remove
-        * @return <code>true</code> if the specified <code>Process</code> was
-        *         successfully removed
-        */
-       public boolean remove(final Process process) {
-               synchronized (processes) {
-                       boolean processRemoved = 
processes.removeElement(process);
-                       if (processRemoved && processes.size() == 0) {
-                               removeShutdownHook();
-                       }
-                       return processRemoved;
-               }
-       }
-
-       /**
-        * Invoked by the VM when it is exiting.
+        * @return <code>true</code> if the specified 
+        *              @link java.lang.Process was
+        *      successfully removed
         */
-       public void run() {
-               synchronized (processes) {
-                       running = true;
-                       Enumeration e = processes.elements();
-                       while (e.hasMoreElements()) {
-                               ((Process) e.nextElement()).destroy();
-                       }
-               }
-       }
+       boolean remove(Process process);
 }

Added: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java?rev=291024&view=auto
==============================================================================
--- 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
 (added)
+++ 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
 Thu Sep 22 14:57:56 2005
@@ -0,0 +1,178 @@
+/* 
+ * Copyright 2005  The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package org.apache.commons.exec;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * Destroys all registered <code>Process</code>es when the VM exits.
+ */
+public class ShutdownHookProcessDestroyer implements ProcessDestroyer, 
Runnable {
+
+       private final Vector processes = new Vector();
+
+       private ProcessDestroyerImpl destroyProcessThread = null;
+
+    /**
+     * Whether or not this ProcessDestroyer has been registered as a shutdown 
hook
+     */
+       private boolean added = false;
+
+    /**
+     * Whether or not this ProcessDestroyer is currently running as shutdown 
hook
+     */
+       private boolean running = false;
+
+       private class ProcessDestroyerImpl extends Thread {
+               private boolean shouldDestroy = true;
+
+               public ProcessDestroyerImpl() {
+                       super("ProcessDestroyer Shutdown Hook");
+               }
+
+               public void run() {
+                       if (shouldDestroy) {
+                               ShutdownHookProcessDestroyer.this.run();
+                       }
+               }
+
+               public void setShouldDestroy(final boolean shouldDestroy) {
+                       this.shouldDestroy = shouldDestroy;
+               }
+       }
+
+       /**
+        * Constructs a <code>ProcessDestroyer</code> and obtains
+        * <code>Runtime.addShutdownHook()</code> and
+        * <code>Runtime.removeShutdownHook()</code> through reflection. The
+        * ProcessDestroyer manages a list of processes to be destroyed when 
the VM
+        * exits. If a process is added when the list is empty, this
+        * <code>ProcessDestroyer</code> is registered as a shutdown hook. If
+        * removing a process results in an empty list, the
+        * <code>ProcessDestroyer</code> is removed as a shutdown hook.
+        */
+       public ShutdownHookProcessDestroyer() {
+       }
+
+       /**
+        * Registers this <code>ProcessDestroyer</code> as a shutdown hook, uses
+        * reflection to ensure pre-JDK 1.3 compatibility.
+        */
+       private void addShutdownHook() {
+               if (!running) {
+                       destroyProcessThread = new ProcessDestroyerImpl();
+                       
Runtime.getRuntime().addShutdownHook(destroyProcessThread);
+                       added = true;
+               }
+       }
+
+       /**
+        * Removes this <code>ProcessDestroyer</code> as a shutdown hook, uses
+        * reflection to ensure pre-JDK 1.3 compatibility
+        */
+       private void removeShutdownHook() {
+               if (added && !running) {
+                       boolean removed = 
Runtime.getRuntime().removeShutdownHook(
+                                       destroyProcessThread);
+                       if (!removed) {
+                               // System.err.println("Could not remove 
shutdown hook");
+                               // TODO should we just ignore?
+                       }
+                       /*
+                        * start the hook thread, a unstarted thread may not be 
eligible for
+                        * garbage collection Cf.: 
http://developer.java.sun.com/developer/
+                        * bugParade/bugs/4533087.html
+                        */
+
+                       destroyProcessThread.setShouldDestroy(false);
+                       destroyProcessThread.start();
+                       // this should return quickly, since it basically is a 
NO-OP.
+                       try {
+                               destroyProcessThread.join(20000);
+                       } catch (InterruptedException ie) {
+                               // the thread didn't die in time
+                               // it should not kill any processes unexpectedly
+                       }
+                       destroyProcessThread = null;
+                       added = false;
+               }
+       }
+
+       /**
+        * Returns whether or not the ProcessDestroyer is registered as as 
shutdown
+        * hook
+        * 
+        * @return true if this is currently added as shutdown hook
+        */
+       public boolean isAddedAsShutdownHook() {
+               return added;
+       }
+
+       /**
+        * Returns <code>true</code> if the specified <code>Process</code> was
+        * successfully added to the list of processes to destroy upon VM exit.
+        * 
+        * @param process
+        *            the process to add
+        * @return <code>true</code> if the specified <code>Process</code> was
+        *         successfully added
+        */
+       public boolean add(final Process process) {
+               synchronized (processes) {
+                       // if this list is empty, register the shutdown hook
+                       if (processes.size() == 0) {
+                               addShutdownHook();
+                       }
+                       processes.addElement(process);
+                       return processes.contains(process);
+               }
+       }
+
+       /**
+        * Returns <code>true</code> if the specified <code>Process</code> was
+        * successfully removed from the list of processes to destroy upon VM 
exit.
+        * 
+        * @param process
+        *            the process to remove
+        * @return <code>true</code> if the specified <code>Process</code> was
+        *         successfully removed
+        */
+       public boolean remove(final Process process) {
+               synchronized (processes) {
+                       boolean processRemoved = 
processes.removeElement(process);
+                       if (processRemoved && processes.size() == 0) {
+                               removeShutdownHook();
+                       }
+                       return processRemoved;
+               }
+       }
+
+       /**
+        * Invoked by the VM when it is exiting.
+        */
+       public void run() {
+               synchronized (processes) {
+                       running = true;
+                       Enumeration e = processes.elements();
+                       while (e.hasMoreElements()) {
+                               ((Process) e.nextElement()).destroy();
+                       }
+               }
+       }
+}

Propchange: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
URL: 
http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
 (original)
+++ 
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
 Thu Sep 22 14:57:56 2005
@@ -150,4 +150,4 @@
 
         return key.equals(envVar.key) && value.equals(envVar.value);
     }
-}
\ No newline at end of file
+}



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

Reply via email to