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