[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