TOMEE-726 eagerInit of managedconnection pool

git-svn-id: https://svn.apache.org/repos/asf/openejb/trunk@1432125 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java b/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
index eb76e04..52c45ae 100644
--- a/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
+++ b/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
@@ -141,6 +141,8 @@
 import javax.naming.NameAlreadyBoundException;
 import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
+import javax.resource.cci.Connection;
+import javax.resource.cci.ConnectionFactory;
 import javax.resource.spi.BootstrapContext;
 import javax.resource.spi.ConnectionManager;
 import javax.resource.spi.ManagedConnectionFactory;
@@ -1885,18 +1887,32 @@
                 if (unsetB.containsKey(entry.getKey()))
                     unset.put(entry.getKey(), entry.getValue());
             }
-            logUnusedProperties(unset, serviceInfo);
 
-            if (connectionManager instanceof AbstractConnectionManager) {
+            // service becomes a ConnectorReference which merges connection manager and mcf
+            service = new ConnectorReference(connectionManager, managedConnectionFactory);
+
+            // init cm if needed
+            final Object eagerInit = unset.remove("eagerInit");
+            if (eagerInit != null && eagerInit instanceof String && "true".equalsIgnoreCase((String) eagerInit)
+                            && connectionManager instanceof AbstractConnectionManager) {
                 try {
                     ((AbstractConnectionManager) connectionManager).doStart();
+                    try {
+                        final Object cf = managedConnectionFactory.createConnectionFactory(connectionManager);
+                        if (cf instanceof ConnectionFactory) {
+                            final Connection connection = ((ConnectionFactory) cf).getConnection();
+                            connection.getMetaData();
+                            connection.close();
+                        }
+                    } catch (Exception e) {
+                        // no-op: just to force eager init of pool
+                    }
                 } catch (Exception e) {
                     logger.warning("Can't start connection manager", e);
                 }
             }
 
-            // service becomes a ConnectorReference which merges connection manager and mcf
-            service = new ConnectorReference(connectionManager, managedConnectionFactory);
+            logUnusedProperties(unset, serviceInfo);
         } else if (service instanceof DataSource) {
             ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
             if (classLoader == null) {
diff --git a/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java b/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
index 5ca1e74..eabcece 100644
--- a/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
+++ b/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/GeronimoConnectionManagerFactory.java
@@ -382,27 +382,39 @@
             final ConnectionInterceptor stack = interceptors.getStack();
 
             ReadWriteLock foundLock = null;
-            if (stack instanceof AbstractSinglePoolConnectionInterceptor) {
-                try {
-                    foundLock = (ReadWriteLock) AbstractSinglePoolConnectionInterceptor.class.getField("resizeLock").get(stack);
-                } catch (IllegalAccessException e) {
-                    // no-op
-                } catch (NoSuchFieldException e) {
-                    // no-op
+            ConnectionInterceptor current = stack;
+            do {
+                if (current instanceof AbstractSinglePoolConnectionInterceptor) {
+                    try {
+                        foundLock = (ReadWriteLock) AbstractSinglePoolConnectionInterceptor.class.getField("resizeLock").get(current);
+                    } catch (IllegalAccessException e) {
+                        // no-op
+                    } catch (NoSuchFieldException e) {
+                        // no-op
+                    }
+                    break;
                 }
-            }
+
+                // look next
+                try {
+                    current = (ConnectionInterceptor) Reflections.get(current, "next");
+                } catch (Exception e) {
+                    current = null;
+                }
+            } while (current != null);
+
             this.lock = foundLock;
 
             Object foundPool = null;
-            if (stack instanceof AbstractSinglePoolConnectionInterceptor) {
+            if (current instanceof AbstractSinglePoolConnectionInterceptor) {
                 foundPool = Reflections.get(stack, "pool");
-            } else if (stack instanceof MultiPoolConnectionInterceptor) {
+            } else if (current instanceof MultiPoolConnectionInterceptor) {
                 log.warn("validation on stack " + stack + " not supported");
             }
             this.pool = foundPool;
 
             if (pool != null) {
-                validatingTask = new ValidatingTask(stack, lock, pool);
+                validatingTask = new ValidatingTask(current, lock, pool);
             } else {
                 validatingTask = null;
             }