You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tr...@apache.org on 2005/09/22 23:58:05 UTC

svn commit: r291024 - in /jakarta/commons/sandbox/exec/trunk: ./ src/main/java/org/apache/commons/exec/ src/main/java/org/apache/commons/exec/environment/

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: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org