<?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>Apache Commons Exec Release Notes</title>
        <author email="sgoeschl@apache.org">Siegfried Goeschl</author>
    </properties>
    <body>
        <release version="1.4" date="" description="Maintenance and feature Release">
            <action issue="EXEC-100" dev="sgoeschl" type="update" date="2016-01-11">
                Sync org.apache.commons.exec.OS with the newest Ant source file
            </action>
            <action issue="EXEC-64" dev="sebb" type="update" due-to=" Michael Vorburger">
                DefaultExecutor swallows IOException cause instead of propagating it
                (work-round for Java 1.5)
            </action>
        </release>
        <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>
