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/12/03 20:42:07 UTC
svn commit: r723033 - in /ode/sandbox/simpel/src:
main/java/org/apache/ode/embed/messaging/ main/java/org/apache/ode/rest/
main/java/org/apache/ode/simpel/omodel/ test/java/org/apache/ode/simpel/
Author: mriou
Date: Wed Dec 3 11:42:07 2008
New Revision: 723033
URL: http://svn.apache.org/viewvc?rev=723033&view=rev
Log:
First full RESTful process test and sample. A few things work, which is nice. And twice as much still don't work. Yet.
Modified:
ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.java
ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java
ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java
ode/sandbox/simpel/src/main/java/org/apache/ode/simpel/omodel/OBuilder.java
ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.java?rev=723033&r1=723032&r2=723033&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.java Wed Dec 3 11:42:07 2008
@@ -49,7 +49,7 @@
}
public void deactivateProvidedResource(Resource resource) {
-
+ EngineWebResource.unregisterResource(resource);
}
public PartnerRoleChannel createPartnerRoleChannel(QName qName, PortType portType, Endpoint endpoint) {
Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java?rev=723033&r1=723032&r2=723033&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java Wed Dec 3 11:42:07 2008
@@ -6,8 +6,9 @@
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
-import javax.ws.rs.PathParam;
+import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.UriInfo;
+import javax.ws.rs.core.Response;
import org.mortbay.jetty.servlet.ServletHolder;
import org.mortbay.jetty.servlet.Context;
@@ -18,7 +19,6 @@
import org.apache.ode.bpel.iapi.Resource;
import org.apache.ode.embed.ServerLifecycle;
-import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentHashMap;
@Path("/")
@@ -67,7 +67,9 @@
public ProcessWebResource buildProcessResource(@javax.ws.rs.core.Context UriInfo subpath) {
// TODO This should be able to match based on a pattern
ResourceDesc rdesc = _engineResources.get(stripSlashes(subpath.getPath()));
- if (rdesc == null) throw new NotFoundException("Resource " + subpath.getPath() + " is unknown.");
+ if (rdesc == null) throw new NotFoundException("No known resource at this location.");
+ else if (rdesc.removed) throw new WebApplicationException(Response.status(410)
+ .entity("The resource isn't available anymore.").type("text/plain").build());
else {
String base = subpath.getBaseUri().toString();
return new ProcessWebResource(rdesc, _serverLifecyle, base.substring(0, base.length()-1));
@@ -91,6 +93,12 @@
desc.enable(resource.getMethod());
}
+ public static void unregisterResource(Resource resource) {
+ ResourceDesc rdesc = _engineResources.get(stripSlashes(resource.getUrl()));
+ rdesc.removed = true;
+ // TODO eventually cleanup removed resources after a while
+ }
+
public static void startRestfulServer(ServerLifecycle serverLifecyle) {
_serverLifecyle = serverLifecyle;
_engineResources = new ConcurrentHashMap<String,ResourceDesc>();
@@ -128,6 +136,7 @@
boolean post;
boolean put;
boolean delete;
+ boolean removed;
public Resource toResource(String method) {
return new Resource("/"+resourcePath, contentType, method);
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=723033&r1=723032&r2=723033&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 Dec 3 11:42:07 2008
@@ -52,32 +52,29 @@
else return Response.status(405).header("Allow", _resource.methods()).build();
}
- @GET @Produces("application/xml") @Path("{subpath}")
- public Response getSub() {
- return get();
- }
-
@POST @Consumes("application/xml")
public Response post(String content) {
if (_resource.post) {
RESTMessageExchange mex = _serverLifecyle.getServer().createMessageExchange(
_resource.toResource("POST"), new GUID().toString());
Message request = mex.createMessage(null);
- try {
- // TODO support for http headers and parameters as additional parts
- Element msgElmt = DOMUtils.stringToDOM(content);
- Document doc = DOMUtils.newDocument();
- Element docElmt = doc.createElement("document");
- Element partElmt = doc.createElement("payload");
- doc.appendChild(docElmt);
- docElmt.appendChild(partElmt);
- partElmt.appendChild(doc.importNode(msgElmt, true));
-
- request.setMessage(docElmt);
- } catch (Exception e) {
- return Response.status(400).entity("Couldn't parse XML request.").type("text/plain").build();
+ if (content.length() > 0) {
+ try {
+ // TODO support for http headers and parameters as additional parts
+ Element msgElmt = DOMUtils.stringToDOM(content);
+ Document doc = DOMUtils.newDocument();
+ Element docElmt = doc.createElement("document");
+ Element partElmt = doc.createElement("payload");
+ doc.appendChild(docElmt);
+ docElmt.appendChild(partElmt);
+ partElmt.appendChild(doc.importNode(msgElmt, true));
+
+ request.setMessage(docElmt);
+ } catch (Exception e) {
+ return Response.status(400).entity("Couldn't parse XML request.").type("text/plain").build();
+ }
+ mex.setRequest(request);
}
- mex.setRequest(request);
try {
mex.invokeBlocking();
} catch (java.util.concurrent.TimeoutException te) {
@@ -98,11 +95,38 @@
else return Response.status(405).header("Allow", _resource.methods()).build();
}
+ // This sucks big time
+
+ @GET @Produces("application/xml") @Path("{subpath}")
+ public Response getSub() {
+ return get();
+ }
+
+ @GET @Produces("application/xml") @Path("{subpath}/{sub1}")
+ public Response getSubSub() {
+ return get();
+ }
+
+ @GET @Produces("application/xml") @Path("{subpath}/{sub1}/{sub2}")
+ public Response getSubSubSub() {
+ return get();
+ }
+
@POST @Consumes("application/xml") @Path("{subpath}")
public Response postSub(String content) {
return post(content);
}
+ @POST @Consumes("application/xml") @Path("{subpath}/{sub1}")
+ public Response postSubSub(String content) {
+ return post(content);
+ }
+
+ @POST @Consumes("application/xml") @Path("{subpath}/{sub1}/{sub2}")
+ public Response postSubSubSub(String content) {
+ return post(content);
+ }
+
// @GET @Produces("application/xhtml+xml")
// public String getXHTML() {
// StringBuffer res = new StringBuffer();
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=723033&r1=723032&r2=723033&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 Wed Dec 3 11:42:07 2008
@@ -20,12 +20,11 @@
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>);
- * TODO support generic variable declarations that aren't mapped to a property (unique)
+ * TODO resources aren't available if they're not used
*/
public class OBuilder extends BaseCompiler {
private static final Logger __log = Logger.getLogger(OBuilder.class);
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=723033&r1=723032&r2=723033&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 Dec 3 11:42:07 2008
@@ -11,6 +11,7 @@
import javax.ws.rs.core.Response;
import java.util.regex.Pattern;
+import java.util.regex.Matcher;
public class RestfulSimPELTest extends TestCase {
@@ -52,7 +53,7 @@
" dec = resource(\"/dec\"); \n" +
" scope { \n" +
" while(counter>0) { \n" +
- " wait(\"PT1S\"); \n" +
+ " wait(\"PT1S\"); \n" + // TODO support time as well as duration
" } \n" +
" } onQuery(self) {\n" +
" links = <counter></counter>; \n" +
@@ -65,6 +66,9 @@
" } onReceive(dec) {\n" +
" counter = counter - 1; \n" +
" reply(counter); \n" +
+ " } onReceive(inc) {\n" +
+ " counter = counter - (-1); \n" + // TODO fix the - - hack
+ " reply(counter); \n" +
" } \n" +
"}";
@@ -78,18 +82,78 @@
ClientConfig cc = new DefaultClientConfig();
Client c = Client.create(cc);
- WebResource wr = c.resource("http://localhost:3434/counter");
+ // Starting the counter process
+ WebResource wr = c.resource("http://localhost:3434/counter"); // TODO default on process name
ClientResponse createResponse = wr.path("/").accept("application/xml").type("application/xml")
- .post(ClientResponse.class, "<simpelWrapper xmlns=\"http://ode.apache.org/simpel/1.0/definition/Counter\">5</simpelWrapper>");
+ .post(ClientResponse.class, "<simpelWrapper xmlns=\"http://ode.apache.org/simpel/1.0/definition/Counter\">3</simpelWrapper>");
String response = createResponse.getEntity(String.class);
- System.out.println("=> " + response);
- System.out.println("=> " + createResponse.getMetadata().get("Location").get(0));
-
String location = createResponse.getMetadata().get("Location").get(0);
+ // TODO status = 201
+ assertTrue(location.matches(".*/counter/[0-9]*$"));
+ assertTrue(response.indexOf("3") > 0);
+
+ // Requesting links
WebResource instance = c.resource(location);
ClientResponse queryResponse = instance.path("/").type("application/xml").get(ClientResponse.class);
- System.out.println("=> " + queryResponse.getStatus());
- System.out.println("=> " + queryResponse.getEntity(String.class));
+ response = queryResponse.getEntity(String.class);
+
+ Matcher m = Pattern.compile("/counter/[0-9]*/value").matcher(response);
+ assertTrue(m.find());
+ m = Pattern.compile("/counter/[0-9]*/dec").matcher(response);
+ assertTrue(m.find());
+ assertTrue(queryResponse.getStatus() == 200);
+
+ // Requesting counter value to check the initial is correct
+ ClientResponse valueResponse = instance.path("/value").type("application/xml").get(ClientResponse.class);
+ response = valueResponse.getEntity(String.class);
+ assertTrue(valueResponse.getStatus() == 200);
+ assertTrue(response.indexOf("3") > 0);
+
+ // Incrementing twice
+ ClientResponse incResponse;
+ for (int n = 0; n < 2; n++) {
+ incResponse = instance.path("/inc").type("application/xml").post(ClientResponse.class);
+ response = incResponse.getEntity(String.class);
+ assertTrue(incResponse.getStatus() == 200);
+ System.out.println("=> " + response);
+ assertTrue(response.indexOf(""+(4+n)) > 0);
+ }
+
+ // Checking value again, should be 5 now
+ valueResponse = instance.path("/value").type("application/xml").get(ClientResponse.class);
+ response = valueResponse.getEntity(String.class);
+ assertTrue(valueResponse.getStatus() == 200);
+ assertTrue(response.indexOf("5") > 0);
+
+ // Decrementing counter to 0 to let process complete
+ ClientResponse decResponse;
+ for (int n = 0; n < 5; n++) {
+ decResponse = instance.path("/dec").type("application/xml").post(ClientResponse.class);
+ response = decResponse.getEntity(String.class);
+ assertTrue(valueResponse.getStatus() == 200);
+ assertTrue(response.indexOf(""+(4-n)) > 0);
+ }
+
+ // The process shouldn't be here anymore
+ Thread.sleep(1500);
+ queryResponse = instance.path("/").type("application/xml").get(ClientResponse.class);
+ assertTrue(queryResponse.getStatus() == 410);
+// response = queryResponse.getEntity(String.class);
+// System.out.println("=> " + response);
+// System.out.println("=> " + queryResponse.getStatus());
+
+
+ // Decrementing counter
+// ClientResponse decResponse = instance.path("/dec").type("application/xml").post(ClientResponse.class);
+// response = decResponse.getEntity(String.class);
+// assertTrue(valueResponse.getStatus() == 200);
+// assertTrue(response.indexOf("4") > 0);
+//
+// // Incrementing counter
+// ClientResponse incResponse = instance.path("/inc").type("application/xml").post(ClientResponse.class);
+// response = incResponse.getEntity(String.class);
+// assertTrue(valueResponse.getStatus() == 200);
+// assertTrue(response.indexOf("5") > 0);
server.stop();
}