/* * Hibernate, Relational Persistence for Idiomatic Java * * 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.test.cache.infinispan.functional.cluster; import java.util.Map; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cache.infinispan.util.InfinispanMessageLogger; import org.hibernate.cfg.Environment; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl; import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder; import org.hibernate.test.cache.infinispan.functional.AbstractFunctionalTest; import org.hibernate.test.cache.infinispan.util.InfinispanTestingSetup; import org.hibernate.test.cache.infinispan.util.TxUtil; import org.junit.ClassRule; /** * @author Galder ZamarreƱo * @since 3.5 */ public abstract class DualNodeTest extends AbstractFunctionalTest { private static final InfinispanMessageLogger log = InfinispanMessageLogger.Provider.getLog( DualNodeTest.class ); @ClassRule public static final InfinispanTestingSetup infinispanTestIdentifier = new InfinispanTestingSetup(); public static final String REGION_FACTORY_DELEGATE = "hibernate.cache.region.factory_delegate"; public static final String NODE_ID_PROP = "hibernate.test.cluster.node.id"; public static final String NODE_ID_FIELD = "nodeId"; public static final String LOCAL = "local"; public static final String REMOTE = "remote"; private SecondNodeEnvironment secondNodeEnvironment; protected void withTxSession(SessionFactory sessionFactory, TxUtil.ThrowingConsumer<Session, Exception> consumer) throws Exception { TxUtil.withTxSession(useJta, sessionFactory, consumer); } protected <T> T withTxSessionApply(SessionFactory sessionFactory, TxUtil.ThrowingFunction<Session, T, Exception> consumer) throws Exception { return TxUtil.withTxSessionApply(useJta, sessionFactory, consumer); } @Override public String[] getMappings() { return new String[] { "cache/infinispan/functional/entities/Contact.hbm.xml", "cache/infinispan/functional/entities/Customer.hbm.xml" }; } @Override @SuppressWarnings("unchecked") protected void addSettings(Map settings) { super.addSettings( settings ); applyStandardSettings( settings ); settings.put( NODE_ID_PROP, LOCAL ); settings.put( NODE_ID_FIELD, LOCAL ); settings.put( REGION_FACTORY_DELEGATE, getRegionFactoryClass() ); } @Override protected void cleanupTest() throws Exception { cleanupTransactionManagement(); } protected void cleanupTransactionManagement() { DualNodeJtaTransactionManagerImpl.cleanupTransactions(); DualNodeJtaTransactionManagerImpl.cleanupTransactionManagers(); } @Override public void startUp() { super.startUp(); // In some cases tests are multi-threaded, so they have to join the group infinispanTestIdentifier.joinContext(); secondNodeEnvironment = new SecondNodeEnvironment(); } @Override public void shutDown() { if ( secondNodeEnvironment != null ) { secondNodeEnvironment.shutDown(); } super.shutDown(); } protected SecondNodeEnvironment secondNodeEnvironment() { return secondNodeEnvironment; } protected Class getCacheRegionFactory() { return ClusterAwareRegionFactory.class; } protected Class getJtaPlatformClass() { return DualNodeJtaPlatformImpl.class; } protected Class<? extends TransactionCoordinatorBuilder> getTransactionCoordinatorBuilder() { return JtaTransactionCoordinatorBuilderImpl.class; } protected void configureSecondNode(StandardServiceRegistryBuilder ssrb) { } @SuppressWarnings("unchecked") protected void applyStandardSettings(Map settings) { settings.put( Environment.CACHE_REGION_FACTORY, ClusterAwareRegionFactory.class.getName() ); } public class SecondNodeEnvironment { private StandardServiceRegistry serviceRegistry; private SessionFactoryImplementor sessionFactory; public SecondNodeEnvironment() { StandardServiceRegistryBuilder ssrb = constructStandardServiceRegistryBuilder(); applyStandardSettings( ssrb.getSettings() ); ssrb.applySetting( NODE_ID_PROP, REMOTE ); ssrb.applySetting( NODE_ID_FIELD, REMOTE ); configureSecondNode( ssrb ); serviceRegistry = ssrb.build(); MetadataSources metadataSources = new MetadataSources( serviceRegistry ); applyMetadataSources( metadataSources ); Metadata metadata = metadataSources.buildMetadata(); applyCacheSettings( metadata ); afterMetadataBuilt( metadata ); sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory(); } public StandardServiceRegistry getServiceRegistry() { return serviceRegistry; } public SessionFactoryImplementor getSessionFactory() { return sessionFactory; } public void shutDown() { if ( sessionFactory != null ) { try { sessionFactory.close(); } catch (Exception ignore) { } } if ( serviceRegistry != null ) { try { StandardServiceRegistryBuilder.destroy( serviceRegistry ); } catch (Exception ignore) { } } } } }