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) {