Author: mriou
Date: Thu Oct 30 17:20:55 2008
New Revision: 709307
URL: http://svn.apache.org/viewvc?rev=709307&view=rev
Log:
Most of the restful infrastructure is in place in the engine. A little bare
bone and no URL composition yet but all the plumbing is there.
Added:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/Resource.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/IncomingMessageExchangeCache.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ResourceInstance.java
Modified:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/evt/ProcessMessageExchangeEvent.java
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/IOContext.java
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/OdeRTInstanceContext.java
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/VariableContext.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeCache.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEWSProcess.java
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/RESTMessageExchangeImpl.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OResource.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OdeInternalInstance.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OutstandingRequestManager.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/PICK.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/REPLY.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/SCOPE.java
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ScopeFrame.java
ode/branches/restful/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java
Modified:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/evt/ProcessMessageExchangeEvent.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/evt/ProcessMessageExchangeEvent.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/evt/ProcessMessageExchangeEvent.java
(original)
+++
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/evt/ProcessMessageExchangeEvent.java
Thu Oct 30 17:20:55 2008
@@ -37,6 +37,7 @@
private QName _portType;
private String _operation;
+ private String _resource;
private String _mexId;
private short _aspect;
@@ -85,4 +86,12 @@
public void setPortType(QName portType) {
_portType = portType;
}
+
+ public String getResource() {
+ return _resource;
+ }
+
+ public void setResource(String resource) {
+ this._resource = resource;
+ }
}
Modified:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/IOContext.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/IOContext.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/IOContext.java
(original)
+++
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/IOContext.java
Thu Oct 30 17:20:55 2008
@@ -44,6 +44,8 @@
*/
void reply(String mexId, PartnerLink plink, String opName, Element msg,
QName fault) throws NoSuchOperationException;
+ void reply(String mexId, Resource resource, Element msg, QName fault)
throws NoSuchOperationException;
+
/**
* Invoke a partner.
*
Modified:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/OdeRTInstanceContext.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/OdeRTInstanceContext.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/OdeRTInstanceContext.java
(original)
+++
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/OdeRTInstanceContext.java
Thu Oct 30 17:20:55 2008
@@ -57,6 +57,4 @@
* @param optionalFaultData
*/
void noreply(String mexId, FaultInfo optionalFaultData);
-
- void checkResourceRoute(String url, String method, String
pickResponseChannel, int selectorIdx);
}
Added:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/Resource.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/Resource.java?rev=709307&view=auto
==============================================================================
---
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/Resource.java
(added)
+++
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/Resource.java
Thu Oct 30 17:20:55 2008
@@ -0,0 +1,10 @@
+package org.apache.ode.bpel.rapi;
+
+public interface Resource {
+
+ String getName();
+
+ ResourceModel getModel();
+
+ Long getScopeInstanceId();
+}
Modified:
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/VariableContext.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/VariableContext.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/VariableContext.java
(original)
+++
ode/branches/restful/bpel-api/src/main/java/org/apache/ode/bpel/rapi/VariableContext.java
Thu Oct 30 17:20:55 2008
@@ -89,6 +89,9 @@
void initializePartnerLinks(Long parentScopeId,
Collection<? extends PartnerLinkModel>
partnerLinks);
+ void initializeResource(Long parentScopeId, ResourceModel resource, String
url);
+
+ void checkResourceRoute(Resource instance, String pickResponseChannel, int
selectorIdx);
/**
* Fetches the my-role endpoint reference data.
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
Thu Oct 30 17:20:55 2008
@@ -60,12 +60,10 @@
import org.apache.ode.bpel.evar.ExternalVariableModuleException;
import org.apache.ode.bpel.evar.ExternalVariableModule.Value;
import org.apache.ode.bpel.rapi.*;
+import org.apache.ode.bpel.rapi.Resource;
import org.apache.ode.bpel.memdao.ProcessInstanceDaoImpl;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
+import org.w3c.dom.*;
class BpelRuntimeContextImpl implements OdeRTInstanceContext {
@@ -207,6 +205,22 @@
}
}
+ public void initializeResource(Long parentScopeId, ResourceModel resource,
String url) {
+ ScopeDAO parent = _dao.getScope(parentScopeId);
+ // Storing the resource as a variable
+ XmlDataDAO resourceData = parent.getVariable(resource.getName());
+ Document doc = DOMUtils.newDocument();
+ resourceData.set(doc.createTextNode(url));
+ }
+
+ public String readResource(Long parentScopeId, ResourceModel resource) {
+ ScopeDAO parent = _dao.getScope(parentScopeId);
+ XmlDataDAO resourceData = parent.getVariable(resource.getName());
+ Node resourceNode = resourceData.get();
+ if (resourceData.isNull()) return null;
+ else return ((Text)resourceNode).getWholeText();
+ }
+
public void select(String selectChannelId, Date timeout, Selector[]
selectors) {
if (ODEProcess.__log.isTraceEnabled())
ODEProcess.__log.trace(ObjectPrinter.stringifyMethodEnter("select", new
Object[] { "pickResponseChannel",
@@ -272,7 +286,7 @@
}
}
- public void checkResourceRoute(String url, String method, String
pickResponseChannel, int selectorIdx) {
+ public void checkResourceRoute(Resource resourceInstance, String
pickResponseChannel, int selectorIdx) {
// check if this is first pick
if (_dao.getState() == ProcessState.STATE_NEW) {
// send event
@@ -283,11 +297,13 @@
sendEvent(evt);
}
+ String method = resourceInstance.getModel().getMethod();
if (_instantiatingMessageExchange != null && method.equals("POST") &&
_dao.getState() == ProcessState.STATE_READY)
injectMyRoleMessageExchange(pickResponseChannel, selectorIdx,
_instantiatingMessageExchange);
else {
+ String url = readResource(resourceInstance.getScopeInstanceId(),
resourceInstance.getModel());
_dao.createResourceRoute(url, method, pickResponseChannel,
selectorIdx);
- Resource res = new Resource(url, "application/xml", method);
+ org.apache.ode.bpel.iapi.Resource res = new
org.apache.ode.bpel.iapi.Resource(url, "application/xml", method);
_bpelProcess._contexts.bindingContext.activateProvidedResource(res);
}
@@ -426,6 +442,36 @@
sendEvent(evt);
}
+ public void reply(String mexId, Resource resource, Element msg, QName
fault) throws NoSuchOperationException {
+ // prepare event
+ ProcessMessageExchangeEvent evt = new ProcessMessageExchangeEvent();
+ evt.setMexId(mexId);
+ evt.setResource(resource.getName());
+
+ MessageExchangeDAO mex =
_dao.getConnection().getMessageExchange(mexId);
+ MessageDAO message = mex.createMessage(null);
+ buildOutgoingMessage(message, msg);
+ mex.setResponse(message);
+
+ AckType ackType;
+ if (fault != null) {
+ ackType = AckType.FAULT;
+ mex.setFault(fault);
+ evt.setAspect(ProcessMessageExchangeEvent.PROCESS_FAULT);
+ } else {
+ ackType = AckType.RESPONSE;
+ evt.setAspect(ProcessMessageExchangeEvent.PROCESS_OUTPUT);
+ }
+
+ String url = readResource(resource.getScopeInstanceId(),
resource.getModel());
+
+ Status previousStatus = mex.getStatus();
+ mex.setStatus(Status.ACK);
+ mex.setAckType(ackType);
+ ((ODERESTProcess)_bpelProcess).onRestMexAck(mex, previousStatus, url);
+ sendEvent(evt);
+ }
+
public void writeCorrelation(CorrelationSet cset, QName[] propNames,
CorrelationKey correlation) {
ScopeDAO scopeDAO = _dao.getScope(cset.getScopeId());
CorrelationSetDAO cs = scopeDAO.getCorrelationSet(cset.getName());
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
Thu Oct 30 17:20:55 2008
@@ -98,7 +98,7 @@
private final HashMap<String, ODERESTProcess> _restServiceMap = new
HashMap<String, ODERESTProcess>();
/** Weak-reference cache of all the my-role message exchange objects. */
- private final MyRoleMessageExchangeCache _myRoleMexCache = new
MyRoleMessageExchangeCache();
+ private final IncomingMessageExchangeCache _incomingMexCache = new
IncomingMessageExchangeCache();
private State _state = State.SHUTDOWN;
@@ -345,13 +345,13 @@
ODEProcess process;
if (conf.isRestful()) {
- ODERESTProcess restProcess = new ODERESTProcess(this, conf,
null);
+ ODERESTProcess restProcess = new ODERESTProcess(this, conf,
null, _incomingMexCache);
for (String resUrl : restProcess.getInitialResourceUrls()) {
_restServiceMap.put(resUrl, restProcess);
}
process = restProcess;
} else {
- ODEWSProcess wsProcess = new ODEWSProcess(this, conf, null,
_myRoleMexCache);
+ ODEWSProcess wsProcess = new ODEWSProcess(this, conf, null,
_incomingMexCache);
for (Endpoint e : wsProcess.getServiceNames()) {
__log.debug("Register process: serviceId=" + e + ",
process=" + wsProcess);
// Get the list of processes associated with the given
service
Added:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/IncomingMessageExchangeCache.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/IncomingMessageExchangeCache.java?rev=709307&view=auto
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/IncomingMessageExchangeCache.java
(added)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/IncomingMessageExchangeCache.java
Thu Oct 30 17:20:55 2008
@@ -0,0 +1,64 @@
+package org.apache.ode.bpel.engine;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.ode.bpel.dao.MessageExchangeDAO;
+
+/**
+ * Manage [EMAIL PROTECTED] IncomingMessageExchangeCache} object references.
+ *
+ * @author Maciej Szefler <mszefler at gmail dot com>
+ *
+ */
+class IncomingMessageExchangeCache {
+
+ private static final int CLEANUP_PERIOD = 20;
+
+ private Map<String, WeakReference<MessageExchangeImpl>> _cache = new
ConcurrentHashMap<String, WeakReference<MessageExchangeImpl>>();
+
+ private int _inserts = 0;
+
+ void put(MessageExchangeImpl mex) {
+ ++_inserts;
+ if (_inserts > CLEANUP_PERIOD) cleanup();
+
+ WeakReference<MessageExchangeImpl> ref =
_cache.get(mex.getMessageExchangeId());
+ if (ref != null && ref.get() != null)
+ throw new IllegalStateException("InternalError: duplicate
myrolemex registration!");
+
+ _cache.put(mex.getMessageExchangeId(), new
WeakReference<MessageExchangeImpl>(mex));
+ }
+
+ /**
+ * Retrieve a [EMAIL PROTECTED] MyRoleMessageExchangeImpl} from the cache,
re-creating if necessary.
+ *
+ * @param mexdao
+ * @return
+ */
+ MessageExchangeImpl get(MessageExchangeDAO mexdao, ODEProcess process) {
+ WeakReference<MessageExchangeImpl> ref =
_cache.get(mexdao.getMessageExchangeId());
+ MessageExchangeImpl mex = ref == null ? null : ref.get();
+
+ if (mex == null) {
+ mex = process.recreateIncomingMex(mexdao);
+ _cache.put(mexdao.getMessageExchangeId(), new
WeakReference<MessageExchangeImpl>(mex));
+ }
+ return mex;
+ }
+
+ /**
+ * Remove stale references.
+ *
+ */
+ private void cleanup() {
+ for (Iterator<WeakReference<MessageExchangeImpl>> i =
_cache.values().iterator(); i.hasNext();) {
+ WeakReference<MessageExchangeImpl> ref = i.next();
+ if (ref.get() == null) i.remove();
+ }
+ _inserts = 0;
+ }
+}
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeCache.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeCache.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeCache.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeCache.java
Thu Oct 30 17:20:55 2008
@@ -1,64 +0,0 @@
-package org.apache.ode.bpel.engine;
-
-import java.lang.ref.WeakReference;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.ode.bpel.dao.MessageExchangeDAO;
-
-/**
- * Manage [EMAIL PROTECTED] MyRoleMessageExchangeImpl} object references.
- *
- * @author Maciej Szefler <mszefler at gmail dot com>
- *
- */
-class MyRoleMessageExchangeCache {
-
- private static final int CLEANUP_PERIOD = 20;
-
- private Map<String, WeakReference<MyRoleMessageExchangeImpl>> _cache = new
ConcurrentHashMap<String, WeakReference<MyRoleMessageExchangeImpl>>();
-
- private int _inserts = 0;
-
- void put(MyRoleMessageExchangeImpl mex) {
- ++_inserts;
- if (_inserts > CLEANUP_PERIOD) cleanup();
-
- WeakReference<MyRoleMessageExchangeImpl> ref =
_cache.get(mex.getMessageExchangeId());
- if (ref != null && ref.get() != null)
- throw new IllegalStateException("InternalError: duplicate
myrolemex registration!");
-
- _cache.put(mex.getMessageExchangeId(), new
WeakReference<MyRoleMessageExchangeImpl>(mex));
- }
-
- /**
- * Retrieve a [EMAIL PROTECTED] MyRoleMessageExchangeImpl} from the cache,
re-creating if necessary.
- *
- * @param mexdao
- * @return
- */
- MyRoleMessageExchangeImpl get(MessageExchangeDAO mexdao, ODEWSProcess
process) {
- WeakReference<MyRoleMessageExchangeImpl> ref =
_cache.get(mexdao.getMessageExchangeId());
- MyRoleMessageExchangeImpl mex = ref == null ? null : ref.get();
-
- if (mex == null) {
- mex = process.recreateMyRoleMex(mexdao);
- _cache.put(mexdao.getMessageExchangeId(), new
WeakReference<MyRoleMessageExchangeImpl>(mex));
- }
- return mex;
- }
-
- /**
- * Remove stale references.
- *
- */
- private void cleanup() {
- for (Iterator<WeakReference<MyRoleMessageExchangeImpl>> i =
_cache.values().iterator(); i.hasNext();) {
- WeakReference<MyRoleMessageExchangeImpl> ref = i.next();
- if (ref.get() == null) i.remove();
- }
- _inserts = 0;
- }
-}
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
Thu Oct 30 17:20:55 2008
@@ -73,6 +73,7 @@
protected final Set<InvocationStyle> _invocationStyles;
protected final BpelDAOConnectionFactoryImpl _inMemDao;
protected final BpelServerImpl _server;
+ protected IncomingMessageExchangeCache _incomingMexCache;
/** Last time the process was used. */
protected volatile long _lastUsed;
@@ -87,12 +88,13 @@
protected ExternalVariableConf _extVarConf;
protected ExternalVariableManager _evm;
- ODEProcess(BpelServerImpl server, ProcessConf conf, BpelEventListener
debugger) {
+ ODEProcess(BpelServerImpl server, ProcessConf conf, BpelEventListener
debugger, IncomingMessageExchangeCache mexCache) {
_server = server;
_pid = conf.getProcessId();
_pconf = conf;
_contexts = server._contexts;
_inMemDao = new BpelDAOConnectionFactoryImpl(_contexts.txManager);
+ _incomingMexCache = mexCache;
// TODO : do this on a per-partnerlink basis, support transacted
styles.
HashSet<InvocationStyle> istyles = new HashSet<InvocationStyle>();
@@ -109,6 +111,7 @@
abstract void dehydrate();
abstract void invokeProcess(final MessageExchangeDAO mexdao);
+ abstract MessageExchangeImpl recreateIncomingMex(MessageExchangeDAO
mexdao);
protected abstract void latch(int s);
protected abstract void releaseLatch(int s);
@@ -417,6 +420,33 @@
}
}
+ void p2pCall(MessageExchangeDAO mexdao, MessageExchange.Status old) {
+ ODEProcess caller = _server.getBpelProcess(mexdao.getPipedPID());
+ // process no longer deployed....
+ if (caller == null) return;
+
+ MessageExchangeDAO pmex =
caller.loadMexDao(mexdao.getPipedMessageExchangeId());
+ // Mex no longer there.... odd..
+ if (pmex == null) return;
+
+ // Need to copy the response and state from myrolemex -->
partnerrolemex
+ boolean compat = !(caller.isInMemory() ^ isInMemory());
+ if (compat) {
+ // both processes are in-mem or both are persisted, can share the
message
+ pmex.setResponse(mexdao.getResponse());
+ } else /* one process in-mem, other persisted */{
+ MessageDAO presponse =
pmex.createMessage(mexdao.getResponse().getType());
+ presponse.setData(mexdao.getResponse().getData());
+ presponse.setHeader(mexdao.getResponse().getHeader());
+ pmex.setResponse(presponse);
+ }
+ pmex.setStatus(mexdao.getStatus());
+ pmex.setAckType(mexdao.getAckType());
+ pmex.setFailureType(mexdao.getFailureType());
+
+ if (old == MessageExchange.Status.ASYNC) caller.p2pWakeup(pmex);
+ }
+
MessageExchangeDAO loadMexDao(String mexId) {
return isInMemory() ?
_inMemDao.getConnection().getMessageExchange(mexId) :
_contexts.dao.getConnection()
.getMessageExchange(mexId);
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
Thu Oct 30 17:20:55 2008
@@ -20,8 +20,8 @@
private ArrayList<Resource> _resources = new ArrayList<Resource>();
- public ODERESTProcess(BpelServerImpl server, ProcessConf conf,
BpelEventListener debugger) {
- super(server, conf, debugger);
+ public ODERESTProcess(BpelServerImpl server, ProcessConf conf,
BpelEventListener debugger, IncomingMessageExchangeCache mexCache) {
+ super(server, conf, debugger, mexCache);
_processModel = conf.getProcessModel();
_runtime = buildRuntime(_processModel.getModelVersion());
_runtime.init(_pconf, _processModel);
@@ -94,6 +94,19 @@
}
}
+ void onRestMexAck(MessageExchangeDAO mexdao, MessageExchange.Status old,
String url) {
+ if (mexdao.getPipedMessageExchangeId() != null) /* p2p */{
+ p2pCall(mexdao, old);
+ } else /* not p2p */{
+ if (old == MessageExchange.Status.ASYNC) {
+ RESTMessageExchangeImpl mymex = (RESTMessageExchangeImpl)
_incomingMexCache.get(mexdao, this);
+ // Updating url for instantiating mexs so that the created
resource url can be returned to the caller
+ mymex.getResource().setUrl(url);
+ mymex.onAsyncAck(mexdao);
+ }
+ }
+ }
+
// Restful processes don't lazy load their OModel, they need it right away
to access the instantiating resource
protected void latch(int s) { }
protected void releaseLatch(int s) { }
@@ -103,7 +116,14 @@
public RESTMessageExchange createRESTMessageExchange(Resource resource,
String clientKey) {
// TODO check the resource matches a provided one
- return new RESTMessageExchangeImpl(this, clientKey, resource);
+ RESTMessageExchangeImpl mex = new RESTMessageExchangeImpl(this,
clientKey, resource);
+ _incomingMexCache.put(mex);
+ return mex;
+ }
+
+ MessageExchangeImpl recreateIncomingMex(MessageExchangeDAO mexdao) {
+ Resource resource = getResource(mexdao.getResource());
+ return new RESTMessageExchangeImpl(this,
mexdao.getMessageExchangeId(), resource);
}
public Resource getResource(String url, String method) {
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEWSProcess.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEWSProcess.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEWSProcess.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/ODEWSProcess.java
Thu Oct 30 17:20:55 2008
@@ -39,12 +39,9 @@
/** Latch-like thing to control hydration/dehydration. */
HydrationLatch _hydrationLatch;
- private MyRoleMessageExchangeCache _myRoleMexCache;
-
- ODEWSProcess(BpelServerImpl server, ProcessConf conf, BpelEventListener
debugger, MyRoleMessageExchangeCache mexCache) {
- super(server, conf, debugger);
+ ODEWSProcess(BpelServerImpl server, ProcessConf conf, BpelEventListener
debugger, IncomingMessageExchangeCache mexCache) {
+ super(server, conf, debugger, mexCache);
_hydrationLatch = new HydrationLatch();
- _myRoleMexCache = mexCache;
}
private PartnerLinkMyRoleImpl getMyRoleForService(QName serviceName) {
@@ -465,7 +462,7 @@
throw new AssertionError("Unexpected invocation style: " + istyle);
}
- _myRoleMexCache.put(mex);
+ _incomingMexCache.put(mex);
return mex;
}
@@ -477,17 +474,17 @@
* @return client representation
*/
MyRoleMessageExchangeImpl lookupMyRoleMex(MessageExchangeDAO mexdao) {
- return _myRoleMexCache.get(mexdao, this); // this will re-create if
necessary
+ return (MyRoleMessageExchangeImpl) _incomingMexCache.get(mexdao,
this); // this will re-create if necessary
}
/**
* Create (or recreate) a [EMAIL PROTECTED] MyRoleMessageExchangeImpl}
object from data in the db. This method is used by the
- * [EMAIL PROTECTED] MyRoleMessageExchangeCache} to re-create objects when
they are not found in the cache.
+ * [EMAIL PROTECTED] IncomingMessageExchangeCache} to re-create objects
when they are not found in the cache.
*
* @param mexdao
* @return
*/
- MyRoleMessageExchangeImpl recreateMyRoleMex(MessageExchangeDAO mexdao) {
+ MyRoleMessageExchangeImpl recreateIncomingMex(MessageExchangeDAO mexdao) {
InvocationStyle istyle = mexdao.getInvocationStyle();
latch(1);
@@ -539,35 +536,12 @@
void onMyRoleMexAck(MessageExchangeDAO mexdao, MessageExchange.Status old)
{
if (mexdao.getPipedMessageExchangeId() != null) /* p2p */{
- ODEProcess caller = _server.getBpelProcess(mexdao.getPipedPID());
- // process no longer deployed....
- if (caller == null) return;
-
- MessageExchangeDAO pmex =
caller.loadMexDao(mexdao.getPipedMessageExchangeId());
- // Mex no longer there.... odd..
- if (pmex == null) return;
-
- // Need to copy the response and state from myrolemex -->
partnerrolemex
- boolean compat = !(caller.isInMemory() ^ isInMemory());
- if (compat) {
- // both processes are in-mem or both are persisted, can share
the message
- pmex.setResponse(mexdao.getResponse());
- } else /* one process in-mem, other persisted */{
- MessageDAO presponse =
pmex.createMessage(mexdao.getResponse().getType());
- presponse.setData(mexdao.getResponse().getData());
- presponse.setHeader(mexdao.getResponse().getHeader());
- pmex.setResponse(presponse);
- }
- pmex.setStatus(mexdao.getStatus());
- pmex.setAckType(mexdao.getAckType());
- pmex.setFailureType(mexdao.getFailureType());
-
- if (old == MessageExchange.Status.ASYNC) caller.p2pWakeup(pmex);
+ p2pCall(mexdao, old);
} else /* not p2p */{
// Do an Async wakeup if we are in the ASYNC state. If we're not,
we'll pick up the ACK when we unwind
// the stack.
if (old == MessageExchange.Status.ASYNC) {
- MyRoleMessageExchangeImpl mymex = _myRoleMexCache.get(mexdao,
this);
+ MyRoleMessageExchangeImpl mymex = (MyRoleMessageExchangeImpl)
_incomingMexCache.get(mexdao, this);
mymex.onAsyncAck(mexdao);
try {
_contexts.mexContext.onMyRoleMessageExchangeStateChanged(mymex);
Modified:
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/RESTMessageExchangeImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/RESTMessageExchangeImpl.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/RESTMessageExchangeImpl.java
(original)
+++
ode/branches/restful/engine/src/main/java/org/apache/ode/bpel/engine/RESTMessageExchangeImpl.java
Thu Oct 30 17:20:55 2008
@@ -2,6 +2,7 @@
import org.apache.ode.bpel.iapi.*;
import org.apache.ode.bpel.dao.MessageExchangeDAO;
+import org.apache.ode.bpel.dao.MessageDAO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -124,6 +125,14 @@
void save(MessageExchangeDAO dao) {
super.save(dao);
dao.setResource(_resource.getUrl() + "~" + _resource.getMethod());
+
+ if (_changes.contains(Change.REQUEST)) {
+ _changes.remove(Change.REQUEST);
+ MessageDAO requestDao = dao.createMessage(_request.getType());
+ requestDao.setData(_request.getMessage());
+ requestDao.setHeader(_request.getHeader());
+ dao.setRequest(requestDao);
+ }
}
@Override
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OResource.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OResource.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OResource.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OResource.java
Thu Oct 30 17:20:55 2008
@@ -12,6 +12,7 @@
private OResource reference;
private String method;
private boolean instantiateResource;
+ private OScope declaringScope;
public OResource(OProcess owner) {
super(owner);
@@ -56,4 +57,12 @@
public void setInstantiateResource(boolean instantiateResource) {
this.instantiateResource = instantiateResource;
}
+
+ public OScope getDeclaringScope() {
+ return declaringScope;
+ }
+
+ public void setDeclaringScope(OScope declaringScope) {
+ this.declaringScope = declaringScope;
+ }
}
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OdeInternalInstance.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OdeInternalInstance.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OdeInternalInstance.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OdeInternalInstance.java
Thu Oct 30 17:20:55 2008
@@ -37,6 +37,8 @@
void initializePartnerLinks(Long parentScopeId, Collection<OPartnerLink>
partnerLinks);
+ void initializeResource(Long parentScopeId, OResource resource, String
url);
+
String invoke(String invokeId, PartnerLinkInstance instance, Operation
operation, Element outboundMsg, Object object)
throws FaultException;
@@ -74,7 +76,8 @@
void select(PickResponseChannel pickResponseChannel, Date timeout, boolean
createInstance, Selector[] selectors)
throws FaultException;
- void checkResourceRoute(String url, String method, String mexRef,
PickResponseChannel pickResponseChannel, int selectorIdx);
+ void checkResourceRoute(ResourceInstance resourceInstance, String mexRef,
+ PickResponseChannel pickResponseChannel, int
selectorIdx);
CorrelationKey readCorrelation(CorrelationSetInstance cset);
@@ -119,4 +122,7 @@
void reply(PartnerLinkInstance plink, String opName, String bpelmex,
Element element, QName fault)
throws FaultException;
+
+ void reply(ResourceInstance resource, String bpelmex, Element element,
QName fault) throws FaultException;
+
}
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OutstandingRequestManager.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OutstandingRequestManager.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OutstandingRequestManager.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OutstandingRequestManager.java
Thu Oct 30 17:20:55 2008
@@ -106,25 +106,26 @@
_byChannel.put(pickResponseChannel, entry);
}
- void register(String pickResponseChannel, String url, String method,
String mexRef) {
+ void register(String pickResponseChannel, ResourceInstance resource,
String method, String mexRef) {
if (__log.isTraceEnabled())
__log.trace(ObjectPrinter.stringifyMethodEnter("register", new
Object[] {
"pickResponseChannel", pickResponseChannel}) );
- if (_byChannel.containsKey(pickResponseChannel)) {
+ if (_byRestChannel.containsKey(pickResponseChannel)) {
String errmsg = "INTERNAL ERROR: Duplicate ENTRY for RESPONSE
CHANNEL " + pickResponseChannel;
__log.fatal(errmsg);
throw new IllegalArgumentException(errmsg);
}
- final RequestResTuple rid = new RequestResTuple(url, method, mexRef);
- if (_byRid.containsKey(rid)) {
+ final RequestResTuple rid = new RequestResTuple(resource, method,
mexRef);
+ if (_byRestRid.containsKey(rid)) {
String errmsg = "INTERNAL ERROR: Duplicate ENTRY for RID " + rid;
__log.fatal(errmsg);
throw new IllegalStateException(errmsg);
}
- _byRestRid.put(rid, new RestEntry(pickResponseChannel));
- _byRestChannel.put(pickResponseChannel, new
RestEntry(pickResponseChannel));
+ RestEntry entry = new RestEntry(pickResponseChannel);
+ _byRestRid.put(rid, entry);
+ _byRestChannel.put(pickResponseChannel, entry);
}
/**
@@ -212,12 +213,12 @@
return entry.mexRef;
}
- public String release(String url, String method, String mexId) {
+ public String release(ResourceInstance resourceInstance, String method,
String mexId) {
if (__log.isTraceEnabled())
__log.trace(ObjectPrinter.stringifyMethodEnter("release", new
Object[] {
- "url", url, "method", method, "mexId", mexId }) );
+ "resource", resourceInstance, "method", method, "mexId",
mexId }) );
- final RequestResTuple rid = new RequestResTuple(url, method, mexId);
+ final RequestResTuple rid = new RequestResTuple(resourceInstance,
method, mexId);
RestEntry entry = _byRestRid.get(rid);
if (entry == null) {
if (__log.isDebugEnabled()) {
@@ -300,30 +301,30 @@
private class RequestResTuple implements Serializable {
private static final long serialVersionUID = -1059359612839777482L;
/** Name of the operation. */
- String url;
+ ResourceInstance resource;
/** Message exchange identifier. */
String method;
/** Message exchange identifier. */
String mexId;
/** Constructor. */
- private RequestResTuple(String url, String method, String mexId) {
- this.url = url;
+ private RequestResTuple(ResourceInstance resource, String method,
String mexId) {
+ this.resource = resource;
this.method = method;
this.mexId = mexId;
}
public int hashCode() {
- return this.url.hashCode() ^ this.method.hashCode() ^
this.mexId.hashCode();
+ return this.resource.hashCode() ^ this.method.hashCode() ^
this.mexId.hashCode();
}
public boolean equals(Object obj) {
RequestResTuple other = (RequestResTuple) obj;
- return other.url.equals(url) && other.method.equals(method) &&
other.mexId.equals(mexId);
+ return other.resource.equals(resource) &&
other.method.equals(method) && other.mexId.equals(mexId);
}
public String toString() {
- return ObjectPrinter.toString(this, new Object[] {"url", url,
"method", method, "mexId", mexId});
+ return ObjectPrinter.toString(this, new Object[] {"url", resource,
"method", method, "mexId", mexId});
}
}
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/PICK.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/PICK.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/PICK.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/PICK.java
Thu Oct 30 17:20:55 2008
@@ -87,11 +87,7 @@
int idx = 0;
for (OPickReceive.OnMessage onMessage : _opick.onMessages) {
if (onMessage.isRestful()) {
- // TODO here we should resolved a resource url value
that's been previously instantiated by a scope
- String url = getBpelRuntime().getExpLangRuntime()
- .evaluateAsString(onMessage.resource.getSubpath(),
getEvaluationContext());
- url = url + "/" + new GUID().toString();
- getBpelRuntime().checkResourceRoute(url,
onMessage.resource.getMethod(),
+
getBpelRuntime().checkResourceRoute(_scopeFrame.resolve(onMessage.resource),
onMessage.messageExchangeId, pickResponseChannel,
idx);
} else {
CorrelationKey key = null;
@@ -170,56 +166,57 @@
return;
}
- Collection<String> partNames = (Collection<String>)
onMessage.operation.getInput().getMessage().getParts().keySet();
+ if (!onMessage.isRestful()) {
+ Collection<String> partNames = (Collection<String>)
onMessage.operation.getInput().getMessage().getParts().keySet();
- // Let's do some sanity checks here so that we don't get weird errors
in assignment later.
- // The engine should have checked to make sure that the messages that
are delivered conform
- // to the correct format; but you know what they say, don't trust
anyone.
- if (!(onMessage.variable.type instanceof OMessageVarType)) {
- String errmsg = "Non-message variable for receive: should have
been picked up by static analysis.";
- __log.fatal(errmsg);
- throw new InvalidProcessException(errmsg);
- }
-
- OMessageVarType vartype = (OMessageVarType) onMessage.variable.type;
-
- // Check that each part contains what we expect.
- for (String pName : partNames) {
- QName partName = new QName(null, pName);
- Element msgPart = DOMUtils.findChildByName(msgEl, partName);
- OMessageVarType.Part part = vartype.parts.get(pName);
- if (part == null) {
- String errmsg = "Inconsistent WSDL, part " + pName + " not
found in message type " + vartype.messageType;
+ // Let's do some sanity checks here so that we don't get weird
errors in assignment later.
+ // The engine should have checked to make sure that the messages
that are delivered conform
+ // to the correct format; but you know what they say, don't trust
anyone.
+ if (!(onMessage.variable.type instanceof OMessageVarType)) {
+ String errmsg = "Non-message variable for receive: should have
been picked up by static analysis.";
__log.fatal(errmsg);
throw new InvalidProcessException(errmsg);
}
- if (msgPart == null) {
- String errmsg = "Message missing part: " + pName;
- __log.fatal(errmsg);
- throw new InvalidContextException(errmsg);
- }
-
- if (part.type instanceof OElementVarType) {
- OElementVarType ptype = (OElementVarType) part.type;
- Element e = DOMUtils.getFirstChildElement(msgPart);
- if (e == null) {
- String errmsg = "Message (element) part " + pName + " did
not contain child element.";
+
+ OMessageVarType vartype = (OMessageVarType)
onMessage.variable.type;
+ // Check that each part contains what we expect.
+ for (String pName : partNames) {
+ QName partName = new QName(null, pName);
+ Element msgPart = DOMUtils.findChildByName(msgEl, partName);
+ OMessageVarType.Part part = vartype.parts.get(pName);
+ if (part == null) {
+ String errmsg = "Inconsistent WSDL, part " + pName + " not
found in message type " + vartype.messageType;
+ __log.fatal(errmsg);
+ throw new InvalidProcessException(errmsg);
+ }
+ if (msgPart == null) {
+ String errmsg = "Message missing part: " + pName;
__log.fatal(errmsg);
throw new InvalidContextException(errmsg);
}
- // Relaxing that check a bit for SimPEL
- if (!ptype.elementType.getLocalPart().equals("simpelWrapper"))
{
- QName qn = new QName(e.getNamespaceURI(),
e.getLocalName());
- if(!qn.equals(ptype.elementType)) {
- String errmsg = "Message (element) part " + pName + "
did not contain correct child element: expected "
- + ptype.elementType + " but got " + qn;
+ if (part.type instanceof OElementVarType) {
+ OElementVarType ptype = (OElementVarType) part.type;
+ Element e = DOMUtils.getFirstChildElement(msgPart);
+ if (e == null) {
+ String errmsg = "Message (element) part " + pName + "
did not contain child element.";
__log.fatal(errmsg);
throw new InvalidContextException(errmsg);
}
+
+ // Relaxing that check a bit for SimPEL
+ if
(!ptype.elementType.getLocalPart().equals("simpelWrapper")) {
+ QName qn = new QName(e.getNamespaceURI(),
e.getLocalName());
+ if(!qn.equals(ptype.elementType)) {
+ String errmsg = "Message (element) part " + pName
+ " did not contain correct child element: expected "
+ + ptype.elementType + " but got " + qn;
+ __log.fatal(errmsg);
+ throw new InvalidContextException(errmsg);
+ }
+ }
}
+
}
-
}
VariableInstance vinst = _scopeFrame.resolve(onMessage.variable);
@@ -235,8 +232,7 @@
// Generating event
VariableModificationEvent se = new
VariableModificationEvent(vinst.declaration.name);
se.setNewValue(msgEl);
- if (_opick.debugInfo != null)
- se.setLineNo(_opick.debugInfo.startLine);
+ if (_opick.debugInfo != null) se.setLineNo(_opick.debugInfo.startLine);
sendEvent(se);
}
@@ -276,10 +272,8 @@
for (OScope.CorrelationSet cset :
onMessage.initCorrelations) {
initializeCorrelation(_scopeFrame.resolve(cset),
_scopeFrame.resolve(onMessage.variable));
}
- if (onMessage.partnerLink.hasPartnerRole()) {
- // Trying to initialize partner epr based on a
- // message-provided epr/session.
-
+ if (onMessage.partnerLink != null &&
onMessage.partnerLink.hasPartnerRole()) {
+ // Trying to initialize partner epr based on a
message-provided epr/session.
if
(!getBpelRuntime().isPartnerRoleEndpointInitialized(
_scopeFrame.resolve(onMessage.partnerLink))
||
!onMessage.partnerLink.initializePartnerRole) {
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/REPLY.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/REPLY.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/REPLY.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/REPLY.java
Thu Oct 30 17:20:55 2008
@@ -55,9 +55,13 @@
for (OScope.CorrelationSet cset : oreply.initCorrelations)
initializeCorrelation(_scopeFrame.resolve(cset),
_scopeFrame.resolve(oreply.variable));
- // send reply
- getBpelRuntime().reply(_scopeFrame.resolve(oreply.partnerLink),
oreply.operation.getName(),
- oreply.messageExchangeId, (Element)msg, oreply.fault);
+ // send reply
+ if (oreply.resource != null)
+ getBpelRuntime().reply(_scopeFrame.resolve(oreply.resource),
+ oreply.messageExchangeId, (Element)msg, oreply.fault);
+ else
+
getBpelRuntime().reply(_scopeFrame.resolve(oreply.partnerLink),
oreply.operation.getName(),
+ oreply.messageExchangeId, (Element)msg, oreply.fault);
} catch (FaultException e) {
__log.error(e);
fault = createFault(e.getQName(), oreply);
Added:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ResourceInstance.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ResourceInstance.java?rev=709307&view=auto
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ResourceInstance.java
(added)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ResourceInstance.java
Thu Oct 30 17:20:55 2008
@@ -0,0 +1,50 @@
+package org.apache.ode.bpel.rtrep.v2;
+
+import org.apache.ode.bpel.rapi.ResourceModel;
+import org.apache.ode.bpel.rapi.Resource;
+import org.apache.ode.utils.ObjectPrinter;
+
+import java.io.Serializable;
+
+/**
+ * Serializable reference to a resource instance.
+ */
+public class ResourceInstance implements Serializable, Resource {
+
+ private Long scopeInstanceId;
+ private OResource resource;
+
+ public ResourceInstance(Long scopeInstanceId, OResource resource) {
+ this.scopeInstanceId = scopeInstanceId;
+ this.resource = resource;
+ }
+
+ public String getName() {
+ return resource.getName();
+ }
+
+ public Long getScopeInstanceId() {
+ return scopeInstanceId;
+ }
+
+ public ResourceModel getModel() {
+ return resource;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.scopeInstanceId.hashCode() ^ this.resource.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ ResourceInstance other = (ResourceInstance) obj;
+ return scopeInstanceId.equals(other.getScopeInstanceId()) &&
resource.equals(other.getModel());
+ }
+
+ @Override
+ public String toString() {
+ return ObjectPrinter.toString(this, new Object[] { "resourceDecl",
resource, "scopeInstanceId",
+ scopeInstanceId });
+ }
+}
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/RuntimeInstanceImpl.java
Thu Oct 30 17:20:55 2008
@@ -107,6 +107,10 @@
_brc.initializePartnerLinks(parentScopeId, partnerLinks);
}
+ public void initializeResource(Long scopeInstanceId, OResource resource,
String url) {
+ _brc.initializeResource(scopeInstanceId, resource, url);
+ }
+
public void select(PickResponseChannel pickResponseChannel, Date timeout,
boolean createInstance, Selector[] selectors)
throws FaultException {
@@ -121,10 +125,11 @@
_brc.select(pickResponseChannelStr, timeout, selectors);
}
- public void checkResourceRoute(String url, String method, String mexRef,
PickResponseChannel pickResponseChannel, int selectorIdx) {
+ public void checkResourceRoute(ResourceInstance resourceInstance, String
mexRef,
+ PickResponseChannel pickResponseChannel,
int selectorIdx) {
final String pickResponseChannelStr = pickResponseChannel.export();
- getORM().register(pickResponseChannelStr, url, method, mexRef);
- _brc.checkResourceRoute(url, method, pickResponseChannelStr,
selectorIdx);
+ getORM().register(pickResponseChannelStr, resourceInstance,
resourceInstance.getModel().getMethod(), mexRef);
+ _brc.checkResourceRoute(resourceInstance, pickResponseChannelStr,
selectorIdx);
}
public CorrelationKey readCorrelation(CorrelationSetInstance cset) {
@@ -436,9 +441,6 @@
_brc.sendEvent(evt);
}
- /**
- * Proxy to [EMAIL PROTECTED] IOContext#reply(PartnerLink, String, String,
Element, QName) }.
- */
public void reply(PartnerLinkInstance plink, String opName, String
bpelmex, Element element, QName fault) throws FaultException {
String mexid = getORM().release(plink, opName, bpelmex);
if (mexid == null)
@@ -453,6 +455,20 @@
}
}
+ public void reply(ResourceInstance resource, String bpelmex, Element
element, QName fault) throws FaultException {
+ String mexid = getORM().release(resource,
resource.getModel().getMethod(), bpelmex);
+ if (mexid == null)
+ throw new
FaultException(_runtime._oprocess.constants.qnMissingRequest);
+
+ try {
+ _brc.reply(mexid, resource, element, fault);
+ } catch (NoSuchOperationException e) {
+ // reply to operation that is either not defined or one-way.
Perhaps this should be detected at compile time?
+ throw new
FaultException(_runtime._oprocess.constants.qnMissingRequest,
+ "Undefined two-way operation \"" + resource + "\".");
+ }
+ }
+
/**
* Proxy to [EMAIL PROTECTED] ProcessControlContext#forceFlush() }.
*/
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/SCOPE.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/SCOPE.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/SCOPE.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/SCOPE.java
Thu Oct 30 17:20:55 2008
@@ -19,12 +19,7 @@
package org.apache.ode.bpel.rtrep.v2;
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
import javax.xml.namespace.QName;
@@ -41,8 +36,11 @@
import org.apache.ode.bpel.rtrep.v2.channels.TerminationChannel;
import org.apache.ode.bpel.rtrep.v2.channels.TerminationChannelListener;
import org.apache.ode.bpel.rapi.InvalidProcessException;
+import org.apache.ode.bpel.rapi.ResourceModel;
+import org.apache.ode.bpel.common.FaultException;
import org.apache.ode.jacob.ChannelListener;
import org.apache.ode.jacob.SynchChannel;
+import org.apache.ode.utils.GUID;
import org.w3c.dom.Element;
/**
@@ -94,6 +92,21 @@
getBpelRuntime().initializePartnerLinks(_scopeFrame.scopeInstanceId,
_oscope.partnerLinks.values());
+ // Initializing resource values
+ for (Map.Entry<String,OResource> resource :
_oscope.resource.entrySet()) {
+ try {
+ String url =
getBpelRuntime().getExpLangRuntime().evaluateAsString(
+ resource.getValue().getSubpath(),
getEvaluationContext());
+ // TODO implement a better URL building heuristic
+ url = url + "/" + new GUID().toString();
+
+
getBpelRuntime().initializeResource(_scopeFrame.scopeInstanceId,
resource.getValue(), url);
+ } catch (FaultException e) {
+ _self.parent.completed(new FaultData(e.getQName(),
resource.getValue(),
+ "Error in resource evaluation: " + e.toString()),
CompensationHandler.emptySet());
+ }
+ }
+
sendEvent(new ScopeStartEvent());
instance(new ACTIVE());
}
Modified:
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ScopeFrame.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ScopeFrame.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ScopeFrame.java
(original)
+++
ode/branches/restful/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/ScopeFrame.java
Thu Oct 30 17:20:55 2008
@@ -102,6 +102,10 @@
else return null;
}
+ public ResourceInstance resolve(OResource resource) {
+ return new
ResourceInstance(find(resource.getDeclaringScope()).scopeInstanceId, resource);
+ }
+
public PartnerLinkInstance resolve(OPartnerLink partnerLink) {
return new
PartnerLinkInstance(find(partnerLink.declaringScope).scopeInstanceId,
partnerLink);
}
Modified:
ode/branches/restful/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java
URL:
http://svn.apache.org/viewvc/ode/branches/restful/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java?rev=709307&r1=709306&r2=709307&view=diff
==============================================================================
---
ode/branches/restful/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java
(original)
+++
ode/branches/restful/runtimes/src/test/java/org/apache/ode/bpel/rtrep/v2/CoreBpelTest.java
Thu Oct 30 17:20:55 2008
@@ -112,7 +112,15 @@
return null; //To change body of implemented methods use File |
Settings | File Templates.
}
- public void checkResourceRoute(String url, String method,
PickResponseChannel pickResponseChannel, int selectorIdx) {
+ public void initializeResource(Long parentScopeId, OResource resource,
String url) {
+ //To change body of implemented methods use File | Settings | File
Templates.
+ }
+
+ public void checkResourceRoute(ResourceInstance resourceInstance, String
mexRef, PickResponseChannel pickResponseChannel, int selectorIdx) {
+ //To change body of implemented methods use File | Settings | File
Templates.
+ }
+
+ public void reply(ResourceInstance resource, String bpelmex, Element
element, QName fault) throws FaultException {
//To change body of implemented methods use File | Settings | File
Templates.
}