/*
* JBoss, Home of Professional Open Source.
* Copyright 2011, Red Hat, Inc., 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.as.connector.subsystems.datasources;
import static java.lang.Thread.currentThread;
import static java.security.AccessController.doPrivileged;
import static org.jboss.as.connector.logging.ConnectorLogger.DS_DEPLOYER_LOGGER;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.sql.Driver;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import javax.naming.Reference;
import javax.resource.spi.ManagedConnectionFactory;
import javax.security.auth.Subject;
import javax.sql.DataSource;
import org.jboss.as.connector.logging.ConnectorLogger;
import org.jboss.as.connector.metadata.api.common.Credential;
import org.jboss.as.connector.security.ElytronSubjectFactory;
import org.jboss.as.connector.services.driver.InstalledDriver;
import org.jboss.as.connector.services.driver.registry.DriverRegistry;
import org.jboss.as.connector.util.Injection;
import org.jboss.as.core.security.ServerSecurityManager;
import org.jboss.as.naming.deployment.ContextNames;
import org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnectionFactory;
import org.jboss.jca.adapters.jdbc.JDBCResourceAdapter;
import org.jboss.jca.adapters.jdbc.local.LocalManagedConnectionFactory;
import org.jboss.jca.adapters.jdbc.spi.ClassLoaderPlugin;
import org.jboss.jca.adapters.jdbc.xa.XAManagedConnectionFactory;
import org.jboss.jca.common.api.metadata.common.Extension;
import org.jboss.jca.common.api.metadata.ds.CommonDataSource;
import org.jboss.jca.common.api.metadata.ds.DataSources;
import org.jboss.jca.common.api.metadata.ds.DsSecurity;
import org.jboss.jca.common.api.metadata.ds.Statement;
import org.jboss.jca.common.api.metadata.ds.TimeOut;
import org.jboss.jca.common.api.metadata.ds.Validation;
import org.jboss.jca.common.api.metadata.ds.XaDataSource;
import org.jboss.jca.common.api.metadata.spec.ConfigProperty;
import org.jboss.jca.common.api.metadata.spec.XsdString;
import org.jboss.jca.common.api.validator.ValidateException;
import org.jboss.jca.common.metadata.ds.DatasourcesImpl;
import org.jboss.jca.common.metadata.ds.DriverImpl;
import org.jboss.jca.core.api.connectionmanager.ccm.CachedConnectionManager;
import org.jboss.jca.core.api.management.ManagementRepository;
import org.jboss.jca.core.bootstrapcontext.BootstrapContextCoordinator;
import org.jboss.jca.core.connectionmanager.ConnectionManager;
import org.jboss.jca.core.security.picketbox.PicketBoxSubjectFactory;
import org.jboss.jca.core.spi.mdr.MetadataRepository;
import org.jboss.jca.core.spi.mdr.NotFoundException;
import org.jboss.jca.core.spi.rar.ResourceAdapterRepository;
import org.jboss.jca.core.spi.transaction.TransactionIntegration;
import org.jboss.jca.deployers.DeployersLogger;
import org.jboss.jca.deployers.common.AbstractDsDeployer;
import org.jboss.jca.deployers.common.CommonDeployment;
import org.jboss.jca.deployers.common.DeployException;
import org.jboss.logging.Logger;
import org.jboss.msc.inject.Injector;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceContainer;
import org.jboss.msc.service.ServiceController;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.jboss.security.SubjectFactory;
import org.wildfly.security.auth.client.AuthenticationContext;
import org.wildfly.common.function.ExceptionSupplier;
import org.wildfly.security.credential.source.CredentialSource;
import org.wildfly.security.manager.WildFlySecurityManager;
import org.wildfly.security.manager.action.ClearContextClassLoaderAction;
import org.wildfly.security.manager.action.GetClassLoaderAction;
import org.wildfly.security.manager.action.SetContextClassLoaderFromClassAction;
/**
* Base service for managing a data-source.
* @author John Bailey
* @author maeste
*/
public abstract class AbstractDataSourceService implements Service<DataSource> {
/**
* Consumers outside of the data-source subsystem should use the capability {@code org.wildfly.data-source} where
* the dynamic name is the resource name in the model.
*/
public static final ServiceName SERVICE_NAME_BASE = ServiceName.JBOSS.append("data-source");
public static ServiceName getServiceName(ContextNames.BindInfo bindInfo) {
return SERVICE_NAME_BASE.append(bindInfo.getBinderServiceName().getCanonicalName());
}
private static final DeployersLogger DEPLOYERS_LOGGER = Logger.getMessageLogger(DeployersLogger.class, AS7DataSourceDeployer.class.getName());
protected final InjectedValue<TransactionIntegration> transactionIntegrationValue = new InjectedValue<TransactionIntegration>();
private final InjectedValue<Driver> driverValue = new InjectedValue<Driver>();
private final InjectedValue<ManagementRepository> managementRepositoryValue = new InjectedValue<ManagementRepository>();
private final InjectedValue<SubjectFactory> subjectFactory = new InjectedValue<SubjectFactory>();
private final InjectedValue<DriverRegistry> driverRegistry = new InjectedValue<DriverRegistry>();
private final InjectedValue<CachedConnectionManager> ccmValue = new InjectedValue<CachedConnectionManager>();
private final InjectedValue<ExecutorService> executor = new InjectedValue<ExecutorService>();
private final InjectedValue<MetadataRepository> mdr = new InjectedValue<MetadataRepository>();
private final InjectedValue<ServerSecurityManager> secManager = new InjectedValue<ServerSecurityManager>();
private final InjectedValue<ResourceAdapterRepository> raRepository = new InjectedValue<ResourceAdapterRepository>();
private final InjectedValue<AuthenticationContext> authenticationContext = new InjectedValue<>();
private final InjectedValue<AuthenticationContext> recoveryAuthenticationContext = new InjectedValue<>();
private final InjectedValue<ExceptionSupplier<CredentialSource, Exception>> credentialSourceSupplier = new InjectedValue<>();
private final InjectedValue<ExceptionSupplier<CredentialSource, Exception>> recoveryCredentialSourceSupplier = new InjectedValue<>();
private final String dsName;
private final ContextNames.BindInfo jndiName;
protected CommonDeployment deploymentMD;
private WildFlyDataSource sqlDataSource;
/**
* The class loader to use. If null the Driver class loader will be used instead.
*/
private final ClassLoader classLoader;
protected AbstractDataSourceService(final String dsName, final ContextNames.BindInfo jndiName, final ClassLoader classLoader ) {
this.dsName = dsName;
this.classLoader = classLoader;
this.jndiName = jndiName;
}
public synchronized void start(StartContext startContext) throws StartException {
try {
final ServiceContainer container = startContext.getController().getServiceContainer();
deploymentMD = getDeployer().deploy(container);
if (deploymentMD.getCfs().length != 1) {
throw ConnectorLogger.ROOT_LOGGER.cannotStartDs();
}
sqlDataSource = new WildFlyDataSource((javax.sql.DataSource) deploymentMD.getCfs()[0], jndiName.getAbsoluteJndiName());
DS_DEPLOYER_LOGGER.debugf("Adding datasource: %s", deploymentMD.getCfJndiNames()[0]);
CommonDeploymentService cdService = new CommonDeploymentService(deploymentMD);
final ServiceName cdServiceName = CommonDeploymentService.getServiceName(jndiName);
startContext.getController().getServiceContainer().addService(cdServiceName, cdService)
// The dependency added must be the JNDI name which for subsystem resources is an alias. This service
// is also used in deployments where the capability service name is not registered for the service.
.addDependency(getServiceName(jndiName))
.setInitialMode(ServiceController.Mode.ACTIVE).install();
} catch (Throwable t) {
throw ConnectorLogger.ROOT_LOGGER.deploymentError(t, dsName);
}
}
protected abstract AS7DataSourceDeployer getDeployer() throws ValidateException ;
public void stop(final StopContext stopContext) {
final ServiceController<?> serviceController = stopContext.getController().getServiceContainer().getService(CommonDeploymentService.getServiceName(jndiName));
if (serviceController != null) {
serviceController.setMode(ServiceController.Mode.REMOVE);
}
ExecutorService executorService = executor.getValue();
Runnable r = new Runnable() {
@Override
public void run() {
try {
stopService();
} finally {
stopContext.complete();
}
}
};
try {
executorService.execute(r);
} catch (RejectedExecutionException e) {
r.run();
} finally {
stopContext.asynchronous();
}
}
/**
* Performs the actual work of stopping the service. Should be called by {@link #stop(org.jboss.msc.service.StopContext)}
* asynchronously from the MSC thread that invoked stop.
*/
protected synchronized void stopService() {
if (deploymentMD != null) {
if (deploymentMD.getResourceAdapterKey() != null) {
try {
raRepository.getValue().unregisterResourceAdapter(deploymentMD.getResourceAdapterKey());
} catch (org.jboss.jca.core.spi.rar.NotFoundException nfe) {
ConnectorLogger.ROOT_LOGGER.exceptionDuringUnregistering(nfe);
}
}
if (deploymentMD.getResourceAdapter() != null) {
deploymentMD.getResourceAdapter().stop();
if (BootstrapContextCoordinator.getInstance() != null && deploymentMD.getBootstrapContextIdentifier() != null) {
BootstrapContextCoordinator.getInstance().removeBootstrapContext(deploymentMD.getBootstrapContextIdentifier());
}
}
if (deploymentMD.getDataSources() != null && managementRepositoryValue.getValue() != null) {
for (org.jboss.jca.core.api.management.DataSource mgtDs : deploymentMD.getDataSources()) {
managementRepositoryValue.getValue().getDataSources().remove(mgtDs);
}
}
if (deploymentMD.getConnectionManagers() != null) {
for (ConnectionManager cm : deploymentMD.getConnectionManagers()) {
cm.shutdown();
}
}
}
sqlDataSource = null;
}
public CommonDeployment getDeploymentMD() {
return deploymentMD;
}
public synchronized DataSource getValue() throws IllegalStateException, IllegalArgumentException {
return sqlDataSource;
}
public Injector<TransactionIntegration> getTransactionIntegrationInjector() {
return transactionIntegrationValue;
}
public Injector<Driver> getDriverInjector() {
return driverValue;
}
public Injector<ManagementRepository> getManagementRepositoryInjector() {
return managementRepositoryValue;
}
public Injector<DriverRegistry> getDriverRegistryInjector() {
return driverRegistry;
}
public Injector<SubjectFactory> getSubjectFactoryInjector() {
return subjectFactory;
}
public Injector<CachedConnectionManager> getCcmInjector() {
return ccmValue;
}
public Injector<ExecutorService> getExecutorServiceInjector() {
return executor;
}
public Injector<MetadataRepository> getMdrInjector() {
return mdr;
}
public Injector<ResourceAdapterRepository> getRaRepositoryInjector() {
return raRepository;
}
public Injector<ServerSecurityManager> getServerSecurityManager() {
return secManager;
}
Injector<AuthenticationContext> getAuthenticationContext() {
return authenticationContext;
}
Injector<AuthenticationContext> getRecoveryAuthenticationContext() {
return recoveryAuthenticationContext;
}
public InjectedValue<ExceptionSupplier<CredentialSource, Exception>> getCredentialSourceSupplierInjector() {
return credentialSourceSupplier;
}
public InjectedValue<ExceptionSupplier<CredentialSource, Exception>> getRecoveryCredentialSourceSupplierInjector() {
return recoveryCredentialSourceSupplier;
}
protected String buildConfigPropsString(Map<String, String> configProps) {
final StringBuffer valueBuf = new StringBuffer();
for (Map.Entry<String, String> connProperty : configProps.entrySet()) {
valueBuf.append(connProperty.getKey());
valueBuf.append("=");
valueBuf.append(connProperty.getValue());
valueBuf.append(";");
}
return valueBuf.toString();
}
protected TransactionIntegration getTransactionIntegration() {
if (! WildFlySecurityManager.isChecking()) {
currentThread().setContextClassLoader(TransactionIntegration.class.getClassLoader());
} else {
doPrivileged(new SetContextClassLoaderFromClassAction(TransactionIntegration.class));
}
try {
return transactionIntegrationValue.getValue();
} finally {
doPrivileged(ClearContextClassLoaderAction.getInstance());
}
}
private ClassLoader driverClassLoader() {
if(classLoader != null) {
return classLoader;
}
final Class<? extends Driver> clazz = driverValue.getValue().getClass();
return ! WildFlySecurityManager.isChecking() ? clazz.getClassLoader() : doPrivileged(new GetClassLoaderAction(clazz));
}
protected class AS7DataSourceDeployer extends AbstractDsDeployer {
private final org.jboss.jca.common.api.metadata.ds.DataSource dataSourceConfig;
private final XaDataSource xaDataSourceConfig;
public AS7DataSourceDeployer(XaDataSource xaDataSourceConfig) {
super();
this.xaDataSourceConfig = xaDataSourceConfig;
this.dataSourceConfig = null;
}
public AS7DataSourceDeployer(org.jboss.jca.common.api.metadata.ds.DataSource dataSourceConfig) {
super();
this.dataSourceConfig = dataSourceConfig;
this.xaDataSourceConfig = null;
}
public CommonDeployment deploy(ServiceContainer serviceContainer) throws DeployException {
try {
if (serviceContainer == null) {
throw new DeployException(ConnectorLogger.ROOT_LOGGER.nullVar("ServiceContainer"));
}
HashMap<String, org.jboss.jca.common.api.metadata.ds.Driver> drivers = new HashMap<String, org.jboss.jca.common.api.metadata.ds.Driver>(
1);
DataSources dataSources = null;
if (dataSourceConfig != null) {
String driverName = dataSourceConfig.getDriver();
InstalledDriver installedDriver = driverRegistry.getValue().getInstalledDriver(driverName);
if (installedDriver != null) {
String moduleName = installedDriver.getModuleName() != null ? installedDriver.getModuleName().getName()
: null;
org.jboss.jca.common.api.metadata.ds.Driver driver = new DriverImpl(installedDriver.getDriverName(),
installedDriver.getMajorVersion(), installedDriver.getMinorVersion(),
moduleName, installedDriver.getDriverClassName(),
installedDriver.getDataSourceClassName(), installedDriver.getXaDataSourceClassName());
drivers.put(driverName, driver);
}
dataSources = new DatasourcesImpl(Arrays.asList(dataSourceConfig), null, drivers);
} else if (xaDataSourceConfig != null) {
String driverName = xaDataSourceConfig.getDriver();
InstalledDriver installedDriver = driverRegistry.getValue().getInstalledDriver(driverName);
if (installedDriver != null) {
String moduleName = installedDriver.getModuleName() != null ? installedDriver.getModuleName().getName()
: null;
org.jboss.jca.common.api.metadata.ds.Driver driver = new DriverImpl(installedDriver.getDriverName(),
installedDriver.getMajorVersion(), installedDriver.getMinorVersion(), moduleName,
installedDriver.getDriverClassName(),
installedDriver.getDataSourceClassName(), installedDriver.getXaDataSourceClassName());
drivers.put(driverName, driver);
}
dataSources = new DatasourcesImpl(null, Arrays.asList(xaDataSourceConfig), drivers);
}
CommonDeployment c = createObjectsAndInjectValue(new URL("file://DataSourceDeployment"), dsName,
"uniqueJdbcLocalId", "uniqueJdbcXAId", dataSources, AbstractDataSourceService.class.getClassLoader());
return c;
} catch (MalformedURLException e) {
throw ConnectorLogger.ROOT_LOGGER.cannotDeploy(e);
} catch (ValidateException e) {
throw ConnectorLogger.ROOT_LOGGER.cannotDeployAndValidate(e);
}
}
@Override
protected ClassLoader getDeploymentClassLoader(String uniqueId) {
return driverClassLoader();
}
@Override
protected String[] bindConnectionFactory(String deployment, final String jndi, Object cf) throws Throwable {
// AS7-2222: Just hack it
if (cf instanceof javax.resource.Referenceable) {
((javax.resource.Referenceable)cf).setReference(new Reference(jndi));
}
// don't register because it's one during add operation
return new String[] { jndi };
}
@Override
protected Object initAndInject(String className, List<? extends ConfigProperty> configs, ClassLoader cl)
throws DeployException {
try {
Class clz = Class.forName(className, true, cl);
Object o = clz.newInstance();
if (configs != null) {
Injection injector = new Injection();
for (ConfigProperty cpmd : configs) {
if (cpmd.isValueSet()) {
if (XsdString.isNull(cpmd.getConfigPropertyType())) {
injector.inject(o,
cpmd.getConfigPropertyName().getValue(),
cpmd.getConfigPropertyValue().getValue());
} else {
injector.inject(o,
cpmd.getConfigPropertyName().getValue(),
cpmd.getConfigPropertyValue().getValue(),
cpmd.getConfigPropertyType().getValue());
}
}
}
}
return o;
} catch (Throwable t) {
throw ConnectorLogger.ROOT_LOGGER.deploymentFailed(t, className);
}
}
@Override
protected org.jboss.jca.core.spi.security.SubjectFactory getSubjectFactory(
org.jboss.jca.common.api.metadata.common.Credential credential, final String jndiName) throws DeployException {
if (credential == null)
return null;
assert credential instanceof Credential;
final String securityDomain = credential.getSecurityDomain();
if (((Credential) credential).isElytronEnabled()) {
try {
return new ElytronSubjectFactory(authenticationContext.getOptionalValue(), new java.net.URI(jndiName));
} catch (URISyntaxException e) {
throw ConnectorLogger.ROOT_LOGGER.cannotDeploy(e);
}
} else if (securityDomain == null || securityDomain.trim().equals("") || subjectFactory.getOptionalValue() == null) {
return null;
} else {
return new PicketBoxSubjectFactory(subjectFactory.getValue()){
@Override
public Subject createSubject(final String sd) {
ServerSecurityManager sm = secManager.getOptionalValue();
if (sm != null) {
sm.push(sd);
}
try {
return super.createSubject(sd);
} finally {
if (sm != null) {
sm.pop();
}
}
}
};
}
}
@Override
public CachedConnectionManager getCachedConnectionManager() {
return ccmValue.getOptionalValue();
}
@Override
public ManagementRepository getManagementRepository() {
return managementRepositoryValue.getValue();
}
@Override
protected void initAndInjectClassLoaderPlugin(ManagedConnectionFactory mcf, CommonDataSource dsMetadata)
throws DeployException {
((BaseWrapperManagedConnectionFactory) mcf).setClassLoaderPlugin(new ClassLoaderPlugin() {
@Override
public ClassLoader getClassLoader() {
return driverClassLoader();
}
});
}
@Override
public TransactionIntegration getTransactionIntegration() {
if (! WildFlySecurityManager.isChecking()) {
currentThread().setContextClassLoader(TransactionIntegration.class.getClassLoader());
} else {
doPrivileged(new SetContextClassLoaderFromClassAction(TransactionIntegration.class));
}
try {
return transactionIntegrationValue.getValue();
} finally {
if (! WildFlySecurityManager.isChecking()) {
currentThread().setContextClassLoader(null);
} else {
doPrivileged(ClearContextClassLoaderAction.getInstance());
}
}
}
@Override
protected ManagedConnectionFactory createMcf(XaDataSource arg0, String arg1, ClassLoader arg2)
throws NotFoundException, DeployException {
final WildFlyXaMCF xaManagedConnectionFactory = new WildFlyXaMCF();
if (xaDataSourceConfig.getUrlDelimiter() != null) {
xaManagedConnectionFactory.setURLDelimiter(xaDataSourceConfig.getUrlDelimiter());
}
if (xaDataSourceConfig.getXaDataSourceClass() != null) {
xaManagedConnectionFactory.setXADataSourceClass(xaDataSourceConfig.getXaDataSourceClass());
}
if (xaDataSourceConfig.getXaDataSourceProperty() != null) {
xaManagedConnectionFactory.setXaProps(xaDataSourceConfig.getXaDataSourceProperty());
}
if (xaDataSourceConfig.getUrlSelectorStrategyClassName() != null) {
xaManagedConnectionFactory
.setUrlSelectorStrategyClassName(xaDataSourceConfig.getUrlSelectorStrategyClassName());
}
if (xaDataSourceConfig.getXaPool() != null && xaDataSourceConfig.getXaPool().isSameRmOverride() != null) {
xaManagedConnectionFactory.setIsSameRMOverrideValue(xaDataSourceConfig.getXaPool().isSameRmOverride());
}
if (xaDataSourceConfig.getNewConnectionSql() != null) {
xaManagedConnectionFactory.setNewConnectionSQL(xaDataSourceConfig.getNewConnectionSql());
}
if (xaDataSourceConfig.getUrlSelectorStrategyClassName() != null) {
xaManagedConnectionFactory
.setUrlSelectorStrategyClassName(xaDataSourceConfig.getUrlSelectorStrategyClassName());
}
setMcfProperties(xaManagedConnectionFactory, xaDataSourceConfig, xaDataSourceConfig.getStatement());
return xaManagedConnectionFactory;
}
@Override
protected ManagedConnectionFactory createMcf(org.jboss.jca.common.api.metadata.ds.DataSource arg0, String arg1,
ClassLoader arg2) throws NotFoundException, DeployException {
final LocalManagedConnectionFactory managedConnectionFactory = new LocalManagedConnectionFactory();
managedConnectionFactory.setDriverClass(dataSourceConfig.getDriverClass());
if (dataSourceConfig.getUrlDelimiter() != null) {
try {
managedConnectionFactory.setURLDelimiter(dataSourceConfig.getUrlDelimiter());
} catch (Exception e) {
throw ConnectorLogger.ROOT_LOGGER.failedToGetUrlDelimiter(e);
}
}
if (dataSourceConfig.getDataSourceClass() != null) {
managedConnectionFactory.setDataSourceClass(dataSourceConfig.getDataSourceClass());
}
if (dataSourceConfig.getConnectionProperties() != null) {
managedConnectionFactory.setConnectionProperties(buildConfigPropsString(dataSourceConfig
.getConnectionProperties()));
}
if (dataSourceConfig.getConnectionUrl() != null) {
managedConnectionFactory.setConnectionURL(dataSourceConfig.getConnectionUrl());
}
if (dataSourceConfig.getNewConnectionSql() != null) {
managedConnectionFactory.setNewConnectionSQL(dataSourceConfig.getNewConnectionSql());
}
if (dataSourceConfig.getUrlSelectorStrategyClassName() != null) {
managedConnectionFactory.setUrlSelectorStrategyClassName(dataSourceConfig.getUrlSelectorStrategyClassName());
}
setMcfProperties(managedConnectionFactory, dataSourceConfig, dataSourceConfig.getStatement());
return managedConnectionFactory;
}
private void setMcfProperties(final BaseWrapperManagedConnectionFactory managedConnectionFactory,
CommonDataSource dataSourceConfig, final Statement statement) {
if (dataSourceConfig.getTransactionIsolation() != null) {
managedConnectionFactory.setTransactionIsolation(dataSourceConfig.getTransactionIsolation().name());
}
final DsSecurity security = dataSourceConfig.getSecurity();
if (security != null) {
if (security.getUserName() != null) {
managedConnectionFactory.setUserName(security.getUserName());
}
if (security.getPassword() != null) {
managedConnectionFactory.setPassword(security.getPassword());
}
}
final TimeOut timeOut = dataSourceConfig.getTimeOut();
if (timeOut != null) {
if (timeOut.getUseTryLock() != null) {
managedConnectionFactory.setUseTryLock(timeOut.getUseTryLock().intValue());
}
if (timeOut.getQueryTimeout() != null) {
managedConnectionFactory.setQueryTimeout(timeOut.getQueryTimeout().intValue());
}
if (timeOut.isSetTxQueryTimeout()) {
managedConnectionFactory.setTransactionQueryTimeout(true);
}
}
if (statement != null) {
if (statement.getTrackStatements() != null) {
managedConnectionFactory.setTrackStatements(statement.getTrackStatements().name());
}
if (statement.isSharePreparedStatements() != null) {
managedConnectionFactory.setSharePreparedStatements(statement.isSharePreparedStatements());
}
if (statement.getPreparedStatementsCacheSize() != null) {
managedConnectionFactory.setPreparedStatementCacheSize(statement.getPreparedStatementsCacheSize()
.intValue());
}
}
final Validation validation = dataSourceConfig.getValidation();
if (validation != null) {
if (validation.getCheckValidConnectionSql() != null) {
managedConnectionFactory.setCheckValidConnectionSQL(validation.getCheckValidConnectionSql());
}
final Extension validConnectionChecker = validation.getValidConnectionChecker();
if (validConnectionChecker != null) {
if (validConnectionChecker.getClassName() != null) {
managedConnectionFactory.setValidConnectionCheckerClassName(validConnectionChecker.getClassName());
}
if (validConnectionChecker.getConfigPropertiesMap() != null) {
managedConnectionFactory
.setValidConnectionCheckerProperties(buildConfigPropsString(validConnectionChecker
.getConfigPropertiesMap()));
}
}
final Extension exceptionSorter = validation.getExceptionSorter();
if (exceptionSorter != null) {
if (exceptionSorter.getClassName() != null) {
managedConnectionFactory.setExceptionSorterClassName(exceptionSorter.getClassName());
}
if (exceptionSorter.getConfigPropertiesMap() != null) {
managedConnectionFactory.setExceptionSorterProperties(buildConfigPropsString(exceptionSorter
.getConfigPropertiesMap()));
}
}
final Extension staleConnectionChecker = validation.getStaleConnectionChecker();
if (staleConnectionChecker != null) {
if (staleConnectionChecker.getClassName() != null) {
managedConnectionFactory.setStaleConnectionCheckerClassName(staleConnectionChecker.getClassName());
}
if (staleConnectionChecker.getConfigPropertiesMap() != null) {
managedConnectionFactory
.setStaleConnectionCheckerProperties(buildConfigPropsString(staleConnectionChecker
.getConfigPropertiesMap()));
}
}
}
}
// Override this method to change how dsName is build in AS7
@Override
protected String buildJndiName(String rawJndiName, Boolean javaContext) {
final String jndiName;
if (!rawJndiName.startsWith("java:") && javaContext) {
if (rawJndiName.startsWith("jboss/")) {
// Bind to java:jboss/ namespace
jndiName = "java:" + rawJndiName;
} else {
// Bind to java:/ namespace
jndiName= "java:/" + rawJndiName;
}
} else {
jndiName = rawJndiName;
}
return jndiName;
}
@Override
protected DeployersLogger getLogger() {
return DEPLOYERS_LOGGER;
}
@Override
protected javax.resource.spi.ResourceAdapter createRa(String uniqueId, ClassLoader cl) throws NotFoundException, DeployException {
List<? extends ConfigProperty> l = new ArrayList<ConfigProperty>();
javax.resource.spi.ResourceAdapter rar =
(javax.resource.spi.ResourceAdapter) initAndInject(JDBCResourceAdapter.class.getName(), l, cl);
return rar;
}
@Override
protected String registerResourceAdapterToResourceAdapterRepository(javax.resource.spi.ResourceAdapter instance) {
return raRepository.getValue().registerResourceAdapter(instance);
}
}
private class WildFlyXaMCF extends XAManagedConnectionFactory {
private static final long serialVersionUID = 4876371551002746953L;
public void setXaProps(Map<String, String> inputProperties) {
xaProps.putAll(inputProperties);
}
}
}