[hibernate-commits] Hibernate SVN: r20833 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: spi/internals and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Thu Oct 14 13:30:19 EDT 2010


Author: epbernard
Date: 2010-10-14 13:30:18 -0400 (Thu, 14 Oct 2010)
New Revision: 20833

Added:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java
Removed:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
Log:
HSEARCH-555 Properly expose as public API the SearchFactoryBuilder

Create a SearchFactoryState to decouple the builder from the ImmutableSearchFactory
Make SearchFactoryState be a super interface of the contract describing SearchFactoryImplementor with shareable state

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java	2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -34,6 +34,8 @@
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
+import org.hibernate.search.spi.internals.SearchFactoryState;
 import org.slf4j.Logger;
 
 import org.hibernate.annotations.common.AssertionFailure;
@@ -65,7 +67,6 @@
 import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.spi.internals.DirectoryProviderData;
 import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
 import org.hibernate.search.stat.Statistics;
 import org.hibernate.search.stat.StatisticsImpl;
 import org.hibernate.search.stat.StatisticsImplementor;
@@ -79,7 +80,7 @@
  *
  * @author Emmanuel Bernard
  */
-public class ImmutableSearchFactory implements StateSearchFactoryImplementor, WorkerBuildContext {
+public class ImmutableSearchFactory implements SearchFactoryImplementorWithShareableState, WorkerBuildContext {
 
 	static {
 		Version.touch();
@@ -110,22 +111,22 @@
 	private final Map<DirectoryProvider, LuceneIndexingParameters> dirProviderIndexingParams;
 	private final String indexingStrategy;
 
-	public ImmutableSearchFactory(SearchFactoryBuilder cfg) {
-		this.analyzers = cfg.analyzers;
-		this.backendQueueProcessorFactory = cfg.backendQueueProcessorFactory;
-		this.cacheBitResultsSize = cfg.cacheBitResultsSize;
-		this.configurationProperties = cfg.configurationProperties;
-		this.dirProviderData = cfg.dirProviderData;
-		this.dirProviderIndexingParams = cfg.dirProviderIndexingParams;
-		this.documentBuildersIndexedEntities = cfg.documentBuildersIndexedEntities;
-		this.documentBuildersContainedEntities = cfg.documentBuildersContainedEntities;
-		this.errorHandler = cfg.errorHandler;
-		this.filterCachingStrategy = cfg.filterCachingStrategy;
-		this.filterDefinitions = cfg.filterDefinitions;
-		this.indexHierarchy = cfg.indexHierarchy;
-		this.indexingStrategy = cfg.indexingStrategy;
-		this.readerProvider = cfg.readerProvider;
-		this.worker = cfg.worker;
+	public ImmutableSearchFactory(SearchFactoryState state) {
+		this.analyzers = state.getAnalyzers();
+		this.backendQueueProcessorFactory = state.getBackendQueueProcessorFactory();
+		this.cacheBitResultsSize = state.getCacheBitResultsSize();
+		this.configurationProperties = state.getConfigurationProperties();
+		this.dirProviderData = state.getDirectoryProviderData();
+		this.dirProviderIndexingParams = state.getDirectoryProviderIndexingParams();
+		this.documentBuildersIndexedEntities = state.getDocumentBuildersIndexedEntities();
+		this.documentBuildersContainedEntities = state.getDocumentBuildersContainedEntities();
+		this.errorHandler = state.getErrorHandler();
+		this.filterCachingStrategy = state.getFilterCachingStrategy();
+		this.filterDefinitions = state.getFilterDefinitions();
+		this.indexHierarchy = state.getIndexHierarchy();
+		this.indexingStrategy = state.getIndexingStrategy();
+		this.readerProvider = state.getReaderProvider();
+		this.worker = state.getWorker();
 		this.statistics = new StatisticsImpl( this );
 		String enableStats = configurationProperties.getProperty( Environment.GENERATE_STATS );
 		if ( "true".equalsIgnoreCase( enableStats ) ) {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java	2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -47,7 +47,7 @@
 import org.hibernate.search.spi.SearchFactoryIntegrator;
 import org.hibernate.search.spi.internals.DirectoryProviderData;
 import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
 import org.hibernate.search.stat.Statistics;
 import org.hibernate.search.stat.StatisticsImplementor;
 import org.hibernate.search.store.DirectoryProvider;
@@ -60,16 +60,16 @@
  *
  * @author Emmanuel Bernard
  */
-public class MutableSearchFactory implements StateSearchFactoryImplementor, SearchFactoryIntegrator {
+public class MutableSearchFactory implements SearchFactoryImplementorWithShareableState, SearchFactoryIntegrator {
 	//a reference to the same instance of this class is help by clients and various HSearch services
 	//when changing the SearchFactory internals, only the underlying delegate should be changed.
 	//the volatile ensure that the state is replicated upong underlying factory switch.
-	private volatile StateSearchFactoryImplementor delegate;
+	private volatile SearchFactoryImplementorWithShareableState delegate;
 
 	//lock to be acquired every time the underlying searchFactory is rebuilt
 	private final Lock mutating = new ReentrantLock();
 
-	void setDelegate(StateSearchFactoryImplementor delegate) {
+	void setDelegate(SearchFactoryImplementorWithShareableState delegate) {
 		this.delegate = delegate;
 	}
 
@@ -77,6 +77,10 @@
 		return delegate.getBackendQueueProcessorFactory();
 	}
 
+	public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+		delegate.setBackendQueueProcessorFactory(backendQueueProcessorFactory);
+	}
+
 	public Map<String, FilterDef> getFilterDefinitions() {
 		return delegate.getFilterDefinitions();
 	}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactoryState.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,180 @@
+package org.hibernate.search.impl;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.spi.internals.SearchFactoryState;
+import org.hibernate.search.store.DirectoryProvider;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Shared factory state
+ *
+ * @author Emmanuel Bernard
+ */
+public class MutableSearchFactoryState implements SearchFactoryState {
+	private Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities;
+	private Map<DirectoryProvider<?>, DirectoryProviderData> directoryProviderData;
+	private Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities;
+	private String indexingStrategy;
+	private Worker worker;
+	private ReaderProvider readerProvider;
+	private BackendQueueProcessorFactory backendQueueProcessorFactory;
+	private Map<String, FilterDef> filterDefinitions;
+	private FilterCachingStrategy filterCachingStrategy;
+	private Map<String, Analyzer> analyzers;
+	private int cacheBitResultsSize;
+	private Properties configurationProperties;
+	private ErrorHandler errorHandler;
+	private PolymorphicIndexHierarchy indexHierarchy;
+	private Map<DirectoryProvider, LuceneIndexingParameters> directoryProviderIndexingParams;
+
+	public void copyStateFromOldFactory(SearchFactoryState oldFactoryState) {
+		indexingStrategy = oldFactoryState.getIndexingStrategy();
+		documentBuildersIndexedEntities = oldFactoryState.getDocumentBuildersIndexedEntities();
+		documentBuildersContainedEntities = oldFactoryState.getDocumentBuildersContainedEntities();
+		directoryProviderData = oldFactoryState.getDirectoryProviderData();
+		worker = oldFactoryState.getWorker();
+		readerProvider = oldFactoryState.getReaderProvider();
+		backendQueueProcessorFactory = oldFactoryState.getBackendQueueProcessorFactory();
+		filterDefinitions = oldFactoryState.getFilterDefinitions();
+		filterCachingStrategy = oldFactoryState.getFilterCachingStrategy();
+		analyzers = oldFactoryState.getAnalyzers();
+		cacheBitResultsSize = oldFactoryState.getCacheBitResultsSize();
+		configurationProperties = oldFactoryState.getConfigurationProperties();
+		errorHandler = oldFactoryState.getErrorHandler();
+		indexHierarchy = oldFactoryState.getIndexHierarchy();
+		directoryProviderIndexingParams = oldFactoryState.getDirectoryProviderIndexingParams();
+	}
+
+	public Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities() {
+		return documentBuildersContainedEntities;
+	}
+
+	public Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData() {
+		return directoryProviderData;
+	}
+
+	public Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities() {
+		return documentBuildersIndexedEntities;
+	}
+
+	public String getIndexingStrategy() {
+		return indexingStrategy;
+	}
+
+	public Worker getWorker() {
+		return worker;
+	}
+
+	public ReaderProvider getReaderProvider() {
+		return readerProvider;
+	}
+
+	public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
+		return backendQueueProcessorFactory;
+	}
+
+	public Map<String, FilterDef> getFilterDefinitions() {
+		return filterDefinitions;
+	}
+
+	public FilterCachingStrategy getFilterCachingStrategy() {
+		return filterCachingStrategy;
+	}
+
+	public Map<String, Analyzer> getAnalyzers() {
+		return analyzers;
+	}
+
+	public int getCacheBitResultsSize() {
+		return cacheBitResultsSize;
+	}
+
+	public Properties getConfigurationProperties() {
+		return configurationProperties;
+	}
+
+	public ErrorHandler getErrorHandler() {
+		return errorHandler;
+	}
+
+	public PolymorphicIndexHierarchy getIndexHierarchy() {
+		return indexHierarchy;
+	}
+
+	public Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams() {
+		return directoryProviderIndexingParams;
+	}
+
+	public void setDocumentBuildersContainedEntities(Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities) {
+		this.documentBuildersContainedEntities = documentBuildersContainedEntities;
+	}
+
+	public void setDirectoryProviderData(Map<DirectoryProvider<?>, DirectoryProviderData> directoryProviderData) {
+		this.directoryProviderData = directoryProviderData;
+	}
+
+	public void setDocumentBuildersIndexedEntities(Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities) {
+		this.documentBuildersIndexedEntities = documentBuildersIndexedEntities;
+	}
+
+	public void setIndexingStrategy(String indexingStrategy) {
+		this.indexingStrategy = indexingStrategy;
+	}
+
+	public void setWorker(Worker worker) {
+		this.worker = worker;
+	}
+
+	public void setReaderProvider(ReaderProvider readerProvider) {
+		this.readerProvider = readerProvider;
+	}
+
+	public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+		this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+	}
+
+	public void setFilterDefinitions(Map<String, FilterDef> filterDefinitions) {
+		this.filterDefinitions = filterDefinitions;
+	}
+
+	public void setFilterCachingStrategy(FilterCachingStrategy filterCachingStrategy) {
+		this.filterCachingStrategy = filterCachingStrategy;
+	}
+
+	public void setAnalyzers(Map<String, Analyzer> analyzers) {
+		this.analyzers = analyzers;
+	}
+
+	public void setCacheBitResultsSize(int cacheBitResultsSize) {
+		this.cacheBitResultsSize = cacheBitResultsSize;
+	}
+
+	public void setConfigurationProperties(Properties configurationProperties) {
+		this.configurationProperties = configurationProperties;
+	}
+
+	public void setErrorHandler(ErrorHandler errorHandler) {
+		this.errorHandler = errorHandler;
+	}
+
+	public void setIndexHierarchy(PolymorphicIndexHierarchy indexHierarchy) {
+		this.indexHierarchy = indexHierarchy;
+	}
+
+	public void setDirectoryProviderIndexingParams(Map<DirectoryProvider, LuceneIndexingParameters> directoryProviderIndexingParams) {
+		this.directoryProviderIndexingParams = directoryProviderIndexingParams;
+	}
+}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java	2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -36,8 +36,9 @@
 import java.util.Set;
 import java.util.concurrent.locks.ReentrantLock;
 
-import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.internals.SearchFactoryImplementorWithShareableState;
+import org.hibernate.search.spi.internals.SearchFactoryState;
 import org.slf4j.Logger;
 
 import org.hibernate.annotations.common.reflection.MetadataProvider;
@@ -59,7 +60,6 @@
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneIndexingParameters;
 import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
-import org.hibernate.search.backend.Worker;
 import org.hibernate.search.backend.WorkerFactory;
 import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
 import org.hibernate.search.cfg.SearchConfiguration;
@@ -77,13 +77,11 @@
 import org.hibernate.search.filter.ShardSensitiveOnlyFilter;
 import org.hibernate.search.jmx.IndexControl;
 import org.hibernate.search.jmx.JMXRegistrar;
-import org.hibernate.search.reader.ReaderProvider;
 import org.hibernate.search.reader.ReaderProviderFactory;
 import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.spi.WritableBuildContext;
 import org.hibernate.search.spi.internals.DirectoryProviderData;
 import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
-import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.store.DirectoryProviderFactory;
 import org.hibernate.search.store.optimization.OptimizerStrategy;
@@ -92,7 +90,7 @@
 import org.hibernate.search.util.ReflectionHelper;
 
 /**
- * Build a search factory.
+ * Build a search factory following the builder pattern.
  *
  * @author Emmanuel Bernard
  * @author Hardy Ferentschik
@@ -123,24 +121,7 @@
 		return this;
 	}
 
-	//processing properties
-	ReflectionManager reflectionManager;
-	String indexingStrategy;
-	Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities;
-	Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities;
-	//keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
-	Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData;
-	Worker worker;
-	ReaderProvider readerProvider;
-	BackendQueueProcessorFactory backendQueueProcessorFactory;
-	Map<String, FilterDef> filterDefinitions;
-	FilterCachingStrategy filterCachingStrategy;
-	Map<String, Analyzer> analyzers;
-	int cacheBitResultsSize;
-	Properties configurationProperties;
-	ErrorHandler errorHandler;
-	PolymorphicIndexHierarchy indexHierarchy;
-	Map<DirectoryProvider, LuceneIndexingParameters> dirProviderIndexingParams;
+	private final MutableSearchFactoryState factoryState = new MutableSearchFactoryState();
 
 	public SearchFactoryImplementor buildSearchFactory() {
 		SearchFactoryImplementor searchFactoryImplementor;
@@ -154,7 +135,7 @@
 			searchFactoryImplementor = buildIncrementalSearchFactory();
 		}
 
-		String enableJMX = configurationProperties.getProperty( Environment.JMX_ENABLED );
+		String enableJMX = factoryState.getConfigurationProperties().getProperty( Environment.JMX_ENABLED );
 		if ( "true".equalsIgnoreCase( enableJMX ) ) {
 			enableIndexControlBean( searchFactoryImplementor );
 		}
@@ -165,6 +146,7 @@
 		if ( !searchFactoryImplementor.isJMXEnabled() ) {
 			return;
 		}
+		final Properties configurationProperties = factoryState.getConfigurationProperties();
 
 		// if we don't have a JNDI bound SessionFactory we cannot enable the index control bean
 		if ( StringHelper.isEmpty( configurationProperties.getProperty( "hibernate.session_factory_name" ) ) ) {
@@ -188,17 +170,17 @@
 		if ( classes.size() == 0 ) {
 			return rootFactory;
 		}
-
+		final Properties configurationProperties = factoryState.getConfigurationProperties();
 		BuildContext buildContext = new BuildContext();
-		copyStateFromOldFactory( rootFactory );
+		factoryState.copyStateFromOldFactory( rootFactory );
 		//TODO we don't keep the reflectionManager. Is that an issue?
 		IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
-		reflectionManager = getReflectionManager( cfg );
-		//TODO programmatic mapping support
+		final ReflectionManager reflectionManager = getReflectionManager( cfg );
 
+		//TODO programmatic mapping support
 		//FIXME The current initDocumentBuilders
 		initDocumentBuilders( cfg, reflectionManager, buildContext );
-
+		final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
 		Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
 		for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
 			//FIXME improve this algorithm to deal with adding new classes to the class hierarchy.
@@ -206,20 +188,21 @@
 			builder.postInitialize( indexedClasses );
 		}
 		//not really necessary today
+		final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
 		for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
 			builder.postInitialize( indexedClasses );
 		}
 		fillSimilarityMapping();
 
 		//update backend
-		final BackendQueueProcessorFactory backend = this.backendQueueProcessorFactory;
+		final BackendQueueProcessorFactory backend = factoryState.getBackendQueueProcessorFactory();
 		if ( backend instanceof UpdatableBackendQueueProcessorFactory ) {
 			final UpdatableBackendQueueProcessorFactory updatableBackend = ( UpdatableBackendQueueProcessorFactory ) backend;
-			updatableBackend.updateDirectoryProviders( this.dirProviderData.keySet(), buildContext );
+			updatableBackend.updateDirectoryProviders( factoryState.getDirectoryProviderData().keySet(), buildContext );
 		}
 		//safe for incremental init at least the ShredBufferReaderProvider
 		//this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
-		StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+		SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
 		rootFactory.setDelegate( factory );
 		return rootFactory;
 
@@ -240,30 +223,12 @@
 		}
 	}
 
-	private void copyStateFromOldFactory(StateSearchFactoryImplementor stateFactory) {
-		indexingStrategy = stateFactory.getIndexingStrategy();
-		documentBuildersIndexedEntities = stateFactory.getDocumentBuildersIndexedEntities();
-		documentBuildersContainedEntities = stateFactory.getDocumentBuildersContainedEntities();
-		dirProviderData = stateFactory.getDirectoryProviderData();
-		worker = stateFactory.getWorker();
-		readerProvider = stateFactory.getReaderProvider();
-		backendQueueProcessorFactory = stateFactory.getBackendQueueProcessorFactory();
-		filterDefinitions = stateFactory.getFilterDefinitions();
-		filterCachingStrategy = stateFactory.getFilterCachingStrategy();
-		analyzers = stateFactory.getAnalyzers();
-		cacheBitResultsSize = stateFactory.getCacheBitResultsSize();
-		configurationProperties = stateFactory.getConfigurationProperties();
-		errorHandler = stateFactory.getErrorHandler();
-		indexHierarchy = stateFactory.getIndexHierarchy();
-		dirProviderIndexingParams = stateFactory.getDirectoryProviderIndexingParams();
-	}
-
 	private SearchFactoryImplementor buildNewSearchFactory() {
 		createCleanFactoryState();
 
-		configurationProperties = cfg.getProperties();
-		errorHandler = createErrorHandler( configurationProperties );
-		reflectionManager = getReflectionManager( cfg );
+		factoryState.setConfigurationProperties( cfg.getProperties() );
+		factoryState.setErrorHandler( createErrorHandler( factoryState.getConfigurationProperties() ) );
+		final ReflectionManager reflectionManager = getReflectionManager( cfg );
 		BuildContext buildContext = new BuildContext();
 
 		final SearchMapping mapping = SearchMappingBuilder.getSearchMapping( cfg );
@@ -279,34 +244,39 @@
 			injector.setMetadataProvider( new MappingModelMetadataProvider( original, mapping ) );
 		}
 
-		indexingStrategy = defineIndexingStrategy( cfg );//need to be done before the document builds
-		dirProviderIndexingParams = new HashMap<DirectoryProvider, LuceneIndexingParameters>();
+		factoryState.setIndexingStrategy( defineIndexingStrategy( cfg ) );//need to be done before the document builds
+		factoryState.setDirectoryProviderIndexingParams( new HashMap<DirectoryProvider, LuceneIndexingParameters>() );
 		initDocumentBuilders( cfg, reflectionManager, buildContext );
 
+		final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
 		Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
 		for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
 			builder.postInitialize( indexedClasses );
 		}
 		//not really necessary today
+		final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
 		for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
 			builder.postInitialize( indexedClasses );
 		}
 		fillSimilarityMapping();
 
 		//build back end
-		this.worker = WorkerFactory.createWorker( cfg, buildContext );
-		this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, buildContext );
-		this.filterCachingStrategy = buildFilterCachingStrategy( cfg.getProperties() );
-		this.cacheBitResultsSize = ConfigurationParseHelper.getIntValue(
-				cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
+		factoryState.setWorker( WorkerFactory.createWorker( cfg, buildContext ) );
+		factoryState.setReaderProvider( ReaderProviderFactory.createReaderProvider( cfg, buildContext ) );
+		factoryState.setFilterCachingStrategy( buildFilterCachingStrategy( cfg.getProperties() ) );
+		factoryState.setCacheBitResultsSize(
+				ConfigurationParseHelper.getIntValue(
+					cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
+				)
 		);
-		StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+		SearchFactoryImplementorWithShareableState factory = new ImmutableSearchFactory( factoryState );
 		rootFactory.setDelegate( factory );
 		return rootFactory;
 	}
 
 	private void fillSimilarityMapping() {
-		for ( DirectoryProviderData directoryConfiguration : dirProviderData.values() ) {
+		final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+		for ( DirectoryProviderData directoryConfiguration : factoryState.getDirectoryProviderData().values() ) {
 			for ( Class<?> indexedType : directoryConfiguration.getClasses() ) {
 				DocumentBuilderIndexedEntity<?> documentBuilder = documentBuildersIndexedEntities.get( indexedType );
 				Similarity similarity = documentBuilder.getSimilarity();
@@ -343,12 +313,13 @@
 
 	private void createCleanFactoryState() {
 		if ( rootFactory == null ) {
+			//set the mutable structure of factory state
 			rootFactory = new MutableSearchFactory();
-			documentBuildersIndexedEntities = new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>();
-			documentBuildersContainedEntities = new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>();
-			dirProviderData = new HashMap<DirectoryProvider<?>, DirectoryProviderData>();
-			filterDefinitions = new HashMap<String, FilterDef>();
-			indexHierarchy = new PolymorphicIndexHierarchy();
+			factoryState.setDocumentBuildersIndexedEntities( new HashMap<Class<?>, DocumentBuilderIndexedEntity<?>>() );
+			factoryState.setDocumentBuildersContainedEntities( new HashMap<Class<?>, DocumentBuilderContainedEntity<?>>() );
+			factoryState.setDirectoryProviderData( new HashMap<DirectoryProvider<?>, DirectoryProviderData>() );
+			factoryState.setFilterDefinitions( new HashMap<String, FilterDef>() );
+			factoryState.setIndexHierarchy( new PolymorphicIndexHierarchy() );
 		}
 	}
 
@@ -364,7 +335,9 @@
 
 		initProgrammaticAnalyzers( context, reflectionManager );
 		initProgrammaticallyDefinedFilterDef( reflectionManager );
-
+		final PolymorphicIndexHierarchy indexingHierarchy = factoryState.getIndexHierarchy();
+		final Map<Class<?>, DocumentBuilderIndexedEntity<?>> documentBuildersIndexedEntities = factoryState.getDocumentBuildersIndexedEntities();
+		final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
 		while ( iter.hasNext() ) {
 			Class<?> mappedClass = iter.next();
 			if ( mappedClass == null ) {
@@ -393,7 +366,7 @@
 						reflectionManager
 				);
 
-				indexHierarchy.addIndexedClass( mappedClass );
+				indexingHierarchy.addIndexedClass( mappedClass );
 				documentBuildersIndexedEntities.put( mappedClass, documentBuilder );
 			}
 			else {
@@ -410,7 +383,7 @@
 			bindFilterDefs( mappedXClass );
 			//TODO should analyzer def for classes at tyher sqme level???
 		}
-		analyzers = context.initLazyAnalyzers();
+		factoryState.setAnalyzers( context.initLazyAnalyzers() );
 		factory.startDirectoryProviders();
 	}
 
@@ -428,7 +401,7 @@
 	}
 
 	private void bindFilterDef(FullTextFilterDef defAnn, XClass mappedXClass) {
-		if ( filterDefinitions.containsKey( defAnn.name() ) ) {
+		if ( factoryState.getFilterDefinitions().containsKey( defAnn.name() ) ) {
 			throw new SearchException(
 					"Multiple definition of @FullTextFilterDef.name=" + defAnn.name() + ": "
 							+ mappedXClass.getName()
@@ -440,9 +413,10 @@
 
 	private void bindFullTextFilterDef(FullTextFilterDef defAnn) {
 		FilterDef filterDef = new FilterDef( defAnn );
+		final Map<String, FilterDef> filterDefinition = factoryState.getFilterDefinitions();
 		if ( filterDef.getImpl().equals( ShardSensitiveOnlyFilter.class ) ) {
 			//this is a placeholder don't process regularly
-			filterDefinitions.put( defAnn.name(), filterDef );
+			filterDefinition.put( defAnn.name(), filterDef );
 			return;
 		}
 		try {
@@ -481,7 +455,7 @@
 				filterDef.addSetter( Introspector.decapitalize( name.substring( 3 ) ), method );
 			}
 		}
-		filterDefinitions.put( defAnn.name(), filterDef );
+		filterDefinition.put( defAnn.name(), filterDef );
 	}
 
 	private void initProgrammaticAnalyzers(ConfigContext context, ReflectionManager reflectionManager) {
@@ -501,6 +475,7 @@
 		@SuppressWarnings("unchecked") Map defaults = reflectionManager.getDefaults();
 		FullTextFilterDef[] filterDefs = ( FullTextFilterDef[] ) defaults.get( FullTextFilterDefs.class );
 		if ( filterDefs != null && filterDefs.length != 0 ) {
+			final Map<String, FilterDef> filterDefinitions = factoryState.getFilterDefinitions();
 			for ( FullTextFilterDef defAnn : filterDefs ) {
 				if ( filterDefinitions.containsKey( defAnn.name() ) ) {
 					throw new SearchException( "Multiple definition of @FullTextFilterDef.name=" + defAnn.name() );
@@ -546,8 +521,15 @@
 		return indexingStrategy;
 	}
 
+	/**
+	 * Implementation of the Hibernate Search SPI WritableBuildContext and WorkerBuildContext
+	 * The data is provided by the SearchFactoryState object associated to SearchFactoryBuilder.
+	 */
 	private class BuildContext implements WritableBuildContext, WorkerBuildContext {
+		private final SearchFactoryState factoryState = SearchFactoryBuilder.this.factoryState;
+
 		public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
+			final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
 			DirectoryProviderData data = dirProviderData.get( provider );
 			if ( data == null ) {
 				data = new DirectoryProviderData();
@@ -557,10 +539,11 @@
 		}
 
 		public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
-			dirProviderIndexingParams.put( provider, indexingParams );
+			factoryState.getDirectoryProviderIndexingParams().put( provider, indexingParams );
 		}
 
 		public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
+			final Map<DirectoryProvider<?>, DirectoryProviderData> dirProviderData = factoryState.getDirectoryProviderData();
 			DirectoryProviderData data = dirProviderData.get( directoryProvider );
 			if ( data == null ) {
 				data = new DirectoryProviderData();
@@ -575,35 +558,35 @@
 		}
 
 		public String getIndexingStrategy() {
-			return indexingStrategy;
+			return factoryState.getIndexingStrategy();
 		}
 
 		public Set<DirectoryProvider<?>> getDirectoryProviders() {
-			return SearchFactoryBuilder.this.dirProviderData.keySet();
+			return factoryState.getDirectoryProviderData().keySet();
 		}
 
 		public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
-			SearchFactoryBuilder.this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+			factoryState.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
 		}
 
 		public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
-			return dirProviderData.get( provider ).getOptimizerStrategy();
+			return factoryState.getDirectoryProviderData().get( provider ).getOptimizerStrategy();
 		}
 
 		public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
-			return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
+			return Collections.unmodifiableSet( factoryState.getDirectoryProviderData().get( directoryProvider ).getClasses() );
 		}
 
 		public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
-			return dirProviderIndexingParams.get( provider );
+			return factoryState.getDirectoryProviderIndexingParams().get( provider );
 		}
 
 		public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
-			return SearchFactoryBuilder.this.dirProviderData.get( dp ).getDirLock();
+			return factoryState.getDirectoryProviderData().get( dp ).getDirLock();
 		}
 
 		public Similarity getSimilarity(DirectoryProvider<?> provider) {
-			Similarity similarity = dirProviderData.get( provider ).getSimilarity();
+			Similarity similarity = factoryState.getDirectoryProviderData().get( provider ).getSimilarity();
 			if ( similarity == null ) {
 				throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
 			}
@@ -611,16 +594,16 @@
 		}
 
 		public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
-			return dirProviderData.get( provider ).isExclusiveIndexUsage();
+			return factoryState.getDirectoryProviderData().get( provider ).isExclusiveIndexUsage();
 		}
 
 		public ErrorHandler getErrorHandler() {
-			return errorHandler;
+			return factoryState.getErrorHandler();
 		}
 
 		@SuppressWarnings("unchecked")
 		public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
-			return ( DocumentBuilderIndexedEntity<T> ) documentBuildersIndexedEntities.get( entityType );
+			return ( DocumentBuilderIndexedEntity<T> ) factoryState.getDocumentBuildersIndexedEntities().get( entityType );
 		}
 
 	}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryImplementorWithShareableState.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,27 @@
+package org.hibernate.search.spi.internals;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.lucene.analysis.Analyzer;
+
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * Search Factory implementor exposing its sharable state.
+ * The state can then be extracted and used to mutate factories.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactoryImplementorWithShareableState extends SearchFactoryImplementor, SearchFactoryState {
+}

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java (from rev 20832, search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/SearchFactoryState.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -0,0 +1,55 @@
+package org.hibernate.search.spi.internals;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Represents the sharable state of a search factory
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactoryState {
+	Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities();
+
+	Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData();
+
+	Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities();
+
+	String getIndexingStrategy();
+
+	Worker getWorker();
+
+	ReaderProvider getReaderProvider();
+
+	BackendQueueProcessorFactory getBackendQueueProcessorFactory();
+
+	void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory);
+
+	Map<String, FilterDef> getFilterDefinitions();
+
+	FilterCachingStrategy getFilterCachingStrategy();
+
+	Map<String, Analyzer> getAnalyzers();
+
+	int getCacheBitResultsSize();
+
+	Properties getConfigurationProperties();
+
+	ErrorHandler getErrorHandler();
+
+	PolymorphicIndexHierarchy getIndexHierarchy();
+
+	Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams();
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java	2010-10-14 12:58:00 UTC (rev 20832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java	2010-10-14 17:30:18 UTC (rev 20833)
@@ -1,55 +0,0 @@
-package org.hibernate.search.spi.internals;
-
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.lucene.analysis.Analyzer;
-
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneIndexingParameters;
-import org.hibernate.search.backend.Worker;
-import org.hibernate.search.engine.DocumentBuilderContainedEntity;
-import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
-import org.hibernate.search.engine.FilterDef;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-import org.hibernate.search.exception.ErrorHandler;
-import org.hibernate.search.filter.FilterCachingStrategy;
-import org.hibernate.search.reader.ReaderProvider;
-import org.hibernate.search.store.DirectoryProvider;
-
-/**
- * State constituting a SearchFactory
- * @author Emmanuel Bernard
- */
-public interface StateSearchFactoryImplementor extends SearchFactoryImplementor {
-
-	Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities();
-
-	Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData();
-
-	Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities();
-
-	String getIndexingStrategy();
-
-	Worker getWorker();
-
-	ReaderProvider getReaderProvider();
-
-	BackendQueueProcessorFactory getBackendQueueProcessorFactory();
-
-	Map<String, FilterDef> getFilterDefinitions();
-
-	FilterCachingStrategy getFilterCachingStrategy();
-
-	Map<String, Analyzer> getAnalyzers();
-
-	int getCacheBitResultsSize();
-
-	Properties getConfigurationProperties();
-
-	ErrorHandler getErrorHandler();
-
-	PolymorphicIndexHierarchy getIndexHierarchy();
-
-	Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams();
-}



More information about the hibernate-commits mailing list