[jboss-cvs] JBossAS SVN: r109664 - in trunk/connector/src: resources/deployers and 1 other directory.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Dec 2 14:33:11 EST 2010


Author: weston.price at jboss.com
Date: 2010-12-02 14:33:11 -0500 (Thu, 02 Dec 2010)
New Revision: 109664

Added:
   trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java
Modified:
   trunk/connector/src/resources/deployers/jca-deployers-jboss-beans.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. This is still a work in in progress with EJB being the most notable outstanding component type left to complete. 

Added: trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java
===================================================================
--- trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java	                        (rev 0)
+++ trunk/connector/src/main/java/org/jboss/resource/deployers/DataSourceDeployer.java	2010-12-02 19:33:11 UTC (rev 109664)
@@ -0,0 +1,246 @@
+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;
+import org.jboss.deployers.structure.spi.DeploymentUnit;
+import org.jboss.logging.Logger;
+import org.jboss.metadata.client.spec.ApplicationClient6MetaData;
+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.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
+ * requirement 5.17 where data-sources can be defined in the application.xml,
+ * ejb-jar.xml, web.xml and application-client.xml descriptors. The
+ * DataSourceDeployer simply reads the appropriate instances of meta data and
+ * translates each to the appropriate ManagedConnectionFactoryDeployment type which is in turn
+ * passed to the ManagedConnectionFactoryDeployer for real deployment.
+ * 
+ * @author Weston M. Price
+ * 
+ * 
+ */
+public class DataSourceDeployer extends AbstractDeployer {
+
+	private static final Logger logger = Logger.getLogger(DataSourceDeployer.class);
+	
+	private boolean isEARSupported = true;
+	private boolean isWARSupported = true;
+	private boolean isEJBSupported = true;
+	private boolean isCARSupported = true;
+	
+	public DataSourceDeployer() {
+		setStage(DeploymentStages.POST_CLASSLOADER);
+		addInput(EarMetaData.class);
+		addInput(WebMetaData.class);
+		addInput("annotated."+ WebMetaData.class.getName() + ":classes");
+		addInput(ApplicationClient6MetaData.class);
+		addInput(JBossMetaData.class);
+	}
+		
+	public boolean isEARSupported() {
+		return isEARSupported;
+	}
+
+	public void setEARSupported(boolean isEARSupported) {
+		this.isEARSupported = isEARSupported;
+	}
+
+	public boolean isWARSupported() {
+		return isWARSupported;
+	}
+
+	public void setWARSupported(boolean isWARSupported) {
+		this.isWARSupported = isWARSupported;
+	}
+
+	public boolean isEJBSupported() {
+		return isEJBSupported;
+	}
+
+	public void setEJBSupported(boolean isEJBSupported) {
+		this.isEJBSupported = isEJBSupported;
+	}
+
+	public boolean isCARSupported() {
+		return isCARSupported;
+	}
+
+	public void setCARSupported(boolean isCARSupported) {
+		this.isCARSupported = isCARSupported;
+	}
+
+	@Override
+	public void deploy(DeploymentUnit unit) throws DeploymentException 
+	{
+		DataSourcesMetaData dsmd = getDataSourcesMetaData(unit);
+		ManagedConnectionFactoryDeploymentGroup group = getMCFMetaData(dsmd); 
+		unit.addAttachment(ManagedConnectionFactoryDeploymentGroup.class, group);
+	}
+
+	private ManagedConnectionFactoryDeploymentGroup getMCFMetaData(DataSourcesMetaData dataSources) 
+	{
+		ManagedConnectionFactoryDeploymentGroup group = new ManagedConnectionFactoryDeploymentGroup();
+		NonXADataSourceDeploymentMetaData depMd = null;
+		
+		for(String key: dataSources.keySet())
+		{
+			DataSourceMetaData dsmd = dataSources.get(key);
+			
+			if(dsmd.isTransactional())
+			{
+				depMd = new LocalDataSourceDeploymentMetaData();
+			}
+			else
+			{
+				depMd = new  NoTxDataSourceDeploymentMetaData();				
+			}
+									
+			depMd.setJndiName(normalizeJndiName(dsmd.getName()));
+			depMd.setDriverClass(dsmd.getClassName());
+			depMd.setConnectionUrl(dsmd.getUrl());
+			depMd.setUserName(dsmd.getUser());
+			depMd.setPassWord(dsmd.getPassword());
+			
+			if(dsmd.getIsolationLevel() != null)
+			{
+				depMd.setTransactionIsolation(dsmd.getIsolationLevel().toString());				
+			}
+			
+			List<DataSourceConnectionPropertyMetaData> connProps = new ArrayList<DataSourceConnectionPropertyMetaData>();
+			depMd.setDataSourceConnectionProperties(connProps);
+			
+			if(dsmd.getProperties() != null && dsmd.getProperties().keySet().size() > 0)
+			{
+				for(String propKey: dsmd.getProperties().keySet())
+				{
+					PropertyMetaData prop = dsmd.getProperties().get(propKey);
+					DataSourceConnectionPropertyMetaData dsProp = new DataSourceConnectionPropertyMetaData();
+					dsProp.setName(propKey);
+					dsProp.setValue(prop.getName());
+				}
+				
+			}
+			
+			//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);
+			
+			group.addManagedConnectionFactoryDeployment(depMd);						
+			
+		}
+		
+				
+		return group;
+	}
+
+	private DataSourcesMetaData getDataSourcesMetaData(DeploymentUnit du) 
+	{
+		DataSourcesMetaData candidates = new DataSourcesMetaData();
+		DataSourcesMetaData temp = null;
+		
+		WebMetaData wmd = du.getAttachment(WebMetaData.class);
+		
+		if(isWARSupported() && wmd != null)
+		{
+			temp = ((Environment)wmd).getDataSources();
+			
+			if(temp != null && !temp.isEmpty())
+			{
+				candidates.addAll(temp);
+			}
+		}
+
+		wmd = du.getAttachment("annotated."+ WebMetaData.class.getName() + ":classes", WebMetaData.class);
+
+		if(isWARSupported() && wmd != null)
+		{
+			temp = ((Environment)wmd).getDataSources();
+			
+			if(temp != null && !temp.isEmpty())
+			{
+				candidates.addAll(temp);
+			}
+		}
+		
+		EarMetaData emd = du.getAttachment(EarMetaData.class);
+		
+		if(isEARSupported() && (emd != null && emd.isEE6()))
+		{
+			if( ((Ear60MetaData)emd).getEarEnvironmentRefsGroup() != null)
+			{
+				temp = ((Ear60MetaData)emd).getEarEnvironmentRefsGroup().getDataSources();
+				
+				if(temp != null && !temp.isEmpty())
+				{
+					candidates.addAll(temp);
+				}
+			}
+			
+		}
+
+		JBossMetaData ebmd = du.getAttachment(JBossMetaData.class);
+
+		if(isEJBSupported() && (ebmd != null && ebmd.isEJB3x()))
+		{
+			
+			JBossEnterpriseBeansMetaData je = ebmd.getEnterpriseBeans();
+			temp = ((Environment)ebmd).getDataSources();
+			
+			if(temp != null && !temp.isEmpty())
+			{
+				candidates.addAll(temp);
+			}
+		}
+
+		ApplicationClientMetaData acmd = du.getAttachment(ApplicationClientMetaData.class);
+		
+		if(isCARSupported() && acmd != null)
+		{
+			//TODO support application clients
+		}
+		
+		return candidates;
+	}
+	
+	
+	private static String normalizeJndiName(String jndiName)
+	{
+
+		if(jndiName != null)
+		{
+			if(jndiName.contains("java:"))
+			{
+				return jndiName.replace("java:", "").trim();
+			}
+		}
+		
+		return jndiName;
+		
+	}
+	
+}

Modified: trunk/connector/src/resources/deployers/jca-deployers-jboss-beans.xml
===================================================================
--- trunk/connector/src/resources/deployers/jca-deployers-jboss-beans.xml	2010-12-02 18:52:11 UTC (rev 109663)
+++ trunk/connector/src/resources/deployers/jca-deployers-jboss-beans.xml	2010-12-02 19:33:11 UTC (rev 109664)
@@ -182,5 +182,12 @@
    <bean name="MCFDGComponentMapper" class="org.jboss.resource.deployers.management.MCFDGComponentMapper">
    		<constructor><parameter><inject bean="PersistenceFactory" /></parameter></constructor>
    </bean>
-
+	
+	<!--  Deployer responsible for managing EE5.17 data source definitions -->
+   <bean name="DataSourceDeployer" class="org.jboss.resource.deployers.DataSourceDeployer">      
+   		<property name="EJBSupported">false</property>
+   		<property name="CARSupported">false</property>   		
+   </bean>	
+	
+	
 </deployment>



More information about the jboss-cvs-commits mailing list