/*
* Hibernate OGM, Domain model persistence for NoSQL datastores
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.ogm.transaction.impl;
import java.util.Map;
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.engine.transaction.jta.platform.internal.JBossStandAloneJtaPlatform;
import org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator;
import org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform;
import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform;
import org.hibernate.ogm.util.impl.Log;
import org.hibernate.ogm.util.impl.LoggerFactory;
import org.hibernate.service.spi.ServiceRegistryImplementor;
/**
* @author Emmanuel Bernard <emmanuel@hibernate.org>
*/
public class OgmJtaPlatformInitiator implements StandardServiceInitiator<JtaPlatform> {
public static final OgmJtaPlatformInitiator INSTANCE = new OgmJtaPlatformInitiator();
public static final String JBOSS_TM_CLASS_NAME = "com.arjuna.ats.jta.TransactionManager";
private static final Log log = LoggerFactory.make();
@Override
public Class<JtaPlatform> getServiceInitiated() {
return JtaPlatform.class;
}
@Override
public JtaPlatform initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
if ( hasExplicitPlatform( configurationValues ) ) {
return JtaPlatformInitiator.INSTANCE.initiateService( configurationValues, registry );
}
// if no platform is set and JBoss transaction manager is available use that one
if ( jbossTransactionManagerAvailable( registry.getService( ClassLoaderService.class ) ) ) {
log.jbossTransactionManagerDetected();
return new JBossStandAloneJtaPlatform();
}
else {
log.noJtaPlatformDetected();
return new NoJtaPlatform();
}
}
private boolean hasExplicitPlatform(Map configVales) {
return configVales.containsKey( AvailableSettings.JTA_PLATFORM );
}
private boolean jbossTransactionManagerAvailable(ClassLoaderService classLoaderService) {
try {
classLoaderService.classForName( JBOSS_TM_CLASS_NAME );
return true;
}
catch ( ClassLoadingException e ) {
return false;
}
}
}