You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ng...@apache.org on 2006/05/24 22:29:39 UTC

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

Author: ngn
Date: Wed May 24 13:29:38 2006
New Revision: 409244

URL: http://svn.apache.org/viewvc?rev=409244&view=rev
Log:
Adding suggestion for basic Executor interface with a default implementation (not complete, async exec missing) and basic unit test.

Added:
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/DefaultExecutor.java   (with props)
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteResultHandler.java   (with props)
    jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Executor.java   (with props)
    jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java   (with props)
    jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/MockExecuteResultHandler.java   (with props)
Modified:
    jakarta/commons/sandbox/exec/trunk/   (props changed)

Propchange: jakarta/commons/sandbox/exec/trunk/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed May 24 13:29:38 2006
@@ -1,6 +1,9 @@
+
 target
 build.properties
 *.iml
 *.ipr
 *.iws
-
+bin
+.classpath
+.project

Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/DefaultExecutor.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/DefaultExecutor.java?rev=409244&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/DefaultExecutor.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/DefaultExecutor.java Wed May 24 13:29:38 2006
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2006 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.File;
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.commons.exec.launcher.CommandLauncher;
+import org.apache.commons.exec.launcher.CommandLauncherFactory;
+
+/**
+ * 
+ */
+public class DefaultExecutor implements Executor {
+
+    private ExecuteStreamHandler streamHandler = new LogStreamHandler(1, 1);
+
+    private File workingDirectory;
+
+    private ExecuteWatchdog watchdog;
+
+    // TODO replace with generic launcher
+    private CommandLauncher launcher = CommandLauncherFactory
+            .createVMLauncher();
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#getStreamHandler()
+     */
+    public ExecuteStreamHandler getStreamHandler() {
+        return streamHandler;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#setStreamHandler(org.apache.commons.exec.ExecuteStreamHandler)
+     */
+    public void setStreamHandler(ExecuteStreamHandler streamHandler) {
+        this.streamHandler = streamHandler;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#getWatchdog()
+     */
+    public ExecuteWatchdog getWatchdog() {
+        return watchdog;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#setWatchdog(org.apache.commons.exec.ExecuteWatchdog)
+     */
+    public void setWatchdog(ExecuteWatchdog watchDog) {
+        this.watchdog = watchdog;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#getWorkingDirectory()
+     */
+    public File getWorkingDirectory() {
+        return workingDirectory;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#setWorkingDirectory(java.io.File)
+     */
+    public void setWorkingDirectory(File dir) {
+        this.workingDirectory = dir;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#execute(java.lang.String[])
+     */
+    public int execute(final CommandLine command) throws ExecuteException,
+            IOException {
+        return execute(command, (Map) null);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#execute(java.lang.String[],
+     *      java.util.Map)
+     */
+    public int execute(final CommandLine command, Map environment)
+            throws ExecuteException, IOException {
+
+        if (workingDirectory != null && !workingDirectory.exists()) {
+            throw new IOException(workingDirectory + " doesn't exist.");
+        }
+
+        final Process process = launch(command, environment, workingDirectory);
+
+        try {
+            streamHandler.setProcessInputStream(process.getOutputStream());
+            streamHandler.setProcessOutputStream(process.getInputStream());
+            streamHandler.setProcessErrorStream(process.getErrorStream());
+        } catch (IOException e) {
+            process.destroy();
+            throw e;
+        }
+        streamHandler.start();
+
+        try {
+            // add the process to the list of those to destroy if the VM exits
+            //
+            // processDestroyer.add(process);
+
+            if (watchdog != null) {
+                watchdog.start(process);
+            }
+            int exitValue = Executor.INVALID_EXITVALUE;
+            try {
+                exitValue = process.waitFor();
+            } catch (InterruptedException e) {
+                process.destroy();
+            }
+
+            if (watchdog != null) {
+                watchdog.stop();
+            }
+            streamHandler.stop();
+            closeStreams(process);
+
+            if (watchdog != null) {
+                try {
+                    watchdog.checkException();
+                } catch (Exception e) {
+                    // TODO: include cause
+                    throw new IOException(e.getMessage());
+                }
+
+            }
+
+            // TODO check exitValue and throw if not OK
+            return exitValue;
+        } finally {
+            // remove the process to the list of those to destroy if the VM
+            // exits
+            //
+            // processDestroyer.remove(process);
+        }
+    }
+
+    /**
+     * Creates a process that runs a command.
+     * 
+     * @param command
+     *            the command to run
+     * @param env
+     *            the environment for the command
+     * @param dir
+     *            the working directory for the command
+     * @return the process started
+     * @throws IOException
+     *             forwarded from the particular launcher used
+     */
+    private Process launch(final CommandLine command, final Map env,
+            final File dir) throws IOException {
+        CommandLauncher launcher = this.launcher;
+
+        if (launcher == null) {
+            throw new IllegalStateException("CommandLauncher can not be null");
+
+        }
+
+        if (dir != null && !dir.exists()) {
+            throw new IOException(dir + " doesn't exist.");
+        }
+        return launcher.exec(command, env, dir);
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#execute(java.lang.String[],
+     *      org.apache.commons.exec.ExecuteResultHandler)
+     */
+    public void execute(final CommandLine command, ExecuteResultHandler handler)
+            throws ExecuteException, IOException {
+        // TODO Auto-generated method stub
+
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.commons.exec.Executor#execute(java.lang.String[],
+     *      java.util.Map, org.apache.commons.exec.ExecuteResultHandler)
+     */
+    public void execute(final CommandLine command, final Map environment,
+            final ExecuteResultHandler handler) throws ExecuteException, IOException {
+        // TODO Auto-generated method stub
+
+    }
+
+    /**
+     * Close the streams belonging to the given Process.
+     * 
+     * @param process
+     *            the <CODE>Process</CODE>.
+     */
+    private void closeStreams(final Process process) {
+        try {
+            process.getInputStream().close();
+        } catch (IOException eyeOhEx) {
+            // ignore error
+        }
+        try {
+            process.getOutputStream().close();
+        } catch (IOException eyeOhEx) {
+            // ignore error
+        }
+        try {
+            process.getErrorStream().close();
+        } catch (IOException eyeOhEx) {
+            // ignore error
+        }
+    }
+}

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

Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteResultHandler.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteResultHandler.java?rev=409244&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteResultHandler.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ExecuteResultHandler.java Wed May 24 13:29:38 2006
@@ -0,0 +1,24 @@
+/* 
+ * Copyright 2006  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;
+
+public interface ExecuteResultHandler {
+
+    void onProcessComplete(int exitValue);
+    void onProcessFailed(ExecuteException e);
+}

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

Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Executor.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Executor.java?rev=409244&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Executor.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Executor.java Wed May 24 13:29:38 2006
@@ -0,0 +1,60 @@
+/* 
+ * Copyright 2006  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.File;
+import java.io.IOException;
+import java.util.Map;
+
+public interface Executor {
+
+    /** Invalid exit code. * */
+    public static final int INVALID_EXITVALUE = Integer.MAX_VALUE;
+
+    
+    /*
+     * StreamHandlers are used for providing input, 
+     * retriving the output. Also used for logging.  
+     */
+    ExecuteStreamHandler getStreamHandler();
+    void setStreamHandler(ExecuteStreamHandler streamHandler);
+
+    /*
+     * Watchdog is used to kill of processes running, 
+     * typically, too long time. 
+     */
+    ExecuteWatchdog getWatchdog();
+    void setWatchdog(ExecuteWatchdog watchDog);
+    
+    File getWorkingDirectory();
+    void setWorkingDirectory(File dir);
+
+    /*
+     * Methods for starting synchronous execution.
+     * Returns process exit value
+     */
+    int execute(CommandLine command) throws ExecuteException, IOException; 
+    int execute(CommandLine command, Map environment) throws ExecuteException, IOException; 
+    
+    /*
+     * Methods for starting asynchronous execution. Result provided to callback handler
+     */
+    void execute(CommandLine command, ExecuteResultHandler handler) throws ExecuteException, IOException;
+    void execute(CommandLine command, Map environment, ExecuteResultHandler handler) throws ExecuteException, IOException;
+
+}

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

Added: jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java?rev=409244&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java Wed May 24 13:29:38 2006
@@ -0,0 +1,97 @@
+/* 
+ * 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.ByteArrayOutputStream;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+public class DefaultExecutorTest extends TestCase {
+
+    private String testDir = "src/test/scripts";
+    private ByteArrayOutputStream baos;
+    private String testScript = TestUtil.resolveScriptForOS(testDir + "/test");
+
+    protected void setUp() throws Exception {
+        baos = new ByteArrayOutputStream();
+    }
+
+    public void testExecute() throws Exception {
+        Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler(baos, baos));
+
+        CommandLine cl = new CommandLine(new File(testScript).getAbsolutePath());
+
+        int exitValue = exec.execute(cl);
+        assertEquals("FOO..", baos.toString().trim());
+        assertEquals(0, exitValue);
+    }
+
+    public void testExecuteWithArg() throws Exception {
+        Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler(baos, baos));
+
+        CommandLine cl = new CommandLine(testScript);
+        cl.addArgument("BAR");
+        int exitValue = exec.execute(cl);
+
+        assertEquals("FOO..BAR", baos.toString().trim());
+        assertEquals(0, exitValue);
+    }
+
+    public void testExecuteWithEnv() throws Exception {
+        Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler(baos, baos));
+    	
+    	Map env = new HashMap();
+        env.put("TEST_ENV_VAR", "XYZ");
+
+        CommandLine cl = new CommandLine(testScript);
+
+        int exitValue = exec.execute(cl, env);
+
+        assertEquals("FOO.XYZ.", baos.toString().trim());
+        assertEquals(0, exitValue);
+    }
+
+    public void disabledtestExecuteAsync() throws Exception {
+        Executor exec = new DefaultExecutor();
+        exec.setStreamHandler(new PumpStreamHandler(baos, baos));
+        
+        CommandLine cl = new CommandLine(testScript);
+        
+        MockExecuteResultHandler handler = new MockExecuteResultHandler();
+        
+        exec.execute(cl, handler);
+        
+        // wait for script to run
+        Thread.sleep(1000);
+        
+        assertEquals("FOO..", baos.toString().trim());
+        assertEquals(0, handler.getExitValue());
+    }
+    
+    
+
+    protected void tearDown() throws Exception {
+        baos.close();
+    }
+}

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

Added: jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/MockExecuteResultHandler.java
URL: http://svn.apache.org/viewvc/jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/MockExecuteResultHandler.java?rev=409244&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/MockExecuteResultHandler.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/test/java/org/apache/commons/exec/MockExecuteResultHandler.java Wed May 24 13:29:38 2006
@@ -0,0 +1,53 @@
+/* 
+ * Copyright 2006  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;
+
+public class MockExecuteResultHandler implements ExecuteResultHandler {
+
+    private int exitValue;
+    private ExecuteException exception;
+    
+    /* (non-Javadoc)
+     * @see org.apache.commons.exec.ExecuteResultHandler#onProcessComplete(int)
+     */
+    public void onProcessComplete(int exitValue) {
+        this.exitValue = exitValue;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.commons.exec.ExecuteResultHandler#onProcessFailed(org.apache.commons.exec.ExecuteException)
+     */
+    public void onProcessFailed(ExecuteException e) {
+        this.exception = e;
+    }
+
+    /**
+     * @return Returns the exception.
+     */
+    public ExecuteException getException() {
+        return exception;
+    }
+
+    /**
+     * @return Returns the exitValue.
+     */
+    public int getExitValue() {
+        return exitValue;
+    }
+
+}

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



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org