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 <[EMAIL PROTECTED]>
  */
-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;
+
[EMAIL PROTECTED]("/")
+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 <[EMAIL PROTECTED]>


Reply via email to