You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by mr...@apache.org on 2008/08/22 17:20:52 UTC
svn commit: r688093 - in /ode/sandbox/simpel: ./ lib/
src/main/antlr/org/apache/ode/simpel/antlr/ src/main/java/org/apache/ode/
src/main/java/org/apache/ode/embed/ src/main/java/org/apache/ode/simpel/expr/
src/main/java/org/apache/ode/simpel/omodel/ sr...
Author: mriou
Date: Fri Aug 22 08:20:51 2008
New Revision: 688093
URL: http://svn.apache.org/viewvc?rev=688093&view=rev
Log:
Proper E4X hooks (after patching a bug in Rhino) allowing complete assigment evaluation and recuperation of the lvalue once the dust settled.
Added:
ode/sandbox/simpel/lib/rhino-1.7R2pre-patched.jar
Removed:
ode/sandbox/simpel/lib/rhino-1.7R1.jar
Modified:
ode/sandbox/simpel/Rakefile
ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java
ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java
ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java
ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/SimPELExprRuntime.java
ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java
ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/SimPELExpr.java
ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java
Modified: ode/sandbox/simpel/Rakefile
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/Rakefile?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/Rakefile (original)
+++ ode/sandbox/simpel/Rakefile Fri Aug 22 08:20:51 2008
@@ -84,6 +84,6 @@
compile.enhance([task('tweak_antlr')])
compile.with HSQLDB, JAVAX.resource, JAVAX.transaction, COMMONS.lang, COMMONS.logging, ODE, LOG4J,
WSDL4J, GERONIMO.transaction, XERCES,
- file(_("lib/e4x-grammar-0.1.jar")), ANTLR, file(_("lib/rhino-1.7R1.jar"))
+ file(_("lib/e4x-grammar-0.1.jar")), ANTLR, file(_("lib/rhino-1.7R2pre-patched.jar"))
package :jar
end
Added: ode/sandbox/simpel/lib/rhino-1.7R2pre-patched.jar
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/lib/rhino-1.7R2pre-patched.jar?rev=688093&view=auto
==============================================================================
Files ode/sandbox/simpel/lib/rhino-1.7R2pre-patched.jar (added) and ode/sandbox/simpel/lib/rhino-1.7R2pre-patched.jar Fri Aug 22 08:20:51 2008 differ
Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g Fri Aug 22 08:20:51 2008
@@ -194,7 +194,7 @@
path_expr
: pelmt+=ns_id ('.' pelmt+=ns_id)* -> ^(PATH $pelmt);
-ns_id : (pr=ID '::')? loc=ID -> ^(NS $pr? $loc);
+ns_id : (pr=ID '::')? loc=ID ('()')? -> ^(NS $pr? $loc);
// In-line XML
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java Fri Aug 22 08:20:51 2008
@@ -63,6 +63,7 @@
String messageId = new GUID().toString();
MyRoleMessageExchange odeMex = _resources.getServer().createMessageExchange(InvocationStyle.UNRELIABLE,
new QName("http://ode.apache.org/simpel/1.0/endpoint", partnerLink), operation, "" + messageId);
+ odeMex.setTimeout(100000000);
// TODO see what kind of exceptions we should throw from here
if (odeMex.getOperation() == null)
throw new RuntimeException("Call to " + partnerLink + "." + operation + " was not routable.");
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java Fri Aug 22 08:20:51 2008
@@ -214,5 +214,9 @@
public Map<String, String> getEndpointProperties(EndpointReference endpointReference) {
throw new UnsupportedOperationException();
}
+
+ public boolean isSharedService(QName qName) {
+ return false;
+ }
}
}
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java Fri Aug 22 08:20:51 2008
@@ -21,6 +21,7 @@
import java.sql.Statement;
import java.sql.SQLException;
import java.util.List;
+import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -125,7 +126,7 @@
}
}
- SimpleScheduler scheduler = new SimpleScheduler(new GUID().toString(),new JdbcDelegate(_ds));
+ SimpleScheduler scheduler = new SimpleScheduler(new GUID().toString(),new JdbcDelegate(_ds), new Properties());
scheduler.setTransactionManager(_txMgr);
_scheduler = scheduler;
return scheduler;
@@ -195,7 +196,7 @@
" nodeid char(64) NULL," +
" scheduled int DEFAULT 0 NOT NULL," +
" transacted int DEFAULT 0 NOT NULL," +
- " details LONG VARBINARY NULL," +
+ " details LONGVARBINARY NULL," +
" PRIMARY KEY(jobid));" +
"CREATE INDEX IDX_ODE_JOB_TS ON ODE_JOB (ts);" +
"CREATE INDEX IDX_ODE_JOB_NODEID ON ODE_JOB (nodeid);";
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/SimPELExprRuntime.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/SimPELExprRuntime.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/SimPELExprRuntime.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/SimPELExprRuntime.java Fri Aug 22 08:20:51 2008
@@ -14,15 +14,16 @@
import org.mozilla.javascript.ContextFactory;
import org.mozilla.javascript.Delegator;
import org.mozilla.javascript.Scriptable;
+import org.mozilla.javascript.xmlimpl.XMLLibImpl;
import org.mozilla.javascript.xml.XMLLib;
+import org.mozilla.javascript.xml.XMLObject;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
+import org.xml.sax.SAXException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.io.IOException;
/**
* @author Matthieu Riou <mr...@apache.org>
@@ -36,49 +37,67 @@
}
public boolean evaluateAsBoolean(OExpression oExpression, EvaluationContext evaluationContext) throws FaultException {
- return false; //To change body of implemented methods use File | Settings | File Templates.
+ return false;
}
public Number evaluateAsNumber(OExpression oExpression, EvaluationContext evaluationContext) throws FaultException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return null;
}
public List evaluate(OExpression oexpr, EvaluationContext evaluationContext) throws FaultException {
Context cx = ContextFactory.getGlobal().enterContext();
- ODEDelegator scope = new ODEDelegator(cx.initStandardObjects(), evaluationContext, (SimPELExpr)oexpr);
+ cx.setOptimizationLevel(-1);
+ ODEDelegator scope = new ODEDelegator(cx.initStandardObjects(), evaluationContext, (SimPELExpr)oexpr, cx);
- Object res = cx.evaluateString(scope, ((SimPELExpr)oexpr).getExpr(), "<expr>", 0, null);
- ArrayList<Node> resList = new ArrayList<Node>(1);
+ // First evaluating the assignment
+ SimPELExpr expr = (SimPELExpr) oexpr;
+ String forged = expr.getLValue() + " = " + expr.getExpr();
+
+ cx.evaluateString(scope, forged, "<expr>", 0, null);
+ // Second extracting the resulting variable value
+ Object res = scope.getEnv().get(expr.getLVariable());
+ ArrayList<Node> resList = new ArrayList<Node>(1);
if (res instanceof String) {
Document doc = DOMUtils.newDocument();
resList.add(doc.createTextNode((String) res));
- }
- if (res instanceof Node) resList.add((Node) res);
+ } else if (res instanceof XMLObject) {
+ try {
+ resList.add(XMLLibImpl.toDomNode(res));
+ } catch (IllegalArgumentException e) {
+ // Rhino makes it pretty hard to use it sXML impl, XML and XMLList are package level
+ // classes so I can't test on them but toDomNode doesn't accept XMLList
+ Document doc = DOMUtils.newDocument();
+ resList.add(doc.createTextNode(res.toString()));
+ }
+ } else if (res instanceof Node) resList.add((Node) res);
return resList;
}
public Calendar evaluateAsDate(OExpression oExpression, EvaluationContext evaluationContext) throws FaultException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return null;
}
public Duration evaluateAsDuration(OExpression oExpression, EvaluationContext evaluationContext) throws FaultException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return null;
}
public Node evaluateNode(OExpression oExpression, EvaluationContext evaluationContext) throws FaultException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
+ return null;
}
- private class ODEDelegator extends Delegator {
+ private class ODEDelegator extends Delegator {
private EvaluationContext _evaluationContext;
private XMLLib _xmlLib;
private SimPELExpr _expr;
+ private Context _cx;
+ private HashMap<String,Object> _env = new HashMap<String,Object>();
- private ODEDelegator(Scriptable obj, EvaluationContext evaluationContext, SimPELExpr expr) {
+ private ODEDelegator(Scriptable obj, EvaluationContext evaluationContext, SimPELExpr expr, Context cx) {
super(obj);
_evaluationContext = evaluationContext;
_expr = expr;
+ _cx = cx;
}
public void setXmlLib(XMLLib _xmlLib) {
@@ -87,20 +106,66 @@
public Object get(String name, Scriptable start) {
try {
- // TODO this assumes message type with a single part for all variables, valid?
OScope.Variable v = _expr.getReferencedVariable(name);
- Node node = _evaluationContext.readVariable(v,
- ((OMessageVarType)v.type).parts.values().iterator().next());
- if (node.getTextContent() != null) return node.getTextContent();
- // TODO wrap xml nodes
- return node;
+ if (v == null) return super.get(name, start);
+
+ if (_env.get(name) != null) return _env.get(name);
+ // TODO this assumes message type with a single part for all variables, valid?
+ Node node;
+ try {
+ node = _evaluationContext.readVariable(v,((OMessageVarType)v.type).parts.values().iterator().next());
+ } catch (FaultException e) {
+ if (e.getQName().getLocalPart().equals("uninitializedVariable")) return super.get(name, start);
+ else throw e;
+ }
+ // Simple types
+ if (node.getNodeValue() != null) return node.getNodeValue();
+
+ // Have to remove the xml header otherwise it confuses Rhino
+ String[] xmlArr = DOMUtils.domToString(node).split("\n");
+ // Going back to the evaluation loop to get a Rhino XML object, their XML API just doesn't have any
+ // public method allowing an XML construction.
+ String[] newXmlArr = new String[xmlArr.length - 1];
+ System.arraycopy(xmlArr, 1, newXmlArr, 0, xmlArr.length - 1);
+ Object xmlObj = _cx.evaluateString(start, join(newXmlArr) , "<expr>", 0, null);
+ _env.put(name, xmlObj);
+ return xmlObj;
} catch (Exception e) {
- throw new RuntimeException("Variable " + name + " has never been initialized.");
+ throw new RuntimeException("Error accessing variable " + name + ".");
}
}
public boolean has(String name, Scriptable start) {
- return get(name, start) != null;
+ OScope.Variable v = _expr.getReferencedVariable(name);
+ if (v == null) return super.has(name, start);
+
+ Node node;
+ try {
+ node = _evaluationContext.readVariable(v,((OMessageVarType)v.type).parts.values().iterator().next());
+ } catch (FaultException e) {
+ return false;
+ }
+ return node != null;
}
+
+ public void put(String name, Scriptable start, Object value) {
+ _env.put(name, value);
+ }
+
+
+ public HashMap<String, Object> getEnv() {
+ return _env;
+ }
+
+ public Scriptable getObj() {
+ return obj;
+ }
+ }
+
+ // Can someone tell me why I have to implement this? The Java API just sucks.
+ public static String join(String[] ss) {
+ StringBuffer buffer = new StringBuffer();
+ for (String s : ss) buffer.append(s);
+ return buffer.toString();
}
}
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java Fri Aug 22 08:20:51 2008
@@ -134,11 +134,14 @@
// TODO lvalue should also be an expression
OAssign.VariableRef vref = new OAssign.VariableRef(_oprocess);
- vref.variable = resolveVariable(oscope, lexpr);
+ String lvar = lexpr.split("\\.")[0];
+ vref.variable = resolveVariable(oscope, lvar);
vref.part = new OMessageVarType.Part(_oprocess, "payload",
new OElementVarType(_oprocess, new QName(_processNS, "simpelWrapper")));
ocopy.to = vref;
+ rexpr.setLValue(lexpr);
+ rexpr.setLVariable(lvar);
rexpr.expressionLanguage = _exprLang;
ocopy.from = new OAssign.Expression(_oprocess, rexpr);
return new SimpleActivity<OAssign>(oassign);
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/SimPELExpr.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/SimPELExpr.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/SimPELExpr.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/SimPELExpr.java Fri Aug 22 08:20:51 2008
@@ -11,6 +11,8 @@
*/
public class SimPELExpr extends OExpression {
private String expr;
+ private String lvalue;
+ private String lvariable;
private HashMap<String,OScope.Variable> _referencedVariables = new HashMap<String,OScope.Variable>();
public SimPELExpr(OProcess oProcess) {
@@ -25,6 +27,22 @@
this.expr = expr;
}
+ public String getLValue() {
+ return lvalue;
+ }
+
+ public void setLValue(String lvalue) {
+ this.lvalue = lvalue;
+ }
+
+ public String getLVariable() {
+ return lvariable;
+ }
+
+ public void setLVariable(String lvariable) {
+ this.lvariable = lvariable;
+ }
+
public void addVariable(OScope.Variable var) {
_referencedVariables.put(var.name, var);
}
@@ -32,4 +50,8 @@
public OScope.Variable getReferencedVariable(String name) {
return _referencedVariables.get(name);
}
+
+ public String toString() {
+ return expr;
+ }
}
Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java?rev=688093&r1=688092&r2=688093&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java Fri Aug 22 08:20:51 2008
@@ -6,6 +6,8 @@
import org.w3c.dom.Document;
import org.w3c.dom.Element;
+import javax.xml.namespace.QName;
+
/**
* @author Matthieu Riou <mr...@apache.org>
*/
@@ -13,23 +15,54 @@
private static final String HELLO_WORLD =
"process HelloWorld {\n" +
- " receive(my_pl, hello_op) { |msg_in|\n" +
- " msg_out = msg_in + \" World\";\n" +
- " reply(msg_out);\n" +
- " }\n" +
+ " receive(myPl, helloOp) { |msgIn|\n" +
+ " msgOut = msgIn + \" World\";\n" +
+ " reply(msgOut);\n" +
+ " }\n" +
"}";
+ private static final String XML_DATA_MANIPULATION =
+ "process XmlData {\n" +
+ " receive(dataPl, dataOp) { |msgIn|\n" +
+ " friendInfo = <friend></friend>;\n" + // TODO check template style E4X
+ " friendInfo.name = msgIn.person.firstName + \" \" + msgIn.person.lastName;\n" +
+ " friendInfo.phone = msgIn.person.phone;\n" +
+ " reply(friendInfo);\n" +
+ " }\n" +
+ "}";
+
public void testHelloWorldComplete() throws Exception {
EmbeddedServer server = new EmbeddedServer();
server.start();
server.deploy(HELLO_WORLD);
Document doc = DOMUtils.newDocument();
- Element wrapper = doc.createElementNS("http://ode.apache.org/simpel/1.0/definition/HelloWorld", "hello_opRequest");
+ Element wrapper = doc.createElementNS("http://ode.apache.org/simpel/1.0/definition/HelloWorld", "helloOpRequest");
wrapper.setTextContent("Hello");
- Element result = server.sendMessage("my_pl", "hello_op", wrapper);
+ Element result = server.sendMessage("myPl", "helloOp", wrapper);
assertTrue(DOMUtils.domToString(result).indexOf("Hello World") > 0);
}
+ public void testXmlData() throws Exception {
+ EmbeddedServer server = new EmbeddedServer();
+ server.start();
+ server.deploy(XML_DATA_MANIPULATION);
+ Element wrapper = DOMUtils.stringToDOM(
+ "<xd:dataOpRequest xmlns:xd=\"http://ode.apache.org/simpel/1.0/definition/XmlData\">\n" +
+ " <person>\n" +
+ " <firstName>John</firstName>\n" +
+ " <lastName>Doe</lastName>\n" +
+ " <phone>(999)999-9999</phone>\n" +
+ " </person>\n" +
+ "</xd:dataOpRequest>");
+
+ Element result = server.sendMessage("dataPl", "dataOp", wrapper);
+ assertNotNull(result);
+ System.out.println(DOMUtils.domToString(result));
+ assertNotNull(DOMUtils.findChildByName(result, new QName(null, "phone")));
+ assertNotNull(DOMUtils.findChildByName(result, new QName(null, "name")));
+ assertEquals("(999)999-9999", DOMUtils.findChildByName(result, new QName(null, "phone")).getTextContent());
+ assertEquals("John Doe", DOMUtils.findChildByName(result, new QName(null, "name")).getTextContent());
+ }
}