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/09/20 01:53:50 UTC

svn commit: r697290 - in /ode/sandbox/simpel/src: main/antlr/org/apache/ode/simpel/antlr/ main/java/org/apache/ode/embed/ main/java/org/apache/ode/embed/messaging/ main/java/org/apache/ode/simpel/expr/ main/java/org/apache/ode/simpel/omodel/ test/java/...

Author: mriou
Date: Fri Sep 19 16:53:50 2008
New Revision: 697290

URL: http://svn.apache.org/viewvc?rev=697290&view=rev
Log:
Two-ways invokes. E4X expression runtime wrapping and unwrapping fix.

Modified:
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/MessageSender.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/SimPELRuntimeTest.java
    ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel

Modified: ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g?rev=697290&r1=697289&r2=697290&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g (original)
+++ ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g Fri Sep 19 16:53:50 2008
@@ -109,7 +109,8 @@
 	:	^(SEQUENCE ID+
 		{ OBuilder.StructuredActivity seq = builder.build(OSequence.class, $BPELScope::oscope, $Parent[-1]::activity); 
 		  $Parent::activity = seq;
-		  builder.setBlockParam($BPELScope::oscope, (OActivity) $Parent[-1]::activity.getOActivity(), $ID.text); 
+		  //builder.setBlockParam($BPELScope::oscope, (OActivity) $Parent[-1]::activity.getOActivity(), $ID.text);
+		  builder.setBlockParam($BPELScope::oscope, (OSequence)seq.getOActivity(), $ID.text); 
 		}
 		proc_stmt+);
 body	:	block | proc_stmt;

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/MessageSender.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/MessageSender.java?rev=697290&r1=697289&r2=697290&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/MessageSender.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/MessageSender.java Fri Sep 19 16:53:50 2008
@@ -1,8 +1,8 @@
 package org.apache.ode.embed;
 
-import org.w3c.dom.Element;
+import org.w3c.dom.Node;
 
 public interface MessageSender {
 
-    Element send(String recipient, String operation, Element elmt);
+    Node send(String recipient, String operation, Node message);
 }

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java?rev=697290&r1=697289&r2=697290&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java Fri Sep 19 16:53:50 2008
@@ -6,9 +6,11 @@
 import org.apache.log4j.Logger;
 import org.w3c.dom.Element;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 import javax.wsdl.Operation;
 import javax.wsdl.Fault;
+import javax.wsdl.Part;
 import javax.xml.namespace.QName;
 import java.util.Set;
 import java.util.HashSet;
@@ -33,10 +35,19 @@
 
         Operation invokedOp = partnerMex.getPortType().getOperation(partnerMex.getOperationName(), null, null);
         try {
-            // We're placing ourselves in the doc/lit case for now, assuming a single part
+            // We're placing ourselves in the doc/lit case for now, assuming a single part with a single root element
             Element message = partnerMex.getRequest().getMessage();
-            Element response = _sender.send(partnerMex.getPortType().getQName().getLocalPart(), invokedOp.getName(), 
-                    DOMUtils.getFirstChildElement(DOMUtils.getFirstChildElement(message)));
+            Element root = DOMUtils.getFirstChildElement(DOMUtils.getFirstChildElement(message));
+            // TODO this assumption only works with SimPEL, in the general case we could have a NodeList
+            // and should therefore send the whole part element
+            Node payload;
+            if (DOMUtils.getFirstChildElement(root) != null)
+                payload = DOMUtils.getFirstChildElement(root);
+            else {
+                Document doc = DOMUtils.newDocument();
+                payload = doc.createTextNode(DOMUtils.getTextContent(root));
+            }
+            Node response = _sender.send(partnerMex.getPortType().getQName().getLocalPart(), invokedOp.getName(), payload);
 
             if (invokedOp.getOutput() != null) {
                 Document responseDoc = DOMUtils.newDocument();
@@ -46,10 +57,15 @@
                 String partName = (String) invokedOp.getOutput().getMessage().getParts().keySet().iterator().next();
                 Element partElmt = responseDoc.createElement(partName);
                 messageElmt.appendChild(partElmt);
-                if (response != null) partElmt.appendChild(responseDoc.importNode(response, true));
+                // TODO same thing, simpel only wrapping
+                QName elmtName = ((Part)invokedOp.getOutput().getMessage().getParts().values().iterator().next()).getElementName();
+                Element partRootElmt = responseDoc.createElementNS(elmtName.getNamespaceURI(), elmtName.getLocalPart());
+                partElmt.appendChild(partRootElmt);
+                if (response != null) partRootElmt.appendChild(responseDoc.importNode(response, true));
 
                 Message responseMsg = partnerMex.createMessage(invokedOp.getOutput().getMessage().getQName());
                 responseMsg.setMessage(messageElmt);
+                partnerMex.reply(responseMsg);
             } else {
                 partnerMex.replyOneWayOk();
             }

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java?rev=697290&r1=697289&r2=697290&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java Fri Sep 19 16:53:50 2008
@@ -16,6 +16,7 @@
 import org.mozilla.javascript.xml.XMLObject;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
+import org.w3c.dom.Element;
 
 import javax.xml.namespace.QName;
 import java.util.*;
@@ -67,7 +68,11 @@
             resList.add(doc.createTextNode(res.toString()));
         } else if (res instanceof XMLObject) {
             try {
-                resList.add(XMLLibImpl.toDomNode(res));
+                // Only content is copied, need to wrap
+                Document doc = DOMUtils.newDocument();
+                Element wrapper = doc.createElement("assignWrapper");
+                wrapper.appendChild(doc.importNode(XMLLibImpl.toDomNode(res), true));
+                resList.add(wrapper);
             } 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
@@ -124,7 +129,12 @@
                 }
                 // Simple types
                 if (node.getNodeValue() != null) return node.getNodeValue();
-                
+                else if (node.getNodeType() == Node.ELEMENT_NODE) {
+                    Element nodeElmt = (Element) node;
+                    if (DOMUtils.getFirstChildElement(nodeElmt) == null) return nodeElmt.getTextContent();
+                    else node = DOMUtils.getFirstChildElement((Element)node);
+                }
+
                 // 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
@@ -135,7 +145,7 @@
                 _env.put(name, xmlObj);
                 return xmlObj;
             } catch (Exception e) {
-                throw new RuntimeException("Error accessing variable " + name + ".");
+                throw new RuntimeException("Error accessing variable " + name + ".", e);
             }
         }
 

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=697290&r1=697289&r2=697290&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 Sep 19 16:53:50 2008
@@ -13,16 +13,17 @@
 import org.apache.ode.utils.GUID;
 
 import javax.wsdl.PortType;
+import javax.wsdl.Part;
 import javax.xml.namespace.QName;
 import java.lang.reflect.Method;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.HashSet;
+import java.util.*;
 
 /**
  * TODO foo = receive(...) expressions
  * TODO e4x templates
+ * TODO allow javascript blocks instead of just hooking on equal, otherwise you can't do stuff like
+ *          operations.appendChild(<operand>2</operand>);
+ *          operations.appendChild(<operand>3</operand>);
  */
 public class OBuilder extends BaseCompiler {
     private static final Logger __log = Logger.getLogger(OBuilder.class);
@@ -153,7 +154,6 @@
 
     public SimpleActivity buildInvoke(OInvoke invoke, OScope oscope, String partnerLink,
                                       String operation, String incomingMsg) {
-
         invoke.partnerLink = buildPartnerLink(oscope, partnerLink, operation, false, incomingMsg != null);
         invoke.operation = invoke.partnerLink.partnerRolePortType.getOperation(operation, null, null);
         if (incomingMsg != null) invoke.inputVar = resolveVariable(oscope, incomingMsg, operation, true);
@@ -176,7 +176,6 @@
         OAssign.VariableRef vref = new OAssign.VariableRef(_oprocess);
         String lvar = lexpr.split("\\.")[0];
         vref.variable = resolveVariable(oscope, lvar);
-        ((OMessageVarType)vref.variable.type).parts.values().iterator();
         // Don't worry, it's all type safe, therefore it's correct
         vref.part = ((OMessageVarType)vref.variable.type).parts.values().iterator().next();
         ocopy.to = vref;
@@ -205,7 +204,7 @@
         return new SimpleActivity<OReply>(oreply);
     }
 
-    public void setBlockParam(OScope oscope, OActivity blockActivity, String varName) {
+    public void setBlockParam(OScope oscope, OSequence blockActivity, String varName) {
         // The AST for block activities is something like:
         //    (SEQUENCE (activity) (SEQUENCE varIds otherActivities))
         // The parent here is the first sequence so we just set the varIds on its first child activity
@@ -213,13 +212,16 @@
             __log.warn("Can't set block parameter with block parent activity " + blockActivity);
             return;
         }
-        OActivity oact = ((OSequence)blockActivity).sequence.get(0);
+//        OActivity oact = ((OSequence)blockActivity).sequence.get(0);
+        List<OActivity> parentList = ((OSequence)blockActivity.getParent()).sequence;
+        OActivity oact = parentList.get(parentList.indexOf(blockActivity) - 1);
         if (oact instanceof OPickReceive) {
             OPickReceive.OnMessage rec = ((OPickReceive)oact).onMessages.get(0);
             rec.variable = resolveVariable(oscope, varName, rec.operation.getName(), true);
         } else if (oact instanceof OInvoke) {
             OInvoke inv = (OInvoke)oact;
             inv.outputVar = resolveVariable(oscope, varName, inv.operation.getName(), false);
+            buildPartnerLink(oscope, inv.partnerLink.name, inv.operation.getName(), false, false);
         } else __log.warn("Can't set block parameter on activity " + oact);
     }
 
@@ -301,10 +303,18 @@
         // use a better naming for the part element.
         if (operation != null && !typedVariables.contains(name)) {
             String elmtName = operation + (request ? "Request" : "Response");
-            LinkedList<OMessageVarType.Part> parts = new LinkedList<OMessageVarType.Part>();
-            parts.add(new OMessageVarType.Part(_oprocess, elmtName,
-                    new OElementVarType(_oprocess, new QName(_processNS, elmtName))));
-            resolved.type = new OMessageVarType(_oprocess, new QName(_processNS, operation), parts);
+            OMessageVarType varType = (OMessageVarType)resolved.type;
+            varType.messageType = new QName(_processNS, operation);
+            OMessageVarType.Part part = varType.parts.values().iterator().next();
+            part.name = elmtName;
+            part.type = new OElementVarType(_oprocess, new QName(_processNS, elmtName));
+            varType.parts.clear();
+            varType.parts.put(part.name, part);
+//
+//            LinkedList<OMessageVarType.Part> parts = new LinkedList<OMessageVarType.Part>();
+//            parts.add(new OMessageVarType.Part(_oprocess, elmtName,
+//                    new OElementVarType(_oprocess, new QName(_processNS, elmtName))));
+//            resolved.type = new OMessageVarType(_oprocess, new QName(_processNS, operation), parts);
             typedVariables.add(name);
         }
         return resolved;

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=697290&r1=697289&r2=697290&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 Sep 19 16:53:50 2008
@@ -6,6 +6,8 @@
 import org.apache.ode.utils.DOMUtils;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 import javax.xml.namespace.QName;
 
@@ -39,8 +41,8 @@
             "process XmlData {\n" +
             "    receive(dataPl, dataOp) { |msgIn|\n" +
             "        friendInfo = <friend></friend>;\n" +
-            "        friendInfo.name = msgIn.person.firstName + \" \" + msgIn.person.lastName;\n" +
-            "        friendInfo.phone = msgIn.person.phone;\n" +
+            "        friendInfo.name = msgIn.firstName + \" \" + msgIn.lastName;\n" +
+            "        friendInfo.phone = msgIn.phone;\n" +
             "        reply(friendInfo);\n" +
             "    }\n" +
             "}";
@@ -61,6 +63,8 @@
         Element result = server.sendMessage("dataPl", "dataOp", wrapper);
         assertNotNull(result);
         System.out.println(DOMUtils.domToString(result));
+        // Eliminating the wrapper
+        result = DOMUtils.getFirstChildElement(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());
@@ -111,8 +115,10 @@
 
         EmbeddedServer server = new  EmbeddedServer();
         server.options.setMessageSender(new MessageSender() {
-            public Element send(String recipient, String operation, Element elmt) {
-                received[0] = true;
+            public Node send(String recipient, String operation, Node message) {
+                if (recipient.equals("partnerPl") && operation.equals("partnerOp")
+                        && message.getNodeType() == Node.TEXT_NODE && message.getTextContent().equals("ok?"))
+                    received[0] = true;
                 return null;
             }
         });
@@ -127,4 +133,43 @@
         assertEquals("ok", result.getTextContent());
         assertTrue(received[0]);
     }
+
+    public static final String INVOKE_TWO_WAYS =
+            "process InvokeTwoWays {\n" +
+            "    receive(itwPl, itwOp) { |initial|\n" +
+            "        operands = <operands></operands>; \n"+
+            "        operands.op1 = initial; \n"+
+            "        operands.op2 = 3; \n"+
+            "        invoke(calculator, add, operands) { |result| \n" +
+            "           response = result; \n" +
+            "        }" +
+            "        reply(result);\n" +
+            "    }\n" +
+            "}";
+
+    public void testInvokeTwoWays() throws Exception {
+        EmbeddedServer server = new  EmbeddedServer();
+        server.options.setMessageSender(new MessageSender() {
+            public Node send(String recipient, String operation, Node elmt) {
+                if (recipient.equals("calculator") && operation.equals("add")) {
+                    Document doc = DOMUtils.newDocument();
+                    int result = 0;
+                    NodeList nl = elmt.getChildNodes();
+                    for (int m = 0; m < nl.getLength(); m++)
+                        if (nl.item(m).getNodeType() == Node.ELEMENT_NODE)
+                            result += Integer.parseInt(nl.item(m).getTextContent());
+                    return doc.createTextNode(""+result);
+                } else return null;
+            }
+        });
+        server.start();
+        server.deploy(INVOKE_TWO_WAYS);
+
+        Element wrapper = DOMUtils.stringToDOM(
+                "<xd:itwOpRequest xmlns:xd=\"http://ode.apache.org/simpel/1.0/definition/InvokeTwoWays\">7</xd:itwOpRequest>");
+        Element result = server.sendMessage("itwPl", "itwOp", wrapper);
+        assertNotNull(result);
+        System.out.println(DOMUtils.domToString(result));
+        assertEquals("10", result.getTextContent());
+    }
 }

Modified: ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel?rev=697290&r1=697289&r2=697290&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel (original)
+++ ode/sandbox/simpel/src/test/resources/compile-tests-ok.simpel Fri Sep 19 16:53:50 2008
@@ -197,17 +197,6 @@
 }
 
 #=============================================================
-# Compact process
-#
-
-process CompactProcess
-  while(count < 10)
-    receive(p, o) { |m|
-      count = count + 1;
-      if (count == 10) invoke(count_partner, count_done);
-    }
-
-#=============================================================
 # External Counter
 #