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/10/24 02:52:47 UTC

svn commit: r707517 - in /ode/sandbox/simpel: ./ src/main/antlr/org/apache/ode/simpel/antlr/ src/main/java/org/apache/ode/ src/main/java/org/apache/ode/embed/ src/main/java/org/apache/ode/embed/messaging/ src/main/java/org/apache/ode/rest/ src/main/jav...

Author: mriou
Date: Thu Oct 23 17:52:46 2008
New Revision: 707517

URL: http://svn.apache.org/viewvc?rev=707517&view=rev
Log:
Compilation of resources. The beginning of a RESTful IL based on Jersey (JSR 311).

Added:
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerLifecycle.java
      - copied, changed from r704611, ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/rest/
    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/test/java/org/apache/ode/rest/
    ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulProcessTest.java
    ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java
Removed:
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java
Modified:
    ode/sandbox/simpel/Rakefile
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPEL.g
    ode/sandbox/simpel/src/main/antlr/org/apache/ode/simpel/antlr/SimPELWalker.g
    ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/Options.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java
    ode/sandbox/simpel/src/main/java/org/apache/ode/embed/messaging/BindingContextImpl.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

Modified: ode/sandbox/simpel/Rakefile
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/Rakefile?rev=707517&r1=707516&r2=707517&view=diff
==============================================================================
--- ode/sandbox/simpel/Rakefile (original)
+++ ode/sandbox/simpel/Rakefile Thu Oct 23 17:52:46 2008
@@ -23,7 +23,8 @@
 VERSION_NUMBER = "1.2-SNAPSHOT"
 NEXT_VERSION = "1.2"
 
-ANTLR   = "org.antlr:antlr:jar:3.0.1"
+ANTLR               = "org.antlr:antlr:jar:3.0.1"
+ASM                 = "asm:asm:jar:3.1"
 COMMONS             = struct(
   :logging          =>"commons-logging:commons-logging:jar:1.1",
   :lang             =>"commons-lang:commons-lang:jar:2.1"
@@ -36,8 +37,11 @@
 HSQLDB              = "hsqldb:hsqldb:jar:1.8.0.7"
 JAVAX               = struct(
   :transaction      =>"org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1",
-  :resource         =>"org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:jar:1.0"
+  :resource         =>"org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:jar:1.0",
+  :rest             =>"javax.ws.rs:jsr311-api:jar:1.0"
 )
+JERSEY              = group("jersey-server", "jersey-client", "jersey-core", :under=>"com.sun.jersey", :version=>"1.0")
+JETTY               = group("jetty", "jetty-util", "servlet-api-2.5", :under=>"org.mortbay.jetty", :version=>"6.1.11")
 LOG4J               = "log4j:log4j:jar:1.2.15"
 ODE                 = group("ode-bpel-api", "ode-bpel-compiler", "ode-bpel-dao", "ode-runtimes", 
                             "ode-engine", "ode-il-common", "ode-jacob", "ode-scheduler-simple", 
@@ -46,7 +50,7 @@
 XERCES              = "xerces:xercesImpl:jar:2.8.1"
 
 repositories.remote << "http://repo1.maven.org/maven2"
-repositories.remote << "http://people.apache.org/~mriou/ode-1.2RC1/"
+repositories.remote << "http://download.java.net/maven/2"
 
 desc "ODE SimPEL process execution language."
 define "simpel" do
@@ -85,8 +89,8 @@
 
   compile.from antlr_task
   compile.enhance([task('tweak_antlr')])
-  compile.with HSQLDB, JAVAX.resource, JAVAX.transaction, COMMONS.lang, COMMONS.logging, ODE, LOG4J, 
-    WSDL4J, GERONIMO.transaction, XERCES,
+  compile.with HSQLDB, JAVAX.resource, JAVAX.transaction, COMMONS.lang, COMMONS.logging,
+    ODE, LOG4J, WSDL4J, ASM, JERSEY, JAVAX.rest, JETTY, GERONIMO.transaction, XERCES,
     file(_("lib/e4x-grammar-0.1.jar")), ANTLR, file(_("lib/rhino-1.7R2pre-patched.jar"))
   test.using :fork => :each
   package :jar

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=707517&r1=707516&r2=707517&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 Thu Oct 23 17:52:46 2008
@@ -8,7 +8,8 @@
 tokens {
     ROOT; PROCESS; PICK; SEQUENCE; FLOW; IF; ELSEIF; ELSE; WHILE; UNTIL; FOREACH; FORALL; INVOKE;
     RECEIVE; REPLY; ASSIGN; THROW; WAIT; EXIT; TIMEOUT; TRY; CATCH; CATCH_ALL; SCOPE; EVENT;
-    ALARM; COMPENSATION; COMPENSATE; CORRELATION; CORR_MAP; PARTNERLINK; VARIABLE; BLOCK_PARAM; 
+    COLLECT; RESOURCE;
+    ALARM; COMPENSATION; COMPENSATE; CORRELATION; CORR_MAP; PARTNERLINK; VARIABLE; BLOCK_PARAM;
     SIGNAL; JOIN; WITH; MAP;
     EXPR; EXT_EXPR; XML_LITERAL; CALL; NAMESPACE; NS; PATH;
 }
@@ -94,7 +95,7 @@
 
 proc_stmt
 	:	pick | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex | with_ex
-		| receive | invoke | ((reply | assign | throw_ex | wait_ex | exit | signal | join
+		| receive | invoke | collect | ((reply | assign | throw_ex | wait_ex | exit | signal | join
 		| variables | partner_link) SEMI!);
 
 block	:	'{' proc_stmt+ '}' -> ^(SEQUENCE proc_stmt+);
@@ -149,14 +150,14 @@
         :	receive_base SEMI -> ^(RECEIVE receive_base) |
             receive_base param_block -> ^(RECEIVE receive_base) param_block;
 receive_base
-	    :	'receive' '(' p=ID ',' o=ID (',' correlation)? ')' -> ^($p $o correlation?);
+	    :	'receive' '(' p=ID (',' o=ID (',' correlation)? )? ')' -> ^($p $o? correlation?);
 
 reply	:	'reply' '(' ID (',' ID ',' ID)? ')' -> ^(REPLY ID (ID ID)?);
 
 assign	:	path_expr '=' rvalue -> ^(ASSIGN path_expr rvalue);
 rvalue
 	    :	receive_base -> ^(RECEIVE receive_base)
-		    | invoke | expr | xml_literal;
+		    | invoke | resource | expr | xml_literal;
 	
 throw_ex:	'throw' '('? ns_id ')'? -> ^(THROW ns_id);
 
@@ -167,11 +168,17 @@
 
 exit	:	'exit' -> ^(EXIT);
 
+// RESTful activities
+
+collect : 'collect' '(' ID ')' param_block -> ^(COLLECT ID) param_block;
 
 // Others
 namespace
 	:	'namespace' ID '=' STRING SEMI -> ^(NAMESPACE ID STRING);
-		
+
+resource
+    :   'resource' '(' expr? (',' ID)? ')' -> ^(RESOURCE expr? ID?);
+
 variables
 	:	'var'! v+=variable (','! v+=variable)*;
 variable:	ID VAR_MODS* -> ^(VARIABLE ID VAR_MODS*);
@@ -200,7 +207,7 @@
 path_expr
 	:	pelmt+=ns_id ('.' pelmt+=ns_id)* -> ^(PATH $pelmt);
 
-ns_id	:	(pr=ID '::')? loc=ID ('()')? -> ^(NS $pr? $loc);
+ns_id	:	(pr=ID '::')? loc=ID ('(' ')')? -> ^(NS $pr? $loc);
 
 // In-line XML
 

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=707517&r1=707516&r2=707517&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 Thu Oct 23 17:52:46 2008
@@ -96,6 +96,7 @@
 proc_stmt
 	:	pick | flow | if_ex | while_ex | until_ex | foreach | forall | try_ex | scope_ex | with_ex
 		| invoke | receive | reply | assign | throw_ex | wait_ex | exit | signal | join
+		| collect
 		| variable | partner_link;
 block
 scope Parent;
@@ -213,11 +214,11 @@
     };
 receive	
 scope ReceiveBlock;
-	:	^(RECEIVE ^(p=ID o=ID {
+	:	^(RECEIVE ^(p=ID o=ID? correlation?) {
             OBuilder.StructuredActivity<OPickReceive> rec = builder.build(OPickReceive.class, $BPELScope::oscope,
                 $Parent::activity, text($p), text($o));
 		    $ReceiveBlock::activity = rec.getOActivity();
-		} correlation?))
+		} )
 		(prb=(param_block))?;
 
 assign	
@@ -225,15 +226,20 @@
 	:	^(ASSIGN {
         $ExprContext::expr = new SimPELExpr(builder.getProcess());
     }
-    lv=(path_expr) rv=(rvalue)) {
+    lv=(path_expr) {
+        $ExprContext::expr.setLValue(deepText($lv));
+    }
+    rv=(rvalue)) {
         $ExprContext::expr.setExpr(deepText($rv));
-		OBuilder.StructuredActivity<OAssign> assign =
-            builder.build(OAssign.class, $BPELScope::oscope, $Parent::activity, deepText($lv), $ExprContext::expr);
-        // The long, winding road of abstraction
-        $ExprContext::expr = (SimPELExpr) ((OAssign.Expression)((OAssign.Copy)assign.
-            getOActivity().operations.get(0)).from).expression;
+        if (!"RESOURCE".equals($rv.getText())) {
+		    OBuilder.StructuredActivity<OAssign> assign =
+                builder.build(OAssign.class, $BPELScope::oscope, $Parent::activity, $ExprContext::expr);
+            // The long, winding road of abstraction
+            $ExprContext::expr = (SimPELExpr) ((OAssign.Expression)((OAssign.Copy)assign.
+                getOActivity().operations.get(0)).from).expression;
+        }
     };
-rvalue	:	receive | invoke | expr | xmlElement;
+rvalue	:	receive | invoke | resource | expr | xmlElement;
 	
 throw_ex:	^(THROW ns_id);
 
@@ -241,9 +247,30 @@
 
 exit	:	EXIT;
 
+// RESTful activities
+
+collect
+scope ReceiveBlock;
+    : ^(COLLECT ID) {
+        OBuilder.StructuredActivity<OCollect> collect = builder.build(OCollect.class, $BPELScope::oscope,
+            $Parent::activity, text($ID));
+        $ReceiveBlock::activity = collect.getOActivity();
+    } param_block;
+
 // Other
 variable:	^(VARIABLE ID VAR_MODS*) { builder.addVariableDecl(text($ID), text($VAR_MODS)); };
 
+resource
+scope ExprContext;
+    :   ^(RESOURCE {
+        $ExprContext::expr = new SimPELExpr(builder.getProcess());
+    }
+    e=(expr)? ID?) {
+        $ExprContext::expr.setExpr(deepText($e));
+        // The resource name is the lvalue of the assignment expression in which this resource def is enclosed
+        builder.addResourceDecl($ExprContext[-1]::expr.getLValue(), $ExprContext::expr, text($ID)); 
+    };
+
 partner_link
 	:	^(PARTNERLINK ID*);
 

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java?rev=707517&r1=707516&r2=707517&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/EmbeddedServer.java Thu Oct 23 17:52:46 2008
@@ -20,7 +20,7 @@
 
 import org.apache.log4j.Logger;
 import org.apache.ode.bpel.iapi.*;
-import org.apache.ode.embed.ServerResources;
+import org.apache.ode.embed.ServerLifecycle;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.GUID;
 import org.w3c.dom.Document;
@@ -37,7 +37,7 @@
     private static final Logger __log = Logger.getLogger(EmbeddedServer.class);
 
     public Options options;
-    protected ServerResources _resources;
+    protected ServerLifecycle _resources;
 
     public EmbeddedServer() {
         this.options = new Options();
@@ -49,7 +49,7 @@
 
     public void start(Options options) {
         this.options = options;
-        _resources = new ServerResources(options);
+        _resources = new ServerLifecycle(options);
     }
 
     public void stop() {

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/Options.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/Options.java?rev=707517&r1=707516&r2=707517&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/Options.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/Options.java Thu Oct 23 17:52:46 2008
@@ -35,6 +35,7 @@
     private OdeConfigProperties _odeProps;
     private Properties _backingProps;
     private List<BpelEventListener> _eventListeners;
+    private boolean _enableRest;
 
     public Options() {
         _backingProps = new Properties();
@@ -85,4 +86,11 @@
         return _backingProps;
     }
 
+    public void makeRestful() {
+        _enableRest = true;
+    }
+
+    public boolean isRestful() {
+        return _enableRest;
+    }
 }

Modified: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java?rev=707517&r1=707516&r2=707517&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/EmbeddedStore.java Thu Oct 23 17:52:46 2008
@@ -25,6 +25,7 @@
 import org.apache.ode.bpel.iapi.*;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
 import org.apache.ode.bpel.rapi.Serializer;
+import org.apache.ode.bpel.rapi.ProcessModel;
 import org.apache.ode.simpel.SimPELCompiler;
 import org.w3c.dom.Node;
 import org.w3c.dom.Element;
@@ -143,6 +144,10 @@
             return true;
         }
 
+        public boolean isRestful() {
+            return getProvideEndpoints().size() == 0;
+        }
+
         public InputStream getCBPInputStream() {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
             Serializer fileHeader = new Serializer(System.currentTimeMillis());
@@ -154,6 +159,10 @@
             return new ByteArrayInputStream(baos.toByteArray());
         }
 
+        public ProcessModel getProcessModel() {
+            return _oprocess;
+        }
+
         public String getBpelDocument() {
             throw new UnsupportedOperationException();
         }

Copied: ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerLifecycle.java (from r704611, ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java)
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerLifecycle.java?p2=ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerLifecycle.java&p1=ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java&r1=704611&r2=707517&rev=707517&view=diff
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerResources.java (original)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/embed/ServerLifecycle.java Thu Oct 23 17:52:46 2008
@@ -3,6 +3,7 @@
 import org.apache.log4j.Logger;
 import org.apache.ode.EmbeddedServer;
 import org.apache.ode.Options;
+import org.apache.ode.rest.EngineWebResource;
 import org.apache.ode.embed.messaging.BindingContextImpl;
 import org.apache.ode.embed.messaging.MessageExchangeContextImpl;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
@@ -30,7 +31,7 @@
 /**
  * @author Matthieu Riou <mr...@apache.org>
  */
-public class ServerResources {
+public class ServerLifecycle {
     private static final Logger __log = Logger.getLogger(EmbeddedServer.class);
 
     protected Options _options;
@@ -42,8 +43,9 @@
     protected ExecutorService _executorService;
     protected Scheduler _scheduler;
     protected EmbeddedStore _store;
+    protected EngineWebResource _webEngine;
 
-    public ServerResources(Options options) {
+    public ServerLifecycle(Options options) {
         _options = options;
         if (_options.getThreadPoolMaxSize() <= 0) _executorService = Executors.newCachedThreadPool();
         else _executorService = Executors.newFixedThreadPool(_options.getThreadPoolMaxSize());
@@ -56,6 +58,9 @@
         initDAO();
         __log.debug("Initializing BPEL process store.");
         initProcessStore();
+
+        if (options.isRestful()) initRestfulServer();
+
         __log.debug("Initializing BPEL server.");
         initBpelServer();
 
@@ -73,7 +78,10 @@
         _server.setDaoConnectionFactory(_daoCF);
 //        _server.setEndpointReferenceContext(new EndpointReferenceContextImpl(this));
         _server.setMessageExchangeContext(new MessageExchangeContextImpl(_options.getMessageSender()));
-        _server.setBindingContext(new BindingContextImpl());
+        
+        BindingContextImpl bc = new BindingContextImpl(_options);
+        _server.setBindingContext(bc);
+
         _server.setScheduler(_scheduler);
         _server.setTransactionManager(_txMgr);
         if (_options.isDehydrationEnabled()) {
@@ -140,6 +148,14 @@
         _store.registerListener(new ProcessStoreListenerImpl());
     }
 
+    private void initRestfulServer() {
+        EngineWebResource.startRestfulServer(this);
+    }
+    
+    public void setEngineWebResource(EngineWebResource webEngine) {
+        _webEngine = webEngine;
+    }
+
     /**
      * Register event listeners configured in the configuration.
      *

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=707517&r1=707516&r2=707517&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 Thu Oct 23 17:52:46 2008
@@ -5,6 +5,8 @@
 import org.apache.ode.il.epr.URLEndpoint;
 import org.apache.ode.utils.DOMUtils;
 import org.apache.ode.utils.Namespaces;
+import org.apache.ode.Options;
+import org.apache.ode.rest.EngineWebResource;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -16,6 +18,12 @@
  */
 public class BindingContextImpl implements BindingContext {
 
+    private Options _options;
+
+    public BindingContextImpl(Options options) {
+        _options = options;
+    }
+
     public EndpointReference activateMyRoleEndpoint(QName qName, Endpoint endpoint) {
         Document doc = DOMUtils.newDocument();
         Element serviceElmt = doc.createElementNS(Namespaces.WSDL_11, "service");
@@ -36,6 +44,14 @@
         // Nothing needed here
     }
 
+    public void activateProvidedResource(Resource resource) {
+        EngineWebResource.registerResource(resource);
+    }
+
+    public void deactivateProvidedResource(Resource resource) {
+
+    }
+
     public PartnerRoleChannel createPartnerRoleChannel(QName qName, PortType portType, Endpoint endpoint) {
         // TODO implement me
         return new PartnerRoleChannelImpl();

Added: 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=707517&view=auto
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java (added)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/rest/EngineWebResource.java Thu Oct 23 17:52:46 2008
@@ -0,0 +1,109 @@
+package org.apache.ode.rest;
+
+import com.sun.jersey.spi.container.servlet.ServletContainer;
+import com.sun.jersey.api.NotFoundException;
+
+import javax.ws.rs.Path;
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.UriInfo;
+
+import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.jetty.servlet.Context;
+import org.mortbay.jetty.Server;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.bpel.iapi.Resource;
+import org.apache.ode.embed.ServerLifecycle;
+
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+@Path("/")
+public class EngineWebResource {
+
+    private static Server _server;
+    private static ServerLifecycle _serverLifecyle;
+
+    //    private HashMap<String,QName> _services = new HashMap<String, QName>();
+    private static ConcurrentLinkedQueue<Resource> _engineResources = new ConcurrentLinkedQueue<Resource>();
+
+    @GET @Produces("application/xhtml+xml")
+    public String getXHTML() {
+        StringBuffer res = new StringBuffer();
+        res.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\"><body>");
+        res.append("<p>List of deployed processes:</p>");
+        res.append("<ul>");
+        for (Resource r : _engineResources) {
+            res.append("<li><a href=\"").append(r.getUrl()).append("\">").append(r.getUrl()).append("</a>");
+            res.append("<span id=\"method\">").append(r.getMethod()).append("</span>");
+            res.append("<span id=\"content-type\">").append(r.getContentType()).append("</span>");
+            res.append("</li>");
+        }
+        res.append("</ul>");
+        res.append("</body></html>");
+        return res.toString();
+    }
+
+    @GET @Produces("application/xml")
+    public String getXML() {
+        Document doc = DOMUtils.newDocument();
+        Element root = doc.createElement("resources");
+        doc.appendChild(root);
+        for (Resource r : _engineResources) {
+            Element pelmt = doc.createElement("resource");
+            pelmt.setAttribute("method", r.getMethod());
+            pelmt.setAttribute("contentType", r.getContentType());
+            pelmt.setTextContent(r.getUrl());
+            root.appendChild(pelmt);
+        }
+        return DOMUtils.domToString(doc);
+    }
+
+    @Path("{subpath}")
+    public ProcessWebResource buildProcessResource(@javax.ws.rs.core.Context UriInfo subpath) {
+        for (Resource engineResource : _engineResources) {
+            // TODO This should be able to match based on a pattern
+            if (stripSlashes(subpath.getPath()).equals(stripSlashes(engineResource.getUrl()))) 
+                return new ProcessWebResource(engineResource, _serverLifecyle);
+        }
+        throw new NotFoundException("Resource " + subpath.getPath() + " is unknown.");        
+    }
+
+    private String stripSlashes(String sl) {
+        int start = sl.charAt(0) == '/' ? 1 : 0;
+        int end = sl.charAt(sl.length()-1) == '/' ? sl.length() - 1 : sl.length();
+        return sl.substring(start, end);
+    }
+
+    public static void registerResource(Resource resource) {
+        _engineResources.add(resource);
+    }
+
+    public static void startRestfulServer(ServerLifecycle serverLifecyle) {
+        _serverLifecyle = serverLifecyle;
+        ServletHolder sh = new ServletHolder(ServletContainer.class);
+
+        sh.setInitParameter("com.sun.jersey.config.property.resourceConfigClass",
+                "com.sun.jersey.api.core.PackagesResourceConfig");
+        sh.setInitParameter("com.sun.jersey.config.property.packages", "org.apache.ode.rest");
+
+        _server = new Server(3033);
+        Context context = new Context(_server, "/", Context.SESSIONS);
+        context.addServlet(sh, "/*");
+        try {
+            _server.start();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void stopRestfulServer() {
+        try {
+            _server.stop();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Added: 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=707517&view=auto
==============================================================================
--- ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java (added)
+++ ode/sandbox/simpel/src/main/java/org/apache/ode/rest/ProcessWebResource.java Thu Oct 23 17:52:46 2008
@@ -0,0 +1,100 @@
+package org.apache.ode.rest;
+
+import org.apache.ode.bpel.iapi.Resource;
+import org.apache.ode.bpel.iapi.RESTMessageExchange;
+import org.apache.ode.bpel.iapi.Message;
+import org.apache.ode.embed.ServerLifecycle;
+import org.apache.ode.utils.GUID;
+import org.apache.ode.utils.DOMUtils;
+import org.xml.sax.SAXException;
+import org.w3c.dom.Element;
+import org.w3c.dom.Document;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.POST;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.Response;
+import javax.xml.namespace.QName;
+import java.io.IOException;
+
+public class ProcessWebResource {
+
+    private Resource _resource;
+    private static ServerLifecycle _serverLifecyle;
+
+    public ProcessWebResource(Resource resource, ServerLifecycle serverLifecyle) {
+        _resource = resource;
+        _serverLifecyle = serverLifecyle;
+    }
+
+    @GET @Produces("application/xml")
+    public Response get() {
+        if ("GET".equals(_resource.getMethod())) {
+
+        }
+        // TODO use the resource supported methods
+        return Response.status(405).header("Allow", "POST").build();
+    }
+
+    @POST @Consumes("application/xml")
+    public Response post(String content) {
+        if ("POST".equals(_resource.getMethod())) {
+            RESTMessageExchange mex = _serverLifecyle.getServer().createMessageExchange(_resource, 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();
+            }
+            mex.setRequest(request);
+            try {
+                mex.invokeBlocking();
+            } catch (java.util.concurrent.TimeoutException te) {
+                return Response.status(408).entity("The server timed out while processing the request.").build();
+            }
+
+            if (mex.getResponse() == null) {
+                return Response.status(204).build();
+            } else {
+                return Response.status(200).entity(
+                        DOMUtils.domToString(DOMUtils.getFirstChildElement(DOMUtils.getFirstChildElement(mex.getResponse().getMessage())))).build();
+            }
+
+        }
+        // TODO use the resource supported methods
+        return Response.status(405).header("Allow", "GET").build();
+    }
+
+//    @GET @Produces("application/xhtml+xml")
+//    public String getXHTML() {
+//        StringBuffer res = new StringBuffer();
+//        res.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><html xmlns=\"http://www.w3.org/1999/xhtml\"><body>");
+//        res.append("<h3>Process ").append(_service).append("</h3>");
+//        res.append("<p>To start the process POST an appropriate representation <a href=\"");
+//        res.append("process/").append(_service.getLocalPart());
+//        res.append("\">").append("process/").append(_service.getLocalPart()).append("</a>");
+//        res.append("</p>");
+//        res.append("</body></html>");
+//        return res.toString();
+//    }
+//
+//    @GET @Produces("application/xml")
+//    public String getXML() {
+//        StringBuffer res = new StringBuffer();
+//        res.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+//        res.append("<process>");
+//        res.append("<start>").append("process/").append(_service.getLocalPart()).append("</start>");
+//        res.append("</process>");
+//        return res.toString();
+//    }
+}

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=707517&r1=707516&r2=707517&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 Thu Oct 23 17:52:46 2008
@@ -39,8 +39,8 @@
     private HashMap<String,String> namespaces = new HashMap<String,String>();
     private HashMap<String, OPartnerLink> partnerLinks = new HashMap<String,OPartnerLink>();
     private HashMap<String,OScope.Variable> variables = new HashMap<String,OScope.Variable>();
+    private HashMap<String,OResource> webResources = new HashMap<String,OResource>();
     private HashSet<String> typedVariables = new HashSet<String>();
-    private boolean firstReceive = true;
 
     public OBuilder() {
         HashMap<String, String> exprRuntime = new HashMap<String, String>();
@@ -149,15 +149,24 @@
         };
     }
 
-    public SimpleActivity buildPickReceive(OPickReceive receive, OScope oscope, String partnerLink, String operation) {
+    public SimpleActivity buildPickReceive(OPickReceive receive, OScope oscope, String partnerLinkOrResource, String operation) {
         OPickReceive.OnMessage onMessage = new OPickReceive.OnMessage(_oprocess);
-        onMessage.partnerLink = buildPartnerLink(oscope, partnerLink, operation, true, true);
-        onMessage.operation = onMessage.partnerLink.myRolePortType.getOperation(operation, null, null);
+        if (operation == null) {
+            onMessage.resource = webResources.get(partnerLinkOrResource);
+            if (onMessage.resource == null)
+                throw new RuntimeException("Unknown resource declared in receive: " + partnerLinkOrResource);
+            onMessage.resource.setMethod("POST");
+        } else {
+            onMessage.operation = onMessage.partnerLink.myRolePortType.getOperation(operation, null, null);
+            onMessage.partnerLink = buildPartnerLink(oscope, partnerLinkOrResource, operation, true, true);
+        }
 
-        if (firstReceive) {
-            firstReceive = false;
-            onMessage.partnerLink.addCreateInstanceOperation(onMessage.operation);
+        if (_oprocess.firstReceive == null) {
+            if (onMessage.partnerLink != null)
+                onMessage.partnerLink.addCreateInstanceOperation(onMessage.operation);
             receive.createInstanceFlag = true;
+            _oprocess.firstReceive = receive;
+            if (onMessage.resource != null) onMessage.resource.setInstantiateResource(true);
         }
 
         onMessage.activity = new OEmpty(_oprocess, receive);
@@ -175,6 +184,14 @@
         return new SimpleActivity<OInvoke>(invoke);
     }
 
+    public SimpleActivity buildCollect(OCollect collect, OScope oscope, String resource) {
+        OResource res = webResources.get(resource);
+        if (res == null) throw new RuntimeException("Unknown resource referenced in collect: " + resource);
+
+        collect.setResource(res);
+        return new SimpleActivity<OCollect>(collect);
+    }
+
     public StructuredActivity buildSequence(final OSequence seq, OScope oscope) {
         return new StructuredActivity<OSequence>(seq) {
             public void run(OActivity child) {
@@ -183,19 +200,18 @@
         };
     }
 
-    public SimpleActivity buildAssign(OAssign oassign, OScope oscope, String lexpr, SimPELExpr rexpr) {
+    public SimpleActivity buildAssign(OAssign oassign, OScope oscope, SimPELExpr rexpr) {
         OAssign.Copy ocopy = new OAssign.Copy(_oprocess);
         oassign.operations.add(ocopy);
 
         OAssign.VariableRef vref = new OAssign.VariableRef(_oprocess);
-        String lvar = lexpr.split("\\.")[0];
+        String lvar = rexpr.getLValue().split("\\.")[0];
         vref.variable = resolveVariable(oscope, lvar);
         // Don't worry, it's all type safe, therefore it's correct
         if (vref.variable.type instanceof OMessageVarType)
             vref.part = ((OMessageVarType)vref.variable.type).parts.values().iterator().next();
         ocopy.to = vref;
 
-        rexpr.setLValue(lexpr);
         rexpr.setLVariable(lvar);
         rexpr.expressionLanguage = _exprLang;
         ocopy.from = new OAssign.Expression(_oprocess, rexpr);
@@ -208,9 +224,14 @@
         if (partnerLink == null) {
             if (oreceive == null) throw new RuntimeException("No parent receive but reply with var " + var +
                     " has no partnerLink/operation information.");
-            oreply.partnerLink = oreceive.onMessages.get(0).partnerLink;
-            oreply.operation = oreceive.onMessages.get(0).operation;
-            buildPartnerLink(oscope, oreply.partnerLink.name, oreply.operation.getName(), true, false);
+            OPickReceive.OnMessage onm = oreceive.onMessages.get(0);
+            if (onm.isRestful()) {
+                oreply.resource = onm.resource;
+            } else {
+                oreply.partnerLink = onm.partnerLink;
+                oreply.operation = onm.operation;
+                buildPartnerLink(oscope, oreply.partnerLink.name, oreply.operation.getName(), true, false);
+            }
         } else {
             oreply.partnerLink = buildPartnerLink(oscope, partnerLink, operation, true, false);
             oreply.operation = oreply.partnerLink.myRolePortType.getOperation(operation, null, null);
@@ -231,7 +252,7 @@
         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);
+            rec.variable = resolveVariable(oscope, varName, rec.operation != null ? rec.operation.getName() : null, true);
             if (rec.matchCorrelation != null) {
                 // Setting the message variable type associated with the correlation expression
                 for (PropertyExtractor extractor : rec.matchCorrelation.getExtractors()) {
@@ -242,6 +263,8 @@
             OInvoke inv = (OInvoke)oact;
             inv.outputVar = resolveVariable(oscope, varName, inv.operation.getName(), false);
             buildPartnerLink(oscope, inv.partnerLink.name, inv.operation.getName(), false, false);
+        } else if (oact instanceof OCollect) {
+            OCollect collect = (OCollect)oact;
         } else __log.warn("Can't set block parameter on activity " + oact);
     }
 
@@ -280,6 +303,24 @@
         }
     }
 
+    public void addResourceDecl(String resourceName, SimPELExpr pathExpr, String resourceRef) {
+        OResource res = new OResource(_oprocess);
+        res.setName(resourceName);
+        if (pathExpr != null) {
+            pathExpr.expressionLanguage = _exprLang;
+            res.setSubpath(pathExpr);
+        }
+
+        if (resourceRef != null) {
+            OResource reference = webResources.get(resourceRef);
+            if (reference == null) throw new RuntimeException("Unknown resource reference " + resourceRef +
+                    " in the definition of resource " + resourceName);
+            res.setReference(reference);
+        }
+        webResources.put(resourceName, res);
+        _oprocess.providedResources.add(res);
+    }
+
     public void addCorrelationMatch(OActivity receive, List match) {
         // TODO multiple values match
         OScope.CorrelationSet cset = _oprocess.processScope.getCorrelationSet((String) match.get(1));

Added: ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulProcessTest.java
URL: http://svn.apache.org/viewvc/ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulProcessTest.java?rev=707517&view=auto
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulProcessTest.java (added)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/rest/RestfulProcessTest.java Thu Oct 23 17:52:46 2008
@@ -0,0 +1,54 @@
+package org.apache.ode.rest;
+
+import junit.framework.TestCase;
+import org.apache.ode.EmbeddedServer;
+import org.apache.ode.utils.DOMUtils;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.config.ClientConfig;
+
+public class RestfulProcessTest extends TestCase {
+
+    private static final String HELLO_WORLD =
+            "process HelloWorld {\n" +
+            "   receive(myPl, helloOp) { |msgIn|\n" +
+            "       msgOut = msgIn + \" World\";\n" +
+            "       reply(msgOut);\n" +
+            "   }\n" +
+            "}";
+
+    public void testProcessGet() throws Exception {
+        EmbeddedServer server = new EmbeddedServer();
+        server.options.makeRestful();
+        server.start();
+
+        server.deploy(HELLO_WORLD);
+
+        ClientConfig cc = new DefaultClientConfig();
+        Client c = Client.create(cc);
+
+        WebResource wr = c.resource("http://localhost:3033/ode");
+        String processes = wr.path("/").accept("application/xml").get(String.class);
+        assertTrue(processes.indexOf("HelloWorld") > 0);
+
+        System.out.println("=> " + processes);
+        Element processesElmt = DOMUtils.stringToDOM(processes);
+        NodeList processNL = processesElmt.getElementsByTagName("process");
+        assertTrue(processNL.getLength() > 0);
+        assertEquals("process", processNL.item(0).getNodeName());
+
+        String processUrl = processNL.item(0).getTextContent();
+
+        String process = wr.path(processUrl).accept("application/xml").get(String.class);
+        System.out.println("=> " + process);
+
+        Thread.sleep(10000);
+
+        // Check different representations (html, xml)
+        // Links to instance list search, process start url, process start form
+    }
+}

Added: 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=707517&view=auto
==============================================================================
--- ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java (added)
+++ ode/sandbox/simpel/src/test/java/org/apache/ode/simpel/RestfulSimPELTest.java Thu Oct 23 17:52:46 2008
@@ -0,0 +1,38 @@
+package org.apache.ode.simpel;
+
+import org.apache.ode.EmbeddedServer;
+import junit.framework.TestCase;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.WebResource;
+
+import javax.ws.rs.core.Response;
+
+public class RestfulSimPELTest extends TestCase {
+
+    private static final String HELLO_WORLD =
+            "process HelloWorld {\n" +
+            "   helloRes = resource(\"/hello\"); \n" +
+            "   receive(helloRes) { |name|\n" +
+            "       helloName = \"Hello \" + name;\n" +
+            "       reply(helloName);\n" +
+            "   }\n" +
+            "}";
+
+    public void testRestfulHelloWorld() throws Exception {
+        EmbeddedServer server = new  EmbeddedServer();
+        server.options.makeRestful();
+        server.start();
+        server.deploy(HELLO_WORLD);
+
+        ClientConfig cc = new DefaultClientConfig();
+        Client c = Client.create(cc);
+
+        WebResource wr = c.resource("http://localhost:3033/hello");
+        Response resp = wr.path("/").accept("application/xml").type("application/xml")
+                .post(Response.class, "<wrapper>foo</wrapper>");
+        System.out.println("=> " + resp.getEntity());
+        System.out.println("loc " + resp.getMetadata().get("Location"));
+    }
+}

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=707517&r1=707516&r2=707517&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 Thu Oct 23 17:52:46 2008
@@ -8,18 +8,8 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.serialize.ScriptableOutputStream;
-import org.mozilla.javascript.serialize.ScriptableInputStream;
 
 import javax.xml.namespace.QName;
-import java.util.regex.Pattern;
-import java.util.regex.Matcher;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ByteArrayInputStream;
 
 /**
  * @author Matthieu Riou <mr...@apache.org>