/* * 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.configuration.mutablefactory; 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.FullTextFilterDef; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.TokenizerDef; import org.hibernate.search.engine.impl.AnalyzerRegistry; import org.hibernate.search.engine.impl.FilterDef; import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator; import org.hibernate.search.filter.ShardSensitiveOnlyFilter; import org.hibernate.search.spi.SearchIntegrator; import org.hibernate.search.spi.SearchIntegratorBuilder; import org.hibernate.search.spi.impl.SearchFactoryState; import org.hibernate.search.testsupport.TestForIssue; import org.hibernate.search.testsupport.setup.SearchConfigurationForTest; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertEquals; /** * Makes sure that Filter and Analyzer definitions survive a hot reboot */ @TestForIssue(jiraKey = "HSEARCH-1824") public class DefinitionsOnHotRebootTest { @Test public void notForgettingDefinedFilters() { SearchIntegratorBuilder emptySearchBuilder = new SearchIntegratorBuilder().configuration( new SearchConfigurationForTest().addClass( A.class ) ); try ( SearchIntegrator sf = emptySearchBuilder.buildSearchIntegrator() ) { int defaultFilterCount = countFilters( sf ); sf.addClasses( B.class ); assertEquals( defaultFilterCount + 1, countFilters( sf ) ); assertTrue( filterExists( sf, "anyFilter" ) ); sf.addClasses( C.class ); assertEquals( defaultFilterCount + 2, countFilters( sf ) ); assertTrue( filterExists( sf, "anyFilter" ) ); assertTrue( filterExists( sf, "anotherFilter" ) ); } } @Test public void notForgettingDefinedAnalyzers() { SearchIntegratorBuilder emptySearchBuilder = new SearchIntegratorBuilder().configuration( new SearchConfigurationForTest().addClass( A.class ) ); try ( SearchIntegrator sf = emptySearchBuilder.buildSearchIntegrator() ) { int defaultAnalyzerCount = countAnalyzers( sf ); sf.addClasses( B.class ); assertEquals( defaultAnalyzerCount + 1, countAnalyzers( sf ) ); assertTrue( analyzerExists( sf, "anAnalyzer" ) ); sf.addClasses( C.class ); assertEquals( defaultAnalyzerCount + 2, countAnalyzers( sf ) ); assertTrue( analyzerExists( sf, "anAnalyzer" ) ); assertTrue( analyzerExists( sf, "anotherAnalyzer" ) ); } } private boolean analyzerExists(SearchIntegrator sf, String analyzerName) { for ( AnalyzerRegistry registry : sf.unwrap( ExtendedSearchIntegrator.class ).getAnalyzerRegistries().values() ) { AnalyzerReference analyzerReference = registry.getAnalyzerReference( analyzerName ); if ( analyzerReference != null && analyzerReference.getAnalyzer() != null ) { return true; } } return false; } private int countAnalyzers(SearchIntegrator sf) { int count = 0; for ( AnalyzerRegistry registry : sf.unwrap( ExtendedSearchIntegrator.class ).getAnalyzerRegistries().values() ) { count += registry.getNamedAnalyzerReferences().size(); } return count; } private boolean filterExists(SearchIntegrator sf, String filterName) { FilterDef filterDef = sf.unwrap( SearchFactoryState.class ).getFilterDefinitions().get( filterName ); return filterDef != null; } private int countFilters(SearchIntegrator sf) { return sf.unwrap( SearchFactoryState.class ).getFilterDefinitions().size(); } @Indexed static class A { @DocumentId Long id; } @Indexed @FullTextFilterDef( name = "anyFilter", impl = ShardSensitiveOnlyFilter.class ) @AnalyzerDef(name = "anAnalyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)) static class B { @DocumentId Long id; } @Indexed @FullTextFilterDef( name = "anotherFilter", impl = ShardSensitiveOnlyFilter.class ) @AnalyzerDef(name = "anotherAnalyzer", tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class)) static class C { @DocumentId Long id; } }