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>