You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by fa...@apache.org on 2026/10/02 13:28:27 UTC

(poi-xmlbeans) branch trunk updated: upgrade to Saxon 13.0 (#122)

This is an automated email from the ASF dual-hosted git repository.

pjfanning pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/poi-xmlbeans.git


The following commit(s) were added to refs/heads/trunk by this push:
     new e05a784d upgrade to Saxon 13.0 (#122)
e05a784d is described below

commit e05a784d81eb5c9fc8a7a73daebce5ede9c6cae7
Author: PJ Fanning <pj...@users.noreply.github.com>
AuthorDate: Fri Oct 2 14:28:19 2026 +0100

    upgrade to Saxon 13.0 (#122)
    
    * upgrade to Saxon 13.0
    
    Saxon 13 requires Java 17 to build (the xmlbeans jar still targets Java 8).
    
    - SaxonXQuery: replace removed HashTrieMap with GeneralMapBuilder,
      removed DurationValue ctor with DurationValue.makeDuration and
      DateValue.makeDateValue(UnicodeString, ConversionRules) with
      DateValue.tryParseDate
    - SaxonXPathEngine: use getStringValue() for remaining AtomicValues,
      as toString() no longer returns the lexical form (e.g. durations)
    - CI workflows: build with JDK 17
    
    Co-Authored-By: Claude Opus 5.5 <no...@anthropic.com>
    
    * build CodeQL analysis with JDK 17 (needed for Saxon 13)
    
    CodeQL autobuild ran Gradle on JDK 11, which cannot read the Saxon 13
    class files. Replace autobuild with an explicit JDK 17 build and move
    off the deprecated codeql-action v2.
    
    Co-Authored-By: Claude Opus 5.5 <no...@anthropic.com>
    
    ---------
    
    Co-authored-by: Claude Opus 5.5 <no...@anthropic.com>
---
 .github/workflows/codeql-analysis.yml              | 28 ++++++++++------------
 .github/workflows/publish-snapshot.yml             |  4 ++--
 .github/workflows/test-gradle.yml                  |  4 ++--
 LICENSE-binary.txt                                 |  2 +-
 build.gradle                                       |  2 +-
 build.xml                                          |  2 +-
 .../impl/xpath/saxon/SaxonXPathEngine.java         |  4 ++++
 .../xmlbeans/impl/xpath/saxon/SaxonXQuery.java     | 16 ++++++-------
 .../maven/org.apache.xmlbeans/xmlbeans/pom.xml     |  2 +-
 src/main/maven/plugin.xml                          |  2 +-
 10 files changed, 32 insertions(+), 34 deletions(-)

diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 0df43204..cfb041cb 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -40,9 +40,17 @@ jobs:
       - name: Checkout repository
         uses: actions/checkout@v6
 
+      # Saxon 13 requires Java 17; CodeQL autobuild would pick JDK 11
+      - name: Set up JDK
+        uses: actions/setup-java@v5
+        with:
+          distribution: 'temurin'
+          java-version: '17'
+          cache: 'gradle'
+
       # Initializes the CodeQL tools for scanning.
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@v2
+        uses: github/codeql-action/init@v4
         with:
           languages: ${{ matrix.language }}
           # If you wish to specify custom queries, you can do so here or in a config file.
@@ -53,20 +61,8 @@ jobs:
           # queries: security-extended,security-and-quality
 
 
-      # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
-      # If this step fails, then you should remove it and run the build manually (see below)
-      - name: Autobuild
-        uses: github/codeql-action/autobuild@v2
-
-      # â„šī¸ Command-line programs to run using the OS shell.
-      # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
-
-      #   If the Autobuild fails above, remove it and uncomment the following three lines.
-      #   modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
-
-      # - run: |
-      #   echo "Run, Build Application using script"
-      #   ./location_of_script_within_repo/buildscript.sh
+      - name: Build with Gradle
+        run: ./gradlew testClasses -PjdkVersion=17 --no-daemon
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@v2
+        uses: github/codeql-action/analyze@v4
diff --git a/.github/workflows/publish-snapshot.yml b/.github/workflows/publish-snapshot.yml
index 6466fdd8..00cf891e 100644
--- a/.github/workflows/publish-snapshot.yml
+++ b/.github/workflows/publish-snapshot.yml
@@ -27,7 +27,7 @@ jobs:
       uses: actions/setup-java@v5
       with:
         distribution: 'temurin'
-        java-version: '8'
+        java-version: '17'
 
     - name: Grant execute permission for gradlew
       run: chmod +x gradlew
@@ -38,7 +38,7 @@ jobs:
           *-SNAPSHOT) ;;
           *) echo "not a SNAPSHOT version, skipping"; exit 0 ;;
         esac
-        ./gradlew publishPOIPublicationToApacheRepository -PjdkVersion=8 --no-daemon
+        ./gradlew publishPOIPublicationToApacheRepository -PjdkVersion=17 --no-daemon
       env:
         ORG_GRADLE_PROJECT_apacheUsername: ${{ secrets.NEXUS_USER }}
         ORG_GRADLE_PROJECT_apachePassword: ${{ secrets.NEXUS_PW }}
diff --git a/.github/workflows/test-gradle.yml b/.github/workflows/test-gradle.yml
index d4e3940a..b6150bee 100644
--- a/.github/workflows/test-gradle.yml
+++ b/.github/workflows/test-gradle.yml
@@ -28,11 +28,11 @@ jobs:
       uses: actions/setup-java@v5
       with:
         distribution: 'temurin'
-        java-version: '8'
+        java-version: '17'
         cache: 'gradle'
 
     - name: Grant execute permission for gradlew
       run: chmod +x gradlew
 
     - name: Build with Gradle
-      run: ./gradlew test -PjdkVersion=8 --no-daemon
+      run: ./gradlew test -PjdkVersion=17 --no-daemon
diff --git a/LICENSE-binary.txt b/LICENSE-binary.txt
index 784720fd..7db06c05 100755
--- a/LICENSE-binary.txt
+++ b/LICENSE-binary.txt
@@ -226,4 +226,4 @@ org.javassist:javassist:3.30.2-GA
 Mozilla Public License 2.0
 --------------------------
 
-net.sf.saxon:Saxon-HE:12.10
+net.sf.saxon:Saxon-HE:13.0
diff --git a/build.gradle b/build.gradle
index e310a34b..59f46464 100644
--- a/build.gradle
+++ b/build.gradle
@@ -70,7 +70,7 @@ ext {
     antVersion = '1.10.17'
     javaparserVersion = '3.28.2'
     log4jVersion = '2.26.1'
-    saxonVersion = '12.10'
+    saxonVersion = '13.0'
     androidSdkMinimum = '26'
     jdkVersion = (project.properties['jdkVersion'] ?: '8') as int
 }
diff --git a/build.xml b/build.xml
index 76f3319f..81f109bc 100644
--- a/build.xml
+++ b/build.xml
@@ -121,7 +121,7 @@
     <!-- dependencies -->
     <dependency prefix="xml-apis" artifact="xml-apis:xml-apis:1.4.01" usage="java8"/>
     <dependency prefix="log4j-api" artifact="org.apache.logging.log4j:log4j-api:2.26.1" usage="main"/>
-    <dependency prefix="saxon" artifact="net.sf.saxon:Saxon-HE:12.10" usage="main"/>
+    <dependency prefix="saxon" artifact="net.sf.saxon:Saxon-HE:13.0" usage="main"/>
     <dependency prefix="ant" artifact="org.apache.ant:ant:1.10.17" usage="main"/>
     <dependency prefix="javaparser-core" artifact="com.github.javaparser:javaparser-core:3.28.2" usage="main"/>
     <dependency prefix="javaparser-symbol-solver-core" artifact="com.github.javaparser:javaparser-symbol-solver-core:3.28.2" usage="main"/>
diff --git a/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXPathEngine.java b/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXPathEngine.java
index 1c9a8112..19fc5c02 100644
--- a/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXPathEngine.java
+++ b/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXPathEngine.java
@@ -15,6 +15,7 @@
 
 package org.apache.xmlbeans.impl.xpath.saxon;
 
+import net.sf.saxon.value.AtomicValue;
 import net.sf.saxon.value.DateTimeValue;
 import net.sf.saxon.value.GDateValue;
 import org.apache.xmlbeans.*;
@@ -77,6 +78,9 @@ public class SaxonXPathEngine extends XPathExecutionContext implements XPathEngi
                     value = ((DateTimeValue) obj).getStringValue();
                 } else if (obj instanceof BigDecimal) {
                     value = ((BigDecimal) obj).toPlainString();
+                } else if (obj instanceof AtomicValue) {
+                    // e.g. DurationValue - since Saxon 13, toString() no longer returns the lexical form
+                    value = ((AtomicValue) obj).getStringValue();
                 } else {
                     value = obj.toString();
                 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXQuery.java b/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXQuery.java
index ef73cb4a..54f26c04 100644
--- a/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXQuery.java
+++ b/src/main/java/org/apache/xmlbeans/impl/xpath/saxon/SaxonXQuery.java
@@ -18,7 +18,7 @@ package org.apache.xmlbeans.impl.xpath.saxon;
 import net.sf.saxon.Configuration;
 import net.sf.saxon.dom.DocumentWrapper;
 import net.sf.saxon.dom.NodeOverNodeInfo;
-import net.sf.saxon.ma.map.HashTrieMap;
+import net.sf.saxon.ma.map.GeneralMapBuilder;
 import net.sf.saxon.om.Item;
 import net.sf.saxon.om.NamespaceUri;
 import net.sf.saxon.om.NodeInfo;
@@ -248,10 +248,7 @@ public class SaxonXQuery implements XQuery {
             return ((SaxonDuration) value).getDurationValue();
         } else if (value instanceof Duration) {
             // this is simpler and safer (but perhaps slower) than extracting all the components
-            //return DurationValue.makeDuration(value.toString()).asAtomic();
-            Duration dv = (Duration) value;
-            return new DurationValue(dv.getSign() >= 0, dv.getYears(), dv.getMonths(), dv.getDays(),
-                dv.getHours(), dv.getMinutes(), dv.getSeconds(), 0); // take correct millis..
+            return DurationValue.makeDuration(StringView.tidy(value.toString())).asAtomic();
         } else if (value instanceof SaxonXMLGregorianCalendar) {
             return ((SaxonXMLGregorianCalendar) value).toCalendarValue();
         } else if (value instanceof XMLGregorianCalendar) {
@@ -261,7 +258,8 @@ public class SaxonXQuery implements XQuery {
                 return DateTimeValue.makeDateTimeValue(StringView.tidy(value.toString()),
                         config.getConversionRules()).asAtomic();
             } else if (gtype.equals(DatatypeConstants.DATE)) {
-                return DateValue.makeDateValue(StringView.tidy(value.toString()), config.getConversionRules()).asAtomic();
+                return DateValue.tryParseDate(value.toString(),
+                        config.getConversionRules().isAllowYearZero()).asAtomic();
             } else if (gtype.equals(DatatypeConstants.TIME)) {
                 return TimeValue.makeTimeValue(StringView.tidy(value.toString())).asAtomic();
             } else if (gtype.equals(DatatypeConstants.GYEAR)) {
@@ -290,13 +288,13 @@ public class SaxonXQuery implements XQuery {
         } else if (value instanceof URI) {
             return new AnyURIValue(value.toString());
         } else if (value instanceof Map) {
-            HashTrieMap htm = new HashTrieMap();
+            GeneralMapBuilder mb = new GeneralMapBuilder(config.getMapSpecVersion());
             for (Map.Entry<?, ?> me : ((Map<?, ?>) value).entrySet()) {
-                htm.initialPut(
+                mb.put(
                     (AtomicValue) objectToItem(me.getKey(), config),
                     objectToItem(me.getValue(), config));
             }
-            return htm;
+            return mb.getCompletedMap();
         } else {
             return new ObjectValue<>(value);
         }
diff --git a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml
index 20fed2c4..17169cd3 100644
--- a/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml
+++ b/src/main/maven/org.apache.xmlbeans/xmlbeans/pom.xml
@@ -97,7 +97,7 @@
         <dependency>
             <groupId>net.sf.saxon</groupId>
             <artifactId>Saxon-HE</artifactId>
-            <version>12.10</version>
+            <version>13.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/maven/plugin.xml b/src/main/maven/plugin.xml
index 6877fc26..2a2faddf 100644
--- a/src/main/maven/plugin.xml
+++ b/src/main/maven/plugin.xml
@@ -417,7 +417,7 @@
         <dependency>
             <groupId>net.sf.saxon</groupId>
             <artifactId>Saxon-HE</artifactId>
-            <version>12.10</version>
+            <version>13.0</version>
         </dependency>
         <dependency>
             <groupId>com.github.javaparser</groupId>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org