[hibernate-commits] Hibernate SVN: r19833 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/backend and 14 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Jun 28 08:31:06 EDT 2010


Author: epbernard
Date: 2010-06-28 08:31:04 -0400 (Mon, 28 Jun 2010)
New Revision: 19833

Added:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ConfigContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/BuildContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WorkerBuildContext.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WritableBuildContext.java
Removed:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/InitContext.java
Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/WorkerFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Workspace.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/TransactionalWorker.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/BatchBackend.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/DirectoryProviderWorkspace.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/LuceneBatchBackend.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/MasterJGroupsBackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/PerDPResources.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/NotSharedReaderProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProviderFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharedReaderProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharingBufferReaderProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProviderFactory.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSDirectoryProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/RAMDirectoryProvider.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/IncrementalOptimizerStrategy.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/NoOpOptimizerStrategy.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/OptimizerStrategy.java
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/AnalyzerTest.java
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/reader/functionality/TestableSharingBufferReaderProvider.java
Log:
Merge branch 'initialize'

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,7 +27,7 @@
 import java.util.Properties;
 import java.util.List;
 
-import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.spi.WorkerBuildContext;
 
 /**
  * Interface for different types of queue processor factories. Implementations need a no-arg constructor.
@@ -42,7 +42,7 @@
 	 * @param props all configuration properties
 	 * @param searchFactory the client
 	 */
-	void initialize(Properties props, SearchFactoryImplementor searchFactory);
+	void initialize(Properties props, WorkerBuildContext context);
 
 	/**
 	 * Return a runnable implementation responsible for processing the queue to a given backend.

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Worker.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -26,7 +26,7 @@
 
 import java.util.Properties;
 
-import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.spi.WorkerBuildContext;
 
 /**
  * Perform work for a given session. This implementation has to be multi threaded.
@@ -41,7 +41,7 @@
 	 */
 	void performWork(Work work, TransactionContext transactionContext);
 
-	void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);
+	void initialize(Properties props, WorkerBuildContext context);
 
 	/**
 	 * clean resources

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/WorkerFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/WorkerFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/WorkerFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -28,9 +28,9 @@
 import java.util.Properties;
 
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.impl.TransactionalWorker;
 import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.PluginLoader;
 import org.hibernate.util.StringHelper;
 
@@ -52,7 +52,7 @@
 		return workerProperties;
 	}
 
-	public static Worker createWorker(SearchConfiguration cfg, SearchFactoryImplementor searchFactoryImplementor) {
+	public static Worker createWorker(SearchConfiguration cfg, WorkerBuildContext context) {
 		Properties props = getProperties( cfg );
 		String impl = props.getProperty( Environment.WORKER_SCOPE );
 		Worker worker;
@@ -66,7 +66,7 @@
 			worker = PluginLoader.instanceFromName( Worker.class,
 					impl, WorkerFactory.class, "worker" );
 		}
-		worker.initialize( props, searchFactoryImplementor );
+		worker.initialize( props, context );
 		return worker;
 	}
 	

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Workspace.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Workspace.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/Workspace.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -35,6 +35,7 @@
 import org.apache.lucene.search.Similarity;
 import org.slf4j.Logger;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
@@ -82,14 +83,14 @@
 	 */
 	private final AtomicLong operations = new AtomicLong( 0L );
 	
-	public Workspace(SearchFactoryImplementor searchFactoryImplementor, DirectoryProvider<?> provider) {
-		this.searchFactoryImplementor = searchFactoryImplementor;
+	public Workspace(WorkerBuildContext context, DirectoryProvider<?> provider) {
+		this.searchFactoryImplementor = context.getUninitializedSearchFactory();
 		this.directoryProvider = provider;
-		this.optimizerStrategy = searchFactoryImplementor.getOptimizerStrategy( directoryProvider );
-		this.entitiesInDirectory = searchFactoryImplementor.getClassesInDirectoryProvider( provider );
-		this.indexingParams = searchFactoryImplementor.getIndexingParameters( directoryProvider );
-		this.lock = searchFactoryImplementor.getDirectoryProviderLock( provider );
-		this.similarity = searchFactoryImplementor.getSimilarity( directoryProvider );
+		this.optimizerStrategy = context.getOptimizerStrategy( directoryProvider );
+		this.entitiesInDirectory = context.getClassesInDirectoryProvider( provider );
+		this.indexingParams = context.getIndexingParameters( directoryProvider );
+		this.lock = context.getDirectoryProviderLock( provider );
+		this.similarity = context.getSimilarity( directoryProvider );
 	}
 
 	public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilder(Class<T> entity) {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -38,6 +38,7 @@
 import org.hibernate.Hibernate;
 import org.hibernate.annotations.common.AssertionFailure;
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.AddLuceneWork;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.DeleteLuceneWork;
@@ -76,8 +77,7 @@
 	private final BackendQueueProcessorFactory backendQueueProcessorFactory;
 	private final SearchFactoryImplementor searchFactoryImplementor;
 
-	public BatchedQueueingProcessor(SearchFactoryImplementor searchFactoryImplementor, Properties properties) {
-		this.searchFactoryImplementor = searchFactoryImplementor;
+	public BatchedQueueingProcessor(WorkerBuildContext context, Properties properties) {
 		this.sync = isConfiguredAsSync( properties );
 
 		//default to a simple asynchronous operation
@@ -118,8 +118,9 @@
 			backendQueueProcessorFactory = PluginLoader.instanceFromName( BackendQueueProcessorFactory.class,
 					backend, BatchedQueueingProcessor.class, "processor" );
 		}
-		backendQueueProcessorFactory.initialize( properties, searchFactoryImplementor );
-		searchFactoryImplementor.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
+		backendQueueProcessorFactory.initialize( properties, context );
+		context.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
+		this.searchFactoryImplementor = context.getUninitializedSearchFactory();
 	}
 
 	public void add(Work work, WorkQueue workQueue) {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/TransactionalWorker.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/TransactionalWorker.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/TransactionalWorker.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -25,18 +25,18 @@
 package org.hibernate.search.backend.impl;
 
 import java.util.Properties;
-
 import javax.transaction.Synchronization;
 
+import org.slf4j.Logger;
+
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.QueueingProcessor;
+import org.hibernate.search.backend.TransactionContext;
 import org.hibernate.search.backend.Work;
 import org.hibernate.search.backend.WorkQueue;
 import org.hibernate.search.backend.Worker;
-import org.hibernate.search.backend.TransactionContext;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.LoggerFactory;
 import org.hibernate.search.util.WeakIdentityHashMap;
-import org.slf4j.Logger;
 
 /**
  * Queue works per transaction.
@@ -84,8 +84,8 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
-		this.queueingProcessor = new BatchedQueueingProcessor( searchFactory, props );
+	public void initialize(Properties props, WorkerBuildContext context) {
+		this.queueingProcessor = new BatchedQueueingProcessor( context, props );
 	}
 
 	public void close() {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/BatchBackend.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/BatchBackend.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/BatchBackend.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,9 +27,9 @@
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.batchindexing.MassIndexerProgressMonitor;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Implementors of this interface are not drop-in replacements for the standard BackendQueueProcessorFactory
@@ -46,7 +46,7 @@
 	 * @param props all configuration properties
 	 * @param searchFactory the client
 	 */
-	void initialize(Properties props, MassIndexerProgressMonitor monitor, SearchFactoryImplementor searchFactory);
+	void initialize(Properties props, MassIndexerProgressMonitor monitor, WorkerBuildContext context);
 
 	/**
 	 * Enqueues one work to be processed asynchronously

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/DirectoryProviderWorkspace.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/DirectoryProviderWorkspace.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/DirectoryProviderWorkspace.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -28,6 +28,9 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.slf4j.Logger;
+
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.Workspace;
@@ -35,10 +38,8 @@
 import org.hibernate.search.backend.impl.lucene.works.LuceneWorkVisitor;
 import org.hibernate.search.batchindexing.Executors;
 import org.hibernate.search.batchindexing.MassIndexerProgressMonitor;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.LoggerFactory;
-import org.slf4j.Logger;
 
 /**
  * Collects all resources needed to apply changes to one index.
@@ -61,12 +62,12 @@
 	
 	private final AtomicBoolean closed = new AtomicBoolean( false );
 	
-	DirectoryProviderWorkspace(SearchFactoryImplementor searchFactoryImp, DirectoryProvider<?> dp, MassIndexerProgressMonitor monitor, int maxThreads) {
+	DirectoryProviderWorkspace(WorkerBuildContext context, DirectoryProvider<?> dp, MassIndexerProgressMonitor monitor, int maxThreads) {
 		if ( maxThreads < 1 ) {
 			throw new IllegalArgumentException( "maxThreads needs to be at least 1" );
 		}
 		this.monitor = monitor;
-		workspace = new Workspace( searchFactoryImp, dp );
+		workspace = new Workspace( context, dp );
 		visitor = new LuceneWorkVisitor( workspace );
 		executor = Executors.newFixedThreadPool( maxThreads, "indexwriter" );
 	}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/LuceneBatchBackend.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/LuceneBatchBackend.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/batchlucene/LuceneBatchBackend.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -30,6 +30,7 @@
 import java.util.concurrent.TimeUnit;
 
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
@@ -59,14 +60,14 @@
 	private final PerDirectoryWorkProcessor asyncWorker = new AsyncBatchPerDirectoryWorkProcessor();
 	private final PerDirectoryWorkProcessor syncWorker = new SyncBatchPerDirectoryWorkProcessor();
 
-	public void initialize(Properties cfg, MassIndexerProgressMonitor monitor, SearchFactoryImplementor searchFactoryImplementor) {
-		this.searchFactoryImplementor = searchFactoryImplementor;
+	public void initialize(Properties cfg, MassIndexerProgressMonitor monitor, WorkerBuildContext context) {
+		this.searchFactoryImplementor = context.getUninitializedSearchFactory();
 		int maxThreadsPerIndex = ConfigurationParseHelper.getIntValue( cfg, "concurrent_writers", 2 );
 		if ( maxThreadsPerIndex < 1 ) {
 			throw new SearchException( "concurrent_writers for batch backend must be at least 1." );
 		}
-		for ( DirectoryProvider<?> dp : searchFactoryImplementor.getDirectoryProviders() ) {
-			DirectoryProviderWorkspace resources = new DirectoryProviderWorkspace( searchFactoryImplementor, dp, monitor, maxThreadsPerIndex );
+		for ( DirectoryProvider<?> dp : context.getDirectoryProviders() ) {
+			DirectoryProviderWorkspace resources = new DirectoryProviderWorkspace( context, dp, monitor, maxThreadsPerIndex );
 			resourcesMap.put( dp, resources );
 		}
 	}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,9 +27,9 @@
 import java.util.List;
 import java.util.Properties;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.LoggerFactory;
 import org.slf4j.Logger;
 
@@ -52,7 +52,7 @@
 		return noOp;
 	}
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
+	public void initialize(Properties props, WorkerBuildContext context) {
 		// no-op
 		log.warn( "initialized \"blackhole\" backend. Index changes will be prepared but discarded!" );
 	}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -35,6 +35,7 @@
 import org.slf4j.Logger;
 
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
@@ -67,13 +68,12 @@
 	protected Channel channel = null;
 	protected Address address;
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
-		this.searchFactory = searchFactory;
+	public void initialize(Properties props, WorkerBuildContext context) {
+		this.searchFactory = context.getUninitializedSearchFactory();
 
 		if ( props.containsKey( JG_CLUSTER_NAME ) ) {
 			setClusterName( props.getProperty( JG_CLUSTER_NAME ) );
 		}
-
 		prepareJGroupsChannel( props );
 	}
 

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/MasterJGroupsBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/MasterJGroupsBackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/MasterJGroupsBackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -29,9 +29,9 @@
 
 import org.jgroups.Receiver;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Backend factory used in JGroups clustering mode in master node.
@@ -48,10 +48,9 @@
 	private Receiver masterListener;
 
 	@Override
-	public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
-		super.initialize( props, searchFactory );
-		initLuceneBackendQueueProcessorFactory( props, searchFactory );
-
+	public void initialize(Properties props, WorkerBuildContext context) {
+		super.initialize( props, context );
+		initLuceneBackendQueueProcessorFactory( props, context );
 		registerMasterListener();
 	}
 
@@ -65,9 +64,9 @@
 		channel.setReceiver( masterListener );
 	}
 
-	private void initLuceneBackendQueueProcessorFactory(Properties props, SearchFactoryImplementor searchFactory) {
+	private void initLuceneBackendQueueProcessorFactory(Properties props, WorkerBuildContext context) {
 		luceneBackendQueueProcessorFactory = new LuceneBackendQueueProcessorFactory();
-		luceneBackendQueueProcessorFactory.initialize( props, searchFactory );
+		luceneBackendQueueProcessorFactory.initialize( props, context );
 	}
 
 	public Receiver getMasterListener() {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -35,8 +35,8 @@
 import javax.naming.NamingException;
 
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
 
@@ -53,7 +53,7 @@
 	public static final String JMS_CONNECTION_FACTORY = Environment.WORKER_PREFIX + "jms.connection_factory";
 	public static final String JMS_QUEUE = Environment.WORKER_PREFIX + "jms.queue";
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(Properties props, WorkerBuildContext context) {
 		//TODO proper exception if jms queues and connecitons are not there
 		this.properties = props;
 		this.jmsConnectionFactoryName = props.getProperty( JMS_CONNECTION_FACTORY );

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -29,6 +29,7 @@
 import java.util.Properties;
 import java.util.List;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
@@ -63,11 +64,11 @@
 	 */
 	private boolean sync;
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
-		this.searchFactoryImp = searchFactoryImplementor;
+	public void initialize(Properties props, WorkerBuildContext context) {
+		this.searchFactoryImp = context.getUninitializedSearchFactory();
 		this.sync = BatchedQueueingProcessor.isConfiguredAsSync( props );
-		for (DirectoryProvider dp : searchFactoryImplementor.getDirectoryProviders() ) {
-			PerDPResources resources = new PerDPResources( searchFactoryImplementor, dp );
+		for (DirectoryProvider dp : context.getDirectoryProviders() ) {
+			PerDPResources resources = new PerDPResources( context, dp );
 			resourcesMap.put( dp, resources );
 		}
 	}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/PerDPResources.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/PerDPResources.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/PerDPResources.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -24,10 +24,10 @@
  */
 package org.hibernate.search.backend.impl.lucene;
 
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.backend.Workspace;
 import org.hibernate.search.backend.impl.lucene.works.LuceneWorkVisitor;
 import org.hibernate.search.batchindexing.Executors;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.exception.ErrorHandler;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.LoggerFactory;
@@ -52,12 +52,12 @@
 	private final boolean exclusiveIndexUsage;
 	private final ErrorHandler errorHandler;
 	
-	PerDPResources(SearchFactoryImplementor searchFactoryImp, DirectoryProvider<?> dp) {
-		workspace = new Workspace( searchFactoryImp, dp );
+	PerDPResources(WorkerBuildContext context, DirectoryProvider<?> dp) {
+		workspace = new Workspace( context, dp );
 		visitor = new LuceneWorkVisitor( workspace );
 		executor = Executors.newFixedThreadPool( 1, "Directory writer" );
-		exclusiveIndexUsage = searchFactoryImp.isExclusiveIndexUsageEnabled( dp );
-		errorHandler = searchFactoryImp.getErrorHandler();
+		exclusiveIndexUsage = context.isExclusiveIndexUsageEnabled( dp );
+		errorHandler = context.getErrorHandler();
 	}
 
 	public ExecutorService getExecutor() {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -56,7 +56,6 @@
 import org.hibernate.search.annotations.ClassBridge;
 import org.hibernate.search.annotations.ClassBridges;
 import org.hibernate.search.annotations.ContainedIn;
-import org.hibernate.search.annotations.DocumentId;
 import org.hibernate.search.annotations.DynamicBoost;
 import org.hibernate.search.annotations.Index;
 import org.hibernate.search.annotations.IndexedEmbedded;
@@ -67,7 +66,7 @@
 import org.hibernate.search.bridge.BridgeFactory;
 import org.hibernate.search.bridge.FieldBridge;
 import org.hibernate.search.bridge.LuceneOptions;
-import org.hibernate.search.impl.InitContext;
+import org.hibernate.search.impl.ConfigContext;
 import org.hibernate.search.util.LoggerFactory;
 import org.hibernate.search.util.PassThroughAnalyzer;
 import org.hibernate.search.util.ReflectionHelper;
@@ -106,7 +105,7 @@
 	 * @param context Handle to default configuration settings.
 	 * @param reflectionManager Reflection manager to use for processing the annotations.
 	 */
-	public DocumentBuilderContainedEntity(XClass clazz, InitContext context, ReflectionManager reflectionManager) {
+	public DocumentBuilderContainedEntity(XClass clazz, ConfigContext context, ReflectionManager reflectionManager) {
 
 		if ( clazz == null ) {
 			throw new AssertionFailure( "Unable to build a DocumentBuilderContainedEntity with a null class" );
@@ -123,7 +122,7 @@
 		}
 	}
 
-	protected void init(XClass clazz, InitContext context) {
+	protected void init(XClass clazz, ConfigContext context) {
 		metadata.boost = getBoost( clazz );
 		metadata.classBoostStrategy = getDynamicBoost( clazz );
 		metadata.analyzer = context.getDefaultAnalyzer();
@@ -145,7 +144,7 @@
 	}
 
 	private void initializeClass(XClass clazz, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix,
-								 Set<XClass> processedClasses, InitContext context) {
+								 Set<XClass> processedClasses, ConfigContext context) {
 		List<XClass> hierarchy = new ArrayList<XClass>();
 		for ( XClass currentClass = clazz; currentClass != null; currentClass = currentClass.getSuperclass() ) {
 			hierarchy.add( currentClass );
@@ -187,7 +186,7 @@
 	 * @param prefix The current prefix used for the <code>Document</code> field names.
 	 * @param context Handle to default configuration settings.
 	 */
-	private void initializeClassLevelAnnotations(XClass clazz, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, InitContext context) {
+	private void initializeClassLevelAnnotations(XClass clazz, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, ConfigContext context) {
 
 		// check for a class level specified analyzer
 		Analyzer analyzer = getAnalyzer( clazz, context );
@@ -222,7 +221,7 @@
 	}
 
 	protected void initializeMemberLevelAnnotations(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot,
-													String prefix, Set<XClass> processedClasses, InitContext context) {
+													String prefix, Set<XClass> processedClasses, ConfigContext context) {
 		checkDocumentId( member, propertiesMetadata, isRoot, prefix, context );
 		checkForField( member, propertiesMetadata, prefix, context );
 		checkForFields( member, propertiesMetadata, prefix, context );
@@ -232,13 +231,13 @@
 		checkForContainedIn( member, propertiesMetadata );
 	}
 
-	protected Analyzer getAnalyzer(XAnnotatedElement annotatedElement, InitContext context) {
+	protected Analyzer getAnalyzer(XAnnotatedElement annotatedElement, ConfigContext context) {
 		org.hibernate.search.annotations.Analyzer analyzerAnn =
 				annotatedElement.getAnnotation( org.hibernate.search.annotations.Analyzer.class );
 		return getAnalyzer( analyzerAnn, context );
 	}
 
-	protected Analyzer getAnalyzer(org.hibernate.search.annotations.Analyzer analyzerAnn, InitContext context) {
+	protected Analyzer getAnalyzer(org.hibernate.search.annotations.Analyzer analyzerAnn, ConfigContext context) {
 		Class analyzerClass = analyzerAnn == null ? void.class : analyzerAnn.impl();
 		if ( analyzerClass == void.class ) {
 			String definition = analyzerAnn == null ? "" : analyzerAnn.definition();
@@ -268,7 +267,7 @@
 		}
 	}
 
-	private void checkForAnalyzerDefs(XAnnotatedElement annotatedElement, InitContext context) {
+	private void checkForAnalyzerDefs(XAnnotatedElement annotatedElement, ConfigContext context) {
 		AnalyzerDefs defs = annotatedElement.getAnnotation( AnalyzerDefs.class );
 		if ( defs != null ) {
 			for ( AnalyzerDef def : defs.value() ) {
@@ -308,7 +307,7 @@
 		return similarity;
 	}
 
-	private void checkForFields(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, InitContext context) {
+	private void checkForFields(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, ConfigContext context) {
 		org.hibernate.search.annotations.Fields fieldsAnn =
 				member.getAnnotation( org.hibernate.search.annotations.Fields.class );
 		if ( fieldsAnn != null ) {
@@ -339,7 +338,7 @@
 		}
 	}
 
-	private void checkForField(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, InitContext context) {
+	private void checkForField(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, ConfigContext context) {
 		org.hibernate.search.annotations.Field fieldAnn =
 				member.getAnnotation( org.hibernate.search.annotations.Field.class );
 		if ( fieldAnn != null ) {
@@ -355,7 +354,7 @@
 		}
 	}
 
-	private void checkForIndexedEmbedded(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, Set<XClass> processedClasses, InitContext context) {
+	private void checkForIndexedEmbedded(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, Set<XClass> processedClasses, ConfigContext context) {
 		IndexedEmbedded embeddedAnn = member.getAnnotation( IndexedEmbedded.class );
 		if ( embeddedAnn != null ) {
 			int oldMaxLevel = maxLevel;
@@ -426,7 +425,7 @@
 		}
 	}
 
-	protected void checkDocumentId(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, InitContext context) {
+	protected void checkDocumentId(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, ConfigContext context) {
 		// TODO - HSEARCH-333
 		// for a contained entity there is nothing to do here. This is really bad design since this protected method is called by the constructor and
 		// overridden by DocumentBuilderIndexedEntity
@@ -454,7 +453,7 @@
 		return ReflectionHelper.getAttributeName( member, name );
 	}
 
-	private void bindClassBridgeAnnotation(String prefix, PropertiesMetadata propertiesMetadata, ClassBridge ann, InitContext context) {
+	private void bindClassBridgeAnnotation(String prefix, PropertiesMetadata propertiesMetadata, ClassBridge ann, ConfigContext context) {
 		String fieldName = prefix + ann.name();
 		propertiesMetadata.classNames.add( fieldName );
 		propertiesMetadata.classStores.add( ann.store() );
@@ -473,7 +472,7 @@
 		addToScopedAnalyzer( fieldName, analyzer, ann.index() );
 	}
 
-	private void bindFieldAnnotation(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, org.hibernate.search.annotations.Field fieldAnn, InitContext context) {
+	private void bindFieldAnnotation(XProperty member, PropertiesMetadata propertiesMetadata, String prefix, org.hibernate.search.annotations.Field fieldAnn, ConfigContext context) {
 		ReflectionHelper.setAccessible( member );
 		propertiesMetadata.fieldGetters.add( member );
 		String fieldName = prefix + ReflectionHelper.getAttributeName( member, fieldAnn.name() );

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -68,7 +68,7 @@
 import org.hibernate.search.bridge.TwoWayFieldBridge;
 import org.hibernate.search.bridge.TwoWayString2FieldBridgeAdaptor;
 import org.hibernate.search.bridge.TwoWayStringBridge;
-import org.hibernate.search.impl.InitContext;
+import org.hibernate.search.impl.ConfigContext;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.store.IndexShardingStrategy;
 import org.hibernate.search.util.LoggerFactory;
@@ -143,7 +143,7 @@
 	 * @param shardingStrategy The sharding strategy used for the indexed entity.
 	 * @param reflectionManager Reflection manager to use for processing the annotations.
 	 */
-	public DocumentBuilderIndexedEntity(XClass clazz, InitContext context, DirectoryProvider[] directoryProviders,
+	public DocumentBuilderIndexedEntity(XClass clazz, ConfigContext context, DirectoryProvider[] directoryProviders,
 										IndexShardingStrategy shardingStrategy, ReflectionManager reflectionManager) {
 
 		super( clazz, context, reflectionManager );
@@ -153,7 +153,7 @@
 		this.shardingStrategy = shardingStrategy;
 	}
 
-	protected void init(XClass clazz, InitContext context) {
+	protected void init(XClass clazz, ConfigContext context) {
 		super.init( clazz, context );
 
 		// special case @ProvidedId
@@ -177,7 +177,7 @@
 		}
 	}
 
-	protected void checkDocumentId(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, InitContext context) {
+	protected void checkDocumentId(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix, ConfigContext context) {
 		Annotation idAnnotation = getIdAnnotation( member, context );
 		if ( idAnnotation != null ) {
 			String attributeName = getIdAttributeName( member, idAnnotation );
@@ -238,7 +238,7 @@
 	 *
 	 * @return the annotation used as document id or <code>null</code> if id annotation is specified on the property.
 	 */
-	private Annotation getIdAnnotation(XProperty member, InitContext context) {
+	private Annotation getIdAnnotation(XProperty member, ConfigContext context) {
 		Annotation idAnnotation = null;
 
 		// check for explicit DocumentId
@@ -254,7 +254,7 @@
 				@SuppressWarnings("unchecked")
 				Class<? extends Annotation> jpaIdClass =
 						org.hibernate.annotations.common.util.ReflectHelper
-							.classForName( "javax.persistence.Id", InitContext.class );
+							.classForName( "javax.persistence.Id", ConfigContext.class );
 				jpaId = member.getAnnotation( jpaIdClass );
 			}
 			catch ( ClassNotFoundException e ) {

Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ConfigContext.java (from rev 19832, search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/InitContext.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ConfigContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ConfigContext.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,201 @@
+/* $Id$
+ * 
+ * Hibernate, Relational Persistence for Idiomatic Java
+ * 
+ * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
+ * indicated by the @author tags or express copyright attribution
+ * statements applied by the authors.  All third-party contributions are
+ * distributed under license by Red Hat, Inc.
+ * 
+ * This copyrighted material is made available to anyone wishing to use, modify,
+ * copy, or redistribute it subject to the terms and conditions of the GNU
+ * Lesser General Public License, as published by the Free Software Foundation.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
+ * for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this distribution; if not, write to:
+ * Free Software Foundation, Inc.
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA  02110-1301  USA
+ */
+package org.hibernate.search.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.search.Similarity;
+
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.annotations.AnalyzerDef;
+import org.hibernate.search.cfg.SearchConfiguration;
+import org.hibernate.search.util.DelegateNamedAnalyzer;
+import org.hibernate.search.util.LoggerFactory;
+import org.hibernate.search.util.PluginLoader;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+import org.slf4j.Logger;
+
+/**
+ * Provides access to some default configuration settings (eg default <code>Analyzer</code> or default
+ * <code>Similarity</code>) and checks whether certain optional libraries are available.
+ *
+ *
+ * @author Emmanuel Bernard
+ * @author Hardy Ferentschik
+ */
+public class ConfigContext {
+	
+	private static final Logger log = LoggerFactory.make();
+	
+	private final Map<String, AnalyzerDef> analyzerDefs = new HashMap<String, AnalyzerDef>();
+	private final List<DelegateNamedAnalyzer> lazyAnalyzers = new ArrayList<DelegateNamedAnalyzer>();
+	private final Analyzer defaultAnalyzer;
+	private final Similarity defaultSimilarity;
+	private final boolean solrPresent;
+	private final boolean jpaPresent;
+
+	public ConfigContext(SearchConfiguration cfg) {
+		defaultAnalyzer = initAnalyzer(cfg);
+		defaultSimilarity = initSimilarity(cfg);
+		solrPresent = isPresent( "org.apache.solr.analysis.TokenizerFactory" );
+		jpaPresent = isPresent( "javax.persistence.Id" );
+	}
+
+	public void addAnalyzerDef(AnalyzerDef ann) {
+		//FIXME somehow remember where the analyzerDef comes from and raise an exception if an analyzerDef
+		//with the same name from two different places are added
+		//multiple adding from the same place is required to deal with inheritance hierarchy processed multiple times
+		if ( ann != null && analyzerDefs.put( ann.name(), ann ) != null ) {
+			//throw new SearchException("Multiple AnalyzerDef with the same name: " + name);
+		}
+	}
+
+	public Analyzer buildLazyAnalyzer(String name) {
+		final DelegateNamedAnalyzer delegateNamedAnalyzer = new DelegateNamedAnalyzer( name );
+		lazyAnalyzers.add(delegateNamedAnalyzer);
+		return delegateNamedAnalyzer;
+	}
+
+	public List<DelegateNamedAnalyzer> getLazyAnalyzers() {
+		return lazyAnalyzers;
+	}
+
+	/**
+	 * Initializes the Lucene analyzer to use by reading the analyzer class from the configuration and instantiating it.
+	 *
+	 * @param cfg
+	 *            The current configuration.
+	 * @return The Lucene analyzer to use for tokenisation.
+	 */
+	private Analyzer initAnalyzer(SearchConfiguration cfg) {
+		Class analyzerClass;
+		String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
+		if ( analyzerClassName != null ) {
+			try {
+				analyzerClass = ReflectHelper.classForName( analyzerClassName );
+			} catch (Exception e) {
+				return buildLazyAnalyzer( analyzerClassName );
+			}
+		} else {
+			analyzerClass = StandardAnalyzer.class;
+		}
+		Analyzer defaultAnalyzer = PluginLoader.instanceFromClass( Analyzer.class,
+				analyzerClass, "Lucene analyzer" );
+		return defaultAnalyzer;
+	}
+
+	/**
+	 * Initializes the Lucene similarity to use.
+	 *
+	 * @param cfg the search configuration.
+	 * @return returns the default similarity class.
+	 */
+	private Similarity initSimilarity(SearchConfiguration cfg) {
+		String similarityClassName = cfg.getProperty(Environment.SIMILARITY_CLASS);
+		Similarity defaultSimilarity;
+		if ( StringHelper.isEmpty( similarityClassName ) ) {
+			defaultSimilarity =  Similarity.getDefault();
+		}
+		else {
+			defaultSimilarity = PluginLoader.instanceFromName(
+					Similarity.class, similarityClassName, ConfigContext.class, "default similarity" );
+		}
+		log.debug( "Using default similarity implementation: {}", defaultSimilarity.getClass().getName() );		
+		return defaultSimilarity;
+	}
+
+	public Analyzer getDefaultAnalyzer() {
+		return defaultAnalyzer;
+	}
+
+	public Similarity getDefaultSimilarity() {
+		return defaultSimilarity;
+	}
+
+	public Map<String, Analyzer> initLazyAnalyzers() {
+		Map<String, Analyzer> initializedAnalyzers = new HashMap<String, Analyzer>( analyzerDefs.size() );
+
+		for (DelegateNamedAnalyzer namedAnalyzer : lazyAnalyzers) {
+			String name = namedAnalyzer.getName();
+			if ( initializedAnalyzers.containsKey( name ) ) {
+				namedAnalyzer.setDelegate( initializedAnalyzers.get( name ) );
+			}
+			else {
+				if ( analyzerDefs.containsKey( name ) ) {
+					final Analyzer analyzer = buildAnalyzer( analyzerDefs.get( name ) );
+					namedAnalyzer.setDelegate( analyzer );
+					initializedAnalyzers.put( name, analyzer );
+				}
+				else {
+					throw new SearchException("Analyzer found with an unknown definition: " + name);
+				}
+			}
+		}
+
+		//initialize the remaining definitions
+		for ( Map.Entry<String, AnalyzerDef> entry : analyzerDefs.entrySet() ) {
+			if ( ! initializedAnalyzers.containsKey( entry.getKey() ) ) {
+				final Analyzer analyzer = buildAnalyzer( entry.getValue() );
+				initializedAnalyzers.put( entry.getKey(), analyzer );
+			}
+		}
+		return Collections.unmodifiableMap( initializedAnalyzers );
+	}
+
+	private Analyzer buildAnalyzer(AnalyzerDef analyzerDef) {
+		if ( ! solrPresent ) {
+			throw new SearchException( "Use of @AnalyzerDef while Solr is not present in the classpath. Add apache-solr-analyzer.jar" );
+		}
+		// SolrAnalyzerBuilder references Solr classes.
+		// InitContext should not (directly or indirectly) load a Solr class to avoid hard dependency
+		// unless necessary
+		// the current mechanism (check Solr class presence and call SolrAnalyzerBuilder if needed
+		// seems to be sufficient on Apple VM (derived from Sun's
+		// TODO check on other VMs and be ready for a more reflexive approach
+		return SolrAnalyzerBuilder.buildAnalyzer( analyzerDef );
+	}
+
+	public boolean isJpaPresent() {
+		return jpaPresent;
+	}
+
+	private boolean isPresent(String classname) {
+		try {
+			ReflectHelper.classForName( classname, ConfigContext.class );
+			return true;
+		}
+		catch ( Exception e ) {
+			return false;
+		}
+	}
+}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,53 @@
+package org.hibernate.search.impl;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.lucene.search.Similarity;
+
+import org.hibernate.search.store.optimization.OptimizerStrategy;
+
+/**
+* @author Emmanuel Bernard
+*/
+class DirectoryProviderData {
+	private final ReentrantLock dirLock = new ReentrantLock();
+	private OptimizerStrategy optimizerStrategy;
+	private final Set<Class<?>> classes = new HashSet<Class<?>>( 2 );
+	private Similarity similarity = null;
+	private boolean exclusiveIndexUsage;
+
+	public void setOptimizerStrategy(OptimizerStrategy optimizerStrategy) {
+		this.optimizerStrategy = optimizerStrategy;
+	}
+
+	public void setSimilarity(Similarity similarity) {
+		this.similarity = similarity;
+	}
+
+	public void setExclusiveIndexUsage(boolean exclusiveIndexUsage) {
+		this.exclusiveIndexUsage = exclusiveIndexUsage;
+	}
+
+	public ReentrantLock getDirLock() {
+
+		return dirLock;
+	}
+
+	public OptimizerStrategy getOptimizerStrategy() {
+		return optimizerStrategy;
+	}
+
+	public Set<Class<?>> getClasses() {
+		return classes;
+	}
+
+	public Similarity getSimilarity() {
+		return similarity;
+	}
+
+	public boolean isExclusiveIndexUsage() {
+		return exclusiveIndexUsage;
+	}
+}

Deleted: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/InitContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/InitContext.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/InitContext.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -1,201 +0,0 @@
-/* $Id$
- * 
- * Hibernate, Relational Persistence for Idiomatic Java
- * 
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
- * indicated by the @author tags or express copyright attribution
- * statements applied by the authors.  All third-party contributions are
- * distributed under license by Red Hat, Inc.
- * 
- * This copyrighted material is made available to anyone wishing to use, modify,
- * copy, or redistribute it subject to the terms and conditions of the GNU
- * Lesser General Public License, as published by the Free Software Foundation.
- * 
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
- * for more details.
- * 
- * You should have received a copy of the GNU Lesser General Public License
- * along with this distribution; if not, write to:
- * Free Software Foundation, Inc.
- * 51 Franklin Street, Fifth Floor
- * Boston, MA  02110-1301  USA
- */
-package org.hibernate.search.impl;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.search.Similarity;
-
-import org.hibernate.search.Environment;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.annotations.AnalyzerDef;
-import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.util.DelegateNamedAnalyzer;
-import org.hibernate.search.util.LoggerFactory;
-import org.hibernate.search.util.PluginLoader;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-import org.slf4j.Logger;
-
-/**
- * Provides access to some default configuration settings (eg default <code>Analyzer</code> or default
- * <code>Similarity</code>) and checks whether certain optional libraries are available.
- *
- *
- * @author Emmanuel Bernard
- * @author Hardy Ferentschik
- */
-public class InitContext {
-	
-	private static final Logger log = LoggerFactory.make();
-	
-	private final Map<String, AnalyzerDef> analyzerDefs = new HashMap<String, AnalyzerDef>();
-	private final List<DelegateNamedAnalyzer> lazyAnalyzers = new ArrayList<DelegateNamedAnalyzer>();
-	private final Analyzer defaultAnalyzer;
-	private final Similarity defaultSimilarity;
-	private final boolean solrPresent;
-	private final boolean jpaPresent;
-
-	public InitContext(SearchConfiguration cfg) {
-		defaultAnalyzer = initAnalyzer(cfg);
-		defaultSimilarity = initSimilarity(cfg);
-		solrPresent = isPresent( "org.apache.solr.analysis.TokenizerFactory" );
-		jpaPresent = isPresent( "javax.persistence.Id" );
-	}
-
-	public void addAnalyzerDef(AnalyzerDef ann) {
-		//FIXME somehow remember where the analyzerDef comes from and raise an exception if an analyzerDef
-		//with the same name from two different places are added
-		//multiple adding from the same place is required to deal with inheritance hierarchy processed multiple times
-		if ( ann != null && analyzerDefs.put( ann.name(), ann ) != null ) {
-			//throw new SearchException("Multiple AnalyzerDef with the same name: " + name);
-		}
-	}
-
-	public Analyzer buildLazyAnalyzer(String name) {
-		final DelegateNamedAnalyzer delegateNamedAnalyzer = new DelegateNamedAnalyzer( name );
-		lazyAnalyzers.add(delegateNamedAnalyzer);
-		return delegateNamedAnalyzer;
-	}
-
-	public List<DelegateNamedAnalyzer> getLazyAnalyzers() {
-		return lazyAnalyzers;
-	}
-
-	/**
-	 * Initializes the Lucene analyzer to use by reading the analyzer class from the configuration and instantiating it.
-	 *
-	 * @param cfg
-	 *            The current configuration.
-	 * @return The Lucene analyzer to use for tokenisation.
-	 */
-	private Analyzer initAnalyzer(SearchConfiguration cfg) {
-		Class analyzerClass;
-		String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
-		if ( analyzerClassName != null ) {
-			try {
-				analyzerClass = ReflectHelper.classForName( analyzerClassName );
-			} catch (Exception e) {
-				return buildLazyAnalyzer( analyzerClassName );
-			}
-		} else {
-			analyzerClass = StandardAnalyzer.class;
-		}
-		Analyzer defaultAnalyzer = PluginLoader.instanceFromClass( Analyzer.class,
-				analyzerClass, "Lucene analyzer" );
-		return defaultAnalyzer;
-	}
-
-	/**
-	 * Initializes the Lucene similarity to use.
-	 *
-	 * @param cfg the search configuration.
-	 * @return returns the default similarity class.
-	 */
-	private Similarity initSimilarity(SearchConfiguration cfg) {
-		String similarityClassName = cfg.getProperty(Environment.SIMILARITY_CLASS);
-		Similarity defaultSimilarity;
-		if ( StringHelper.isEmpty( similarityClassName ) ) {
-			defaultSimilarity =  Similarity.getDefault();
-		}
-		else {
-			defaultSimilarity = PluginLoader.instanceFromName(
-					Similarity.class, similarityClassName, InitContext.class, "default similarity" );
-		}
-		log.debug( "Using default similarity implementation: {}", defaultSimilarity.getClass().getName() );		
-		return defaultSimilarity;
-	}
-
-	public Analyzer getDefaultAnalyzer() {
-		return defaultAnalyzer;
-	}
-
-	public Similarity getDefaultSimilarity() {
-		return defaultSimilarity;
-	}
-
-	public Map<String, Analyzer> initLazyAnalyzers() {
-		Map<String, Analyzer> initializedAnalyzers = new HashMap<String, Analyzer>( analyzerDefs.size() );
-
-		for (DelegateNamedAnalyzer namedAnalyzer : lazyAnalyzers) {
-			String name = namedAnalyzer.getName();
-			if ( initializedAnalyzers.containsKey( name ) ) {
-				namedAnalyzer.setDelegate( initializedAnalyzers.get( name ) );
-			}
-			else {
-				if ( analyzerDefs.containsKey( name ) ) {
-					final Analyzer analyzer = buildAnalyzer( analyzerDefs.get( name ) );
-					namedAnalyzer.setDelegate( analyzer );
-					initializedAnalyzers.put( name, analyzer );
-				}
-				else {
-					throw new SearchException("Analyzer found with an unknown definition: " + name);
-				}
-			}
-		}
-
-		//initialize the remaining definitions
-		for ( Map.Entry<String, AnalyzerDef> entry : analyzerDefs.entrySet() ) {
-			if ( ! initializedAnalyzers.containsKey( entry.getKey() ) ) {
-				final Analyzer analyzer = buildAnalyzer( entry.getValue() );
-				initializedAnalyzers.put( entry.getKey(), analyzer );
-			}
-		}
-		return Collections.unmodifiableMap( initializedAnalyzers );
-	}
-
-	private Analyzer buildAnalyzer(AnalyzerDef analyzerDef) {
-		if ( ! solrPresent ) {
-			throw new SearchException( "Use of @AnalyzerDef while Solr is not present in the classpath. Add apache-solr-analyzer.jar" );
-		}
-		// SolrAnalyzerBuilder references Solr classes.
-		// InitContext should not (directly or indirectly) load a Solr class to avoid hard dependency
-		// unless necessary
-		// the current mechanism (check Solr class presence and call SolrAnalyzerBuilder if needed
-		// seems to be sufficient on Apple VM (derived from Sun's
-		// TODO check on other VMs and be ready for a more reflexive approach
-		return SolrAnalyzerBuilder.buildAnalyzer( analyzerDef );
-	}
-
-	public boolean isJpaPresent() {
-		return jpaPresent;
-	}
-
-	private boolean isPresent(String classname) {
-		try {
-			ReflectHelper.classForName( classname, InitContext.class );
-			return true;
-		}
-		catch ( Exception e ) {
-			return false;
-		}
-	}
-}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,61 @@
+package org.hibernate.search.impl;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+
+import org.hibernate.search.util.LoggerFactory;
+
+/**
+ * Helper class which keeps track of all super classes and interfaces of the indexed entities.
+ */
+class PolymorphicIndexHierarchy {
+	private static final Logger log = LoggerFactory.make();
+
+	private Map<Class<?>, Set<Class<?>>> classToIndexedClass;
+
+	PolymorphicIndexHierarchy() {
+		classToIndexedClass = new HashMap<Class<?>, Set<Class<?>>>();
+	}
+
+	void addIndexedClass(Class indexedClass) {
+		addClass( indexedClass, indexedClass );
+		Class superClass = indexedClass.getSuperclass();
+		while ( superClass != null ) {
+			addClass( superClass, indexedClass );
+			superClass = superClass.getSuperclass();
+		}
+		for ( Class clazz : indexedClass.getInterfaces() ) {
+			addClass( clazz, indexedClass );
+		}
+	}
+
+	private void addClass(Class superclass, Class indexedClass) {
+		Set<Class<?>> classesSet = classToIndexedClass.get( superclass );
+		if ( classesSet == null ) {
+			classesSet = new HashSet<Class<?>>();
+			classToIndexedClass.put( superclass, classesSet );
+		}
+		classesSet.add( indexedClass );
+	}
+
+	Set<Class<?>> getIndexedClasses(Class<?>[] classes) {
+		Set<Class<?>> idexedClasses = new HashSet<Class<?>>();
+		for ( Class clazz : classes ) {
+			Set<Class<?>> set = classToIndexedClass.get( clazz );
+			if ( set != null ) {
+				// at this point we don't have to care about including indexed subclasses of a indexed class
+				// MultiClassesQueryLoader will take care of this later and optimise the queries
+				idexedClasses.addAll( set );
+			}
+		}
+		if ( log.isTraceEnabled() ) {
+			log.trace( "Targeted indexed classes for {}: {}", Arrays.toString( classes ), idexedClasses );
+		}
+		return idexedClasses;
+	}
+}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryImpl.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,10 +27,8 @@
 import java.beans.Introspector;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +45,8 @@
 import org.hibernate.annotations.common.reflection.XClass;
 import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WritableBuildContext;
+import org.hibernate.search.spi.WorkerBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.Version;
 import org.hibernate.search.annotations.AnalyzerDef;
@@ -97,7 +97,7 @@
 /**
  * @author Emmanuel Bernard
  */
-public class SearchFactoryImpl implements SearchFactoryImplementor {
+public class SearchFactoryImpl implements SearchFactoryImplementor, WritableBuildContext, WorkerBuildContext {
 
 	static {
 		Version.touch();
@@ -191,17 +191,17 @@
 
 	private void fillSimilarityMapping() {
 		for ( DirectoryProviderData directoryConfiguration : dirProviderData.values() ) {
-			for (Class<?> indexedType : directoryConfiguration.classes) {
+			for ( Class<?> indexedType : directoryConfiguration.getClasses() ) {
 				DocumentBuilderIndexedEntity<?> documentBuilder = documentBuildersIndexedEntities.get( indexedType );
 				Similarity similarity = documentBuilder.getSimilarity();
-				Similarity prevSimilarity = directoryConfiguration.similarity;
+				Similarity prevSimilarity = directoryConfiguration.getSimilarity();
 				if ( prevSimilarity != null && ! prevSimilarity.getClass().equals( similarity.getClass() ) ) {
 					throw new SearchException( "Multiple entities are sharing the same index but are declaring an " + 
 							"inconsistent Similarity. When overrriding default Similarity make sure that all types sharing a same index " +
 							"declare the same Similarity implementation." );
 				}
 				else {
-					directoryConfiguration.similarity = similarity;
+					directoryConfiguration.setSimilarity( similarity );
 				}
 			}
 		}
@@ -266,14 +266,14 @@
 			data = new DirectoryProviderData();
 			dirProviderData.put( directoryProvider, data );
 		}
-		data.classes.add( clazz );
-		data.exclusiveIndexUsage = exclusiveIndexUsage;
+		data.getClasses().add( clazz );
+		data.setExclusiveIndexUsage( exclusiveIndexUsage );
 	}
 
 	public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
 		if ( barrier != 0 ) {
 		} //read barrier
-		return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).classes );
+		return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
 	}
 
 	private void bindFilterDefs(XClass mappedXClass) {
@@ -400,7 +400,7 @@
 			data = new DirectoryProviderData();
 			dirProviderData.put( provider, data );
 		}
-		data.optimizerStrategy = optimizerStrategy;
+		data.setOptimizerStrategy( optimizerStrategy );
 	}
 
 	public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
@@ -411,7 +411,7 @@
 	public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
 		if ( barrier != 0 ) {
 		} //read barrier
-		return dirProviderData.get( provider ).optimizerStrategy;
+		return dirProviderData.get( provider ).getOptimizerStrategy();
 	}
 
 	public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
@@ -483,7 +483,7 @@
 	}
 
 	private void initDocumentBuilders(SearchConfiguration cfg, ReflectionManager reflectionManager) {
-		InitContext context = new InitContext( cfg );
+		ConfigContext context = new ConfigContext( cfg );
 		Iterator<Class<?>> iter = cfg.getClassMappings();
 		DirectoryProviderFactory factory = new DirectoryProviderFactory();
 
@@ -539,7 +539,7 @@
 		factory.startDirectoryProviders();
 	}
 
-	private void initProgrammaticAnalyzers(InitContext context, ReflectionManager reflectionManager) {
+	private void initProgrammaticAnalyzers(ConfigContext context, ReflectionManager reflectionManager) {
 		final Map defaults = reflectionManager.getDefaults();
 
 		if (defaults != null) {
@@ -578,24 +578,16 @@
 		return filterDefinitions.get( name );
 	}
 
-	private static class DirectoryProviderData {
-		public final ReentrantLock dirLock = new ReentrantLock();
-		public OptimizerStrategy optimizerStrategy;
-		public final Set<Class<?>> classes = new HashSet<Class<?>>( 2 );
-		public Similarity similarity = null;
-		private boolean exclusiveIndexUsage;
-	}
-
 	public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
 		if ( barrier != 0 ) {
 		} //read barrier
-		return this.dirProviderData.get( dp ).dirLock;
+		return this.dirProviderData.get( dp ).getDirLock();
 	}
 
 	public void addDirectoryProvider(DirectoryProvider<?> provider, boolean exclusiveIndexUsage) {
 		//no need to set a barrier we use this method in the init thread
 		DirectoryProviderData dirConfiguration = new DirectoryProviderData();
-		dirConfiguration.exclusiveIndexUsage = exclusiveIndexUsage;
+		dirConfiguration.setExclusiveIndexUsage( exclusiveIndexUsage );
 		this.dirProviderData.put( provider, dirConfiguration );
 	}
 
@@ -627,58 +619,10 @@
 		return batchBackend;
 	}
 
-	/**
-	 * Helper class which keeps track of all super classes and interfaces of the indexed entities.
-	 */
-	private static class PolymorphicIndexHierarchy {
-		private Map<Class<?>, Set<Class<?>>> classToIndexedClass;
-
-		PolymorphicIndexHierarchy() {
-			classToIndexedClass = new HashMap<Class<?>, Set<Class<?>>>();
-		}
-
-		void addIndexedClass(Class indexedClass) {
-			addClass( indexedClass, indexedClass );
-			Class superClass = indexedClass.getSuperclass();
-			while ( superClass != null ) {
-				addClass( superClass, indexedClass );
-				superClass = superClass.getSuperclass();
-			}
-			for ( Class clazz : indexedClass.getInterfaces() ) {
-				addClass( clazz, indexedClass );
-			}
-		}
-
-		private void addClass(Class superclass, Class indexedClass) {
-			Set<Class<?>> classesSet = classToIndexedClass.get( superclass );
-			if ( classesSet == null ) {
-				classesSet = new HashSet<Class<?>>();
-				classToIndexedClass.put( superclass, classesSet );
-			}
-			classesSet.add( indexedClass );
-		}
-
-		Set<Class<?>> getIndexedClasses(Class<?>[] classes) {
-			Set<Class<?>> idexedClasses = new HashSet<Class<?>>();
-			for ( Class clazz : classes ) {
-				Set<Class<?>> set = classToIndexedClass.get( clazz );
-				if ( set != null ) {
-					// at this point we don't have to care about including indexed subclasses of a indexed class
-					// MultiClassesQueryLoader will take care of this later and optimise the queries
-					idexedClasses.addAll( set );
-				}
-			}
-			if ( log.isTraceEnabled() ) {
-				log.trace( "Targeted indexed classes for {}: {}", Arrays.toString( classes ), idexedClasses );
-			}
-			return idexedClasses;
-		}
-	}
-
 	public Similarity getSimilarity(DirectoryProvider<?> provider) {
 		if ( barrier != 0 ) {
 		} //read barrier
-		Similarity similarity = dirProviderData.get( provider ).similarity;
+		Similarity similarity = dirProviderData.get( provider ).getSimilarity();
 		if ( similarity == null ) throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
 		return similarity;
 	}
@@ -686,7 +630,7 @@
 	public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
 		if ( barrier != 0 ) {
 		} //read barrier
-		return dirProviderData.get( provider ).exclusiveIndexUsage;
+		return dirProviderData.get( provider ).isExclusiveIndexUsage();
 	}
 
 	/**
@@ -713,4 +657,7 @@
 		return errorHandler;
 	}
 
+	public SearchFactoryImplementor getUninitializedSearchFactory() {
+		return this;
+	}
 }

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/NotSharedReaderProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/NotSharedReaderProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/NotSharedReaderProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -28,10 +28,13 @@
 import java.util.Properties;
 
 import org.apache.lucene.index.IndexReader;
+
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
+
 import static org.hibernate.search.reader.ReaderProviderHelper.buildMultiReader;
 import static org.hibernate.search.reader.ReaderProviderHelper.clean;
+
 import org.hibernate.search.store.DirectoryProvider;
 
 /**
@@ -68,7 +71,7 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(Properties props, BuildContext context) {
 	}
 
 	public void destroy() {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,8 +27,9 @@
 import java.util.Properties;
 
 import org.apache.lucene.index.IndexReader;
+
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Responsible for providing and managing the lifecycle of a read only reader. The implementation must have a
@@ -55,7 +56,7 @@
 	/**
 	 * Inialize the reader provider before its use.
 	 */
-	void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);
+	void initialize(Properties props, BuildContext context);
 
 	/**
 	 * Called when a <code>SearchFactory</code> is destroyed. This method typically releases resources.

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProviderFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProviderFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/ReaderProviderFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -28,8 +28,8 @@
 import java.util.Properties;
 
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.PluginLoader;
 import org.hibernate.util.StringHelper;
 
@@ -50,7 +50,7 @@
 		return workerProperties;
 	}
 
-	public static ReaderProvider createReaderProvider(SearchConfiguration cfg, SearchFactoryImplementor searchFactoryImplementor) {
+	public static ReaderProvider createReaderProvider(SearchConfiguration cfg, BuildContext context) {
 		Properties props = getProperties( cfg );
 		String impl = props.getProperty( Environment.READER_STRATEGY );
 		ReaderProvider readerProvider;
@@ -72,7 +72,7 @@
 			readerProvider = PluginLoader.instanceFromName( ReaderProvider.class, impl,
 					ReaderProviderFactory.class, "readerProvider" );
 		}
-		readerProvider.initialize( props, searchFactoryImplementor );
+		readerProvider.initialize( props, context );
 		return readerProvider;
 	}
 }

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharedReaderProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharedReaderProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharedReaderProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -38,13 +38,14 @@
 import org.slf4j.Logger;
 
 import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
-import static org.hibernate.search.reader.ReaderProviderHelper.buildMultiReader;
-import static org.hibernate.search.reader.ReaderProviderHelper.clean;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.LoggerFactory;
 
+import static org.hibernate.search.reader.ReaderProviderHelper.buildMultiReader;
+import static org.hibernate.search.reader.ReaderProviderHelper.clean;
+
 /**
  * Share readers per <code>SearchFactory</code>, reusing them if they are still valid.
  * This class contains several bugs including HSEARCH-211. Since it is deprecated we are not going to
@@ -346,8 +347,8 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
-		Set<DirectoryProvider<?>> providers = searchFactoryImplementor.getDirectoryProviders();
+	public void initialize(Properties props, BuildContext context) {
+		Set<DirectoryProvider<?>> providers = context.getDirectoryProviders();
 		perDirectoryProviderManipulationLocks = new HashMap<DirectoryProvider, Lock>( providers.size() );
 		for ( DirectoryProvider dp : providers ) {
 			perDirectoryProviderManipulationLocks.put( dp, new ReentrantLock() );

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharingBufferReaderProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharingBufferReaderProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharingBufferReaderProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -39,8 +39,8 @@
 import org.slf4j.Logger;
 
 import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.LoggerFactory;
 
@@ -86,8 +86,8 @@
 		log.trace( "IndexReader closed." );
 	}
 
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
-		Set<DirectoryProvider<?>> providers = searchFactoryImplementor.getDirectoryProviders();
+	public void initialize(Properties props, BuildContext context) {
+		Set<DirectoryProvider<?>> providers = context.getDirectoryProviders();
 
 		// create the readers for the known providers. Unfortunately, it is not possible to
 		// create all readers in initialize since some providers have more than one directory (eg

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/BuildContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/BuildContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/BuildContext.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,38 @@
+package org.hibernate.search.spi;
+
+import java.util.Set;
+
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * Build context that can be used by some services at initialization
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface BuildContext {
+	/**
+	 * Returns the SessionFactoryImplementor instance. Do not use until after the initialize method is fully executed.
+	 * Implementations should not cache values provided by the SessionFactoryImplementor but rather access them
+	 * each time: when the configuration is dynamically updated, new changes are available through the
+	 * SearchFactoryImplementor
+	 * For example, prefer
+	 * <code>
+	 * void method() {
+	 *   int size = sfi.getDirectoryProviders().size();
+	 * }
+	 * </code>
+	 * to
+	 * <code>
+	 * void method() {
+	 *   int size = directoryProviders().size();
+	 * }
+	 * </code>
+	 * where directoryProviders is a class variable. 
+	 */
+	SearchFactoryImplementor getUninitializedSearchFactory();
+
+	String getIndexingStrategy();
+
+	Set<DirectoryProvider<?>> getDirectoryProviders();
+}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WorkerBuildContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WorkerBuildContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WorkerBuildContext.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,29 @@
+package org.hibernate.search.spi;
+
+import java.util.Set;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.lucene.search.Similarity;
+
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.optimization.OptimizerStrategy;
+
+/**
+ * Build context for the worker and other backend
+ * Available after all index, entity metadata are built.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface WorkerBuildContext extends BuildContext {
+	void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory);
+	public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider);
+	Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> provider);
+	LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> directoryProvider);
+	ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> provider);
+	Similarity getSimilarity(DirectoryProvider<?> directoryProvider);
+	boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> directoryProvider);
+	ErrorHandler getErrorHandler();
+}

Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WritableBuildContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WritableBuildContext.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/WritableBuildContext.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -0,0 +1,18 @@
+package org.hibernate.search.spi;
+
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.optimization.OptimizerStrategy;
+
+/**
+ * Build context where new built element can be registered.
+ * 
+ * @author Emmanuel Bernard
+ */
+public interface WritableBuildContext extends BuildContext {
+	void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy);
+
+	void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams);
+
+	void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage);
+}
\ No newline at end of file

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -27,9 +27,10 @@
 import java.util.Properties;
 
 import org.apache.lucene.store.Directory;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 
+import org.hibernate.search.spi.BuildContext;
 
+
 /**
  * Set up and provide a Lucene <code>Directory</code>
  * <code>equals()</code> and <code>hashCode()</code> must guaranty equality
@@ -45,7 +46,7 @@
 	/**
 	 * get the information to initialize the directory and build its hashCode/equals method
 	 */
-	void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor);
+	void initialize(String directoryProviderName, Properties properties, BuildContext context);
 
 	/**
 	 * Executed after initialize, this method set up the heavy process of starting up the DirectoryProvider

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProviderFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProviderFactory.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/DirectoryProviderFactory.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -32,13 +32,13 @@
 import org.hibernate.annotations.common.reflection.XClass;
 import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
 import org.hibernate.search.Environment;
+import org.hibernate.search.spi.WritableBuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.annotations.Indexed;
 import org.hibernate.search.backend.LuceneIndexingParameters;
 import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
 import org.hibernate.search.backend.configuration.MaskedProperty;
 import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.optimization.IncrementalOptimizerStrategy;
 import org.hibernate.search.store.optimization.NoOpOptimizerStrategy;
 import org.hibernate.search.store.optimization.OptimizerStrategy;
@@ -70,7 +70,7 @@
 	private static final String NBR_OF_SHARDS = SHARDING_STRATEGY + ".nbr_of_shards";
 
 	public DirectoryProviders createDirectoryProviders(XClass entity, SearchConfiguration cfg,
-													   SearchFactoryImplementor searchFactoryImplementor,
+													   WritableBuildContext context,
 													   ReflectionManager reflectionManager) {
 		//get properties
 		String directoryProviderName = getDirectoryProviderName( entity, cfg );
@@ -83,8 +83,10 @@
 			String providerName = nbrOfProviders > 1 ?
 					directoryProviderName + "." + index :
 					directoryProviderName;
-			providers[index] = createDirectoryProvider( providerName, indexProps[index],
-					reflectionManager.toClass( entity ), searchFactoryImplementor );
+			providers[index] = createDirectoryProvider( 
+					providerName, indexProps[index],
+					reflectionManager.toClass( entity ),
+					context );
 		}
 
 		//define sharding strategy
@@ -115,7 +117,7 @@
 	}
 
 	private DirectoryProvider<?> createDirectoryProvider(String directoryProviderName, Properties indexProps,
-														 Class<?> entity, SearchFactoryImplementor searchFactoryImplementor) {
+														 Class<?> entity, WritableBuildContext context) {
 		String className = indexProps.getProperty( "directory_provider" );
 		DirectoryProvider<?> provider;
 		if ( StringHelper.isEmpty( className ) ) {
@@ -126,7 +128,7 @@
 					DirectoryProviderFactory.class, "directory provider" );
 		}
 		try {
-			provider.initialize( directoryProviderName, indexProps, searchFactoryImplementor );
+			provider.initialize( directoryProviderName, indexProps, context );
 		}
 		catch (Exception e) {
 			throw new SearchException( "Unable to initialize directory provider: " + directoryProviderName, e );
@@ -136,30 +138,30 @@
 		if ( index != -1 ) {
 			//share the same Directory provider for the same underlying store
 			final DirectoryProvider<?> directoryProvider = providers.get( index );
-			searchFactoryImplementor.addClassToDirectoryProvider( entity, directoryProvider, exclusiveIndexUsage);
+			context.addClassToDirectoryProvider( entity, directoryProvider, exclusiveIndexUsage);
 			return directoryProvider;
 		}
 		else {
-			configureOptimizerStrategy( searchFactoryImplementor, indexProps, provider );
-			configureIndexingParameters( searchFactoryImplementor, indexProps, provider );
+			configureOptimizerStrategy( context, indexProps, provider );
+			configureIndexingParameters( context, indexProps, provider );
 			providers.add( provider );
-			searchFactoryImplementor.addClassToDirectoryProvider( entity, provider, exclusiveIndexUsage );
+			context.addClassToDirectoryProvider( entity, provider, exclusiveIndexUsage );
 			return provider;
 		}
 	}
 
-	private void configureOptimizerStrategy(SearchFactoryImplementor searchFactoryImplementor, Properties indexProps, DirectoryProvider<?> provider) {
+	private void configureOptimizerStrategy(WritableBuildContext context, Properties indexProps, DirectoryProvider<?> provider) {
 		boolean incremental = indexProps.containsKey( "optimizer.operation_limit.max" )
 				|| indexProps.containsKey( "optimizer.transaction_limit.max" );
 		OptimizerStrategy optimizerStrategy;
 		if ( incremental ) {
 			optimizerStrategy = new IncrementalOptimizerStrategy();
-			optimizerStrategy.initialize( provider, indexProps, searchFactoryImplementor );
+			optimizerStrategy.initialize( provider, indexProps, context );
 		}
 		else {
 			optimizerStrategy = new NoOpOptimizerStrategy();
 		}
-		searchFactoryImplementor.addOptimizerStrategy( provider, optimizerStrategy );
+		context.addOptimizerStrategy( provider, optimizerStrategy );
 	}
 
 	/**
@@ -178,10 +180,10 @@
 	 * @param directoryProperties	  The properties extracted from the configuration.
 	 * @param provider				 The directory provider for which to configure the indexing parameters.
 	 */
-	private void configureIndexingParameters(SearchFactoryImplementor searchFactoryImplementor,
+	private void configureIndexingParameters(WritableBuildContext context,
 											 Properties directoryProperties, DirectoryProvider<?> provider) {
 		LuceneIndexingParameters indexingParams = new LuceneIndexingParameters( directoryProperties );
-		searchFactoryImplementor.addIndexingParameters( provider, indexingParams );
+		context.addIndexingParameters( provider, indexingParams );
 	}
 
 	/**

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSDirectoryProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSDirectoryProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSDirectoryProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -31,8 +31,8 @@
 import org.apache.lucene.store.FSDirectory;
 import org.slf4j.Logger;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.LoggerFactory;
 
 /**
@@ -57,9 +57,9 @@
 	private FSDirectory directory;
 	private String indexName;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
 		// on "manual" indexing skip read-write check on index directory
-		boolean manual = searchFactoryImplementor.getIndexingStrategy().equals( "manual" );
+		boolean manual = context.getIndexingStrategy().equals( "manual" );
 		File indexDir = DirectoryProviderHelper.getVerifiedIndexDir( directoryProviderName, properties, ! manual );
 		try {
 			indexName = indexDir.getCanonicalPath();

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSMasterDirectoryProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSMasterDirectoryProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -37,6 +37,7 @@
 import org.apache.lucene.store.FSDirectory;
 import org.slf4j.Logger;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.FileHelper;
@@ -79,7 +80,7 @@
 	private Properties properties;
 	private TriggerTask task;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
 		this.properties = properties;
 		this.directoryProviderName = directoryProviderName;
 		//source guessing
@@ -95,7 +96,7 @@
 			throw new SearchException( "Unable to initialize index: " + directoryProviderName, e );
 		}
 		copyChunkSize = DirectoryProviderHelper.getCopyBufferSize( directoryProviderName, properties );
-		this.searchFactory = searchFactoryImplementor;
+		this.searchFactory = context.getUninitializedSearchFactory();
 		current = 0; //write to volatile to publish all state
 	}
 

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -37,8 +37,8 @@
 import org.slf4j.Logger;
 
 import org.hibernate.AssertionFailure;
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.FileHelper;
 import org.hibernate.search.util.LoggerFactory;
 
@@ -74,7 +74,7 @@
 	private Properties properties;
 	private TriggerTask task;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
 		this.properties = properties;
 		this.directoryProviderName = directoryProviderName;
 		//source guessing

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/RAMDirectoryProvider.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/RAMDirectoryProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/RAMDirectoryProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -31,7 +31,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.RAMDirectory;
 import org.hibernate.HibernateException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.spi.BuildContext;
 
 /**
  * Use a Lucene RAMDirectory
@@ -44,7 +44,7 @@
 	private final RAMDirectory directory = new RAMDirectory();
 	private String indexName;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
 		indexName = directoryProviderName;
 		directory.setLockFactory( DirectoryProviderHelper.createLockFactory( null, properties ) );
 	}

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/IncrementalOptimizerStrategy.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/IncrementalOptimizerStrategy.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/IncrementalOptimizerStrategy.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -30,10 +30,10 @@
 import org.apache.lucene.index.IndexWriter;
 import org.slf4j.Logger;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.backend.Workspace;
 import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.LoggerFactory;
 
@@ -52,7 +52,7 @@
 	private long transactions = 0;
 	private DirectoryProvider directoryProvider;
 
-	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, BuildContext context) {
 		this.directoryProvider = directoryProvider;
 		operationMax = ConfigurationParseHelper.getIntValue( indexProperties, "optimizer.operation_limit.max", -1 );
 		transactionMax = ConfigurationParseHelper.getIntValue( indexProperties, "optimizer.transaction_limit.max", -1 );

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/NoOpOptimizerStrategy.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/NoOpOptimizerStrategy.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/NoOpOptimizerStrategy.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -26,15 +26,15 @@
 
 import java.util.Properties;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.backend.Workspace;
 
 /**
  * @author Emmanuel Bernard
  */
 public class NoOpOptimizerStrategy implements OptimizerStrategy {
-	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, BuildContext context) {
 	}
 
 	public void optimizationForced() {

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/OptimizerStrategy.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/OptimizerStrategy.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/store/optimization/OptimizerStrategy.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -26,15 +26,15 @@
 
 import java.util.Properties;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.backend.Workspace;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 
 /**
  * @author Emmanuel Bernard
  */
 public interface OptimizerStrategy {
-	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, SearchFactoryImplementor searchFactoryImplementor);
+	public void initialize(DirectoryProvider directoryProvider, Properties indexProperties, BuildContext initContext);
 
 	/**
 	 * has to be called in a thread safe way

Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/AnalyzerTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/AnalyzerTest.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/analyzer/AnalyzerTest.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -40,7 +40,7 @@
 import org.hibernate.search.Search;
 import org.hibernate.search.SearchFactory;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.impl.InitContext;
+import org.hibernate.search.impl.ConfigContext;
 import org.hibernate.search.cfg.SearchConfigurationFromHibernateCore;
 import org.hibernate.search.engine.DocumentBuilderContainedEntity;
 import org.hibernate.search.test.SearchTestCase;
@@ -95,7 +95,7 @@
 		SearchConfigurationFromHibernateCore searchConfig = new SearchConfigurationFromHibernateCore( cfg );
 		ReflectionManager reflectionManager = searchConfig.getReflectionManager();
 		XClass xclass = reflectionManager.toXClass( BlogEntry.class );
-		InitContext context = new InitContext( searchConfig );
+		ConfigContext context = new ConfigContext( searchConfig );
 		try {
 			new DocumentBuilderContainedEntity( xclass, context, reflectionManager );
 			fail();

Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/reader/functionality/TestableSharingBufferReaderProvider.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/reader/functionality/TestableSharingBufferReaderProvider.java	2010-06-28 12:28:59 UTC (rev 19832)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/reader/functionality/TestableSharingBufferReaderProvider.java	2010-06-28 12:31:04 UTC (rev 19833)
@@ -25,13 +25,13 @@
 package org.hibernate.search.test.reader.functionality;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Vector;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -47,8 +47,8 @@
 import org.apache.lucene.index.TermVectorMapper;
 import org.apache.lucene.store.Directory;
 
+import org.hibernate.search.spi.BuildContext;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.reader.ReaderProviderHelper;
 import org.hibernate.search.reader.SharingBufferReaderProvider;
 import org.hibernate.search.store.DirectoryProvider;
@@ -111,7 +111,7 @@
 	}
 
 	@Override
-	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
+	public void initialize(Properties props, BuildContext context) {
 		try {
 			for ( Directory directory : manipulators.keySet() ) {
 				currentReaders.put( directory, new PerDirectoryLatestReader( directory ) );



More information about the hibernate-commits mailing list