/*
* 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.directoryProvider;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.Lock;
import org.hibernate.search.engine.spi.EntityIndexBinding;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager;
import org.hibernate.search.spi.SearchIntegrator;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.test.util.FullTextSessionBuilder;
import org.hibernate.search.testsupport.junit.SkipOnElasticsearch;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.io.IOException;
/**
* @author Sanne Grinovero
*/
@Category(SkipOnElasticsearch.class) // Locking parameters are specific to the Lucene backend
public class CustomLockProviderTest {
private static final String SINGLE_INSTANCE_LOCK_FQN = "org.apache.lucene.store.SingleInstanceLockFactory$SingleInstanceLock";
private static final String SIMPLE_LOCK_FQN = "org.apache.lucene.store.SimpleFSLockFactory$SimpleFSLock";
private static final String NATIVE_LOCK_FQN = "org.apache.lucene.store.NativeFSLockFactory$NativeFSLock";
@Test
public void testUseOfCustomLockingFactory() {
assertNull( CustomLockFactoryProvider.optionValue );
FullTextSessionBuilder builder = new FullTextSessionBuilder();
builder
.addAnnotatedClass( SnowStorm.class )
.setProperty( "hibernate.search.default.locking_option", "somethingHere" )
.setProperty( "hibernate.search.default.locking_strategy",
"org.hibernate.search.test.directoryProvider.CustomLockFactoryProvider" )
.build();
builder.close();
assertEquals( "somethingHere", CustomLockFactoryProvider.optionValue );
CustomLockFactoryProvider.optionValue = null;
}
@Test
public void testFailOnNonExistentLockingFactory() {
FullTextSessionBuilder builder = new FullTextSessionBuilder();
try {
builder
.addAnnotatedClass( SnowStorm.class )
.setProperty( "hibernate.search.default.locking_option", "somethingHere" )
.setProperty( "hibernate.search.default.locking_strategy", "org.hibernate.NotExistingFactory" )
.build();
builder.close();
fail();
}
catch (SearchException e) {
assertEquals( "Unable to find locking_strategy implementation class: org.hibernate.NotExistingFactory", e.getCause().getMessage() );
}
}
@Test
public void testUseOfNativeLockingFactory() throws IOException {
testUseOfSelectedLockingFactory( null, NATIVE_LOCK_FQN, false );
testUseOfSelectedLockingFactory( "native", NATIVE_LOCK_FQN, false );
}
@Test
public void testUseOfSingleLockingFactory() throws IOException {
testUseOfSelectedLockingFactory( "single", SINGLE_INSTANCE_LOCK_FQN, false );
testUseOfSelectedLockingFactory( "single", SINGLE_INSTANCE_LOCK_FQN, true );
//default for RAMDirectory:
testUseOfSelectedLockingFactory( null, SINGLE_INSTANCE_LOCK_FQN, true );
}
@Test
public void testUseOfSimpleLockingFactory() throws IOException {
testUseOfSelectedLockingFactory( "simple", SIMPLE_LOCK_FQN, false );
}
private void testUseOfSelectedLockingFactory(String optionName, String expectedLockTypeName, boolean useRamDirectory) throws IOException {
FullTextSessionBuilder builder = new FullTextSessionBuilder();
FullTextSessionBuilder fullTextSessionBuilder = builder.addAnnotatedClass( SnowStorm.class );
if ( optionName != null ) {
fullTextSessionBuilder.setProperty( "hibernate.search.default.locking_strategy", optionName );
}
if ( ! useRamDirectory ) {
fullTextSessionBuilder.useFileSystemDirectoryProvider( CustomLockProviderTest.class );
}
FullTextSessionBuilder ftsb = fullTextSessionBuilder.build();
try {
SearchIntegrator integrator = ftsb.getSearchFactory().unwrap( SearchIntegrator.class );
EntityIndexBinding indexBindingForEntity = integrator.getIndexBinding( SnowStorm.class );
DirectoryBasedIndexManager indexManager = (DirectoryBasedIndexManager) indexBindingForEntity.getIndexManagers()[0];
DirectoryProvider<?> directoryProvider = indexManager.getDirectoryProvider();
Directory directory = directoryProvider.getDirectory();
try ( Lock lock = directory.obtainLock( "my-lock" ) ) {
assertEquals( expectedLockTypeName, lock.getClass().getName() );
}
}
finally {
builder.close();
}
assertEquals( null, CustomLockFactoryProvider.optionValue );
}
}