/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.spi.impl;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* Helper class which keeps track of all super classes and interfaces of known entities.
*/
public class TypeHierarchy {
private static final Log log = LoggerFactory.make();
private Map<Class<?>, Set<Class<?>>> classToConfiguredClass;
public TypeHierarchy() {
classToConfiguredClass = new HashMap<Class<?>, Set<Class<?>>>();
}
public void addConfiguredClass(Class<?> configuredClass) {
addClass( configuredClass, configuredClass );
Class<?> superClass = configuredClass.getSuperclass();
while ( superClass != null ) {
addClass( superClass, configuredClass );
superClass = superClass.getSuperclass();
}
for ( Class<?> clazz : configuredClass.getInterfaces() ) {
addClass( clazz, configuredClass );
}
}
private void addClass(Class<?> superclass, Class<?> indexedClass) {
Set<Class<?>> classesSet = classToConfiguredClass.get( superclass );
if ( classesSet == null ) {
classesSet = new HashSet<Class<?>>();
classToConfiguredClass.put( superclass, classesSet );
}
classesSet.add( indexedClass );
}
public Set<Class<?>> getConfiguredClasses(Class<?>[] classes) {
if ( classes == null ) {
return Collections.<Class<?>>emptySet();
}
Set<Class<?>> indexedClasses = new HashSet<Class<?>>();
for ( Class<?> clazz : classes ) {
Set<Class<?>> set = classToConfiguredClass.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.tracef( "Targeted indexed classes for %s: %s", Arrays.toString( classes ), indexedClasses );
}
return indexedClasses;
}
}