/* * 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.analyzerdef; import static org.fest.assertions.Assertions.assertThat; import java.util.Map; 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.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.indexes.spi.IndexManagerType; import org.hibernate.search.spi.SearchIntegratorBuilder; import org.hibernate.search.testsupport.junit.SearchFactoryHolder; import org.hibernate.search.testsupport.junit.SkipOnElasticsearch; import org.hibernate.search.testsupport.setup.SearchConfigurationForTest; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.ExpectedException; /** * Test that the {@link org.hibernate.search.annotations.AnalyzerDef} annotation can be read by the engine * in all the valid locations. * * @author Davide D'Alto */ public class AnalyzerDefAnnotationTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Rule public SearchFactoryHolder sfHolder = new SearchFactoryHolder( Sample.class ); @Test public void shouldBePossibleToAnnotatePackage() throws Exception { assertAnalyzerExists( "package-analyzer" ); } @Test public void shouldBePossibleToAnnotateClass() throws Exception { assertAnalyzerExists( "class-analyzer" ); } @Test @Category(SkipOnElasticsearch.class) // Unused AnalyzerDefs are always bound to the Lucene registry, making this test fail on ES public void shouldContainOnlyTheDefinedAnalyzers() throws Exception { ExtendedSearchIntegrator factory = sfHolder.getSearchFactory(); IndexManagerType indexManagerType = factory.getIndexBinding( Sample.class ).getIndexManagerType(); Map<String, AnalyzerReference> analyzerReferences = factory.getAnalyzerRegistry( indexManagerType ).getNamedAnalyzerReferences(); assertThat( analyzerReferences.keySet() ).containsOnly( "package-analyzer", "class-analyzer" ); } @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 assertAnalyzerExists(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 @AnalyzerDef( name = "class-analyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class) ) static class Sample { @DocumentId long id; @Field String description; } @Indexed @AnalyzerDef( name = "package-analyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class) ) static class SampleWithError { @DocumentId final long id = 1; @Field final String description = ""; } }