Recreating resources from routes on restart.

git-svn-id: https://svn.apache.org/repos/asf/ode/branches/restful@758875 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java b/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
index 7addf97..5b63672 100644
--- a/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
+++ b/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
@@ -24,4 +24,6 @@
     ActivityModel getChild(final int id);
 
     int getModelVersion();
+
+    byte[] getGlobalState();
 }
diff --git a/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java b/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java
index cb188dc..8dfc11b 100644
--- a/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java
+++ b/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java
@@ -123,4 +123,8 @@
 
     void deleteResourceRoute(String url, String method);
 
+    /**
+     * Potentially loads a lot of (small) records, handle with care.
+     */
+    List<ResourceRouteDAO> getAllResourceRoutes();
 }
diff --git a/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java b/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
index 2b3dc39..797a75f 100644
--- a/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
+++ b/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
@@ -102,6 +102,14 @@
                 .setString("url", url).setString("method", method).executeUpdate();
     }
 
+    public List<ResourceRouteDAO> getAllResourceRoutes() {
+        List<HResourceRoute> hrr = _session.createCriteria(HResourceRoute.class).list();
+        ArrayList<ResourceRouteDAO> rr = new ArrayList<ResourceRouteDAO>(hrr.size());
+        for (HResourceRoute hroute : hrr)
+            rr.add(new ResourceRouteDaoImpl(_sm, hroute));
+        return rr;
+    }
+
     public ProcessDAO createProcess(QName pid, QName type, String guid, long version) {
         HProcess process = new HProcess();
         process.setProcessId(pid.toString());
diff --git a/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java b/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
index c5d9151..9fa7347 100644
--- a/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
+++ b/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
@@ -307,6 +307,10 @@
         return m;
     }
 
+    public List<ResourceRouteDAO> getAllResourceRoutes() {
+        return _em.createQuery("select r from ResourceRouteDAOImpl r").getResultList();
+    }
+
     public void deleteResourceRoute(String url, String method) {
         _em.createQuery("delete from ResourceRouteDAOImpl r where r._url = ?1 and r._method = ?2")
             .setParameter(1, url).setParameter(2, method).executeUpdate();
diff --git a/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java b/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
index cc42395..1a16464 100644
--- a/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
+++ b/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
@@ -343,7 +343,7 @@
             ODEProcess process;
             if (conf.isRestful()) {
                 ODERESTProcess restProcess = new ODERESTProcess(this, conf, null, _incomingMexCache);
-                for (String resUrl : restProcess.getInitialResourceUrls()) {
+                for (String resUrl : restProcess.initResources()) {
                     _restServiceMap.put(resUrl, restProcess);
                 }
                 process = restProcess;
diff --git a/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java b/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
index 790e39a..02a4a92 100644
--- a/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
+++ b/engine/src/main/java/org/apache/ode/bpel/engine/ODERESTProcess.java
@@ -12,6 +12,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Callable;
 
@@ -28,7 +29,7 @@
         _runtime.init(_pconf, _processModel);
     }
 
-    public Collection<String> getInitialResourceUrls() {
+    public Collection<String> initResources() {
         if (_staticResources.size() > 0 ) return _staticResources.values();
 
         // Caching instantiating resource urls as those can be expressions
@@ -49,6 +50,26 @@
 
     void activate() {
         bounceProcessDAO();
+        // Resources to activate are the instantiating ones plus the waiting routes.
+
+        List<ResourceRouteDAO> rrDaos;
+        try {
+            rrDaos = _contexts.execTransaction(new Callable<List<ResourceRouteDAO>>() {
+                public List<ResourceRouteDAO> call() throws Exception {
+                    return _contexts.dao.getConnection().getAllResourceRoutes();
+                }
+            });
+        } catch (Exception ex) {
+            String errmsg = "DbError";
+            __log.error(errmsg, ex);
+            throw new BpelEngineException(errmsg, ex);
+        }
+
+        for (ResourceRouteDAO rrDao : rrDaos) {
+            Resource resource = new Resource(rrDao.getUrl(), "application/xml", rrDao.getMethod());
+            _contexts.bindingContext.activateProvidedResource(resource);
+            _instantiatingResources.add(resource);
+        }
 
         // Activating instantiating resources
         for (ResourceModel resourceModel : _staticResources.keySet()) {
diff --git a/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java b/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java
index 5c5dfcc..8e95989 100644
--- a/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java
+++ b/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java
@@ -239,6 +239,10 @@
         _resRouteStore.remove(url+"~"+method);
     }
 
+    public List<ResourceRouteDAO> getAllResourceRoutes() {
+        return new ArrayList<ResourceRouteDAO>(_resRouteStore.values());
+    }
+
     public void addResourceRoute(ResourceRouteDAOImpl rroute) {
         _resRouteStore.put(rroute.getUrl()+"~"+rroute.getMethod(), rroute);
     }
diff --git a/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java b/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java
index 12734f3..ce5a980 100644
--- a/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java
+++ b/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/OProcess.java
@@ -217,4 +217,8 @@
     public Collection<? extends ResourceModel> getProvidedResources() {
         return null;
     }
+
+    public byte[] getGlobalState() {
+        return null;
+    }
 }
diff --git a/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java b/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java
index 0980c69..198b38e 100644
--- a/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java
+++ b/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v2/OProcess.java
@@ -242,4 +242,8 @@
     public int getModelVersion() {
         return 2;
     }
+
+    public byte[] getGlobalState() {
+        return globalState;
+    }
 }