[jboss-cvs] JBossAS SVN: r109734 - in trunk/connector/src: main/java/org/jboss/resource/deployers and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Mon Dec 6 20:36:34 EST 2010


Author: weston.price at jboss.com
Date: 2010-12-06 20:36:33 -0500 (Mon, 06 Dec 2010)
New Revision: 109734

Added:
   trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployerHelper.java
Modified:
   trunk/connector/src/main/java/org/jboss/resource/adapter/jdbc/local/LocalManagedConnectionFactory.java
   trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java
   trunk/connector/src/main/java/org/jboss/resource/metadata/mcf/NonXADataSourceDeploymentMetaData.java
   trunk/connector/src/resources/local-rar/META-INF/ra.xml
Log:
[JBAS-8559] New DataSourceDeployer to handle data sources that can be defined as per the EE6 specification EE5.17 wherein data sources can be defined in application.xml, ejb-jar.xml, web.xml and application-client.xml descriptors. Further, DataSourceDefinitions can be defined as annotations on individual components and this deployer will handle those cases as well. Support has been added to support DataSource properties as well as being able to acquire a java.sql.Connection from a DataSource rather than the java.sql.DriverManager. 

Modified: trunk/connector/src/main/java/org/jboss/resource/adapter/jdbc/local/LocalManagedConnectionFactory.java
===================================================================
--- trunk/connector/src/main/java/org/jboss/resource/adapter/jdbc/local/LocalManagedConnectionFactory.java	2010-12-06 18:19:59 UTC (rev 109733)
+++ trunk/connector/src/main/java/org/jboss/resource/adapter/jdbc/local/LocalManagedConnectionFactory.java	2010-12-07 01:36:33 UTC (rev 109734)
@@ -21,18 +21,21 @@
  */
 package org.jboss.resource.adapter.jdbc.local;
 
-import org.jboss.resource.adapter.jdbc.URLSelectorStrategy;
+import java.beans.PropertyEditor;
+import java.beans.PropertyEditorManager;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.sql.Connection;
 import java.sql.Driver;
 import java.sql.DriverManager;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Properties;
-import java.util.List;
 import java.util.Set;
 
 import javax.resource.ResourceException;
@@ -40,9 +43,11 @@
 import javax.resource.spi.ConnectionRequestInfo;
 import javax.resource.spi.ManagedConnection;
 import javax.security.auth.Subject;
+import javax.sql.DataSource;
 
 import org.jboss.resource.JBossResourceException;
 import org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnectionFactory;
+import org.jboss.resource.adapter.jdbc.URLSelectorStrategy;
 import org.jboss.util.NestedRuntimeException;
 
 /**
@@ -59,13 +64,17 @@
    private String driverClass;
 
    private transient Driver driver;
-
+   
+   private transient DataSource dataSource;
+   
    private String connectionURL;
    
    private URLSelectorStrategy urlSelector;
 
    protected String connectionProperties;
-
+   
+   private boolean useDataSource;
+   
    public LocalManagedConnectionFactory()
    {
 
@@ -77,7 +86,7 @@
       // check some invariants before they come back to haunt us
       if(driverClass == null)
          throw new JBossResourceException("driverClass is null");
-      if(connectionURL == null)
+      if(connectionURL == null && !isUseDataSource())
          throw new JBossResourceException("connectionURL is null");
       
       return super.createConnectionFactory(cm);
@@ -165,6 +174,17 @@
       }
    }
 
+   
+   public boolean isUseDataSource() 
+   {
+	   return useDataSource;
+   }
+
+   public void setUseDataSource(boolean useDataSource) 
+   {
+	   this.useDataSource = useDataSource;
+   }
+
    public ManagedConnection createManagedConnection(Subject subject, ConnectionRequestInfo cri)
          throws javax.resource.ResourceException
    {
@@ -202,12 +222,28 @@
        Connection con = null;
 	   try
 	   {
-		   String url = getConnectionURL();
-		   Driver d = getDriver(url); 
-		   con = d.connect(url, copy);
-		   if (con == null)
-			   throw new JBossResourceException("Wrong driver class for this connection URL");
+		   if(!useDataSource)
+		   {
+			   String url = getConnectionURL();
+			   Driver d = getDriver(url); 
+			   con = d.connect(url, copy);
+			   if (con == null)
+				   throw new JBossResourceException("Wrong driver class for this connection URL");			   
+		   }
+		   else
+		   {
+			   final String user = props.getProperty("user");
+			   final String password = props.getProperty("password");
+			
+			   con = (user != null)
+					 ? getDataSource().getConnection(user, password)
+					 : getDataSource().getConnection();
 
+			   if (con == null)
+				   	throw new JBossResourceException("Could not create connection from data source " + getDriverClass());			   
+	 
+		   }
+		   
 		   return new LocalManagedConnection(this, con, props, transactionIsolation, preparedStatementCacheSize);
 	   }
 	   catch (Throwable e)
@@ -416,6 +452,7 @@
    public int hashCode()
    {
       int result = 17;
+    
       result = result * 37 + ((connectionURL == null) ? 0 : connectionURL.hashCode());
       result = result * 37 + ((driverClass == null) ? 0 : driverClass.hashCode());
       result = result * 37 + ((userName == null) ? 0 : userName.hashCode());
@@ -431,11 +468,23 @@
       if (getClass() != other.getClass())
          return false;
       LocalManagedConnectionFactory otherMcf = (LocalManagedConnectionFactory) other;
-      return this.connectionURL.equals(otherMcf.connectionURL) && this.driverClass.equals(otherMcf.driverClass)
-            && ((this.userName == null) ? otherMcf.userName == null : this.userName.equals(otherMcf.userName))
-            && ((this.password == null) ? otherMcf.password == null : this.password.equals(otherMcf.password))
-            && this.transactionIsolation == otherMcf.transactionIsolation;
-
+      
+      if(!useDataSource)
+      {
+          return this.connectionURL.equals(otherMcf.connectionURL) && this.driverClass.equals(otherMcf.driverClass)
+          && ((this.userName == null) ? otherMcf.userName == null : this.userName.equals(otherMcf.userName))
+          && ((this.password == null) ? otherMcf.password == null : this.password.equals(otherMcf.password))
+          && this.transactionIsolation == otherMcf.transactionIsolation;
+    	  
+      }
+      else
+      {
+          return this.driverClass.equals(otherMcf.driverClass) && this.connectionProps.equals(otherMcf.connectionProps)
+          && ((this.userName == null) ? otherMcf.userName == null : this.userName.equals(otherMcf.userName))
+          && ((this.password == null) ? otherMcf.password == null : this.password.equals(otherMcf.password))
+          && this.transactionIsolation == otherMcf.transactionIsolation;
+    	  
+      }
    }
 
    /**
@@ -516,4 +565,91 @@
    {
       return connectionURL;
    }
+
+   private synchronized DataSource getDataSource() throws ResourceException {
+		
+		 if (dataSource == null)
+	      {
+	         if (driverClass == null)
+	            throw new JBossResourceException("No DataSourceClass supplied!");
+	         
+	         try
+	         {
+	            Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(driverClass);
+	            dataSource = (DataSource) clazz.newInstance();
+	            Class<?>[] NOCLASSES = new Class[] {};
+	            
+	            for (Iterator i = this.connectionProps.keySet().iterator(); i.hasNext();)
+	            {
+	               String name = (String) i.next();
+	               String value = this.connectionProps.getProperty(name);      
+	               char firstCharName = Character.toUpperCase(name.charAt(0));
+	           	   if (name.length() > 1)
+	            	       name = firstCharName+name.substring(1);
+	           	   else
+	            		   name = ""+firstCharName;            		              	                              		              	                 
+	               //This is a bad solution.  On the other hand the only known example
+	               // of a setter with no getter is for Oracle with password.
+	               //Anyway, each xadatasource implementation should get its
+	               //own subclass of this that explicitly sets the
+	               //properties individually.
+	               Class type = null;
+	               try
+	               {
+	                  Method getter = clazz.getMethod("get" + name, NOCLASSES);
+	                  type = getter.getReturnType();
+	               }
+	               catch (NoSuchMethodException e)
+	               {
+	                  try
+	                  {
+	                     Method isMethod = clazz.getMethod("is" + name, NOCLASSES);
+	                     type = isMethod.getReturnType();
+	                  }
+	                  catch(NoSuchMethodException nsme)
+	                  {
+	                     type = String.class;
+	                  }
+	               }
+
+	               Method setter = clazz.getMethod("set" + name, new Class[] { type });
+	               PropertyEditor editor = PropertyEditorManager.findEditor(type);
+	               if (editor == null)
+	                  throw new JBossResourceException("No property editor found for type: " + type);
+	               editor.setAsText(value);
+	               setter.invoke(dataSource, new Object[] { editor.getValue() });
+	            }
+	         }
+	         catch (ClassNotFoundException cnfe)
+	         {
+	            throw new JBossResourceException("Class not found for DataSource " + getDriverClass(), cnfe);
+	         }
+	         catch (InstantiationException ie)
+	         {
+	            throw new JBossResourceException("Could not create an DataSource: ", ie);
+	         }
+	         catch (IllegalAccessException iae)
+	         {
+	            throw new JBossResourceException("Could not set a property: ", iae);
+	         }
+	         catch (IllegalArgumentException iae)
+	         {
+	            throw new JBossResourceException("Could not set a property: ", iae);
+	         }
+	         catch (InvocationTargetException ite)
+	         {
+	            throw new JBossResourceException("Could not invoke setter on DataSource: ", ite);
+	         }
+	         catch (NoSuchMethodException nsme)
+	         {
+	            throw new JBossResourceException("Could not find accessor on DataSource: ", nsme);
+	         }
+	      }
+	      return dataSource;
+
+	}
+
+
+   
+
 }

Modified: trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java
===================================================================
--- trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java	2010-12-06 18:19:59 UTC (rev 109733)
+++ trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java	2010-12-07 01:36:33 UTC (rev 109734)
@@ -1,8 +1,5 @@
 package org.jboss.resource.deployers;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import org.jboss.deployers.spi.DeploymentException;
 import org.jboss.deployers.spi.deployer.DeploymentStages;
 import org.jboss.deployers.spi.deployer.helpers.AbstractDeployer;
@@ -12,21 +9,15 @@
 import org.jboss.metadata.client.spec.ApplicationClientMetaData;
 import org.jboss.metadata.ear.spec.Ear60MetaData;
 import org.jboss.metadata.ear.spec.EarMetaData;
-import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeanMetaData;
 import org.jboss.metadata.ejb.jboss.JBossEnterpriseBeansMetaData;
 import org.jboss.metadata.ejb.jboss.JBossMetaData;
 import org.jboss.metadata.javaee.spec.DataSourceMetaData;
 import org.jboss.metadata.javaee.spec.DataSourcesMetaData;
 import org.jboss.metadata.javaee.spec.Environment;
-import org.jboss.metadata.javaee.spec.PropertyMetaData;
 import org.jboss.metadata.web.spec.WebMetaData;
 import org.jboss.resource.metadata.mcf.ConnectionPoolMetaData;
-import org.jboss.resource.metadata.mcf.DataSourceConnectionPropertyMetaData;
-import org.jboss.resource.metadata.mcf.LocalDataSourceDeploymentMetaData;
+import org.jboss.resource.metadata.mcf.DataSourceDeploymentMetaData;
 import org.jboss.resource.metadata.mcf.ManagedConnectionFactoryDeploymentGroup;
-import org.jboss.resource.metadata.mcf.NoTxDataSourceDeploymentMetaData;
-import org.jboss.resource.metadata.mcf.NonXADataSourceDeploymentMetaData;
-import org.jboss.resource.metadata.repository.DefaultJCAMetaDataRepository;
 
 /**
  * The DataSourceDeployer is designed to satisfy the EE6 specification
@@ -101,24 +92,22 @@
 	private ManagedConnectionFactoryDeploymentGroup getMCFMetaData(DataSourcesMetaData dataSources) 
 	{
 		ManagedConnectionFactoryDeploymentGroup group = new ManagedConnectionFactoryDeploymentGroup();
-		NonXADataSourceDeploymentMetaData depMd = null;
+		DataSourceDeploymentMetaData depMd = null;
 		
 		for(String key: dataSources.keySet())
 		{
 			DataSourceMetaData dsmd = dataSources.get(key);
-			
+
 			if(dsmd.isTransactional())
 			{
-				depMd = new LocalDataSourceDeploymentMetaData();
+				depMd = DataSourceDeployerHelper.createTxnDeployment(dsmd);
 			}
 			else
 			{
-				depMd = new  NoTxDataSourceDeploymentMetaData();				
+				depMd = DataSourceDeployerHelper.createNonTxnDeployment(dsmd);				
 			}
-									
+			
 			depMd.setJndiName(normalizeJndiName(dsmd.getName()));
-			depMd.setDriverClass(dsmd.getClassName());
-			depMd.setConnectionUrl(dsmd.getUrl());
 			depMd.setUserName(dsmd.getUser());
 			depMd.setPassWord(dsmd.getPassword());
 			
@@ -126,26 +115,18 @@
 			{
 				depMd.setTransactionIsolation(dsmd.getIsolationLevel().toString());				
 			}
+												
+			ConnectionPoolMetaData cpmd = (ConnectionPoolMetaData)depMd;
 			
-			List<DataSourceConnectionPropertyMetaData> connProps = new ArrayList<DataSourceConnectionPropertyMetaData>();
-			depMd.setDataSourceConnectionProperties(connProps);
-			
-			if(dsmd.getProperties() != null && dsmd.getProperties().keySet().size() > 0)
+			if(dsmd.getMinPoolSize() < 0)
 			{
-				for(String propKey: dsmd.getProperties().keySet())
-				{
-					PropertyMetaData prop = dsmd.getProperties().get(propKey);
-					DataSourceConnectionPropertyMetaData dsProp = new DataSourceConnectionPropertyMetaData();
-					dsProp.setName(propKey);
-					dsProp.setValue(prop.getName());
-				}
-				
+				cpmd.setMinSize(0);
 			}
+			else
+			{
+				cpmd.setMinSize(dsmd.getMinPoolSize());
+			}
 			
-			//TODO max statements should be handled
-			
-			ConnectionPoolMetaData cpmd = (ConnectionPoolMetaData)depMd;
-			cpmd.setMinSize(dsmd.getMinPoolSize());
 			cpmd.setMaxSize(dsmd.getMaxPoolSize());
 			cpmd.setIdleTimeoutMinutes(dsmd.getMaxIdleTime() / 60);						
 			cpmd.setBlockingTimeoutMilliSeconds(dsmd.getLoginTimeout() * 1000);

Added: trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployerHelper.java
===================================================================
--- trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployerHelper.java	                        (rev 0)
+++ trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployerHelper.java	2010-12-07 01:36:33 UTC (rev 109734)
@@ -0,0 +1,158 @@
+package org.jboss.resource.deployers;
+
+import java.util.List;
+
+import org.jboss.metadata.javaee.spec.DataSourceMetaData;
+import org.jboss.metadata.javaee.spec.PropertyMetaData;
+import org.jboss.resource.metadata.mcf.DataSourceConnectionPropertyMetaData;
+import org.jboss.resource.metadata.mcf.DataSourceDeploymentMetaData;
+import org.jboss.resource.metadata.mcf.NoTxDataSourceDeploymentMetaData;
+import org.jboss.resource.metadata.mcf.XAConnectionPropertyMetaData;
+import org.jboss.resource.metadata.mcf.XADataSourceDeploymentMetaData;
+
+/**
+ * Simple helper class for generating DataSourceDeploymentMetaData from a DataSourceDefinition as provided by EE5.17
+ * @author Weston M. Price
+ *
+ */
+public class DataSourceDeployerHelper {
+
+	
+	public static DataSourceDeploymentMetaData createTxnDeployment(final DataSourceMetaData dsmd)
+	{
+		XADataSourceDeploymentMetaData depMd = new XADataSourceDeploymentMetaData();
+		depMd.setXaDataSourceClass(dsmd.getClassName());
+		List<XAConnectionPropertyMetaData> xaProps = depMd.getXADataSourceProperties();
+
+		boolean useUrl = true;
+
+		String serverName = dsmd.getServerName();
+		String dataBaseName = dsmd.getDatabaseName();
+		int portNumber = dsmd.getPortNumber();
+		String url = dsmd.getUrl();
+
+		XAConnectionPropertyMetaData xaProp = null;
+		
+		if(serverName != null && !serverName.isEmpty())
+		{
+			useUrl = false;
+			xaProp = new XAConnectionPropertyMetaData();
+			xaProp.setName("serverName");
+			xaProp.setValue(serverName);
+			xaProps.add(xaProp);
+		}
+		
+		if(dataBaseName != null && !dataBaseName.isEmpty())
+		{
+			useUrl = false;
+			xaProp = new XAConnectionPropertyMetaData();
+			xaProp.setName("databaseName");
+			xaProp.setValue(dataBaseName);					
+			xaProps.add(xaProp);
+		}
+		
+		if(portNumber > -1)
+		{
+			useUrl = false;
+			xaProp = new XAConnectionPropertyMetaData();
+			xaProp.setName("portNumber");
+			xaProp.setValue(String.valueOf(portNumber));					
+			xaProps.add(xaProp);
+			
+		}
+		
+		if(useUrl)
+		{
+			depMd.setURLProperty(url);
+		}
+		
+		if(dsmd.getProperties() != null && dsmd.getProperties().keySet().size() > 0)
+		{
+			for(String key: dsmd.getProperties().keySet())
+			{
+				PropertyMetaData pmd = dsmd.getProperties().get(key);
+				xaProp = new XAConnectionPropertyMetaData();
+				xaProp.setName(pmd.getName());
+				xaProp.setValue(pmd.getValue());
+				xaProps.add(xaProp);
+			}
+			
+		}
+		
+		return depMd;
+	}
+	
+	
+	public static DataSourceDeploymentMetaData createNonTxnDeployment(final DataSourceMetaData dsmd)
+	{
+		NoTxDataSourceDeploymentMetaData depMd = new NoTxDataSourceDeploymentMetaData();
+		depMd.setDriverClass(dsmd.getClassName());
+		List<DataSourceConnectionPropertyMetaData> xaProps = depMd.getDataSourceConnectionProperties();
+
+		boolean useUrl = true;
+
+		String serverName = dsmd.getServerName();
+		String dataBaseName = dsmd.getDatabaseName();
+		int portNumber = dsmd.getPortNumber();
+		String url = dsmd.getUrl();
+
+		DataSourceConnectionPropertyMetaData xaProp = null;
+		
+		if(serverName != null && !serverName.isEmpty())
+		{
+			useUrl = false;
+			xaProp = new DataSourceConnectionPropertyMetaData();
+			xaProp.setName("serverName");
+			xaProp.setValue(serverName);
+			xaProps.add(xaProp);
+		}
+		
+		if(dataBaseName != null && !dataBaseName.isEmpty())
+		{
+			useUrl = false;
+			xaProp = new DataSourceConnectionPropertyMetaData();
+			xaProp.setName("databaseName");
+			xaProp.setValue(dataBaseName);					
+			xaProps.add(xaProp);
+		}
+		
+		if(portNumber > -1)
+		{
+			useUrl = false;
+			xaProp = new DataSourceConnectionPropertyMetaData();
+			xaProp.setName("portNumber");
+			xaProp.setValue(String.valueOf(portNumber));					
+			xaProps.add(xaProp);
+			
+		}
+		
+		if(useUrl)
+		{
+			depMd.setConnectionUrl(url);
+		}
+		else
+		{
+			//Hack for EE5.17 we are going to use the new DataSource rar to manage data sources that do not specify a Url, or specify properties
+			//within the deployment ie serverName, dataBaseName etc. This is largely to reduce the number of changes required to support
+			//this particular section in the spec.
+			depMd.setUseDataSource(true);
+			//depMd.setRarName("jboss-datasource-jdbc.rar");
+		}
+
+		if(dsmd.getProperties() != null && dsmd.getProperties().keySet().size() > 0)
+		{
+			for(String key: dsmd.getProperties().keySet())
+			{
+				PropertyMetaData pmd = dsmd.getProperties().get(key);
+				xaProp = new DataSourceConnectionPropertyMetaData();
+				xaProp.setName(pmd.getName());
+				xaProp.setValue(pmd.getValue());
+				xaProps.add(xaProp);
+			}
+			
+		}
+
+		return depMd;
+	}
+	
+}

Modified: trunk/connector/src/main/java/org/jboss/resource/metadata/mcf/NonXADataSourceDeploymentMetaData.java
===================================================================
--- trunk/connector/src/main/java/org/jboss/resource/metadata/mcf/NonXADataSourceDeploymentMetaData.java	2010-12-06 18:19:59 UTC (rev 109733)
+++ trunk/connector/src/main/java/org/jboss/resource/metadata/mcf/NonXADataSourceDeploymentMetaData.java	2010-12-07 01:36:33 UTC (rev 109734)
@@ -27,6 +27,7 @@
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
 import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
@@ -55,9 +56,12 @@
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    private String connectionUrl;
    
+   @XmlTransient
+   private boolean useDataSource;
+   
    @XmlElement(name="connection-property")
    private List<DataSourceConnectionPropertyMetaData> connectionProperties = new ArrayList<DataSourceConnectionPropertyMetaData>();
-
+   
    @ManagementProperty(name="connection-url",
          description="The DataSource connection URL",
          mandatory=true, includeInTemplate=true)
@@ -98,7 +102,18 @@
       this.connectionProperties = connectionProperties;
    }
    
-   @Override
+   @ManagementProperty(name="use-data-source", includeInTemplate=true)   
+   public boolean isUseDataSource() 
+   {
+	  return useDataSource;
+   }
+
+   public void setUseDataSource(boolean useDataSource) 
+   {
+	   this.useDataSource = useDataSource;
+   }
+
+ at Override
    @ManagementProperty(name="config-property",
          description="The connection factory property info",
          managed=true, readOnly = true)
@@ -126,6 +141,12 @@
          properties.add(property);         
       }
       
+      property = new ManagedConnectionFactoryPropertyMetaData();
+      property.setName("UseDataSource");
+      property.setType("boolean");
+      property.setValue(String.valueOf(isUseDataSource()));
+      properties.add(property);
+      
       StringBuffer propBuff = new StringBuffer();
       List<DataSourceConnectionPropertyMetaData> dsProps = getDataSourceConnectionProperties();
 

Modified: trunk/connector/src/resources/local-rar/META-INF/ra.xml
===================================================================
--- trunk/connector/src/resources/local-rar/META-INF/ra.xml	2010-12-06 18:19:59 UTC (rev 109733)
+++ trunk/connector/src/resources/local-rar/META-INF/ra.xml	2010-12-07 01:36:33 UTC (rev 109734)
@@ -146,6 +146,11 @@
                <config-property-name>UseTryLock</config-property-name>
                <config-property-type>java.lang.Integer</config-property-type>
             </config-property>
+            <config-property>
+               <description>Whether or not to use a javax.sql.DataSource to create connections</description>
+               <config-property-name>UseDataSource</config-property-name>
+               <config-property-type>java.lang.Boolean</config-property-type>
+            </config-property>
             <connectionfactory-interface>javax.sql.DataSource</connectionfactory-interface>
             <connectionfactory-impl-class>org.jboss.resource.adapter.jdbc.WrapperDataSource</connectionfactory-impl-class>
             <connection-interface>java.sql.Connection</connection-interface>



More information about the jboss-cvs-commits mailing list