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.
     }
 


Reply via email to