/* * 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.cfg; import java.lang.annotation.ElementType; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.Map; import java.util.Set; import org.hibernate.search.exception.SearchException; import org.hibernate.search.annotations.ClassBridge; import org.hibernate.search.bridge.FieldBridge; /** * @author Emmanuel Bernard */ public class EntityDescriptor { private Map<String, Object> indexed; private final Map<PropertyKey, PropertyDescriptor> properties = new HashMap<PropertyKey, PropertyDescriptor>(); private Map<String, Object> boost; private Map<String, Object> analyzerDiscriminator; private final Set<Map<String, Object>> fullTextFilterDefs = new HashSet<Map<String, Object>>(); private Map<String, Object> providedId; /** * Configured class bridges. Each bridge is represented by a map with {@code @ClassBridge} annotation member values * keyed by annotation member name. */ private final Set<Map<String, Object>> classBridges = new HashSet<Map<String, Object>>(); /** * Class bridge instances and their configuration */ private final Map<FieldBridge, Map<String, Object>> classBridgeInstanceDefs = new IdentityHashMap<FieldBridge, Map<String,Object>>(); /** * Class bridge instances and their configuration in form of a {@code ClassBridge} annotation */ private final Map<FieldBridge, ClassBridge> classBridgeConfigurations = new IdentityHashMap<FieldBridge, ClassBridge>(); private final Set<Map<String, Object>> spatials = new HashSet<Map<String, Object>>(); private Map<String, Object> dynamicBoost; public Map<String, Object> getIndexed() { return indexed; } public void setIndexed(Map<String, Object> indexed) { this.indexed = indexed; } PropertyDescriptor getProperty(String name, ElementType type) { PropertyKey propertyKey = new PropertyKey( name, type ); PropertyDescriptor descriptor = properties.get( propertyKey ); if ( descriptor == null ) { descriptor = new PropertyDescriptor( name, type ); properties.put( propertyKey, descriptor ); } return descriptor; } public PropertyDescriptor getPropertyDescriptor(String name, ElementType type) { return properties.get( new PropertyKey( name, type ) ); } /** * This feature will be removed, with no replacement * as caching fields is no longer effective. * @return This will always return an empty Map. * @deprecated This will be removed with no replacement. */ @Deprecated public Map<String, Object> getCacheInMemory() { return Collections.<String, Object>emptyMap(); } /** * This feature will be removed, with no replacement * as caching fields is no longer effective. * @param cacheInMemory this parameter will be ignored. * @deprecated This will be removed with no replacement. */ @Deprecated public void setCacheInMemory(Map<String, Object> cacheInMemory) { //No-op: this feature is no longer available } public void setBoost(Map<String, Object> boost) { this.boost = boost; } public Map<String, Object> getBoost() { return boost; } public void setAnalyzerDiscriminator(Map<String, Object> analyzerDiscriminator) { this.analyzerDiscriminator = analyzerDiscriminator; } public Map<String, Object> getAnalyzerDiscriminator() { return analyzerDiscriminator; } public Set<Map<String, Object>> getFullTextFilterDefs() { return fullTextFilterDefs; } public void addFulltextFilterDef(Map<String, Object> fullTextFilterDef) { fullTextFilterDefs.add( fullTextFilterDef ); } public void addClassBridgeDef(Map<String, Object> classBridge) { classBridges.add( classBridge ); } public void addClassBridgeInstanceDef(FieldBridge classBridge, Map<String, Object> properties) { Map<String, Object> previous = classBridgeInstanceDefs.put( classBridge, properties ); if ( previous != null ) { throw new SearchException( "The same field bridge instance must not be passed more than once." ); } } public Set<Map<String, Object>> getClassBridgeDefs() { return classBridges; } public Map<FieldBridge, Map<String, Object>> getClassBridgeInstanceDefs() { return classBridgeInstanceDefs; } public void addClassBridgeInstanceConfiguration(FieldBridge classBridge, ClassBridge configuration) { classBridgeConfigurations.put( classBridge, configuration ); } public Map<FieldBridge, ClassBridge> getClassBridgeConfigurations() { return classBridgeConfigurations; } public void addSpatial(Map<String,Object> spatial) { spatials.add( spatial ); } public Set<Map<String, Object>> getSpatials() { return spatials; } public void setProvidedId(Map<String, Object> providedId) { this.providedId = providedId; } public Map<String, Object> getProvidedId() { return this.providedId; } public void setDynamicBoost(Map<String, Object> dynamicEntityBoost) { this.dynamicBoost = dynamicEntityBoost; } public Map<String, Object> getDynamicBoost() { return this.dynamicBoost; } private static class PropertyKey { private final String name; private final ElementType type; PropertyKey(String name, ElementType type) { this.name = name; this.type = type; } @Override public boolean equals(Object o) { if ( this == o ) { return true; } if ( o == null || getClass() != o.getClass() ) { return false; } PropertyKey property = (PropertyKey) o; if ( name != null ? !name.equals( property.name ) : property.name != null ) { return false; } if ( type != property.type ) { return false; } return true; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + ( type != null ? type.hashCode() : 0 ); return result; } } }