[hibernate-commits] Hibernate SVN: r19869 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/configuration/mutablefactory and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Jun 30 09:43:35 EDT 2010


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 );



More information about the hibernate-commits mailing list