You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by br...@apache.org on 2005/08/05 14:22:17 UTC
svn commit: r230452 [2/3] - in /jakarta/commons/sandbox/exec/trunk: ./ src/
src/bin/ src/main/ src/main/java/ src/main/java/org/
src/main/java/org/apache/ src/main/java/org/apache/commons/
src/main/java/org/apache/commons/exec/ src/main/java/org/apache...
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,51 @@
+/*
+ * 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.io.IOException;
+
+/**
+ * Logs standard output and error of a subprocess to the log system of ant.
+ */
+public class LogStreamHandler extends PumpStreamHandler {
+
+ /**
+ * Creates log stream handler.
+ *
+ * @param outlevel
+ * the loglevel used to log standard output
+ * @param errlevel
+ * the loglevel used to log standard error
+ */
+ public LogStreamHandler(final int outlevel, final int errlevel) {
+ super(new LogOutputStream(outlevel), new LogOutputStream(errlevel));
+ }
+
+ /**
+ * Stop the log stream handler.
+ */
+ public void stop() {
+ super.stop();
+ try {
+ getErr().close();
+ getOut().close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/LogStreamHandler.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,243 @@
+/*
+ * 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.Locale;
+
+/**
+ * Condition that tests the OS type.
+ */
+public final class OS {
+ private static final String FAMILY_OS_400 = "os/400";
+
+ private static final String FAMILY_Z_OS = "z/os";
+
+ private static final String FAMILY_WIN9X = "win9x";
+
+ private static final String FAMILY_OPENVMS = "openvms";
+
+ private static final String FAMILY_UNIX = "unix";
+
+ private static final String FAMILY_TANDEM = "tandem";
+
+ private static final String FAMILY_MAC = "mac";
+
+ private static final String FAMILY_DOS = "dos";
+
+ private static final String FAMILY_NETWARE = "netware";
+
+ private static final String FAMILY_OS_2 = "os/2";
+
+ private static final String FAMILY_WINDOWS = "windows";
+
+ private static final String OS_NAME = System.getProperty("os.name")
+ .toLowerCase(Locale.US);
+
+ private static final String OS_ARCH = System.getProperty("os.arch")
+ .toLowerCase(Locale.US);
+
+ private static final String OS_VERSION = System.getProperty("os.version")
+ .toLowerCase(Locale.US);
+
+ private static final String PATH_SEP = System.getProperty("path.separator");
+
+ /**
+ * Default constructor
+ */
+ private OS() {
+ }
+
+ /**
+ * Determines if the OS on which Ant is executing matches the given OS
+ * family. * Possible values:<br />
+ * <ul>
+ * <li>dos</li>
+ * <li>mac</li>
+ * <li>netware</li>
+ * <li>os/2</li>
+ * <li>tandem</li>
+ * <li>unix</li>
+ * <li>windows</li>
+ * <li>win9x</li>
+ * <li>z/os</li>
+ * <li>os/400</li>
+ * </ul>
+ *
+ * @param family
+ * the family to check for
+ * @return true if the OS matches
+ */
+ private static boolean isFamily(final String family) {
+ return isOs(family, null, null, null);
+ }
+
+ public static boolean isFamilyDOS() {
+ return isFamily(FAMILY_DOS);
+ }
+
+ public static boolean isFamilyMac() {
+ return isFamily(FAMILY_MAC);
+ }
+
+ public static boolean isFamilyNetware() {
+ return isFamily(FAMILY_NETWARE);
+ }
+
+ public static boolean isFamilyOS2() {
+ return isFamily(FAMILY_OS_2);
+ }
+
+ public static boolean isFamilyTandem() {
+ return isFamily(FAMILY_TANDEM);
+ }
+
+ public static boolean isFamilyUnix() {
+ return isFamily(FAMILY_UNIX);
+ }
+
+ public static boolean isFamilyWindows() {
+ return isFamily(FAMILY_WINDOWS);
+ }
+
+ public static boolean isFamilyWin9x() {
+ return isFamily(FAMILY_WIN9X);
+ }
+
+ public static boolean isFamilyZOS() {
+ return isFamily(FAMILY_Z_OS);
+ }
+
+ public static boolean isFamilyOS400() {
+ return isFamily(FAMILY_OS_400);
+ }
+
+ public static boolean isFamilyOpenVms() {
+ return isFamily(FAMILY_OPENVMS);
+ }
+
+ /**
+ * Determines if the OS on which Ant is executing matches the given OS name.
+ *
+ * @param name
+ * the OS name to check for
+ * @return true if the OS matches
+ */
+ public static boolean isName(final String name) {
+ return isOs(null, name, null, null);
+ }
+
+ /**
+ * Determines if the OS on which Ant is executing matches the given OS
+ * architecture.
+ *
+ * @param arch
+ * the OS architecture to check for
+ * @return true if the OS matches
+ */
+ public static boolean isArch(final String arch) {
+ return isOs(null, null, arch, null);
+ }
+
+ /**
+ * Determines if the OS on which Ant is executing matches the given OS
+ * version.
+ *
+ * @param version
+ * the OS version to check for
+ * @return true if the OS matches
+ */
+ public static boolean isVersion(final String version) {
+ return isOs(null, null, null, version);
+ }
+
+ /**
+ * Determines if the OS on which Ant is executing matches the given OS
+ * family, name, architecture and version
+ *
+ * @param family
+ * The OS family
+ * @param name
+ * The OS name
+ * @param arch
+ * The OS architecture
+ * @param version
+ * The OS version
+ * @return true if the OS matches
+ */
+ public static boolean isOs(final String family, final String name,
+ final String arch, final String version) {
+ boolean retValue = false;
+
+ if (family != null || name != null || arch != null || version != null) {
+
+ boolean isFamily = true;
+ boolean isName = true;
+ boolean isArch = true;
+ boolean isVersion = true;
+
+ if (family != null) {
+ if (family.equals(FAMILY_WINDOWS)) {
+ isFamily = OS_NAME.indexOf(FAMILY_WINDOWS) > -1;
+ } else if (family.equals(FAMILY_OS_2)) {
+ isFamily = OS_NAME.indexOf(FAMILY_OS_2) > -1;
+ } else if (family.equals(FAMILY_NETWARE)) {
+ isFamily = OS_NAME.indexOf(FAMILY_NETWARE) > -1;
+ } else if (family.equals(FAMILY_DOS)) {
+ isFamily = PATH_SEP.equals(";")
+ && !isFamily(FAMILY_NETWARE);
+ } else if (family.equals(FAMILY_MAC)) {
+ isFamily = OS_NAME.indexOf(FAMILY_MAC) > -1;
+ } else if (family.equals(FAMILY_TANDEM)) {
+ isFamily = OS_NAME.indexOf("nonstop_kernel") > -1;
+ } else if (family.equals(FAMILY_UNIX)) {
+ isFamily = PATH_SEP.equals(":")
+ && !isFamily(FAMILY_OPENVMS)
+ && (!isFamily(FAMILY_MAC) || OS_NAME.endsWith("x"));
+ } else if (family.equals(FAMILY_WIN9X)) {
+ isFamily = isFamily(FAMILY_WINDOWS)
+ && (OS_NAME.indexOf("95") >= 0
+ || OS_NAME.indexOf("98") >= 0
+ || OS_NAME.indexOf("me") >= 0 || OS_NAME
+ .indexOf("ce") >= 0);
+ } else if (family.equals(FAMILY_Z_OS)) {
+ isFamily = OS_NAME.indexOf(FAMILY_Z_OS) > -1
+ || OS_NAME.indexOf("os/390") > -1;
+ } else if (family.equals(FAMILY_OS_400)) {
+ isFamily = OS_NAME.indexOf(FAMILY_OS_400) > -1;
+ } else if (family.equals(FAMILY_OPENVMS)) {
+ isFamily = OS_NAME.indexOf(FAMILY_OPENVMS) > -1;
+ } else {
+ throw new IllegalArgumentException(
+ "Don\'t know how to detect os family \"" + family
+ + "\"");
+ }
+ }
+ if (name != null) {
+ isName = name.equals(OS_NAME);
+ }
+ if (arch != null) {
+ isArch = arch.equals(OS_ARCH);
+ }
+ if (version != null) {
+ isVersion = version.equals(OS_VERSION);
+ }
+ retValue = isFamily && isName && isArch && isVersion;
+ }
+ return retValue;
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/OS.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: 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=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,225 @@
+/*
+ * 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.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * Destroys all registered <code>Process</code>es when the VM exits.
+ */
+class ProcessDestroyer implements Runnable {
+
+ private Vector processes = new Vector();
+
+ // methods to register and unregister shutdown hooks
+ private Method addShutdownHookMethod;
+
+ private Method removeShutdownHookMethod;
+
+ 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() {
+ try {
+ // check to see if the shutdown hook methods exists
+ // (support pre-JDK 1.3 VMs)
+ Class[] paramTypes = {Thread.class};
+ addShutdownHookMethod = Runtime.class.getMethod("addShutdownHook",
+ paramTypes);
+
+ removeShutdownHookMethod = Runtime.class.getMethod(
+ "removeShutdownHook", paramTypes);
+ // wait to add shutdown hook as needed
+ } catch (NoSuchMethodException e) {
+ // it just won't be added as a shutdown hook... :(
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Registers this <code>ProcessDestroyer</code> as a shutdown hook, uses
+ * reflection to ensure pre-JDK 1.3 compatibility.
+ */
+ private void addShutdownHook() {
+ if (addShutdownHookMethod != null && !running) {
+ destroyProcessThread = new ProcessDestroyerImpl();
+ Object[] args = {destroyProcessThread};
+ try {
+ addShutdownHookMethod.invoke(Runtime.getRuntime(), args);
+ added = true;
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ Throwable t = e.getTargetException();
+ if (t != null && t.getClass() == IllegalStateException.class) {
+ // shutdown already is in progress
+ running = true;
+ } else {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ /**
+ * Removes this <code>ProcessDestroyer</code> as a shutdown hook, uses
+ * reflection to ensure pre-JDK 1.3 compatibility
+ */
+ private void removeShutdownHook() {
+ if (removeShutdownHookMethod != null && added && !running) {
+ Object[] args = {destroyProcessThread};
+ try {
+ Boolean removed = (Boolean) removeShutdownHookMethod.invoke(
+ Runtime.getRuntime(), args);
+ if (!removed.booleanValue()) {
+ System.err.println("Could not remove shutdown hook");
+ }
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ Throwable t = e.getTargetException();
+ if (t != null && t.getClass() == IllegalStateException.class) {
+ // shutdown already is in progress
+ running = true;
+ } else {
+ e.printStackTrace();
+ }
+ }
+ /*
+ * 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/ProcessDestroyer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,241 @@
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Copies standard output and error of subprocesses to standard output and error
+ * of the parent process.
+ */
+public class PumpStreamHandler implements ExecuteStreamHandler {
+
+ private Thread outputThread;
+
+ private Thread errorThread;
+
+ private Thread inputThread;
+
+ private OutputStream out;
+
+ private OutputStream err;
+
+ private InputStream input;
+
+ /**
+ * Construct a new <CODE>PumpStreamHandler</CODE>.
+ *
+ * @param out
+ * the output <CODE>OutputStream</CODE>.
+ * @param err
+ * the error <CODE>OutputStream</CODE>.
+ * @param input
+ * the input <CODE>InputStream</CODE>.
+ */
+ public PumpStreamHandler(final OutputStream out, final OutputStream err,
+ final InputStream input) {
+ this.out = out;
+ this.err = err;
+ this.input = input;
+ }
+
+ /**
+ * Construct a new <CODE>PumpStreamHandler</CODE>.
+ *
+ * @param out
+ * the output <CODE>OutputStream</CODE>.
+ * @param err
+ * the error <CODE>OutputStream</CODE>.
+ */
+ public PumpStreamHandler(final OutputStream out, final OutputStream err) {
+ this(out, err, null);
+ }
+
+ /**
+ * Construct a new <CODE>PumpStreamHandler</CODE>.
+ *
+ * @param outAndErr
+ * the output/error <CODE>OutputStream</CODE>.
+ */
+ public PumpStreamHandler(final OutputStream outAndErr) {
+ this(outAndErr, outAndErr);
+ }
+
+ /**
+ * Construct a new <CODE>PumpStreamHandler</CODE>.
+ */
+ public PumpStreamHandler() {
+ this(System.out, System.err);
+ }
+
+ /**
+ * Set the <CODE>InputStream</CODE> from which to read the standard output
+ * of the process.
+ *
+ * @param is
+ * the <CODE>InputStream</CODE>.
+ */
+ public void setProcessOutputStream(final InputStream is) {
+ createProcessOutputPump(is, out);
+ }
+
+ /**
+ * Set the <CODE>InputStream</CODE> from which to read the standard error
+ * of the process.
+ *
+ * @param is
+ * the <CODE>InputStream</CODE>.
+ */
+ public void setProcessErrorStream(final InputStream is) {
+ if (err != null) {
+ createProcessErrorPump(is, err);
+ }
+ }
+
+ /**
+ * Set the <CODE>OutputStream</CODE> by means of which input can be sent
+ * to the process.
+ *
+ * @param os
+ * the <CODE>OutputStream</CODE>.
+ */
+ public void setProcessInputStream(final OutputStream os) {
+ if (input != null) {
+ inputThread = createPump(input, os, true);
+ } else {
+ try {
+ os.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ }
+
+ /**
+ * Start the <CODE>Thread</CODE>s.
+ */
+ public void start() {
+ outputThread.start();
+ errorThread.start();
+ if (inputThread != null) {
+ inputThread.start();
+ }
+ }
+
+ /**
+ * Stop pumping the streams.
+ */
+ public void stop() {
+ try {
+ outputThread.join();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ try {
+ errorThread.join();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+
+ if (inputThread != null) {
+ try {
+ inputThread.join();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+
+ try {
+ err.flush();
+ } catch (IOException e) {
+ // ignore
+ }
+ try {
+ out.flush();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+
+ /**
+ * Get the error stream.
+ *
+ * @return <CODE>OutputStream</CODE>.
+ */
+ protected OutputStream getErr() {
+ return err;
+ }
+
+ /**
+ * Get the output stream.
+ *
+ * @return <CODE>OutputStream</CODE>.
+ */
+ protected OutputStream getOut() {
+ return out;
+ }
+
+ /**
+ * Create the pump to handle process output.
+ *
+ * @param is
+ * the <CODE>InputStream</CODE>.
+ * @param os
+ * the <CODE>OutputStream</CODE>.
+ */
+ protected void createProcessOutputPump(final InputStream is,
+ final OutputStream os) {
+ outputThread = createPump(is, os);
+ }
+
+ /**
+ * Create the pump to handle error output.
+ *
+ * @param is
+ * the <CODE>InputStream</CODE>.
+ * @param os
+ * the <CODE>OutputStream</CODE>.
+ */
+ protected void createProcessErrorPump(final InputStream is,
+ final OutputStream os) {
+ errorThread = createPump(is, os);
+ }
+
+ /**
+ * Creates a stream pumper to copy the given input stream to the given
+ * output stream.
+ */
+ protected Thread createPump(final InputStream is, final OutputStream os) {
+ return createPump(is, os, false);
+ }
+
+ /**
+ * Creates a stream pumper to copy the given input stream to the given
+ * output stream.
+ */
+ protected Thread createPump(final InputStream is, final OutputStream os,
+ final boolean closeWhenExhausted) {
+ final Thread result = new Thread(new StreamPumper(is, os,
+ closeWhenExhausted));
+ result.setDaemon(true);
+ return result;
+ }
+
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,125 @@
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+/**
+ * Copies all data from an input stream to an output stream.
+ */
+public class StreamPumper implements Runnable {
+
+ // TODO: make SIZE an instance variable.
+ // TODO: add a status flag to note if an error occurred in run.
+
+ private static final int SIZE = 128;
+
+ private InputStream is;
+
+ private OutputStream os;
+
+ private boolean finished;
+
+ private boolean closeWhenExhausted;
+
+ /**
+ * Create a new stream pumper.
+ *
+ * @param is
+ * input stream to read data from
+ * @param os
+ * output stream to write data to.
+ * @param closeWhenExhausted
+ * if true, the output stream will be closed when the input is
+ * exhausted.
+ */
+ public StreamPumper(final InputStream is, final OutputStream os,
+ final boolean closeWhenExhausted) {
+ this.is = is;
+ this.os = os;
+ this.closeWhenExhausted = closeWhenExhausted;
+ }
+
+ /**
+ * Create a new stream pumper.
+ *
+ * @param is
+ * input stream to read data from
+ * @param os
+ * output stream to write data to.
+ */
+ public StreamPumper(final InputStream is, final OutputStream os) {
+ this(is, os, false);
+ }
+
+ /**
+ * Copies data from the input stream to the output stream. Terminates as
+ * soon as the input stream is closed or an error occurs.
+ */
+ public void run() {
+ synchronized (this) {
+ // Just in case this object is reused in the future
+ finished = false;
+ }
+
+ final byte[] buf = new byte[SIZE];
+
+ int length;
+ try {
+ while ((length = is.read(buf)) > 0) {
+ os.write(buf, 0, length);
+ }
+ } catch (Exception e) {
+ // ignore errors
+ } finally {
+ if (closeWhenExhausted) {
+ try {
+ os.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ synchronized (this) {
+ finished = true;
+ notifyAll();
+ }
+ }
+ }
+
+ /**
+ * Tells whether the end of the stream has been reached.
+ *
+ * @return true is the stream has been exhausted.
+ */
+ public synchronized boolean isFinished() {
+ return finished;
+ }
+
+ /**
+ * This method blocks until the stream pumper finishes.
+ *
+ * @see #isFinished()
+ */
+ public synchronized void waitFor() throws InterruptedException {
+ while (!isFinished()) {
+ wait();
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/StreamPumper.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,34 @@
+/*
+ * 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;
+
+/**
+ * Interface for classes that want to be notified by Watchdog.
+ *
+ * @see org.apache.commons.exec.Watchdog
+ */
+public interface TimeoutObserver {
+
+ /**
+ * Called when the watchdow times out.
+ *
+ * @param w
+ * the watchdog that timed out.
+ */
+ void timeoutOccured(Watchdog w);
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/TimeoutObserver.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,84 @@
+/*
+ * 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;
+
+/**
+ * Generalization of <code>ExecuteWatchdog</code>
+ *
+ * @see org.apache.commons.exec.ExecuteWatchdog
+ */
+public class Watchdog implements Runnable {
+
+ private Vector observers = new Vector(1);
+
+ private long timeout = -1;
+
+ private boolean stopped = false;
+
+ public Watchdog(final long timeout) {
+ if (timeout < 1) {
+ throw new IllegalArgumentException("timeout lesser than 1.");
+ }
+ this.timeout = timeout;
+ }
+
+ public void addTimeoutObserver(final TimeoutObserver to) {
+ observers.addElement(to);
+ }
+
+ public void removeTimeoutObserver(final TimeoutObserver to) {
+ observers.removeElement(to);
+ }
+
+ protected final void fireTimeoutOccured() {
+ Enumeration e = observers.elements();
+ while (e.hasMoreElements()) {
+ ((TimeoutObserver) e.nextElement()).timeoutOccured(this);
+ }
+ }
+
+ public synchronized void start() {
+ stopped = false;
+ Thread t = new Thread(this, "WATCHDOG");
+ t.setDaemon(true);
+ t.start();
+ }
+
+ public synchronized void stop() {
+ stopped = true;
+ notifyAll();
+ }
+
+ public synchronized void run() {
+ final long until = System.currentTimeMillis() + timeout;
+ long now;
+ while (!stopped && until > (now = System.currentTimeMillis())) {
+ try {
+ wait(until - now);
+ } catch (InterruptedException e) {
+ }
+ }
+ if (!stopped) {
+ fireTimeoutOccured();
+ }
+ }
+
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Watchdog.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,244 @@
+/*
+ * 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.environment;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+import org.apache.commons.exec.Execute;
+import org.apache.commons.exec.OS;
+import org.apache.commons.exec.PumpStreamHandler;
+
+/**
+ * Wrapper for environment variables.
+ */
+public class Environment extends HashMap {
+
+ public static Environment createEnvironment() {
+ if (OS.isFamilyOpenVms()) {
+ return new OpenVmsEnvironment();
+ } else {
+ return new Environment();
+ }
+ }
+
+ public static Environment createEnvironment(String[] envVars) {
+ Environment env = createEnvironment();
+
+ if(envVars != null) {
+ for (int i = 0; i < envVars.length; i++) {
+ env.addVariable(EnvironmentVariable
+ .createEnvironmentVariable(envVars[i]));
+ }
+ }
+ return env;
+ }
+
+ /**
+ * Comment for <code>serialVersionUID</code>
+ */
+ private static final long serialVersionUID = 3256443594801165364L;
+
+ /**
+ * a vector of type EnvirommentVariable
+ *
+ * @see EnvironmentVariable
+ */
+
+ private static Environment procEnvironment;
+
+ /**
+ * constructor
+ */
+ protected Environment() {
+ }
+
+ /**
+ * add a variable. Validity checking is <i>not</i> performed at this point.
+ * Duplicates are not caught either.
+ *
+ * @param var
+ * new variable.
+ */
+ public void addVariable(final EnvironmentVariable var) {
+ put(var.getKey(), var);
+ }
+
+ public void addVariable(final String key, final String value) {
+ put(key, EnvironmentVariable.createEnvironmentVariable(key, value));
+ }
+
+ /**
+ * get the variable list as an array
+ *
+ * @return array of key=value assignment strings
+ */
+ public String[] getVariables() {
+ if (size() == 0) {
+ return null;
+ }
+ String[] result = new String[size()];
+ int i = 0;
+ for (Iterator iter = entrySet().iterator(); iter.hasNext();) {
+ Map.Entry entry = (Map.Entry) iter.next();
+
+ result[i] = ((EnvironmentVariable) entry.getValue()).toString();
+ i++;
+ }
+ return result;
+ }
+
+ /**
+ * Find the list of environment variables for this process.
+ *
+ * @return a vector containing the environment variables the vector elements
+ * are strings formatted like variable = value
+ */
+ public static synchronized Environment getProcEnvironment() {
+ if (procEnvironment != null) {
+ return procEnvironment;
+ }
+
+ procEnvironment = new Environment();
+ try {
+ BufferedReader in = runProcEnvCommand();
+
+ String var = null;
+ String line, lineSep = System.getProperty("line.separator");
+ while ((line = in.readLine()) != null) {
+ if (line.indexOf('=') == -1) {
+ // Chunk part of previous env var (UNIX env vars can
+ // contain embedded new lines).
+ if (var == null) {
+ var = lineSep + line;
+ } else {
+ var += lineSep + line;
+ }
+ } else {
+ // New env var...append the previous one if we have it.
+ if (var != null) {
+ procEnvironment.addVariable(EnvironmentVariable
+ .createEnvironmentVariable(var));
+ }
+ var = line;
+ }
+ }
+ // Since we "look ahead" before adding, there's one last env var.
+ if (var != null) {
+ procEnvironment.addVariable(EnvironmentVariable
+ .createEnvironmentVariable(var));
+ }
+ } catch (java.io.IOException exc) {
+ exc.printStackTrace();
+ // Just try to see how much we got
+ }
+ return procEnvironment;
+ }
+
+ /**
+ * @return
+ * @throws IOException
+ */
+ protected static BufferedReader runProcEnvCommand() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ Execute exe = new Execute(new PumpStreamHandler(out));
+ exe.setCommandline(getProcEnvCommand());
+ // Make sure we do not recurse forever
+ exe.setNewEnvironment(true);
+ int retval = exe.execute();
+ if (retval != 0) {
+ // Just try to use what we got
+ }
+ BufferedReader in = new BufferedReader(new StringReader(toString(out)));
+ return in;
+ }
+
+ protected static CommandLine getProcEnvCommand() {
+ CommandLine commandLine = new CommandLineImpl();
+ if (OS.isFamilyOS2()) {
+ // OS/2 - use same mechanism as Windows 2000
+ commandLine.setExecutable("cmd");
+ commandLine.addArguments(new String[] {"/c", "set"});
+ } else if (OS.isFamilyWindows()) {
+ // Determine if we're running under XP/2000/NT or 98/95
+ if (OS.isFamilyWin9x()) {
+ commandLine.setExecutable("command.com");
+ // Windows 98/95
+ } else {
+ commandLine.setExecutable("cmd");
+ // Windows XP/2000/NT/2003
+ }
+ commandLine.addArguments(new String[] {"/c", "set"});
+ } else if (OS.isFamilyZOS() || OS.isFamilyUnix()) {
+ // On most systems one could use: /bin/sh -c env
+
+ // Some systems have /bin/env, others /usr/bin/env, just try
+ if (new File("/bin/env").canRead()) {
+ commandLine.setExecutable("/bin/env");
+ } else if (new File("/usr/bin/env").canRead()) {
+ commandLine.setExecutable("/usr/bin/env");
+ } else {
+ // rely on PATH
+ commandLine.setExecutable("env");
+ }
+ } else if (OS.isFamilyNetware() || OS.isFamilyOS400()) {
+ // rely on PATH
+ commandLine.setExecutable("env");
+ } else {
+ // MAC OS 9 and previous
+ // TODO: I have no idea how to get it, someone must fix it
+ commandLine = null;
+ }
+ return commandLine;
+ }
+
+ /**
+ * ByteArrayOutputStream#toString doesn't seem to work reliably on OS/390,
+ * at least not the way we use it in the execution context.
+ *
+ * @param bos
+ * the output stream that one wants to read
+ * @return the output stream as a string, read with special encodings in the
+ * case of z/os and os/400
+ */
+ private static String toString(final ByteArrayOutputStream bos) {
+ if (OS.isFamilyZOS()) {
+ try {
+ return bos.toString("Cp1047");
+ } catch (java.io.UnsupportedEncodingException e) {
+ // noop default encoding used
+ }
+ } else if (OS.isFamilyOS400()) {
+ try {
+ return bos.toString("Cp500");
+ } catch (java.io.UnsupportedEncodingException e) {
+ // noop default encoding used
+ }
+ }
+ return bos.toString();
+ }
+
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/Environment.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: 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=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,153 @@
+/*
+ * 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.environment;
+
+import java.io.File;
+
+
+/**
+ * representation of a single env value
+ */
+public final class EnvironmentVariable {
+
+ public static EnvironmentVariable createEnvironmentVariable(
+ final String keyAndValue) {
+ return new EnvironmentVariable(keyAndValue);
+ }
+
+ public static EnvironmentVariable createEnvironmentVariable(
+ final String key, final String value) {
+ return new EnvironmentVariable(key, value);
+ }
+
+ /**
+ * env key and value pair; everything gets expanded to a string during
+ * assignment
+ */
+ private String value;
+
+ private String key;
+
+ /**
+ * Constructor for variable
+ */
+ private EnvironmentVariable(final String key, final String value) {
+ if (key == null) {
+ throw new NullPointerException("key can not be null");
+ }
+ if (value == null) {
+ throw new NullPointerException("value can not be null");
+ }
+ this.key = key;
+ this.value = value;
+ }
+
+ private EnvironmentVariable(final String keyAndValue) {
+ int index = keyAndValue.indexOf('=');
+ if (index == -1) {
+ throw new IllegalArgumentException(
+ "Environment variable for this platform "
+ + "must contain an equals sign ('=')");
+ }
+
+ this.key = keyAndValue.substring(0, index);
+ this.value = keyAndValue.substring(index + 1);
+ }
+
+ /**
+ * set the key
+ *
+ * @param key
+ * string
+ */
+ public void setKey(final String key) {
+ this.key = key;
+ }
+
+ /**
+ * set the value
+ *
+ * @param value
+ * string value
+ */
+ public void setValue(final String value) {
+ this.value = value;
+ }
+
+ /**
+ * key accessor
+ *
+ * @return key
+ */
+ public String getKey() {
+ return this.key;
+ }
+
+ /**
+ * value accessor
+ *
+ * @return value
+ */
+ public String getValue() {
+ return this.value;
+ }
+
+ /**
+ * stringify path and assign to the value. The value will contain all path
+ * elements separated by the appropriate separator
+ *
+ * @param path
+ * path
+ */
+ /*
+ * public void setPath(Path path) { this.value = path.toString(); }
+ */
+
+ /**
+ * get the absolute path of a file and assign it to the value
+ *
+ * @param file
+ * file to use as the value
+ */
+ public void setFile(final File file) {
+ this.value = file.getAbsolutePath();
+ }
+
+ /**
+ * get the assigment string This is not ready for insertion into a property
+ * file without following the escaping rules of the properties class.
+ *
+ * @return a string of the form key=value.
+ * if key or value are unassigned
+ */
+ public String toString() {
+ StringBuffer sb = new StringBuffer(key.trim());
+ sb.append("=").append(value.trim());
+ return sb.toString();
+ }
+
+ public boolean equals(final Object o) {
+ if (!(o instanceof EnvironmentVariable)) {
+ return false;
+ }
+
+ EnvironmentVariable envVar = (EnvironmentVariable) o;
+
+ return key.equals(envVar.key) && value.equals(envVar.value);
+ }
+}
\ No newline at end of file
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,114 @@
+/*
+ * 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.environment;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+
+public class OpenVmsEnvironment extends Environment {
+
+ /**
+ * Comment for <code>serialVersionUID</code>
+ */
+ private static final long serialVersionUID = 3762535598665117752L;
+
+ protected OpenVmsEnvironment() {
+
+ }
+
+ public static synchronized Environment getProcEnvironment() {
+ Environment procEnvironment = getProcEnvironment();
+
+ if (procEnvironment == null) {
+ procEnvironment = new Environment();
+ try {
+ BufferedReader in = runProcEnvCommand();
+
+ procEnvironment = addVMSLogicals(procEnvironment, in);
+ return procEnvironment;
+ } catch (java.io.IOException exc) {
+ exc.printStackTrace();
+ // Just try to see how much we got
+ }
+ }
+
+ return procEnvironment;
+ }
+
+ protected static CommandLine getProcEnvCommand() {
+ CommandLine commandLine = new CommandLineImpl();
+ commandLine.setExecutable("show");
+ commandLine.addArgument("logical");
+ return commandLine;
+ }
+
+ /**
+ * This method is VMS specific and used by getProcEnvironment(). Parses VMS
+ * logicals from <code>in</code> and adds them to <code>environment</code>.
+ * <code>in</code> is expected to be the output of "SHOW LOGICAL". The
+ * method takes care of parsing the output correctly as well as making sure
+ * that a logical defined in multiple tables only gets added from the
+ * highest order table. Logicals with multiple equivalence names are mapped
+ * to a variable with multiple values separated by a comma (,).
+ */
+ private static Environment addVMSLogicals(final Environment environment,
+ final BufferedReader in) throws IOException {
+ HashMap logicals = new HashMap();
+ String logName = null, logValue = null, newLogName;
+ String line = null;
+ while ((line = in.readLine()) != null) {
+ // parse the VMS logicals into required format ("VAR=VAL[,VAL2]")
+ if (line.startsWith("\t=")) {
+ // further equivalence name of previous logical
+ if (logName != null) {
+ logValue += "," + line.substring(4, line.length() - 1);
+ }
+ } else if (line.startsWith(" \"")) {
+ // new logical?
+ if (logName != null) {
+ logicals.put(logName, logValue);
+ }
+ int eqIndex = line.indexOf('=');
+ newLogName = line.substring(3, eqIndex - 2);
+ if (logicals.containsKey(newLogName)) {
+ // already got this logical from a higher order table
+ logName = null;
+ } else {
+ logName = newLogName;
+ logValue = line.substring(eqIndex + 3, line.length() - 1);
+ }
+ }
+ }
+ // Since we "look ahead" before adding, there's one last env var.
+ if (logName != null) {
+ logicals.put(logName, logValue);
+ }
+
+ for (Iterator i = logicals.keySet().iterator(); i.hasNext();) {
+ String logical = (String) i.next();
+ environment.addVariable(logical, (String) logicals.get(logical));
+ }
+ return environment;
+ }
+
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/OpenVmsEnvironment.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,43 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.environment.Environment;
+
+public interface CommandLauncher {
+
+ /**
+ * Launches the given command in a new process.
+ *
+ * @param cmd
+ * The command to execute
+ * @param env
+ * The environment for the new process. If null, the environment
+ * of the current process is used.
+ * @throws IOException
+ * if attempting to run a command in a specific directory
+ */
+ Process exec(final CommandLine cmd, final Environment env)
+ throws IOException;
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory.
+ *
+ * @param cmd
+ * The command to execute
+ * @param env
+ * The environment for the new process. If null, the environment
+ * of the current process is used.
+ * @param workingDir
+ * The directory to start the command in. If null, the current
+ * directory is used
+ * @throws IOException
+ * if trying to change directory
+ */
+ Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException;
+
+}
\ No newline at end of file
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,87 @@
+package org.apache.commons.exec.launcher;
+
+import org.apache.commons.exec.OS;
+
+/**
+ * Builds a command launcher for the OS and JVM we are running under.
+ */
+
+public final class CommandLauncherFactory {
+
+ private CommandLauncherFactory() {
+
+ }
+
+ /**
+ *
+ */
+ public static CommandLauncher createVMLauncher() {
+ // Try using a JDK 1.3 launcher
+ CommandLauncher launcher = null;
+ try {
+ if (OS.isFamilyOpenVms()) {
+ launcher = new VmsCommandLauncher();
+ } else if (!OS.isFamilyOS2()) {
+ launcher = new Java13CommandLauncher();
+ }
+ } catch (NoSuchMethodException exc) {
+ // Ignore and keep trying
+ }
+
+ return launcher;
+ }
+
+ public static CommandLauncher createShellLauncher() {
+ CommandLauncher launcher = null;
+
+ if (OS.isFamilyMac() && !OS.isFamilyUnix()) {
+ // Mac
+ launcher = new MacCommandLauncher(new CommandLauncherImpl());
+ } else if (OS.isFamilyOS2()) {
+ // OS/2
+ launcher = new OS2CommandLauncher(new CommandLauncherImpl());
+ } else if (OS.isFamilyWindows()) {
+ // Windows. Need to determine which JDK we're running in
+
+ CommandLauncher baseLauncher;
+ if (System.getProperty("java.version").startsWith("1.1")) {
+ // JDK 1.1
+ baseLauncher = new Java11CommandLauncher();
+ } else {
+ // JDK 1.2
+ baseLauncher = new CommandLauncherImpl();
+ }
+
+ if (!OS.isFamilyWin9x()) {
+ // Windows XP/2000/NT
+ launcher = new WinNTCommandLauncher(baseLauncher);
+ } else {
+ // Windows 98/95 - need to use an auxiliary script
+ launcher = new ScriptCommandLauncher("bin/antRun.bat",
+ baseLauncher);
+ }
+ } else if (OS.isFamilyNetware()) {
+ // NetWare. Need to determine which JDK we're running in
+ CommandLauncher baseLauncher;
+ if (System.getProperty("java.version").startsWith("1.1")) {
+ // JDK 1.1
+ baseLauncher = new Java11CommandLauncher();
+ } else {
+ // JDK 1.2
+ baseLauncher = new CommandLauncherImpl();
+ }
+
+ launcher = new PerlScriptCommandLauncher("bin/antRun.pl",
+ baseLauncher);
+ } else if (OS.isFamilyOpenVms()) {
+ // the vmLauncher already uses the shell
+ launcher = createVMLauncher();
+ } else {
+ // Generic
+ launcher = new ScriptCommandLauncher("bin/antRun",
+ new CommandLauncherImpl());
+ }
+
+ return launcher;
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherFactory.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,46 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher for a particular JVM/OS platform. This class is a general
+ * purpose command launcher which can only launch commands in the current
+ * working directory.
+ */
+public class CommandLauncherImpl implements CommandLauncher {
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.commons.exec.launcher.CommandLauncherIn#exec(java.lang.String[],
+ * java.lang.String[])
+ */
+ public Process exec(final CommandLine cmd, final Environment env)
+ throws IOException {
+ String[] envVar = null;
+ if(env != null) {
+ envVar = env.getVariables();
+ }
+
+ return Runtime.getRuntime().exec(cmd.getCommandline(),
+ envVar);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.commons.exec.launcher.CommandLauncherIn#exec(java.lang.String[],
+ * java.lang.String[], java.io.File)
+ */
+ public Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException {
+ if (workingDir == null) {
+ return exec(cmd, env);
+ }
+ throw new IOException("Cannot execute a process in different "
+ + "directory under this JVM");
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherImpl.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,38 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher that proxies another command launcher. Sub-classes
+ * override exec(args, env, workdir)
+ */
+public abstract class CommandLauncherProxy extends CommandLauncherImpl {
+
+ public CommandLauncherProxy(final CommandLauncher launcher) {
+ myLauncher = launcher;
+ }
+
+ private CommandLauncher myLauncher;
+
+ /**
+ * Launches the given command in a new process. Delegates this method to the
+ * proxied launcher
+ *
+ * @param project
+ * the ant project
+ * @param cmd
+ * the command line to execute as an array of strings
+ * @param env
+ * the environment to set as an array of strings
+ * @throws IOException
+ * forwarded from the exec method of the command launcher
+ */
+ public Process exec(final CommandLine cmd, final Environment env)
+ throws IOException {
+ return myLauncher.exec(cmd, env);
+ }
+
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/CommandLauncherProxy.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,47 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+import org.apache.commons.exec.environment.Environment;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A command launcher for JDK/JRE 1.1 under Windows. Fixes quoting problems in
+ * Runtime.exec(). Can only launch commands in the current working directory
+ */
+public class Java11CommandLauncher extends CommandLauncherImpl {
+
+ private static final Log LOG = LogFactory
+ .getLog(Java11CommandLauncher.class);
+
+ /**
+ * Launches the given command in a new process. Needs to quote arguments
+ *
+ * @param cmd
+ * the command line to execute as an array of strings
+ * @param env
+ * the environment to set as an array of strings
+ * @throws IOException
+ * probably forwarded from Runtime#exec
+ */
+ public Process exec(final CommandLine cmd, final Environment env)
+ throws IOException {
+ // Need to quote arguments with spaces, and to escape
+ // quote characters
+ CommandLine newCmd = new CommandLineImpl();
+ newCmd.setExecutable(
+ CommandLineImpl.quoteArgument(cmd.getExecutable()));
+
+ String[] args = cmd.getArguments();
+ for (int i = 0; i < args.length; i++) {
+ newCmd.addArgument(CommandLineImpl.quoteArgument(args[i]));
+ }
+ LOG.debug("Execute:Java11CommandLauncher: " + newCmd);
+
+ return Runtime.getRuntime().exec(newCmd.getCommandline(),
+ env.getVariables());
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java11CommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,66 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.apache.commons.exec.ExecuteException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * A command launcher for JDK/JRE 1.3 (and higher). Uses the built-in
+ * Runtime.exec() command
+ */
+public class Java13CommandLauncher extends CommandLauncherImpl {
+ private static Log log = LogFactory.getLog(Java13CommandLauncher.class);
+
+ public Java13CommandLauncher() throws NoSuchMethodException {
+ // Locate method Runtime.exec(String[] cmdarray,
+ // String[] envp, File dir)
+ myExecWithCWD = Runtime.class.getMethod("exec", new Class[] {
+ String[].class, String[].class, File.class});
+ }
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory
+ *
+ * @param project
+ * the ant project
+ * @param cmd
+ * the command line to execute as an array of strings
+ * @param env
+ * the environment to set as an array of strings
+ * @param workingDir
+ * the working directory where the command should run
+ * @throws IOException
+ * probably forwarded from Runtime#exec
+ */
+ public Process exec(final String[] cmd, final String[] env,
+ final File workingDir) throws IOException {
+ try {
+ log.debug("Execute:Java13CommandLauncher: " + cmd);
+
+ Object[] arguments = {cmd, env, workingDir};
+ return (Process) myExecWithCWD.invoke(Runtime.getRuntime(),
+ arguments);
+ } catch (InvocationTargetException exc) {
+ Throwable realexc = exc.getTargetException();
+ if (realexc instanceof ThreadDeath) {
+ throw (ThreadDeath) realexc;
+ } else if (realexc instanceof IOException) {
+ throw (IOException) realexc;
+ } else {
+ throw new ExecuteException("Unable to execute command",
+ realexc);
+ }
+ } catch (Exception exc) {
+ // IllegalAccess, IllegalArgument, ClassCast
+ throw new ExecuteException("Unable to execute command", exc);
+ }
+ }
+
+ private Method myExecWithCWD;
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/Java13CommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,46 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher for Mac that uses a dodgy mechanism to change working
+ * directory before launching commands.
+ */
+public class MacCommandLauncher extends CommandLauncherProxy {
+ public MacCommandLauncher(final CommandLauncher launcher) {
+ super(launcher);
+ }
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory.
+ *
+ * @param cmd
+ * the command line to execute as an array of strings
+ * @param env
+ * the environment to set as an array of strings
+ * @param workingDir
+ * working directory where the command should run
+ * @throws IOException
+ * forwarded from the exec method of the command launcher
+ */
+ public Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException {
+ if (workingDir == null) {
+ return exec(cmd, env);
+ }
+
+ String oldUserDir = System.getProperty("user.dir");
+
+ System.getProperties().put("user.dir", workingDir.getAbsolutePath());
+ try {
+ return exec(cmd, env);
+ } finally {
+ System.getProperties().put("user.dir", oldUserDir);
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/MacCommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,60 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher for OS/2 that uses 'cmd.exe' when launching commands in
+ * directories other than the current working directory.
+ * <p>
+ * Unlike Windows NT and friends, OS/2's cd doesn't support the /d switch to
+ * change drives and directories in one go.
+ * </p>
+ */
+public class OS2CommandLauncher extends CommandLauncherProxy {
+
+ public OS2CommandLauncher(final CommandLauncher launcher) {
+ super(launcher);
+ }
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory.
+ *
+ * @param project
+ * the ant project
+ * @param cmd
+ * the command line to execute as an array of strings
+ * @param env
+ * the environment to set as an array of strings
+ * @param workingDir
+ * working directory where the command should run
+ * @throws IOException
+ * forwarded from the exec method of the command launcher
+ */
+ public Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException {
+ if (workingDir == null) {
+ return exec(cmd, env);
+ }
+
+ final String cmdDir = workingDir.getAbsolutePath();
+
+ CommandLine newCmd = new CommandLineImpl();
+ newCmd.setExecutable("cmd");
+ newCmd.addArgument("/c");
+ // TODO calculate root by walking
+ newCmd.addArgument(cmdDir.substring(0, 2));
+ newCmd.addArgument("&&");
+ newCmd.addArgument("cd");
+ newCmd.addArgument(cmdDir.substring(2));
+ newCmd.addArgument("&&");
+ newCmd.addArguments(cmd.getCommandline());
+
+ return exec(newCmd, env);
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/OS2CommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,50 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher that uses an auxiliary perl script to launch commands in
+ * directories other than the current working directory.
+ */
+public class PerlScriptCommandLauncher extends CommandLauncherProxy {
+ public PerlScriptCommandLauncher(final String script,
+ final CommandLauncher launcher) {
+ super(launcher);
+ this.script = script;
+ }
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory
+ */
+ public Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException {
+
+ if (workingDir == null) {
+ return exec(cmd, env);
+ }
+
+ // Locate the auxiliary script
+ String scriptDir = System.getProperty("org.apache.commons.exec.home", "");
+ File scriptFile = new File(scriptDir + File.separator + script);
+ if (scriptFile.exists()) {
+ throw new IOException("Cannot locate auxiliary script at " +
+ scriptFile.getAbsolutePath());
+ }
+
+ CommandLine newCmd = new CommandLineImpl();
+ newCmd.setExecutable("perl");
+ newCmd.addArgument(scriptFile.getPath());
+ newCmd.addArgument(workingDir.getAbsolutePath());
+ newCmd.addArguments(cmd.getCommandline());
+
+ return exec(newCmd, env);
+ }
+
+ private String script;
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/PerlScriptCommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java?rev=230452&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java Fri Aug 5 05:21:46 2005
@@ -0,0 +1,49 @@
+package org.apache.commons.exec.launcher;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.CommandLineImpl;
+import org.apache.commons.exec.environment.Environment;
+
+/**
+ * A command launcher that uses an auxiliary script to launch commands in
+ * directories other than the current working directory.
+ */
+public class ScriptCommandLauncher extends CommandLauncherProxy {
+ public ScriptCommandLauncher(final String script,
+ final CommandLauncher launcher) {
+ super(launcher);
+ this.script = script;
+ }
+
+ /**
+ * Launches the given command in a new process, in the given working
+ * directory.
+ */
+ public Process exec(final CommandLine cmd, final Environment env,
+ final File workingDir) throws IOException {
+ if (workingDir == null) {
+ return exec(cmd, env);
+ }
+
+ // Locate the auxiliary script
+ String scriptDir = System.getProperty("org.apache.commons.exec.home", "");
+ File scriptFile = new File(scriptDir + File.separator + script);
+ if (scriptFile.exists()) {
+ throw new IOException("Cannot locate auxiliary script at " +
+ scriptFile.getAbsolutePath());
+ }
+
+ // Build the command
+ CommandLine newCmd = new CommandLineImpl();
+ newCmd.setExecutable(scriptFile.getPath());
+ newCmd.addArgument(workingDir.getAbsolutePath());
+ newCmd.addArguments(cmd.getCommandline());
+
+ return exec(newCmd, env);
+ }
+
+ private String script;
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/launcher/ScriptCommandLauncher.java
------------------------------------------------------------------------------
svn:keywords = "Author Date Id Revision"
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org