diff --git a/build.gradle b/build.gradle index 5423afa4a9..fd7c870382 100644 --- a/build.gradle +++ b/build.gradle @@ -360,6 +360,15 @@ project('spring-integration-rmi') { compileJava.options.compilerArgs = ["${xLintArg},-deprecation"] } +project('spring-integration-scripting') { + description = 'Spring Integration Scripting Support' + dependencies { + compile project(":spring-integration-core") + testCompile project(":spring-integration-test") + testCompile("org.jruby:jruby:1.6.3") + testCompile("org.codehaus.groovy:groovy-all:1.7.5") + } +} project('spring-integration-security') { description = 'Spring Integration Security Support' diff --git a/settings.gradle b/settings.gradle index beda24d73e..b21f690c05 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,6 +33,7 @@ include 'spring-integration-mail' include 'spring-integration-mongodb' include 'spring-integration-redis' include 'spring-integration-rmi' +include 'spring-integration-scripting' include 'spring-integration-security' include 'spring-integration-sftp' include 'spring-integration-stream' diff --git a/spring-integration-core/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java b/spring-integration-core/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java index 3d659b7d39..9446d2e2f7 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/scripting/AbstractScriptExecutingMessageProcessor.java @@ -40,7 +40,7 @@ public abstract class AbstractScriptExecutingMessageProcessor implements Mess Assert.notNull(scriptVariableGenerator, "scriptVariableGenerator must not be null"); this.scriptVariableGenerator = scriptVariableGenerator; } - + /** * Executes the script and returns the result. diff --git a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java index 5945b400af..a8c5810c87 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/transformer/HeaderEnricher.java @@ -96,7 +96,14 @@ public class HeaderEnricher implements Transformer { if (shouldOverwrite == null) { shouldOverwrite = this.defaultOverwrite; } - Object value = valueProcessor.processMessage(message); + /** + * Only evaluate value if necessary + */ + Object value = null; + if (headerMap.get(key) == null || shouldOverwrite || !this.shouldSkipNulls){ + value = valueProcessor.processMessage(message); + } + if ((value != null && shouldOverwrite) || headerMap.get(key) == null || (value == null && !this.shouldSkipNulls)) { headerMap.put(key, value); } diff --git a/spring-integration-core/src/main/resources/META-INF/spring.schemas b/spring-integration-core/src/main/resources/META-INF/spring.schemas index 2a576a2827..e8ae15f046 100644 --- a/spring-integration-core/src/main/resources/META-INF/spring.schemas +++ b/spring-integration-core/src/main/resources/META-INF/spring.schemas @@ -1,3 +1,5 @@ http\://www.springframework.org/schema/integration/spring-integration-1.0.xsd=org/springframework/integration/config/xml/spring-integration-1.0.xsd http\://www.springframework.org/schema/integration/spring-integration-2.0.xsd=org/springframework/integration/config/xml/spring-integration-2.0.xsd -http\://www.springframework.org/schema/integration/spring-integration.xsd=org/springframework/integration/config/xml/spring-integration-2.0.xsd \ No newline at end of file +http\://www.springframework.org/schema/integration/spring-integration.xsd=org/springframework/integration/config/xml/spring-integration-2.0.xsd +http\://www.springframework.org/schema/integration/scripting/spring-integration-scripting-core.xsd=org/springframework/integration/scripting/config/xml/spring-integration-scripting-core-2.1.xsd +http\://www.springframework.org/schema/integration/scripting/spring-integration-scripting-core-2.1.xsd=org/springframework/integration/scripting/config/xml/spring-integration-scripting-core-2.1.xsd diff --git a/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests-context.xml b/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests-context.xml index 6349c8d1e3..7cd275534d 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests-context.xml +++ b/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests-context.xml @@ -18,6 +18,10 @@
+ + +
+ diff --git a/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests.java b/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests.java index b9e9523325..9f0327de10 100644 --- a/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests.java +++ b/spring-integration-core/src/test/java/org/springframework/integration/transformer/SpelHeaderEnricherIntegrationTests.java @@ -42,6 +42,9 @@ public class SpelHeaderEnricherIntegrationTests { @Autowired private MessageChannel beanResolvingInput; + + @Autowired + private MessageChannel expressionNotExecutedInput; @Autowired @Qualifier("output") private PollableChannel output; @@ -62,6 +65,14 @@ public class SpelHeaderEnricherIntegrationTests { Message result = output.receive(0); assertEquals(243, result.getHeaders().get("num")); } + + @Test + public void suppressBeanExecution(){ + Message message = MessageBuilder.withPayload("test").setHeader("num", 3).build(); + this.expressionNotExecutedInput.send(message); + Message result = output.receive(0); + assertEquals(3, result.getHeaders().get("num")); + } static class TestBean { diff --git a/spring-integration-groovy/.springBeans b/spring-integration-groovy/.springBeans index 211af10331..7aab2afffb 100644 --- a/spring-integration-groovy/.springBeans +++ b/spring-integration-groovy/.springBeans @@ -1,13 +1,13 @@ - - - 1 - - - - - - - - - - + + + 1 + + + + + + + + + + diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyCommandMessageProcessor.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyCommandMessageProcessor.java index c025c3898b..fd160c8a85 100644 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyCommandMessageProcessor.java +++ b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/GroovyCommandMessageProcessor.java @@ -87,5 +87,4 @@ public class GroovyCommandMessageProcessor extends AbstractScriptExecutingMessag // Don't use the same script (class) name for all invocations by default return getClass().getSimpleName() + message.getHeaders().getId().toString().replaceAll("-", ""); } - } diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/GroovyScriptParser.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/GroovyScriptParser.java index 2d65687252..c3a9ad5f6e 100644 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/GroovyScriptParser.java +++ b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/GroovyScriptParser.java @@ -16,116 +16,38 @@ package org.springframework.integration.groovy.config; -import java.util.List; - -import org.w3c.dom.Element; - -import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionBuilder; -import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; -import org.springframework.beans.factory.support.ManagedMap; -import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; -import org.springframework.beans.factory.xml.XmlReaderContext; +import org.springframework.integration.config.xml.AbstractScriptParser; import org.springframework.integration.config.xml.IntegrationNamespaceUtils; -import org.springframework.scripting.support.StaticScriptSource; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; -import org.springframework.util.xml.DomUtils; +import org.w3c.dom.Element; /** * @author Mark Fisher * @author Oleg Zhurakousky * @since 2.0 */ -public class GroovyScriptParser extends AbstractSingleBeanDefinitionParser { - - private static final String LOCATION_ATTRIBUTE = "location"; - - private static final String REFRESH_CHECK_DELAY_ATTRIBUTE = "refresh-check-delay"; - +public class GroovyScriptParser extends AbstractScriptParser { + @Override protected String getBeanClassName(Element element) { return "org.springframework.integration.groovy.GroovyScriptExecutingMessageProcessor"; } - - protected boolean shouldGenerateIdAsFallback() { - return true; - } + /* (non-Javadoc) + * @see org.springframework.integration.config.xml.AbstractScriptParser#getScriptSourceClassName() + */ @Override - protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - String scriptLocation = element.getAttribute(LOCATION_ATTRIBUTE); - String scriptText = DomUtils.getTextValue(element); - if (!(StringUtils.hasText(scriptLocation) ^ StringUtils.hasText(scriptText))) { - parserContext.getReaderContext().error("Either the 'location' attribute or inline script text must be provided, but not both.", element); - return; - } - - List variableElements = DomUtils.getChildElementsByTagName(element, "variable"); - String scriptVariableGeneratorName = element.getAttribute("script-variable-generator"); - - if (StringUtils.hasText(scriptText) && (variableElements.size() > 0 || StringUtils.hasText(scriptVariableGeneratorName))) { - parserContext.getReaderContext().error("Variable bindings or custom ScriptVariableGenerator are not allowed when using an inline groovy script. " + - "Specify location of the script via 'location' attribute instead", element); - return; - } - - if (StringUtils.hasText(scriptVariableGeneratorName) && variableElements.size() > 0) { - parserContext.getReaderContext().error("'script-variable-generator' and 'variable' sub-elements are mutualy exclusive.", element); - return; - } - - if (StringUtils.hasText(scriptLocation)) { - builder.addConstructorArgValue(this.resolveScriptLocation(element, parserContext.getReaderContext(), scriptLocation)); - } - else { - builder.addConstructorArgValue(new StaticScriptSource(scriptText, "groovy.lang.Script")); - } - if (!StringUtils.hasText(scriptVariableGeneratorName)) { - BeanDefinitionBuilder scriptVariableGeneratorBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.integration.scripting.DefaultScriptVariableGenerator"); - ManagedMap variableMap = new ManagedMap(); - for (Element childElement : variableElements) { - String variableName = childElement.getAttribute("name"); - String variableValue = childElement.getAttribute("value"); - String variableRef = childElement.getAttribute("ref"); - if (!(StringUtils.hasText(variableValue) ^ StringUtils.hasText(variableRef))) { - parserContext.getReaderContext().error("Exactly one of the 'ref' attribute or 'value' attribute, " + - " is required for element " + - IntegrationNamespaceUtils.createElementDescription(element) + ".", element); - } - if (StringUtils.hasText(variableValue)) { - variableMap.put(variableName, variableValue); - } - else { - variableMap.put(variableName, new RuntimeBeanReference(variableRef)); - } - } - if (!CollectionUtils.isEmpty(variableMap)) { - scriptVariableGeneratorBuilder.addConstructorArgValue(variableMap); - } - scriptVariableGeneratorName = BeanDefinitionReaderUtils.registerWithGeneratedName( - scriptVariableGeneratorBuilder.getBeanDefinition(), parserContext.getRegistry()); - } - builder.addConstructorArgReference(scriptVariableGeneratorName); + protected String getScriptSourceClassName() { + return "groovy.lang.Script"; + } + + protected void postProcess(BeanDefinitionBuilder builder, Element element, ParserContext parserContext) { IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "customizer"); } - private Object resolveScriptLocation(Element element, XmlReaderContext readerContext, String scriptLocation) { - String refreshDelayText = element.getAttribute(REFRESH_CHECK_DELAY_ATTRIBUTE); - String beanClassName = "org.springframework.integration.groovy.config.RefreshableResourceScriptSource"; - BeanDefinitionBuilder resourceScriptSourceBuilder = - BeanDefinitionBuilder.genericBeanDefinition(beanClassName); - resourceScriptSourceBuilder.addConstructorArgValue(scriptLocation); - if (StringUtils.hasText(refreshDelayText)) { - resourceScriptSourceBuilder.addConstructorArgValue(refreshDelayText); - } - else { - resourceScriptSourceBuilder.addConstructorArgValue(-1L); - } - return resourceScriptSourceBuilder.getBeanDefinition(); - } + + } diff --git a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSource.java b/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSource.java deleted file mode 100644 index 0f2e2918c6..0000000000 --- a/spring-integration-groovy/src/main/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSource.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2002-2010 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.integration.groovy.config; - -import java.io.IOException; -import java.util.concurrent.atomic.AtomicLong; - -import org.springframework.core.io.Resource; -import org.springframework.scripting.ScriptSource; -import org.springframework.scripting.support.ResourceScriptSource; - -/** - * @author Dave Syer - * @author Oleg Zhurakousky - * @since 2.0 - */ -public class RefreshableResourceScriptSource implements ScriptSource { - - private final long refreshDelay; - - private final ResourceScriptSource source; - - private final AtomicLong lastModifiedChecked = new AtomicLong(System.currentTimeMillis()); - - private volatile String script; - - - public RefreshableResourceScriptSource(Resource resource, long refreshDelay) { - this.refreshDelay = refreshDelay; - this.source = new ResourceScriptSource(resource); - try { - this.script = this.source.getScriptAsString(); - } - catch (IOException e) { - this.lastModifiedChecked.set(0); - } - } - - public String getScriptAsString() throws IOException { - this.script = source.getScriptAsString(); - return this.script; - } - - public String suggestedClassName() { - return this.source.suggestedClassName(); - } - - public boolean isModified() { - if (this.refreshDelay < 0) { - return false; - } - long time = System.currentTimeMillis(); - if (this.refreshDelay == 0 || (time - this.lastModifiedChecked.get()) > this.refreshDelay) { - this.lastModifiedChecked.set(time); - return this.source.isModified(); - } - return false; - } - -} diff --git a/spring-integration-groovy/src/main/resources/META-INF/spring.schemas b/spring-integration-groovy/src/main/resources/META-INF/spring.schemas index 45e7980e12..d108fd34b0 100644 --- a/spring-integration-groovy/src/main/resources/META-INF/spring.schemas +++ b/spring-integration-groovy/src/main/resources/META-INF/spring.schemas @@ -1,2 +1,3 @@ http\://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.0.xsd=org/springframework/integration/groovy/config/spring-integration-groovy-2.0.xsd -http\://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd=org/springframework/integration/groovy/config/spring-integration-groovy-2.0.xsd +http\://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd=org/springframework/integration/groovy/config/spring-integration-groovy-2.1.xsd +http\://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd=org/springframework/integration/groovy/config/spring-integration-groovy-2.1.xsd diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessorTests.java b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessorTests.java index 069f3e8133..dbca14ddaa 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessorTests.java +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/GroovyScriptExecutingMessageProcessorTests.java @@ -30,8 +30,8 @@ import org.junit.Rule; import org.junit.Test; import org.springframework.core.io.AbstractResource; import org.springframework.integration.Message; -import org.springframework.integration.groovy.config.RefreshableResourceScriptSource; import org.springframework.integration.handler.MessageProcessor; +import org.springframework.integration.scripting.RefreshableResourceScriptSource; import org.springframework.integration.scripting.ScriptVariableGenerator; import org.springframework.integration.support.MessageBuilder; import org.springframework.scripting.ScriptSource; diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyControlBusTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyControlBusTests-context.xml index c87645db84..77cea93302 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyControlBusTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyControlBusTests-context.xml @@ -1,12 +1,11 @@ - + diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyFilterTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyFilterTests-context.xml index 697f86f85a..c77cb06ffa 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyFilterTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyFilterTests-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyHeaderEnricherTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyHeaderEnricherTests-context.xml index 586dbbfe96..974ad00aff 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyHeaderEnricherTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyHeaderEnricherTests-context.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration" xmlns:int-groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.0.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRefreshTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRefreshTests-context.xml index 7c53be1a95..3272f07cc2 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRefreshTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRefreshTests-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRouterTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRouterTests-context.xml index 2531b258d0..f82fdd1a6b 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRouterTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyRouterTests-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-context.xml index 242b1075f1..cbc770cd78 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-context.xml @@ -6,7 +6,7 @@ xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.0.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-context.xml index 25d8a98d2d..3d9e7e9463 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.0.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-withgenerator-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-withgenerator-context.xml index 0dff99ecab..93464dc37b 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-withgenerator-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyServiceActivatorTests-fail-withgenerator-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.0.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyTransformerTests-context.xml b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyTransformerTests-context.xml index 818dfc6bc2..bbe595e814 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyTransformerTests-context.xml +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/GroovyTransformerTests-context.xml @@ -3,12 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:groovy="http://www.springframework.org/schema/integration/groovy" - xsi:schemaLocation="http://www.springframework.org/schema/integration - http://www.springframework.org/schema/integration/spring-integration.xsd - http://www.springframework.org/schema/integration/groovy - http://www.springframework.org/schema/integration/groovy/spring-integration-groovy.xsd - http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans.xsd"> + xsi:schemaLocation="http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd + http://www.springframework.org/schema/integration/groovy http://www.springframework.org/schema/integration/groovy/spring-integration-groovy-2.1.xsd + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> diff --git a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSourceTests.java b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSourceTests.java index 941d2efaa0..c90ca54fa0 100644 --- a/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSourceTests.java +++ b/spring-integration-groovy/src/test/java/org/springframework/integration/groovy/config/RefreshableResourceScriptSourceTests.java @@ -22,6 +22,7 @@ import java.io.IOException; import org.junit.Test; import org.springframework.core.io.ByteArrayResource; +import org.springframework.integration.scripting.RefreshableResourceScriptSource; /** * @author Dave Syer diff --git a/spring-integration-scripting/.springBeans b/spring-integration-scripting/.springBeans new file mode 100644 index 0000000000..7aab2afffb --- /dev/null +++ b/spring-integration-scripting/.springBeans @@ -0,0 +1,13 @@ + + + 1 + + + + + + + + + + diff --git a/spring-integration-scripting/pom.xml b/spring-integration-scripting/pom.xml new file mode 100644 index 0000000000..b5e09a4aea --- /dev/null +++ b/spring-integration-scripting/pom.xml @@ -0,0 +1,179 @@ + + + 4.0.0 + org.springframework.integration + spring-integration-scripting + 2.1.0.BUILD-SNAPSHOT + Spring Integration Scripting Support + + + The Apache Software License, Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + + src/main/java + + **/* + + + **/*.java + + + + src/main/resources + + **/* + + + + + + src/test/java + + **/* + + + **/*.java + + + + src/test/resources + + **/* + + + + + + maven-compiler-plugin + + 1.5 + 1.5 + + + + maven-surefire-plugin + + + **/*Tests.java + + + **/*Abstract*.java + + + + + + + + http://download.java.net/maven/2 + http://download.java.net/maven/2 + + + http://maven.springframework.org/milestone + http://maven.springframework.org/milestone + + + http://maven.springframework.org/release + http://maven.springframework.org/release + + + http://maven.springframework.org/snapshot + http://maven.springframework.org/snapshot + + + http://repository.springsource.com/maven/bundles/external + http://repository.springsource.com/maven/bundles/external + + + http://repository.springsource.com/maven/bundles/milestone + http://repository.springsource.com/maven/bundles/milestone + + + http://repository.springsource.com/maven/bundles/release + http://repository.springsource.com/maven/bundles/release + + + + + org.easymock + easymock + 2.3 + test + + + org.easymock + easymockclassextension + 2.3 + test + + + org.springframework + spring-test + 3.1.0.M2 + test + + + org.hamcrest + hamcrest-all + 1.1 + test + + + org.mockito + mockito-all + 1.8.4 + test + + + org.springframework.integration + spring-integration-core + 2.1.0.BUILD-SNAPSHOT + compile + + + log4j + log4j + 1.2.12 + test + + + cglib + cglib-nodep + 2.2 + test + + + org.springframework.integration + spring-integration-test + 2.1.0.BUILD-SNAPSHOT + test + + + junit + junit-dep + 4.8.2 + test + + + org.codehaus.groovy + grovy-all + 1.7.5 + test + + + org.jruby + jruby + 1.6.3 + test + + + + UTF8 + + 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 new file mode 100644 index 0000000000..7d260cbd18 --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptExecutor.java @@ -0,0 +1,39 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.scripting; + +import java.util.Map; + +import org.springframework.scripting.ScriptSource; + +/** + * @author David Turanski + * @since 2.1 + */ +public interface ScriptExecutor { + + /** + * + * @param scriptSource + * @return + */ + public abstract Object executeScript(ScriptSource scriptSource); + + /** + * + * @param scriptSource + * @param variables -bind variable + * @return + */ + public abstract Object executeScript(ScriptSource scriptSource,Map variables); +} \ No newline at end of file diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223NamespaceHandler.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223NamespaceHandler.java new file mode 100644 index 0000000000..67d2ca3ee6 --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223NamespaceHandler.java @@ -0,0 +1,31 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import org.springframework.integration.config.xml.AbstractIntegrationNamespaceHandler; + +/** + * @author David Turanski + * @since 2.1 + */ +public class Jsr223NamespaceHandler extends AbstractIntegrationNamespaceHandler { + + public void init() { + this.registerBeanDefinitionParser("script", new Jsr223ScriptParser()); + } + +} diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223ScriptParser.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223ScriptParser.java new file mode 100644 index 0000000000..bfb1d51b24 --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/config/jsr223/Jsr223ScriptParser.java @@ -0,0 +1,54 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.xml.AbstractScriptParser; +import org.springframework.integration.scripting.jsr223.Jsr223ScriptExecutor; +import org.springframework.util.Assert; +import org.w3c.dom.Element; + +/** + * @author David Turanski + * @since 2.1 + */ +public class Jsr223ScriptParser extends AbstractScriptParser { + + private static final String LANGUAGE_ATTRIBUTE = "lang"; + + @Override + protected String getBeanClassName(Element element) { + return "org.springframework.integration.scripting.jsr223.Jsr223ScriptExecutingMessageProcessor"; + } + + /* (non-Javadoc) + * @see org.springframework.integration.config.xml.AbstractScriptParser#getScriptSourceClassName() + */ + @Override + protected String getScriptSourceClassName() { + return null; + } + + protected void postProcess(BeanDefinitionBuilder builder, Element element, ParserContext parserContext){ + String language = element.getAttribute(LANGUAGE_ATTRIBUTE); + Assert.hasLength(language, "Attribute " + LANGUAGE_ATTRIBUTE + " is required"); + builder.addConstructorArgValue(new Jsr223ScriptExecutor(language)); + } + + +} diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessor.java new file mode 100644 index 0000000000..863b6c09db --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessor.java @@ -0,0 +1,81 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.scripting.jsr223; + +import java.util.Map; + +import org.springframework.integration.Message; +import org.springframework.integration.scripting.AbstractScriptExecutingMessageProcessor; +import org.springframework.integration.scripting.DefaultScriptVariableGenerator; +import org.springframework.integration.scripting.ScriptExecutor; +import org.springframework.integration.scripting.ScriptVariableGenerator; +import org.springframework.scripting.ScriptSource; +import org.springframework.util.Assert; + +/** + * @author David Turanski + * @since 2.1 + */ +public class Jsr223ScriptExecutingMessageProcessor extends AbstractScriptExecutingMessageProcessor { + + private final Jsr223ScriptExecutor scriptExecutor; + private volatile ScriptSource scriptSource; + + + /** + * Create a processor for the {@link ScriptSource} using the provided {@link ScriptExecutor} using the DefaultScriptVariableGenerator + * @param scriptSource + * @param scriptExecutor + */ + public Jsr223ScriptExecutingMessageProcessor(ScriptSource scriptSource, Jsr223ScriptExecutor scriptExecutor) { + super(); + this.scriptSource = scriptSource; + this.scriptExecutor = scriptExecutor; + } + + /** + * Create a processor for the {@link ScriptSource} using the provided {@link ScriptExecutor} + * @param scriptSource + * @param scriptExecutor + */ + public Jsr223ScriptExecutingMessageProcessor(ScriptSource scriptSource, ScriptVariableGenerator scriptVariableGenerator,Jsr223ScriptExecutor scriptExecutor) { + super(scriptVariableGenerator); + this.scriptSource = scriptSource; + this.scriptExecutor = scriptExecutor; + } + + /** + * Create a processor for the {@link ScriptSource} using the provided {@link ScriptExecutor} using the DefaultScriptVariableGenerator + * @param scriptSource + * @param scriptExecutor + * @param variables + */ + public Jsr223ScriptExecutingMessageProcessor(ScriptSource scriptSource,Jsr223ScriptExecutor scriptExecutor,Map variables ) { + super(new DefaultScriptVariableGenerator(variables)); + this.scriptSource = scriptSource; + this.scriptExecutor = scriptExecutor; + } + + + @Override + protected ScriptSource getScriptSource(Message message) { + return this.scriptSource; + } + + @Override + protected Object executeScript(ScriptSource scriptSource, Map variables) throws Exception { + 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/Jsr223ScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutor.java new file mode 100644 index 0000000000..8e0a9721f3 --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutor.java @@ -0,0 +1,107 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.scripting.jsr223; + +import java.io.IOException; +import java.util.Map; +import java.util.Map.Entry; +import javax.script.*; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.integration.scripting.ScriptExecutor; +import org.springframework.scripting.ScriptSource; +import org.springframework.util.Assert; + +/** + * Executes Jsr223 scripts + * + * @author David Turanski + * @since 2.1 + */ +public class Jsr223ScriptExecutor implements ScriptExecutor { + private static Log log = LogFactory.getLog(Jsr223ScriptExecutor.class); + private final ScriptEngine scriptEngine; + + /** + * Set the engine name (language) + * @param language + */ + public Jsr223ScriptExecutor(String language) { + ScriptEngineManager manager = new ScriptEngineManager(); + if (log.isDebugEnabled()){ + for (ScriptEngineFactory factory: manager.getEngineFactories()) { + log.debug(factory.getNames()); + } + } + + scriptEngine = manager.getEngineByName(language); + Assert.notNull(scriptEngine,"JVM cannot create a script engine for name [" + language + "]"); + + } + + /* + * (non-Javadoc) + * + * @see + * com.dturanski.test.jruby.ScriptExecutor#executeScript(org.springframework + * .scripting.ScriptSource) + */ + public Object executeScript(ScriptSource scriptSource) { + return this.executeScript(scriptSource,null); + } + + /* + * (non-Javadoc) + * + * @see + * com.dturanski.test.jruby.ScriptExecutor#bindVariable(java.lang.String, + * java.lang.Object) + */ + private void bindVariable(String variableName, Object value) { + scriptEngine.put(variableName, value); + } + + /* (non-Javadoc) + * @see org.springframework.integration.jsr233.ScriptExecutor#executeScript(org.springframework.scripting.ScriptSource, java.util.Map) + */ + public Object executeScript(ScriptSource scriptSource, Map variables) { + Assert.notNull(scriptSource, "scriptSource must not be null"); + synchronized (this) { + Object obj = null; + try { + + scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).clear(); + + if (variables != null ) { + for (Entry entry: variables.entrySet()){ + bindVariable(entry.getKey(), entry.getValue()); + } + } + + obj = scriptEngine.eval(scriptSource.getScriptAsString()); + + } + + catch (ScriptException e) { + throw new RuntimeException(e); + } + catch (IOException e) { + throw new RuntimeException(e); + } + + return obj; + } + } + +} diff --git a/spring-integration-scripting/src/main/resources/META-INF/spring.handlers b/spring-integration-scripting/src/main/resources/META-INF/spring.handlers new file mode 100644 index 0000000000..bbad0a3b04 --- /dev/null +++ b/spring-integration-scripting/src/main/resources/META-INF/spring.handlers @@ -0,0 +1 @@ +http\://www.springframework.org/schema/integration/script=org.springframework.integration.scripting.config.jsr223.Jsr223NamespaceHandler diff --git a/spring-integration-scripting/src/main/resources/META-INF/spring.schemas b/spring-integration-scripting/src/main/resources/META-INF/spring.schemas new file mode 100644 index 0000000000..a6072eeb56 --- /dev/null +++ b/spring-integration-scripting/src/main/resources/META-INF/spring.schemas @@ -0,0 +1,2 @@ +http\://www.springframework.org/schema/integration/script-2.1.xsd=org/springframework/integration/script/config/spring-integration-script-2.1.xsd +http\://www.springframework.org/schema/integration/script.xsd=org/springframework/integration/script/config/spring-integration-script-2.1.xsd diff --git a/spring-integration-scripting/src/main/resources/META-INF/spring.tooling b/spring-integration-scripting/src/main/resources/META-INF/spring.tooling new file mode 100644 index 0000000000..c60b4d5e8d --- /dev/null +++ b/spring-integration-scripting/src/main/resources/META-INF/spring.tooling @@ -0,0 +1,4 @@ +# Tooling related information for the integration script namespace +http\://www.springframework.org/schema/integration/script@name=integration script Namespace +http\://www.springframework.org/schema/integration/script@prefix=int-script +http\://www.springframework.org/schema/integration/script@icon=org/springframework/integration/script/config/spring-integration-script.gif diff --git a/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script-2.1.xsd b/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script-2.1.xsd new file mode 100644 index 0000000000..1f7ffe96cd --- /dev/null +++ b/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script-2.1.xsd @@ -0,0 +1,34 @@ + + + + + + + + + Configures an inner bean that will generate a + JSR 223 compliant script. + + + + + + + + + + + The script language or JSR 223 scripting engine name + + + + + + + + + diff --git a/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script.gif b/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script.gif new file mode 100644 index 0000000000..c4b81739eb Binary files /dev/null and b/spring-integration-scripting/src/main/resources/org/springframework/integration/script/config/spring-integration-script.gif differ diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests-context.xml new file mode 100644 index 0000000000..84bf2bf8a0 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests-context.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.groovy b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.groovy new file mode 100644 index 0000000000..97a32ce063 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.groovy @@ -0,0 +1 @@ +headers.type == 'good' \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.java new file mode 100644 index 0000000000..6ee0c020d9 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223FilterTests.java @@ -0,0 +1,83 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @author David Turanski + * @since 2.1 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223FilterTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Autowired + private MessageChannel inlineScriptInput; + + + @Test + public void referencedScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + Message message1 = MessageBuilder.withPayload("test-1") + .setReplyChannel(replyChannel) + .setHeader("type", "bad") + .build(); + Message message2 = MessageBuilder.withPayload("test-2") + .setReplyChannel(replyChannel) + .setHeader("type", "good") + .build(); + this.referencedScriptInput.send(message1); + this.referencedScriptInput.send(message2); + assertEquals("test-2", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + } + + @Test + public void inlineScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + Message message1 = MessageBuilder.withPayload("bad").setReplyChannel(replyChannel).build(); + Message message2 = MessageBuilder.withPayload("good").setReplyChannel(replyChannel).build(); + this.inlineScriptInput.send(message1); + this.inlineScriptInput.send(message2); + Message received = replyChannel.receive(0); + assertNotNull(received); + assertEquals("good", received.getPayload()); + assertEquals(message2, received); + assertNull(replyChannel.receive(0)); + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests-context.xml new file mode 100644 index 0000000000..237afaeb63 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests-context.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.java new file mode 100644 index 0000000000..c0dd2c4e9c --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.java @@ -0,0 +1,63 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static junit.framework.Assert.assertEquals; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.message.GenericMessage; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Oleg Zhurakousky + * @author David Turanski + * @since 2.1 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223HeaderEnricherTests { + + @Autowired + private MessageChannel inputA; + + @Autowired + private QueueChannel outputA; + + @Autowired + private MessageChannel inputB; + + @Autowired + private QueueChannel outputB; + + @Test + public void referencedScript() throws Exception{ + inputA.send(new GenericMessage("Hello")); + assertEquals("jruby", outputA.receive(1000).getHeaders().get("TEST_HEADER")); + } + + @Test + public void inlineScript() throws Exception{ + inputB.send(new GenericMessage("Hello")); + assertEquals("js", outputB.receive(1000).getHeaders().get("TEST_HEADER")); + } +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.rb b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.rb new file mode 100644 index 0000000000..06eec2de64 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223HeaderEnricherTests.rb @@ -0,0 +1 @@ +"jruby" \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests-context.xml new file mode 100644 index 0000000000..1bdbe3bd91 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests.java new file mode 100644 index 0000000000..560f7019fd --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RefreshTests.java @@ -0,0 +1,94 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.beans.PropertyEditorSupport; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.AbstractResource; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @author David Turanski + * @since 2.1 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223RefreshTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Test + public void referencedScript() throws Exception { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + this.referencedScriptInput.send(MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build()); + assertEquals("ruby-test-1", replyChannel.receive(0).getPayload()); + this.referencedScriptInput.send(MessageBuilder.withPayload("test").setReplyChannel(replyChannel).build()); + assertEquals("ruby-test-0", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + } + + public static class ResourceEditor extends PropertyEditorSupport { + @Override + public void setAsText(String text) throws IllegalArgumentException { + super.setValue(new CycleResource()); + } + } + + private static class CycleResource extends AbstractResource { + + private int count = -1; + private String[] scripts = {"\"ruby-#{$payload}-0\"", "\"ruby-#{$payload}-1\""}; + + public String getDescription() { + return "CycleResource"; + } + + @Override + public String getFilename() throws IllegalStateException { + return "CycleResource"; + } + + @Override + public long lastModified() throws IOException { + return -1; + } + + public InputStream getInputStream() throws IOException { + if (++count>scripts.length-1) { + count = 0; + } + return new ByteArrayInputStream(scripts[count].getBytes()); + } + + } +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests-context.xml new file mode 100644 index 0000000000..31b9bad53b --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests-context.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + 5 ? "longStrings" : "shortStrings"; + })(); + ]]> + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.java new file mode 100644 index 0000000000..24bcec2191 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.java @@ -0,0 +1,97 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.core.PollableChannel; +import org.springframework.integration.message.GenericMessage; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @author David Turanski + * @since 2.1 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223RouterTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Autowired + private MessageChannel inlineScriptInput; + + @Autowired + private PollableChannel longStrings; + + @Autowired + private PollableChannel shortStrings; + + + @Test + public void referencedScript() { // long is > 3 + Message message1 = new GenericMessage("aardvark"); + Message message2 = new GenericMessage("bear"); + Message message3 = new GenericMessage("cat"); + Message message4 = new GenericMessage("dog"); + Message message5 = new GenericMessage("elephant"); + this.referencedScriptInput.send(message1); + this.referencedScriptInput.send(message2); + this.referencedScriptInput.send(message3); + this.referencedScriptInput.send(message4); + this.referencedScriptInput.send(message5); + assertEquals("cat", shortStrings.receive(0).getPayload()); + assertEquals("dog", shortStrings.receive(0).getPayload()); + assertEquals("aardvark", longStrings.receive(0).getPayload()); + assertEquals("bear", longStrings.receive(0).getPayload()); + assertEquals("elephant", longStrings.receive(0).getPayload()); + assertNull(shortStrings.receive(0)); + assertNull(longStrings.receive(0)); + } + + @Test + public void inlineScript() { // long is > 5 + Message message1 = new GenericMessage("aardvark"); + Message message2 = new GenericMessage("bear"); + Message message3 = new GenericMessage("cat"); + Message message4 = new GenericMessage("dog"); + Message message5 = new GenericMessage("elephant"); + this.inlineScriptInput.send(message1); + this.inlineScriptInput.send(message2); + this.inlineScriptInput.send(message3); + this.inlineScriptInput.send(message4); + this.inlineScriptInput.send(message5); + assertEquals("bear", shortStrings.receive(0).getPayload()); + assertEquals("cat", shortStrings.receive(0).getPayload()); + assertEquals("dog", shortStrings.receive(0).getPayload()); + assertEquals("aardvark", longStrings.receive(0).getPayload()); + assertEquals("elephant", longStrings.receive(0).getPayload()); + assertNull(shortStrings.receive(0)); + assertNull(longStrings.receive(0)); + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.js b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.js new file mode 100644 index 0000000000..05feab9deb --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223RouterTests.js @@ -0,0 +1,5 @@ + +function route(max){ + return payload.length > max ? "longStrings" : "shortStrings"; +} +route(maxLen); diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-context.xml new file mode 100644 index 0000000000..c95155577d --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-context.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-context.xml new file mode 100644 index 0000000000..d9858b1f9b --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-context.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-withgenerator-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-withgenerator-context.xml new file mode 100644 index 0000000000..ec992cf682 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests-fail-withgenerator-context.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.java new file mode 100644 index 0000000000..a31110522e --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.java @@ -0,0 +1,152 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static junit.framework.Assert.assertFalse; +import static junit.framework.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.parsing.BeanDefinitionParsingException; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.scripting.ScriptVariableGenerator; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @author Oleg Zhurakousky + * @since 2.0 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223ServiceActivatorTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Autowired + private MessageChannel inlineScriptInput; + + @Autowired + private MessageChannel withScriptVariableGenerator; + + + + + @Test + public void referencedScriptAndCustomiser() throws Exception{ + + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + for (int i = 1; i <= 3; i++) { + Message message = MessageBuilder.withPayload("test-" + i).setReplyChannel(replyChannel).build(); + this.referencedScriptInput.send(message); + Thread.sleep(1000); + } + String value1 = (String) replyChannel.receive(0).getPayload(); + String value2 = (String) replyChannel.receive(0).getPayload(); + String value3 = (String) replyChannel.receive(0).getPayload(); + System.out.println(value1 + "\n" + value2 + "\n" + value3); + assertTrue(value1.startsWith("ruby-test-1-foo - bar")); + assertTrue(value2.startsWith("ruby-test-2-foo - bar")); + assertTrue(value3.startsWith("ruby-test-3-foo - bar")); + // because we are using 'prototype bean the suffix date will be different + + assertFalse(value1.substring(26).equals(value2.substring(26))); + assertFalse(value2.substring(26).equals(value3.substring(26))); + + assertNull(replyChannel.receive(0)); + } + + @Test + public void withScriptVariableGenerator() throws Exception{ + + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + for (int i = 1; i <= 3; i++) { + Message message = MessageBuilder.withPayload("test-" + i).setReplyChannel(replyChannel).build(); + this.withScriptVariableGenerator.send(message); + Thread.sleep(1000); + } + String value1 = (String) replyChannel.receive(0).getPayload(); + String value2 = (String) replyChannel.receive(0).getPayload(); + String value3 = (String) replyChannel.receive(0).getPayload(); + assertTrue(value1.startsWith("ruby-test-1-foo - bar")); + assertTrue(value2.startsWith("ruby-test-2-foo - bar")); + assertTrue(value3.startsWith("ruby-test-3-foo - bar")); + // because we are using 'prototype bean the suffix date will be different + + assertFalse(value1.substring(26).equals(value2.substring(26))); + assertFalse(value2.substring(26).equals(value3.substring(26))); + + assertNull(replyChannel.receive(0)); + } + + @Test + public void inlineScript() throws Exception{ + + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + for (int i = 1; i <= 3; i++) { + Message message = MessageBuilder.withPayload("test-" + i).setReplyChannel(replyChannel).build(); + this.inlineScriptInput.send(message); + } + assertEquals("inline-test-1", replyChannel.receive(0).getPayload()); + assertEquals("inline-test-2", replyChannel.receive(0).getPayload()); + assertEquals("inline-test-3", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + + } + + @Test(expected=BeanDefinitionParsingException.class) + public void inlineScriptAndVariables() throws Exception{ + new ClassPathXmlApplicationContext("Jsr223ServiceActivatorTests-fail-context.xml", this.getClass()); + } + + @Test(expected=BeanDefinitionParsingException.class) + public void variablesAndScriptVariableGenerator() throws Exception{ + new ClassPathXmlApplicationContext("Jsr223ServiceActivatorTests-fail-withgenerator-context.xml", this.getClass()); + } + + + public static class SampleScriptVariSource implements ScriptVariableGenerator{ + public Map generateScriptVariables(Message message) { + Map variables = new HashMap(); + variables.put("foo", "foo"); + variables.put("bar", "bar"); + variables.put("date", new Date()); + variables.put("payload", message.getPayload()); + variables.put("headers", message.getHeaders()); + return variables; + } + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.rb b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.rb new file mode 100644 index 0000000000..3e3392a2bb --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223ServiceActivatorTests.rb @@ -0,0 +1 @@ +"ruby-#{$payload}-#{$foo} - #{$bar} - #{$date}" \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests-context.xml new file mode 100644 index 0000000000..246eac15cd --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests-context.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.groovy b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.groovy new file mode 100644 index 0000000000..aa257f1603 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.groovy @@ -0,0 +1 @@ +payload.split(',') \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.java new file mode 100644 index 0000000000..4836a7a0e7 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223SplitterTests.java @@ -0,0 +1,72 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @since 2.0 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223SplitterTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Autowired + private MessageChannel inlineScriptInput; + + + @Test + public void referencedScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + Message message = MessageBuilder.withPayload("x,y,z").setReplyChannel(replyChannel).build(); + this.referencedScriptInput.send(message); + assertEquals("x", replyChannel.receive(0).getPayload()); + assertEquals("y", replyChannel.receive(0).getPayload()); + assertEquals("z", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + } + + @Test + public void inlineScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + Message message = MessageBuilder.withPayload("a b c").setReplyChannel(replyChannel).build(); + this.inlineScriptInput.send(message); + assertEquals("a", replyChannel.receive(0).getPayload()); + assertEquals("b", replyChannel.receive(0).getPayload()); + assertEquals("c", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml new file mode 100644 index 0000000000..c668de58db --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java new file mode 100644 index 0000000000..d1d6f5e4cd --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2002-2010 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.scripting.config.jsr223; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.Message; +import org.springframework.integration.MessageChannel; +import org.springframework.integration.channel.QueueChannel; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @author Mark Fisher + * @since 2.0 + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class Jsr223TransformerTests { + + @Autowired + private MessageChannel referencedScriptInput; + + @Autowired + private MessageChannel inlineScriptInput; + + + @Test + public void referencedScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + for (int i = 1; i <= 3; i++) { + Message message = MessageBuilder.withPayload("test-" + i).setReplyChannel(replyChannel).build(); + this.referencedScriptInput.send(message); + } + assertEquals("ruby-test-1", replyChannel.receive(0).getPayload()); + assertEquals("ruby-test-2", replyChannel.receive(0).getPayload()); + assertEquals("ruby-test-3", replyChannel.receive(0).getPayload()); + assertNull(replyChannel.receive(0)); + } + + @Test + public void inlineScript() { + QueueChannel replyChannel = new QueueChannel(); + replyChannel.setBeanName("returnAddress"); + for (int i = 1; i <= 3; i++) { + Message message = MessageBuilder.withPayload("test-" + i).setReplyChannel(replyChannel).build(); + this.inlineScriptInput.send(message); + } + assertEquals("inline-test-1", replyChannel.receive(0).getPayload().toString()); + assertEquals("inline-test-2", replyChannel.receive(0).getPayload().toString()); + assertEquals("inline-test-3", replyChannel.receive(0).getPayload().toString()); + assertNull(replyChannel.receive(0)); + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.rb b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.rb new file mode 100644 index 0000000000..6b9be8f857 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/config/jsr223/Jsr223TransformerTests.rb @@ -0,0 +1,8 @@ +class Transformer + def transform(payload) + "ruby-#{payload}" + end + +end + +Transformer.new.transform($payload) \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessorTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessorTests.java new file mode 100644 index 0000000000..c7f28f2887 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutingMessageProcessorTests.java @@ -0,0 +1,73 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.scripting.jsr223; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.integration.Message; +import org.springframework.integration.message.GenericMessage; +import org.springframework.integration.scripting.jsr223.Jsr223ScriptExecutingMessageProcessor; +import org.springframework.integration.scripting.jsr223.Jsr223ScriptExecutor; +import org.springframework.scripting.ScriptSource; +import org.springframework.scripting.support.ResourceScriptSource; + +/** + * @author David Turanski + * + */ +public class Jsr223ScriptExecutingMessageProcessorTests { + Jsr223ScriptExecutor executor; + @Before + public void setUp() { + executor = new Jsr223ScriptExecutor("jruby"); + } + @Test + public void testExecuteWithVariables(){ + + + Map vars = new HashMap(); + vars.put("one",1); + vars.put("two","two"); + vars.put("three", new Integer(3)); + + ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("/org/springframework/integration/scripting/jsr223/print_message.rb")); + + Jsr223ScriptExecutingMessageProcessor messageProcessor = new Jsr223ScriptExecutingMessageProcessor(scriptSource,executor,vars); + + Message message = new GenericMessage("hello"); + + Object obj = messageProcessor.processMessage(message); + + assertEquals("hello modified",obj.toString().substring(0,"hello modified".length())); + } + + @Test + public void testWithNoVars(){ + ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("/org/springframework/integration/scripting/jsr223/print_message.rb")); + + Jsr223ScriptExecutingMessageProcessor messageProcessor = new Jsr223ScriptExecutingMessageProcessor(scriptSource,executor); + + Message message = new GenericMessage("hello"); + + Object obj = messageProcessor.processMessage(message); + + assertEquals("hello modified",obj.toString().substring(0,"hello modified".length())); + } + +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutorTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutorTests.java new file mode 100644 index 0000000000..5763002a54 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/Jsr223ScriptExecutorTests.java @@ -0,0 +1,61 @@ +/* + * Copyright 2002-2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.scripting.jsr223; + +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; +import org.springframework.core.io.ClassPathResource; +import org.springframework.integration.scripting.ScriptExecutor; +import org.springframework.integration.scripting.jsr223.Jsr223ScriptExecutor; +import org.springframework.scripting.support.ResourceScriptSource; +import org.springframework.scripting.support.StaticScriptSource; + +/** + * @author David Turanski + * + */ +public class Jsr223ScriptExecutorTests { + @Test + public void test(){ + ScriptExecutor executor = new Jsr223ScriptExecutor("jruby"); + executor.executeScript(new StaticScriptSource("puts 'hello, world'")); + executor.executeScript(new StaticScriptSource("puts 'hello, again'")); + + Map variables = new HashMap(); + + Map headers = new HashMap(); + headers.put("one",1); + headers.put("two","two"); + headers.put("three", new Integer(3)); + + variables.put("payload", "payload"); + variables.put("headers", headers); + + String result = (String)executor.executeScript( + new ResourceScriptSource(new ClassPathResource("/org/springframework/integration/scripting/jsr223/print_message.rb")), + variables + ); + + assertEquals("payload modified",result.substring(0,"payload modified".length())); + } + @Test + public void testJs(){ + ScriptExecutor executor = new Jsr223ScriptExecutor("js"); + Object obj = executor.executeScript(new StaticScriptSource("function js(){ return 'js';} js();")); + assertEquals("js",obj.toString()); + } +} diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/hello.rb b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/hello.rb new file mode 100755 index 0000000000..ca4e0e0c39 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/hello.rb @@ -0,0 +1,9 @@ +require 'java' + +class RubyHello + include_class 'com.dturanski.test.jruby.Hello' + def say + "hello,world" + end +end +RubyHello.new \ No newline at end of file diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/print_message.rb b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/print_message.rb new file mode 100755 index 0000000000..3dad889468 --- /dev/null +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/print_message.rb @@ -0,0 +1,12 @@ +include Java +include_class 'java.util.Date' +#payload and headers a global variable +if $payload + $payload = $payload+" modified #{Date.new}" +end +puts $payload +if $headers + $headers.each {|key, value| puts "#{key} is #{value}" } +end +puts "#{$one} #{$two} #{$three}" +$payload \ No newline at end of file diff --git a/spring-integration-scripting/src/test/resources/log4j.xml b/spring-integration-scripting/src/test/resources/log4j.xml new file mode 100644 index 0000000000..a87914ff1e --- /dev/null +++ b/spring-integration-scripting/src/test/resources/log4j.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-integration-scripting/template.mf b/spring-integration-scripting/template.mf new file mode 100644 index 0000000000..3b5aa739e0 --- /dev/null +++ b/spring-integration-scripting/template.mf @@ -0,0 +1,11 @@ +Bundle-SymbolicName: org.springframework.integration.scripting +Bundle-Name: Spring Integration Scripting Support +Bundle-Vendor: SpringSource +Bundle-Version: ${version} +Bundle-ManifestVersion: 2 +Import-Template: + org.apache.commons.logging;version="[1.1.1, 2.0.0)", + org.springframework.integration.*;version="[2.1.0, 2.1.1)", + org.springframework.*;version="[3.1.0, 4.0.0)", + org.w3c.dom.*;version="0", + javax.script.*;version="0"