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