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 );
Show replies by date