/*
* 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.filter.fulltextfilterdefs;
import static org.fest.assertions.Assertions.assertThat;
import java.util.Map;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.FullTextFilterDef;
import org.hibernate.search.annotations.FullTextFilterDefs;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.engine.impl.FilterDef;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.spi.SearchIntegratorBuilder;
import org.hibernate.search.spi.impl.SearchFactoryState;
import org.hibernate.search.test.filter.RoleFilterFactory;
import org.hibernate.search.test.util.HibernateManualConfiguration;
import org.hibernate.search.testsupport.junit.SearchFactoryHolder;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
/**
* Test the use of {@link org.hibernate.search.annotations.FullTextFilterDefs} annotation can be read by the engine
* in all the valid locations.
*
* @author Davide D'Alto
*/
public class FullTextFilterDefsAnnotationTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Rule
public SearchFactoryHolder sfHolder = new SearchFactoryHolder( Sample.class );
@Test
public void shouldBeAbleToAnnotatePackage() throws Exception {
assertThatFilterExists( "package-filter-1" );
assertThatFilterExists( "package-filter-2" );
}
@Test
public void shouldBeAbleToAnnotateClass() throws Exception {
assertThatFilterExists( "class-filter-1" );
assertThatFilterExists( "class-filter-2" );
}
@Test
public void shouldContainsOnlyTheDefinedFilters() throws Exception {
Map<String, FilterDef> filterDefinitions = ( (SearchFactoryState) sfHolder.getSearchFactory() ).getFilterDefinitions();
assertThat( filterDefinitions.keySet() ).contains( "package-filter-1", "package-filter-2", "class-filter-1", "class-filter-2" );
}
@Test
public void shouldNotBePossibleToHaveTwoFilterDefsWithTheSameName() throws Exception {
thrown.expect( SearchException.class );
HibernateManualConfiguration cfg = new HibernateManualConfiguration();
cfg.addClass( SampleWithError.class );
new SearchIntegratorBuilder().configuration( cfg ).buildSearchIntegrator().close();
}
private void assertThatFilterExists(String filterName) {
FilterDef filterDefinition = sfHolder.getSearchFactory().getFilterDefinition( filterName );
assertThat( filterDefinition ).isNotNull();
assertThat( filterDefinition.getImpl() ).isEqualTo( RoleFilterFactory.class );
}
@Indexed
@FullTextFilterDefs({
@FullTextFilterDef(
name = "class-filter-1",
impl = RoleFilterFactory.class
),
@FullTextFilterDef(
name = "class-filter-2",
impl = RoleFilterFactory.class
)
})
static class Sample {
@DocumentId
long id;
@Field
String description;
}
@Indexed
@FullTextFilterDefs({
@FullTextFilterDef(
name = "package-filter-1",
impl = RoleFilterFactory.class
),
@FullTextFilterDef(
name = "package-filter-unique",
impl = RoleFilterFactory.class
)
})
static class SampleWithError {
@DocumentId
final long id = 1L;
@Field
final String description = "";
}
}