<?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>Fulcrum Parser</title>
        <author email="epugh@opensourceconnections.com">Eric Pugh</author>
    </properties>

    <body>
       <release version="2.0.1" date="in SVN">
        <action dev="gk" type="update" date="2019-25-06">
            - use optional Fulcrum Pool (without Recycable feature) again as fallback
            - fix bug in parser resources (using new dispose method from ValueParser instead of same method in Fulcrum Pool Recycable 
            - add + fix tests
            - update commons pool2 version to 2.6.2
          </action>
           <action dev="gk" type="update" date="2019-04-06">
            - rename config param name pool2 be more precise and avoiding name clash with fulcrum pool.
            - allow more pool2 configuration (overwrite common-pool defaults)
          </action>
       </release>
        <release version="2.0.0" date="2019-18-03">
          <action dev="painter" type="update">
            Remove dependency on fulcrum-pool and use commons-pool2 v2.6.1 instead
          </action>
          <action dev="gk" type="update">
            Added tests for getParts()
          </action>
          <action dev="painter" type="update">
            PMD report cleanup
          </action>
          <action dev="painter" type="update">
            Update dependency commons-lang3 to 3.8.1
          </action>
          <action dev="painter" type="update">
            Derive from Turbine parent POM 5
          </action>
          <action dev="tv" type="remove">
            INCOMAPTIBLE: Remove dependency on fulcrum-upload. 
            All FileItems are now Parts.
          </action>
          <action dev="tv" type="update">
            INCOMAPTIBLE: Update dependency servlet-api to 3.1
          </action>
          <action dev="tv" type="update">
            Require Java-8
          </action>
        </release>
        <release version="1.0.3" date="2013-10-03">
          <action dev="tv" type="update">
            Improve getParser() signature to use generics
          </action>
          <action dev="tv" type="update">
            Derive from Turbine parent POM 3
          </action>
          <action dev="tv" type="add">
            ValueParser now extends Iterable
          </action>
          <action dev="tv" type="update">
            Use enum for URL case folding
          </action>
          <action dev="tv" type="update">
            Update dependency commons-lang to 2.6
          </action>
          <action dev="tv" type="update">
            Update dependency fulcrum-upload to 1.0.5
          </action>
          <action dev="tv" type="update">
            Use generics
          </action>
          <action dev="tv" type="update">
            Move to JDK 1.5
          </action>
        </release>
        <release version="1.0.2" date="2009-09-09">
            <action type="update" dev="tv">
                Removed the dependency on commons-logging.
            </action>
            <action type="add" dev="tv">
                Added getBooleans() and getBooleanObjects() to the ValueParser to provide
                a "more orthogonal" interface.
            </action>
            <action type="update" dev="tv">
                Important change: The BaseValueParser now consistently returns null for
                all get-methods that return an Object, if the parameter name does not
                exist.
                This changes the behaviour of getBigDecimal which used to return 0 in
                this case.
            </action>
            <action type="add" dev="tv">
                Made ValueParser and BaseValueParser locale-aware. Note that the default
                locale used is always the default value of the JVM which
                is different from the previous behaviour where the locale used was sometimes
                Locale.US (for float, double and BigDecimal) and sometimes the JVM-default
                (for dates).
            </action>
            <action dev="tv" type="update" issue="TRB-39">
                Totally refactored the component to provide correctly initialized
                parser objects.
            </action>
            <action dev="tv" type="update" issue="TRB-32" due-to="Jürgen Hofmann">
                Port parser fixes of Turbine 2.3.2 over to the component.
            </action>
            <action dev="epugh" type="add">
                Add javabean get/set for dependent upload service to
                DefaultParameterParser.
            </action>
            <action dev="epugh" type="add">
                Basic unit test verifying that the default parser starts up.
            </action>
            <action dev="epugh" type="add">
                Change to commons-logger to be more friendly to who ever
                uses this code.
            </action>
            <action dev="epugh" type="add">
                Removed use of old Log4j Category in favor of Logger.
            </action>
            <action dev="epugh" type="add">
                Make gump friendly.
            </action>
            <action dev="epugh" type="add">
                Initial conversion to Avalon component.
            </action>
        </release>
    </body>
</document>

