Hibernate SVN: r19869 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/configuration/mutablefactory and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:43:35 -0400 (Wed, 30 Jun 2010)
New Revision: 19869
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/DocumentBuilderIndexedEntity.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
Log:
HSEARCH-397 Fix NPE on second post processing of DocumentBuilders
Also add test on empty SearchFactory
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-30 13:42:43 UTC (rev 19868)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java 2010-06-30 13:43:35 UTC (rev 19869)
@@ -87,7 +87,8 @@
private static final Logger log = LoggerFactory.make();
protected final PropertiesMetadata metadata = new PropertiesMetadata();
- protected final XClass beanClass;
+ protected final XClass beanXClass;
+ protected final Class<?> beanClass;
protected Set<Class<?>> mappedSubclasses = new HashSet<Class<?>>();
protected ReflectionManager reflectionManager; //available only during initialization and post-initialization
protected int level = 0;
@@ -97,26 +98,27 @@
protected boolean isRoot;
protected EntityState entityState;
private Analyzer passThroughAnalyzer = new PassThroughAnalyzer();
+ private boolean initialized;
/**
* Constructor used on contained entities not annotated with <code>@Indexed</code> themselves.
*
- * @param clazz The class for which to build a <code>DocumentBuilderContainedEntity</code>.
+ * @param xClass The class for which to build a <code>DocumentBuilderContainedEntity</code>.
* @param context Handle to default configuration settings.
* @param reflectionManager Reflection manager to use for processing the annotations.
*/
- public DocumentBuilderContainedEntity(XClass clazz, ConfigContext context, ReflectionManager reflectionManager) {
+ public DocumentBuilderContainedEntity(XClass xClass, ConfigContext context, ReflectionManager reflectionManager) {
- if ( clazz == null ) {
+ if ( xClass == null ) {
throw new AssertionFailure( "Unable to build a DocumentBuilderContainedEntity with a null class" );
}
this.entityState = EntityState.CONTAINED_IN_ONLY;
- this.beanClass = clazz;
+ this.beanXClass = xClass;
this.reflectionManager = reflectionManager;
+ this.beanClass = reflectionManager.toClass( xClass );
+ init( xClass, context );
- init( clazz, context );
-
if ( metadata.containedInGetters.size() == 0 ) {
this.entityState = EntityState.NON_INDEXABLE;
}
@@ -283,7 +285,7 @@
if ( discriminatorAnn != null ) {
if ( propertiesMetadata.discriminator != null ) {
throw new SearchException(
- "Multiple AnalyzerDiscriminator defined in the same class hierarchy: " + beanClass.getName()
+ "Multiple AnalyzerDiscriminator defined in the same class hierarchy: " + beanXClass.getName()
);
}
@@ -322,7 +324,7 @@
if ( similarityAnn != null ) {
if ( similarity != null ) {
throw new SearchException(
- "Multiple Similarities defined in the same class hierarchy: " + beanClass.getName()
+ "Multiple Similarities defined in the same class hierarchy: " + beanXClass.getName()
);
}
Class<?> similarityClass = similarityAnn.impl();
@@ -332,7 +334,7 @@
catch ( Exception e ) {
log.error(
"Exception attempting to instantiate Similarity '{}' set for {}",
- similarityClass.getName(), beanClass.getName()
+ similarityClass.getName(), beanXClass.getName()
);
}
}
@@ -377,7 +379,7 @@
throw new SearchException(
"Circular reference. Duplicate use of "
+ elementClass.getName()
- + " in root entity " + beanClass.getName()
+ + " in root entity " + beanXClass.getName()
+ "#" + buildEmbeddedPrefix( prefix, embeddedAnn, member )
);
}
@@ -747,11 +749,12 @@
}
public void postInitialize(Set<Class<?>> indexedClasses) {
+ //we initialize only once because we no longer have a reference to the reflectionManager
+ //in theory
+ Class<?> plainClass = beanClass;
if ( entityState == EntityState.NON_INDEXABLE ) {
throw new AssertionFailure( "A non indexed entity is post processed" );
}
- //this method does not requires synchronization
- Class<?> plainClass = reflectionManager.toClass( beanClass );
Set<Class<?>> tempMappedSubclasses = new HashSet<Class<?>>();
//together with the caller this creates a o(2), but I think it's still faster than create the up hierarchy for each class
for ( Class<?> currentClass : indexedClasses ) {
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-30 13:42:43 UTC (rev 19868)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-06-30 13:43:35 UTC (rev 19869)
@@ -726,10 +726,11 @@
return ( (StringBridge) bridge ).objectToString( value );
}
throw new SearchException( "FieldBridge " + bridgeClass + "does not have a objectToString method: field "
- + fieldName + " in " + beanClass );
+ + fieldName + " in " + beanXClass
+ );
}
}
- throw new SearchException( "Unable to find field " + fieldName + " in " + beanClass );
+ throw new SearchException( "Unable to find field " + fieldName + " in " + beanXClass );
}
private FieldBridge getBridge(List<String> names, List<FieldBridge> bridges, String fieldName) {
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-06-30 13:42:43 UTC (rev 19868)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-06-30 13:43:35 UTC (rev 19869)
@@ -22,7 +22,7 @@
*/
public class MutableFactoryTest extends TestCase {
- public void createEmptyFactory() throws Exception {
+ public void testCreateEmptyFactory() throws Exception {
final ManualConfiguration configuration = new ManualConfiguration();
SearchFactoryImplementor sf = new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
sf.close();
@@ -75,7 +75,7 @@
luceneQuery = parser.parse( "Noel" );
//we know there is only one DP
- provider = sf.getDirectoryProviders( A.class )[0];
+ provider = sf.getDirectoryProviders( B.class )[0];
searcher = new IndexSearcher( provider.getDirectory(), true );
hits = searcher.search( luceneQuery, 1000 );
assertEquals( 1, hits.totalHits );
14 years, 7 months
Hibernate SVN: r19868 - in search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration: mutablefactory and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:42:43 -0400 (Wed, 30 Jun 2010)
New Revision: 19868
Added:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/A.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/B.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
Log:
HSEARCH-397 Add tests on mutable factory
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/A.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/A.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/A.java 2010-06-30 13:42:43 UTC (rev 19868)
@@ -0,0 +1,36 @@
+package org.hibernate.search.test.configuration.mutablefactory;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Indexed;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Indexed
+public class A {
+ private Integer id;
+ private String name;
+
+ @DocumentId
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Field
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/B.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/B.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/B.java 2010-06-30 13:42:43 UTC (rev 19868)
@@ -0,0 +1,37 @@
+package org.hibernate.search.test.configuration.mutablefactory;
+
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Indexed;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Indexed
+public class B {
+ private Integer id;
+ private String name;
+
+ public B(Integer id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ @DocumentId
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Field
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/mutablefactory/MutableFactoryTest.java 2010-06-30 13:42:43 UTC (rev 19868)
@@ -0,0 +1,87 @@
+package org.hibernate.search.test.configuration.mutablefactory;
+
+import junit.framework.TestCase;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.TopDocs;
+
+import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.impl.MutableSearchFactory;
+import org.hibernate.search.impl.SearchFactoryBuilder;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.RAMDirectoryProvider;
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.test.util.ManualConfiguration;
+import org.hibernate.search.test.util.ManualTransactionContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MutableFactoryTest extends TestCase {
+
+ public void createEmptyFactory() throws Exception {
+ final ManualConfiguration configuration = new ManualConfiguration();
+ SearchFactoryImplementor sf = new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
+ sf.close();
+ }
+
+ public void testAddingClass() throws Exception {
+ ManualConfiguration configuration = new ManualConfiguration()
+ .addProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ //FIXME downcasting of MSF. create a getDelegate() ?
+ MutableSearchFactory sf = (MutableSearchFactory) new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
+ final SearchFactoryBuilder builder = new SearchFactoryBuilder();
+ sf = (MutableSearchFactory) builder.rootFactory( sf )
+ .addClass( A.class )
+ .buildSearchFactory();
+
+ A a = new A();
+ a.setId( 1 );
+ a.setName( "Emmanuel" );
+
+ ManualTransactionContext tc = new ManualTransactionContext();
+
+ Work<A> work = new Work<A>( a, 1, WorkType.INDEX );
+ sf.getWorker().performWork( work, tc );
+
+ tc.end();
+
+ QueryParser parser = new QueryParser( SearchTestCase.getTargetLuceneVersion(), "name", SearchTestCase.standardAnalyzer );
+ Query luceneQuery = parser.parse( "Emmanuel" );
+
+ //we know there is only one DP
+ DirectoryProvider provider = sf
+ .getDirectoryProviders( A.class )[0];
+ IndexSearcher searcher = new IndexSearcher( provider.getDirectory(), true );
+ TopDocs hits = searcher.search( luceneQuery, 1000 );
+ assertEquals( 1, hits.totalHits );
+
+ searcher.close();
+
+ sf = (MutableSearchFactory) builder.rootFactory( sf )
+ .addClass( B.class )
+ .buildSearchFactory();
+
+ tc = new ManualTransactionContext();
+
+ Work<B> workB = new Work<B>( new B(1, "Noel"), 1, WorkType.INDEX );
+ sf.getWorker().performWork( workB, tc );
+
+ tc.end();
+
+ luceneQuery = parser.parse( "Noel" );
+
+ //we know there is only one DP
+ provider = sf.getDirectoryProviders( A.class )[0];
+ searcher = new IndexSearcher( provider.getDirectory(), true );
+ hits = searcher.search( luceneQuery, 1000 );
+ assertEquals( 1, hits.totalHits );
+
+ searcher.close();
+
+ sf.close();
+ }
+}
14 years, 7 months
Hibernate SVN: r19867 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl: jgroups and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:42:05 -0400 (Wed, 30 Jun 2010)
New Revision: 19867
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/jgroups/JGroupsBackendQueueProcessorFactory.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
Log:
HSEARCH-397 Add update contract implementation for existing backends
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-30 13:41:20 UTC (rev 19866)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java 2010-06-30 13:42:05 UTC (rev 19867)
@@ -28,6 +28,7 @@
import java.util.Properties;
import java.util.Set;
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
@@ -44,7 +45,7 @@
*
* @author Sanne Grinovero
*/
-public class BlackHoleBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+public class BlackHoleBackendQueueProcessorFactory implements UpdatableBackendQueueProcessorFactory {
private static final Logger log = LoggerFactory.make();
@@ -59,15 +60,16 @@
log.warn( "initialized \"blackhole\" backend. Index changes will be prepared but discarded!" );
}
- public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers) {
- log.warn( "update DirectoryProviders \"blackhole\" backend. Index changes will be prepared but discarded!" );
- }
-
public void close() {
// no-op
log.info( "closed \"blackhole\" backend." );
}
-
+
+ public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers, WorkerBuildContext context) {
+ //no-op
+ log.warn( "update DirectoryProviders \"blackhole\" backend. Index changes will be prepared but discarded!" );
+ }
+
private static class NoOp implements Runnable {
public void run() {
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-30 13:41:20 UTC (rev 19866)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java 2010-06-30 13:42:05 UTC (rev 19867)
@@ -36,6 +36,7 @@
import org.slf4j.Logger;
import org.hibernate.search.Environment;
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.SearchException;
import org.hibernate.search.backend.BackendQueueProcessorFactory;
@@ -52,7 +53,7 @@
*
* @author Lukasz Moren
*/
-public abstract class JGroupsBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+public abstract class JGroupsBackendQueueProcessorFactory implements UpdatableBackendQueueProcessorFactory {
private static final Logger log = LoggerFactory.make();
@@ -79,7 +80,7 @@
prepareJGroupsChannel( props );
}
- public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers) {
+ public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers, WorkerBuildContext context) {
//nothing to do here. The DirectoryProviders are not used
}
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-30 13:41:20 UTC (rev 19866)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java 2010-06-30 13:42:05 UTC (rev 19867)
@@ -36,16 +36,16 @@
import javax.naming.NamingException;
import org.hibernate.search.Environment;
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.SearchException;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.store.DirectoryProvider;
/**
* @author Emmanuel Bernard
*/
-public class JMSBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+public class JMSBackendQueueProcessorFactory implements UpdatableBackendQueueProcessorFactory {
private String jmsQueueName;
private String jmsConnectionFactoryName;
private static final String JNDI_PREFIX = Environment.WORKER_PREFIX + "jndi.";
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-30 13:41:20 UTC (rev 19866)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java 2010-06-30 13:42:05 UTC (rev 19867)
@@ -31,8 +31,8 @@
import java.util.Set;
import org.hibernate.search.SearchException;
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
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;
import org.hibernate.search.engine.SearchFactoryImplementor;
@@ -48,7 +48,7 @@
* @author Emmanuel Bernard
* @author Sanne Grinovero
*/
-public class LuceneBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+public class LuceneBackendQueueProcessorFactory implements UpdatableBackendQueueProcessorFactory {
private SearchFactoryImplementor searchFactoryImp;
@@ -58,8 +58,11 @@
* Both Workspace(s) and LuceneWorkVisitor(s) lifecycle are linked to the backend
* lifecycle (reused and shared by all transactions);
* the LuceneWorkVisitor(s) are stateless, the Workspace(s) are threadsafe.
+ *
+ * This read only structure is guarded by a volatile: upon updates of the backend,
+ * changes should be synchronized in a multithreaded way.
*/
- private final Map<DirectoryProvider<?>,PerDPResources> resourcesMap =
+ private volatile Map<DirectoryProvider<?>,PerDPResources> resourcesMap =
new HashMap<DirectoryProvider<?>,PerDPResources>();
/**
@@ -91,6 +94,7 @@
throw new SearchException("DirectoryProvider no longer present during SearchFactory update" );
}
}
+ this.resourcesMap = newResourceMap;
}
public Runnable getProcessor(List<LuceneWork> queue) {
14 years, 7 months
Hibernate SVN: r19866 - search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:41:20 -0400 (Wed, 30 Jun 2010)
New Revision: 19866
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
Log:
HSEARCH-397 SearchFactoryBuilder contract for mutable SearchFactories
Create contract to add new classes and update an SearchFactory
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/IncrementalSearchConfiguration.java 2010-06-30 13:41:20 UTC (rev 19866)
@@ -0,0 +1,53 @@
+package org.hibernate.search.impl;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.search.cfg.SearchConfiguration;
+import org.hibernate.search.cfg.SearchMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class IncrementalSearchConfiguration implements SearchConfiguration {
+ private final ReflectionManager reflectionManager = new JavaReflectionManager();
+ private final List<Class<?>> classes;
+ private final Map<String, Class<?>> classesByName = new HashMap<String, Class<?>>();
+ private Properties properties;
+
+ public IncrementalSearchConfiguration(List<Class<?>> classes, Properties properties) {
+ this.properties = properties;
+ this.classes = classes;
+ for ( Class<?> entity : classes ) {
+ classesByName.put( entity.getName(), entity );
+ }
+ }
+ public Iterator<Class<?>> getClassMappings() {
+ return classes.iterator();
+ }
+
+ public Class<?> getClassMapping(String name) {
+ return classesByName.get( name );
+ }
+
+ public String getProperty(String propertyName) {
+ return properties.getProperty(propertyName );
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public ReflectionManager getReflectionManager() {
+ return reflectionManager;
+ }
+
+ public SearchMapping getProgrammaticMapping() {
+ return null;
+ }
+}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-06-30 13:40:44 UTC (rev 19865)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-06-30 13:41:20 UTC (rev 19866)
@@ -2,9 +2,11 @@
import java.beans.Introspector;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@@ -12,6 +14,8 @@
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Similarity;
+
+import org.hibernate.search.backend.UpdatableBackendQueueProcessorFactory;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.spi.WritableBuildContext;
import org.hibernate.search.spi.internals.DirectoryProviderData;
@@ -65,10 +69,11 @@
* Build a search factory
* @author Emmanuel Bernard
*/
-public class SearchFactoryBuilder implements WritableBuildContext, WorkerBuildContext {
+public class SearchFactoryBuilder {
private static final Logger log = LoggerFactory.make();
- SearchConfiguration cfg;
- MutableSearchFactory rootFactory;
+ private SearchConfiguration cfg;
+ private MutableSearchFactory rootFactory;
+ private final List<Class<?>> classes = new ArrayList<Class<?>>();
public SearchFactoryBuilder configuration(SearchConfiguration configuration) {
this.cfg = configuration;
@@ -80,6 +85,11 @@
return this;
}
+ public SearchFactoryBuilder addClass(Class<?> clazz) {
+ classes.add( clazz );
+ return this;
+ }
+
//processing properties
ReflectionManager reflectionManager;
String indexingStrategy;
@@ -101,6 +111,9 @@
public SearchFactoryImplementor buildSearchFactory() {
if (rootFactory == null) {
+ if (classes.size() > 0) {
+ throw new SearchException( "Cannot add a class if the original SearchFactory is not passed");
+ }
return buildNewSearchFactory();
}
else {
@@ -109,9 +122,50 @@
}
private SearchFactoryImplementor buildIncrementalSearchFactory() {
+ BuildContext buildContext = new BuildContext();
copyStateFromOldFactory(rootFactory);
- //FIXME next step for implementation
- return null;
+ List<Class<?>> remove = new ArrayList<Class<?>>();
+ for (Class<?> entity : classes) {
+ if ( documentBuildersIndexedEntities.containsKey( entity ) || documentBuildersContainedEntities.containsKey(entity) ) {
+ remove.add( entity );
+ }
+ }
+ for(Class<?> entity : remove) {
+ classes.remove( entity );
+ }
+ //TODO we don't keep the reflectionManager. Is that an issue?
+ IncrementalSearchConfiguration cfg = new IncrementalSearchConfiguration( classes, configurationProperties );
+ reflectionManager = getReflectionManager( cfg );
+ //TODO programmatic mapping support
+
+ //FIXME The current initDocumentBuilders
+ initDocumentBuilders( cfg, reflectionManager, buildContext );
+
+ Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
+ for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
+ //FIXME improve this algorithm to deal with adding new classes to the class hierarchy.
+ //Today it seems only safe when a class outside the hierarchy is incrementally added.
+ builder.postInitialize( indexedClasses );
+ }
+ //not really necessary today
+ for ( DocumentBuilderContainedEntity builder : documentBuildersContainedEntities.values() ) {
+ builder.postInitialize( indexedClasses );
+ }
+ fillSimilarityMapping();
+
+ //update backend
+ final BackendQueueProcessorFactory backend = this.backendQueueProcessorFactory;
+ if ( backend instanceof UpdatableBackendQueueProcessorFactory) {
+ final UpdatableBackendQueueProcessorFactory updatableBackend = ( UpdatableBackendQueueProcessorFactory ) backend;
+ updatableBackend.updateDirectoryProviders( this.dirProviderData.keySet(), buildContext );
+ }
+ //safe for incremental init at least the ShredBufferReaderProvider
+ //this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
+ StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+ rootFactory.setDelegate( factory );
+ return rootFactory;
+
+
}
private void copyStateFromOldFactory(StateSearchFactoryImplementor stateFactory) {
@@ -138,6 +192,7 @@
configurationProperties = cfg.getProperties();
errorHandler = createErrorHandler( configurationProperties );
reflectionManager = getReflectionManager(cfg);
+ BuildContext buildContext = new BuildContext();
final SearchMapping mapping = SearchMappingBuilder.getSearchMapping(cfg);
if ( mapping != null) {
@@ -152,7 +207,7 @@
indexingStrategy = defineIndexingStrategy( cfg );//need to be done before the document builds
dirProviderIndexingParams = new HashMap<DirectoryProvider, LuceneIndexingParameters>();
- initDocumentBuilders( cfg, reflectionManager );
+ initDocumentBuilders( cfg, reflectionManager, buildContext );
Set<Class<?>> indexedClasses = documentBuildersIndexedEntities.keySet();
for ( DocumentBuilderIndexedEntity builder : documentBuildersIndexedEntities.values() ) {
@@ -165,8 +220,8 @@
fillSimilarityMapping();
//build back end
- this.worker = WorkerFactory.createWorker( cfg, this );
- this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, this );
+ this.worker = WorkerFactory.createWorker( cfg, buildContext );
+ this.readerProvider = ReaderProviderFactory.createReaderProvider( cfg, buildContext );
this.filterCachingStrategy = buildFilterCachingStrategy( cfg.getProperties() );
this.cacheBitResultsSize = ConfigurationParseHelper.getIntValue(
cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
@@ -219,7 +274,11 @@
}
}
- private void initDocumentBuilders(SearchConfiguration cfg, ReflectionManager reflectionManager) {
+ /*
+ * Initialize the document builder
+ * This algorithm seems to be safe for incremental search factories.
+ */
+ private void initDocumentBuilders(SearchConfiguration cfg, ReflectionManager reflectionManager, BuildContext buildContext) {
ConfigContext context = new ConfigContext( cfg );
Iterator<Class<?>> iter = cfg.getClassMappings();
DirectoryProviderFactory factory = new DirectoryProviderFactory();
@@ -228,7 +287,7 @@
initProgrammaticallyDefinedFilterDef(reflectionManager);
while ( iter.hasNext() ) {
- Class mappedClass = iter.next();
+ Class<?> mappedClass = iter.next();
if ( mappedClass == null ) {
continue;
}
@@ -246,7 +305,7 @@
}
DirectoryProviderFactory.DirectoryProviders providers = factory.createDirectoryProviders(
- mappedXClass, cfg, this, reflectionManager
+ mappedXClass, cfg, buildContext, reflectionManager
);
//FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
//XClass unfortunately is not (yet) genericized: TODO?
@@ -388,6 +447,10 @@
private ReflectionManager getReflectionManager(SearchConfiguration cfg) {
ReflectionManager reflectionManager = cfg.getReflectionManager();
+ return geReflectionManager( reflectionManager );
+ }
+
+ private ReflectionManager geReflectionManager(ReflectionManager reflectionManager) {
if ( reflectionManager == null ) {
reflectionManager = new JavaReflectionManager();
}
@@ -402,77 +465,80 @@
return indexingStrategy;
}
- public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
- DirectoryProviderData data = dirProviderData.get( provider );
- if ( data == null ) {
- data = new DirectoryProviderData();
- dirProviderData.put( provider, data );
+ private class BuildContext implements WritableBuildContext, WorkerBuildContext {
+ public void addOptimizerStrategy(DirectoryProvider<?> provider, OptimizerStrategy optimizerStrategy) {
+ DirectoryProviderData data = dirProviderData.get( provider );
+ if ( data == null ) {
+ data = new DirectoryProviderData();
+ dirProviderData.put( provider, data );
+ }
+ data.setOptimizerStrategy( optimizerStrategy );
}
- data.setOptimizerStrategy( optimizerStrategy );
- }
- public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
- dirProviderIndexingParams.put( provider, indexingParams );
- }
+ public void addIndexingParameters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams) {
+ dirProviderIndexingParams.put( provider, indexingParams );
+ }
- public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
- DirectoryProviderData data = dirProviderData.get( directoryProvider );
- if ( data == null ) {
- data = new DirectoryProviderData();
- dirProviderData.put( directoryProvider, data );
+ public void addClassToDirectoryProvider(Class<?> entity, DirectoryProvider<?> directoryProvider, boolean exclusiveIndexUsage) {
+ DirectoryProviderData data = dirProviderData.get( directoryProvider );
+ if ( data == null ) {
+ data = new DirectoryProviderData();
+ dirProviderData.put( directoryProvider, data );
+ }
+ data.getClasses().add( entity );
+ data.setExclusiveIndexUsage( exclusiveIndexUsage );
}
- data.getClasses().add( entity );
- data.setExclusiveIndexUsage( exclusiveIndexUsage );
- }
- public SearchFactoryImplementor getUninitializedSearchFactory() {
- return rootFactory;
- }
+ public SearchFactoryImplementor getUninitializedSearchFactory() {
+ return rootFactory;
+ }
- public String getIndexingStrategy() {
- return indexingStrategy;
- }
+ public String getIndexingStrategy() {
+ return indexingStrategy;
+ }
- public Set<DirectoryProvider<?>> getDirectoryProviders() {
- return this.dirProviderData.keySet();
- }
+ public Set<DirectoryProvider<?>> getDirectoryProviders() {
+ return SearchFactoryBuilder.this.dirProviderData.keySet();
+ }
- public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
- this.backendQueueProcessorFactory = backendQueueProcessorFactory;
- }
+ public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+ SearchFactoryBuilder.this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+ }
- public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
- return dirProviderData.get( provider ).getOptimizerStrategy();
- }
+ public OptimizerStrategy getOptimizerStrategy(DirectoryProvider<?> provider) {
+ return dirProviderData.get( provider ).getOptimizerStrategy();
+ }
- public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
- return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
- }
+ public Set<Class<?>> getClassesInDirectoryProvider(DirectoryProvider<?> directoryProvider) {
+ return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
+ }
- public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
- return dirProviderIndexingParams.get( provider );
- }
+ public LuceneIndexingParameters getIndexingParameters(DirectoryProvider<?> provider) {
+ return dirProviderIndexingParams.get( provider );
+ }
- public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
- return this.dirProviderData.get( dp ).getDirLock();
- }
+ public ReentrantLock getDirectoryProviderLock(DirectoryProvider<?> dp) {
+ return SearchFactoryBuilder.this.dirProviderData.get( dp ).getDirLock();
+ }
- public Similarity getSimilarity(DirectoryProvider<?> provider) {
- Similarity similarity = dirProviderData.get( provider ).getSimilarity();
- if ( similarity == null ) throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
- return similarity;
- }
+ public Similarity getSimilarity(DirectoryProvider<?> provider) {
+ Similarity similarity = dirProviderData.get( provider ).getSimilarity();
+ if ( similarity == null ) throw new SearchException( "Assertion error: a similarity should be defined for each provider" );
+ return similarity;
+ }
- public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
- return dirProviderData.get( provider ).isExclusiveIndexUsage();
- }
+ public boolean isExclusiveIndexUsageEnabled(DirectoryProvider<?> provider) {
+ return dirProviderData.get( provider ).isExclusiveIndexUsage();
+ }
- public ErrorHandler getErrorHandler() {
- return errorHandler;
- }
+ public ErrorHandler getErrorHandler() {
+ return errorHandler;
+ }
- @SuppressWarnings("unchecked")
- public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
- return ( DocumentBuilderIndexedEntity<T> ) documentBuildersIndexedEntities.get( entityType );
+ @SuppressWarnings("unchecked")
+ public <T> DocumentBuilderIndexedEntity<T> getDocumentBuilderIndexedEntity(Class<T> entityType) {
+ return ( DocumentBuilderIndexedEntity<T> ) documentBuildersIndexedEntities.get( entityType );
+ }
+
}
}
14 years, 7 months
Hibernate SVN: r19865 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: backend/impl/blackhole and 4 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:40:44 -0400 (Wed, 30 Jun 2010)
New Revision: 19865
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/UpdatableBackendQueueProcessorFactory.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/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/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/reader/SharingBufferReaderProvider.java
Log:
HSEARCH-397 Add contract on backend to update the list of directory providers
Also clarify mutability requirements for SharingBufferReaderProvider
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -26,8 +26,10 @@
import java.util.Properties;
import java.util.List;
+import java.util.Set;
import org.hibernate.search.spi.WorkerBuildContext;
+import org.hibernate.search.store.DirectoryProvider;
/**
* Interface for different types of queue processor factories. Implementations need a no-arg constructor.
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/UpdatableBackendQueueProcessorFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/UpdatableBackendQueueProcessorFactory.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/UpdatableBackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -0,0 +1,20 @@
+package org.hibernate.search.backend;
+
+import java.util.Set;
+
+import org.hibernate.search.spi.WorkerBuildContext;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * Experimental
+ * Allow a BackendQueueProcessorFactory to be notified of DiurectoryProvider changes
+ *
+ * @author Emmanuel Bernard
+ */
+public interface UpdatableBackendQueueProcessorFactory extends BackendQueueProcessorFactory {
+ /**
+ * Update the list of <code>DirectoryProvider</code>s in case the SearchFactory is updated.
+ * The processor factory should react and update its state accordingly.
+ */
+ void updateDirectoryProviders(Set<DirectoryProvider<?>> providers, WorkerBuildContext context);
+}
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/blackhole/BlackHoleBackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -26,10 +26,12 @@
import java.util.List;
import java.util.Properties;
+import java.util.Set;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.util.LoggerFactory;
import org.slf4j.Logger;
@@ -56,7 +58,11 @@
// no-op
log.warn( "initialized \"blackhole\" backend. Index changes will be prepared but discarded!" );
}
-
+
+ public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers) {
+ log.warn( "update DirectoryProviders \"blackhole\" backend. Index changes will be prepared but discarded!" );
+ }
+
public void close() {
// no-op
log.info( "closed \"blackhole\" backend." );
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jgroups/JGroupsBackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -27,6 +27,7 @@
import java.net.URL;
import java.util.List;
import java.util.Properties;
+import java.util.Set;
import org.jgroups.Address;
import org.jgroups.Channel;
@@ -40,6 +41,7 @@
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.util.LoggerFactory;
import org.hibernate.search.util.XMLHelper;
import org.hibernate.util.ConfigHelper;
@@ -77,6 +79,10 @@
prepareJGroupsChannel( props );
}
+ public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers) {
+ //nothing to do here. The DirectoryProviders are not used
+ }
+
private void prepareJGroupsChannel(Properties props) {
log.info( "Starting JGroups Channel" );
try {
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -28,6 +28,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
+import java.util.Set;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.naming.Context;
@@ -39,6 +40,7 @@
import org.hibernate.search.SearchException;
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.store.DirectoryProvider;
/**
* @author Emmanuel Bernard
@@ -61,6 +63,10 @@
prepareJMSTools();
}
+ public void updateDirectoryProviders(Set<DirectoryProvider<?>> providers, WorkerBuildContext context) {
+ //nothing to do here, this backend is not sensible to directory providers
+ }
+
public Runnable getProcessor(List<LuceneWork> queue) {
return new JMSBackendQueueProcessor( queue, this );
}
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -28,7 +28,9 @@
import java.util.Map;
import java.util.Properties;
import java.util.List;
+import java.util.Set;
+import org.hibernate.search.SearchException;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.backend.BackendQueueProcessorFactory;
import org.hibernate.search.backend.LuceneWork;
@@ -57,7 +59,8 @@
* lifecycle (reused and shared by all transactions);
* the LuceneWorkVisitor(s) are stateless, the Workspace(s) are threadsafe.
*/
- private final Map<DirectoryProvider,PerDPResources> resourcesMap = new HashMap<DirectoryProvider,PerDPResources>();
+ private final Map<DirectoryProvider<?>,PerDPResources> resourcesMap =
+ new HashMap<DirectoryProvider<?>,PerDPResources>();
/**
* copy of BatchedQueueingProcessor.sync
@@ -73,6 +76,23 @@
}
}
+ public void updateDirectoryProviders( Set<DirectoryProvider<?>> providers, WorkerBuildContext context ) {
+ Map<DirectoryProvider<?>,PerDPResources> newResourceMap =
+ new HashMap<DirectoryProvider<?>, PerDPResources>(resourcesMap);
+ for ( DirectoryProvider<?> provider : providers ) {
+ if ( ! resourcesMap.containsKey( provider ) ) {
+ PerDPResources resources = new PerDPResources( context, provider );
+ newResourceMap.put( provider, resources );
+ }
+ }
+ //TODO we could shut them down
+ for ( DirectoryProvider<?> provider : resourcesMap.keySet() ) {
+ if ( ! newResourceMap.containsKey( provider ) ) {
+ throw new SearchException("DirectoryProvider no longer present during SearchFactory update" );
+ }
+ }
+ }
+
public Runnable getProcessor(List<LuceneWork> queue) {
return new LuceneBackendQueueProcessor( queue, searchFactoryImp, resourcesMap, sync );
}
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-30 13:39:58 UTC (rev 19864)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/reader/SharingBufferReaderProvider.java 2010-06-30 13:40:44 UTC (rev 19865)
@@ -140,7 +140,8 @@
Directory directory = directoryProviders[index].getDirectory();
log.trace( "Opening IndexReader from {}", directory );
PerDirectoryLatestReader directoryLatestReader = currentReaders.get( directory );
- if ( directoryLatestReader == null ) { // might eg happen for FSSlaveDirectoryProvider
+ // might eg happen for FSSlaveDirectoryProvider or for mutable SearchFactory
+ if ( directoryLatestReader == null ) {
directoryLatestReader = createReader( directory );
}
readers[index] = directoryLatestReader.refreshAndGet();
14 years, 7 months
Hibernate SVN: r19864 - in core/branches/gradle2/hibernate-infinispan: src/test/java/org/hibernate/test/cache/infinispan and 3 other directories.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-06-30 09:39:58 -0400 (Wed, 30 Jun 2010)
New Revision: 19864
Modified:
core/branches/gradle2/hibernate-infinispan/hibernate-infinispan.gradle
core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java
core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/SingleNodeTestCase.java
core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java
core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/DualNodeTestCase.java
Log:
local changes to get infinispan tests compiling
Modified: core/branches/gradle2/hibernate-infinispan/hibernate-infinispan.gradle
===================================================================
--- core/branches/gradle2/hibernate-infinispan/hibernate-infinispan.gradle 2010-06-30 13:39:50 UTC (rev 19863)
+++ core/branches/gradle2/hibernate-infinispan/hibernate-infinispan.gradle 2010-06-30 13:39:58 UTC (rev 19864)
@@ -35,6 +35,10 @@
sourceCompatibility = "1.6"
targetCompatibility = "1.6"
+ideaModule {
+ javaVersion = "1.6"
+}
+
compileJava {
options.fork( executable: java6Home.getJavacExecutable() )
}
@@ -47,10 +51,6 @@
executable = java6Home.getJavaExecutable()
}
-ideaModule {
- javaVersion = "1.6"
-}
-
// todo : need to account for skipUnitTests from pom.xml
// todo : need to account for groups.bind_addr from pom.xml
// todo : need to account for surefire system-properties from pom.xml
Modified: core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java 2010-06-30 13:39:50 UTC (rev 19863)
+++ core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java 2010-06-30 13:39:58 UTC (rev 19864)
@@ -27,8 +27,9 @@
import org.hibernate.cache.RegionFactory;
import org.hibernate.cache.infinispan.util.CacheHelper;
-import org.hibernate.junit.UnitTestCase;
+import org.hibernate.testing.junit.UnitTestCase;
import org.hibernate.test.cache.infinispan.util.CacheTestSupport;
+
import org.infinispan.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Modified: core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/SingleNodeTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/SingleNodeTestCase.java 2010-06-30 13:39:50 UTC (rev 19863)
+++ core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/SingleNodeTestCase.java 2010-06-30 13:39:58 UTC (rev 19864)
@@ -10,7 +10,7 @@
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.connection.ConnectionProvider;
-import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
import org.hibernate.stat.SecondLevelCacheStatistics;
import org.hibernate.stat.Statistics;
import org.hibernate.transaction.CMTTransactionFactory;
Modified: core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java 2010-06-30 13:39:50 UTC (rev 19863)
+++ core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java 2010-06-30 13:39:58 UTC (rev 19864)
@@ -35,7 +35,7 @@
import org.hibernate.cfg.Environment;
import org.hibernate.classic.Session;
import org.hibernate.connection.ConnectionProvider;
-import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
import org.hibernate.stat.SecondLevelCacheStatistics;
import org.hibernate.test.cache.infinispan.functional.Contact;
import org.hibernate.test.cache.infinispan.functional.Customer;
Modified: core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/DualNodeTestCase.java
===================================================================
--- core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/DualNodeTestCase.java 2010-06-30 13:39:50 UTC (rev 19863)
+++ core/branches/gradle2/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/DualNodeTestCase.java 2010-06-30 13:39:58 UTC (rev 19864)
@@ -27,8 +27,8 @@
import org.hibernate.cfg.Mappings;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.junit.functional.ExecutionEnvironment;
-import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.testing.junit.functional.ExecutionEnvironment;
+import org.hibernate.testing.junit.functional.FunctionalTestCase;
import org.hibernate.transaction.CMTTransactionFactory;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
14 years, 7 months
Hibernate SVN: r19863 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: spi and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:39:50 -0400 (Wed, 30 Jun 2010)
New Revision: 19863
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/DirectoryProviderData.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/PolymorphicIndexHierarchy.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
Removed:
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
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
Log:
HSEARCH-397 Create StateSearchFactory contract, create spi / spi.internals packages
Deleted: 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 2010-06-30 13:39:01 UTC (rev 19862)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -1,53 +0,0 @@
-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;
- }
-}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java 2010-06-30 13:39:01 UTC (rev 19862)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/ImmutableSearchFactory.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -35,6 +35,9 @@
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
import org.slf4j.Logger;
import org.hibernate.annotations.common.AssertionFailure;
@@ -69,7 +72,7 @@
/**
* @author Emmanuel Bernard
*/
-public class ImmutableSearchFactory implements SearchFactoryImplementor, WorkerBuildContext {
+public class ImmutableSearchFactory implements StateSearchFactoryImplementor, WorkerBuildContext {
static {
Version.touch();
@@ -122,6 +125,10 @@
return backendQueueProcessorFactory;
}
+ public Map<String, FilterDef> getFilterDefinitions() {
+ return filterDefinitions;
+ }
+
public String getIndexingStrategy() {
return indexingStrategy;
}
@@ -158,6 +165,14 @@
return Collections.unmodifiableSet( dirProviderData.get( directoryProvider ).getClasses() );
}
+ public Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities() {
+ return documentBuildersContainedEntities;
+ }
+
+ public Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData() {
+ return dirProviderData;
+ }
+
public Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities() {
return documentBuildersIndexedEntities;
}
@@ -248,6 +263,18 @@
return filterCachingStrategy;
}
+ public Map<String, Analyzer> getAnalyzers() {
+ return analyzers;
+ }
+
+ public int getCacheBitResultsSize() {
+ return cacheBitResultsSize;
+ }
+
+ public Properties getConfigurationProperties() {
+ return configurationProperties;
+ }
+
public FilterDef getFilterDefinition(String name) {
return filterDefinitions.get( name );
}
@@ -294,6 +321,14 @@
return errorHandler;
}
+ public PolymorphicIndexHierarchy getIndexHierarchy() {
+ return indexHierarchy;
+ }
+
+ public Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams() {
+ return dirProviderIndexingParams;
+ }
+
public SearchFactoryImplementor getUninitializedSearchFactory() {
return this;
}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-06-30 13:39:01 UTC (rev 19862)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/MutableSearchFactory.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -1,6 +1,7 @@
package org.hibernate.search.impl;
import java.util.Map;
+import java.util.Properties;
import java.util.Set;
import java.util.concurrent.locks.ReentrantLock;
@@ -15,11 +16,13 @@
import org.hibernate.search.engine.DocumentBuilderContainedEntity;
import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
import org.hibernate.search.engine.FilterDef;
-import org.hibernate.search.engine.SearchFactoryImplementor;
import org.hibernate.search.exception.ErrorHandler;
import org.hibernate.search.filter.FilterCachingStrategy;
import org.hibernate.search.query.dsl.v2.QueryContextBuilder;
import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.optimization.OptimizerStrategy;
@@ -30,10 +33,10 @@
*
* @author Emmanuel Bernard
*/
-public class MutableSearchFactory implements SearchFactoryImplementor {
- private volatile SearchFactoryImplementor delegate;
+public class MutableSearchFactory implements StateSearchFactoryImplementor {
+ private volatile StateSearchFactoryImplementor delegate;
- void setDelegate(SearchFactoryImplementor delegate) {
+ void setDelegate(StateSearchFactoryImplementor delegate) {
this.delegate = delegate;
}
@@ -41,6 +44,10 @@
return delegate.getBackendQueueProcessorFactory();
}
+ public Map<String, FilterDef> getFilterDefinitions() {
+ return delegate.getFilterDefinitions();
+ }
+
public Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities() {
return delegate.getDocumentBuildersIndexedEntities();
}
@@ -65,6 +72,18 @@
return delegate.getFilterCachingStrategy();
}
+ public Map<String, Analyzer> getAnalyzers() {
+ return delegate.getAnalyzers();
+ }
+
+ public int getCacheBitResultsSize() {
+ return delegate.getCacheBitResultsSize();
+ }
+
+ public Properties getConfigurationProperties() {
+ return delegate.getConfigurationProperties();
+ }
+
public FilterDef getFilterDefinition(String name) {
return delegate.getFilterDefinition( name );
}
@@ -117,6 +136,14 @@
return delegate.getErrorHandler();
}
+ public PolymorphicIndexHierarchy getIndexHierarchy() {
+ return delegate.getIndexHierarchy();
+ }
+
+ public Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams() {
+ return delegate.getDirectoryProviderIndexingParams();
+ }
+
public ReaderProvider getReaderProvider() {
return delegate.getReaderProvider();
}
@@ -144,4 +171,12 @@
public QueryContextBuilder buildQueryBuilder() {
return delegate.buildQueryBuilder();
}
+
+ public Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities() {
+ return delegate.getDocumentBuildersContainedEntities();
+ }
+
+ public Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData() {
+ return delegate.getDirectoryProviderData();
+ }
}
Deleted: 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 2010-06-30 13:39:01 UTC (rev 19862)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -1,62 +0,0 @@
-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.
- */
-//FIXME make it immutable (builder pattern)
-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<?>> indexedClasses = 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
- indexedClasses.addAll( set );
- }
- }
- if ( log.isTraceEnabled() ) {
- log.trace( "Targeted indexed classes for {}: {}", Arrays.toString( classes ), indexedClasses );
- }
- return indexedClasses;
- }
-}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-06-30 13:39:01 UTC (rev 19862)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/SearchFactoryBuilder.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -12,6 +12,11 @@
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.search.Similarity;
+import org.hibernate.search.spi.WorkerBuildContext;
+import org.hibernate.search.spi.WritableBuildContext;
+import org.hibernate.search.spi.internals.DirectoryProviderData;
+import org.hibernate.search.spi.internals.PolymorphicIndexHierarchy;
+import org.hibernate.search.spi.internals.StateSearchFactoryImplementor;
import org.slf4j.Logger;
import org.hibernate.annotations.common.reflection.MetadataProvider;
@@ -20,8 +25,6 @@
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.WorkerBuildContext;
-import org.hibernate.search.spi.WritableBuildContext;
import org.hibernate.search.SearchException;
import org.hibernate.search.annotations.AnalyzerDef;
import org.hibernate.search.annotations.AnalyzerDefs;
@@ -35,7 +38,6 @@
import org.hibernate.search.backend.Worker;
import org.hibernate.search.backend.WorkerFactory;
import org.hibernate.search.backend.configuration.ConfigurationParseHelper;
-import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
import org.hibernate.search.cfg.SearchConfiguration;
import org.hibernate.search.cfg.SearchMapping;
import org.hibernate.search.engine.DocumentBuilderContainedEntity;
@@ -98,6 +100,39 @@
Map<DirectoryProvider, LuceneIndexingParameters> dirProviderIndexingParams;
public SearchFactoryImplementor buildSearchFactory() {
+ if (rootFactory == null) {
+ return buildNewSearchFactory();
+ }
+ else {
+ return buildIncrementalSearchFactory();
+ }
+ }
+
+ private SearchFactoryImplementor buildIncrementalSearchFactory() {
+ copyStateFromOldFactory(rootFactory);
+ //FIXME next step for implementation
+ return null;
+ }
+
+ private void copyStateFromOldFactory(StateSearchFactoryImplementor stateFactory) {
+ indexingStrategy = stateFactory.getIndexingStrategy();
+ documentBuildersIndexedEntities = stateFactory.getDocumentBuildersIndexedEntities();
+ documentBuildersContainedEntities = stateFactory.getDocumentBuildersContainedEntities();
+ dirProviderData = stateFactory.getDirectoryProviderData();
+ worker = stateFactory.getWorker();
+ readerProvider = stateFactory.getReaderProvider();
+ backendQueueProcessorFactory = stateFactory.getBackendQueueProcessorFactory();
+ filterDefinitions = stateFactory.getFilterDefinitions();
+ filterCachingStrategy = stateFactory.getFilterCachingStrategy();
+ analyzers = stateFactory.getAnalyzers();
+ cacheBitResultsSize = stateFactory.getCacheBitResultsSize();
+ configurationProperties = stateFactory.getConfigurationProperties();
+ errorHandler = stateFactory.getErrorHandler();
+ indexHierarchy = stateFactory.getIndexHierarchy();
+ dirProviderIndexingParams = stateFactory.getDirectoryProviderIndexingParams();
+ }
+
+ private SearchFactoryImplementor buildNewSearchFactory() {
createCleanFactoryState();
configurationProperties = cfg.getProperties();
@@ -136,8 +171,7 @@
this.cacheBitResultsSize = ConfigurationParseHelper.getIntValue(
cfg.getProperties(), Environment.CACHE_DOCIDRESULTS_SIZE, CachingWrapperFilter.DEFAULT_SIZE
);
- //TODO uncomment
- SearchFactoryImplementor factory = new ImmutableSearchFactory( this );
+ StateSearchFactoryImplementor factory = new ImmutableSearchFactory( this );
rootFactory.setDelegate( factory );
return rootFactory;
}
@@ -339,7 +373,6 @@
}
private static ErrorHandler createErrorHandler(Properties configuration) {
- boolean sync = BatchedQueueingProcessor.isConfiguredAsSync( configuration );
String errorHandlerClassName = configuration.getProperty( Environment.ERROR_HANDLER );
if ( StringHelper.isEmpty( errorHandlerClassName ) ) {
return new LogErrorHandler();
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/DirectoryProviderData.java (from rev 19862, search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/DirectoryProviderData.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/DirectoryProviderData.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/DirectoryProviderData.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -0,0 +1,53 @@
+package org.hibernate.search.spi.internals;
+
+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
+*/
+public 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;
+ }
+}
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/PolymorphicIndexHierarchy.java (from rev 19862, search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/PolymorphicIndexHierarchy.java)
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/PolymorphicIndexHierarchy.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/PolymorphicIndexHierarchy.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -0,0 +1,62 @@
+package org.hibernate.search.spi.internals;
+
+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.
+ */
+//FIXME make it immutable (builder pattern)
+public class PolymorphicIndexHierarchy {
+ private static final Logger log = LoggerFactory.make();
+
+ private Map<Class<?>, Set<Class<?>>> classToIndexedClass;
+
+ public PolymorphicIndexHierarchy() {
+ classToIndexedClass = new HashMap<Class<?>, Set<Class<?>>>();
+ }
+
+ public 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 );
+ }
+
+ public Set<Class<?>> getIndexedClasses(Class<?>[] classes) {
+ Set<Class<?>> indexedClasses = 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
+ indexedClasses.addAll( set );
+ }
+ }
+ if ( log.isTraceEnabled() ) {
+ log.trace( "Targeted indexed classes for {}: {}", Arrays.toString( classes ), indexedClasses );
+ }
+ return indexedClasses;
+ }
+}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/spi/internals/StateSearchFactoryImplementor.java 2010-06-30 13:39:50 UTC (rev 19863)
@@ -0,0 +1,55 @@
+package org.hibernate.search.spi.internals;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.lucene.analysis.Analyzer;
+
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneIndexingParameters;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.engine.DocumentBuilderContainedEntity;
+import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
+import org.hibernate.search.engine.FilterDef;
+import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.hibernate.search.exception.ErrorHandler;
+import org.hibernate.search.filter.FilterCachingStrategy;
+import org.hibernate.search.reader.ReaderProvider;
+import org.hibernate.search.store.DirectoryProvider;
+
+/**
+ * State constituting a SearchFactory
+ * @author Emmanuel Bernard
+ */
+public interface StateSearchFactoryImplementor extends SearchFactoryImplementor {
+
+ Map<Class<?>, DocumentBuilderContainedEntity<?>> getDocumentBuildersContainedEntities();
+
+ Map<DirectoryProvider<?>, DirectoryProviderData> getDirectoryProviderData();
+
+ Map<Class<?>, DocumentBuilderIndexedEntity<?>> getDocumentBuildersIndexedEntities();
+
+ String getIndexingStrategy();
+
+ Worker getWorker();
+
+ ReaderProvider getReaderProvider();
+
+ BackendQueueProcessorFactory getBackendQueueProcessorFactory();
+
+ Map<String, FilterDef> getFilterDefinitions();
+
+ FilterCachingStrategy getFilterCachingStrategy();
+
+ Map<String, Analyzer> getAnalyzers();
+
+ int getCacheBitResultsSize();
+
+ Properties getConfigurationProperties();
+
+ ErrorHandler getErrorHandler();
+
+ PolymorphicIndexHierarchy getIndexHierarchy();
+
+ Map<DirectoryProvider, LuceneIndexingParameters> getDirectoryProviderIndexingParams();
+}
14 years, 7 months
Hibernate SVN: r19862 - in search/trunk/hibernate-search/src/test/java/org/hibernate/search/test: id/providedId and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:39:01 -0400 (Wed, 30 Jun 2010)
New Revision: 19862
Added:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualConfiguration.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualTransactionContext.java
Removed:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ManualTransactionContext.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/StandaloneConf.java
Modified:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java
Log:
Share test harness for manual HSearch usage
Share manual configuration and manual transaction context demarcation code
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java 2010-06-30 13:38:13 UTC (rev 19861)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/configuration/ProgrammaticMappingTest.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -60,7 +60,7 @@
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.test.SearchTestCase;
import org.hibernate.search.test.analyzer.inheritance.ISOLatin1Analyzer;
-import org.hibernate.search.test.id.providedId.ManualTransactionContext;
+import org.hibernate.search.test.util.ManualTransactionContext;
import org.hibernate.search.util.LoggerFactory;
import org.slf4j.Logger;
Deleted: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ManualTransactionContext.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ManualTransactionContext.java 2010-06-30 13:38:13 UTC (rev 19861)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ManualTransactionContext.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -1,63 +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.test.id.providedId;
-
-import java.util.List;
-import java.util.ArrayList;
-import javax.transaction.Synchronization;
-import javax.transaction.Status;
-
-import org.hibernate.search.backend.TransactionContext;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ManualTransactionContext implements TransactionContext {
- private boolean progress = true;
- private List<Synchronization> syncs = new ArrayList<Synchronization>();
-
- public boolean isTransactionInProgress() {
- return progress;
- }
-
- public Object getTransactionIdentifier() {
- return this;
- }
-
- public void registerSynchronization(Synchronization synchronization) {
- syncs.add(synchronization);
- }
-
- public void end() {
- this.progress = false;
- for (Synchronization sync : syncs) {
- sync.beforeCompletion();
- }
-
- for (Synchronization sync : syncs) {
- sync.afterCompletion( Status.STATUS_COMMITTED );
- }
- }
-}
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java 2010-06-30 13:38:13 UTC (rev 19861)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ProvidedIdTest.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -24,17 +24,22 @@
*/
package org.hibernate.search.test.id.providedId;
+import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TopDocs;
+import org.hibernate.search.Environment;
import org.hibernate.search.backend.Work;
import org.hibernate.search.backend.WorkType;
import org.hibernate.search.engine.SearchFactoryImplementor;
import org.hibernate.search.impl.SearchFactoryBuilder;
import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.RAMDirectoryProvider;
import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.test.util.ManualTransactionContext;
+import org.hibernate.search.test.util.ManualConfiguration;
/**
* @author Navin Surtani
@@ -42,7 +47,14 @@
public class ProvidedIdTest extends junit.framework.TestCase {
public void testProvidedId() throws Exception {
- SearchFactoryImplementor sf = new SearchFactoryBuilder().configuration( new StandaloneConf() ).buildSearchFactory();
+ final ManualConfiguration configuration = new ManualConfiguration()
+ .addClass( ProvidedIdPerson.class )
+ .addClass( ProvidedIdPersonSub.class )
+ .addProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() )
+ .addProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() )
+ .addProperty( "hibernate.search.default.transaction.merge_factor", "100" )
+ .addProperty( "hibernate.search.default.batch.max_buffered_docs", "1000" );
+ SearchFactoryImplementor sf = new SearchFactoryBuilder().configuration( configuration ).buildSearchFactory();
ProvidedIdPerson person1 = new ProvidedIdPerson();
person1.setName( "Big Goat" );
@@ -71,7 +83,7 @@
Query luceneQuery = parser.parse( "Goat" );
//we cannot use FTQuery because @ProvidedId does not provide the getter id and Hibernate Hsearch Query extension
- //needs it. So we use plain Lucene
+ //needs it. So we use plain Lucene
//we know there is only one DP
DirectoryProvider provider = sf
Deleted: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/StandaloneConf.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/StandaloneConf.java 2010-06-30 13:38:13 UTC (rev 19861)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/StandaloneConf.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -1,82 +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.test.id.providedId;
-
-import java.util.Iterator;
-import java.util.Properties;
-import java.util.Map;
-import java.util.HashMap;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-
-import org.hibernate.search.cfg.SearchConfiguration;
-import org.hibernate.search.cfg.SearchMapping;
-import org.hibernate.search.store.RAMDirectoryProvider;
-import org.hibernate.search.Environment;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-
-/**
- * @author Emmanuel Bernard
- */
-public class StandaloneConf implements SearchConfiguration {
- final Map<String,Class<?>> classes;
- final Properties properties;
-
- public StandaloneConf() {
- classes = new HashMap<String,Class<?>>(2);
- classes.put( ProvidedIdPerson.class.getName(), ProvidedIdPerson.class );
- classes.put( ProvidedIdPersonSub.class.getName(), ProvidedIdPersonSub.class );
-
- properties = new Properties( );
- properties.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
- properties.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- properties.setProperty( "hibernate.search.default.transaction.merge_factor", "100" );
- properties.setProperty( "hibernate.search.default.batch.max_buffered_docs", "1000" );
- }
-
- public Iterator<Class<?>> getClassMappings() {
- return classes.values().iterator();
- }
-
- public Class<?> getClassMapping(String name) {
- return classes.get( name );
- }
-
- public String getProperty(String propertyName) {
- return properties.getProperty( propertyName );
- }
-
- public Properties getProperties() {
- return properties;
- }
-
- public ReflectionManager getReflectionManager() {
- return null;
- }
-
- public SearchMapping getProgrammaticMapping() {
- return null;
- }
-}
Copied: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualConfiguration.java (from rev 19861, search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/StandaloneConf.java)
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualConfiguration.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualConfiguration.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -0,0 +1,84 @@
+/* $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.test.util;
+
+import java.util.Iterator;
+import java.util.Properties;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.hibernate.search.cfg.SearchConfiguration;
+import org.hibernate.search.cfg.SearchMapping;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+
+/**
+ * Manually defines the configuration
+ * Classes and properties are the only implemented options at the moment
+ *
+ * @author Emmanuel Bernard
+ */
+public class ManualConfiguration implements SearchConfiguration {
+ final Map<String,Class<?>> classes;
+ final Properties properties;
+
+ public ManualConfiguration() {
+ classes = new HashMap<String,Class<?>>();
+ properties = new Properties( );
+ }
+
+ public ManualConfiguration addProperty(String key , String value) {
+ properties.setProperty( key, value );
+ return this;
+ }
+
+ public ManualConfiguration addClass(Class<?> indexed) {
+ classes.put( indexed.getName(), indexed );
+ return this;
+ }
+
+ public Iterator<Class<?>> getClassMappings() {
+ return classes.values().iterator();
+ }
+
+ public Class<?> getClassMapping(String name) {
+ return classes.get( name );
+ }
+
+ public String getProperty(String propertyName) {
+ return properties.getProperty( propertyName );
+ }
+
+ public Properties getProperties() {
+ return properties;
+ }
+
+ public ReflectionManager getReflectionManager() {
+ return null;
+ }
+
+ public SearchMapping getProgrammaticMapping() {
+ return null;
+ }
+}
Copied: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualTransactionContext.java (from rev 19861, search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/id/providedId/ManualTransactionContext.java)
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualTransactionContext.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/util/ManualTransactionContext.java 2010-06-30 13:39:01 UTC (rev 19862)
@@ -0,0 +1,63 @@
+/* $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.test.util;
+
+import java.util.List;
+import java.util.ArrayList;
+import javax.transaction.Synchronization;
+import javax.transaction.Status;
+
+import org.hibernate.search.backend.TransactionContext;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManualTransactionContext implements TransactionContext {
+ private boolean progress = true;
+ private List<Synchronization> syncs = new ArrayList<Synchronization>();
+
+ public boolean isTransactionInProgress() {
+ return progress;
+ }
+
+ public Object getTransactionIdentifier() {
+ return this;
+ }
+
+ public void registerSynchronization(Synchronization synchronization) {
+ syncs.add(synchronization);
+ }
+
+ public void end() {
+ this.progress = false;
+ for (Synchronization sync : syncs) {
+ sync.beforeCompletion();
+ }
+
+ for (Synchronization sync : syncs) {
+ sync.afterCompletion( Status.STATUS_COMMITTED );
+ }
+ }
+}
14 years, 7 months
Hibernate SVN: r19861 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: engine and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-06-30 09:38:13 -0400 (Wed, 30 Jun 2010)
New Revision: 19861
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/QueueProcessors.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java
Log:
Fix abusive raw use of generics params
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java 2010-06-30 13:25:04 UTC (rev 19860)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java 2010-06-30 13:38:13 UTC (rev 19861)
@@ -49,7 +49,7 @@
private final List<LuceneWork> queue;
private final SearchFactoryImplementor searchFactoryImplementor;
- private final Map<DirectoryProvider,PerDPResources> resourcesMap;
+ private final Map<DirectoryProvider<?>,PerDPResources> resourcesMap;
private final boolean sync;
private final ErrorHandler errorHandler;
@@ -58,7 +58,7 @@
LuceneBackendQueueProcessor(List<LuceneWork> queue,
SearchFactoryImplementor searchFactoryImplementor,
- Map<DirectoryProvider,PerDPResources> resourcesMap,
+ Map<DirectoryProvider<?>,PerDPResources> resourcesMap,
boolean syncMode) {
this.sync = syncMode;
this.queue = queue;
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/QueueProcessors.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/QueueProcessors.java 2010-06-30 13:25:04 UTC (rev 19860)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/lucene/QueueProcessors.java 2010-06-30 13:38:13 UTC (rev 19861)
@@ -45,10 +45,11 @@
*/
class QueueProcessors implements PerDirectoryWorkProcessor {
- private final Map<DirectoryProvider, PerDPResources> resourcesMap;
- private final Map<DirectoryProvider, PerDPQueueProcessor> dpProcessors = new HashMap<DirectoryProvider, PerDPQueueProcessor>();
+ private final Map<DirectoryProvider<?>, PerDPResources> resourcesMap;
+ private final Map<DirectoryProvider<?>, PerDPQueueProcessor> dpProcessors
+ = new HashMap<DirectoryProvider<?>, PerDPQueueProcessor>();
- QueueProcessors(Map<DirectoryProvider, PerDPResources> resourcesMap) {
+ QueueProcessors(Map<DirectoryProvider<?>, PerDPResources> resourcesMap) {
this.resourcesMap = resourcesMap;
}
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-30 13:25:04 UTC (rev 19860)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderContainedEntity.java 2010-06-30 13:38:13 UTC (rev 19861)
@@ -238,7 +238,7 @@
}
protected Analyzer getAnalyzer(org.hibernate.search.annotations.Analyzer analyzerAnn, ConfigContext context) {
- Class analyzerClass = analyzerAnn == null ? void.class : analyzerAnn.impl();
+ Class<?> analyzerClass = analyzerAnn == null ? void.class : analyzerAnn.impl();
if ( analyzerClass == void.class ) {
String definition = analyzerAnn == null ? "" : analyzerAnn.definition();
if ( StringHelper.isEmpty( definition ) ) {
@@ -325,7 +325,7 @@
"Multiple Similarities defined in the same class hierarchy: " + beanClass.getName()
);
}
- Class similarityClass = similarityAnn.impl();
+ Class<?> similarityClass = similarityAnn.impl();
try {
similarity = ( Similarity ) similarityClass.newInstance();
}
@@ -751,16 +751,16 @@
throw new AssertionFailure( "A non indexed entity is post processed" );
}
//this method does not requires synchronization
- Class plainClass = reflectionManager.toClass( beanClass );
+ Class<?> plainClass = reflectionManager.toClass( beanClass );
Set<Class<?>> tempMappedSubclasses = new HashSet<Class<?>>();
//together with the caller this creates a o(2), but I think it's still faster than create the up hierarchy for each class
- for ( Class currentClass : indexedClasses ) {
+ for ( Class<?> currentClass : indexedClasses ) {
if ( plainClass != currentClass && plainClass.isAssignableFrom( currentClass ) ) {
tempMappedSubclasses.add( currentClass );
}
}
this.mappedSubclasses = Collections.unmodifiableSet( tempMappedSubclasses );
- Class superClass = plainClass.getSuperclass();
+ Class<?> superClass = plainClass.getSuperclass();
this.isRoot = true;
while ( superClass != null ) {
if ( indexedClasses.contains( superClass ) ) {
14 years, 7 months
Hibernate SVN: r19860 - in core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers: entities and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: steve.ebersole(a)jboss.com
Date: 2010-06-30 09:25:04 -0400 (Wed, 30 Jun 2010)
New Revision: 19860
Modified:
core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
Log:
pulled over the latest changes from trunk to get envers tests running
Modified: core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java
===================================================================
--- core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java 2010-06-30 11:50:41 UTC (rev 19859)
+++ core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/configuration/metadata/BasicMetadataGenerator.java 2010-06-30 13:25:04 UTC (rev 19860)
@@ -34,8 +34,6 @@
import org.hibernate.mapping.SimpleValue;
import org.hibernate.mapping.Value;
import org.hibernate.type.BasicType;
-import org.hibernate.type.CompositeCustomType;
-import org.hibernate.type.CustomType;
import org.hibernate.type.Type;
/**
@@ -43,66 +41,40 @@
* @author Adam Warski (adam at warski dot org)
*/
public final class BasicMetadataGenerator {
+ @SuppressWarnings({"unchecked"})
boolean addBasic(Element parent, PropertyAuditingData propertyAuditingData,
Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
Type type = value.getType();
- if ( type instanceof BasicType ) {
- addSimpleValue(parent, propertyAuditingData, value, mapper, insertable, key);
- } else if (type instanceof CustomType || type instanceof CompositeCustomType) {
- addCustomValue(parent, propertyAuditingData, value, mapper, insertable, key);
- } else if ("org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
- addSimpleValue(parent, propertyAuditingData, value, mapper, insertable, key);
- } else {
- return false;
- }
+ if (type instanceof BasicType || "org.hibernate.type.PrimitiveByteArrayBlobType".equals(type.getClass().getName())) {
+ if (parent != null) {
+ boolean addNestedType = (value instanceof SimpleValue) && ((SimpleValue) value).getTypeParameters() != null;
- return true;
- }
+ Element prop_mapping = MetadataTools.addProperty(parent, propertyAuditingData.getName(),
+ addNestedType ? null : value.getType().getName(), propertyAuditingData.isForceInsertable() || insertable, key);
+ MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
- @SuppressWarnings({"unchecked"})
- private void addSimpleValue(Element parent, PropertyAuditingData propertyAuditingData,
- Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
- if (parent != null) {
- Element prop_mapping = MetadataTools.addProperty(parent, propertyAuditingData.getName(),
- value.getType().getName(), propertyAuditingData.isForceInsertable() || insertable, key);
- MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
- }
+ if (addNestedType) {
+ Properties typeParameters = ((SimpleValue) value).getTypeParameters();
+ Element type_mapping = prop_mapping.addElement("type");
+ type_mapping.addAttribute("name", value.getType().getName());
- // A null mapper means that we only want to add xml mappings
- if (mapper != null) {
- mapper.add(propertyAuditingData.getPropertyData());
- }
- }
+ for (java.util.Map.Entry paramKeyValue : typeParameters.entrySet()) {
+ Element type_param = type_mapping.addElement("param");
+ type_param.addAttribute("name", (String) paramKeyValue.getKey());
+ type_param.setText((String) paramKeyValue.getValue());
+ }
+ }
+ }
- @SuppressWarnings({"unchecked"})
- private void addCustomValue(Element parent, PropertyAuditingData propertyAuditingData,
- Value value, SimpleMapperBuilder mapper, boolean insertable, boolean key) {
- if (parent != null) {
- Element prop_mapping = MetadataTools.addProperty(parent, propertyAuditingData.getName(),
- null, insertable, key);
-
- //CustomType propertyType = (CustomType) value.getType();
-
- Element type_mapping = prop_mapping.addElement("type");
- type_mapping.addAttribute("name", value.getType().getName());
-
- if (value instanceof SimpleValue) {
- Properties typeParameters = ((SimpleValue) value).getTypeParameters();
- if (typeParameters != null) {
- for (java.util.Map.Entry paramKeyValue : typeParameters.entrySet()) {
- Element type_param = type_mapping.addElement("param");
- type_param.addAttribute("name", (String) paramKeyValue.getKey());
- type_param.setText((String) paramKeyValue.getValue());
- }
- }
- }
-
- MetadataTools.addColumns(prop_mapping, (Iterator<Column>) value.getColumnIterator());
+ // A null mapper means that we only want to add xml mappings
+ if (mapper != null) {
+ mapper.add(propertyAuditingData.getPropertyData());
+ }
+ } else {
+ return false;
}
- if (mapper != null) {
- mapper.add(propertyAuditingData.getPropertyData());
- }
+ return true;
}
}
Modified: core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java
===================================================================
--- core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-06-30 11:50:41 UTC (rev 19859)
+++ core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/EntityConfiguration.java 2010-06-30 13:25:04 UTC (rev 19860)
@@ -100,12 +100,12 @@
return propertyMapper;
}
- // For use by EntitiesConfigurations
-
- String getParentEntityName() {
+ public String getParentEntityName() {
return parentEntityName;
}
+ // For use by EntitiesConfigurations
+
String getVersionsEntityName() {
return versionsEntityName;
}
Modified: core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java
===================================================================
--- core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-06-30 11:50:41 UTC (rev 19859)
+++ core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/entities/mapper/ComponentPropertyMapper.java 2010-06-30 13:25:04 UTC (rev 19860)
@@ -27,16 +27,15 @@
import java.util.List;
import java.util.Map;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.entities.PropertyData;
-import org.hibernate.envers.configuration.AuditConfiguration;
import org.hibernate.envers.exception.AuditException;
import org.hibernate.envers.reader.AuditReaderImplementor;
import org.hibernate.envers.tools.reflection.ReflectionTools;
-
-import org.hibernate.collection.PersistentCollection;
import org.hibernate.property.Setter;
import org.hibernate.util.ReflectHelper;
-import org.hibernate.engine.SessionImplementor;
/**
* @author Adam Warski (adam at warski dot org)
@@ -84,8 +83,11 @@
}
}
- // And we don't have to set anything on the object - the default value is null
- if (!allNullAndSingle) {
+ if (allNullAndSingle) {
+ // single property, but default value need not be null, so we'll set it to null anyway
+ setter.set(obj, null, null);
+ } else {
+ // set the component
try {
Object subObj = ReflectHelper.getDefaultConstructor(
Thread.currentThread().getContextClassLoader().loadClass(componentClassName)).newInstance();
@@ -97,7 +99,7 @@
}
}
- public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
+ public List<PersistentCollectionChangeData> mapCollectionChanges(String referencingPropertyName,
PersistentCollection newColl,
Serializable oldColl,
Serializable id) {
Modified: core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java
===================================================================
--- core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-06-30 11:50:41 UTC (rev 19859)
+++ core/branches/gradle2/hibernate-envers/src/main/java/org/hibernate/envers/event/AuditEventListener.java 2010-06-30 13:25:04 UTC (rev 19860)
@@ -27,6 +27,7 @@
import java.util.List;
import org.hibernate.envers.configuration.AuditConfiguration;
+import org.hibernate.envers.entities.EntityConfiguration;
import org.hibernate.envers.entities.RelationDescription;
import org.hibernate.envers.entities.RelationType;
import org.hibernate.envers.entities.mapper.PersistentCollectionChangeData;
@@ -264,7 +265,7 @@
// Checking if this is not a "fake" many-to-one bidirectional relation. The relation description may be
// null in case of collections of non-entities.
- RelationDescription rd = verCfg.getEntCfg().get(entityName).getRelationDescription(referencingPropertyName);
+ RelationDescription rd = searchForRelationDescription(entityName, referencingPropertyName);
if (rd != null && rd.getMappedByPropertyName() != null) {
generateFakeBidirecationalRelationWorkUnits(auditProcess, newColl, oldColl, entityName,
referencingPropertyName, event, rd);
@@ -285,6 +286,24 @@
}
}
+ /**
+ * Looks up a relation description corresponding to the given property in the given entity. If no description is
+ * found in the given entity, the parent entity is checked (so that inherited relations work).
+ * @param entityName Name of the entity, in which to start looking.
+ * @param referencingPropertyName The name of the property.
+ * @return A found relation description corresponding to the given entity or {@code null}, if no description can
+ * be found.
+ */
+ private RelationDescription searchForRelationDescription(String entityName, String referencingPropertyName) {
+ EntityConfiguration configuration = verCfg.getEntCfg().get(entityName);
+ RelationDescription rd = configuration.getRelationDescription(referencingPropertyName);
+ if (rd == null && configuration.getParentEntityName() != null) {
+ return searchForRelationDescription(configuration.getParentEntityName(), referencingPropertyName);
+ }
+
+ return rd;
+ }
+
private CollectionEntry getCollectionEntry(AbstractCollectionEvent event) {
return event.getSession().getPersistenceContext().getCollectionEntry(event.getCollection());
}
14 years, 7 months