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

veithen pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ws-axiom.git


The following commit(s) were added to refs/heads/master by this push:
     new 297152ba3 Fix core-streams compilation under checkerframework profile
297152ba3 is described below

commit 297152ba3bb5ae65d3e7416a3fb3d71f30c80ae7
Author: Copilot <[email protected]>
AuthorDate: Thu Jun 4 07:26:59 2026 +0200

    Fix core-streams compilation under checkerframework profile
    
    Co-authored-by: Andreas Veithen-Knowles <[email protected]>
---
 .../StringOrCharacterDataAnnotatedTypeFactory.java | 25 +++++++++++++++++++++-
 .../axiom/core/stream/CharArrayCharacterData.java  |  7 ++++--
 .../apache/axiom/core/stream/CharacterData.java    |  3 ++-
 .../DocumentElementExtractingFilterHandler.java    |  4 +++-
 .../axiom/core/stream/XmlHandlerWrapper.java       |  4 +++-
 .../sax/output/ContentHandlerXmlHandler.java       |  1 +
 .../axiom/core/stream/serializer/Serializer.java   |  1 +
 .../core/stream/stax/pull/output/StAXPivot.java    |  1 +
 .../stax/push/input/InternalXMLStreamWriter.java   |  3 ++-
 .../stax/push/input/XmlHandlerStreamWriter.java    |  3 ++-
 .../core/stream/util/CharacterDataAccumulator.java |  1 +
 .../xop/AbstractXOPDecodingFilterHandler.java      |  5 +++--
 .../xop/AbstractXOPEncodingFilterHandler.java      |  5 +++--
 13 files changed, 51 insertions(+), 12 deletions(-)

diff --git 
a/buildutils/stringorcharacterdata-checker/src/main/java/org/apache/axiom/checker/StringOrCharacterDataAnnotatedTypeFactory.java
 
b/buildutils/stringorcharacterdata-checker/src/main/java/org/apache/axiom/checker/StringOrCharacterDataAnnotatedTypeFactory.java
index 000b89231..56355a3a6 100644
--- 
a/buildutils/stringorcharacterdata-checker/src/main/java/org/apache/axiom/checker/StringOrCharacterDataAnnotatedTypeFactory.java
+++ 
b/buildutils/stringorcharacterdata-checker/src/main/java/org/apache/axiom/checker/StringOrCharacterDataAnnotatedTypeFactory.java
@@ -18,6 +18,7 @@
  */
 package org.apache.axiom.checker;
 
+import com.sun.source.tree.BinaryTree;
 import java.lang.annotation.Annotation;
 import java.util.LinkedHashSet;
 import java.util.Set;
@@ -64,7 +65,29 @@ public class StringOrCharacterDataAnnotatedTypeFactory 
extends BaseAnnotatedType
 
     @Override
     protected TreeAnnotator createTreeAnnotator() {
-        return new ListTreeAnnotator(super.createTreeAnnotator());
+        return new ListTreeAnnotator(super.createTreeAnnotator(), new 
StringOrCharacterDataTreeAnnotator(this));
+    }
+
+    /**
+     * Runs after {@link 
org.checkerframework.framework.type.treeannotator.PropagationTreeAnnotator}
+     * and re-applies {@code @StringOrCharacterData} to binary expressions 
whose result type is
+     * {@link String}. This is necessary because {@code 
PropagationTreeAnnotator} computes the LUB
+     * of the operand qualifiers for binary {@code +}, so a string 
concatenation such as {@code
+     * "literal " + intValue} would otherwise produce {@code 
@UnknownCharacterDataType String}.
+     */
+    private class StringOrCharacterDataTreeAnnotator extends TreeAnnotator {
+
+        
StringOrCharacterDataTreeAnnotator(StringOrCharacterDataAnnotatedTypeFactory 
factory) {
+            super(factory);
+        }
+
+        @Override
+        public Void visitBinary(BinaryTree node, AnnotatedTypeMirror type) {
+            if (TypesUtils.isString(type.getUnderlyingType())) {
+                type.replaceAnnotation(STRING_OR_CHARACTER_DATA);
+            }
+            return null;
+        }
     }
 
     @Override
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharArrayCharacterData.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharArrayCharacterData.java
index 4ab07fe60..1752b338d 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharArrayCharacterData.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharArrayCharacterData.java
@@ -19,12 +19,15 @@
 package org.apache.axiom.core.stream;
 
 import java.io.IOException;
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
+import org.apache.axiom.core.stream.annotations.UnknownCharacterDataType;
 
 /**
  * A reusable {@link CharacterData} implementation backed by a {@code char[]} 
slice. Instances are
  * only valid for the duration of the {@link XmlHandler#processCharacterData} 
invocation in which
  * they are passed.
  */
+@SuppressWarnings({"super.invocation", "inconsistent.constructor.type"})
 public final class CharArrayCharacterData implements CharacterData {
     private char[] ch;
     private int start;
@@ -50,7 +53,7 @@ public final class CharArrayCharacterData implements 
CharacterData {
     }
 
     @Override
-    public String toString() {
+    public String toString(@UnknownCharacterDataType CharArrayCharacterData 
this) {
         return new String(ch, start, length);
     }
 
@@ -65,7 +68,7 @@ public final class CharArrayCharacterData implements 
CharacterData {
     }
 
     @Override
-    public Object retain() {
+    public @StringOrCharacterData Object retain() {
         return new String(ch, start, length);
     }
 }
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharacterData.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharacterData.java
index d9c7d2a06..5b2cbed07 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharacterData.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/CharacterData.java
@@ -20,6 +20,7 @@ package org.apache.axiom.core.stream;
 
 import java.io.IOException;
 import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
+import org.apache.axiom.core.stream.annotations.UnknownCharacterDataType;
 
 // TODO: clean up this Javadoc
 /**
@@ -29,7 +30,7 @@ import 
org.apache.axiom.core.stream.annotations.StringOrCharacterData;
  */
 public interface CharacterData {
     @Override
-    String toString();
+    String toString(@UnknownCharacterDataType CharacterData this);
 
     void writeTo(CharacterDataSink sink) throws IOException;
 
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/DocumentElementExtractingFilterHandler.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/DocumentElementExtractingFilterHandler.java
index 2460f9c13..7206b41e2 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/DocumentElementExtractingFilterHandler.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/DocumentElementExtractingFilterHandler.java
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.core.stream;
 
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
+
 public final class DocumentElementExtractingFilterHandler extends 
XmlHandlerWrapper {
     private int depth;
 
@@ -52,7 +54,7 @@ public final class DocumentElementExtractingFilterHandler 
extends XmlHandlerWrap
             throws StreamException {}
 
     @Override
-    public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
+    public void processCharacterData(@StringOrCharacterData Object data, 
boolean ignorable) throws StreamException {
         if (depth > 0) {
             super.processCharacterData(data, ignorable);
         }
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
index cc1893bbf..2635f6ead 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/XmlHandlerWrapper.java
@@ -18,6 +18,8 @@
  */
 package org.apache.axiom.core.stream;
 
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
+
 public class XmlHandlerWrapper implements XmlHandler {
     private final XmlHandler parent;
 
@@ -79,7 +81,7 @@ public class XmlHandlerWrapper implements XmlHandler {
     }
 
     @Override
-    public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
+    public void processCharacterData(@StringOrCharacterData Object data, 
boolean ignorable) throws StreamException {
         parent.processCharacterData(data, ignorable);
     }
 
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/sax/output/ContentHandlerXmlHandler.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/sax/output/ContentHandlerXmlHandler.java
index e788270f2..fd8048687 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/sax/output/ContentHandlerXmlHandler.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/sax/output/ContentHandlerXmlHandler.java
@@ -204,6 +204,7 @@ public class ContentHandlerXmlHandler implements 
XmlHandler, CharacterDataSink {
     }
 
     @Override
+    @SuppressWarnings("instanceof.pattern.unsafe")
     public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
         try {
             switch (characterDataMode) {
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/serializer/Serializer.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/serializer/Serializer.java
index 077a6c702..e5b111a25 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/serializer/Serializer.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/serializer/Serializer.java
@@ -479,6 +479,7 @@ public final class Serializer implements XmlHandler, 
CharacterDataSink {
     }
 
     @Override
+    @SuppressWarnings("instanceof.pattern.unsafe")
     public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
         closeStartTag();
         if (data instanceof CharacterData characterData) {
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/pull/output/StAXPivot.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/pull/output/StAXPivot.java
index d62483f9a..958a92db4 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/pull/output/StAXPivot.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/pull/output/StAXPivot.java
@@ -352,6 +352,7 @@ public final class StAXPivot implements 
InternalXMLStreamReader, XmlHandler {
     }
 
     @Override
+    @SuppressWarnings("instanceof.pattern.unsafe")
     public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
         switch (state) {
             case STATE_DEFAULT -> {
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/InternalXMLStreamWriter.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/InternalXMLStreamWriter.java
index f420e9c76..a410184a7 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/InternalXMLStreamWriter.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/InternalXMLStreamWriter.java
@@ -20,7 +20,8 @@ package org.apache.axiom.core.stream.stax.push.input;
 
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamWriter;
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
 
 public interface InternalXMLStreamWriter extends XMLStreamWriter {
-    void writeCharacterData(Object data) throws XMLStreamException;
+    void writeCharacterData(@StringOrCharacterData Object data) throws 
XMLStreamException;
 }
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/XmlHandlerStreamWriter.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/XmlHandlerStreamWriter.java
index d30b1c76b..8b5f2ff05 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/XmlHandlerStreamWriter.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/stax/push/input/XmlHandlerStreamWriter.java
@@ -28,6 +28,7 @@ import javax.xml.namespace.NamespaceContext;
 import javax.xml.stream.XMLStreamException;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
 import org.apache.axiom.core.stream.serializer.Serializer;
 import 
org.apache.axiom.core.stream.serializer.writer.UnmappableCharacterHandler;
 import org.apache.commons.logging.Log;
@@ -361,7 +362,7 @@ public final class XmlHandlerStreamWriter implements 
InternalXMLStreamWriter, Na
     }
 
     @Override
-    public void writeCharacterData(Object data) throws XMLStreamException {
+    public void writeCharacterData(@StringOrCharacterData Object data) throws 
XMLStreamException {
         finishStartElement();
         try {
             handler.processCharacterData(data, false);
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
index d9ca093f9..8cdbd64fb 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/util/CharacterDataAccumulator.java
@@ -23,6 +23,7 @@ import org.apache.axiom.core.stream.CharacterData;
 public class CharacterDataAccumulator {
     private Object content;
 
+    @SuppressWarnings("instanceof.pattern.unsafe")
     public void append(Object data) {
         if (content == null) {
             content = data instanceof CharacterData cd ? cd.retain() : data;
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java
index a36b98bf6..65a61e6d6 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPDecodingFilterHandler.java
@@ -24,6 +24,7 @@ import javax.xml.namespace.QName;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.XmlHandlerWrapper;
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
 
 public abstract class AbstractXOPDecodingFilterHandler extends 
XmlHandlerWrapper {
     private static final String SOLE_CHILD_MSG =
@@ -44,7 +45,7 @@ public abstract class AbstractXOPDecodingFilterHandler 
extends XmlHandlerWrapper
         super(parent);
     }
 
-    protected abstract Object buildCharacterData(String contentID) throws 
StreamException;
+    protected abstract @StringOrCharacterData Object buildCharacterData(String 
contentID) throws StreamException;
 
     private void inContent() throws StreamException {
         switch (state) {
@@ -128,7 +129,7 @@ public abstract class AbstractXOPDecodingFilterHandler 
extends XmlHandlerWrapper
     }
 
     @Override
-    public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
+    public void processCharacterData(@StringOrCharacterData Object data, 
boolean ignorable) throws StreamException {
         inContent();
         super.processCharacterData(data, ignorable);
     }
diff --git 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java
 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java
index c76b6ce5b..41e618243 100644
--- 
a/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java
+++ 
b/components/core-streams/src/main/java/org/apache/axiom/core/stream/xop/AbstractXOPEncodingFilterHandler.java
@@ -21,6 +21,7 @@ package org.apache.axiom.core.stream.xop;
 import org.apache.axiom.core.stream.StreamException;
 import org.apache.axiom.core.stream.XmlHandler;
 import org.apache.axiom.core.stream.XmlHandlerWrapper;
+import org.apache.axiom.core.stream.annotations.StringOrCharacterData;
 
 public abstract class AbstractXOPEncodingFilterHandler extends 
XmlHandlerWrapper {
     private boolean inXOPInclude;
@@ -29,7 +30,7 @@ public abstract class AbstractXOPEncodingFilterHandler 
extends XmlHandlerWrapper
         super(parent);
     }
 
-    protected abstract String processCharacterData(Object data) throws 
StreamException;
+    protected abstract String processCharacterData(@StringOrCharacterData 
Object data) throws StreamException;
 
     /**
      * Build a cid URL from the given content ID as described in RFC2392.
@@ -90,7 +91,7 @@ public abstract class AbstractXOPEncodingFilterHandler 
extends XmlHandlerWrapper
     }
 
     @Override
-    public void processCharacterData(Object data, boolean ignorable) throws 
StreamException {
+    public void processCharacterData(@StringOrCharacterData Object data, 
boolean ignorable) throws StreamException {
         if (!ignorable) {
             String contentID = processCharacterData(data);
             if (contentID != null) {

Reply via email to