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