Hi there!

Stimulated by the hope of winning a shiny Nano, I started hacking a sample integrating Rhino and Axis2. I know Rhino quite well as Cocoon is using it extensively, but I'm a total newbie when it comes to Axis2. So I wrote the sample, but failed to run a test to see if it actually works.

So please find attached the patch against modules/samples with what I've been up to, in the hope that it can be useful and that you guys can spend a bit of time to check if it works.

Thanks,
Sylvain

PS: I started to use Axiom for what could become a StAX-based Cocoon. Nice stuff, although I found little things that I'm missing. Working around for now, but expect some patches in the near future :-)

--
Sylvain Wallez                        Anyware Technologies
http://bluxte.net                     http://www.anyware-tech.com
Apache Software Foundation Member     Research & Technology Director

Index: maven.xml
===================================================================
--- maven.xml   (revision 355804)
+++ maven.xml   (working copy)
@@ -258,6 +258,26 @@
     </goal>
 
     <!-- ================================================================ -->
+    <!--- Rhino Service Sample -->
+    <!-- ================================================================ -->
+
+    <goal name="rhino">
+        <mkdir dir="target/samples"/>
+        <ant:copy file="./src/sample/rhino/rhino-sample.js" 
tofile="target/samples/rhino/sample/rhino/rhino-sample.js"/>
+        <ant:copy file="target/classes/sample/rhino/RhinoReceiver.class"
+                      
tofile="target/samples/rhino/sample/rhino/RhinoReceiver.class"/>
+        <ant:copy file="${maven.repo.local}/rhino/jars/js-1.6R2.jar" 
tofile="target/samples/rhino/lib/js-1.6R2.jar"/>
+        <ant:copy file="${maven.repo.local}/xmlbeans/jars/xbean-2.0.0.jar" 
tofile="target/samples/rhino/lib/xbean-2.0.0.jar"/>
+        <jar destfile="${samples.dir}/rhinoService.aar">
+            <fileset dir="target/samples/rhino">
+            </fileset>
+            <fileset dir="src/sample/rhino/">
+                <include name="META-INF/**"/>
+            </fileset>
+        </jar>
+    </goal>
+
+    <!-- ================================================================ -->
     <!--- Security Sample -->
     <!-- ================================================================ -->
     <goal name="securitySample">
Index: project.xml
===================================================================
--- project.xml (revision 355804)
+++ project.xml (working copy)
@@ -211,6 +211,14 @@
                 <module>true</module>
             </properties>
         </dependency>
+        <dependency>
+            <groupId>rhino</groupId>
+            <artifactId>js</artifactId>
+            <version>${rhino.version}</version>
+            <properties>
+                <module>true</module>
+            </properties>
+        </dependency>
     </dependencies>
 
     <!-- build information for the project -->
Index: src/sample/rhino/META-INF/services.xml
===================================================================
--- src/sample/rhino/META-INF/services.xml      (revision 0)
+++ src/sample/rhino/META-INF/services.xml      (revision 0)
@@ -0,0 +1,12 @@
+<service name="RhinoService">
+    <description>
+        This is Rhino service , what this really does is take the incoming 
SOAP message
+        and hand that over to a Rhino function which processes the message and 
return a SOAP
+        message back to MessageReceiver
+    </description>
+    <parameter name="JavaScriptSource" 
locked="false">sample/rhino/rhino-sample.js</parameter>
+
+    <operation name="hello">
+        <messageReceiver class="sample.rhino.RhinoReceiver"/>
+    </operation>
+</service>
\ No newline at end of file

Property changes on: src/sample/rhino/META-INF/services.xml
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Index: src/sample/rhino/RhinoReceiver.java
===================================================================
--- src/sample/rhino/RhinoReceiver.java (revision 0)
+++ src/sample/rhino/RhinoReceiver.java (revision 0)
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * 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 sample.rhino;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.engine.MessageReceiver;
+import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.om.OMAbstractFactory;
+import org.apache.axis2.om.OMElement;
+import org.apache.axis2.om.OMFactory;
+import org.apache.axis2.om.OMNamespace;
+import org.apache.axis2.om.impl.llom.builder.StAXOMBuilder;
+import org.apache.axis2.receivers.AbstractInOutSyncMessageReceiver;
+import org.apache.axis2.soap.SOAPEnvelope;
+import org.apache.axis2.soap.SOAPFactory;
+import org.mozilla.javascript.Context;
+import org.mozilla.javascript.Function;
+import org.mozilla.javascript.Script;
+import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.ScriptableObject;
+
+public class RhinoReceiver extends AbstractInOutSyncMessageReceiver implements 
MessageReceiver {
+
+    public void invokeBusinessLogic(MessageContext inMessage, MessageContext 
outMessage) throws AxisFault {
+        try {
+            AxisService service = 
inMessage.getOperationContext().getServiceContext().getAxisService();
+            Parameter jsSource = service.getParameter("JavaScriptSource");
+            if (jsSource == null) {
+                throw new AxisFault(
+                    Messages.getMessage("paramIsNotSpecified", 
"JavaScriptSource"));
+            }
+            
+            // The operation should be a JS function
+            AxisOperation op = 
inMessage.getOperationContext().getAxisOperation();
+            if (op == null) {
+                throw new AxisFault(Messages.getMessage("notFound", 
"Operation"));
+            }            
+            String funcName = op.getName().getLocalPart();
+
+            Scriptable script = buildScript(
+                    service.getClassLoader(),
+                    jsSource.getValue().toString());
+
+
+            OMElement body = (OMElement)inMessage.getEnvelope().getBody();
+            
+            // Serialize the body of the request
+            StringWriter writer = new StringWriter();
+            body.build();
+            body.serialize(writer);
+            String bodyText = writer.toString();
+            
+            
+            Object jsFunc = ScriptableObject.getProperty(script, funcName);
+            if (jsFunc == Scriptable.NOT_FOUND) {
+                throw new AxisFault("Function \"javascript:" + funcName + 
"()\" not found");
+            }
+
+            if (!(jsFunc instanceof Function)) {
+                throw new AxisFault("javascript:" + funcName + " is not a 
function");
+            }
+
+            Object result;
+            Context ctx = Context.enter();
+            try {
+                result = ((Function)jsFunc).call(ctx, script.getParentScope(), 
null, new Object[]{bodyText});
+            } finally {
+                Context.exit();
+            }
+
+            if (result == null) {
+                throw new AxisFault("No result from JavaScript function");
+            }
+            
+            SOAPFactory fac = null;
+            if(inMessage.isSOAP11()){
+                fac = OMAbstractFactory.getSOAP11Factory();
+            }else{
+                fac = OMAbstractFactory.getSOAP12Factory();
+            }
+            SOAPEnvelope envelope = fac.getDefaultEnvelope();
+            OMNamespace ns =
+                fac.createOMNamespace("http://soapenc/";, "res");
+            OMElement responseElement =
+                fac.createOMElement(funcName + "Response", ns);
+            String outMessageString = result.toString();
+            // System.out.println("outMessageString = " + outMessageString);
+            // responseElement.setText(outMessageString);
+            responseElement.addChild(getpayLoad(outMessageString));
+            envelope.getBody().addChild(responseElement);
+            outMessage.setEnvelope(envelope);
+
+        } catch (Exception e) {
+            throw new AxisFault(e);
+        } 
+    }
+
+    private OMElement getpayLoad(String str) throws XMLStreamException {
+        XMLStreamReader xmlReader =
+            XMLInputFactory.newInstance().createXMLStreamReader(
+                new ByteArrayInputStream(str.getBytes()));
+        OMFactory fac = OMAbstractFactory.getOMFactory();
+
+        StAXOMBuilder staxOMBuilder =
+            new StAXOMBuilder(fac, xmlReader);
+        return staxOMBuilder.getDocumentElement();
+    }
+
+    public static Scriptable buildScript(ClassLoader classLoader, String 
location) throws IOException {
+        InputStream stream = classLoader.getResourceAsStream(location);
+        if (stream == null) {
+            throw new AxisFault("Resource " + location + " doesn't exist.");
+        }
+        Scriptable scope;
+        Context ctx = Context.enter();
+        try {
+            Script script = ctx.compileReader(
+                new InputStreamReader(stream), // in
+                location, // sourceName
+                0, // lineNo
+                null // securityDomain
+             );
+            
+            scope = ctx.initStandardObjects();
+            
+            script.exec(ctx, scope);
+        } finally {
+            Context.exit();
+        }
+        return scope;
+    }
+}

Property changes on: src/sample/rhino/RhinoReceiver.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Index: src/sample/rhino/rhino-sample.js
===================================================================
--- src/sample/rhino/rhino-sample.js    (revision 0)
+++ src/sample/rhino/rhino-sample.js    (revision 0)
@@ -0,0 +1,5 @@
+
+
+function hello() {
+  return "<hello>world</hello>";
+}
\ No newline at end of file

Property changes on: src/sample/rhino/rhino-sample.js
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Index: src/sample/rhino/RhinoTestClient.java
===================================================================
--- src/sample/rhino/RhinoTestClient.java       (revision 0)
+++ src/sample/rhino/RhinoTestClient.java       (revision 0)
@@ -0,0 +1,56 @@
+package sample.rhino;
+
+import java.io.StringWriter;
+
+import javax.xml.stream.XMLOutputFactory;
+
+import org.apache.axis2.Constants;
+import org.apache.axis2.addressing.EndpointReference;
+import org.apache.axis2.client.Call;
+import org.apache.axis2.client.Options;
+import org.apache.axis2.om.OMAbstractFactory;
+import org.apache.axis2.om.OMElement;
+import org.apache.axis2.om.OMFactory;
+import org.apache.axis2.om.OMNamespace;
+
+
+public class RhinoTestClient {
+
+    private static EndpointReference targetEPR = new 
EndpointReference("http://localhost:8080/axis2/services/rhinoService";);
+
+    public static OMElement getEchoOMElement() {
+        OMFactory fac = OMAbstractFactory.getOMFactory();
+        OMNamespace omNs = fac.createOMNamespace(
+                "http://example1.org/example1";, "example1");
+        OMElement method = fac.createOMElement("echo", omNs);
+        OMElement value = fac.createOMElement("Text", omNs);
+        value.addChild(fac.createText(value, "Axis2 Echo String "));
+        method.addChild(value);
+
+        return method;
+    }
+
+    public static void main(String[] args) throws Exception {
+        OMElement payload = getEchoOMElement();
+        Call call = new Call();
+
+        Options options = new Options();
+        call.setClientOptions(options);
+        options.setTo(targetEPR);
+        options.setListenerTransportProtocol(Constants.TRANSPORT_HTTP);
+
+        //Blocking invocation
+        OMElement result = call.invokeBlocking("hello",
+                payload);
+
+        StringWriter writer = new StringWriter();
+        result.serialize(XMLOutputFactory.newInstance()
+                .createXMLStreamWriter(writer));
+        writer.flush();
+
+        System.out.println(writer.toString());
+
+    }
+
+}
+

Property changes on: src/sample/rhino/RhinoTestClient.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Reply via email to