You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2011/02/20 13:26:52 UTC

svn commit: r1072575 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne: access/DataDomain.java configuration/server/DelegatingDataSourceFactory.java conn/PoolManager.java

Author: aadamchik
Date: Sun Feb 20 12:26:51 2011
New Revision: 1072575

URL: http://svn.apache.org/viewvc?rev=1072575&view=rev
Log:
CAY-1542 DI container is not shutting down Cayenne-managed connection pool

adding manual lifecycle management code for created objects to DelegatingDataSourceFactory

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/PoolManager.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java?rev=1072575&r1=1072574&r2=1072575&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomain.java Sun Feb 20 12:26:51 2011
@@ -650,11 +650,17 @@ public class DataDomain implements Query
     @BeforeScopeEnd
     public void shutdown() {
         if (!stopped) {
+            stopped = true;
+
             if (sharedSnapshotCache != null) {
                 sharedSnapshotCache.shutdown();
             }
 
-            stopped = true;
+            // deprecated - noop code for backwards compatibility as DataNode shutdown is
+            // no longer needed
+            for (DataNode node : getDataNodes()) {
+                node.shutdown();
+            }
         }
     }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java?rev=1072575&r1=1072574&r2=1072575&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/configuration/server/DelegatingDataSourceFactory.java Sun Feb 20 12:26:51 2011
@@ -18,13 +18,19 @@
  ****************************************************************/
 package org.apache.cayenne.configuration.server;
 
+import java.lang.reflect.Method;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 import javax.sql.DataSource;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.AdhocObjectFactory;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.RuntimeProperties;
+import org.apache.cayenne.di.BeforeScopeEnd;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.di.spi.ScopeEventBinding;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -52,8 +58,48 @@ public class DelegatingDataSourceFactory
     @Inject
     protected RuntimeProperties properties;
 
+    protected Map<DataSource, ScopeEventBinding> managedDataSources;
+
+    public DelegatingDataSourceFactory() {
+        managedDataSources = new ConcurrentHashMap<DataSource, ScopeEventBinding>();
+    }
+
     public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception {
-        return getDataSourceFactory(nodeDescriptor).getDataSource(nodeDescriptor);
+        DataSource dataSource = getDataSourceFactory(nodeDescriptor).getDataSource(
+                nodeDescriptor);
+        attachToScope(dataSource);
+        return dataSource;
+    }
+
+    @BeforeScopeEnd
+    public void shutdown() {
+        for (ScopeEventBinding binding : managedDataSources.values()) {
+            binding.onScopeEvent();
+        }
+
+        managedDataSources.clear();
+    }
+
+    /**
+     * Ensure that DataSource implementations returned from this factory receive
+     * {@link BeforeScopeEnd} events.
+     */
+    protected void attachToScope(DataSource dataSource) {
+
+        // no real thread-safety here, just checking to speed up processing... in the
+        // worst case we'll replace event binding for the same pool with an equivalent one
+        if (!managedDataSources.containsKey(dataSource)) {
+
+            Class<BeforeScopeEnd> annotationType = BeforeScopeEnd.class;
+            for (Method method : dataSource.getClass().getMethods()) {
+
+                if (method.isAnnotationPresent(annotationType)) {
+                    managedDataSources.put(dataSource, new ScopeEventBinding(
+                            dataSource,
+                            method));
+                }
+            }
+        }
     }
 
     protected DataSourceFactory getDataSourceFactory(DataNodeDescriptor nodeDescriptor) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/PoolManager.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/PoolManager.java?rev=1072575&r1=1072574&r2=1072575&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/PoolManager.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/conn/PoolManager.java Sun Feb 20 12:26:51 2011
@@ -32,6 +32,8 @@ import javax.sql.ConnectionPoolDataSourc
 import javax.sql.DataSource;
 import javax.sql.PooledConnection;
 
+import org.apache.cayenne.di.BeforeScopeEnd;
+
 /**
  * PoolManager is a pooling DataSource impementation. Internally to obtain connections
  * PoolManager uses either a JDBC driver or another pooling datasource.
@@ -182,6 +184,7 @@ public class PoolManager implements Data
      * 
      * @since 3.1
      */
+    @BeforeScopeEnd
     public void shutdown() throws SQLException {
         synchronized (this) {
             // clean connections from the pool