diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/package-info.java index 40747ef7192..7f0b3ac0667 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/config/package-info.java @@ -1,4 +1,5 @@ /** * Contains parser classes for the XML namespace support. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.config; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/package-info.java index 17a424ed6c5..da9cfc92d73 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/package-info.java @@ -1,4 +1,5 @@ /** * Root package of the XML Module. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/result/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/result/package-info.java index 81ec8d45b54..05d4a527773 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/result/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/result/package-info.java @@ -3,4 +3,5 @@ * will return {@link javax.xml.transform.Result}, possibly taking into account * payload instance. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.result; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java index e31980c9121..5c53dde0504 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/router/XPathRouter.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; +import org.jspecify.annotations.Nullable; import org.w3c.dom.DOMException; import org.w3c.dom.Node; @@ -128,7 +129,7 @@ private static class TextContentNodeMapper implements NodeMapper { } @Override - public Object mapNode(Node node, int nodeNum) throws DOMException { + public @Nullable Object mapNode(Node node, int nodeNum) throws DOMException { return node.getTextContent(); } diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelector.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelector.java index 30a231d021b..c635a663f8a 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelector.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/XmlValidatingMessageSelector.java @@ -20,6 +20,7 @@ import java.io.UncheckedIOException; import java.util.Arrays; +import org.jspecify.annotations.Nullable; import org.xml.sax.SAXParseException; import org.springframework.core.io.Resource; @@ -83,7 +84,7 @@ public String getUrl() { * @param schemaType The schema type. * @throws IOException if the XmlValidatorFactory fails to create a validator */ - public XmlValidatingMessageSelector(Resource schema, SchemaType schemaType) throws IOException { + public XmlValidatingMessageSelector(Resource schema, @Nullable SchemaType schemaType) throws IOException { this(XmlValidatorFactory.createValidator(schema, schemaType == null ? SchemaType.XML_SCHEMA.getUrl() @@ -95,7 +96,7 @@ public XmlValidatingMessageSelector(XmlValidator xmlValidator) { this.xmlValidator = xmlValidator; } - public XmlValidatingMessageSelector(Resource schema, String schemaType) throws IOException { + public XmlValidatingMessageSelector(Resource schema, @Nullable String schemaType) throws IOException { this(schema, StringUtils.hasText(schemaType) ? SchemaType.valueOf(schemaType.toUpperCase().replaceFirst("-", "_")) diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/package-info.java index 872a033f35b..06bb5e8a82d 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/selector/package-info.java @@ -2,4 +2,5 @@ * Provides XML-centric {@link org.springframework.integration.core.MessageSelector} * implementations. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.selector; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/source/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/source/package-info.java index 188d09c6553..a8562cea708 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/source/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/source/package-info.java @@ -2,4 +2,5 @@ * Provides various {@link org.springframework.integration.xml.source.SourceFactory} * implementations. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.source; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java index e34bd626f1f..d808d223429 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/XPathMessageSplitter.java @@ -38,6 +38,7 @@ import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; @@ -82,7 +83,7 @@ public class XPathMessageSplitter extends AbstractMessageSplitter { private final XPathExpression xpathExpression; - private javax.xml.xpath.XPathExpression jaxpExpression; + private javax.xml.xpath.@Nullable XPathExpression jaxpExpression; private boolean createDocuments; @@ -90,7 +91,7 @@ public class XPathMessageSplitter extends AbstractMessageSplitter { private XmlPayloadConverter xmlPayloadConverter = new DefaultXmlPayloadConverter(); - private Properties outputProperties; + private @Nullable Properties outputProperties; private boolean returnIterator = true; @@ -292,7 +293,7 @@ private Object splitDocument(Document document) throws ParserConfigurationExcept } private Object splitNode(Node node) throws ParserConfigurationException { - if (this.returnIterator) { + if (this.returnIterator && this.jaxpExpression != null) { try { NodeList nodeList = (NodeList) this.jaxpExpression.evaluate(node, XPathConstants.NODESET); return new NodeListIterator(nodeList); @@ -338,7 +339,7 @@ private DocumentBuilder getNewDocumentBuilder() throws ParserConfigurationExcept private final class NodeListIterator implements Iterator { - private final DocumentBuilder documentBuilder; + private final @Nullable DocumentBuilder documentBuilder; private final NodeList nodeList; @@ -360,7 +361,7 @@ public boolean hasNext() { } @Override - public Node next() { + public @Nullable Node next() { if (!hasNext()) { return null; } diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/package-info.java index 111afc25237..7f50dae02c9 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/splitter/package-info.java @@ -2,4 +2,5 @@ * Provides implementations of * {@link org.springframework.integration.splitter.AbstractMessageSplitter}. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.splitter; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java index 5a992bcd2a4..9152b14afda 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/AbstractXmlTransformer.java @@ -16,6 +16,8 @@ package org.springframework.integration.xml.transformer; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.factory.BeanFactory; import org.springframework.integration.transformer.AbstractTransformer; import org.springframework.integration.xml.result.DomResultFactory; @@ -39,9 +41,9 @@ public abstract class AbstractXmlTransformer extends AbstractTransformer { public static final String STRING_RESULT = "StringResult"; - private volatile String resultType; + private volatile @Nullable String resultType; - private volatile String resultFactoryName; + private volatile @Nullable String resultFactoryName; private volatile ResultFactory resultFactory = new DomResultFactory(); @@ -58,11 +60,11 @@ public void setResultFactory(ResultFactory resultFactory) { this.resultFactory = resultFactory; } - public String getResultType() { + public @Nullable String getResultType() { return this.resultType; } - public String getResultFactoryName() { + public @Nullable String getResultFactoryName() { return this.resultFactoryName; } @@ -85,7 +87,7 @@ protected void onInit() { * a bean definition for a {@link ResultFactory} based on either the * 'result-factory' or 'result-type' attributes. */ - private ResultFactory configureResultFactory(String resultType, String resultFactoryName, BeanFactory beanFactory) { + private @Nullable ResultFactory configureResultFactory(@Nullable String resultType, @Nullable String resultFactoryName, BeanFactory beanFactory) { boolean bothHaveText = StringUtils.hasText(resultFactoryName) && StringUtils.hasText(resultType); ResultFactory configuredResultFactory = null; Assert.state(!bothHaveText, "Only one of 'result-factory' or 'result-type' should be specified."); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java index 48cdf231dd0..baec0943e4c 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/MarshallingTransformer.java @@ -20,6 +20,8 @@ import javax.xml.transform.Result; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.Message; import org.springframework.messaging.MessagingException; import org.springframework.oxm.Marshaller; @@ -39,11 +41,11 @@ public class MarshallingTransformer extends AbstractXmlTransformer { private final Marshaller marshaller; - private final ResultTransformer resultTransformer; + private final @Nullable ResultTransformer resultTransformer; private volatile boolean extractPayload = true; - public MarshallingTransformer(Marshaller marshaller, ResultTransformer resultTransformer) { + public MarshallingTransformer(Marshaller marshaller, @Nullable ResultTransformer resultTransformer) { Assert.notNull(marshaller, "a marshaller is required"); this.marshaller = marshaller; this.resultTransformer = resultTransformer; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/ResultToStringTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/ResultToStringTransformer.java index a1167a00a5c..f05d12468ec 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/ResultToStringTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/ResultToStringTransformer.java @@ -28,6 +28,8 @@ import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.MessagingException; import org.springframework.util.Assert; import org.springframework.xml.transform.StringResult; @@ -48,7 +50,7 @@ public class ResultToStringTransformer implements ResultTransformer { private final TransformerFactory transformerFactory; - private Properties outputProperties; + private @Nullable Properties outputProperties; public ResultToStringTransformer() { this.transformerFactory = TransformerFactoryUtils.newInstance(); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/UnmarshallingTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/UnmarshallingTransformer.java index 42dd8aebd36..8153a731514 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/UnmarshallingTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/UnmarshallingTransformer.java @@ -27,6 +27,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.springframework.integration.transformer.AbstractPayloadTransformer; @@ -68,7 +69,7 @@ public class UnmarshallingTransformer extends AbstractPayloadTransformer nodeMapper; + private volatile @Nullable NodeMapper nodeMapper; /** * Create an {@link XPathTransformer} that will create an XPath expression from the given String @@ -110,7 +111,7 @@ public String getComponentType() { } @Override - protected Object doTransform(Message message) { + protected @Nullable Object doTransform(Message message) { Node node = this.converter.convertToNode(message.getPayload()); Object result = null; if (this.nodeMapper != null) { diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java index 0f2f81b2b88..5dc17df274a 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/XsltPayloadTransformer.java @@ -33,6 +33,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.springframework.beans.factory.BeanClassLoaderAware; @@ -89,17 +90,19 @@ */ public class XsltPayloadTransformer extends AbstractXmlTransformer implements BeanClassLoaderAware { - private final ResultTransformer resultTransformer; + private final @Nullable ResultTransformer resultTransformer; - private final Resource xslResource; + private final @Nullable Resource xslResource; + @SuppressWarnings("NullAway.Init") private Templates templates; - private String transformerFactoryClassName; + private @Nullable String transformerFactoryClassName; + @SuppressWarnings("NullAway.Init") private volatile StandardEvaluationContext evaluationContext; - private Map xslParameterMappings; + private @Nullable Map xslParameterMappings; private SourceFactory sourceFactory = new DomSourceFactory(); @@ -109,15 +112,15 @@ public class XsltPayloadTransformer extends AbstractXmlTransformer implements Be private boolean alwaysUseResultFactory = false; - private String[] xsltParamHeaders; + private String @Nullable [] xsltParamHeaders; public XsltPayloadTransformer(Templates templates) { this(templates, null); } - private ClassLoader classLoader; + private @Nullable ClassLoader classLoader; - public XsltPayloadTransformer(Templates templates, ResultTransformer resultTransformer) { + public XsltPayloadTransformer(Templates templates, @Nullable ResultTransformer resultTransformer) { Assert.notNull(templates, "'templates' must not be null."); this.templates = templates; this.resultTransformer = resultTransformer; @@ -136,8 +139,8 @@ public XsltPayloadTransformer(Resource xslResource, String transformerFactoryCla this(xslResource, null, transformerFactoryClassName); } - public XsltPayloadTransformer(Resource xslResource, ResultTransformer resultTransformer, - String transformerFactoryClassName) { + public XsltPayloadTransformer(Resource xslResource, @Nullable ResultTransformer resultTransformer, + @Nullable String transformerFactoryClassName) { Assert.notNull(xslResource, "'xslResource' must not be null."); Assert.isTrue(xslResource instanceof ClassPathResource || @@ -230,6 +233,7 @@ protected void onInit() { this.evaluationContext = ExpressionUtils.createStandardEvaluationContext(getBeanFactory()); if (this.templates == null) { try { + Assert.notNull(this.xslResource, "'xslResource' must not be null."); TransformerFactory transformerFactory = createTransformerFactory(); this.templates = transformerFactory.newTemplates(createStreamSourceOnResource(this.xslResource)); } diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/package-info.java index c1648217693..3202e74c958 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/package-info.java @@ -1,4 +1,5 @@ /** * Provides Transformer and Enricher implementations. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.transformer; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/XPathExpressionEvaluatingHeaderValueMessageProcessor.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/XPathExpressionEvaluatingHeaderValueMessageProcessor.java index e2e8763e128..2e3e19f0e85 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/XPathExpressionEvaluatingHeaderValueMessageProcessor.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/XPathExpressionEvaluatingHeaderValueMessageProcessor.java @@ -16,6 +16,7 @@ package org.springframework.integration.xml.transformer.support; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Node; import org.springframework.beans.BeansException; @@ -55,9 +56,9 @@ public class XPathExpressionEvaluatingHeaderValueMessageProcessor implements Hea private XPathEvaluationType evaluationType = XPathEvaluationType.STRING_RESULT; - private TypeDescriptor headerTypeDescriptor; + private @Nullable TypeDescriptor headerTypeDescriptor; - private Boolean overwrite; + private @Nullable Boolean overwrite; public XPathExpressionEvaluatingHeaderValueMessageProcessor(String expression) { this(expression, new DefaultXmlPayloadConverter()); @@ -107,7 +108,7 @@ public void setOverwrite(Boolean overwrite) { } @Override - public Boolean isOverwrite() { + public @Nullable Boolean isOverwrite() { return this.overwrite; } @@ -120,7 +121,7 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException { } @Override - public Object processMessage(Message message) { + public @Nullable Object processMessage(Message message) { Node node = this.converter.convertToNode(message.getPayload()); Object result = this.evaluationType.evaluateXPath(this.expression, node); if (result instanceof String string && string.isEmpty()) { diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/package-info.java index 4e761fc7947..65595fc38a0 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/transformer/support/package-info.java @@ -4,4 +4,5 @@ * @since 3.0 * */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.transformer.support; diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathEvaluationType.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathEvaluationType.java index f8bd27491bf..72ed75ec519 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathEvaluationType.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathEvaluationType.java @@ -16,6 +16,7 @@ package org.springframework.integration.xml.xpath; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Node; import org.springframework.xml.xpath.XPathExpression; @@ -36,7 +37,7 @@ public Object evaluateXPath(XPathExpression expression, Node node) { }, STRING_RESULT { - public Object evaluateXPath(XPathExpression expression, Node node) { + public @Nullable Object evaluateXPath(XPathExpression expression, Node node) { return expression.evaluateAsString(node); } }, @@ -48,7 +49,7 @@ public Object evaluateXPath(XPathExpression expression, Node node) { }, NODE_RESULT { - public Object evaluateXPath(XPathExpression expression, Node node) { + public @Nullable Object evaluateXPath(XPathExpression expression, Node node) { return expression.evaluateAsNode(node); } }, @@ -59,6 +60,6 @@ public Object evaluateXPath(XPathExpression expression, Node node) { } }; - public abstract Object evaluateXPath(XPathExpression expression, Node node); + public abstract @Nullable Object evaluateXPath(XPathExpression expression, Node node); } diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathUtils.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathUtils.java index edaa5187a93..70fec7c52ad 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathUtils.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/XPathUtils.java @@ -24,6 +24,7 @@ import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.jspecify.annotations.Nullable; import org.w3c.dom.Document; import org.w3c.dom.Node; @@ -88,7 +89,7 @@ public final class XPathUtils { * @throws XPathException - if the xpath expression can't be evaluated. */ @SuppressWarnings({"unchecked"}) - public static T evaluate(Object object, String xpath, Object... resultArg) { + public static @Nullable T evaluate(Object object, String xpath, Object... resultArg) { Object resultType = null; if (resultArg != null && resultArg.length > 0) { Assert.isTrue(resultArg.length == 1, "'resultArg' can contains only one element."); @@ -109,6 +110,7 @@ else if (resultType instanceof String resType && RESULT_TYPES.contains(resultTyp if (DOCUMENT_LIST.equals(resType)) { List nodeList = (List) XPathEvaluationType.NODE_LIST_RESULT.evaluateXPath(expression, node); + Assert.notNull(nodeList, "'nodeList' must not be null."); try { DocumentBuilder documentBuilder = DOCUMENT_BUILDER_FACTORY.newDocumentBuilder(); List documents = new ArrayList<>(nodeList.size()); diff --git a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/package-info.java b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/package-info.java index 7fa8dfa92a8..797a4bd0074 100644 --- a/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/package-info.java +++ b/spring-integration-xml/src/main/java/org/springframework/integration/xml/xpath/package-info.java @@ -1,4 +1,5 @@ /** * Provides XPath supporting classes. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.xml.xpath;