[jboss-cvs] JBossAS SVN: r111180 - in projects/jboss-jca/trunk: common/src/main/java/org/jboss/jca/common/api/metadata/ds and 20 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Apr 14 08:48:25 EDT 2011


Author: jesper.pedersen
Date: 2011-04-14 08:48:23 -0400 (Thu, 14 Apr 2011)
New Revision: 111180

Added:
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/CachedConnectionManager.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/package.html
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/listener/ConnectionCacheListener.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerImpl.java
Removed:
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
Modified:
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/common/CommonConnDef.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/CommonDataSource.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/DataSource.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/XaDataSource.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonConnDefImpl.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonIronJacamarParser.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceAbstractImpl.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceImpl.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DsParser.java
   projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/XADataSourceImpl.java
   projects/jboss-jca/trunk/common/src/main/resources/schema/datasources_1_0.xsd
   projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
   projects/jboss-jca/trunk/common/src/main/resources/schema/resource-adapters_1_0.xsd
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManager.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManagerFactory.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionRecord.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/AbstractConnectionListener.java
   projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionCacheListener.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/SerializableTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/PrefillTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/SerializableTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/XATxConnectionManagerTestCase.java
   projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/unit/AbstractConnectionManagerTestCase.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractDsDeployer.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/AbstractFungalRADeployer.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/DsXmlDeployer.java
   projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RAConfiguration.java
   projects/jboss-jca/trunk/doc/userguide/en-US/modules/deployment.xml
   projects/jboss-jca/trunk/embedded/src/main/resources/ds.xml
   projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
   projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/ds.xml
   projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
Log:
[JBJCA-547] Make CCM usage configurable

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/common/CommonConnDef.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/common/CommonConnDef.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/common/CommonConnDef.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -79,6 +79,13 @@
    public Boolean isUseJavaContext();
 
    /**
+    * Get the useCcm.
+    *
+    * @return the useCcm.
+    */
+   public Boolean isUseCcm();
+
+   /**
     * Get the pool.
     *
     * @return the pool.
@@ -251,7 +258,11 @@
       /** use-java-context attribute
       *
       */
-      USEJAVACONTEXT("use-java-context");
+      USEJAVACONTEXT("use-java-context"),
+      /** use-ccm attribute
+      *
+      */
+      USECCM("use-ccm");
 
       private final String name;
 

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/CommonDataSource.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/CommonDataSource.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/CommonDataSource.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -107,6 +107,14 @@
    public boolean isSpy();
 
    /**
+    * Get the use-ccm.
+    *
+    * @return the use-ccm.
+    */
+
+   public boolean isUseCcm();
+
+   /**
     * Get the driver
     * @return The value
     */

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/DataSource.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/DataSource.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/DataSource.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -247,8 +247,13 @@
       /** spy attribute
       *
       */
-      SPY("spy");
+      SPY("spy"),
 
+      /** use-ccm attribute
+      *
+      */
+      USE_CCM("use-ccm");
+
       private final String name;
 
       /**

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/XaDataSource.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/XaDataSource.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/api/metadata/ds/XaDataSource.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -245,8 +245,13 @@
       /** spy attribute
       *
       */
-      SPY("spy");
+      SPY("spy"),
 
+      /** use-ccm attribute
+      *
+      */
+      USE_CCM("use-ccm");
+
       private final String name;
 
       /**

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonConnDefImpl.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonConnDefImpl.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonConnDefImpl.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -57,6 +57,8 @@
 
    private final Boolean useJavaContext;
 
+   private final Boolean useCcm;
+
    private final CommonPool pool;
 
    private final CommonTimeOut timeOut;
@@ -76,6 +78,7 @@
     * @param poolName poolName
     * @param enabled enabled
     * @param useJavaContext useJavaContext
+    * @param useCcm useCcm
     * @param pool pool
     * @param timeOut timeOut
     * @param validation validation
@@ -83,7 +86,7 @@
     * @param recovery recovery
     */
    public CommonConnDefImpl(Map<String, String> configProperties, String className, String jndiName,
-      String poolName, Boolean enabled, Boolean useJavaContext, CommonPool pool, CommonTimeOut timeOut,
+      String poolName, Boolean enabled, Boolean useJavaContext, Boolean useCcm, CommonPool pool, CommonTimeOut timeOut,
       CommonValidation validation, CommonSecurity security, Recovery recovery)
    {
       super();
@@ -101,6 +104,7 @@
       this.poolName = poolName;
       this.enabled = enabled;
       this.useJavaContext = useJavaContext;
+      this.useCcm = useCcm;
       this.pool = pool;
       this.timeOut = timeOut;
       this.validation = validation;
@@ -176,6 +180,17 @@
    }
 
    /**
+    * Get the useCcm.
+    *
+    * @return the useCcm.
+    */
+   @Override
+   public final Boolean isUseCcm()
+   {
+      return useCcm;
+   }
+
+   /**
     * Get the pool.
     *
     * @return the pool.
@@ -240,6 +255,7 @@
       result = prime * result + ((security == null) ? 0 : security.hashCode());
       result = prime * result + ((timeOut == null) ? 0 : timeOut.hashCode());
       result = prime * result + ((useJavaContext == null) ? 0 : useJavaContext.hashCode());
+      result = prime * result + ((useCcm == null) ? 0 : useCcm.hashCode());
       result = prime * result + ((validation == null) ? 0 : validation.hashCode());
       return result;
    }
@@ -324,6 +340,13 @@
       }
       else if (!useJavaContext.equals(other.useJavaContext))
          return false;
+      if (useCcm == null)
+      {
+         if (other.useCcm != null)
+            return false;
+      }
+      else if (!useCcm.equals(other.useCcm))
+         return false;
       if (validation == null)
       {
          if (other.validation != null)
@@ -339,8 +362,8 @@
    {
       return "CommonConnDefImpl [configProperties=" + configProperties + ", className=" + className + ", jndiName=" +
              jndiName + ", poolName=" + poolName + ", enabled=" + enabled + ", useJavaContext=" + useJavaContext +
-             ", pool=" + pool + ", timeOut=" + timeOut + ", validation=" + validation + ", security=" + security +
-             ", recovery=" + recovery + "]";
+             ", useCcm=" + useCcm + ", pool=" + pool + ", timeOut=" + timeOut + ", validation=" + validation +
+             ", security=" + security + ", recovery=" + recovery + "]";
    }
 
    /**

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonIronJacamarParser.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonIronJacamarParser.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/common/CommonIronJacamarParser.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -77,6 +77,7 @@
       boolean enabled = true;
       String jndiName = null;
       String poolName = null;
+      boolean useCcm = true;
       int attributeSize = reader.getAttributeCount();
 
       boolean isXa = false;
@@ -106,6 +107,10 @@
                useJavaContext = attributeAsBoolean(reader, attribute.getLocalName(), true);
                break;
             }
+            case USECCM : {
+               useCcm = attributeAsBoolean(reader, attribute.getLocalName(), true);
+               break;
+            }
             default :
                throw new ParserException("Unexpected attribute:" + attribute.getLocalName() + "at " +
                                          reader.getLocalName());
@@ -123,7 +128,7 @@
                {
 
                   return new CommonConnDefImpl(configProperties, className, jndiName, poolName, enabled,
-                                               useJavaContext, pool, timeOut, validation, security, recovery);
+                                               useJavaContext, useCcm, pool, timeOut, validation, security, recovery);
                }
                else
                {

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceAbstractImpl.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceAbstractImpl.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceAbstractImpl.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -104,6 +104,11 @@
    protected final boolean spy;
 
    /**
+   * use-ccm
+   */
+   protected final boolean useCcm;
+
+   /**
     * Create a new DataSourceAbstractImpl.
     *
     * @param transactionIsolation transactionIsolation
@@ -118,12 +123,13 @@
     * @param enabled enabled
     * @param jndiName jndiName
     * @param spy spy
+    * @param useCcm useCcm
     * @throws ValidateException ValidateException
     */
    protected DataSourceAbstractImpl(TransactionIsolation transactionIsolation, TimeOut timeOut,
       DsSecurity security, Statement statement, Validation validation, String urlDelimiter,
       String urlSelectorStrategyClassName, Boolean useJavaContext, String poolName, Boolean enabled, String jndiName,
-      boolean spy)
+      boolean spy, boolean useCcm)
       throws ValidateException
    {
       super();
@@ -139,6 +145,7 @@
       this.enabled = enabled;
       this.jndiName = jndiName;
       this.spy = spy;
+      this.useCcm = useCcm;
       partialCommonValidation();
    }
 
@@ -251,7 +258,19 @@
    }
 
    /**
+    * Get the use ccm
     *
+    * @return the use ccm.
+    */
+
+   @Override
+   public final boolean isUseCcm()
+   {
+      return useCcm;
+   }
+
+   /**
+    *
     * Partial validation for common fields defined in this abstract class
     *
     * @throws ValidateException ValidateException

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceImpl.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceImpl.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DataSourceImpl.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -78,6 +78,7 @@
     * @param enabled enabled
     * @param jndiName jndiName
     * @param spy spy
+    * @param useccm useccm
     * @param pool pool
     * @throws ValidateException ValidateException
     */
@@ -85,10 +86,10 @@
       TransactionIsolation transactionIsolation, Map<String, String> connectionProperties, TimeOut timeOut,
       DsSecurity security, Statement statement, Validation validation, String urlDelimiter,
       String urlSelectorStrategyClassName, String newConnectionSql, boolean useJavaContext, String poolName,
-      boolean enabled, String jndiName, boolean spy, CommonPool pool) throws ValidateException
+      boolean enabled, String jndiName, boolean spy, boolean useccm, CommonPool pool) throws ValidateException
    {
       super(transactionIsolation, timeOut, security, statement, validation, urlDelimiter,
-            urlSelectorStrategyClassName, useJavaContext, poolName, enabled, jndiName, spy);
+            urlSelectorStrategyClassName, useJavaContext, poolName, enabled, jndiName, spy, useccm);
       this.connectionUrl = connectionUrl;
       this.driverClass = driverClass;
       this.driver = driver;

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DsParser.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DsParser.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/DsParser.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -197,6 +197,7 @@
       boolean enabled = true;
       String jndiName = null;
       boolean spy = false;
+      boolean useCcm = true;
 
       for (Attribute attribute : XaDataSource.Attribute.values())
       {
@@ -222,6 +223,10 @@
                spy = attributeAsBoolean(reader, attribute.getLocalName(), false);
                break;
             }
+            case USE_CCM : {
+               useCcm = attributeAsBoolean(reader, attribute.getLocalName(), true);
+               break;
+            }
             default :
                break;
          }
@@ -239,7 +244,7 @@
                   return new XADataSourceImpl(transactionIsolation, timeOutSettings, securitySettings,
                                               statementSettings, validationSettings, urlDelimiter,
                                               urlSelectorStrategyClassName, useJavaContext, poolName, enabled,
-                                              jndiName, spy, xaDataSourceProperty, xaDataSourceClass, driver,
+                                              jndiName, spy, useCcm, xaDataSourceProperty, xaDataSourceClass, driver,
                                               newConnectionSql, xaPool, recovery);
                }
                else
@@ -397,6 +402,7 @@
       boolean enabled = true;
       String jndiName = null;
       boolean spy = false;
+      boolean useCcm = true;
 
       for (Attribute attribute : XaDataSource.Attribute.values())
       {
@@ -422,6 +428,10 @@
                spy = attributeAsBoolean(reader, attribute.getLocalName(), false);
                break;
             }
+            case USE_CCM : {
+               useCcm = attributeAsBoolean(reader, attribute.getLocalName(), true);
+               break;
+            }
             default :
                break;
          }
@@ -440,7 +450,7 @@
                                             connectionProperties, timeOutSettings, securitySettings,
                                             statementSettings, validationSettings, urlDelimiter,
                                             urlSelectorStrategyClassName, newConnectionSql, useJavaContext, poolName,
-                                            enabled, jndiName, spy, pool);
+                                            enabled, jndiName, spy, useCcm, pool);
                }
                else
                {

Modified: projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/XADataSourceImpl.java
===================================================================
--- projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/XADataSourceImpl.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/java/org/jboss/jca/common/metadata/ds/XADataSourceImpl.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -74,6 +74,7 @@
     * @param enabled enabled
     * @param jndiName jndiName
     * @param spy spy
+    * @param useCcm useCcm
     * @param xaDataSourceProperty xaDataSourceProperty
     * @param xaDataSourceClass xaDataSourceClass
     * @param driver driver
@@ -84,12 +85,12 @@
     */
    public XADataSourceImpl(TransactionIsolation transactionIsolation, TimeOut timeOut, DsSecurity security,
       Statement statement, Validation validation, String urlDelimiter, String urlSelectorStrategyClassName,
-      boolean useJavaContext, String poolName, boolean enabled, String jndiName, boolean spy,
+      boolean useJavaContext, String poolName, boolean enabled, String jndiName, boolean spy, boolean useCcm,
       Map<String, String> xaDataSourceProperty, String xaDataSourceClass, String driver, String newConnectionSql,
       CommonXaPool xaPool, Recovery recovery) throws ValidateException
    {
       super(transactionIsolation, timeOut, security, statement, validation, urlDelimiter,
-            urlSelectorStrategyClassName, useJavaContext, poolName, enabled, jndiName, spy);
+            urlSelectorStrategyClassName, useJavaContext, poolName, enabled, jndiName, spy, useCcm);
       if (xaDataSourceProperty != null)
       {
          this.xaDataSourceProperty = new HashMap<String, String>(xaDataSourceProperty.size());

Modified: projects/jboss-jca/trunk/common/src/main/resources/schema/datasources_1_0.xsd
===================================================================
--- projects/jboss-jca/trunk/common/src/main/resources/schema/datasources_1_0.xsd	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/resources/schema/datasources_1_0.xsd	2011-04-14 12:48:23 UTC (rev 111180)
@@ -347,6 +347,16 @@
         </xs:documentation>
       </xs:annotation>
     </xs:attribute>
+    <xs:attribute default="true" name="use-ccm" type="xs:boolean">
+      <xs:annotation>
+        <xs:documentation>
+          <![CDATA[[
+            Enable the use of a cached connection manager
+            Ex: use-ccm="true"
+           ]]>
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
   </xs:attributeGroup>
   <xs:simpleType name="transaction-isolationType">
     <xs:annotation>

Modified: projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd
===================================================================
--- projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/resources/schema/ironjacamar_1_0.xsd	2011-04-14 12:48:23 UTC (rev 111180)
@@ -339,8 +339,17 @@
           </xs:documentation>
         </xs:annotation>
       </xs:element>
-            <xs:element name="recovery" type="recoverType" minOccurs="0" maxOccurs="1"></xs:element>
-        </xs:sequence>
+      <xs:element name="recovery" type="recoverType" minOccurs="0" maxOccurs="1"></xs:element>
+    </xs:sequence>
+    <xs:attribute name="use-ccm" type="xs:boolean" default="true" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          <![CDATA[[
+            Enable cached connection manager
+           ]]>
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
     <xs:attributeGroup ref="common-attribute"></xs:attributeGroup>
   </xs:complexType>
 

Modified: projects/jboss-jca/trunk/common/src/main/resources/schema/resource-adapters_1_0.xsd
===================================================================
--- projects/jboss-jca/trunk/common/src/main/resources/schema/resource-adapters_1_0.xsd	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/common/src/main/resources/schema/resource-adapters_1_0.xsd	2011-04-14 12:48:23 UTC (rev 111180)
@@ -371,8 +371,17 @@
           </xs:documentation>
         </xs:annotation>
       </xs:element>
-            <xs:element name="recovery" type="recoverType" minOccurs="0" maxOccurs="1"></xs:element>
-        </xs:sequence>
+      <xs:element name="recovery" type="recoverType" minOccurs="0" maxOccurs="1"></xs:element>
+    </xs:sequence>
+    <xs:attribute name="use-ccm" type="xs:boolean" default="true" use="optional">
+      <xs:annotation>
+        <xs:documentation>
+          <![CDATA[[
+            Enable cached connection manager
+           ]]>
+        </xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
     <xs:attributeGroup ref="common-attribute"></xs:attributeGroup>
   </xs:complexType>
 

Added: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/CachedConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/CachedConnectionManager.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/CachedConnectionManager.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -0,0 +1,73 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.api.connectionmanager.ccm;
+
+import org.jboss.jca.core.api.connectionmanager.listener.ConnectionCacheListener;
+import org.jboss.jca.core.api.connectionmanager.listener.ConnectionListener;
+import org.jboss.jca.core.spi.connectionmanager.ComponentStack;
+import org.jboss.jca.core.spi.transaction.usertx.UserTransactionListener;
+
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.transaction.TransactionManager;
+
+/**
+ * CacheConnectionManager.
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public interface CachedConnectionManager extends UserTransactionListener, ComponentStack
+{
+   /**
+    * Gets transaction manager.
+    * @return transaction manager
+    */
+   public TransactionManager getTransactionManager();
+
+   /**
+    * Set debug flag
+    * @param v The value
+    */
+   public void setDebug(boolean v);
+
+   /**
+    * Set error flag
+    * @param v The value
+    */
+   public void setError(boolean v);
+
+   /**
+    * Register connection.
+    * @param cm connection manager
+    * @param cl connection listener
+    * @param connection connection handle
+    * @param cri connection request info.
+    */
+   public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl,
+                                  Object connection, ConnectionRequestInfo cri);
+
+   /**
+    * Unregister connection.
+    * @param cm connection manager
+    * @param connection connection handle
+    */
+   public void unregisterConnection(ConnectionCacheListener cm, Object connection);
+}

Added: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/package.html
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/package.html	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/ccm/package.html	2011-04-14 12:48:23 UTC (rev 111180)
@@ -0,0 +1,3 @@
+<body>
+This package contains the API for the cached connection manager.
+</body>

Added: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/listener/ConnectionCacheListener.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/listener/ConnectionCacheListener.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/api/connectionmanager/listener/ConnectionCacheListener.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -0,0 +1,31 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.api.connectionmanager.listener;
+
+/**
+ * Connection cache listener.
+ * 
+ * @author <a href="jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public interface ConnectionCacheListener
+{
+}

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/AbstractConnectionManager.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -23,7 +23,7 @@
 package org.jboss.jca.core.connectionmanager;
 
 import org.jboss.jca.common.JBossResourceException;
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionState;
 import org.jboss.jca.core.connectionmanager.pool.api.Pool;

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManager.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManager.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -21,7 +21,7 @@
  */
 package org.jboss.jca.core.connectionmanager;
 
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
 import org.jboss.jca.core.connectionmanager.listener.ConnectionListenerFactory;

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManagerFactory.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManagerFactory.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionManagerFactory.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -22,7 +22,7 @@
 
 package org.jboss.jca.core.connectionmanager;
 
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.connectionmanager.notx.NoTxConnectionManagerImpl;
 import org.jboss.jca.core.connectionmanager.pool.api.Pool;
 import org.jboss.jca.core.connectionmanager.transaction.TransactionSynchronizer;
@@ -54,6 +54,8 @@
     * @param pool The pool for the connection manager
     * @param subjectFactory The subject factory
     * @param securityDomain The security domain 
+    * @param useCcm Should the CCM be used
+    * @param ccm The cached connection manager
     * @param allocationRetry The allocation retry value
     * @param allocationRetryWaitMillis The allocation retry millis value
     * @return The connection manager instance
@@ -62,6 +64,8 @@
                                                        final Pool pool,
                                                        final SubjectFactory subjectFactory,
                                                        final String securityDomain,
+                                                       final boolean useCcm,
+                                                       final CachedConnectionManager ccm,
                                                        final Integer allocationRetry,
                                                        final Long allocationRetryWaitMillis)
    {
@@ -91,6 +95,7 @@
 
       setProperties(cm, pool,
                     subjectFactory, securityDomain, 
+                    useCcm, ccm,
                     allocationRetry, allocationRetryWaitMillis, 
                     null, null);
       setNoTxProperties(cm);
@@ -104,6 +109,8 @@
     * @param pool The pool for the connection manager
     * @param subjectFactory The subject factory
     * @param securityDomain The security domain 
+    * @param useCcm Should the CCM be used
+    * @param ccm The cached connection manager
     * @param allocationRetry The allocation retry value
     * @param allocationRetryWaitMillis The allocation retry millis value
     * @param txIntegration The transaction manager integration
@@ -118,6 +125,8 @@
                                                   final Pool pool,
                                                   final SubjectFactory subjectFactory,
                                                   final String securityDomain,
+                                                  final boolean useCcm,
+                                                  final CachedConnectionManager ccm,
                                                   final Integer allocationRetry,
                                                   final Long allocationRetryWaitMillis,
                                                   final TransactionIntegration txIntegration,
@@ -157,6 +166,7 @@
 
       setProperties(cm, pool, 
                     subjectFactory, securityDomain, 
+                    useCcm, ccm,
                     allocationRetry, allocationRetryWaitMillis,
                     txIntegration.getTransactionManager(), txIntegration.getUserTransactionRegistry());
       setTxProperties(cm, interleaving, xaResourceTimeout, isSameRMOverride, wrapXAResource, padXid);
@@ -171,6 +181,8 @@
     * @param pool The pool
     * @param subjectFactory The subject factory
     * @param securityDomain The security domain
+    * @param useCcm Should the CCM be used
+    * @param ccm The cached connection manager
     * @param allocationRetry The allocation retry value
     * @param allocationRetryWaitMillis The allocation retry millis value
     * @param tm The transaction manager
@@ -180,6 +192,8 @@
                               Pool pool,
                               SubjectFactory subjectFactory,
                               String securityDomain,
+                              boolean useCcm,
+                              CachedConnectionManager ccm,
                               Integer allocationRetry,
                               Long allocationRetryWaitMillis,
                               TransactionManager tm,
@@ -199,8 +213,8 @@
 
       cm.setUserTransactionRegistry(utr);
 
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
-      cm.setCachedConnectionManager(ccm);
+      if (useCcm)
+         cm.setCachedConnectionManager(ccm);
    }
 
    /**

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionRecord.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionRecord.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ConnectionRecord.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -45,11 +45,11 @@
     * @param connection connection handle
     * @param cri connection request info
     */
-   public ConnectionRecord (final ConnectionListener cl, 
+   public ConnectionRecord (final org.jboss.jca.core.api.connectionmanager.listener.ConnectionListener cl, 
                             final Object connection, 
                             final ConnectionRequestInfo cri)
    {
-      this.connectionListener = cl;
+      this.connectionListener = (ConnectionListener)cl;
       this.connection = connection;
       this.cri = cri;
    }

Deleted: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -1,647 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
- * as indicated by the @author tags. See the copyright.txt file in the
- * distribution for a full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.jca.core.connectionmanager.ccm;
-
-import org.jboss.jca.core.connectionmanager.ConnectionRecord;
-import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
-import org.jboss.jca.core.connectionmanager.listener.ConnectionListener;
-import org.jboss.jca.core.connectionmanager.transaction.TransactionSynchronizer;
-import org.jboss.jca.core.spi.connectionmanager.ComponentStack;
-import org.jboss.jca.core.spi.transaction.TxUtils;
-import org.jboss.jca.core.spi.transaction.usertx.UserTransactionListener;
-
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.WeakHashMap;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.resource.ResourceException;
-import javax.resource.spi.ConnectionRequestInfo;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-
-import org.jboss.logging.Logger;
-import org.jboss.util.Strings;
-
-/**
- * CacheConnectionManager.
- *
- * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
- */
-public class CachedConnectionManager implements UserTransactionListener, ComponentStack
-{
-   /** Log instance */
-   private static Logger log = Logger.getLogger(CachedConnectionManager.class);
-
-   /** Log trace */
-   private static boolean trace = log.isTraceEnabled();
-
-   /** Debugging flag */
-   private static boolean debug = false;
-
-   /** Enabled error handling for debugging */
-   private static boolean error = false;
-
-   /** Transaction Manager instance */
-   private final TransactionManager transactionManager;
-
-   /**
-    * ThreadLocal that holds current calling meta-programming aware
-    * object, used in case someone is idiotic enough to cache a
-    * connection between invocations.and want the spec required
-    * behavior of it getting hooked up to an appropriate
-    * ManagedConnection on each method invocation.
-    */
-   private final ThreadLocal<LinkedList<Object>> currentObjects = new ThreadLocal<LinkedList<Object>>();
-
-   /**
-    * The variable <code>objectToConnectionManagerMap</code> holds the
-    * map of meta-aware object to set of connections it holds, used by
-    * the idiot spec compliant behavior.
-    */
-   private final ConcurrentMap<KeyConnectionAssociation,
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>
-   objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation,
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>();
-
-   /**
-    * Connection stacktraces
-    */
-   private final Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
-
-   /**
-    * Creates a new instance.
-    * @param transactionManager The transaction manager
-    */
-   public CachedConnectionManager(final TransactionManager transactionManager)
-   {
-      this.transactionManager = transactionManager;
-   }
-
-   /**
-    * Gets transaction manager.
-    * @return transaction manager
-    */
-   public TransactionManager getTransactionManager()
-   {
-      return transactionManager;
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   public void userTransactionStarted() throws SystemException
-   {
-      KeyConnectionAssociation key = peekMetaAwareObject();
-      if (trace)
-      {
-         log.trace("user tx started, key: " + key);
-      }
-      if (key == null)
-      {
-         return; //not participating properly in this management scheme.
-      }
-
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
-         key.getCMToConnectionsMap();
-
-      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
-         cmToConnectionsMap.entrySet().iterator();
-
-      while (cmToConnectionsMapIterator.hasNext())
-      {
-         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
-            cmToConnectionsMapIterator.next();
-
-         ConnectionCacheListener cm = entry.getKey();
-         CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
-
-         cm.transactionStarted(conns);
-      }
-   }
-
-   /**
-    *
-    * @return stack last meta-aware object
-    */
-   private KeyConnectionAssociation peekMetaAwareObject()
-   {
-      LinkedList<Object> stack = currentObjects.get();
-      if (stack == null)
-      {
-         return null;
-      }
-
-      if (!stack.isEmpty())
-      {
-         return (KeyConnectionAssociation) stack.getLast();
-      }
-
-      else
-      {
-         return null;
-      }
-   }
-
-
-   /**
-    * {@inheritDoc}
-    */
-   @SuppressWarnings("unchecked")
-   public void popMetaAwareObject(Set unsharableResources) throws ResourceException
-   {
-      LinkedList<Object> stack = currentObjects.get();
-      KeyConnectionAssociation oldKey = (KeyConnectionAssociation) stack.removeLast();
-      if (trace)
-      {
-         log.trace("popped object: " + Strings.defaultToString(oldKey));
-      }
-
-      if (!stack.contains(oldKey))
-      {
-         disconnect(oldKey, unsharableResources);
-      } // end of if ()
-
-      if (debug)
-      {
-         if (closeAll(oldKey.getCMToConnectionsMap()) && error)
-         {
-            throw new ResourceException("Some connections were not closed, " +
-                  "see the log for the allocation stacktraces");
-         }
-      }
-   }
-
-   /**
-    * Register connection.
-    * @param cm connection manager
-    * @param cl connection listener
-    * @param connection connection handle
-    * @param cri connection request info.
-    */
-   public void registerConnection(ConnectionCacheListener cm, ConnectionListener cl,
-         Object connection, ConnectionRequestInfo cri)
-   {
-      if (debug)
-      {
-         synchronized (connectionStackTraces)
-         {
-            connectionStackTraces.put(connection, new Throwable("STACKTRACE"));
-         }
-      }
-
-      KeyConnectionAssociation key = peekMetaAwareObject();
-
-      if (trace)
-      {
-         log.trace("registering connection from connection manager " + cm +
-               ", connection : " + connection + ", key: " + key);
-      }
-
-      if (key == null)
-      {
-         return; //not participating properly in this management scheme.
-      }
-
-      ConnectionRecord cr = new ConnectionRecord(cl, connection, cri);
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
-         key.getCMToConnectionsMap();
-
-      CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
-      if (conns == null)
-      {
-         conns = new CopyOnWriteArrayList<ConnectionRecord>();
-         cmToConnectionsMap.put(cm, conns);
-      }
-
-      conns.add(cr);
-   }
-
-   /**
-    * Unregister connection.
-    * @param cm connection manager
-    * @param connection connection handle
-    */
-   public void unregisterConnection(ConnectionCacheListener cm, Object connection)
-   {
-      if (debug)
-      {
-         CloseConnectionSynchronization cas = getCloseConnectionSynchronization(false);
-         if (cas != null)
-         {
-            cas.remove(connection);
-         }
-
-         synchronized (connectionStackTraces)
-         {
-            connectionStackTraces.remove(connection);
-         }
-      }
-
-      KeyConnectionAssociation key = peekMetaAwareObject();
-
-      if (trace)
-      {
-         log.trace("unregistering connection from connection manager " + cm +
-               ", object: " + connection + ", key: " + key);
-      }
-
-      if (key == null)
-      {
-         return; //not participating properly in this management scheme.
-      }
-
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
-         key.getCMToConnectionsMap();
-
-      CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
-      if (conns == null)
-      {
-         return; // Can happen if connections are "passed" between contexts
-      }
-
-      //note iterator of CopyOnWriteArrayList does not support remove method
-      //we use here remove on CopyOnWriteArrayList directly
-      for (ConnectionRecord connectionRecord : conns)
-      {
-         if (connectionRecord.getConnection() == connection)
-         {
-            conns.remove(connectionRecord);
-            return;
-         }
-      }
-
-      throw new IllegalStateException("Trying to return an unknown connection2! " + connection);
-   }
-
-   /**
-    * {@inheritDoc}
-    */
-   @SuppressWarnings("unchecked")
-   public void pushMetaAwareObject(final Object rawKey, Set unsharableResources) throws ResourceException
-   {
-      LinkedList<Object> stack = currentObjects.get();
-      if (stack == null)
-      {
-         if (trace)
-         {
-            log.trace("new stack for key: " + Strings.defaultToString(rawKey));
-         }
-
-         stack = new LinkedList<Object>();
-         currentObjects.set(stack);
-      }
-      else
-      {
-         if (trace)
-         {
-            log.trace("old stack for key: " + Strings.defaultToString(rawKey));
-         }
-      }
-
-      KeyConnectionAssociation key = new KeyConnectionAssociation(rawKey);
-      if (!stack.contains(key))
-      {
-         reconnect(key, unsharableResources);
-      }
-
-      stack.addLast(key);
-   }
-
-   /**
-    * The <code>reconnect</code> method gets the cmToConnectionsMap
-    * from objectToConnectionManagerMap, copies it to the key, and
-    * reconnects all the connections in it.
-    *
-    * @param key a <code>KeyConnectionAssociation</code> value
-    * @param unsharableResources a <code>Set</code> value
-    * @exception ResourceException if an error occurs
-    */
-   @SuppressWarnings("unchecked")
-   private void reconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
-   {
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
-         objectToConnectionManagerMap.get(key);
-
-      if (cmToConnectionsMap == null)
-         return;
-
-      key.setCMToConnectionsMap(cmToConnectionsMap);
-      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
-         cmToConnectionsMap.entrySet().iterator();
-
-      while (cmToConnectionsMapIterator.hasNext())
-      {
-         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
-            cmToConnectionsMapIterator.next();
-
-         ConnectionCacheListener cm = entry.getKey();
-         CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
-
-         cm.reconnect(conns, unsharableResources);
-      }
-   }
-
-   /**
-    * Disconnect connections.
-    * @param key key
-    * @param unsharableResources resource
-    * @throws ResourceException exception
-    */
-   @SuppressWarnings("unchecked")
-   private void disconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
-   {
-      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
-         key.getCMToConnectionsMap();
-
-      if (!cmToConnectionsMap.isEmpty())
-      {
-         objectToConnectionManagerMap.put(key, cmToConnectionsMap);
-
-         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
-            cmToConnectionsMap.entrySet().iterator();
-
-         while (cmToConnectionsMapIterator.hasNext())
-         {
-            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
-               cmToConnectionsMapIterator.next();
-
-            ConnectionCacheListener cm = entry.getKey();
-            CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
-
-            cm.disconnect(conns, unsharableResources);
-         }
-      }
-   }
-
-   /**
-    * Describe <code>unregisterConnectionCacheListener</code> method here.
-    * This is a shutdown method called by a connection manager.  It will remove all reference
-    * to that connection manager from the cache, so cached connections from that manager
-    * will never be recoverable.
-    * Possibly this method should not exist.
-    *
-    * @param cm a <code>ConnectionCacheListener</code> value
-    */
-   public void unregisterConnectionCacheListener(ConnectionCacheListener cm)
-   {
-      if (trace)
-      {
-         log.trace("unregisterConnectionCacheListener: " + cm);
-      }
-
-      Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it =
-         objectToConnectionManagerMap.values().iterator();
-
-      while (it.hasNext())
-      {
-         ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = it.next();
-
-         if (cmToConnectionsMap != null)
-            cmToConnectionsMap.remove(cm);
-      }
-   }
-
-
-   /**
-    * Close all connections.
-    * @param cmToConnectionsMap connection manager to connections
-    * @return true if close
-    */
-   private boolean closeAll(ConcurrentMap<ConnectionCacheListener,
-                            CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
-   {
-      if (!debug)
-      {
-         return false;
-      }
-
-      boolean unclosed = false;
-
-      Collection<CopyOnWriteArrayList<ConnectionRecord>> connections = cmToConnectionsMap.values();
-      if (connections.size() != 0)
-      {
-         for (Iterator<CopyOnWriteArrayList<ConnectionRecord>> i = connections.iterator(); i.hasNext();)
-         {
-            CopyOnWriteArrayList<ConnectionRecord> conns = i.next();
-            for (Iterator<ConnectionRecord> j = conns.iterator(); j.hasNext();)
-            {
-               Object c = (j.next()).getConnection();
-               CloseConnectionSynchronization cas = getCloseConnectionSynchronization(true);
-               if (cas == null)
-               {
-                  unclosed = true;
-                  closeConnection(c);
-               }
-               else
-               {
-                  cas.add(c);
-               }
-            }
-         }
-      }
-
-      return unclosed;
-   }
-
-   /**
-    * Gets close sync. instance.
-    * @param createIfNotFound create if not found
-    * @return sync. instance
-    */
-   private CloseConnectionSynchronization getCloseConnectionSynchronization(boolean createIfNotFound)
-   {
-      try
-      {
-         Transaction tx = null;
-         if (transactionManager != null)
-         {
-            tx = transactionManager.getTransaction();
-         }
-
-         if (tx != null)
-         {
-            TransactionSynchronizer.lock(tx);
-            try
-            {
-               CloseConnectionSynchronization cas = (CloseConnectionSynchronization)
-                                                   TransactionSynchronizer.getCCMSynchronization(tx);
-
-               if (cas == null && createIfNotFound && TxUtils.isActive(tx))
-               {
-                  cas = new CloseConnectionSynchronization();
-                  TransactionSynchronizer.registerCCMSynchronization(tx, cas);
-               }
-
-               return cas;
-            }
-            finally
-            {
-               TransactionSynchronizer.unlock(tx);
-            }
-         }
-      }
-      catch (Throwable t)
-      {
-         log.debug("Unable to synchronize with transaction", t);
-      }
-
-      return null;
-   }
-
-
-   /**
-    * Close connection handle.
-    * @param connectionHandle connection handle
-    */
-   private void closeConnection(Object connectionHandle)
-   {
-      try
-      {
-         Throwable exception;
-
-         synchronized (connectionStackTraces)
-         {
-            exception = connectionStackTraces.remove(connectionHandle);
-         }
-
-         Method m = connectionHandle.getClass().getMethod("close", new Class[]{});
-
-         try
-         {
-            if (exception != null)
-            {
-               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle, exception);
-            }
-            else
-            {
-               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle);
-            }
-
-            m.invoke(connectionHandle, new Object[]{});
-         }
-         catch (Throwable t)
-         {
-            log.info("Throwable trying to close a connection for you, please close it yourself", t);
-         }
-      }
-      catch (NoSuchMethodException nsme)
-      {
-         log.info("Could not find a close method on alleged connection objects.  Please close your own connections.");
-      }
-   }
-
-
-   /**
-    * Close synch. class.
-    */
-   private class CloseConnectionSynchronization implements Synchronization
-   {
-      /**Connection handles*/
-      CopyOnWriteArraySet<Object> connections = new CopyOnWriteArraySet<Object>();
-
-      /**Closing flag*/
-      AtomicBoolean closing = new AtomicBoolean(false);
-
-      /**
-       * Creates a new instance.
-       */
-      public CloseConnectionSynchronization()
-      {
-
-      }
-
-      /**
-       * Add new connection handle.
-       * @param c connection handle
-       */
-      public  void add(Object c)
-      {
-         if (closing.get())
-         {
-            return;
-         }
-         connections.add(c);
-      }
-
-      /**
-       * Removes connection handle.
-       * @param c connection handle
-       */
-      public  void remove(Object c)
-      {
-         if (closing.get())
-         {
-            return;
-         }
-
-         connections.remove(c);
-      }
-
-      /**
-       * {@inheritDoc}
-       */
-      public void beforeCompletion()
-      {
-         //No-action
-      }
-
-      /**
-       * {@inheritDoc}
-       */
-      public void afterCompletion(int status)
-      {
-         closing.set(true);
-
-         for (Iterator<Object> i = connections.iterator(); i.hasNext();)
-         {
-            closeConnection(i.next());
-         }
-
-         connections.clear();
-      }
-   }
-
-   /**
-    * Get the currentObjects.
-    * This method is package protected beacause it is intended only for test case use.
-    * Please don't use it in your production code.
-    *
-    * @return the currentObjects.
-    */
-   final ThreadLocal<LinkedList<Object>> getCurrentObjects()
-   {
-      return currentObjects;
-   }
-
-}

Copied: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerImpl.java (from rev 111179, projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManager.java)
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerImpl.java	                        (rev 0)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerImpl.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -0,0 +1,614 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2008-2009, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file in the
+ * distribution for a full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.jca.core.connectionmanager.ccm;
+
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.connectionmanager.ConnectionRecord;
+import org.jboss.jca.core.connectionmanager.listener.ConnectionCacheListener;
+import org.jboss.jca.core.connectionmanager.transaction.TransactionSynchronizer;
+import org.jboss.jca.core.spi.transaction.TxUtils;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.resource.ResourceException;
+import javax.resource.spi.ConnectionRequestInfo;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+
+import org.jboss.logging.Logger;
+import org.jboss.util.Strings;
+
+/**
+ * CacheConnectionManager.
+ *
+ * @author <a href="mailto:jesper.pedersen at jboss.org">Jesper Pedersen</a>
+ */
+public class CachedConnectionManagerImpl implements CachedConnectionManager
+{
+   /** Log instance */
+   private static Logger log = Logger.getLogger(CachedConnectionManagerImpl.class);
+
+   /** Debugging flag */
+   private boolean debug = false;
+
+   /** Enabled error handling for debugging */
+   private boolean error = false;
+
+   /** Transaction Manager instance */
+   private final TransactionManager transactionManager;
+
+   /**
+    * ThreadLocal that holds current calling meta-programming aware
+    * object, used in case someone is idiotic enough to cache a
+    * connection between invocations.and want the spec required
+    * behavior of it getting hooked up to an appropriate
+    * ManagedConnection on each method invocation.
+    */
+   private final ThreadLocal<LinkedList<Object>> currentObjects = new ThreadLocal<LinkedList<Object>>();
+
+   /**
+    * The variable <code>objectToConnectionManagerMap</code> holds the
+    * map of meta-aware object to set of connections it holds, used by
+    * the idiot spec compliant behavior.
+    */
+   private final ConcurrentMap<KeyConnectionAssociation,
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>
+   objectToConnectionManagerMap = new ConcurrentHashMap<KeyConnectionAssociation,
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>>();
+
+   /**
+    * Connection stacktraces
+    */
+   private final Map<Object, Throwable> connectionStackTraces = new WeakHashMap<Object, Throwable>();
+
+   /**
+    * Creates a new instance.
+    * @param transactionManager The transaction manager
+    */
+   public CachedConnectionManagerImpl(final TransactionManager transactionManager)
+   {
+      this.transactionManager = transactionManager;
+   }
+
+   /**
+    * Gets transaction manager.
+    * @return transaction manager
+    */
+   public TransactionManager getTransactionManager()
+   {
+      return transactionManager;
+   }
+
+   /**
+    * Set debug flag
+    * @param v The value
+    */
+   public void setDebug(boolean v)
+   {
+      debug = v;
+   }
+
+   /**
+    * Set error flag
+    * @param v The value
+    */
+   public void setError(boolean v)
+   {
+      error = v;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   public void userTransactionStarted() throws SystemException
+   {
+      KeyConnectionAssociation key = peekMetaAwareObject();
+
+      log.tracef("user tx started, key: %s", key);
+
+      if (key != null)
+      {
+         ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+            key.getCMToConnectionsMap();
+
+         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+            cmToConnectionsMap.entrySet().iterator();
+
+         while (cmToConnectionsMapIterator.hasNext())
+         {
+            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+               cmToConnectionsMapIterator.next();
+
+            ConnectionCacheListener cm = entry.getKey();
+            CopyOnWriteArrayList<ConnectionRecord> conns = entry.getValue();
+
+            cm.transactionStarted(conns);
+         }
+      }
+   }
+
+   /**
+    *
+    * @return stack last meta-aware object
+    */
+   private KeyConnectionAssociation peekMetaAwareObject()
+   {
+      LinkedList<Object> stack = currentObjects.get();
+
+      if (stack != null && !stack.isEmpty())
+      {
+         return (KeyConnectionAssociation)stack.getLast();
+      }
+
+      return null;
+   }
+
+
+   /**
+    * {@inheritDoc}
+    */
+   @SuppressWarnings("unchecked")
+   public void popMetaAwareObject(Set unsharableResources) throws ResourceException
+   {
+      LinkedList<Object> stack = currentObjects.get();
+      KeyConnectionAssociation oldKey = (KeyConnectionAssociation) stack.removeLast();
+
+      log.tracef("popped object: %s", Strings.defaultToString(oldKey));
+
+      if (!stack.contains(oldKey))
+      {
+         disconnect(oldKey, unsharableResources);
+      }
+
+      if (debug)
+      {
+         if (closeAll(oldKey.getCMToConnectionsMap()) && error)
+         {
+            throw new ResourceException("Some connections were not closed, see the log for the allocation stacktraces");
+         }
+      }
+   }
+
+   /**
+    * Register connection.
+    * @param cm connection manager
+    * @param cl connection listener
+    * @param connection connection handle
+    * @param cri connection request info.
+    */
+   public void registerConnection(org.jboss.jca.core.api.connectionmanager.listener.ConnectionCacheListener cm,
+                                  org.jboss.jca.core.api.connectionmanager.listener.ConnectionListener cl,
+                                  Object connection, ConnectionRequestInfo cri)
+   {
+      if (debug)
+      {
+         synchronized (connectionStackTraces)
+         {
+            connectionStackTraces.put(connection, new Throwable("STACKTRACE"));
+         }
+      }
+
+      KeyConnectionAssociation key = peekMetaAwareObject();
+
+      log.tracef("registering connection from connection manager: %s, connection : %s, key: %s", cm, connection, key);
+
+      if (key != null)
+      {
+         ConnectionRecord cr = new ConnectionRecord(cl, connection, cri);
+         ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+            key.getCMToConnectionsMap();
+
+         CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
+         if (conns == null)
+         {
+            conns = new CopyOnWriteArrayList<ConnectionRecord>();
+            cmToConnectionsMap.put((ConnectionCacheListener)cm, conns);
+         }
+
+         conns.add(cr);
+      }
+   }
+
+   /**
+    * Unregister connection.
+    * @param cm connection manager
+    * @param connection connection handle
+    */
+   public void unregisterConnection(org.jboss.jca.core.api.connectionmanager.listener.ConnectionCacheListener cm,
+                                    Object connection)
+   {
+      if (debug)
+      {
+         CloseConnectionSynchronization cas = getCloseConnectionSynchronization(false);
+         if (cas != null)
+         {
+            cas.remove(connection);
+         }
+
+         synchronized (connectionStackTraces)
+         {
+            connectionStackTraces.remove(connection);
+         }
+      }
+
+      KeyConnectionAssociation key = peekMetaAwareObject();
+
+      log.tracef("unregistering connection from connection manager: %s, connection: %s, key: %s", cm, connection, key);
+
+      if (key == null)
+         return;
+
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         key.getCMToConnectionsMap();
+
+      CopyOnWriteArrayList<ConnectionRecord> conns = cmToConnectionsMap.get(cm);
+
+      // Can happen if connections are "passed" between contexts
+      if (conns == null)
+         return; 
+
+      // Note iterator of CopyOnWriteArrayList does not support remove method
+      // We use here remove on CopyOnWriteArrayList directly
+      for (ConnectionRecord connectionRecord : conns)
+      {
+         if (connectionRecord.getConnection() == connection)
+         {
+            conns.remove(connectionRecord);
+            return;
+         }
+      }
+
+      throw new IllegalStateException("Trying to return an unknown connection2! " + connection);
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @SuppressWarnings("unchecked")
+   public void pushMetaAwareObject(final Object rawKey, Set unsharableResources) throws ResourceException
+   {
+      LinkedList<Object> stack = currentObjects.get();
+      if (stack == null)
+      {
+         log.tracef("new stack for key: %s", Strings.defaultToString(rawKey));
+
+         stack = new LinkedList<Object>();
+         currentObjects.set(stack);
+      }
+      else
+      {
+         log.tracef("old stack for key: %s", Strings.defaultToString(rawKey));
+      }
+
+      KeyConnectionAssociation key = new KeyConnectionAssociation(rawKey);
+      if (!stack.contains(key))
+      {
+         reconnect(key, unsharableResources);
+      }
+
+      stack.addLast(key);
+   }
+
+   /**
+    * The <code>reconnect</code> method gets the cmToConnectionsMap
+    * from objectToConnectionManagerMap, copies it to the key, and
+    * reconnects all the connections in it.
+    *
+    * @param key a <code>KeyConnectionAssociation</code> value
+    * @param unsharableResources a <code>Set</code> value
+    * @exception ResourceException if an error occurs
+    */
+   @SuppressWarnings("unchecked")
+   private void reconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
+   {
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         objectToConnectionManagerMap.get(key);
+
+      if (cmToConnectionsMap == null)
+         return;
+
+      key.setCMToConnectionsMap(cmToConnectionsMap);
+      Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+         cmToConnectionsMap.entrySet().iterator();
+
+      while (cmToConnectionsMapIterator.hasNext())
+      {
+         Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+            cmToConnectionsMapIterator.next();
+
+         ConnectionCacheListener cm = entry.getKey();
+         CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
+
+         cm.reconnect(conns, unsharableResources);
+      }
+   }
+
+   /**
+    * Disconnect connections.
+    * @param key key
+    * @param unsharableResources resource
+    * @throws ResourceException exception
+    */
+   @SuppressWarnings("unchecked")
+   private void disconnect(KeyConnectionAssociation key, Set unsharableResources) throws ResourceException
+   {
+      ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap =
+         key.getCMToConnectionsMap();
+
+      if (!cmToConnectionsMap.isEmpty())
+      {
+         objectToConnectionManagerMap.put(key, cmToConnectionsMap);
+
+         Iterator<Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> cmToConnectionsMapIterator =
+            cmToConnectionsMap.entrySet().iterator();
+
+         while (cmToConnectionsMapIterator.hasNext())
+         {
+            Entry<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> entry =
+               cmToConnectionsMapIterator.next();
+
+            ConnectionCacheListener cm = entry.getKey();
+            CopyOnWriteArrayList<ConnectionRecord> conns =  entry.getValue();
+
+            cm.disconnect(conns, unsharableResources);
+         }
+      }
+   }
+
+   /**
+    * Describe <code>unregisterConnectionCacheListener</code> method here.
+    * This is a shutdown method called by a connection manager.  It will remove all reference
+    * to that connection manager from the cache, so cached connections from that manager
+    * will never be recoverable.
+    * Possibly this method should not exist.
+    *
+    * @param cm a <code>ConnectionCacheListener</code> value
+    */
+   public void unregisterConnectionCacheListener(ConnectionCacheListener cm)
+   {
+      log.tracef("unregisterConnectionCacheListener: %s", cm);
+
+      Iterator<ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>>> it =
+         objectToConnectionManagerMap.values().iterator();
+
+      while (it.hasNext())
+      {
+         ConcurrentMap<ConnectionCacheListener, CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap = it.next();
+
+         if (cmToConnectionsMap != null)
+            cmToConnectionsMap.remove(cm);
+      }
+   }
+
+
+   /**
+    * Close all connections.
+    * @param cmToConnectionsMap connection manager to connections
+    * @return true if close
+    */
+   private boolean closeAll(ConcurrentMap<ConnectionCacheListener,
+                            CopyOnWriteArrayList<ConnectionRecord>> cmToConnectionsMap)
+   {
+      boolean unclosed = false;
+
+      Collection<CopyOnWriteArrayList<ConnectionRecord>> connections = cmToConnectionsMap.values();
+      if (connections.size() != 0)
+      {
+         for (Iterator<CopyOnWriteArrayList<ConnectionRecord>> i = connections.iterator(); i.hasNext();)
+         {
+            CopyOnWriteArrayList<ConnectionRecord> conns = i.next();
+            for (Iterator<ConnectionRecord> j = conns.iterator(); j.hasNext();)
+            {
+               Object c = (j.next()).getConnection();
+               CloseConnectionSynchronization cas = getCloseConnectionSynchronization(true);
+               if (cas == null)
+               {
+                  unclosed = true;
+                  closeConnection(c);
+               }
+               else
+               {
+                  cas.add(c);
+               }
+            }
+         }
+      }
+
+      return unclosed;
+   }
+
+   /**
+    * Gets close sync. instance.
+    * @param createIfNotFound create if not found
+    * @return sync. instance
+    */
+   private CloseConnectionSynchronization getCloseConnectionSynchronization(boolean createIfNotFound)
+   {
+      try
+      {
+         Transaction tx = null;
+         if (transactionManager != null)
+         {
+            tx = transactionManager.getTransaction();
+         }
+
+         if (tx != null)
+         {
+            TransactionSynchronizer.lock(tx);
+            try
+            {
+               CloseConnectionSynchronization cas = 
+                  (CloseConnectionSynchronization)TransactionSynchronizer.getCCMSynchronization(tx);
+
+               if (cas == null && createIfNotFound && TxUtils.isActive(tx))
+               {
+                  cas = new CloseConnectionSynchronization();
+                  TransactionSynchronizer.registerCCMSynchronization(tx, cas);
+               }
+
+               return cas;
+            }
+            finally
+            {
+               TransactionSynchronizer.unlock(tx);
+            }
+         }
+      }
+      catch (Throwable t)
+      {
+         log.debug("Unable to synchronize with transaction", t);
+      }
+
+      return null;
+   }
+
+
+   /**
+    * Close connection handle.
+    * @param connectionHandle connection handle
+    */
+   private void closeConnection(Object connectionHandle)
+   {
+      try
+      {
+         Throwable exception;
+
+         synchronized (connectionStackTraces)
+         {
+            exception = connectionStackTraces.remove(connectionHandle);
+         }
+
+         Method m = connectionHandle.getClass().getMethod("close", new Class[]{});
+
+         try
+         {
+            if (exception != null)
+            {
+               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle, exception);
+            }
+            else
+            {
+               log.info("Closing a connection for you.  Please close them yourself: " + connectionHandle);
+            }
+
+            m.invoke(connectionHandle, new Object[]{});
+         }
+         catch (Throwable t)
+         {
+            log.info("Throwable trying to close a connection for you, please close it yourself", t);
+         }
+      }
+      catch (NoSuchMethodException nsme)
+      {
+         log.info("Could not find a close method on alleged connection objects.  Please close your own connections.");
+      }
+   }
+
+
+   /**
+    * Close synch. class.
+    */
+   private class CloseConnectionSynchronization implements Synchronization
+   {
+      /**Connection handles*/
+      CopyOnWriteArraySet<Object> connections = new CopyOnWriteArraySet<Object>();
+
+      /**Closing flag*/
+      AtomicBoolean closing = new AtomicBoolean(false);
+
+      /**
+       * Creates a new instance.
+       */
+      public CloseConnectionSynchronization()
+      {
+      }
+
+      /**
+       * Add new connection handle.
+       * @param c connection handle
+       */
+      public  void add(Object c)
+      {
+         if (!closing.get())
+            connections.add(c);
+      }
+
+      /**
+       * Removes connection handle.
+       * @param c connection handle
+       */
+      public  void remove(Object c)
+      {
+         if (!closing.get())
+            connections.remove(c);
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      public void beforeCompletion()
+      {
+         // No-action
+      }
+
+      /**
+       * {@inheritDoc}
+       */
+      public void afterCompletion(int status)
+      {
+         closing.set(true);
+
+         for (Iterator<Object> i = connections.iterator(); i.hasNext();)
+         {
+            closeConnection(i.next());
+         }
+
+         connections.clear();
+      }
+   }
+
+   /**
+    * Get the currentObjects.
+    * This method is package protected beacause it is intended only for test case use.
+    * Please don't use it in your production code.
+    *
+    * @return the currentObjects.
+    */
+   final ThreadLocal<LinkedList<Object>> getCurrentObjects()
+   {
+      return currentObjects;
+   }
+}

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/AbstractConnectionListener.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/AbstractConnectionListener.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/AbstractConnectionListener.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -21,8 +21,8 @@
  */
 package org.jboss.jca.core.connectionmanager.listener;
 
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.connectionmanager.ConnectionManager;
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.connectionmanager.pool.api.Pool;
 
 import java.util.Iterator;

Modified: projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionCacheListener.java
===================================================================
--- projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionCacheListener.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/main/java/org/jboss/jca/core/connectionmanager/listener/ConnectionCacheListener.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -38,7 +38,8 @@
  * @author <a href="mailto:adrian at jboss.com">Adrian Brock</a>
  * @version $Revision: 71554 $
  */
-public interface ConnectionCacheListener 
+public interface ConnectionCacheListener
+   extends org.jboss.jca.core.api.connectionmanager.listener.ConnectionCacheListener
 {
    /**
     * Notification of transaction started

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/ccm/CachedConnectionManagerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -66,7 +66,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionRecord cr0 = mock(ConnectionRecord.class);
@@ -108,7 +108,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       ccm.getCurrentObjects().set(null);
       //then
@@ -126,7 +126,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionRecord cr0 = mock(ConnectionRecord.class);
@@ -170,7 +170,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       ccm.getCurrentObjects().set(null);
       //then (parameters are not important the key of this test is that given ccm have no associations
@@ -188,7 +188,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionRecord cr0 = mock(ConnectionRecord.class);
@@ -234,7 +234,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm2 = mock(ConnectionCacheListener.class);
@@ -284,7 +284,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       ccm.getCurrentObjects().set(null);
       //then (parameters are not important the key of this test is that given ccm have no associations
@@ -302,7 +302,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionRecord cr0 = mock(ConnectionRecord.class);
@@ -347,7 +347,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
       ConnectionRecord cr0 = mock(ConnectionRecord.class);
@@ -394,7 +394,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       //when
       ccm.pushMetaAwareObject(mock(Object.class), null);
@@ -415,7 +415,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);
@@ -464,7 +464,7 @@
    {
       //given
       TransactionManager tm = mock(TransactionManager.class);
-      CachedConnectionManager ccm = new CachedConnectionManager(tm);
+      CachedConnectionManagerImpl ccm = new CachedConnectionManagerImpl(tm);
 
       ConnectionCacheListener cm0 = mock(ConnectionCacheListener.class);
       ConnectionCacheListener cm1 = mock(ConnectionCacheListener.class);

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/NoTxConnectionListenerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -226,7 +226,7 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager connectionManager = 
          cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool,
-                                    null, null, null, null);
+                                    null, null, false, null, null, null);
 
       noTxCm = ((NoTxConnectionManagerImpl) connectionManager);
 

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/listener/TxConnectionListenerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -24,7 +24,7 @@
 import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
 import org.jboss.jca.core.connectionmanager.ConnectionManagerFactory;
 import org.jboss.jca.core.connectionmanager.TxConnectionManager;
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl;
 import org.jboss.jca.core.connectionmanager.common.MockManagedConnectionFactory;
 import org.jboss.jca.core.connectionmanager.listener.TxConnectionListener.TransactionSynchronization;
 import org.jboss.jca.core.connectionmanager.pool.api.Pool;
@@ -492,7 +492,7 @@
       //given
       TxConnectionManager cm = mock(TxConnectionManager.class);
       ManagedConnection mc = mock(ManagedConnection.class);
-      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      CachedConnectionManagerImpl ccm = mock(CachedConnectionManagerImpl.class);
       when(cm.getCachedConnectionManager()).thenReturn(ccm);
       TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
       listener.setTrackByTx(false);
@@ -516,7 +516,7 @@
       //given
       TxConnectionManager cm = mock(TxConnectionManager.class);
       ManagedConnection mc = mock(ManagedConnection.class);
-      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      CachedConnectionManagerImpl ccm = mock(CachedConnectionManagerImpl.class);
       when(cm.getCachedConnectionManager()).thenReturn(ccm);
       TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
       listener.setTrackByTx(true);
@@ -540,7 +540,7 @@
       //given
       TxConnectionManager cm = mock(TxConnectionManager.class);
       ManagedConnection mc = mock(ManagedConnection.class);
-      CachedConnectionManager ccm = mock(CachedConnectionManager.class);
+      CachedConnectionManagerImpl ccm = mock(CachedConnectionManagerImpl.class);
       when(cm.getCachedConnectionManager()).thenReturn(ccm);
       TxConnectionListener listener = new TxConnectionListener(cm, mc, null, null, null);
       listener.setTrackByTx(true);
@@ -678,7 +678,7 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager connectionManager =
          cmf.createTransactional(TransactionSupportLevel.LocalTransaction, pool,
-                                 null, null, null, null, ti, null, null, null, null, null);
+                                 null, null, false, null, null, null, ti, null, null, null, null, null);
 
       txConnectionManager = (TxConnectionManager) connectionManager;
    }

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/NoTxConnectionManagerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -78,7 +78,7 @@
 
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       connectionManager = 
-         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, null, null, null, null);
+         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, null, null, false, null, null, null);
       assertNotNull(connectionManager);
 
       assertTrue(connectionManager instanceof NoTxConnectionManager);

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/SerializableTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/SerializableTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/notx/SerializableTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -65,7 +65,7 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
 
       ConnectionManager connectionManager = cmf.createNonTransactional(TransactionSupportLevel.NoTransaction,
-                                                                       pool, null, null, null, null);
+                                                                       pool, null, null, false, null, null, null);
       assertNotNull(connectionManager);
 
       ByteArrayOutputStream baos = new ByteArrayOutputStream();

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/PrefillTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/PrefillTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/pool/PrefillTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -70,7 +70,7 @@
       AbstractPrefillPool app = (AbstractPrefillPool)pool;
 
       NoTxConnectionManager noTxConnectionManager = 
-         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, null, null, null, null);
+         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, null, null, false, null, null, null);
 
       app.prefill(null, null, false);
 
@@ -111,7 +111,8 @@
       AbstractPrefillPool app = (AbstractPrefillPool)pool;
 
       NoTxConnectionManager noTxConnectionManager = 
-         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, null, null, null, null);
+         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, pool, 
+                                    null, null, false, null, null, null);
 
       app.prefill(null, null, false);
 
@@ -173,7 +174,8 @@
       AbstractPrefillPool app = (AbstractPrefillPool)pool;
 
       NoTxConnectionManager noTxConnectionManager = 
-         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, app, subjectFactory, "domain", null, null);
+         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, app,
+                                    subjectFactory, "domain", false, null, null, null);
 
       app.prefill(subject, null, false);
 
@@ -217,7 +219,8 @@
       AbstractPrefillPool app = (AbstractPrefillPool)pool;
 
       NoTxConnectionManager noTxConnectionManager = 
-         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, app, subjectFactory, "domain", null, null);
+         cmf.createNonTransactional(TransactionSupportLevel.NoTransaction, app,
+                                    subjectFactory, "domain", false, null, null, null);
 
       app.prefill(subject, null, false);
 

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/SerializableTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/SerializableTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/SerializableTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -73,7 +73,7 @@
 
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager connectionManager = cmf.createTransactional(TransactionSupportLevel.XATransaction,
-                                                                    pool, null, null, null, null, ti, 
+                                                                    pool, null, null, false, null, null, null, ti,
                                                                     Boolean.FALSE, null, null, null, null);
       assertNotNull(connectionManager);
 

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/TxConnectionManagerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -78,9 +78,6 @@
    @Test
    public void testAllocateConnection() throws Throwable
    {
-
-      assertNotNull(txConnectionManager.getCachedConnectionManager());
-
       TransactionManager transactionManager = txConnectionManager.getTransactionManager();
       TransactionSynchronizer.setTransactionIntegration(txConnectionManager.getTransactionIntegration());
 
@@ -322,7 +319,8 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager connectionManager = 
          cmf.createTransactional(TransactionSupportLevel.LocalTransaction, pool,
-                                 null, null, null, null, ti, null, null, null, null, null);
+                                 null, null, false, null,
+                                 null, null, ti, null, null, null, null, null);
 
       txConnectionManager = (TxConnectionManager) connectionManager;
    }

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/XATxConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/XATxConnectionManagerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/tx/XATxConnectionManagerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -289,7 +289,8 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager connectionManager =
          cmf.createTransactional(TransactionSupportLevel.XATransaction, pool,
-                                 null, null, null, null, ti, Boolean.FALSE, null, null, null, null);
+                                 null, null, false, null, null, null, ti,
+                                 Boolean.FALSE, null, null, null, null);
       assertNotNull(connectionManager);
 
       assertTrue(connectionManager instanceof TxConnectionManager);

Modified: projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/unit/AbstractConnectionManagerTestCase.java
===================================================================
--- projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/unit/AbstractConnectionManagerTestCase.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/core/src/test/java/org/jboss/jca/core/connectionmanager/unit/AbstractConnectionManagerTestCase.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -23,7 +23,7 @@
 
 import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
 import org.jboss.jca.core.connectionmanager.AbstractConnectionManager;
-import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManager;
+import org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl;
 import org.jboss.jca.core.connectionmanager.common.MockConnectionManager;
 import org.jboss.jca.core.connectionmanager.common.MockManagedConnectionFactory;
 import org.jboss.jca.core.connectionmanager.pool.api.Pool;
@@ -76,7 +76,7 @@
    {
       AbstractConnectionManager connectionManager = new MockConnectionManager();
       assertNull(connectionManager.getCachedConnectionManager());
-      connectionManager.setCachedConnectionManager(new CachedConnectionManager(null));
+      connectionManager.setCachedConnectionManager(new CachedConnectionManagerImpl(null));
       assertNotNull(connectionManager.getCachedConnectionManager());
    }
 

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractDsDeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractDsDeployer.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractDsDeployer.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -37,6 +37,7 @@
 import org.jboss.jca.common.api.metadata.ra.XsdString;
 import org.jboss.jca.common.metadata.merge.Merger;
 import org.jboss.jca.common.metadata.ra.common.ConfigPropertyImpl;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
 import org.jboss.jca.core.api.management.ManagementRepository;
 import org.jboss.jca.core.connectionmanager.ConnectionManager;
@@ -91,6 +92,9 @@
    /** The ManagementRepository */
    private ManagementRepository managementRepository = null;
 
+   /** Cached connection manager */
+   private CachedConnectionManager ccm;
+
    /**
     * Create a new AbstractDsDeployer.
     * @param log The logger
@@ -100,6 +104,7 @@
       this.log = log;
       this.transactionIntegration = null;
       this.mdr = null;
+      this.ccm = null;
    }
 
    /**
@@ -159,6 +164,24 @@
    }
 
    /**
+    * Set the ccm
+    * @param value The value
+    */
+   public void setCachedConnectionManager(CachedConnectionManager value)
+   {
+      ccm = value;
+   }
+
+   /**
+    * Get the ccm
+    * @return The handle
+    */
+   public CachedConnectionManager getCachedConnectionManager()
+   {
+      return ccm;
+   }
+
+   /**
    *
    * create objects and inject value for this depployment. it is a general method returning a {@link CommonDeployment}
    * to be used to exchange objects needed to real injection in the container
@@ -380,6 +403,7 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager cm =
          cmf.createTransactional(tsl, pool, getSubjectFactory(securityDomain), securityDomain,
+                                 ds.isUseCcm(), ccm,
                                  allocationRetry, allocationRetryWaitMillis,
                                  getTransactionIntegration(),
                                  null, null, null, null, null);
@@ -550,6 +574,7 @@
       ConnectionManagerFactory cmf = new ConnectionManagerFactory();
       ConnectionManager cm =
          cmf.createTransactional(tsl, pool, getSubjectFactory(securityDomain), securityDomain,
+                                 ds.isUseCcm(), ccm,
                                  allocationRetry, allocationRetryWaitMillis,
                                  getTransactionIntegration(), interleaving,
                                  xaResourceTimeout, isSameRMOverride, wrapXAResource, padXid);

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/common/AbstractResourceAdapterDeployer.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -44,6 +44,7 @@
 import org.jboss.jca.common.api.metadata.ra.ra10.ResourceAdapter10;
 import org.jboss.jca.common.metadata.ra.common.ConfigPropertyImpl;
 import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.api.connectionmanager.pool.PoolConfiguration;
 import org.jboss.jca.core.connectionmanager.ConnectionManager;
 import org.jboss.jca.core.connectionmanager.ConnectionManagerFactory;
@@ -1000,11 +1001,16 @@
                            allocationRetryWaitMillis = ijCD.getTimeOut().getAllocationRetryWaitMillis();
                      }
 
+                     Boolean useCCM = Boolean.TRUE;
+                     if (ijCD != null)
+                        useCCM = ijCD.isUseCcm();
+
                      // Select the correct connection manager
                      if (tsl == TransactionSupportLevel.NoTransaction)
                      {
                         cm = cmf.createNonTransactional(tsl, pool,
                                                         getSubjectFactory(securityDomain), securityDomain,
+                                                        useCCM, getCachedConnectionManager(),
                                                         allocationRetry, allocationRetryWaitMillis);
                      }
                      else
@@ -1046,6 +1052,7 @@
 
                         cm = cmf.createTransactional(tsl, pool,
                                                      getSubjectFactory(securityDomain), securityDomain,
+                                                     useCCM, getCachedConnectionManager(),
                                                      allocationRetry, allocationRetryWaitMillis,
                                                      getTransactionIntegration(), interleaving,
                                                      xaResourceTimeout, isSameRMOverride,
@@ -1363,12 +1370,17 @@
                                        allocationRetryWaitMillis = ijCD.getTimeOut().getAllocationRetryWaitMillis();
                                  }
 
+                                 Boolean useCCM = Boolean.TRUE;
+                                 if (ijCD != null)
+                                    useCCM = ijCD.isUseCcm();
+
                                  // Select the correct connection manager
                                  if (tsl == TransactionSupportLevel.NoTransaction)
                                  {
                                     cm = cmf.createNonTransactional(tsl, pool,
                                                                     getSubjectFactory(securityDomain),
                                                                     securityDomain,
+                                                                    useCCM, getCachedConnectionManager(),
                                                                     allocationRetry, allocationRetryWaitMillis);
                                  }
                                  else
@@ -1412,6 +1424,7 @@
 
                                     cm = cmf.createTransactional(tsl, pool,
                                                                  getSubjectFactory(securityDomain), securityDomain,
+                                                                 useCCM, getCachedConnectionManager(),
                                                                  allocationRetry, allocationRetryWaitMillis,
                                                                  getTransactionIntegration(),
                                                                  interleaving,
@@ -1777,6 +1790,12 @@
    protected abstract SubjectFactory getSubjectFactory(String securityDomain) throws DeployException;
 
    /**
+    * Get the cached connection manager
+    * @return The handle
+    */
+   protected abstract CachedConnectionManager getCachedConnectionManager();
+
+   /**
     * Get management views for config property's
     * @param cps The config property's
     * @return The management view of these

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/AbstractFungalRADeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/AbstractFungalRADeployer.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/AbstractFungalRADeployer.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -25,6 +25,7 @@
 import org.jboss.jca.common.api.metadata.ironjacamar.IronJacamar;
 import org.jboss.jca.common.api.metadata.ra.ConfigProperty;
 import org.jboss.jca.common.api.metadata.ra.Connector;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.spi.naming.JndiStrategy;
 import org.jboss.jca.core.spi.transaction.TransactionIntegration;
 import org.jboss.jca.deployers.common.AbstractResourceAdapterDeployer;
@@ -651,4 +652,10 @@
          throw new DeployException("Error during loookup of security domain: " + securityDomain, t);
       }
    }
+
+   @Override
+   protected CachedConnectionManager getCachedConnectionManager()
+   {
+      return ((RAConfiguration) getConfiguration()).getCachedConnectionManager();
+   }
 }

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/DsXmlDeployer.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/DsXmlDeployer.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/DsXmlDeployer.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -299,6 +299,9 @@
 
       if (jdbcXA == null)
          throw new IllegalStateException("JDBCXA not defined");
+
+      if (getCachedConnectionManager() == null)
+         throw new IllegalStateException("CachedConnectionManager not defined");
    }
 
    @Override

Modified: projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RAConfiguration.java
===================================================================
--- projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RAConfiguration.java	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/deployers/src/main/java/org/jboss/jca/deployers/fungal/RAConfiguration.java	2011-04-14 12:48:23 UTC (rev 111180)
@@ -23,6 +23,7 @@
 package org.jboss.jca.deployers.fungal;
 
 import org.jboss.jca.core.api.bootstrap.CloneableBootstrapContext;
+import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
 import org.jboss.jca.core.api.management.ManagementRepository;
 import org.jboss.jca.core.spi.mdr.MetadataRepository;
 import org.jboss.jca.core.spi.naming.JndiStrategy;
@@ -85,6 +86,9 @@
    /** The resource adapter repository */
    private ResourceAdapterRepository resourceAdapterRepository;
 
+   /** The cached connection manager */
+   private CachedConnectionManager ccm;
+
    /**
     * Constructor
     */
@@ -339,6 +343,24 @@
    }
 
    /**
+    * Set the cached connection manager
+    * @param value The value
+    */
+   public void setCachedConnectionManager(CachedConnectionManager value)
+   {
+      ccm = value;
+   }
+
+   /**
+    * Get the cached connection manager
+    * @return The handle
+    */
+   public CachedConnectionManager getCachedConnectionManager()
+   {
+      return ccm;
+   }
+
+   /**
     * Start
     */
    public void start()
@@ -360,5 +382,8 @@
 
       if (resourceAdapterRepository == null)
          throw new IllegalStateException("ResourceAdapterRepository not defined");
+
+      if (ccm == null)
+         throw new IllegalStateException("CachedConnectionManager not defined");
    }
 }

Modified: projects/jboss-jca/trunk/doc/userguide/en-US/modules/deployment.xml
===================================================================
--- projects/jboss-jca/trunk/doc/userguide/en-US/modules/deployment.xml	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/doc/userguide/en-US/modules/deployment.xml	2011-04-14 12:48:23 UTC (rev 111180)
@@ -222,6 +222,12 @@
                  Specifies the pool name for the object
                </entry>
              </row>
+             <row>
+               <entry><code>use-ccm</code></entry>
+               <entry>
+                 Enable the cache connection manager
+               </entry>
+             </row>
            </tbody>
          </tgroup>
        </table>
@@ -688,6 +694,12 @@
                   The logging category <code>org.jboss.jdbc</code> must be enabled too.
                 </entry>
               </row>
+              <row>
+                <entry><code>use-ccm</code></entry>
+                <entry>
+                  Enable the cached connection manager
+                </entry>
+              </row>
             </tbody>
           </tgroup>
         </table>

Modified: projects/jboss-jca/trunk/embedded/src/main/resources/ds.xml
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/resources/ds.xml	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/embedded/src/main/resources/ds.xml	2011-04-14 12:48:23 UTC (rev 111180)
@@ -9,6 +9,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="Kernel"><inject bean="Kernel"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
 </deployment>

Modified: projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml
===================================================================
--- projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/embedded/src/main/resources/jca.xml	2011-04-14 12:48:23 UTC (rev 111180)
@@ -139,6 +139,17 @@
         interface="org.jboss.jca.core.spi.mdr.MetadataRepository"
         class="org.jboss.jca.core.mdr.SimpleMetadataRepository"/>
 
+  <!-- CCM -->
+  <bean name="CCM"
+        interface="org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager"
+        class="org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl">
+    <constructor>
+      <parameter><inject bean="TransactionIntegration" property="TransactionManager"/></parameter>
+    </constructor>
+    <property name="Debug">false</property>
+    <property name="Error">false</property>
+  </bean>
+
   <!-- Resource adapter repository -->
   <bean name="ResourceAdapterRepository"
         interface="org.jboss.jca.core.spi.rar.ResourceAdapterRepository"
@@ -173,6 +184,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
     <property name="ResourceAdapterRepository"><inject bean="ResourceAdapterRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
   <!-- Activator configuration -->
@@ -189,6 +201,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
     <property name="ResourceAdapterRepository"><inject bean="ResourceAdapterRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
   <!-- RA deployer -->

Modified: projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/ds.xml
===================================================================
--- projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/ds.xml	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/ds.xml	2011-04-14 12:48:23 UTC (rev 111180)
@@ -10,6 +10,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="Kernel"><inject bean="Kernel"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
 </deployment>

Modified: projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml
===================================================================
--- projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml	2011-04-13 13:53:00 UTC (rev 111179)
+++ projects/jboss-jca/trunk/sjc/src/main/resources/bootstrap/jca.xml	2011-04-14 12:48:23 UTC (rev 111180)
@@ -142,6 +142,17 @@
         interface="org.jboss.jca.core.spi.mdr.MetadataRepository"
         class="org.jboss.jca.core.mdr.SimpleMetadataRepository"/>
 
+  <!-- CCM -->
+  <bean name="CCM"
+        interface="org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager"
+        class="org.jboss.jca.core.connectionmanager.ccm.CachedConnectionManagerImpl">
+    <constructor>
+      <parameter><inject bean="TransactionIntegration" property="TransactionManager"/></parameter>
+    </constructor>
+    <property name="Debug">false</property>
+    <property name="Error">false</property>
+  </bean>
+
   <!-- Resource adapter repository -->
   <bean name="ResourceAdapterRepository"
         interface="org.jboss.jca.core.spi.rar.ResourceAdapterRepository"
@@ -167,6 +178,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
     <property name="ResourceAdapterRepository"><inject bean="ResourceAdapterRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
   <!-- Activator configuration -->
@@ -183,6 +195,7 @@
     <property name="MetadataRepository"><inject bean="MDR"/></property>
     <property name="ManagementRepository"><inject bean="ManagementRepository"/></property>
     <property name="ResourceAdapterRepository"><inject bean="ResourceAdapterRepository"/></property>
+    <property name="CachedConnectionManager"><inject bean="CCM"/></property>
   </bean>
 
   <!-- RA deployer -->



More information about the jboss-cvs-commits mailing list