<?xml version="1.0"?>
<!--
 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.
-->

<!--
This file is used by the maven-changes-plugin to generate the release notes.
Useful ways of finding items to add to this file are:

1.  Add items when you fix a bug or add a feature (this makes the 
release process easy :-).

2.  Do a Jira search for tickets closed since the previous release.

3.  Use the report generated by the maven-changelog-plugin to see all
CVS commits.  Set the project.properties' maven.changelog.range 
property to the number of days since the last release.


To generate the release notes from this file:

mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=nnn]

then tweak the source formatting if necessary and regenerate, then commit

The <action> type attribute can be add,update,fix,remove.
-->

<document xmlns="http://maven.apache.org/changes/2.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/changes/2.0.0 https://maven.apache.org/xsd/changes-2.0.0.xsd">
  <properties>
    <title>Release Notes</title>
  </properties>
  <body>
    <!-- The release date is the date RC is cut -->
    <release version="1.4.0" date="2025-04-12" description="New features and bug fixes.">
      <!-- FIX -->
      <action issue="JXPATH-172" dev="britter" type="fix" due-to="Michele Vivoda">
        Clarify Javadoc of JXPathContext#getPointer.
      </action>
      <action issue="JXPATH-113" dev="britter" type="fix" due-to="Michele Vivoda">
        NullPointerException in ChildContext when document only contains an empty root node.
      </action>
      <action issue="JXPATH-160" dev="britter" type="fix" due-to="Stefan Albrecht, Michele Vivoda, Uwe Barthel">
        ValueUtils.getValue throws exception with set and index above size.
      </action>
      <action issue="JXPATH-162" dev="britter" type="fix" due-to="Uwe Barthel">
        Concurrency problem for JXPathContextFactory.factoryImplName static field.
      </action>
      <action issue="JXPATH-141" dev="mbenson" type="fix">
        FunctionLibrary Multithreading issue.
      </action>
      <action issue="JXPATH-131" dev="mbenson" type="fix" due-to="Gabriel Buades Rubio">
        Bean exception handling.
      </action>
      <action issue="JXPATH-128" dev="mbenson" type="fix" due-to="Gabriel Buades Rubio">
        JXPath support for LazyDynaBean is broken.
      </action>
      <action issue="JXPATH-129" dev="mbenson" type="fix">
        MethodLookupUtils#matchType uses TypeUtils#canConvert which causes "Ambiguous method call" exception.
      </action>
      <action issue="JXPATH-153" dev="mbenson" type="fix">
        Wrong entry IMPORT-PACKAGE in the file MANIFEST.MF for jdom and commons-beanutils.
      </action>
      <action issue="JXPATH-153" dev="mbenson" type="fix" due-to="John Trimble">
        Change dynamic class loading to consult context class loader.
      </action>
      <action issue="JXPATH-152" dev="mbenson" type="fix">
        Concurrent access on hashmap of JXPathIntrospector.
      </action>
      <action dev="ggregory" type="fix">
        Fix possible NPE in PackageFunctions.getFunction(String, String, Object[]).
      </action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">
        JDOMNodePointer.compareChildNodePointers() now throws IllegalStateException instead of RuntimeException.
      </action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">
        ValueUtils.setValue() now throws IllegalArgumentException instead of RuntimeException.
      </action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">
        ClassLoaderUtil.toCanonicalName() now calls Objects.requireNonNull() instead of throwing a RuntimeException.
      </action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">
        XMLDocumentContainer.XMLDocumentContainer(Source) now calls Objects.requireNonNull() instead of throwing a RuntimeException.
      </action>
      <action dev="ggregory" type="fix" due-to="step-security-bot, Gary Gregory">
        [StepSecurity] CI: Harden GitHub Actions #66.
      </action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Add missing Javadoc.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Fix PMD UnnecessaryFullyQualifiedName.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Add generics to JXPathContext.iterate(String).</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Add generics to JXPathContext.iteratePointers(String).</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Add generics to JXPathContext.decimalFormats.</action>
      <action dev="ggregory" type="fix" due-to="strangelookingnerd">Migrate tests to JUnit5 #214.</action>
      <action dev="ggregory" type="fix" due-to="strangelookingnerd, Gary Gregory">Replace try-catch constructs in tests with assertThrows #215.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Use generics internally.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">NodeSet.getPointers() is now typed with generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">ServletContextHandler.collectPropertyNames(HashSet, Object) is now typed with generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate MethodLookupUtils.MethodLookupUtils().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate KeyManagerUtils.KeyManagerUtils().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate TypeUtils.TypeUtils().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate ValueUtils.ValueUtils().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">PageScopeContext.getAttributeNames() is now typed with generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Functions.getUsedNamespaces() is now typed with generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">JXPathException now reuses its superclass' Throwable cause.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Bump JXPathException serialVersionUID from 4306409701468017766L to 2L.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">JXPathContextFactoryConfigurationError now reuses its superclass' Throwable cause.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Bump JXPathContextFactoryConfigurationError serialVersionUID from 1L to 2L.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate SimplePathInterpreter.SimplePathInterpreter().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate JXPathServletContexts.JXPathServletContexts().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate JXPathIntrospector.JXPathIntrospector().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate InfoSetUtil.InfoSetUtil().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Constants.Constants().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Deprecate Parser.Parser().</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">JXPathException.JXPathException(Throwable) now remembers its Throwable cause argument.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Make the private DOMNodePointer.id field final.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Make the private NullPointer.id field final.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Make the private NullPointer.qname field final.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">Make the private JDOMNodePointer.id field final.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">ExpressionContext.getContextNodeList() now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">BasicTypeConverter.unmodifiableCollection(Collection) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory. PMD">Fix PMD AvoidDecimalLiteralsInBigDecimalConstructor in org.apache.commons.jxpath.util.BasicTypeConverter.allocateNumber(Class, double).</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iteratePointers(String) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.ri.JXPathContextReferenceImpl.iteratePointers(String, Expression) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.CompiledExpression.iteratePointers(JXPathContext) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.JXPathCompiledExpression.iteratePointers(JXPathContext) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.util.ClassLoaderUtil.getClass(ClassLoader, String) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.util.ClassLoaderUtil.getClass(ClassLoader, String, boolean) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.util.ClassLoaderUtil.getClass(String) now uses generics.</action>
      <action dev="ggregory" type="fix" due-to="Gary Gregory">org.apache.commons.jxpath.util.ClassLoaderUtil.getClass(String, boolean) now uses generics.</action>
      <!-- ADD -->
      <action issue="JXPATH-123" dev="mbenson" type="add">
        XPath function "ends-with" is not implemented (although "starts-with" is).
      </action>
      <action dev="ggregory" type="update">public class org.apache.commons.jxpath.JXPathContextFactoryConfigurationError is Serializable incompatible.</action>
      <action dev="ggregory" type="update">public abstract class org.apache.commons.jxpath.ri.model.beans.PropertyOwnerPointer is Serializable incompatible.</action>
      <action dev="ggregory" type="update">public abstract class org.apache.commons.jxpath.ri.model.beans.PropertyPointer is Serializable incompatible.</action>
      <action dev="ggregory" type="update">public abstract class org.apache.commons.jxpath.ri.model.NodePointer is Serializable incompatible.</action>
      <action dev="ggregory" type="update">public class org.apache.commons.jxpath.ri.parser.ParseException is Serializable incompatible.</action>
      <action dev="ggregory" type="update">public class org.apache.commons.jxpath.XMLDocumentContainer is Serializable incompatible.</action>
      <!-- UPDATE -->
      <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
        Bump commons-parent from 54 to 81 #45, #49, #64, #110, #121, #403, #167, #173, #176, #181, #185, #188, #196.
      </action>
      <action issue="JXPATH-184" dev="britter" type="update" due-to="britter, Gary Gregory">
        Bump Java to 8.
      </action>
      <action dev="ggregory" type="update" due-to="britter, Gary Gregory">
        Bump JUnit 3.8.1 to 4.13.2.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
        Bump commons-logging from 1.1.1 to 1.3.5 #34, #129, #147, #160, #174.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot, Gary Gregory">
        Bump commons-beanutils from 1.8.2 to 1.10.1 #24.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot">
        Bump taglist-maven-plugin from 2.2 to 3.0.0 #32.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot">
        Bump servlet-api from 2.4 to 2.5 #29.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot">
        Bump JDOM from jdom:jdom 1.0 to org.jdom:jdom 1.1.3.
      </action>
      <action dev="ggregory" type="update" due-to="Dependabot">
        Bump org.codehaus.mojo:taglist-maven-plugin from 3.0.0 to 3.2.1 #161, #194.
      </action>
      <!-- REMOVE -->
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete Apache RAT file.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete Apache Ant files.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete src/conf/MANIFEST.MF file.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete maven-surefire-plugin configuration. Configuration is done in the parent POM.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete maven-assembly-plugin configuration. Configuration is done in the parent POM.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove obsolete STATUS.html files.</action>
      <action dev="ggregory" type="remove" due-to="Gary Gregory">Remove unused package-private class org.apache.commons.jxpath.util.BasicTypeConverter.ValueNodeSet.</action>
    </release>
  </body>
</document>
