/* * 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.util; import java.lang.reflect.Constructor; import java.util.HashMap; import java.util.Map; import java.util.Properties; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.hibernate.boot.internal.SessionFactoryBuilderImpl; import org.hibernate.boot.internal.SessionFactoryOptionsImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cache.infinispan.InfinispanRegionFactory; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Environment; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.transaction.jta.platform.spi.JtaPlatform; import org.hibernate.internal.util.compare.EqualsHelper; import org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl; import org.hibernate.resource.transaction.backend.jta.internal.JtaTransactionCoordinatorBuilderImpl; import org.hibernate.service.ServiceRegistry; import org.hibernate.testing.boot.ServiceRegistryTestingImpl; /** * Utilities for cache testing. * * @author <a href="brian.stansberry@jboss.com">Brian Stansberry</a> */ public class CacheTestUtil { @SuppressWarnings("unchecked") public static Map buildBaselineSettings( String regionPrefix, Class regionFactory, boolean use2ndLevel, boolean useQueries, Class<? extends JtaPlatform> jtaPlatform) { Map settings = new HashMap(); settings.put( AvailableSettings.GENERATE_STATISTICS, "true" ); settings.put( AvailableSettings.USE_STRUCTURED_CACHE, "true" ); if (jtaPlatform == null) { settings.put(Environment.TRANSACTION_COORDINATOR_STRATEGY, JdbcResourceLocalTransactionCoordinatorBuilderImpl.class.getName()); } else { settings.put(Environment.TRANSACTION_COORDINATOR_STRATEGY, JtaTransactionCoordinatorBuilderImpl.class.getName()); settings.put(AvailableSettings.JTA_PLATFORM, jtaPlatform); } settings.put( AvailableSettings.CACHE_REGION_FACTORY, regionFactory.getName() ); settings.put( AvailableSettings.CACHE_REGION_PREFIX, regionPrefix ); settings.put( AvailableSettings.USE_SECOND_LEVEL_CACHE, String.valueOf( use2ndLevel ) ); settings.put( AvailableSettings.USE_QUERY_CACHE, String.valueOf( useQueries ) ); return settings; } public static StandardServiceRegistryBuilder buildBaselineStandardServiceRegistryBuilder( String regionPrefix, Class regionFactory, boolean use2ndLevel, boolean useQueries, Class<? extends JtaPlatform> jtaPlatform) { StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder(); ssrb.applySettings( buildBaselineSettings( regionPrefix, regionFactory, use2ndLevel, useQueries, jtaPlatform ) ); return ssrb; } public static StandardServiceRegistryBuilder buildCustomQueryCacheStandardServiceRegistryBuilder( String regionPrefix, String queryCacheName, Class<? extends JtaPlatform> jtaPlatform) { final StandardServiceRegistryBuilder ssrb = buildBaselineStandardServiceRegistryBuilder( regionPrefix, InfinispanRegionFactory.class, true, true, jtaPlatform ); ssrb.applySetting( InfinispanRegionFactory.QUERY_CACHE_RESOURCE_PROP, queryCacheName ); return ssrb; } public static InfinispanRegionFactory createRegionFactory(Class<? extends InfinispanRegionFactory> clazz, Properties properties) { try { try { Constructor<? extends InfinispanRegionFactory> constructor = clazz.getConstructor(Properties.class); return constructor.newInstance(properties); } catch (NoSuchMethodException e) { return clazz.newInstance(); } } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } public static InfinispanRegionFactory startRegionFactory(ServiceRegistry serviceRegistry) { try { final ConfigurationService cfgService = serviceRegistry.getService( ConfigurationService.class ); final Properties properties = toProperties( cfgService.getSettings() ); String factoryType = cfgService.getSetting( AvailableSettings.CACHE_REGION_FACTORY, StandardConverters.STRING ); Class clazz = Thread.currentThread().getContextClassLoader().loadClass( factoryType ); InfinispanRegionFactory regionFactory; if (clazz == InfinispanRegionFactory.class) { regionFactory = new TestInfinispanRegionFactory(properties); } else { if (InfinispanRegionFactory.class.isAssignableFrom(clazz)) { regionFactory = createRegionFactory(clazz, properties); } else { throw new IllegalArgumentException(clazz + " is not InfinispanRegionFactory"); } } final SessionFactoryOptionsImpl sessionFactoryOptions = new SessionFactoryOptionsImpl( new SessionFactoryBuilderImpl.SessionFactoryOptionsStateStandardImpl( (StandardServiceRegistry) serviceRegistry ) ); regionFactory.start( sessionFactoryOptions, properties ); return regionFactory; } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } } public static InfinispanRegionFactory startRegionFactory( ServiceRegistry serviceRegistry, CacheTestSupport testSupport) { InfinispanRegionFactory factory = startRegionFactory( serviceRegistry ); testSupport.registerFactory( factory ); return factory; } public static void stopRegionFactory( InfinispanRegionFactory factory, CacheTestSupport testSupport) { testSupport.unregisterFactory( factory ); factory.stop(); } public static Properties toProperties(Map map) { if ( map == null ) { return null; } if ( map instanceof Properties ) { return (Properties) map; } Properties properties = new Properties(); properties.putAll( map ); return properties; } public static SessionFactoryOptions sfOptionsForStart() { return new SessionFactoryOptionsImpl( new SessionFactoryBuilderImpl.SessionFactoryOptionsStateStandardImpl( ServiceRegistryTestingImpl.forUnitTesting() ) ); } /** * Prevent instantiation. */ private CacheTestUtil() { } }