Skip to content

Commit d6f90a1

Browse files
chrisjsfmbenhassine
authored andcommitted
BATCH-2270: Allow ScriptEvaluator to be injectable in the ScriptItemProcessor
1 parent ad3dcbc commit d6f90a1

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/ScriptItemProcessor.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,19 +108,34 @@ public void setItemBindingVariableName(String itemBindingVariableName) {
108108
this.itemBindingVariableName = itemBindingVariableName;
109109
}
110110

111+
/**
112+
* <p>
113+
* Provides the ability to set a custom {@link org.springframework.scripting.ScriptEvaluator}
114+
* implementation. If not set, a {@link org.springframework.scripting.support.StandardScriptEvaluator}
115+
* will be used by default.
116+
* </p>
117+
*
118+
* @param scriptEvaluator the {@link org.springframework.scripting.ScriptEvaluator} to use
119+
*/
120+
public void setScriptEvaluator(ScriptEvaluator scriptEvaluator) {
121+
this.scriptEvaluator = scriptEvaluator;
122+
}
123+
111124
@Override
112125
public void afterPropertiesSet() throws Exception {
113-
scriptEvaluator = new StandardScriptEvaluator();
126+
if(scriptEvaluator == null) {
127+
scriptEvaluator = new StandardScriptEvaluator();
128+
}
114129

115130
Assert.state(scriptSource != null || script != null,
116131
"Either the script source or script file must be provided");
117132

118133
Assert.state(scriptSource == null || script == null,
119134
"Either a script source or script file must be provided, not both");
120135

121-
if (scriptSource != null) {
136+
if (scriptSource != null && scriptEvaluator instanceof StandardScriptEvaluator) {
122137
Assert.isTrue(!StringUtils.isEmpty(language),
123-
"Language must be provided when using script source");
138+
"Language must be provided when using the default ScriptEvaluator and raw source code");
124139

125140
((StandardScriptEvaluator) scriptEvaluator).setLanguage(language);
126141
}

spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/ScriptItemProcessorTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import org.junit.Test;
2020
import org.springframework.core.io.ClassPathResource;
2121
import org.springframework.core.io.Resource;
22+
import org.springframework.scripting.bsh.BshScriptEvaluator;
23+
import org.springframework.scripting.groovy.GroovyScriptEvaluator;
2224

2325
import javax.script.ScriptEngineFactory;
2426
import javax.script.ScriptEngineManager;
@@ -200,6 +202,30 @@ public void testItemBindingNameChange() throws Exception {
200202
assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss"));
201203
}
202204

205+
@Test
206+
public void testBshScriptEvaluator() throws Exception {
207+
assumeTrue(languageExists("bsh"));
208+
209+
ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>();
210+
scriptItemProcessor.setScriptEvaluator(new BshScriptEvaluator());
211+
scriptItemProcessor.setScriptSource("String process(String item) { return item.toUpperCase(); } process(item);", "bsh");
212+
scriptItemProcessor.afterPropertiesSet();
213+
214+
assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss"));
215+
}
216+
217+
@Test
218+
public void testGroovyScriptEvaluator() throws Exception {
219+
assumeTrue(languageExists("groovy"));
220+
221+
ScriptItemProcessor<String, Object> scriptItemProcessor = new ScriptItemProcessor<String, Object>();
222+
scriptItemProcessor.setScriptEvaluator(new GroovyScriptEvaluator());
223+
scriptItemProcessor.setScriptSource("def process(item) { return item.toUpperCase() } \n process(item)", "groovy");
224+
scriptItemProcessor.afterPropertiesSet();
225+
226+
assertEquals("Incorrect transformed value", "SS", scriptItemProcessor.process("ss"));
227+
}
228+
203229
private boolean languageExists(String engineName) {
204230
return availableLanguages.contains(engineName);
205231
}

0 commit comments

Comments
 (0)