From 105483614f22fd8ff8738007cff9bcd35b50c182 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sat, 9 Aug 2025 13:26:54 +0700 Subject: [PATCH 1/5] GH-10083: Apply NullAbility to scripting module Related to: #10083 Signed-off-by: Tran Ngoc Nhan --- ...stractScriptExecutingMessageProcessor.java | 21 +++++++++---------- .../DefaultScriptVariableGenerator.java | 6 ++++-- .../scripting/PolyglotScriptExecutor.java | 4 ++-- .../RefreshableResourceScriptSource.java | 5 ++++- .../ScriptExecutingMessageSource.java | 4 +++- .../integration/scripting/ScriptExecutor.java | 6 +++--- .../scripting/ScriptVariableGenerator.java | 4 +++- .../scripting/ScriptingException.java | 4 +++- .../config/AbstractScriptParser.java | 2 +- .../scripting/config/jsr223/package-info.java | 1 + .../scripting/config/package-info.java | 1 + .../DslScriptExecutingMessageProcessor.java | 13 +++++++++--- .../dsl/ScriptMessageSourceSpec.java | 6 ++++-- .../integration/scripting/dsl/ScriptSpec.java | 4 +++- .../scripting/dsl/package-info.java | 2 +- .../jsr223/AbstractScriptExecutor.java | 7 +++---- .../jsr223/DefaultScriptExecutor.java | 4 +++- .../ScriptExecutingMessageProcessor.java | 6 ++++-- .../scripting/jsr223/package-info.java | 1 + .../integration/scripting/package-info.java | 1 + 20 files changed, 65 insertions(+), 37 deletions(-) diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java index a47ebdf6aef..f25fc9f3e75 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java @@ -18,12 +18,13 @@ import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.integration.handler.MessageProcessor; -import org.springframework.lang.Nullable; import org.springframework.messaging.Message; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; @@ -31,7 +32,7 @@ /** * Base {@link MessageProcessor} for scripting implementations to extend. * - * @param the paylaod type. + * @param the payload type. * * @author Mark Fisher * @author Stefan Reuter @@ -44,9 +45,9 @@ public abstract class AbstractScriptExecutingMessageProcessor private final ScriptVariableGenerator scriptVariableGenerator; - private ClassLoader beanClassLoader; + private @Nullable ClassLoader beanClassLoader; - private BeanFactory beanFactory; + private @Nullable BeanFactory beanFactory; protected AbstractScriptExecutingMessageProcessor() { this(new DefaultScriptVariableGenerator()); @@ -71,11 +72,11 @@ protected ScriptVariableGenerator getScriptVariableGenerator() { return this.scriptVariableGenerator; } - protected ClassLoader getBeanClassLoader() { + protected @Nullable ClassLoader getBeanClassLoader() { return this.beanClassLoader; } - protected BeanFactory getBeanFactory() { + protected @Nullable BeanFactory getBeanFactory() { return this.beanFactory; } @@ -83,8 +84,7 @@ protected BeanFactory getBeanFactory() { * Execute the script and return the result. */ @Override - @Nullable - public final T processMessage(Message message) { + public final @Nullable T processMessage(@Nullable Message message) { ScriptSource source = getScriptSource(message); Map variables = this.scriptVariableGenerator.generateScriptVariables(message); return executeScript(source, variables); @@ -96,7 +96,7 @@ public final T processMessage(Message message) { * @param message the message being processed * @return a ScriptSource to use to create a script */ - protected abstract ScriptSource getScriptSource(Message message); + protected abstract ScriptSource getScriptSource(@Nullable Message message); /** * Subclasses must implement this method. In doing so, the execution context @@ -105,7 +105,6 @@ public final T processMessage(Message message) { * @param variables The variables. * @return The result of the execution. */ - @Nullable - protected abstract T executeScript(ScriptSource scriptSource, Map variables); + protected abstract @Nullable T executeScript(ScriptSource scriptSource, Map variables); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java index c9efbfdcdef..09e834d239d 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java @@ -20,6 +20,8 @@ import java.util.HashMap; import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.Message; import org.springframework.util.CollectionUtils; @@ -44,8 +46,8 @@ public DefaultScriptVariableGenerator(Map variableMap) { this.variableMap = variableMap; } - public Map generateScriptVariables(Message message) { - Map scriptVariables = new HashMap(); + public Map generateScriptVariables(@Nullable Message message) { + Map scriptVariables = new HashMap<>(); // Add Message content if (message != null) { scriptVariables.put("payload", message.getPayload()); diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/PolyglotScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/PolyglotScriptExecutor.java index 46238ad7048..fa46d93c906 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/PolyglotScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/PolyglotScriptExecutor.java @@ -22,8 +22,8 @@ import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Value; +import org.jspecify.annotations.Nullable; -import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; @@ -63,7 +63,7 @@ public PolyglotScriptExecutor(String language, Context.Builder contextBuilder) { } @Override - public Object executeScript(ScriptSource scriptSource, @Nullable Map variables) { + public @Nullable Object executeScript(ScriptSource scriptSource, @Nullable Map variables) { try (Context context = this.contextBuilder.build()) { if (variables != null) { Value bindings = context.getBindings(this.language); diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/RefreshableResourceScriptSource.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/RefreshableResourceScriptSource.java index 19ad5b42d0d..7f01988b937 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/RefreshableResourceScriptSource.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/RefreshableResourceScriptSource.java @@ -19,6 +19,8 @@ import java.io.IOException; import java.util.concurrent.atomic.AtomicLong; +import org.jspecify.annotations.Nullable; + import org.springframework.core.io.Resource; import org.springframework.scripting.ScriptSource; import org.springframework.scripting.support.ResourceScriptSource; @@ -41,6 +43,7 @@ public class RefreshableResourceScriptSource implements ScriptSource { private final AtomicLong lastModifiedChecked = new AtomicLong(System.currentTimeMillis()); + @SuppressWarnings("NullAway.Init") private volatile String script; public RefreshableResourceScriptSource(Resource resource, long refreshDelay) { @@ -62,7 +65,7 @@ public String getScriptAsString() throws IOException { return this.script; } - public String suggestedClassName() { + public @Nullable String suggestedClassName() { return this.source.getResource().getFilename(); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java index 58ecb9581fe..8b07deadaec 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java @@ -16,6 +16,8 @@ package org.springframework.integration.scripting; +import org.jspecify.annotations.Nullable; + import org.springframework.integration.endpoint.AbstractMessageSource; /** @@ -41,7 +43,7 @@ public String getComponentType() { } @Override - protected Object doReceive() { + protected @Nullable Object doReceive() { return this.scriptMessageProcessor.processMessage(null); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutor.java index e64f1268b49..dc09f7af33a 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutor.java @@ -18,7 +18,8 @@ import java.util.Map; -import org.springframework.lang.Nullable; +import org.jspecify.annotations.Nullable; + import org.springframework.scripting.ScriptSource; /** @@ -46,8 +47,7 @@ public interface ScriptExecutor { * @param scriptSource The script source. * @return The result of the execution. */ - @Nullable - default Object executeScript(ScriptSource scriptSource) { + default @Nullable Object executeScript(ScriptSource scriptSource) { return executeScript(scriptSource, null); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java index 8299b6bc387..f82709cd86f 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java @@ -18,6 +18,8 @@ import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.Message; /** @@ -30,6 +32,6 @@ @FunctionalInterface public interface ScriptVariableGenerator { - Map generateScriptVariables(Message message); + Map generateScriptVariables(@Nullable Message message); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java index c6fae2e8894..2312ed16c51 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java @@ -16,6 +16,8 @@ package org.springframework.integration.scripting; +import org.jspecify.annotations.Nullable; + import org.springframework.messaging.MessagingException; /** @@ -30,7 +32,7 @@ public ScriptingException(String description) { super(description); } - public ScriptingException(String description, Throwable cause) { + public ScriptingException(@Nullable String description, Throwable cause) { super(description, cause); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/AbstractScriptParser.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/AbstractScriptParser.java index 5e8b2cdd831..f61245437f0 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/AbstractScriptParser.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/AbstractScriptParser.java @@ -123,7 +123,7 @@ private ManagedMap buildVariablesMap(final Element element, fina List variableElements) { @SuppressWarnings("serial") - ManagedMap variableMap = new ManagedMap() { + ManagedMap variableMap = new ManagedMap<>() { @Override public Object put(String key, Object value) { diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/package-info.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/package-info.java index 4d6517e2083..b4eb6c1e1a8 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/package-info.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes for configuration - parsers, namespace handlers. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.scripting.config.jsr223; diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/package-info.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/package-info.java index cb6861e1659..022748d68d2 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/package-info.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/package-info.java @@ -1,4 +1,5 @@ /** * Base package supporting configuration. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.scripting.config; diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/DslScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/DslScriptExecutingMessageProcessor.java index 0bfd39b8bf0..acb860bf0fa 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/DslScriptExecutingMessageProcessor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/DslScriptExecutingMessageProcessor.java @@ -16,6 +16,8 @@ package org.springframework.integration.scripting.dsl; +import org.jspecify.annotations.Nullable; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.beans.factory.InitializingBean; @@ -47,20 +49,25 @@ class DslScriptExecutingMessageProcessor implements MessageProcessor, InitializingBean, ApplicationContextAware, BeanClassLoaderAware { + @SuppressWarnings("NullAway.Init") private Resource script; - private String location; + private @Nullable String location; - private String lang; + private @Nullable String lang; private long refreshCheckDelay = -1; + @SuppressWarnings("NullAway.Init") private ScriptVariableGenerator variableGenerator; + @SuppressWarnings("NullAway.Init") private ApplicationContext applicationContext; + @SuppressWarnings("NullAway.Init") private AbstractScriptExecutingMessageProcessor delegate; + @SuppressWarnings("NullAway.Init") private ClassLoader classLoader; DslScriptExecutingMessageProcessor(Resource script) { @@ -124,7 +131,7 @@ public void afterPropertiesSet() { } @Override - public Object processMessage(Message message) { + public @Nullable Object processMessage(Message message) { return this.delegate.processMessage(message); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptMessageSourceSpec.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptMessageSourceSpec.java index 12574976ecb..0ab2c608cbd 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptMessageSourceSpec.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptMessageSourceSpec.java @@ -19,6 +19,8 @@ import java.util.Collections; import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.core.io.Resource; import org.springframework.integration.core.MessageSource; import org.springframework.integration.dsl.ComponentsRegistration; @@ -125,8 +127,8 @@ protected MessageSource doGet() { } @Override - public Map getComponentsToRegister() { - return Collections.singletonMap(this.delegate.getObject(), this.delegate.getId()); + public Map getComponentsToRegister() { + return Collections.singletonMap(this.delegate.getObject(), this.delegate.getId()); } } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptSpec.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptSpec.java index 79cfaee2acc..1d36959cab1 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptSpec.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/ScriptSpec.java @@ -19,6 +19,8 @@ import java.util.HashMap; import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.core.io.Resource; import org.springframework.integration.dsl.MessageProcessorSpec; import org.springframework.integration.handler.MessageProcessor; @@ -38,7 +40,7 @@ public class ScriptSpec extends MessageProcessorSpec { private final DslScriptExecutingMessageProcessor processor; - private ScriptVariableGenerator variableGenerator; + private @Nullable ScriptVariableGenerator variableGenerator; private final Map variables = new HashMap<>(); diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/package-info.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/package-info.java index f6ef9725d3e..a606f67f301 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/package-info.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/dsl/package-info.java @@ -1,5 +1,5 @@ /** * Provides Scripting Components support for Spring Integration Java DSL. */ -@org.springframework.lang.NonNullApi +@org.jspecify.annotations.NullMarked package org.springframework.integration.scripting.dsl; diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java index 138c3e63439..6f85d663341 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java @@ -26,10 +26,10 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.jspecify.annotations.Nullable; import org.springframework.integration.scripting.ScriptExecutor; import org.springframework.integration.scripting.ScriptingException; -import org.springframework.lang.Nullable; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; @@ -69,8 +69,7 @@ public ScriptEngine getScriptEngine() { } @Override - @Nullable - public Object executeScript(ScriptSource scriptSource, Map variables) { + public @Nullable Object executeScript(ScriptSource scriptSource, @Nullable Map variables) { try { Object result; String script = scriptSource.getScriptAsString(); @@ -108,7 +107,7 @@ public Object executeScript(ScriptSource scriptSource, Map varia * @param bindings the bindings. * @return modified result */ - protected abstract Object postProcess(Object result, ScriptEngine scriptEngine, String script, Bindings bindings); + protected abstract Object postProcess(Object result, ScriptEngine scriptEngine, String script, @Nullable Bindings bindings); private static String invalidLanguageMessage(String language) { return ScriptEngineManager.class.getName() + diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/DefaultScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/DefaultScriptExecutor.java index e18e47b8c11..0f448530518 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/DefaultScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/DefaultScriptExecutor.java @@ -19,6 +19,8 @@ import javax.script.Bindings; import javax.script.ScriptEngine; +import org.jspecify.annotations.Nullable; + /** * Default implementation of the {@link AbstractScriptExecutor}. * Accepts a scripting language for resolving a target {@code ScriptEngine} for @@ -43,7 +45,7 @@ public DefaultScriptExecutor(String language) { } @Override - protected Object postProcess(Object result, ScriptEngine scriptEngine, String script, Bindings bindings) { + protected Object postProcess(Object result, ScriptEngine scriptEngine, String script, @Nullable Bindings bindings) { return result; } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java index 168e85322ac..c6443181873 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java @@ -18,6 +18,8 @@ import java.util.Map; +import org.jspecify.annotations.Nullable; + import org.springframework.integration.scripting.AbstractScriptExecutingMessageProcessor; import org.springframework.integration.scripting.DefaultScriptVariableGenerator; import org.springframework.integration.scripting.ScriptExecutor; @@ -83,12 +85,12 @@ public ScriptExecutingMessageProcessor(ScriptSource scriptSource, ScriptExecutor } @Override - protected ScriptSource getScriptSource(Message message) { + protected ScriptSource getScriptSource(@Nullable Message message) { return this.scriptSource; } @Override - protected Object executeScript(ScriptSource scriptSource, Map variables) { + protected @Nullable Object executeScript(ScriptSource scriptSource, @Nullable Map variables) { Assert.notNull(scriptSource, "scriptSource must not be null"); return this.scriptExecutor.executeScript(scriptSource, variables); } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/package-info.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/package-info.java index 85da7b31133..38a8df76f6e 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/package-info.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/package-info.java @@ -1,4 +1,5 @@ /** * Provides classes supporting JSR223 Scripting. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.scripting.jsr223; diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/package-info.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/package-info.java index d97a1229b26..529587b578f 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/package-info.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/package-info.java @@ -1,4 +1,5 @@ /** * Base package for scripting support. */ +@org.jspecify.annotations.NullMarked package org.springframework.integration.scripting; From 772669c9e0939660be5584aba58385810fe5404f Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sat, 9 Aug 2025 21:16:48 +0700 Subject: [PATCH 2/5] Add `@Nullable` for `GroovyScriptExecutingMessageProcessor#getScriptSource` Signed-off-by: Tran Ngoc Nhan --- .../groovy/GroovyScriptExecutingMessageProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java index 3c8dc30b0b5..9b9f0a871f3 100644 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java +++ b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java @@ -137,7 +137,7 @@ public void setCompilerConfiguration(CompilerConfiguration compilerConfiguration } @Override - protected ScriptSource getScriptSource(Message message) { + protected ScriptSource getScriptSource(@Nullable Message message) { return this.scriptSource; } From 2febe0914647069c5eb55179b8f8d843d6c2144b Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Mon, 11 Aug 2025 21:32:16 +0700 Subject: [PATCH 3/5] Remove `@Nullable` Signed-off-by: Tran Ngoc Nhan --- .../GroovyScriptExecutingMessageProcessor.java | 2 +- .../AbstractScriptExecutingMessageProcessor.java | 14 ++++++++------ .../scripting/DefaultScriptVariableGenerator.java | 4 +--- .../scripting/ScriptExecutingMessageSource.java | 6 +++++- .../scripting/ScriptVariableGenerator.java | 4 +--- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java index 9b9f0a871f3..3c8dc30b0b5 100644 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java +++ b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessor.java @@ -137,7 +137,7 @@ public void setCompilerConfiguration(CompilerConfiguration compilerConfiguration } @Override - protected ScriptSource getScriptSource(@Nullable Message message) { + protected ScriptSource getScriptSource(Message message) { return this.scriptSource; } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java index f25fc9f3e75..1cab53ab318 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java @@ -45,9 +45,11 @@ public abstract class AbstractScriptExecutingMessageProcessor private final ScriptVariableGenerator scriptVariableGenerator; - private @Nullable ClassLoader beanClassLoader; + @SuppressWarnings("NullAway.Init") + private ClassLoader beanClassLoader; - private @Nullable BeanFactory beanFactory; + @SuppressWarnings("NullAway.Init") + private BeanFactory beanFactory; protected AbstractScriptExecutingMessageProcessor() { this(new DefaultScriptVariableGenerator()); @@ -72,11 +74,11 @@ protected ScriptVariableGenerator getScriptVariableGenerator() { return this.scriptVariableGenerator; } - protected @Nullable ClassLoader getBeanClassLoader() { + protected ClassLoader getBeanClassLoader() { return this.beanClassLoader; } - protected @Nullable BeanFactory getBeanFactory() { + protected BeanFactory getBeanFactory() { return this.beanFactory; } @@ -84,7 +86,7 @@ protected ScriptVariableGenerator getScriptVariableGenerator() { * Execute the script and return the result. */ @Override - public final @Nullable T processMessage(@Nullable Message message) { + public final @Nullable T processMessage(Message message) { ScriptSource source = getScriptSource(message); Map variables = this.scriptVariableGenerator.generateScriptVariables(message); return executeScript(source, variables); @@ -96,7 +98,7 @@ protected ScriptVariableGenerator getScriptVariableGenerator() { * @param message the message being processed * @return a ScriptSource to use to create a script */ - protected abstract ScriptSource getScriptSource(@Nullable Message message); + protected abstract ScriptSource getScriptSource(Message message); /** * Subclasses must implement this method. In doing so, the execution context diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java index 09e834d239d..43a4fb4876d 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/DefaultScriptVariableGenerator.java @@ -20,8 +20,6 @@ import java.util.HashMap; import java.util.Map; -import org.jspecify.annotations.Nullable; - import org.springframework.messaging.Message; import org.springframework.util.CollectionUtils; @@ -46,7 +44,7 @@ public DefaultScriptVariableGenerator(Map variableMap) { this.variableMap = variableMap; } - public Map generateScriptVariables(@Nullable Message message) { + public Map generateScriptVariables(Message message) { Map scriptVariables = new HashMap<>(); // Add Message content if (message != null) { diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java index 8b07deadaec..bc6c0aec7d3 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java @@ -19,6 +19,8 @@ import org.jspecify.annotations.Nullable; import org.springframework.integration.endpoint.AbstractMessageSource; +import org.springframework.messaging.Message; +import org.springframework.messaging.support.MessageBuilder; /** * The {@link org.springframework.integration.core.MessageSource} strategy implementation @@ -31,6 +33,8 @@ */ public class ScriptExecutingMessageSource extends AbstractMessageSource { + private static final Message EMPTY_MESSAGE = MessageBuilder.withPayload(new Byte[0]).build(); + private final AbstractScriptExecutingMessageProcessor scriptMessageProcessor; public ScriptExecutingMessageSource(AbstractScriptExecutingMessageProcessor scriptMessageProcessor) { @@ -44,7 +48,7 @@ public String getComponentType() { @Override protected @Nullable Object doReceive() { - return this.scriptMessageProcessor.processMessage(null); + return this.scriptMessageProcessor.processMessage(EMPTY_MESSAGE); } } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java index f82709cd86f..8299b6bc387 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptVariableGenerator.java @@ -18,8 +18,6 @@ import java.util.Map; -import org.jspecify.annotations.Nullable; - import org.springframework.messaging.Message; /** @@ -32,6 +30,6 @@ @FunctionalInterface public interface ScriptVariableGenerator { - Map generateScriptVariables(@Nullable Message message); + Map generateScriptVariables(Message message); } From ea9407b35b82558b80f72f1f2d1fbe4fac9cfad1 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Mon, 11 Aug 2025 21:52:40 +0700 Subject: [PATCH 4/5] Remove `@Nullable` in `ScriptExecutingMessageProcessor` class Signed-off-by: Tran Ngoc Nhan --- .../scripting/jsr223/ScriptExecutingMessageProcessor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java index c6443181873..78c6a27c011 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutingMessageProcessor.java @@ -85,12 +85,12 @@ public ScriptExecutingMessageProcessor(ScriptSource scriptSource, ScriptExecutor } @Override - protected ScriptSource getScriptSource(@Nullable Message message) { + protected ScriptSource getScriptSource(Message message) { return this.scriptSource; } @Override - protected @Nullable Object executeScript(ScriptSource scriptSource, @Nullable Map variables) { + protected @Nullable Object executeScript(ScriptSource scriptSource, Map variables) { Assert.notNull(scriptSource, "scriptSource must not be null"); return this.scriptExecutor.executeScript(scriptSource, variables); } From 2a1c94eeb10e7a35a1a3da332569afe39023a229 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Mon, 11 Aug 2025 22:02:34 +0700 Subject: [PATCH 5/5] change to `byte[]` Signed-off-by: Tran Ngoc Nhan --- .../integration/scripting/ScriptExecutingMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java index bc6c0aec7d3..e7efced58ab 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutingMessageSource.java @@ -33,7 +33,7 @@ */ public class ScriptExecutingMessageSource extends AbstractMessageSource { - private static final Message EMPTY_MESSAGE = MessageBuilder.withPayload(new Byte[0]).build(); + private static final Message EMPTY_MESSAGE = MessageBuilder.withPayload(new byte[0]).build(); private final AbstractScriptExecutingMessageProcessor scriptMessageProcessor;