[hibernate-commits] Hibernate SVN: r11631 - in trunk/HibernateExt/search/src: java/org/hibernate/search/backend and 11 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Tue Jun 5 11:48:42 EDT 2007


Author: epbernard
Date: 2007-06-05 11:48:42 -0400 (Tue, 05 Jun 2007)
New Revision: 11631

Added:
   trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
Removed:
   trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
Modified:
   trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentExtractor.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/Loader.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ObjectLoader.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ProjectionLoader.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/engine/QueryLoader.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/reader/NotSharedReaderProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProviderFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/reader/SharedReaderProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
   trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java
   trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
Log:
HSEARCH-71 fulltextSession.getSearchFactory()
HSEARCH-60 SearchFactory SearchFactoryImplementor SearchFactoryImpl

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -22,4 +22,9 @@
 	 * Indexation is batched per transaction
 	 */
 	void index(Object entity);
+
+	/**
+	 * return the SearchFactory
+	 */
+	SearchFactory getSearchFactory();
 }

Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -1,171 +0,0 @@
-//$Id$
-package org.hibernate.search;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.Worker;
-import org.hibernate.search.backend.WorkerFactory;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.reader.ReaderProvider;
-import org.hibernate.search.reader.ReaderProviderFactory;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.store.DirectoryProviderFactory;
-import org.hibernate.util.ReflectHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SearchFactory {
-	private static ThreadLocal<WeakHashMap<Configuration, SearchFactory>> contexts =
-			new ThreadLocal<WeakHashMap<Configuration, SearchFactory>>();
-	static {
-		Version.touch();
-	}
-	private Map<Class, DocumentBuilder<Object>> documentBuilders = new HashMap<Class, DocumentBuilder<Object>>();
-	//keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
-	private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders =
-			new HashMap<DirectoryProvider, ReentrantLock>();
-	private Worker worker;
-	private ReaderProvider readerProvider;
-	private BackendQueueProcessorFactory backendQueueProcessorFactory;
-
-	public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
-		return backendQueueProcessorFactory;
-	}
-
-	public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
-		this.backendQueueProcessorFactory = backendQueueProcessorFactory;
-	}
-
-	public SearchFactory(Configuration cfg) {
-		//yuk
-		ReflectionManager reflectionManager = getReflectionManager( cfg );
-
-		Class analyzerClass;
-		String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
-		if ( analyzerClassName != null ) {
-			try {
-				analyzerClass = ReflectHelper.classForName( analyzerClassName );
-			}
-			catch (Exception e) {
-				throw new SearchException(
-						"Lucene analyzer class '" + analyzerClassName + "' defined in property '" + Environment.ANALYZER_CLASS + "' could not be found.",
-						e
-				);
-			}
-		}
-		else {
-			analyzerClass = StandardAnalyzer.class;
-		}
-		// Initialize analyzer
-		Analyzer analyzer;
-		try {
-			analyzer = (Analyzer) analyzerClass.newInstance();
-		}
-		catch (ClassCastException e) {
-			throw new SearchException(
-					"Lucene analyzer does not implement " + Analyzer.class.getName() + ": " + analyzerClassName
-			);
-		}
-		catch (Exception e) {
-			throw new SearchException( "Failed to instantiate lucene analyzer with type " + analyzerClassName );
-		}
-
-		Iterator iter = cfg.getClassMappings();
-		DirectoryProviderFactory factory = new DirectoryProviderFactory();
-		while ( iter.hasNext() ) {
-			PersistentClass clazz = (PersistentClass) iter.next();
-			Class<?> mappedClass = clazz.getMappedClass();
-			if ( mappedClass != null ) {
-				XClass mappedXClass = reflectionManager.toXClass( mappedClass );
-				if ( mappedXClass != null && mappedXClass.isAnnotationPresent( Indexed.class ) ) {
-					DirectoryProvider provider = factory.createDirectoryProvider( mappedXClass, cfg, this );
-					if ( !lockableDirectoryProviders.containsKey( provider ) ) {
-						lockableDirectoryProviders.put( provider, new ReentrantLock() );
-					}
-					final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
-							mappedXClass, analyzer, provider, reflectionManager
-					);
-
-					documentBuilders.put( mappedClass, documentBuilder );
-				}
-			}
-		}
-		Set<Class> indexedClasses = documentBuilders.keySet();
-		for ( DocumentBuilder builder : documentBuilders.values() ) {
-			builder.postInitialize( indexedClasses );
-		}
-		worker = WorkerFactory.createWorker(cfg, this);
-		readerProvider = ReaderProviderFactory.createReaderProvider(cfg, this);
-	}
-
-	//code doesn't have to be multithreaded because SF creation is not.
-	//this is not a public API, should really only be used during the SessionFActory building
-	public static SearchFactory getSearchFactory(Configuration cfg) {
-		WeakHashMap<Configuration, SearchFactory> contextMap = contexts.get();
-		if (contextMap == null) {
-			contextMap = new WeakHashMap<Configuration, SearchFactory>( 2 );
-			contexts.set( contextMap );
-		}
-		SearchFactory searchFactory = contextMap.get( cfg );
-		if ( searchFactory == null) {
-			searchFactory = new SearchFactory(cfg);
-
-			contextMap.put( cfg, searchFactory );
-		}
-		return searchFactory;
-	}
-
-
-	public Map<Class, DocumentBuilder<Object>> getDocumentBuilders() {
-		return documentBuilders;
-	}
-
-	public Map<DirectoryProvider, ReentrantLock> getLockableDirectoryProviders() {
-		return lockableDirectoryProviders;
-	}
-
-	public Worker getWorker() {
-		return worker;
-	}
-
-	public ReaderProvider getReaderProvider() {
-		return readerProvider;
-	}
-
-	//not happy about having it as a helper class but I don't want cfg to be associated with the SearchFactory
-	public static ReflectionManager getReflectionManager(Configuration cfg) {
-		ReflectionManager reflectionManager;
-		try {
-			//TODO introduce a ReflectionManagerHolder interface to avoid reflection
-			//I want to avoid hard link between HAN and Validator for usch a simple need
-			//reuse the existing reflectionManager one when possible
-			reflectionManager =
-					(ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
-
-		}
-		catch (Exception e) {
-			reflectionManager = new JavaReflectionManager();
-		}
-		return reflectionManager;
-	}
-
-	public DirectoryProvider getDirectoryProvider(Class entity) {
-		DocumentBuilder<Object> documentBuilder = getDocumentBuilders().get( entity );
-		return documentBuilder == null ? null : documentBuilder.getDirectoryProvider();
-	}
-}

Added: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.search;
+
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * Provide application wide operations as well as access to the underlying Lucene resources.
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactory {
+	/**
+	 * Provide the configured readerProvider strategy,
+	 * hence access to a Lucene IndexReader
+	 */
+	ReaderProvider getReaderProvider();
+
+	/**
+	 * Provide access to the DirectoryProvider (hence the Lucene Directory)
+	 * for a given entity
+	 */
+	DirectoryProvider getDirectoryProvider(Class entity);
+}

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -10,7 +10,7 @@
  * @author Emmanuel Bernard
  */
 public class Version {
-	public static final String VERSION = "3.0.0.Beta2";
+	public static final String VERSION = "3.0.0.Beta3SNAPSHOT" + new Date();
 	private static Log log = LogFactory.getLog( Version.class );
 
 	static {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,7 +4,7 @@
 import java.util.Properties;
 import java.util.List;
 
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Build stateful backend processor
@@ -14,7 +14,7 @@
  * @author Emmanuel Bernard
  */
 public interface BackendQueueProcessorFactory {
-	void initialize(Properties props, SearchFactory searchFactory);
+	void initialize(Properties props, SearchFactoryImplementor searchFactory);
 
 	/**
 	 * Return a runnable implementation responsible for processing the queue to a given backend

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -5,7 +5,7 @@
 import java.io.Serializable;
 
 import org.hibernate.event.EventSource;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Perform work for a given session. This implementation has to be multi threaded
@@ -14,5 +14,5 @@
 public interface Worker {
 	void performWork(Object entity, Serializable id, WorkType workType, EventSource session);
 
-	void initialize(Properties props, SearchFactory searchFactory);
+	void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -7,7 +7,7 @@
 import org.hibernate.cfg.Configuration;
 import org.hibernate.search.Environment;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.backend.impl.TransactionalWorker;
 import org.hibernate.util.ReflectHelper;
 import org.hibernate.util.StringHelper;
@@ -30,7 +30,7 @@
 		return workerProperties;
 	}
 
-	public static Worker createWorker(Configuration cfg, SearchFactory searchFactory) {
+	public static Worker createWorker(Configuration cfg, SearchFactoryImplementor searchFactoryImplementor) {
 		Properties props = getProperties( cfg );
 		String impl = props.getProperty( Environment.WORKER_SCOPE );
 		Worker worker;
@@ -55,7 +55,7 @@
 				throw new SearchException("Unable to instanciate worker class: " + impl, e );
 			}
 		}
-		worker.initialize( props, searchFactory );
+		worker.initialize( props, searchFactoryImplementor );
 		return worker;
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -13,7 +13,7 @@
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.SearchException;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.annotations.common.AssertionFailure;
@@ -35,20 +35,20 @@
 	private Map<DirectoryProvider, IndexReader> readers = new HashMap<DirectoryProvider, IndexReader>();
 	private Map<DirectoryProvider, IndexWriter> writers = new HashMap<DirectoryProvider, IndexWriter>();
 	private List<DirectoryProvider> lockedProviders = new ArrayList<DirectoryProvider>();
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 
-	public Workspace(SearchFactory searchFactory) {
-		this.searchFactory = searchFactory;
+	public Workspace(SearchFactoryImplementor searchFactoryImplementor) {
+		this.searchFactoryImplementor = searchFactoryImplementor;
 	}
 
 
 	public DocumentBuilder getDocumentBuilder(Class entity) {
-		return searchFactory.getDocumentBuilders().get( entity );
+		return searchFactoryImplementor.getDocumentBuilders().get( entity );
 	}
 
 	public IndexReader getIndexReader(Class entity) {
 		//TODO NPEs
-		DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
+		DirectoryProvider provider = searchFactoryImplementor.getDirectoryProvider( entity );
 		//one cannot access a reader for update after a writer has been accessed
 		if ( writers.containsKey( provider ) )
 			throw new AssertionFailure("Tries to read for update a index while a writer is accessed" + entity);
@@ -66,7 +66,7 @@
 	}
 
 	public IndexWriter getIndexWriter(Class entity) {
-		DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
+		DirectoryProvider provider = searchFactoryImplementor.getDirectoryProvider( entity );
 		//one has to close a reader for update before a writer is accessed
 		IndexReader reader = readers.get( provider );
 		if ( reader != null ) {
@@ -83,7 +83,7 @@
 		lockProvider( provider );
 		try {
 			writer = new IndexWriter(
-					provider.getDirectory(), searchFactory.getDocumentBuilders().get( entity ).getAnalyzer(), false
+					provider.getDirectory(), searchFactoryImplementor.getDocumentBuilders().get( entity ).getAnalyzer(), false
 			); //have been created at init time
 			writers.put( provider, writer );
 		}
@@ -95,7 +95,7 @@
 
 	private void lockProvider(DirectoryProvider provider) {
 		//make sure to use a semaphore
-		ReentrantLock lock = searchFactory.getLockableDirectoryProviders().get( provider );
+		ReentrantLock lock = searchFactoryImplementor.getLockableDirectoryProviders().get( provider );
 		//of course a given thread cannot have a race cond with itself
 		if ( !lock.isHeldByCurrentThread() ) {
 			lock.lock();
@@ -133,7 +133,7 @@
 			}
 		}
 		for ( DirectoryProvider provider : lockedProviders ) {
-			searchFactory.getLockableDirectoryProviders().get( provider ).unlock();
+			searchFactoryImplementor.getLockableDirectoryProviders().get( provider ).unlock();
 		}
 		readers.clear();
 		writers.clear();

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -15,7 +15,6 @@
 import org.hibernate.annotations.common.util.ReflectHelper;
 import org.hibernate.search.Environment;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.QueueingProcessor;
@@ -25,6 +24,7 @@
 import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
 import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
 import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Batch work until #performWorks is called.
@@ -36,11 +36,11 @@
 	private boolean sync;
 	private ExecutorService executorService;
 	private BackendQueueProcessorFactory backendQueueProcessorFactory;
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 
-	public BatchedQueueingProcessor(SearchFactory searchFactory,
+	public BatchedQueueingProcessor(SearchFactoryImplementor searchFactoryImplementor,
 									Properties properties) {
-		this.searchFactory = searchFactory;
+		this.searchFactoryImplementor = searchFactoryImplementor;
 		//default to sync if none defined
 		this.sync = !"async".equalsIgnoreCase( properties.getProperty( Environment.WORKER_EXECUTION ) );
 
@@ -88,8 +88,8 @@
 				throw new SearchException( "Unable to instanciate processor class: " + backend, e );
 			}
 		}
-		backendQueueProcessorFactory.initialize( properties, searchFactory );
-		searchFactory.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
+		backendQueueProcessorFactory.initialize( properties, searchFactoryImplementor );
+		searchFactoryImplementor.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
 	}
 
 	public void add(Object entity, Serializable id, WorkType workType, WorkQueue workQueue) {
@@ -107,9 +107,9 @@
 			Work work = queue.get( i );
 			queue.set( i, null ); // help GC and avoid 2 loaded queues in memory
 			Class entityClass = Hibernate.getClass( work.getEntity() );
-			DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entityClass );
+			DocumentBuilder<Object> builder = searchFactoryImplementor.getDocumentBuilders().get( entityClass );
 			if ( builder == null ) return; //or exception?
-			builder.addWorkToQueue(work.getEntity(), work.getId(), work.getType(), luceneQueue, searchFactory);
+			builder.addWorkToQueue(work.getEntity(), work.getId(), work.getType(), luceneQueue, searchFactoryImplementor );
 		}
 		workQueue.setSealedQueue( luceneQueue );
 	}

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -2,18 +2,15 @@
 package org.hibernate.search.backend.impl;
 
 import java.util.Properties;
-import java.util.List;
-import java.util.ArrayList;
 import java.io.Serializable;
 
 import org.hibernate.search.backend.Worker;
 import org.hibernate.search.backend.QueueingProcessor;
 import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.backend.Work;
 import org.hibernate.search.backend.WorkQueue;
 import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
 import org.hibernate.search.util.WeakIdentityHashMap;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.event.EventSource;
 import org.hibernate.Transaction;
 
@@ -51,7 +48,7 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactory searchFactory) {
+	public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
 		this.queueingProcessor = new BatchedQueueingProcessor( searchFactory, props );
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -12,9 +12,9 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.Session;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.util.ContextHelper;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Implement the Hibernate Search controller responsible for processing the
@@ -88,7 +88,7 @@
 		Runnable processor = null;
 
 		try {
-			SearchFactory factory = ContextHelper.getSearchFactory( session );
+			SearchFactoryImplementor factory = ContextHelper.getSearchFactory( session );
 			processor = factory.getBackendQueueProcessorFactory().getProcessor( queue );
 		}
 		finally {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -13,7 +13,7 @@
 
 import org.hibernate.search.Environment;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
 
@@ -30,7 +30,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, SearchFactory searchFactory) {
+	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
 		//TODO proper exception if jms queues and connecitons are not there
 		this.properties = props;
 		this.jmsConnectionFactoryName = props.getProperty( JMS_CONNECTION_FACTORY );

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -5,10 +5,10 @@
 import java.util.Comparator;
 import java.util.List;
 
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.backend.AddLuceneWork;
 import org.hibernate.search.backend.LuceneWork;
 import org.hibernate.search.backend.Workspace;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Apply the operations to Lucene directories
@@ -18,17 +18,17 @@
  */
 public class LuceneBackendQueueProcessor implements Runnable {
 	private List<LuceneWork> queue;
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 
-	public LuceneBackendQueueProcessor(List<LuceneWork> queue, SearchFactory searchFactory) {
+	public LuceneBackendQueueProcessor(List<LuceneWork> queue, SearchFactoryImplementor searchFactoryImplementor) {
 		this.queue = queue;
-		this.searchFactory = searchFactory;
+		this.searchFactoryImplementor = searchFactoryImplementor;
 	}
 
 	public void run() {
 		Workspace workspace;
 		LuceneWorker worker;
-		workspace = new Workspace( searchFactory );
+		workspace = new Workspace( searchFactoryImplementor );
 		worker = new LuceneWorker( workspace );
 		try {
 			deadlockFreeQueue(queue, workspace);

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,21 +4,21 @@
 import java.util.Properties;
 import java.util.List;
 
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.backend.BackendQueueProcessorFactory;
 import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * @author Emmanuel Bernard
  */
 public class LuceneBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 
-	public void initialize(Properties props, SearchFactory searchFactory) {
-		this.searchFactory = searchFactory;
+	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
+		this.searchFactoryImplementor = searchFactoryImplementor;
 	}
 
 	public Runnable getProcessor(List<LuceneWork> queue) {
-		return new LuceneBackendQueueProcessor( queue, searchFactory );
+		return new LuceneBackendQueueProcessor( queue, searchFactoryImplementor );
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -10,7 +10,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Arrays;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -28,7 +27,6 @@
 import org.hibernate.annotations.common.reflection.XProperty;
 import org.hibernate.annotations.common.util.ReflectHelper;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.annotations.Boost;
 import org.hibernate.search.annotations.ContainedIn;
 import org.hibernate.search.annotations.DocumentId;
@@ -311,7 +309,7 @@
 		return value;
 	}
 
-	public void addWorkToQueue(T entity, Serializable id, WorkType workType, List<LuceneWork> queue, SearchFactory searchFactory) {
+	public void addWorkToQueue(T entity, Serializable id, WorkType workType, List<LuceneWork> queue, SearchFactoryImplementor searchFactoryImplementor) {
 		Class entityClass = Hibernate.getClass( entity );
 		//TODO with the caller loop we are in a n^2: optimize it using a HashMap for work recognition 
 		for ( LuceneWork luceneWork : queue) {
@@ -354,11 +352,11 @@
 		 * When the internal object is changed, we apply the {Add|Update}Work on containedIns
 		 */
 		if (searchForContainers) {
-			processContainedIn(entity, queue, rootPropertiesMetadata, searchFactory);
+			processContainedIn(entity, queue, rootPropertiesMetadata, searchFactoryImplementor);
 		}
 	}
 
-	private void processContainedIn(Object instance, List<LuceneWork> queue, PropertiesMetadata metadata, SearchFactory searchFactory) {
+	private void processContainedIn(Object instance, List<LuceneWork> queue, PropertiesMetadata metadata, SearchFactoryImplementor searchFactoryImplementor) {
 		for ( int i = 0; i < metadata.containedInGetters.size(); i++ ) {
 			XMember member = metadata.containedInGetters.get( i );
 			Object value = getMemberValue( instance, member );
@@ -368,9 +366,9 @@
 				for ( Object arrayValue : (Object[]) value ) {
 					//highly inneficient but safe wrt the actual targeted class
 					Class valueClass = Hibernate.getClass( arrayValue );
-					DocumentBuilder builder = searchFactory.getDocumentBuilders().get( valueClass );
+					DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( valueClass );
 					if (builder == null) continue;
-					processContainedInValue( arrayValue, queue, valueClass, builder, searchFactory );
+					processContainedInValue( arrayValue, queue, valueClass, builder, searchFactoryImplementor );
 				}
 			}
 			else if ( member.isCollection() ) {
@@ -385,16 +383,16 @@
 				for ( Object collectionValue : collection ) {
 					//highly inneficient but safe wrt the actual targeted class
 					Class valueClass = Hibernate.getClass( collectionValue );
-					DocumentBuilder builder = searchFactory.getDocumentBuilders().get( valueClass );
+					DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( valueClass );
 					if (builder == null) continue;
-					processContainedInValue( collectionValue, queue, valueClass, builder, searchFactory );
+					processContainedInValue( collectionValue, queue, valueClass, builder, searchFactoryImplementor );
 				}
 			}
 			else {
 				Class valueClass = Hibernate.getClass( value );
-				DocumentBuilder builder = searchFactory.getDocumentBuilders().get( valueClass );
+				DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( valueClass );
 				if (builder == null) continue;
-				processContainedInValue( value, queue, valueClass, builder, searchFactory );
+				processContainedInValue( value, queue, valueClass, builder, searchFactoryImplementor );
 			}
 		}
 		//an embedded cannot have a useful @ContainedIn (no shared reference)
@@ -402,9 +400,9 @@
 	}
 
 	private void processContainedInValue(Object value, List<LuceneWork> queue, Class valueClass,
-										 DocumentBuilder builder, SearchFactory searchFactory) {
+										 DocumentBuilder builder, SearchFactoryImplementor searchFactoryImplementor) {
 		Serializable id = (Serializable) builder.getMemberValue( value, builder.idGetter );
-		builder.addWorkToQueue( value, id, WorkType.UPDATE, queue, searchFactory );
+		builder.addWorkToQueue( value, id, WorkType.UPDATE, queue, searchFactoryImplementor );
 	}
 
 	public Document getDocument(T instance, Serializable id) {
@@ -537,14 +535,14 @@
 		}
 	}
 
-	public static Serializable getDocumentId(SearchFactory searchFactory, Class clazz, Document document) {
-		DocumentBuilder builder = searchFactory.getDocumentBuilders().get( clazz );
+	public static Serializable getDocumentId(SearchFactoryImplementor searchFactoryImplementor, Class clazz, Document document) {
+		DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( clazz );
 		if ( builder == null ) throw new SearchException( "No Lucene configuration set up for: " + clazz.getName() );
 		return (Serializable) builder.getIdBridge().get( builder.getIdKeywordName(), document );
 	}
 
-	public static Object[] getDocumentFields(SearchFactory searchFactory, Class clazz, Document document, String[] fields) {
-		DocumentBuilder builder = searchFactory.getDocumentBuilders().get( clazz );
+	public static Object[] getDocumentFields(SearchFactoryImplementor searchFactoryImplementor, Class clazz, Document document, String[] fields) {
+		DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( clazz );
 		if ( builder == null ) throw new SearchException( "No Lucene configuration set up for: " + clazz.getName() );
 		final int fieldNbr = fields.length;
 		Object[] result = new Object[fieldNbr];

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentExtractor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentExtractor.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentExtractor.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -2,27 +2,26 @@
 package org.hibernate.search.engine;
 
 import org.apache.lucene.document.Document;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.EntityInfo;
 
 /**
  * @author Emmanuel Bernard
  */
 public class DocumentExtractor {
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 	private String[] projection;
 
-	public DocumentExtractor(SearchFactory searchFactory, String... projection) {
-		this.searchFactory = searchFactory;
+	public DocumentExtractor(SearchFactoryImplementor searchFactoryImplementor, String... projection) {
+		this.searchFactoryImplementor = searchFactoryImplementor;
 		this.projection = projection;
 	}
 
 	public EntityInfo extract(Document document) {
 		EntityInfo entityInfo = new EntityInfo();
 		entityInfo.clazz = DocumentBuilder.getDocumentClass( document );
-		entityInfo.id = DocumentBuilder.getDocumentId( searchFactory, entityInfo.clazz, document );
+		entityInfo.id = DocumentBuilder.getDocumentId( searchFactoryImplementor, entityInfo.clazz, document );
 		if (projection != null && projection.length > 0) {
-			entityInfo.projection = DocumentBuilder.getDocumentFields( searchFactory, entityInfo.clazz, document, projection );
+			entityInfo.projection = DocumentBuilder.getDocumentFields( searchFactoryImplementor, entityInfo.clazz, document, projection );
 		}
 		//TODO read fields
 		return entityInfo;

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/Loader.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/Loader.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/Loader.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,14 +4,13 @@
 import java.util.List;
 
 import org.hibernate.Session;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.EntityInfo;
 
 /**
  * @author Emmanuel Bernard
  */
 public interface Loader {
-	void init(Session session, SearchFactory searchFactory);
+	void init(Session session, SearchFactoryImplementor searchFactoryImplementor);
 	Object load(EntityInfo entityInfo);
 	List load(EntityInfo... entityInfos);
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ObjectLoader.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ObjectLoader.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ObjectLoader.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -9,7 +9,6 @@
 import org.hibernate.Hibernate;
 import org.hibernate.ObjectNotFoundException;
 import org.hibernate.Session;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.EntityInfo;
 
 /**
@@ -19,7 +18,7 @@
 	private static final Log log = LogFactory.getLog( ObjectLoader.class );
 	private Session session;
 
-	public void init(Session session, SearchFactory searchFactory) {
+	public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
 		this.session = session;
 	}
 

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ProjectionLoader.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ProjectionLoader.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/ProjectionLoader.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -5,14 +5,13 @@
 import java.util.List;
 
 import org.hibernate.Session;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.EntityInfo;
 
 /**
  * @author Emmanuel Bernard
  */
 public class ProjectionLoader implements Loader {
-	public void init(Session session, SearchFactory searchFactory) {
+	public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
 	}
 
 	public Object load(EntityInfo entityInfo) {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/QueryLoader.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/QueryLoader.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/QueryLoader.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,15 +4,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.hibernate.Criteria;
 import org.hibernate.Session;
 import org.hibernate.Hibernate;
 import org.hibernate.annotations.common.AssertionFailure;
 import org.hibernate.criterion.Disjunction;
 import org.hibernate.criterion.Restrictions;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.engine.EntityInfo;
 
 /**
@@ -24,12 +21,12 @@
 
 	private Session session;
 	private Class entityType;
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 	private Criteria criteria;
 
-	public void init(Session session, SearchFactory searchFactory) {
+	public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
 		this.session = session;
-		this.searchFactory = searchFactory;
+		this.searchFactoryImplementor = searchFactoryImplementor;
 	}
 
 	public void setEntityType(Class entityType) {
@@ -48,7 +45,7 @@
 		if (entityType == null) throw new AssertionFailure("EntityType not defined");
 		if (criteria == null) criteria = session.createCriteria( entityType );
 
-		DocumentBuilder builder = searchFactory.getDocumentBuilders().get( entityType );
+		DocumentBuilder builder = searchFactoryImplementor.getDocumentBuilders().get( entityType );
 		String idName = builder.getIdentifierName();
 		int loop = maxResults / MAX_IN_CLAUSE;
 		boolean exact = maxResults % MAX_IN_CLAUSE == 0;

Added: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.search.engine;
+
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.Worker;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface SearchFactoryImplementor extends SearchFactory {
+	BackendQueueProcessorFactory getBackendQueueProcessorFactory();
+
+	void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory);
+
+	Map<Class, DocumentBuilder<Object>> getDocumentBuilders();
+
+	Map<DirectoryProvider, ReentrantLock> getLockableDirectoryProviders();
+
+	Worker getWorker();
+}

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -16,7 +16,8 @@
 import org.hibernate.event.PostUpdateEventListener;
 import org.hibernate.search.backend.WorkType;
 import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.impl.SearchFactoryImpl;
 
 /**
  * This listener supports setting a parent directory for all generated index files.
@@ -34,19 +35,19 @@
 	private static final Log log = LogFactory.getLog( FullTextIndexEventListener.class );
 	private boolean used;
 
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactoryImplementor;
 
 	public void initialize(Configuration cfg) {
-		searchFactory = SearchFactory.getSearchFactory( cfg );
-		used = searchFactory.getDocumentBuilders().size() != 0;
+		searchFactoryImplementor = SearchFactoryImpl.getSearchFactory( cfg );
+		used = searchFactoryImplementor.getDocumentBuilders().size() != 0;
 	}
 
-	public SearchFactory getSearchFactory() {
-		return searchFactory;
+	public SearchFactoryImplementor getSearchFactoryImplementor() {
+		return searchFactoryImplementor;
 	}
 
 	public void onPostDelete(PostDeleteEvent event) {
-		if ( used && searchFactory.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
+		if ( used && searchFactoryImplementor.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
 			processWork( event.getEntity(), event.getId(), WorkType.DELETE, event );
 		}
 	}
@@ -54,7 +55,7 @@
 	public void onPostInsert(PostInsertEvent event) {
 		if (used) {
 			final Object entity = event.getEntity();
-			DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+			DocumentBuilder<Object> builder = searchFactoryImplementor.getDocumentBuilders().get( entity.getClass() );
 			//not strictly necessary but a smal optimization
 			if ( builder != null ) {
 				Serializable id = event.getId();
@@ -67,7 +68,7 @@
 		if (used) {
 			final Object entity = event.getEntity();
 			//not strictly necessary but a smal optimization
-			DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+			DocumentBuilder<Object> builder = searchFactoryImplementor.getDocumentBuilders().get( entity.getClass() );
 			if ( builder != null ) {
 				Serializable id = event.getId();
 				processWork( entity, id, WorkType.UPDATE, event );
@@ -76,6 +77,6 @@
 	}
 
 	private void processWork(Object entity, Serializable id, WorkType workType, AbstractEvent event) {
-		searchFactory.getWorker().performWork( entity, id, workType, event.getSession() );
+		searchFactoryImplementor.getWorker().performWork( entity, id, workType, event.getSession() );
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -41,10 +41,11 @@
 import org.hibernate.loader.custom.CustomQuery;
 import org.hibernate.persister.entity.EntityPersister;
 import org.hibernate.search.FullTextSession;
+import org.hibernate.search.FullTextQuery;
 import org.hibernate.search.SearchFactory;
-import org.hibernate.search.FullTextQuery;
 import org.hibernate.search.backend.WorkType;
 import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.query.FullTextQueryImpl;
 import org.hibernate.search.util.ContextHelper;
 import org.hibernate.stat.SessionStatistics;
@@ -59,6 +60,7 @@
 	private final Session session;
 	private final EventSource eventSource;
 	private final SessionImplementor sessionImplementor;
+	private SearchFactoryImplementor searchFactory;
 
 	public FullTextSessionImpl(org.hibernate.Session session) {
 		this.session = (Session) session;
@@ -87,12 +89,12 @@
 		if (entity == null) return;
 		Class clazz = Hibernate.getClass( entity );
 		//TODO cache that at the FTSession level
-		SearchFactory searchFactory = ContextHelper.getSearchFactory( session );
+		SearchFactoryImplementor searchFactoryImplementor = ContextHelper.getSearchFactory( session );
 		//not strictly necessary but a small optimization
-		DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( clazz );
+		DocumentBuilder<Object> builder = searchFactoryImplementor.getDocumentBuilders().get( clazz );
 		if ( builder != null ) {
 			Serializable id = session.getIdentifier( entity );
-			searchFactory.getWorker().performWork( entity, id, WorkType.UPDATE, eventSource );
+			searchFactoryImplementor.getWorker().performWork( entity, id, WorkType.UPDATE, eventSource );
 		}
 		//TODO
 		//need to add elements in a queue kept at the Session level
@@ -103,6 +105,13 @@
 		// this is an open discussion
 	}
 
+	public SearchFactory getSearchFactory() {
+		if (searchFactory == null) {
+			searchFactory = ContextHelper.getSearchFactory( session );
+		}
+		return searchFactory;
+	}
+
 	public Query createSQLQuery(String sql, String returnAlias, Class returnClass) {
 		return session.createSQLQuery( sql, returnAlias, returnClass );
 	}

Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/SearchFactoryImpl.java (from rev 11625, trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	                        (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/impl/SearchFactoryImpl.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -0,0 +1,177 @@
+//$Id$
+package org.hibernate.search.impl;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.backend.WorkerFactory;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.reader.ReaderProviderFactory;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.DirectoryProviderFactory;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.Version;
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SearchFactoryImpl implements SearchFactoryImplementor {
+	private static ThreadLocal<WeakHashMap<Configuration, SearchFactoryImpl>> contexts =
+			new ThreadLocal<WeakHashMap<Configuration, SearchFactoryImpl>>();
+	static {
+		Version.touch();
+	}
+	private Map<Class, DocumentBuilder<Object>> documentBuilders = new HashMap<Class, DocumentBuilder<Object>>();
+	//keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
+	private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders =
+			new HashMap<DirectoryProvider, ReentrantLock>();
+	private Worker worker;
+	private ReaderProvider readerProvider;
+	private BackendQueueProcessorFactory backendQueueProcessorFactory;
+
+	public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
+		return backendQueueProcessorFactory;
+	}
+
+	public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+		this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+	}
+
+	public SearchFactoryImpl(Configuration cfg) {
+		//yuk
+		ReflectionManager reflectionManager = getReflectionManager( cfg );
+
+		Class analyzerClass;
+		String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
+		if ( analyzerClassName != null ) {
+			try {
+				analyzerClass = ReflectHelper.classForName( analyzerClassName );
+			}
+			catch (Exception e) {
+				throw new SearchException(
+						"Lucene analyzer class '" + analyzerClassName + "' defined in property '" + Environment.ANALYZER_CLASS + "' could not be found.",
+						e
+				);
+			}
+		}
+		else {
+			analyzerClass = StandardAnalyzer.class;
+		}
+		// Initialize analyzer
+		Analyzer analyzer;
+		try {
+			analyzer = (Analyzer) analyzerClass.newInstance();
+		}
+		catch (ClassCastException e) {
+			throw new SearchException(
+					"Lucene analyzer does not implement " + Analyzer.class.getName() + ": " + analyzerClassName
+			);
+		}
+		catch (Exception e) {
+			throw new SearchException( "Failed to instantiate lucene analyzer with type " + analyzerClassName );
+		}
+
+		Iterator iter = cfg.getClassMappings();
+		DirectoryProviderFactory factory = new DirectoryProviderFactory();
+		while ( iter.hasNext() ) {
+			PersistentClass clazz = (PersistentClass) iter.next();
+			Class<?> mappedClass = clazz.getMappedClass();
+			if ( mappedClass != null ) {
+				XClass mappedXClass = reflectionManager.toXClass( mappedClass );
+				if ( mappedXClass != null && mappedXClass.isAnnotationPresent( Indexed.class ) ) {
+					DirectoryProvider provider = factory.createDirectoryProvider( mappedXClass, cfg, this );
+					if ( !lockableDirectoryProviders.containsKey( provider ) ) {
+						lockableDirectoryProviders.put( provider, new ReentrantLock() );
+					}
+					final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
+							mappedXClass, analyzer, provider, reflectionManager
+					);
+
+					documentBuilders.put( mappedClass, documentBuilder );
+				}
+			}
+		}
+		Set<Class> indexedClasses = documentBuilders.keySet();
+		for ( DocumentBuilder builder : documentBuilders.values() ) {
+			builder.postInitialize( indexedClasses );
+		}
+		worker = WorkerFactory.createWorker(cfg, this);
+		readerProvider = ReaderProviderFactory.createReaderProvider(cfg, this);
+	}
+
+	//code doesn't have to be multithreaded because SF creation is not.
+	//this is not a public API, should really only be used during the SessionFActory building
+	//FIXME this is ugly, impl.staticmethod, fix that
+	public static SearchFactoryImpl getSearchFactory(Configuration cfg) {
+		WeakHashMap<Configuration, SearchFactoryImpl> contextMap = contexts.get();
+		if (contextMap == null) {
+			contextMap = new WeakHashMap<Configuration, SearchFactoryImpl>( 2 );
+			contexts.set( contextMap );
+		}
+		SearchFactoryImpl searchFactory = contextMap.get( cfg );
+		if ( searchFactory == null) {
+			searchFactory = new SearchFactoryImpl(cfg);
+
+			contextMap.put( cfg, searchFactory );
+		}
+		return searchFactory;
+	}
+
+
+	public Map<Class, DocumentBuilder<Object>> getDocumentBuilders() {
+		return documentBuilders;
+	}
+
+	public Map<DirectoryProvider, ReentrantLock> getLockableDirectoryProviders() {
+		return lockableDirectoryProviders;
+	}
+
+	public Worker getWorker() {
+		return worker;
+	}
+
+	public ReaderProvider getReaderProvider() {
+		return readerProvider;
+	}
+
+	//not happy about having it as a helper class but I don't want cfg to be associated with the SearchFactory
+	public static ReflectionManager getReflectionManager(Configuration cfg) {
+		ReflectionManager reflectionManager;
+		try {
+			//TODO introduce a ReflectionManagerHolder interface to avoid reflection
+			//I want to avoid hard link between HAN and Validator for usch a simple need
+			//reuse the existing reflectionManager one when possible
+			reflectionManager =
+					(ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
+
+		}
+		catch (Exception e) {
+			reflectionManager = new JavaReflectionManager();
+		}
+		return reflectionManager;
+	}
+
+	public DirectoryProvider getDirectoryProvider(Class entity) {
+		DocumentBuilder<Object> documentBuilder = getDocumentBuilders().get( entity );
+		return documentBuilder == null ? null : documentBuilder.getDirectoryProvider();
+	}
+}


Property changes on: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -35,7 +35,7 @@
 import org.hibernate.impl.CriteriaImpl;
 import org.hibernate.search.FullTextQuery;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.impl.SearchFactoryImpl;
 import org.hibernate.search.engine.DocumentBuilder;
 import org.hibernate.search.engine.DocumentExtractor;
 import org.hibernate.search.engine.EntityInfo;
@@ -43,6 +43,7 @@
 import org.hibernate.search.engine.ObjectLoader;
 import org.hibernate.search.engine.ProjectionLoader;
 import org.hibernate.search.engine.QueryLoader;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.store.DirectoryProvider;
 import org.hibernate.search.util.ContextHelper;
 
@@ -92,9 +93,9 @@
 		//user stop using it
 		//scrollable is better in this area
 
-		SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+		SearchFactoryImplementor searchFactoryImplementor = ContextHelper.getSearchFactoryBySFI( session );
 		//find the directories
-		IndexSearcher searcher = buildSearcher( searchFactory );
+		IndexSearcher searcher = buildSearcher( searchFactoryImplementor );
 		if ( searcher == null ) {
 		   	return new IteratorImpl( new ArrayList<EntityInfo>(0), noLoader );
 		}
@@ -105,13 +106,13 @@
 			Session sess = (Session) this.session;
 
 			List<EntityInfo> entityInfos = new ArrayList<EntityInfo>( max - first + 1 );
-			DocumentExtractor extractor = new DocumentExtractor( searchFactory, indexProjection );
+			DocumentExtractor extractor = new DocumentExtractor( searchFactoryImplementor, indexProjection );
 			for ( int index = first; index <= max; index++ ) {
 				//TODO use indexSearcher.getIndexReader().document( hits.id(index), FieldSelector(indexProjection) );
 				Document document = hits.doc( index );
 				entityInfos.add( extractor.extract( document ) );
 			}
-			Loader loader = getLoader(sess, searchFactory);
+			Loader loader = getLoader(sess, searchFactoryImplementor);
 			return new IteratorImpl( entityInfos, loader );
 		}
 		catch (IOException e) {
@@ -119,7 +120,7 @@
 		}
 		finally {
 			try {
-				searchFactory.getReaderProvider().closeReader( searcher.getIndexReader() );
+				searchFactoryImplementor.getReaderProvider().closeReader( searcher.getIndexReader() );
 			}
 			catch( SearchException e ) {
 				log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
@@ -127,10 +128,10 @@
 		}
 	}
 
-	private Loader getLoader(Session session, SearchFactory searchFactory) {
+	private Loader getLoader(Session session, SearchFactoryImplementor searchFactoryImplementor) {
 		if ( indexProjection != null) {
 			ProjectionLoader loader = new ProjectionLoader();
-			loader.init( session, searchFactory );
+			loader.init( session, searchFactoryImplementor );
 			return loader;
 		}
 		if (criteria != null) {
@@ -151,27 +152,27 @@
 				}
 			}
 			QueryLoader loader = new QueryLoader();
-			loader.init( session, searchFactory );
+			loader.init( session, searchFactoryImplementor );
 			loader.setEntityType( classes[0] );
 			loader.setCriteria(criteria);
 			return loader;
 		}
 		else if (classes.length == 1) {
 			QueryLoader loader = new QueryLoader();
-			loader.init( session, searchFactory );
+			loader.init( session, searchFactoryImplementor );
 			loader.setEntityType( classes[0] );
 			return loader;
 		}
 		else {
 			final ObjectLoader objectLoader = new ObjectLoader();
-			objectLoader.init( session, searchFactory );
+			objectLoader.init( session, searchFactoryImplementor );
 			return objectLoader;
 		}
 	}
 
 	public ScrollableResults scroll() throws HibernateException {
 		//keep the searcher open until the resultset is closed
-		SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+		SearchFactoryImplementor searchFactory = ContextHelper.getSearchFactoryBySFI( session );
 
 		//find the directories
 		IndexSearcher searcher = buildSearcher( searchFactory );
@@ -203,9 +204,9 @@
 	}
 
 	public List list() throws HibernateException {
-		SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+		SearchFactoryImplementor searchFactoryImplementor = ContextHelper.getSearchFactoryBySFI( session );
 		//find the directories
-		IndexSearcher searcher = buildSearcher( searchFactory );
+		IndexSearcher searcher = buildSearcher( searchFactoryImplementor );
 		if (searcher == null) return new ArrayList(0);
 		Hits hits;
 		try {
@@ -214,12 +215,12 @@
 			int max = max( first, hits );
 			Session sess = (Session) this.session;
 			List<EntityInfo> infos = new ArrayList<EntityInfo>( max - first + 1 );
-			DocumentExtractor extractor = new DocumentExtractor( searchFactory, indexProjection );
+			DocumentExtractor extractor = new DocumentExtractor( searchFactoryImplementor, indexProjection );
 			for ( int index = first; index <= max; index++ ) {
 				Document document = hits.doc( index );
 				infos.add( extractor.extract( document ) );
 			}
-			Loader loader = getLoader( sess, searchFactory );
+			Loader loader = getLoader( sess, searchFactoryImplementor );
 			return loader.load( infos.toArray( new EntityInfo[infos.size()]) );
 		}
 		catch (IOException e) {
@@ -227,7 +228,7 @@
 		}
 		finally {
 			try {
-				searchFactory.getReaderProvider().closeReader( searcher.getIndexReader() );
+				searchFactoryImplementor.getReaderProvider().closeReader( searcher.getIndexReader() );
 			}
 			catch (SearchException e) {
 				log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
@@ -296,8 +297,8 @@
 	 * can return null
 	 * TODO change classesAndSubclasses by side effect, which is a mismatch with the Searcher return, fix that.
 	 */
-	private IndexSearcher buildSearcher(SearchFactory searchFactory) {
-		Map<Class, DocumentBuilder<Object>> builders = searchFactory.getDocumentBuilders();
+	private IndexSearcher buildSearcher(SearchFactoryImplementor searchFactoryImplementor) {
+		Map<Class, DocumentBuilder<Object>> builders = searchFactoryImplementor.getDocumentBuilders();
 		List<DirectoryProvider> directories = new ArrayList<DirectoryProvider>();
 		if ( classes == null || classes.length == 0 ) {
 			//no class means all classes
@@ -330,7 +331,7 @@
 
 		//set up the searcher
 		final DirectoryProvider[] directoryProviders = directories.toArray( new DirectoryProvider[directories.size()] );
-		return new IndexSearcher( searchFactory.getReaderProvider().openReader( directoryProviders ) );
+		return new IndexSearcher( searchFactoryImplementor.getReaderProvider().openReader( directoryProviders ) );
 	}
 
 	private void setResultSize(Hits hits) {
@@ -341,8 +342,8 @@
 	public int getResultSize() {
 		if (resultSize == null) {
 			//get result size without object initialization
-			SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
-			IndexSearcher searcher = buildSearcher( searchFactory );
+			SearchFactoryImplementor searchFactoryImplementor = ContextHelper.getSearchFactoryBySFI( session );
+			IndexSearcher searcher = buildSearcher( searchFactoryImplementor );
 			if (searcher == null) {
 				resultSize = 0;
 			}
@@ -358,7 +359,7 @@
 				finally {
 					//searcher cannot be null
 					try {
-						searchFactory.getReaderProvider().closeReader( searcher.getIndexReader() );
+						searchFactoryImplementor.getReaderProvider().closeReader( searcher.getIndexReader() );
 					}
 					catch( SearchException e ) {
 						log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
@@ -407,7 +408,7 @@
 	}
 
 	private static Loader noLoader = new Loader() {
-		public void init(Session session, SearchFactory searchFactory) {
+		public void init(Session session, SearchFactoryImplementor searchFactoryImplementor) {
 		}
 
 		public Object load(EntityInfo entityInfo) {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/reader/NotSharedReaderProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/reader/NotSharedReaderProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/reader/NotSharedReaderProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -6,7 +6,7 @@
 
 import org.apache.lucene.index.IndexReader;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+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;
@@ -48,6 +48,6 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactory searchFactory) {
+	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,8 +4,8 @@
 import java.util.Properties;
 
 import org.apache.lucene.index.IndexReader;
-import org.hibernate.search.SearchFactory;
 import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Responsible for providing and managing the lifecycle of a read only reader
@@ -30,5 +30,5 @@
 	 */
 	void closeReader(IndexReader reader);
 
-	void initialize(Properties props, SearchFactory searchFactory);
+	void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProviderFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProviderFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/reader/ReaderProviderFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -7,7 +7,7 @@
 import org.hibernate.cfg.Configuration;
 import org.hibernate.search.Environment;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.util.ReflectHelper;
 import org.hibernate.util.StringHelper;
 
@@ -28,7 +28,7 @@
 		return workerProperties;
 	}
 
-	public static ReaderProvider createReaderProvider(Configuration cfg, SearchFactory searchFactory) {
+	public static ReaderProvider createReaderProvider(Configuration cfg, SearchFactoryImplementor searchFactoryImplementor) {
 		Properties props = getProperties( cfg );
 		String impl = props.getProperty( Environment.READER_STRATEGY );
 		ReaderProvider readerProvider;
@@ -57,7 +57,7 @@
 				throw new SearchException( "Unable to instanciate readerProvider class: " + impl, e );
 			}
 		}
-		readerProvider.initialize( props, searchFactory );
+		readerProvider.initialize( props, searchFactoryImplementor );
 		return readerProvider;
 	}
 }

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/reader/SharedReaderProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/reader/SharedReaderProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/reader/SharedReaderProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -17,7 +17,7 @@
 import org.apache.lucene.index.MultiReader;
 import org.hibernate.annotations.common.AssertionFailure;
 import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
+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;
@@ -284,7 +284,7 @@
 		}
 	}
 
-	public void initialize(Properties props, SearchFactory searchFactory) {
+	public void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor) {
 		if ( subReadersField == null ) {
 			try {
 				subReadersField = MultiReader.class.getDeclaredField( "subReaders" );
@@ -294,7 +294,7 @@
 				throw new SearchException( "Incompatible version of Lucene: MultiReader.subReaders not accessible", e );
 			}
 		}
-		Set<DirectoryProvider> providers = searchFactory.getLockableDirectoryProviders().keySet();
+		Set<DirectoryProvider> providers = searchFactoryImplementor.getLockableDirectoryProviders().keySet();
 		perDirectoryProviderManipulationLocks = new HashMap<DirectoryProvider, Lock>( providers.size() );
 		for (DirectoryProvider dp : providers) {
 			perDirectoryProviderManipulationLocks.put( dp, new ReentrantLock() );

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -4,7 +4,7 @@
 import java.util.Properties;
 
 import org.apache.lucene.store.Directory;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 
 /**
@@ -22,7 +22,7 @@
 	/**
 	 * get the information to initialize the directory and build its hashCode
 	 */
-	void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory);
+	void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor);
 
 	/**
 	 * Returns an initialized Lucene Directory. This method call <b>must</b> be threadsafe

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -9,7 +9,8 @@
 import org.hibernate.HibernateException;
 import org.hibernate.cfg.Configuration;
 import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.impl.SearchFactoryImpl;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.annotations.common.reflection.ReflectionManager;
 import org.hibernate.annotations.common.reflection.XClass;
@@ -40,7 +41,7 @@
 	private static String DEFAULT_DIRECTORY_PROVIDER = FSDirectoryProvider.class.getName();
 
 	//TODO for the public?
-	public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg, SearchFactory searchFactory) {
+	public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg, SearchFactoryImplementor searchFactoryImplementor) {
 		//get properties
 		String directoryProviderName = getDirectoryProviderName( entity, cfg );
 		Properties indexProps = getDirectoryProperties( cfg, directoryProviderName );
@@ -62,7 +63,7 @@
 			throw new HibernateException( "Unable to instanciate directory provider: " + className, e );
 		}
 		try {
-			provider.initialize( directoryProviderName, indexProps, searchFactory );
+			provider.initialize( directoryProviderName, indexProps, searchFactoryImplementor );
 		}
 		catch (Exception e) {
 			throw new HibernateException( "Unable to initialize: " + directoryProviderName, e);
@@ -98,7 +99,7 @@
 
 	private static String getDirectoryProviderName(XClass clazz, Configuration cfg) {
 		//yuk
-		ReflectionManager reflectionManager = SearchFactory.getReflectionManager(cfg);
+		ReflectionManager reflectionManager = SearchFactoryImpl.getReflectionManager(cfg);
 		//get the most specialized (ie subclass > superclass) non default index name
 		//if none extract the name from the most generic (superclass > subclass) @Indexed class in the hierarchy
 		//FIXME I'm inclined to get rid of the default value

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -12,7 +12,7 @@
 import org.apache.lucene.store.FSDirectory;
 import org.hibernate.HibernateException;
 import org.hibernate.search.util.DirectoryProviderHelper;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Use a Lucene FSDirectory
@@ -27,7 +27,7 @@
 	private static Log log = LogFactory.getLog( FSDirectoryProvider.class );
 	private String indexName;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
 		File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
 		try {
 			boolean create = !indexDir.exists();

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -17,7 +17,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.search.util.DirectoryProviderHelper;
 import org.hibernate.search.util.FileHelper;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.HibernateException;
 
 /**
@@ -37,9 +37,9 @@
 	private int current;
 	private String indexName;
 	private Timer timer;
-	private SearchFactory searchFactory;
+	private SearchFactoryImplementor searchFactory;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
 		//source guessing
 		String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
 		if ( source == null)
@@ -90,7 +90,7 @@
 		timer = new Timer(true); //daemon thread, the copy algorithm is robust
 		TimerTask task = new FSMasterDirectoryProvider.TriggerTask(indexName, source, this );
 		timer.scheduleAtFixedRate( task, period, period );
-		this.searchFactory = searchFactory;
+		this.searchFactory = searchFactoryImplementor;
 	}
 
 	public FSDirectory getDirectory() {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -18,7 +18,7 @@
 import org.hibernate.AssertionFailure;
 import org.hibernate.search.util.FileHelper;
 import org.hibernate.search.util.DirectoryProviderHelper;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * File based directory provider that takes care of geting a version of the index
@@ -39,7 +39,7 @@
 	private String indexName;
 	private Timer timer;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
 		//source guessing
 		String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
 		if (source == null)

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -8,7 +8,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.RAMDirectory;
 import org.hibernate.HibernateException;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * Use a Lucene RAMDirectory
@@ -21,7 +21,7 @@
 	private RAMDirectory directory;
 	private String indexName;
 
-	public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+	public void initialize(String directoryProviderName, Properties properties, SearchFactoryImplementor searchFactoryImplementor) {
 		indexName = directoryProviderName;
 		directory = new RAMDirectory();
 		try {

Modified: trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -6,19 +6,19 @@
 import org.hibernate.engine.SessionImplementor;
 import org.hibernate.event.PostInsertEventListener;
 import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.SearchFactory;
+import org.hibernate.search.engine.SearchFactoryImplementor;
 
 /**
  * @author Emmanuel Bernard
  */
 public abstract class ContextHelper {
 
-	public static SearchFactory getSearchFactory(Session session) {
+	public static SearchFactoryImplementor getSearchFactory(Session session) {
 		return getSearchFactoryBySFI( (SessionImplementor) session );
 	}
 
 	
-	public static SearchFactory getSearchFactoryBySFI(SessionImplementor session) {
+	public static SearchFactoryImplementor getSearchFactoryBySFI(SessionImplementor session) {
 		PostInsertEventListener[] listeners = session.getListeners().getPostInsertEventListeners();
 		FullTextIndexEventListener listener = null;
 		//FIXME this sucks since we mandante the event listener use
@@ -31,6 +31,6 @@
 		if ( listener == null ) throw new HibernateException(
 				"Hibernate Search Event listeners not configured, please check the reference documentation and the " +
 						"application's hibernate.cfg.xml" );
-		return listener.getSearchFactory();
+		return listener.getSearchFactoryImplementor();
 	}
 }

Modified: trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java	2007-06-05 02:25:56 UTC (rev 11630)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java	2007-06-05 15:48:42 UTC (rev 11631)
@@ -20,7 +20,7 @@
 	}
 
 	protected Directory getDirectory(Class clazz) {
-		return getLuceneEventListener().getSearchFactory().getDirectoryProvider( clazz ).getDirectory();
+		return getLuceneEventListener().getSearchFactoryImplementor().getDirectoryProvider( clazz ).getDirectory();
 	}
 
 	private FullTextIndexEventListener getLuceneEventListener() {




More information about the hibernate-commits mailing list