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 2009/01/21 23:59:46 UTC

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

Author: mriou
Date: Wed Jan 21 14:59:45 2009
New Revision: 736468

URL: http://svn.apache.org/viewvc?rev=736468&view=rev
Log:
HTTP headers directly accessible on message variables.

Added:
    ode/sandbox/simpel/src/test/java/org/apache/ode/rest/PostWith201Resource.java
Modified:
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/MessageExchangeContextImpl.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/expr/E4XExprRuntime.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java

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=736468&r1=736467&r2=736468&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 Wed Jan 21 14:59:45 2009
@@ -235,7 +235,7 @@
 
 reply
 @init { paraphrases.push("in a reply"); }
-@after { paraphrases.pop(); }
+@after { paraphrases.pop(); } // todo allow expressions in replied element
         : 'reply' '(' ID (',' ID (',' ID)?)? ')' -> ^(REPLY ID (ID ID?)?);
 
 assign

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=736468&r1=736467&r2=736468&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 Wed Jan 21 14:59:45 2009
@@ -115,21 +115,24 @@
             return;
         }
 
-        // TODO check status
+        // TODO check more status
         String response = resp.getEntity(String.class);
-        Element responseXML;
-        try {
-            responseXML = DOMUtils.stringToDOM(response);
-        } catch (Exception e) {
-            Document doc = DOMUtils.newDocument();
-            Element failureElmt = doc.createElement("requestFailure");
-            failureElmt.setTextContent(response);
-            __log.debug("Request to " + res.getUrl() + " failed, response couldn't be parsed: " + response);
-            restOutMessageExchange.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR,
-                    "Can't parse the response to " + res.getUrl(), failureElmt);
-            return;
+        Element responseXML = null;
+        if (response != null && response.length() > 0) {
+            try {
+                responseXML = DOMUtils.stringToDOM(response);
+            } catch (Exception e) {
+                Document doc = DOMUtils.newDocument();
+                Element failureElmt = doc.createElement("requestFailure");
+                failureElmt.setTextContent(response);
+                __log.debug("Request to " + res.getUrl() + " failed, response couldn't be parsed: " + response);
+                restOutMessageExchange.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR,
+                        "Can't parse the response to " + res.getUrl(), failureElmt);
+                return;
+            }
         }
 
+        // Prepare the message
         Document odeMsg = DOMUtils.newDocument();
         Element odeMsgEl = odeMsg.createElementNS(null, "message");
         odeMsg.appendChild(odeMsgEl);
@@ -137,7 +140,18 @@
         odeMsgEl.appendChild(partElmt);
         Element methodElmt = odeMsg.createElement(res.getMethod() + "Response");
         partElmt.appendChild(methodElmt);
-        methodElmt.appendChild(odeMsg.adoptNode(responseXML));
+        if (responseXML != null)
+            methodElmt.appendChild(odeMsg.adoptNode(responseXML));
+
+        // Copy headers
+        if (resp.getStatus() == 201) {
+            Element loc = odeMsg.createElement("Location");
+            loc.setTextContent(resp.getMetadata().getFirst("Location"));
+            withHeaders(methodElmt).appendChild(loc);
+        }
+        Element status = odeMsg.createElement("Status");
+        status.setTextContent(""+resp.getStatus());
+        withHeaders(methodElmt).appendChild(status);
 
         Message responseMsg = restOutMessageExchange.createMessage(null);
         responseMsg.setMessage(odeMsgEl);
@@ -172,4 +186,14 @@
         }
         return payload;
     }
+
+    private Element withHeaders(Element element) {
+        Element res = DOMUtils.findChildByName(element, new QName(null, "headers"));
+        if (res == null) {
+            Element headers = element.getOwnerDocument().createElement("headers");
+            element.appendChild(headers);
+            res = headers;
+        }
+        return res;
+    }
 }

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java?rev=736468&r1=736467&r2=736468&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java Wed Jan 21 14:59:45 2009
@@ -80,11 +80,14 @@
             if (mex.getResponse() == null) {
                 return Response.status(204).build();
             } else {
-                return Response.status(200)
-                        .entity(DOMUtils.domToString(DOMUtils.getFirstChildElement(DOMUtils
+                Response.ResponseBuilder b;
+                if (mex.isInstantiatingResource())
+                    b = Response.status(201).header("Location", _root + mex.getResource().getUrl());
+                else
+                    b = Response.status(200);
+                return b.entity(DOMUtils.domToString(DOMUtils.getFirstChildElement(DOMUtils
                                 .getFirstChildElement(mex.getResponse().getMessage()))))
                         .type("application/xml")
-                        .header("Location", _root + mex.getResource().getUrl())
                         .build();
             }
         }

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=736468&r1=736467&r2=736468&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 Wed Jan 21 14:59:45 2009
@@ -186,6 +186,16 @@
                     else node = DOMUtils.getFirstChildElement((Element)node);
                 }
 
+                // When we're querying on headers, the sub-element is supposed to be right under the
+                // current. To avoid pollution of the main user variable we store it one level up so
+                // we're readjusting here.
+                if (_expr.getExpr().indexOf(".headers") > 0 && node.getParentNode() != null &&
+                        node.getParentNode().getNodeType() == Node.ELEMENT_NODE) {
+                    Element parent = (Element) node.getParentNode();
+                    Element headers = DOMUtils.findChildByName(parent, new QName(null, "headers"));
+                    node.appendChild(node.getOwnerDocument().importNode(headers, true));
+                }
+
                 // 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

Added: ode/sandbox/simpel/src/test/java/org/apache/ode/rest/PostWith201Resource.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/rest/PostWith201Resource.java?rev=736468&view=auto
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/rest/PostWith201Resource.java (added)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/rest/PostWith201Resource.java Wed Jan 21 14:59:45 2009
@@ -0,0 +1,18 @@
+package org.apache.ode.rest;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.POST;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+
+@Path("/post201")
+public class PostWith201Resource {
+
+    @POST
+    @Consumes("application/xml")
+    @Produces("application/xml")
+    public Response post() {
+        return Response.status(201).header("Location", "http://foo/bar").build();
+    }
+}

Modified: ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java?rev=736468&r1=736467&r2=736468&view=diff
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java (original)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java Wed Jan 21 14:59:45 2009
@@ -53,7 +53,7 @@
         System.out.println("=> " + response);
         assertTrue(response.indexOf("Hello foo") > 0);
         assertTrue(resp.getMetadata().get("Location").get(0), resp.getMetadata().get("Location").get(0).matches(".*/hello/[0-9]*"));
-        System.out.println("loc " + resp.getMetadata().get("Location"));
+        assertTrue(resp.getStatus() == 201);
     }
 
     private static final String COUNTER =
@@ -99,7 +99,7 @@
                 .post(ClientResponse.class, "<simpelWrapper xmlns=\"http://ode.apache.org/simpel/1.0/definition/Counter\">3</simpelWrapper>");
         String response = createResponse.getEntity(String.class);
         String location = createResponse.getMetadata().get("Location").get(0);
-        // TODO status = 201
+        assertTrue(createResponse.getStatus() == 201);
         assertTrue(location.matches(".*/counter/[0-9]*$"));
         assertTrue(response.indexOf("3") > 0);
 
@@ -214,4 +214,38 @@
         System.out.println("=> " + response);
         assertTrue(response.indexOf("GETPOSTfooPUTbar") > 0);
     }
+
+    public static final String POST_WITH_201 =
+            "var testRoot = \"http://localhost:3434/post201\"; " +
+            "process PostRedirect {\n" +
+            "   receive(self) { |query|\n" +
+            "       postMsg = <foo>foo</foo>;\n" +
+            "       postRes = request(testRoot, \"post\", postMsg);\n" +
+            "       if(postRes.headers.Status == \"201\") { \n" +
+            "           msg = postRes.headers.Location;\n" +
+            "           reply(msg);\n" +
+            "       } else {\n" +
+            "           msg = <fail>fail</fail>;\n" +
+            "           reply(msg);\n" +
+            "       }\n" +
+            "   }\n" +
+            "}";
+
+    public void testPostWith201() throws Exception {
+        server.start();
+        Descriptor desc = new Descriptor();
+        desc.setAddress("/post201proc");
+        server.deploy(POST_WITH_201, desc);
+
+        ClientConfig cc = new DefaultClientConfig();
+        Client c = Client.create(cc);
+
+        WebResource wr = c.resource("http://localhost:3434/post201proc");
+        ClientResponse resp = wr.path("/").accept("application/xml").type("application/xml")
+                .post(ClientResponse.class, "<simpelWrapper xmlns=\"http://ode.apache.org/simpel/1.0/definition/PostRedirect\">foo</simpelWrapper>");
+        String response = resp.getEntity(String.class);
+        System.out.println("=> " + response);
+        assertTrue(response.indexOf("http://foo/bar") > 0);
+    }
+
 }