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());
+    }
 }