From eebb51f38a3a7594a47405ba06fc9766d1a1bde2 Mon Sep 17 00:00:00 2001 From: David Turanski Date: Fri, 14 Oct 2011 13:55:06 -0400 Subject: [PATCH] INT-2177. Improved exception handling. Made ScriptExecutorFactory abstract --- spring-integration-scripting/pom.xml | 167 ------------------ .../scripting/ScriptingException.java | 33 ++++ .../jsr223/AbstractScriptExecutor.java | 42 +++-- .../jsr223/ScriptExecutorFactory.java | 3 +- .../jsr223/Jsr223ScriptExecutorTests.java | 17 +- .../jsr223/PythonScriptExecutorTests.java | 1 + 6 files changed, 76 insertions(+), 187 deletions(-) delete mode 100644 spring-integration-scripting/pom.xml create mode 100644 spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java diff --git a/spring-integration-scripting/pom.xml b/spring-integration-scripting/pom.xml deleted file mode 100644 index 203639d858..0000000000 --- a/spring-integration-scripting/pom.xml +++ /dev/null @@ -1,167 +0,0 @@ - - - 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 - - - - - - - - SpringSource External Bundle Repository - http://repository.springsource.com/maven/bundles/external/ - - - SpringSource Milestone Repository - http://maven.springframework.org/milestone/ - - - SpringSource Release Bundle Repository - http://repository.springsource.com/maven/bundles/release/ - - - SpringSource Release Repository - http://maven.springframework.org/release/ - - - - - org.easymock - easymock - 2.3 - test - - - org.springframework.integration - spring-integration-core - 2.1.0.BUILD-SNAPSHOT - compile - - - org.springframework.integration - spring-integration-test - 2.1.0.BUILD-SNAPSHOT - test - - - org.easymock - easymockclassextension - 2.3 - test - - - org.hamcrest - hamcrest-all - 1.1 - test - - - org.springframework - spring-test - 3.0.6.RELEASE - test - - - org.mockito - mockito-all - 1.8.4 - test - - - org.codehaus.groovy - groovy-all - 1.7.5 - test - - - log4j - log4j - 1.2.12 - test - - - cglib - cglib-nodep - 2.2 - test - - - junit - junit-dep - 4.8.2 - test - - - org.jruby - jruby - 1.6.3 - test - - - - UTF8 - - diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java new file mode 100644 index 0000000000..59cd9aa800 --- /dev/null +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/ScriptingException.java @@ -0,0 +1,33 @@ +/* + * 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 org.springframework.integration.MessagingException; + +/** + * @author David Turanski + * @since 2.1 + */ +@SuppressWarnings("serial") + +public class ScriptingException extends MessagingException { + + public ScriptingException(String description) { + super(description); + } + + + public ScriptingException(String description, Throwable cause) { + super(description, cause); + } +} diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java index e07a4afe67..e3fa153e38 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/AbstractScriptExecutor.java @@ -12,18 +12,17 @@ */ package org.springframework.integration.scripting.jsr223; -import java.io.IOException; import java.util.Date; import java.util.Map; import java.util.Map.Entry; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; -import javax.script.ScriptException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.integration.scripting.ScriptExecutor; +import org.springframework.integration.scripting.ScriptingException; import org.springframework.scripting.ScriptSource; import org.springframework.util.Assert; @@ -46,14 +45,16 @@ abstract class AbstractScriptExecutor implements ScriptExecutor { Assert.hasText(language, "language must not be empty"); this.language = language; if (logger.isDebugEnabled()) { - logger.debug("using script engine : " + scriptEngineManager.getEngineByName(language).getFactory().getEngineName()); - for (String name:scriptEngineManager.getEngineByName(language).getFactory().getNames()){ - logger.debug("name=" + name); - } + ScriptEngine scriptEngine = scriptEngineManager.getEngineByName(this.language); + if (scriptEngine == null) { + logger.error(invlalidLanguageMessage(this.language)); + } + else { + logger.debug("using script engine : " + scriptEngine.getFactory().getEngineName()); + } } } - public Object executeScript(ScriptSource scriptSource) { return this.executeScript(scriptSource, null); } @@ -61,6 +62,11 @@ abstract class AbstractScriptExecutor implements ScriptExecutor { public Object executeScript(ScriptSource scriptSource, Map variables) { Object result = null; ScriptEngine scriptEngine = this.scriptEngineManager.getEngineByName(this.language); + + if (scriptEngine == null) { + throw new ScriptingException(invlalidLanguageMessage(this.language)); + } + try { if (variables != null) { for (Entry entry : variables.entrySet()) { @@ -72,25 +78,23 @@ abstract class AbstractScriptExecutor implements ScriptExecutor { if (logger.isDebugEnabled()) { logger.debug("executing script: " + script); } - + result = scriptEngine.eval(script); - + result = postProcess(result, scriptEngine, script); - + if (logger.isDebugEnabled()) { logger.debug("script executed in " + (new Date().getTime() - start.getTime()) + " ms"); } } - catch (IOException e) { - throw new RuntimeException(e); - } - catch (ScriptException e) { - throw new RuntimeException(e); + + catch (Exception e) { + throw new ScriptingException(e.getMessage(), e); } + return result; } - /** * Subclasses may implement this to provide any special handling required * @param result @@ -100,4 +104,10 @@ abstract class AbstractScriptExecutor implements ScriptExecutor { */ protected abstract Object postProcess(Object result, ScriptEngine scriptEngine, String script); + private static String invlalidLanguageMessage(String language) { + return new StringBuilder().append(ScriptEngineManager.class.getName()) + .append(" is unable to create a script engine for language '").append(language).append("'.\n") + .append("This may be due to a missing language implementation or an invalid language name.").toString(); + } + } diff --git a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutorFactory.java b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutorFactory.java index 9759907438..95cfaba25d 100644 --- a/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutorFactory.java +++ b/spring-integration-scripting/src/main/java/org/springframework/integration/scripting/jsr223/ScriptExecutorFactory.java @@ -18,9 +18,8 @@ import org.springframework.integration.scripting.ScriptExecutor; * @author David Turanski * @since 2.1 */ -public class ScriptExecutorFactory { +public abstract class ScriptExecutorFactory { - private ScriptExecutorFactory(){}; public static ScriptExecutor getScriptExecutor(String language) { if (language.equalsIgnoreCase("python") || language.equalsIgnoreCase("jython")){ return new PythonScriptExecutor(); 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 index b61bebb198..dcddde9582 100644 --- 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 @@ -13,6 +13,7 @@ package org.springframework.integration.scripting.jsr223; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; import java.util.HashMap; import java.util.Map; @@ -20,7 +21,7 @@ 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.DefaultScriptExecutor; +import org.springframework.integration.scripting.ScriptingException; import org.springframework.scripting.support.ResourceScriptSource; import org.springframework.scripting.support.StaticScriptSource; @@ -59,7 +60,8 @@ public class Jsr223ScriptExecutorTests { assertEquals("js",obj.toString()); } - @Test public void testPython() { + @Test + public void testPython() { ScriptExecutor executor = ScriptExecutorFactory.getScriptExecutor("python"); Object obj = executor.executeScript(new StaticScriptSource("x=2") ); assertEquals(2,obj); @@ -67,4 +69,15 @@ public class Jsr223ScriptExecutorTests { obj = executor.executeScript(new StaticScriptSource("def foo(y):\n\tx=y\n\treturn y\nz=foo(2)") ); assertEquals(2,obj); } + + @Test + public void testInvalidLanguageThrowsScriptingException() { + try { + ScriptExecutor executor = ScriptExecutorFactory.getScriptExecutor("foo"); + executor.executeScript(new StaticScriptSource("x=2")); + fail("should throw Exception"); + } catch (ScriptingException e) { + System.out.println(e.getMessage()); + } + } } diff --git a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/PythonScriptExecutorTests.java b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/PythonScriptExecutorTests.java index 4c9689aee1..f30c04b549 100644 --- a/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/PythonScriptExecutorTests.java +++ b/spring-integration-scripting/src/test/java/org/springframework/integration/scripting/jsr223/PythonScriptExecutorTests.java @@ -36,6 +36,7 @@ public class PythonScriptExecutorTests { public void init() { executor = new PythonScriptExecutor(); } + @Test public void testLiteral() { Object obj = executor.executeScript(new StaticScriptSource("3+4") );