/*
* Initialize the document builder
* This algorithm seems to be safe for incremental search factories.
*/
private void initDocumentBuilders(SearchConfiguration searchConfiguration, BuildContext buildContext, SearchMapping searchMapping) {
ConfigContext configContext = new ConfigContext( searchConfiguration, buildContext, searchMapping );
initProgrammaticAnalyzers( configContext, searchConfiguration.getReflectionManager() );
initProgrammaticallyDefinedFilterDef( searchConfiguration.getReflectionManager() );
final PolymorphicIndexHierarchy indexingHierarchy = factoryState.getIndexHierarchy();
final Map<Class<?>, EntityIndexBinding> documentBuildersIndexedEntities = factoryState.getIndexBindings();
final Map<Class<?>, DocumentBuilderContainedEntity<?>> documentBuildersContainedEntities = factoryState.getDocumentBuildersContainedEntities();
final Set<XClass> optimizationBlackListedTypes = new HashSet<XClass>();
final Map<XClass, Class<?>> classMappings = initializeClassMappings(
searchConfiguration,
searchConfiguration.getReflectionManager()
);
//we process the @Indexed classes last, so we first start all IndexManager(s).
final List<XClass> rootIndexedEntities = new LinkedList<XClass>();
final org.hibernate.search.engine.metadata.impl.MetadataProvider metadataProvider =
new AnnotationMetadataProvider( searchConfiguration.getReflectionManager(), configContext );
for ( Map.Entry<XClass, Class<?>> mapping : classMappings.entrySet() ) {
XClass mappedXClass = mapping.getKey();
Class<?> mappedClass = mapping.getValue();
if ( mappedXClass.isAnnotationPresent( Indexed.class ) ) {
if ( mappedXClass.isAbstract() ) {
log.abstractClassesCannotInsertDocuments( mappedXClass.getName() );
continue;
}
rootIndexedEntities.add( mappedXClass );
indexingHierarchy.addIndexedClass( mappedClass );
}
else if ( metadataProvider.containsSearchMetadata( mappedClass ) ) {
//FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
//XClass unfortunately is not (yet) genericized: TODO?
TypeMetadata typeMetadata = metadataProvider.getTypeMetadataFor( mappedClass );
final DocumentBuilderContainedEntity<?> documentBuilder = new DocumentBuilderContainedEntity(
mappedXClass,
typeMetadata,
searchConfiguration.getReflectionManager(),
optimizationBlackListedTypes,
searchConfiguration.getInstanceInitializer()
);
//TODO enhance that, I don't like to expose EntityState
if ( documentBuilder.getEntityState() != EntityState.NON_INDEXABLE ) {
documentBuildersContainedEntities.put( mappedClass, documentBuilder );
}
}
bindFilterDefs( mappedXClass );
//TODO should analyzer def for classes at their same level???
}
IndexManagerHolder indexesFactory = factoryState.getAllIndexesManager();
// Create all IndexManagers, configure and start them:
for ( XClass mappedXClass : rootIndexedEntities ) {
Class mappedClass = classMappings.get( mappedXClass );
MutableEntityIndexBinding entityIndexBinding = indexesFactory.buildEntityIndexBinding(
mappedXClass,
mappedClass,
searchConfiguration,
buildContext
);
// interceptor might use non indexed state
if ( entityIndexBinding.getEntityIndexingInterceptor() != null ) {
optimizationBlackListedTypes.add( mappedXClass );
}
// Create all DocumentBuilderIndexedEntity
// FIXME DocumentBuilderIndexedEntity needs to be built by a helper method receiving Class<T> to infer T properly
// XClass unfortunately is not (yet) genericized: TODO ?
TypeMetadata typeMetadata = metadataProvider.getTypeMetadataFor( mappedClass );
final DocumentBuilderIndexedEntity<?> documentBuilder =
new DocumentBuilderIndexedEntity(
mappedXClass,
typeMetadata,
configContext,
searchConfiguration.getReflectionManager(),
optimizationBlackListedTypes,
searchConfiguration.getInstanceInitializer()
);
entityIndexBinding.setDocumentBuilderIndexedEntity( documentBuilder );
documentBuildersIndexedEntities.put( mappedClass, entityIndexBinding );
}
disableBlackListedTypesOptimization(
classMappings,
optimizationBlackListedTypes,
documentBuildersIndexedEntities,
documentBuildersContainedEntities
);
factoryState.setAnalyzers( configContext.initLazyAnalyzers() );
}