[jboss-svn-commits] JBL Code SVN: r10281 - in labs/jbossesb/trunk/product/core/listeners: tests/src/org/jboss/soa/esb/actions/scripting and 1 other directory.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Mar 16 15:18:16 EDT 2007


Author: tfennelly
Date: 2007-03-16 15:18:16 -0400 (Fri, 16 Mar 2007)
New Revision: 10281

Modified:
   labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessor.java
   labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessorUnitTest.java
Log:
Updated to work in new .esb archive deployment model.

Modified: labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessor.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessor.java	2007-03-16 19:16:17 UTC (rev 10280)
+++ labs/jbossesb/trunk/product/core/listeners/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessor.java	2007-03-16 19:18:16 UTC (rev 10281)
@@ -20,23 +20,25 @@
 package org.jboss.soa.esb.actions.scripting;
 
 import groovy.lang.Binding;
+import groovy.lang.GroovyShell;
 import groovy.util.GroovyScriptEngine;
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.ConfigurationException;
-import org.jboss.soa.esb.actions.ActionProcessor;
+import org.jboss.soa.esb.actions.ActionPipelineProcessor;
+import org.jboss.soa.esb.actions.ActionLifecycleException;
+import org.jboss.internal.soa.esb.util.StreamUtils;
 import org.apache.log4j.Logger;
 
 import java.io.IOException;
-import java.io.Serializable;
+import java.io.InputStream;
 
 /**
  * <a href="http://groovy.codehaus.org">Groovy</a> Scripting action processor.
  * <p/>
  * <pre>
  * &lt;action name="groovy" class="org.jboss.soa.esb.actions.scripting.GroovyActionProcessor"&gt;
- *     &lt;property name="scriptPath" value="./scripts" /&gt;
- *     &lt;property name="script" value="helloWorld.groovy" /&gt;
+ *     &lt;property name="script" value="/scripts/helloWorld.groovy" /&gt;
  * &lt;/action&gt;
  * </pre>
  * <p/>
@@ -45,25 +47,59 @@
  *
  * @author Gregory Pierce.
  */
-public class GroovyActionProcessor implements ActionProcessor {
+public class GroovyActionProcessor implements ActionPipelineProcessor {
 
     private static Logger logger = Logger.getLogger(GroovyActionProcessor.class);
     protected ConfigTree configTree;
     protected GroovyScriptEngine scriptEngine;
-    private String scriptName;
+    private String script;
 
     public GroovyActionProcessor(ConfigTree config) throws ConfigurationException {
         this.configTree = config;
-        String[] scriptPaths = new String[]{new String(configTree.getAttribute("scriptPath"))};
+    }
 
-        scriptName = configTree.getAttribute("script");
+    public void initialise() throws ActionLifecycleException {
+        InputStream scriptStream = null;
+        String scriptName = configTree.getAttribute("script");
+
+        if(scriptName == null) {
+            throw new ActionLifecycleException("Mandatory action property 'script' not specified.");
+        }
+
+        scriptStream = getScriptStream(scriptName);
+        if(scriptStream == null) {
+            throw new ActionLifecycleException("Script '" + scriptName + "' not found on classpath.");
+        }
+
         try {
-            scriptEngine = new GroovyScriptEngine(scriptPaths, getClass().getClassLoader());
-        } catch (IOException e) {
-            throw new ConfigurationException("Failed to initialise a Groovy scripting engine instance.", e);
+            script = new String(StreamUtils.readStream(scriptStream));
+        } catch(Throwable t) {
+            throw new ActionLifecycleException("Error reading script '" + scriptName + "' stream.");
+        } finally {
+            try {
+                if(scriptStream != null) {
+                    scriptStream.close();
+                }
+            } catch (IOException e) {
+                throw new ActionLifecycleException("Failed to close script '" + scriptName + "' stream.");
+            }
         }
     }
 
+    private InputStream getScriptStream(String scriptName) {
+        InputStream scriptStream;
+
+        scriptStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptName);
+        if(scriptStream == null) {
+            scriptStream = getClass().getResourceAsStream(scriptName);
+        }
+        
+        return scriptStream;
+    }
+
+    public void destroy() throws ActionLifecycleException {
+    }
+    
     /**
      * Processes an ESB message. Configuration is via two properties of this ESB element
      * scriptPath - The path to the script that will be run
@@ -80,13 +116,14 @@
             binding.setVariable("message", message);
             binding.setVariable("config", configTree);
 
-            // run the script specified in the scriptName
-            //
-            scriptEngine.run(scriptName, binding);
+            GroovyShell shell = new GroovyShell(Thread.currentThread().getContextClassLoader(), binding);
+            Object returnVal = shell.evaluate(script);
 
-            // send the modified message back into the channel
-            //
-            return (Message) binding.getVariable("message");
+            if(returnVal instanceof Message) {
+                return (Message) returnVal;
+            } else {
+                return message;
+            }
         }
         catch (Exception e) {
             logger.error("Error executing Groovy script.", e);
@@ -94,11 +131,9 @@
 		}
 	}
 
-    public Serializable getOkNotification(Message message) {
-        return null;
+    public void processException(final Message message, final Exception ex) {
     }
 
-    public Serializable getErrorNotification(Message message) {
-        return null;
+    public void processSuccess(final Message message) {
     }
 }
\ No newline at end of file

Modified: labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessorUnitTest.java
===================================================================
--- labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessorUnitTest.java	2007-03-16 19:16:17 UTC (rev 10280)
+++ labs/jbossesb/trunk/product/core/listeners/tests/src/org/jboss/soa/esb/actions/scripting/GroovyActionProcessorUnitTest.java	2007-03-16 19:18:16 UTC (rev 10281)
@@ -21,6 +21,7 @@
 
 import org.jboss.soa.esb.helpers.ConfigTree;
 import org.jboss.soa.esb.ConfigurationException;
+import org.jboss.soa.esb.actions.ActionLifecycleException;
 import org.jboss.soa.esb.message.Message;
 import org.jboss.soa.esb.message.format.MessageFactory;
 import junit.framework.TestCase;
@@ -31,13 +32,7 @@
  */
 public class GroovyActionProcessorUnitTest extends TestCase {
 
-    // Of course, this is going to cause trouble for anyone running the build through
-    // an IDE that's not setup properly (to match the ant build).  Sorry about that!!
-    // This test assumes your cwd is the "product" dir, as per the ant build - will need
-    // changing when we move to maven (sorry Kev :-) ).
-    private static final String scriptPath = "./core/listeners/tests/src/org/jboss/soa/esb/actions/scripting";
-
-    public void test() throws ConfigurationException {
+    public void test() throws ConfigurationException, ActionLifecycleException {
         ConfigTree config = getConfig("test.groovy");
         String messageContents = "Hello World!";
 
@@ -46,6 +41,7 @@
         GroovyActionProcessor processor = new GroovyActionProcessor(config);
         Message message = MessageFactory.getInstance().getMessage();
 
+        processor.initialise();
         processor.process(message);
         byte[] bodyContents = message.getBody().getContents();
         assertNotNull("Expected body contents to be set.", bodyContents);
@@ -55,8 +51,7 @@
     private ConfigTree getConfig(String script) {
         ConfigTree config = new ConfigTree("<config/>");
 
-        config.setAttribute("scriptPath", scriptPath);
-        config.setAttribute("script", script);
+        config.setAttribute("script", "/org/jboss/soa/esb/actions/scripting/" + script);
         
         return config;
     }




More information about the jboss-svn-commits mailing list