/* * Hibernate Search, full-text search for your domain model * * 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.search.test.jgroups.common; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.search.cfg.Environment; import org.hibernate.search.test.DefaultTestResourceManager; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.test.util.ImmutableTestConfiguration; import org.hibernate.search.test.util.TestConfiguration; import org.hibernate.search.testsupport.TestConstants; /** * Test class to simulate clustered environment (one master, and one slave node, * each role being known in advance). * * @author Lukasz Moren */ public abstract class StaticMasterSlaveSearchTestCase extends SearchTestBase { protected static final String masterCopy = "/master/copy"; /** * The lucene index directory which is specific to the master node. */ protected static final String masterMain = "/master/main"; /** * The lucene index directory which is specific to the slave node. */ protected static final String slave = "/slave"; private DefaultTestResourceManager slaveResources; @Override public void configure(Map<String,Object> cfg) { //master cfg.put( "hibernate.search.default." + Environment.WORKER_BACKEND, "jgroupsMaster" ); cfg.put( "hibernate.search.default.sourceBase", TestConstants.getIndexDirectory( getTargetDir() ) + masterCopy ); cfg.put( "hibernate.search.default.indexBase", TestConstants.getIndexDirectory( getTargetDir() ) + masterMain ); cfg.put( "hibernate.search.default.refresh", "1" ); cfg.put( "hibernate.search.default.directory_provider", "filesystem-master" ); } protected void configureSlave(Map<String,Object> cfg) { //slave(s) cfg.put( "hibernate.search.default." + Environment.WORKER_BACKEND, "jgroupsSlave" ); cfg.put( "hibernate.search.default.retry_initialize_period", "1" ); cfg.put( "hibernate.search.default.sourceBase", TestConstants.getIndexDirectory( getTargetDir() ) + masterCopy ); cfg.put( "hibernate.search.default.indexBase", TestConstants.getIndexDirectory( getTargetDir() ) + slave ); cfg.put( "hibernate.search.default.refresh", "1" ); cfg.put( "hibernate.search.default.directory_provider", "filesystem-slave" ); } @Override public void setUp() throws Exception { super.setUp(); buildSlaveSessionFactory(); } @Override public void tearDown() throws Exception { //close session factories if ( slaveResources != null ) { slaveResources.closeSessionFactory(); slaveResources = null; } super.tearDown(); } private void buildSlaveSessionFactory() throws Exception { if ( slaveResources != null ) { throw new IllegalStateException( "Slave SessionFactory already created" ); } HashMap<String, Object> slaveConfiguration = new HashMap<String,Object>(); configureSlave( slaveConfiguration ); TestConfiguration slaveTestConfiguration = new ImmutableTestConfiguration( slaveConfiguration, getAnnotatedClasses() ); slaveResources = new DefaultTestResourceManager( slaveTestConfiguration, this.getClass() ); slaveResources.openSessionFactory(); } protected Session getSlaveSession() { return slaveResources.openSession(); } protected SessionFactory getSlaveSessionFactory() { return slaveResources.getSessionFactory(); } private Path getTargetDir() { URI classesDirUri; try { classesDirUri = getClass().getProtectionDomain() .getCodeSource() .getLocation() .toURI(); } catch (URISyntaxException e) { throw new RuntimeException( e ); } return Paths.get( classesDirUri ).getParent(); } }