You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/04/03 20:06:39 UTC

svn commit: r761744 [2/2] - in /ode/branches/APACHE_ODE_1.X: ./ agents/ agents/src/ agents/src/main/ agents/src/main/java/ agents/src/main/java/org/ agents/src/main/java/org/apache/ agents/src/main/java/org/apache/ode/ agents/src/main/java/org/apache/o...

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelProcess.java Fri Apr  3 18:06:37 2009
@@ -21,7 +21,6 @@
 import java.io.InputStream;
 import java.net.URI;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -33,6 +32,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ode.agents.memory.SizingAgent;
 import org.apache.ode.bpel.common.FaultException;
 import org.apache.ode.bpel.common.ProcessState;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
@@ -50,6 +50,7 @@
 import org.apache.ode.bpel.iapi.PartnerRoleChannel;
 import org.apache.ode.bpel.iapi.ProcessConf;
 import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
+import org.apache.ode.bpel.intercept.InstanceCountThrottler;
 import org.apache.ode.bpel.intercept.InterceptorInvoker;
 import org.apache.ode.bpel.intercept.MessageExchangeInterceptor;
 import org.apache.ode.bpel.o.OElementVarType;
@@ -61,7 +62,6 @@
 import org.apache.ode.bpel.runtime.ExpressionLanguageRuntimeRegistry;
 import org.apache.ode.bpel.runtime.PROCESS;
 import org.apache.ode.bpel.runtime.PropertyAliasEvaluationContext;
-import org.apache.ode.bpel.runtime.InvalidProcessException;
 import org.apache.ode.bpel.runtime.channels.FaultData;
 import org.apache.ode.jacob.soup.ReplacementMap;
 import org.apache.ode.utils.ObjectPrinter;
@@ -123,11 +123,20 @@
 
     private ExternalVariableManager _evm;
 
+	public static final QName PROP_PATH = new QName("PATH"); 
+	public static final QName PROP_SVG = new QName("SVG"); 
+	public static final QName PROP_LAZY_HYDRATE = new QName("process.hydration.lazy");
+    public static final QName PROP_MAX_INSTANCES = new QName("process.instance.throttled.maximum.count");
+    
+    // The ratio of in-memory vs serialized size of compiled bpel object.
+    private static final int PROCESS_MEMORY_TO_SERIALIZED_SIZE_RATIO = 5;
+	
     public BpelProcess(ProcessConf conf) {
         _pid = conf.getProcessId();
         _pconf = conf;
         _hydrationLatch = new HydrationLatch();
     }
+    
 
     /**
      * Retrives the base URI to use for local resource resolution.
@@ -358,8 +367,8 @@
      *            message exchange
      * @return <code>true</code> if execution should continue, <code>false</code> otherwise
      */
-    boolean processInterceptors(MyRoleMessageExchangeImpl mex, InterceptorInvoker invoker) {
-        InterceptorContextImpl ictx = new InterceptorContextImpl(_engine._contexts.dao.getConnection(), getProcessDAO(), _pconf);
+    public boolean processInterceptors(MyRoleMessageExchangeImpl mex, InterceptorInvoker invoker) {
+        InterceptorContextImpl ictx = new InterceptorContextImpl(_engine._contexts.dao.getConnection(), getProcessDAO(), _pconf, _engine, this);
 
         for (MessageExchangeInterceptor i : _mexInterceptors)
             if (!mex.processInterceptor(i, mex, ictx, invoker))
@@ -390,26 +399,7 @@
                     __log.debug("InvokeInternal event for mexid " + we.getMexId());
                 }
                 MyRoleMessageExchangeImpl mex = (MyRoleMessageExchangeImpl) _engine.getMessageExchange(we.getMexId());
-                try {
-                    invokeProcess(mex);
-                } catch (InvalidProcessException e) {
-                    // we're invoking a target process, trying to see if we can retarget the message
-                    // to the current version (only applies when it's a new process creation)
-                    if (e.getCauseCode() == InvalidProcessException.RETIRED_CAUSE_CODE) {
-                        boolean found = false;
-                        for (BpelProcess process : getEngine()._activeProcesses.values()) {
-                            if (process.getConf().getState().equals(org.apache.ode.bpel.iapi.ProcessState.ACTIVE)
-                                    && process.getConf().getType().equals(getConf().getType())) {
-                                we.setProcessId(process._pid);
-                                mex._process = process;
-                                found = true;
-                                process.handleWorkEvent(jobData);
-                                break;
-                            }
-                        }
-                        if (!found) throw e;
-                    } else throw e;
-                }
+                invokeProcess(mex);
             } else {
                 // Instance level events
                 ProcessInstanceDAO procInstance = getProcessDAO().getInstance(we.getIID());
@@ -550,6 +540,9 @@
         _sharedEps = _engine.getSharedEndpoints();
         _debugger = createDebuggerSupport();
 
+    	if (getInstanceMaximumCount() < Integer.MAX_VALUE)
+            registerMessageExchangeInterceptor(new InstanceCountThrottler());
+    	
         __log.debug("Activating " + _pid);
         // Activate all the my-role endpoints.
         for (Map.Entry<String, Endpoint> entry : _pconf.getProvideEndpoints().entrySet()) {
@@ -560,7 +553,7 @@
                 initialEPR = _sharedEps.getEndpointReference(endpoint);
                 if (initialEPR == null) {
                     // Create an EPR by physically activating the endpoint
-                    initialEPR = _engine._contexts.bindingContext.activateMyRoleEndpoint(_pid, entry.getValue());
+                    initialEPR = _engine._contexts.bindingContext.activateMyRoleEndpoint(_pid, endpoint);
                     _sharedEps.addEndpoint(endpoint, initialEPR);
                     __log.debug("Activated " + _pid + " myrole " + entry.getKey() + ": EPR is " + initialEPR);
                 }
@@ -568,7 +561,7 @@
                 _sharedEps.incrementReferenceCount(endpoint);
             } else {
                 // Create an EPR by physically activating the endpoint
-                initialEPR = _engine._contexts.bindingContext.activateMyRoleEndpoint(_pid, entry.getValue());
+                initialEPR = _engine._contexts.bindingContext.activateMyRoleEndpoint(_pid, endpoint);
                 __log.debug("Activated " + _pid + " myrole " + entry.getKey() + ": EPR is " + initialEPR);
             }
             _myEprs.put(endpoint, initialEPR);
@@ -637,7 +630,7 @@
         }
     }
 
-    protected QName getPID() {
+    public QName getPID() {
         return _pid;
     }
 
@@ -891,7 +884,7 @@
                 __log.error(errmsg);
                 throw new BpelEngineException(errmsg, e);
             }
-
+            
         	if (_partnerRoles == null) {
                 _partnerRoles = new HashMap<OPartnerLink, PartnerLinkPartnerRoleImpl>();
         	}
@@ -937,6 +930,7 @@
                                 + prole._initialEPR);
                     }
                 }
+                _engine.setProcessSize(_pid, true);
                 _hydratedOnce = true;
             }
 
@@ -975,12 +969,17 @@
                 } catch (Exception ex) {
                     String errmsg = "DbError";
                     __log.error(errmsg, ex);
+                    ex.printStackTrace();
                     throw new BpelEngineException(errmsg, ex);
                 }
             }
         }
 
     }
+    
+    public int getInstanceInUseCount() {
+    	return hintIsHydrated() ? _hydrationLatch.getDepth(1) : 0;
+    }
 
     private void registerExprLang(OProcess oprocess) {
         for (OExpressionLanguage elang : oprocess.expressionLanguages) {
@@ -1039,8 +1038,59 @@
 	}
 	
 	private boolean hasActiveInstances(ProcessDAO processDAO) {
-    	Collection<ProcessInstanceDAO> activeInstances = processDAO.getActiveInstances();
-		return (activeInstances != null && activeInstances.size() > 0);
+		// Select count of instances instead of all active instances 
+    	// Collection<ProcessInstanceDAO> activeInstances = processDAO.getActiveInstances();
+		// return (activeInstances != null && activeInstances.size() > 0);
+		return processDAO.getNumInstances() > 0;
+	}
+
+    public void registerMessageExchangeInterceptor(MessageExchangeInterceptor interceptor) {
+    	_mexInterceptors.add(interceptor);
+    }
+    
+    public void unregisterMessageExchangeInterceptor(MessageExchangeInterceptor interceptor) {
+    	_mexInterceptors.remove(interceptor);
+    }
+    
+	public long sizeOf() {
+		// try to get actual size from sizing agent, if enabled
+		long footprint = SizingAgent.deepSizeOf(this);
+		// if unsuccessful, estimate size (this is a inaccurate guess)
+		if (footprint == 0) {
+			footprint = getEstimatedHydratedSize();
+		}
+		// add the sizes of all the services this process provides
+		for (EndpointReference myEpr : _myEprs.values()) {
+			footprint += _engine._contexts.bindingContext.calculateSizeofService(myEpr);
+		}
+		// return the total footprint
+		return footprint;
+	}
+	
+	public String getProcessProperty(QName property, String defaultValue) {
+		Text text = (Text) getProcessProperty(property);
+		if (text == null) {
+			return defaultValue;
+		}
+		String value = text.getWholeText();
+		return (value == null) ?  defaultValue : value;
+	}
+
+	public boolean isHydrationLazy() {
+		return Boolean.valueOf(getProcessProperty(PROP_LAZY_HYDRATE, "true"));
+	}
+	
+	public boolean isHydrationLazySet() {
+		return getProcessProperty(PROP_LAZY_HYDRATE) != null;
+	}
+
+	public int getInstanceMaximumCount() {
+		return Integer.valueOf(getProcessProperty(PROP_MAX_INSTANCES, Integer.toString(_engine.getInstanceThrottledMaximumCount())));
+	}
+
+	public long getEstimatedHydratedSize() {
+        return _pconf.getCBPFileSize() * 
+        			PROCESS_MEMORY_TO_SERIALIZED_SIZE_RATIO;
 	}
 
     public long getTimeout(OPartnerLink partnerLink) {

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java Fri Apr  3 18:06:37 2009
@@ -24,6 +24,7 @@
 import java.util.*;
 
 import javax.wsdl.Operation;
+import javax.wsdl.OperationType;
 import javax.xml.namespace.QName;
 
 import org.apache.commons.logging.Log;

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java Fri Apr  3 18:06:37 2009
@@ -88,9 +88,10 @@
 
     private State _state = State.SHUTDOWN;
     private Contexts _contexts = new Contexts();
+    private Properties _configProperties;
     private DehydrationPolicy _dehydrationPolicy;
     private boolean _hydrationLazy;
-    private Properties _configProperties;
+	private int _hydrationLazyMinimumSize;
     
     BpelEngineImpl _engine;
     protected BpelDatabase _db;
@@ -289,8 +290,10 @@
 
             _engine.registerProcess(process);
             _registeredProcesses.add(process);
-            if (!_hydrationLazy) {
+            if (!isLazyHydratable(process)) {
             	process.hydrate();
+            } else {
+            	_engine.setProcessSize(process.getPID(), false);
             }
 
             __log.info(__msgs.msgProcessRegistered(conf.getProcessId()));
@@ -298,6 +301,16 @@
             _mngmtLock.writeLock().unlock();
         }
     }
+        
+    private boolean isLazyHydratable(BpelProcess process) {
+    	if (process.isHydrationLazySet()) {
+    		return process.isHydrationLazy();
+    	}
+    	if (!_hydrationLazy) {
+    		return false;
+    	}
+    	return process.getEstimatedHydratedSize() < _hydrationLazyMinimumSize;
+    }
 
     // enable extensibility
     protected BpelProcess createBpelProcess(ProcessConf conf) {
@@ -343,7 +356,7 @@
      */
     public void registerMessageExchangeInterceptor(MessageExchangeInterceptor interceptor) {
         // NOTE: do not synchronize, globalInterceptors is copy-on-write.
-        _contexts.globalIntereceptors.add(interceptor);
+        _contexts.globalInterceptors.add(interceptor);
     }
 
     /**
@@ -352,7 +365,7 @@
      */
     public void unregisterMessageExchangeInterceptor(MessageExchangeInterceptor interceptor) {
         // NOTE: do not synchronize, globalInterceptors is copy-on-write.
-        _contexts.globalIntereceptors.remove(interceptor);
+        _contexts.globalInterceptors.remove(interceptor);
     }
 
     /**
@@ -480,4 +493,22 @@
 		this._hydrationLazy = hydrationLazy;
 	}
 
+	public void setProcessThrottledMaximumSize(
+			long hydrationThrottledMaximumSize) {
+		_engine.setProcessThrottledMaximumSize(hydrationThrottledMaximumSize);
+	}
+	
+	public void setProcessThrottledMaximumCount(
+			int hydrationThrottledMaximumCount) {
+		_engine.setProcessThrottledMaximumCount(hydrationThrottledMaximumCount);
+	}
+
+	public void setHydrationLazyMinimumSize(int hydrationLazyMinimumSize) {
+		this._hydrationLazyMinimumSize = hydrationLazyMinimumSize;
+	}
+
+	public void setInstanceThrottledMaximumCount(
+			int instanceThrottledMaximumCount) {
+		_engine.setInstanceThrottledMaximumCount(instanceThrottledMaximumCount);
+	}
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/Contexts.java Fri Apr  3 18:06:37 2009
@@ -52,7 +52,7 @@
     BpelDAOConnectionFactory inMemDao;
 
     /** Global Message-Exchange interceptors. Must be copy-on-write!!! */ 
-    final List<MessageExchangeInterceptor >globalIntereceptors = new CopyOnWriteArrayList<MessageExchangeInterceptor>();
+    final List<MessageExchangeInterceptor >globalInterceptors = new CopyOnWriteArrayList<MessageExchangeInterceptor>();
 
     /** Global event listeners. Must be copy-on-write!!! */
     final List<BpelEventListener> eventListeners = new CopyOnWriteArrayList<BpelEventListener>();

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/InterceptorContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/InterceptorContextImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/InterceptorContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/InterceptorContextImpl.java Fri Apr  3 18:06:37 2009
@@ -20,6 +20,7 @@
 
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.iapi.BpelEngine;
 import org.apache.ode.bpel.iapi.ProcessConf;
 import org.apache.ode.bpel.intercept.MessageExchangeInterceptor.InterceptorContext;
 
@@ -33,11 +34,15 @@
     private ProcessDAO _processDao;
     private BpelDAOConnection _connection;
     private ProcessConf _pconf;
+    private BpelEngine _bpelEngine;
+    private BpelProcess _bpelProcess;
 
-    public InterceptorContextImpl(BpelDAOConnection connection, ProcessDAO processDAO, ProcessConf pconf) {
+    public InterceptorContextImpl(BpelDAOConnection connection, ProcessDAO processDAO, ProcessConf pconf, BpelEngine bpelEngine, BpelProcess bpelProcess) {
         _connection = connection;
         _processDao = processDAO;
         _pconf = pconf;
+        _bpelEngine = bpelEngine;
+        _bpelProcess = bpelProcess;
     }
 
     public BpelDAOConnection getConnection() {
@@ -51,5 +56,13 @@
     public ProcessConf getProcessConf() {
         return _pconf;
     }
+    
+    public BpelEngine getBpelEngine() {
+    	return _bpelEngine;
+    }
+    
+    public BpelProcess getBpelProcess() {
+    	return _bpelProcess;
+    }
 
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java Fri Apr  3 18:06:37 2009
@@ -155,6 +155,8 @@
         setStatus(Status.FAULT);
         getDAO().setFault(faultType);
         getDAO().setResponse(((MessageImpl)outputFaultMessage)._dao);
+        
+        responseReceived();
     }
 
     void setFaultExplanation(String explanation) {

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java Fri Apr  3 18:06:37 2009
@@ -19,6 +19,7 @@
 
 package org.apache.ode.bpel.engine;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.ArrayList;
@@ -79,7 +80,7 @@
      */
     private boolean processInterceptors(MyRoleMessageExchangeImpl mex, InterceptorInvoker invoker) {
         InterceptorContextImpl ictx = new InterceptorContextImpl(_engine._contexts.dao.getConnection(), 
-                mex._dao.getProcess(), null);
+                mex._dao.getProcess(), null, _engine, _process);
 
         for (MessageExchangeInterceptor i : _engine.getGlobalInterceptors())
             if (!processInterceptor(i, mex, ictx, invoker))
@@ -184,7 +185,9 @@
 
     public void release(boolean instanceSucceeded) {
         if(__log.isDebugEnabled()) __log.debug("Releasing mex " + getMessageExchangeId());
-        _dao.release(_process.isCleanupCategoryEnabled(instanceSucceeded, CLEANUP_CATEGORY.MESSAGES));
+        if (_process != null) {
+	        _dao.release(_process.isCleanupCategoryEnabled(instanceSucceeded, CLEANUP_CATEGORY.MESSAGES));
+        }
         _dao = null;
     }
     

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/NStateLatch.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/NStateLatch.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/NStateLatch.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/NStateLatch.java Fri Apr  3 18:06:37 2009
@@ -119,4 +119,8 @@
             _lock.unlock();
         }
     }
+    
+    public int getDepth(int state) {
+        return (_state == state ? _depth : 0);
+    }
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/PartnerLinkMyRoleImpl.java Fri Apr  3 18:06:37 2009
@@ -184,7 +184,7 @@
 
         if (!_process.processInterceptors(mex, InterceptorInvoker.__onNewInstanceInvoked)) {
             __log.debug("Not creating a new instance for mex " + mex + "; interceptor prevented!");
-            return;
+            throw new InvalidProcessException("Cannot instantiate process '" + _process.getPID() + "' any more.", InvalidProcessException.TOO_MANY_INSTANCES_CAUSE_CODE);
         }
 
         ProcessInstanceDAO newInstance = processDAO.createInstance(routing.correlator);

Added: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InstanceCountThrottler.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InstanceCountThrottler.java?rev=761744&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InstanceCountThrottler.java (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InstanceCountThrottler.java Fri Apr  3 18:06:37 2009
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.intercept;
+
+import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+import javax.xml.namespace.QName;
+import java.util.Map;
+
+/**
+ * An example of a  simple interceptor providing a "throttling"  capability - that is an 
+ * ability to limit the number of instances created for a given process.
+ * 
+ * @author Maciej Szefler
+ */
+public class InstanceCountThrottler extends NoOpInterceptor {
+
+    @Override
+    public void onNewInstanceInvoked(MyRoleMessageExchange mex,
+                                     InterceptorContext ic) throws FailMessageExchangeException {
+        if (ic.getProcessDAO().getNumInstances() >= ic.getBpelProcess().getInstanceMaximumCount())
+            throw new FailMessageExchangeException("Too many instances.");
+    }
+}

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InterceptorInvoker.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InterceptorInvoker.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InterceptorInvoker.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/InterceptorInvoker.java Fri Apr  3 18:06:37 2009
@@ -50,6 +50,14 @@
 		}
 	};
 
+	/** Invoke {@link MessageExchangeInterceptor#onBpelServerInvoked(MyRoleMessageExchange, InterceptorContext)} */
+	public static final InterceptorInvoker __onJobScheduled = new InterceptorInvoker("onJobScheduled") {
+		public void invoke(MessageExchangeInterceptor i, MessageExchange mex, InterceptorContext ictx) 
+			throws FailMessageExchangeException, FaultMessageExchangeException {
+			i.onJobScheduled((MyRoleMessageExchange) mex, ictx);
+		}
+	};
+	
 	/** Invoke {@link MessageExchangeInterceptor#onPartnerInvoked(PartnerRoleMessageExchange, InterceptorContext)} */
 	public static final InterceptorInvoker __onPartnerInvoked = new InterceptorInvoker("onPartnerInvoked") {
 		public void invoke(MessageExchangeInterceptor i, MessageExchange mex, InterceptorContext ictx) 

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/MessageExchangeInterceptor.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/MessageExchangeInterceptor.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/MessageExchangeInterceptor.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/MessageExchangeInterceptor.java Fri Apr  3 18:06:37 2009
@@ -20,6 +20,8 @@
 
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.engine.BpelProcess;
+import org.apache.ode.bpel.iapi.BpelEngine;
 import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
 import org.apache.ode.bpel.iapi.PartnerRoleMessageExchange;
 import org.apache.ode.bpel.iapi.ProcessConf;
@@ -34,6 +36,16 @@
 public interface MessageExchangeInterceptor {
 
     /**
+     * Called when the message is scheduled, before any attempt to
+     * invoke the BPEL server is made.
+     * 
+     * @param mex
+     *            message exchange
+     */
+    void onJobScheduled(MyRoleMessageExchange mex, InterceptorContext ic)
+        throws FailMessageExchangeException, FaultMessageExchangeException;
+    
+    /**
      * Called when the BPEL server is invoked, before any attempt to route the
      * message exchange to a process.
      * 
@@ -82,6 +94,10 @@
         ProcessDAO getProcessDAO();
 
         ProcessConf getProcessConf();
+        
+        BpelEngine getBpelEngine();
+
+		BpelProcess getBpelProcess();
 
     }
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/NoOpInterceptor.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/NoOpInterceptor.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/NoOpInterceptor.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/NoOpInterceptor.java Fri Apr  3 18:06:37 2009
@@ -31,6 +31,11 @@
  */
 public class NoOpInterceptor implements MessageExchangeInterceptor {
 
+	public void onJobScheduled(MyRoleMessageExchange mex,
+			InterceptorContext ic) throws FailMessageExchangeException,
+			FaultMessageExchangeException {
+	}
+	
 	public void onBpelServerInvoked(MyRoleMessageExchange mex,
 			InterceptorContext ic) throws FailMessageExchangeException,
 			FaultMessageExchangeException {

Added: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessCountThrottler.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessCountThrottler.java?rev=761744&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessCountThrottler.java (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessCountThrottler.java Fri Apr  3 18:06:37 2009
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.intercept;
+
+import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
+import org.apache.ode.bpel.runtime.InvalidProcessException;
+
+/**
+ * An example of a  simple interceptor providing a "throttling"  capability - that is an 
+ * ability to limit the size of processes created in a server.
+ */
+public class ProcessCountThrottler extends NoOpInterceptor {
+
+    @Override
+    public void onJobScheduled(MyRoleMessageExchange mex,
+    		InterceptorContext ic) throws FailMessageExchangeException,
+    		FaultMessageExchangeException {
+    	while (ic.getBpelEngine().getHydratedProcessCount(ic.getBpelProcess().getPID()) > ic.getBpelEngine().getProcessThrottledMaximumCount()) {
+    		if (!ic.getBpelEngine().dehydrateLastUnusedProcess()) {
+    			mex.setProperty("causeCode", String.valueOf(InvalidProcessException.TOO_MANY_PROCESSES_CAUSE_CODE));
+	            throw new FailMessageExchangeException("The number of processes in-use is more than the upper limit (" + ic.getBpelEngine().getProcessThrottledMaximumCount() + ")");
+    		}
+    	}
+    }
+}

Added: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessSizeThrottler.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessSizeThrottler.java?rev=761744&view=auto
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessSizeThrottler.java (added)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/intercept/ProcessSizeThrottler.java Fri Apr  3 18:06:37 2009
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.ode.bpel.intercept;
+
+import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
+import org.apache.ode.bpel.runtime.InvalidProcessException;
+
+/**
+ * An example of a  simple interceptor providing a "throttling"  capability - that is an 
+ * ability to limit the size of processes created in a server.
+ */
+public class ProcessSizeThrottler extends NoOpInterceptor {
+
+    @Override
+    public void onJobScheduled(MyRoleMessageExchange mex,
+    		InterceptorContext ic) throws FailMessageExchangeException,
+    		FaultMessageExchangeException {
+    	while (ic.getBpelEngine().getHydratedProcessSize(ic.getBpelProcess().getPID()) > ic.getBpelEngine().getProcessThrottledMaximumSize()) {
+    		if (!ic.getBpelEngine().dehydrateLastUnusedProcess()) {
+    			mex.setProperty("causeCode", String.valueOf(InvalidProcessException.TOO_HUGE_PROCESSES_CAUSE_CODE));
+	            throw new FailMessageExchangeException("The size of all running processes is more than the upper limit (" + ic.getBpelEngine().getProcessThrottledMaximumSize() + ")");
+    		}
+    	}
+    }
+}

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/runtime/InvalidProcessException.java Fri Apr  3 18:06:37 2009
@@ -31,6 +31,12 @@
 
     public final static int RETIRED_CAUSE_CODE = 1;
 
+    public final static int TOO_MANY_INSTANCES_CAUSE_CODE = 2;
+    
+    public final static int TOO_MANY_PROCESSES_CAUSE_CODE = 3;
+    
+    public final static int TOO_HUGE_PROCESSES_CAUSE_CODE = 4;
+    
     private final int causeCode;
 
     public InvalidProcessException(String msg, Throwable cause) {

Modified: ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-runtime/src/test/java/org/apache/ode/bpel/runtime/MockBpelServer.java Fri Apr  3 18:06:37 2009
@@ -263,6 +263,10 @@
                     public void close() { };
                 };
             }
+
+			public long calculateSizeofService(EndpointReference epr) {
+				return 0;
+			}
         };
         return _bindContext;
     }

Modified: ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-store/src/main/java/org/apache/ode/store/ProcessConfImpl.java Fri Apr  3 18:06:37 2009
@@ -227,6 +227,13 @@
         }
     }
 
+    public long getCBPFileSize() {
+        CBPInfo cbpInfo = _du.getCBPInfo(getType());
+        if (cbpInfo == null)
+            throw new ContextException("CBP record not found for type " + getType());
+        return cbpInfo.cbp.length();
+    }
+    
     public String getBpelDocument() {
         CBPInfo cbpInfo = _du.getCBPInfo(getType());
         if (cbpInfo == null)

Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/BindingContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/BindingContextImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/BindingContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/BindingContextImpl.java Fri Apr  3 18:06:37 2009
@@ -73,4 +73,8 @@
 		return new PartnerRoleChannelImpl();
 	}
 
+	public long calculateSizeofService(EndpointReference epr) {
+		return 0;
+	}
+
 }

Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/MessageExchangeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/MessageExchangeContextImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/MessageExchangeContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/main/java/org/apache/ode/test/MessageExchangeContextImpl.java Fri Apr  3 18:06:37 2009
@@ -38,20 +38,21 @@
 
 package org.apache.ode.test;
 
+import java.io.IOException;
+
+import javax.xml.namespace.QName;
+
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.ContextException;
 import org.apache.ode.bpel.iapi.Message;
-import org.apache.ode.bpel.iapi.MessageExchange.Status;
 import org.apache.ode.bpel.iapi.MessageExchangeContext;
 import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
 import org.apache.ode.bpel.iapi.PartnerRoleMessageExchange;
+import org.apache.ode.bpel.iapi.MessageExchange.Status;
 import org.apache.ode.utils.DOMUtils;
 import org.w3c.dom.Element;
 import org.xml.sax.SAXException;
 
-import javax.xml.namespace.QName;
-import java.io.IOException;
-
 /**
  * This is a simple MessageExchangeContext implementation
  * that only supports a set of "well known" portTypes used

Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/BasicActivities20Test.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/BasicActivities20Test.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/BasicActivities20Test.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/BasicActivities20Test.java Fri Apr  3 18:06:37 2009
@@ -18,16 +18,16 @@
  */
 package org.apache.ode.test;
 
-import org.apache.ode.bpel.iapi.ContextException;
-import org.apache.ode.bpel.iapi.MessageExchange;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import javax.xml.namespace.QName;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import javax.xml.namespace.QName;
+
+import org.apache.ode.bpel.iapi.ContextException;
+import org.apache.ode.bpel.iapi.MessageExchange;
+import org.junit.Test;
+
 public class BasicActivities20Test extends BPELTestAbstract {
 	
 	@Test public void testHelloWorld2() throws Throwable {

Modified: ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java (original)
+++ ode/branches/APACHE_ODE_1.X/bpel-test/src/test/java/org/apache/ode/test/StructuredActivities20Test.java Fri Apr  3 18:06:37 2009
@@ -18,7 +18,6 @@
  */
 package org.apache.ode.test;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class StructuredActivities20Test extends BPELTestAbstract {

Modified: ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java Fri Apr  3 18:06:37 2009
@@ -75,6 +75,7 @@
      private Long _instanceId;
 
 	// _instances is unused because this is a one-way relationship at the database level
+    @SuppressWarnings("unused")
     @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="INSTANCE_ID")
     private ProcessInstanceDAOImpl _instance;
 

Modified: ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java Fri Apr  3 18:06:37 2009
@@ -54,8 +54,6 @@
 
     @Basic @Column(name="PROCESS_ID")
     private String _processId;
-	@Transient
-    private int _numInstances;
 	@Basic @Column(name="PROCESS_TYPE")
     private String _processType;
 	@Basic @Column(name="GUID")
@@ -94,7 +92,6 @@
 			CorrelatorDAO instantiatingCorrelator) {
 		ProcessInstanceDAOImpl inst = new ProcessInstanceDAOImpl((CorrelatorDAOImpl)instantiatingCorrelator, this);
 		getEM().persist(inst);
-		_numInstances++;
 		return inst;
 	}
 
@@ -102,7 +99,6 @@
 			CorrelatorDAO instantiatingCorrelator, MessageExchangeDAO mex) {
 		ProcessInstanceDAOImpl inst = new ProcessInstanceDAOImpl((CorrelatorDAOImpl)instantiatingCorrelator, this);
 		getEM().persist(inst);
-		_numInstances++;
 		return inst;
 	}
 
@@ -183,7 +179,8 @@
   	}
 
     public int getNumInstances() {
-        return _numInstances;
+  		Long instanceCount = (Long) getSingleResult(getEM().createNamedQuery(ProcessInstanceDAOImpl.COUNT_INSTANCE_IDS_BY_PROCESS).setParameter("process", this));
+  		return (instanceCount == null ? 0 : instanceCount.intValue());
     }
 
     public long getVersion() {

Modified: ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java Fri Apr  3 18:06:37 2009
@@ -65,6 +65,7 @@
 @NamedQueries({
  	@NamedQuery(name=ProcessInstanceDAOImpl.DELETE_INSTANCES_BY_PROCESS, query="delete from ProcessInstanceDAOImpl as i where i._process = :process"),
  	@NamedQuery(name=ProcessInstanceDAOImpl.SELECT_INSTANCE_IDS_BY_PROCESS, query="select i._instanceId from ProcessInstanceDAOImpl as i where i._process = :process"),
+ 	@NamedQuery(name=ProcessInstanceDAOImpl.COUNT_INSTANCE_IDS_BY_PROCESS, query="select count(i._instanceId) from ProcessInstanceDAOImpl as i where i._process = :process"),
  	@NamedQuery(name=ProcessInstanceDAOImpl.SELECT_FAULT_IDS_BY_PROCESS, query="select i._faultId from ProcessInstanceDAOImpl as i where i._process = :process and i._faultId is not null"),
 	@NamedQuery(name=ProcessInstanceDAOImpl.COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID, 
 			query="select count(i._instanceId), max(i._lastRecovery) from ProcessInstanceDAOImpl as i where i._process._processId = :processId and i._state in(:states) and exists(select r from ActivityRecoveryDAOImpl r where i = r._instance)")
@@ -73,7 +74,8 @@
 	private static final Log __log = LogFactory.getLog(ProcessInstanceDAOImpl.class);
 	
 	public final static String DELETE_INSTANCES_BY_PROCESS = "DELETE_INSTANCES_BY_PROCESS";
- 	public final static String SELECT_INSTANCE_IDS_BY_PROCESS = "SELECT_INSTANCE_IDS_BY_PROCESS";
+ 	public final static String SELECT_INSTANCE_IDS_BY_PROCESS = "SELECT_INSTANCE_IDS_BY_PROCESS";
 	public final static String COUNT_INSTANCE_IDS_BY_PROCESS = "COUNT_INSTANCE_IDS_BY_PROCESS";
+
  	public final static String SELECT_FAULT_IDS_BY_PROCESS = "SELECT_FAULT_IDS_BY_PROCESS";
 	public final static String COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID = "COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID";
 	

Modified: ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/BindingContextImpl.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/BindingContextImpl.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/BindingContextImpl.java (original)
+++ ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/BindingContextImpl.java Fri Apr  3 18:06:37 2009
@@ -18,13 +18,20 @@
  */
 package org.apache.ode.jbi;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.ode.bpel.iapi.*;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.wsdl.PortType;
 import javax.xml.namespace.QName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.iapi.BindingContext;
+import org.apache.ode.bpel.iapi.ContextException;
+import org.apache.ode.bpel.iapi.Endpoint;
+import org.apache.ode.bpel.iapi.EndpointReference;
+import org.apache.ode.bpel.iapi.PartnerRoleChannel;
+
 /**
  * JBI Implementation of ODE's {@link org.apache.ode.bpel.iapi.BindingContext}
  * interface.
@@ -36,7 +43,7 @@
     private static final Log __log = LogFactory.getLog(BindingContextImpl.class);
 
     private final OdeContext _ode;
-
+    
     BindingContextImpl(OdeContext ode) {
         _ode = ode;
     }
@@ -92,4 +99,9 @@
         }
         
     }
+
+
+	public long calculateSizeofService(EndpointReference epr) {
+		return _ode.calculateSizeOfService(epr);
+	}
 }

Modified: ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java
URL: http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java?rev=761744&r1=761743&r2=761744&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java (original)
+++ ode/branches/APACHE_ODE_1.X/jbi/src/main/java/org/apache/ode/jbi/OdeContext.java Fri Apr  3 18:06:37 2009
@@ -39,10 +39,12 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.ode.agents.memory.SizingAgent;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactory;
 import org.apache.ode.bpel.engine.BpelServerImpl;
 import org.apache.ode.bpel.engine.ProcessAndInstanceManagementImpl;
 import org.apache.ode.bpel.iapi.Endpoint;
+import org.apache.ode.bpel.iapi.EndpointReference;
 import org.apache.ode.bpel.iapi.ProcessConf;
 import org.apache.ode.bpel.o.OPartnerLink;
 import org.apache.ode.bpel.o.OProcess;
@@ -115,6 +117,8 @@
 
     /** Mapping of Endpoint to OdeService */
     private Map<Endpoint, OdeService> _activeOdeServices = new ConcurrentHashMap<Endpoint, OdeService>();
+    private Map<OdeService, EndpointReference> _serviceEprMap = new HashMap<OdeService, EndpointReference>();
+
 
     /**
      * Gets the delivery channel.
@@ -214,6 +218,7 @@
         MyEndpointReference myepr = new MyEndpointReference(service);
         service.activate();
         _activeOdeServices.put(endpoint, service);
+        _serviceEprMap.put(service, myepr);
         return myepr;
 
     }
@@ -222,6 +227,7 @@
         OdeService svc = _activeOdeServices.remove(endpoint);
 
         if (svc != null) {
+            _serviceEprMap.remove(svc);
             svc.deactivate();
         }
     }
@@ -303,4 +309,16 @@
             }
         }
     }
+    
+    public long calculateSizeOfService(EndpointReference epr) {
+    	if (epr != null) {
+	    	for (OdeService odeService : _serviceEprMap.keySet()) {
+	    		EndpointReference serviceEpr = _serviceEprMap.get(odeService);
+	    		if (serviceEpr != null && epr.equals(serviceEpr)) {
+					return SizingAgent.deepSizeOf(odeService);
+	    		}
+	    	}
+    	}
+    	return 0;
+    }
 }