<?xml version="1.0" encoding="UTF-8"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you 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.
-->
<document>
    <properties>
        <title>commons-exec</title>
        <author email="sgoeschl@apache.org">Siegfried Goeschl</author>
    </properties>
    <body>
        <release version="1.3" date="2014-11-02" description="Maintenance and feature Release">
            <action issue="EXEC-69" dev="ggregory" type="add" due-to="Richard Atkins, Michael Vorburger">
                DefaultExecutor async execute prevents shutdown hooks running.
            </action>
            <action issue="EXEC-81" dev="ggregory" type="fix" date="2014-02-04" due-to="Stephen Compall">
                Remove remaining raw types, unchecked conversions
            </action>
            <action issue="EXEC-80" dev="ggregory" type="fix" date="2014-02-04">
                NPE in EnvironmentUtils.toString(map)
            </action>
            <action issue="EXEC-78" dev="sebb" type="update" date="2014-01-11">
                No need to use System.class.getMethod("getenv",...) any more
            </action>
            <action issue="EXEC-77" dev="britter" type="update" date="2014-01-10">
                Update JUnit dependency to 4.11
            </action>
            <action issue="EXEC-76" dev="britter" type="update" date="2014-01-10">
                Update to Java 5
            </action>
        </release>
        <release version="1.2" date="2014-01-02" description="Maintenance and small feature Release">
            <action issue="EXEC-68" dev="ggregory" type="fix" date="2012-10-22"  due-to="Joel McCance">
                Watchdog kills process immediately if timeout is too large.
            </action>
            <action issue="EXEC-57" dev="sgoeschl" type="fix" date="2011-10-10"  due-to="Nickolay Martinov">
                Applied the patch from Nickolay Martinov but the timeout disguises the fact
                that the process might be still running. Therefore added a sanity check in
                order to throw an exception if the the timeout for join() was exceeded.
            </action>
            <action issue="EXEC-60" dev="sgoeschl" type="fix" date="2011-10-09"  due-to="Peter Kofler">
                Fixed deadlock by calling the timeout observers outside of the synchronized block thereby
                removing a prerequisite of a deadlock. Also added a test case to demonstrate that this
                problem is fixed (which of course can not guarantee the absence of a dead lock).
            </action>
            <action issue="EXEC-55" dev="sgoeschl" type="add" date="2011-02-21"  due-to="Dominik Stadler">
                Set names for started threads.
            </action>
            <action issue="EXEC-52" dev="sebb" type="fix" date="2011-02-26"  due-to="Nickolay Martinov">
                Tests fail on HP-UX, because it uses a different syntax for the ping command.
            </action>
            <action issue="EXEC-49" dev="sgoeschl" type="fix" date="2010-11-05" due-to="Kevin Telford">
                "Write dead end" IOException when using Piped streams w/PumpStreamHandler.
                When encountering a PipedOutputStream we will automatically close it to avoid
                the exception.
            </action>
            <action issue="EXEC-34" dev="simonetripodi" type="fix" date="2011-11-30" due-to="Marco Ferrante">
                Race condition prevent watchdog working using ExecuteStreamHandler.
                Patch submittd by Kristian Rosenvold.
            </action>
        </release>
        <release version="1.1" date="2010-10-08" description="Maintenance Release">
            <action dev="sebb" type="fix" date="2010-10-05" >
                OpenVMS now uses symbols instead of logicals for environment variables.
            </action>
            <action dev="sgoeschl" type="add" date="2010-09-21" >
                Adding 'Argument' class and quote the arguments after expansion.                
            </action>
            <action dev="sgoeschl" type="add" date="2010-09-02" >
                Reverting changes of [EXEC-41] because the patch does not fix the problem.
                Also added test case for the broken patch.
            </action>
            <action dev="sgoeschl" type="add" date="2010-08-17" >
                Added TutorialTest as a playground for new user and removed
                similar code from DefaultExecutorTest.
            </action>
            <action dev="sgoeschl" type="fix" date="2010-08-16" >
                String substitution handles now java.io.File instances in order
                to create a cross-platform file name.            
            </action>
            <action dev="sgoeschl" type="fix" date="2010-08-16" >
                The 'forever.bat' accidentally overwrite the 'forever.txt' instead of
                appending.
            </action>
            <action dev="sgoeschl" type="update" date="2010-08-16" >
                DefaultExecutor() now sets the working directory with the current working
                directory.
            </action>
            <action dev="sgoeschl" type="update" date="2010-08-15">
                Added 'DefaultExecutorTest#testStdInHandling' to show how
                commons-exec can feed the 'stdin' of a child process.
            </action>
            <action dev="sgoeschl" type="update" date="2010-08-15" issue="EXEC-42" due-to="Konrad Windzus">
                Improved the documentation.
            </action>
            <action dev="sgoeschl" type="update" date="2010-08-15" issue="EXEC-41" due-to="Ernest Mishkin">
                Added a PumpStreamHandler.setAlwaysWaitForStreamThreads() which allows to skip
                joining with the pumper threads. Having said that - using that flag is for the
                desperate because it could leave up to three worker threads behind but there
                might be situations where this is the only escape.
            </action>
            <action dev="sgoeschl" type="fix" date="2010-08-15" issue="EXEC-46" due-to="Zimmermann Nir">
                Process.waitFor should clear interrupt status when throwing InterruptedException
            </action>
            <action dev="sgoeschl" type="update" date="2010-06-01">
                Added 'DefaultExecuteResultHandler'
            </action>
            <action dev="sgoeschl" type="update" date="2010-06-01" issue="EXEC-42" due-to="Pablo Hoertner">
                Added a new section to the tutorial to show working with asynchronous
                processes. Thanks to Pablo for providing this documentation update.
            </action>
            <action dev="sgoeschl" type="fix" date="2010-05-31" issue="EXEC-44">
                Because the ExecuteWatchdog is the only way to destroy asynchronous processes,
                it should be possible to set it to an infinite timeout, for processes which
                should not timeout, but manually destroyed under some circumstances.
            </action>
        </release>
        <release version="1.0.1" date="2009-09-28" description="Maintenance Release">
            <action dev="henrib" type="fix" date="2009-09-25" issue="EXEC-33">
                On a Mac, the unit tests never finish. Culprit is InputStreamPumper which
                sets its stop member in the run method; however, run might really be executed
                after the stopProcessing method is called if the process
                thread completes before the InputStreamPumper starts.
            </action>
            <action dev="sgoeschl" type="fix" due-to="Peter Henderson" issue="EXEC-40">
                Fixes NPE in DefaultExecutor.setExitValues().
            </action>
            <action dev="sgoeschl" type="fix" due-to="Milos Kleint" issue="EXEC-33">
                Copies all data from an System.input stream to an output stream of
                the executed process.
            </action>
        </release>
        <release version="1.0" date="2009-03-15" description="First Public Release">
            <action dev="sgoeschl" type="fix" due-to="Sebastien Bazley" issue="EXEC-37">
                Removed useless synchronized statement in
                OpenVmsProcessingEnvironment.createProcEnvironment
            </action>
            <action dev="sgoeschl" type="fix" issue="EXEC-33">
                Using System.in for child process will actually hang your application -
                see JIRA for more details. Since there is no easy fix an
                IllegalRuntimeException is thrown when System.in is passed.
            </action>
            <action dev="sgoeschl" type="fix" due-to="Luc Maisonobe" issue="EXEC-35">
                Fixing a few findbugs issues.
            </action>
            <action dev="sgoeschl" type="fix" due-to="Marco Ferrante" issue="EXEC-32">
                Handle null streams consistently.
            </action>
            <action dev="sgoeschl" type="fix">
                After a long discussion we decided to stick to following groupId
                "org.apache.commons" instead of "commons-exec".
            </action>
            <action dev="sgoeschl" type="fix" due-to="Kevin Jackson">
                The Ant build now works even when junit is not on the classpath
            </action>
            <action dev="sgoeschl" type="fix">
                Fixed broken "groupId" from "org.apache.commons" to "commons-exec"
            </action>
            <action dev="sgoeschl" type="fix" issue="EXEC-27" due-to="Benjamin Bentmann">
                Renamed EnvironmentUtil to EnvironmentUtils to align with other classes
                in this project and commons in general. Please note that this change
                could break existing clients (but would be rather unlikely).
            </action>
            <action dev="sgoeschl" type="fix" issue="EXEC-30" due-to="Benjamin Bentmann">
                Make environment variables respect casing rules of platforms. Under Windows
                "PATH", "Path" and "path" would access the same environment variable whereas
                the real name is "Path".
            </action>
            <action dev="sgoeschl" type="fix" issue="EXEC-31" due-to="Benjamin Bentmann">
                Invoking DefaultExecutor.execute(CommandLine command, Map environment) using
                a 'null' Map results in inheriting all environment variables of the current
                process while passing an empty map implies starting the new process with no
                environment variables. In short 'null' is not the same as an empty map.
            </action>
            <action dev="sgoeschl" type="add" issue="EXEC-26" due-to="Benjamin Bentmann">
                Added one additional test : DefaultExecutorTest.testExecuteWithFancyArg
            </action>
            <action dev="sgoeschl" issue="EXEC-25" type="fix">
                Using variable substitution within CommandLine broke the regression tests
                under Windows. Found also another bug when calling CommandLine.getExecutable()
                the result was not substituted at all. As a general rule we do variable
                substitution and file separator fixing on the command line executable and
                variable substitution but NO file separator fixing for the command line
                arguments.
            </action>
            <action dev="sgoeschl" type="add">
                Added convinience method to add two parameters to the CommandLine
                using one method invocation.
            </action>
            <action dev="sgoeschl" type="fix">
                Implemented better regression test for OpenVMS affecting also
                the Executor and CommandLauncher interface.
            </action>
            <action dev="sebb" type="add">
                Added test scripts for OpenVMS - he seems to be the last human
                having access to an OpenVMS box ... :-)
            </action>
            <action dev="sgoeschl" type="add" due-to="Simone Gianni,Bindul Bhowmik,Niall Pemberton,Sebastian Bazley">
                With the help of the Apache Commons community I added the first results
                of cross-OS testing.
            </action>
            <action dev="sgoeschl" type="add">
                The regression tests now also works on Windows - so it should
                work now on Linux, Windows and Mac OS X
            </action>
            <action dev="sgoeschl" type="add">
                Added DebugUtils to improve cross-platform testing.
            </action>
            <action dev="sgoeschl" type="remove">
                Removed commons-logging integration
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-62" due-to="Jeremy Lacoste">
                Made DefaultExecutor.launch() protected to enable mocking.
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-107" due-to="Niklas Gustavsson">
                Made ProcessDestroyer optional and pluggable when using Executor.
            </action>
            <action dev="sgoeschl" type="add">
                CommandLine can now expand the given command line by a user-suppied
                map. This allows to execute something like "${JAVA_HOME}/bin/java -jar ${myapp}"
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-192" due-to="Reinhold Fuereder">
                Added methods to provide pre-quoted arguments.
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-193" due-to="Reinhold Fuereder">
                Exposing a ExecuteWatchdog.destroy() to kill an asynchrounous process
                manually. This formalizes a workaround described in the JIRA
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-203">
                Extending exit value handling to support applications returning an error
                code.
            </action>
            <action dev="sgoeschl" type="fix" issue="SANDBOX-204">
                Cleaned up the source code to get rid of javadoc errors and
                unused imports.
            </action>
            <action dev="sgoeschl" type="add" issue="SANDBOX-204">
                Added a few regression tests for the watchdog since they were missing.
            </action>
        </release>
    </body>
</document>
