/*
* 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.analyzer.analyzerdefs;
import static org.fest.assertions.Assertions.assertThat;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.lucene.analysis.standard.StandardTokenizerFactory;
import org.hibernate.search.analyzer.spi.AnalyzerReference;
import org.hibernate.search.annotations.AnalyzerDef;
import org.hibernate.search.annotations.AnalyzerDefs;
import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Field;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.TokenizerDef;
import org.hibernate.search.engine.impl.AnalyzerRegistry;
import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator;
import org.hibernate.search.exception.SearchException;
import org.hibernate.search.spi.SearchIntegratorBuilder;
import org.hibernate.search.testsupport.junit.SearchFactoryHolder;
import org.hibernate.search.testsupport.setup.SearchConfigurationForTest;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
/**
* Test that the {@link org.hibernate.search.annotations.AnalyzerDefs} annotation can be read by the engine
* in all the valid locations.
*
* @author Davide D'Alto
*/
public class AnalyzerDefsAnnotationTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
@Rule
public SearchFactoryHolder sfHolder = new SearchFactoryHolder( Sample.class );
@Test
public void shouldBePossibleToAnnotatePackage() throws Exception {
assertThatAnalyzerExists( "package-analyzer-1" );
assertThatAnalyzerExists( "package-analyzer-2" );
}
@Test
public void shouldBePossibleToAnnotateClass() throws Exception {
assertThatAnalyzerExists( "class-analyzer-1" );
assertThatAnalyzerExists( "class-analyzer-2" );
}
@Test
public void shouldContainTheDefinedAnalyzers() throws Exception {
ExtendedSearchIntegrator factory = sfHolder.getSearchFactory();
Set<String> analyzerNames = new LinkedHashSet<>();
for ( AnalyzerRegistry registry : factory.getAnalyzerRegistries().values() ) {
analyzerNames.addAll( registry.getNamedAnalyzerReferences().keySet() );
}
/*
* There may be other defined analyzers, because the indexing service may have
* default analyzer definitions.
*/
assertThat( analyzerNames ).contains( "package-analyzer-1", "package-analyzer-2", "class-analyzer-1", "class-analyzer-2" );
}
@Test
public void shouldNotBePossibleToHaveTwoAnalyzerDefsWithTheSameName() throws Exception {
thrown.expect( SearchException.class );
SearchConfigurationForTest cfg = new SearchConfigurationForTest();
cfg.addClass( SampleWithError.class );
new SearchIntegratorBuilder().configuration( cfg ).buildSearchIntegrator().close();
}
private void assertThatAnalyzerExists(String analyzerName) {
for ( AnalyzerRegistry registry : sfHolder.getSearchFactory().getAnalyzerRegistries().values() ) {
AnalyzerReference analyzerReference = registry.getAnalyzerReference( analyzerName );
if ( analyzerReference != null ) {
assertThat( analyzerReference.getAnalyzer() ).isNotNull();
return;
}
}
Assert.fail( "Analyzer does not exist: " + analyzerName );
}
@Indexed
@AnalyzerDefs({
@AnalyzerDef(
name = "class-analyzer-1",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
),
@AnalyzerDef(
name = "class-analyzer-2",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
)
})
static class Sample {
@DocumentId
long id;
@Field
String description;
}
@Indexed
@AnalyzerDefs({
@AnalyzerDef(
name = "package-analyzer-1",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
),
@AnalyzerDef(
name = "class-analyzer-unique",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)
)
})
static class SampleWithError {
@DocumentId
final long id = 1;
@Field
final String description = "";
}
}