Author: epbernard
Date: 2006-10-13 18:27:43 -0400 (Fri, 13 Oct 2006)
New Revision: 10577
Added:
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java
Log:
ANN-457 Support for field annotations (Richard Hallier)
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Boost.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -13,7 +13,7 @@
* @author Emmanuel Bernard
*/
@Retention(RetentionPolicy.RUNTIME)
-(a)Target({ElementType.TYPE, ElementType.METHOD})
+(a)Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Documented
public @interface Boost {
float value();
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/DocumentBuilder.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -2,10 +2,6 @@
package org.hibernate.lucene;
import java.io.Serializable;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
@@ -25,26 +21,38 @@
import org.hibernate.lucene.event.LuceneEventListener;
import org.hibernate.lucene.store.DirectoryProvider;
import org.hibernate.lucene.util.BinderHelper;
+import org.hibernate.reflection.ReflectionManager;
+import org.hibernate.reflection.XAnnotatedElement;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.XMember;
+import org.hibernate.reflection.XProperty;
import org.hibernate.util.ReflectHelper;
-//TODO handle attribute (only getters are handled currently)
+/**
+ * Set up and provide a manager for indexes classes
+ *
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ * @author Richard Hallier
+ */
public class DocumentBuilder<T> {
static {
Version.touch(); //touch version
}
- private final List<Member> keywordGetters = new ArrayList<Member>();
+ private final List<XMember> keywordGetters = new ArrayList<XMember>();
private final List<String> keywordNames = new ArrayList<String>();
private final List<FieldBridge> keywordBridges = new
ArrayList<FieldBridge>();
- private final List<Member> unstoredGetters = new ArrayList<Member>();
+ private final List<XMember> unstoredGetters = new ArrayList<XMember>();
private final List<String> unstoredNames = new ArrayList<String>();
private final List<FieldBridge> unstoredBridges = new
ArrayList<FieldBridge>();
- private final List<Member> textGetters = new ArrayList<Member>();
+ private final List<XMember> textGetters = new ArrayList<XMember>();
private final List<String> textNames = new ArrayList<String>();
private final List<FieldBridge> textBridges = new
ArrayList<FieldBridge>();
- private final Class<T> beanClass;
+ private final XClass beanClass;
private final DirectoryProvider directoryProvider;
private String idKeywordName;
private final Analyzer analyzer;
@@ -52,118 +60,131 @@
public static final String CLASS_FIELDNAME = "_hibernate_class";
private FieldBridge idBridge;
private Set<Class> mappedSubclasses = new HashSet<Class>();
+ private ReflectionManager reflectionManager;
- public DocumentBuilder(Class<T> clazz, Analyzer analyzer, DirectoryProvider
directory) {
+ public DocumentBuilder(XClass clazz, Analyzer analyzer, DirectoryProvider directory,
ReflectionManager reflectionManager) {
this.beanClass = clazz;
this.analyzer = analyzer;
this.directoryProvider = directory;
+ //FIXME get rid of it when boost is stored?
+ this.reflectionManager = reflectionManager;
- for (Class currClass = clazz; currClass != null; currClass =
currClass.getSuperclass()) {
- Method[] methods = currClass.getDeclaredMethods();
- for (int i = 0; i < methods.length; i++) {
- Method method = methods[i];
- Keyword keywordAnn = method.getAnnotation(Keyword.class);
- if (keywordAnn != null) {
- String name = BinderHelper.getAttributeName( method,
keywordAnn.name() );
- if ( keywordAnn.id() ) {
- idKeywordName = name;
- idBoost = getBoost(method);
- idBridge = BridgeFactory.guessType(method);
- } else {
- setAccessible(method);
- keywordGetters.add(method);
- keywordNames.add(name);
- keywordBridges.add( BridgeFactory.guessType(method) );
- }
- }
- Unstored unstoredAnn = method.getAnnotation(Unstored.class);
- if (unstoredAnn != null) {
- setAccessible(method);
- unstoredGetters.add(method);
- unstoredNames.add(BinderHelper.getAttributeName( method,
unstoredAnn.name() ) );
- unstoredBridges.add( BridgeFactory.guessType(method) );
- }
- Text textAnn = method.getAnnotation(Text.class);
- if (textAnn != null) {
- textGetters.add(method);
- textNames.add( BinderHelper.getAttributeName( method, textAnn.name()
) );
- textBridges.add( BridgeFactory.guessType(method) );
- }
+ if (clazz == null) throw new AssertionFailure("Unable to build a
DocumentBuilder with a null class");
+
+ for ( XClass currClass = beanClass; currClass != null; currClass =
currClass.getSuperclass() ) {
+ //rejecting non properties because the object is loaded from Hibernate, so
indexing a non property does not make sense
+ List<XProperty> methods = currClass.getDeclaredProperties(
XClass.ACCESS_PROPERTY );
+ for ( XProperty method : methods ) {
+ initializeMember( method );
}
+
+ List<XProperty> fields = currClass.getDeclaredProperties(
XClass.ACCESS_FIELD );
+ for ( XProperty field : fields ) {
+ initializeMember( field );
+ }
}
- if (idKeywordName == null) {
- throw new HibernateException("No id Keyword for: " +
clazz.getName());
+ if ( idKeywordName == null ) {
+ throw new HibernateException( "No id Keyword for: " +
clazz.getName() );
}
}
+ private void initializeMember(XMember member) {
+ Keyword keywordAnn = member.getAnnotation( Keyword.class );
+ if ( keywordAnn != null ) {
+ String name = BinderHelper.getAttributeName( member, keywordAnn.name() );
+ if ( keywordAnn.id() ) {
+ idKeywordName = name;
+ idBoost = getBoost( member );
+ idBridge = BridgeFactory.guessType( member );
+ }
+ else {
+ setAccessible( member );
+ keywordGetters.add( member );
+ keywordNames.add( name );
+ keywordBridges.add( BridgeFactory.guessType( member ) );
+ }
+ }
- private Float getBoost(AnnotatedElement element) {
- if (element == null) return null;
- Boost boost = element.getAnnotation(Boost.class);
- return boost != null ? Float.valueOf(boost.value()) : null;
- }
+ Unstored unstoredAnn = member.getAnnotation( Unstored.class );
+ if ( unstoredAnn != null ) {
+ setAccessible( member );
+ unstoredGetters.add( member );
+ unstoredNames.add( BinderHelper.getAttributeName( member, unstoredAnn.name()
) );
+ unstoredBridges.add( BridgeFactory.guessType( member ) );
+ }
- private Object getValue(Member member, T bean) {
- try {
- if (member instanceof java.lang.reflect.Field) {
- return ((java.lang.reflect.Field) member).get(bean);
- } else if (member instanceof Method) {
- return ((Method) member).invoke(bean);
- } else {
- throw new AssertionFailure("Unexpected member: " +
member.getClass().getName());
- }
+ Text textAnn = member.getAnnotation( Text.class );
+ if ( textAnn != null ) {
+ setAccessible( member );
+ textGetters.add( member );
+ textNames.add( BinderHelper.getAttributeName( member, textAnn.name() ) );
+ textBridges.add( BridgeFactory.guessType( member ) );
}
- catch (Exception e) {
- throw new IllegalStateException("Could not get property value",
e);
- }
}
+
+ private Float getBoost(XAnnotatedElement element) {
+ if ( element == null ) return null;
+ Boost boost = element.getAnnotation( Boost.class );
+ return boost != null ?
+ boost.value() :
+ null;
+ }
+
+ private Object getMemberValue(T bean, XMember getter) {
+ Object value;
+ try {
+ value = getter.invoke( bean );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Could not get property value", e );
+ }
+ return value;
+ }
+
public Document getDocument(T instance, Serializable id) {
Document doc = new Document();
- Float boost = getBoost(instance.getClass());
- if (boost != null) {
- doc.setBoost(boost.floatValue());
+ XClass instanceClass = reflectionManager.toXClass( instance.getClass() );
+ Float boost = getBoost( instanceClass );
+ if ( boost != null ) {
+ doc.setBoost( boost );
}
{
- Field classField = new Field(CLASS_FIELDNAME, instance.getClass().getName(),
Field.Store.YES, Field.Index.NO);
- doc.add(classField);
- idBridge.set(idKeywordName, id, doc, Field.Store.YES,
Field.Index.UN_TOKENIZED, idBoost);
+ Field classField =
+ new Field( CLASS_FIELDNAME, instanceClass.getName(), Field.Store.YES,
Field.Index.NO );
+ doc.add( classField );
+ idBridge.set( idKeywordName, id, doc, Field.Store.YES,
Field.Index.UN_TOKENIZED, idBoost );
}
- for (int i = 0; i < keywordNames.size(); i++) {
- Member member = keywordGetters.get(i);
- Object value = getValue(member, instance);
- keywordBridges.get(i).set(
- keywordNames.get(i), value, doc, Field.Store.YES,
- Field.Index.UN_TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < keywordNames.size(); i++ ) {
+ XMember member = keywordGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ keywordBridges.get( i ).set(
+ keywordNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.UN_TOKENIZED, getBoost( member )
);
}
- for (int i = 0; i < textNames.size(); i++) {
- Member member = textGetters.get(i);
- Object value = getValue(member, instance);
- textBridges.get(i).set(
- textNames.get(i), value, doc, Field.Store.YES,
- Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < textNames.size(); i++ ) {
+ XMember member = textGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ textBridges.get( i ).set(
+ textNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.TOKENIZED, getBoost( member )
);
}
- for (int i = 0; i < unstoredNames.size(); i++) {
- Member member = unstoredGetters.get(i);
- Object value = getValue(member, instance);
- unstoredBridges.get(i).set(
- unstoredNames.get(i), value, doc, Field.Store.NO,
- Field.Index.TOKENIZED, getBoost( (AnnotatedElement) member )
+ for ( int i = 0; i < unstoredNames.size(); i++ ) {
+ XMember member = unstoredGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ unstoredBridges.get( i ).set(
+ unstoredNames.get( i ), value, doc, Field.Store.NO,
+ Field.Index.TOKENIZED, getBoost( member )
);
}
return doc;
}
- private void boostField(Field field, Member member) {
- Float boost = getBoost((AnnotatedElement) member);
- if (boost != null) field.setBoost(boost.floatValue());
- }
-
public Term getTerm(Serializable id) {
- return new Term(idKeywordName, id.toString());
+ return new Term( idKeywordName, id.toString() );
}
public DirectoryProvider getDirectoryProvider() {
@@ -174,9 +195,9 @@
return analyzer;
}
- private static void setAccessible(Member member) {
- if (!Modifier.isPublic(member.getModifiers())) {
- ((AccessibleObject) member).setAccessible(true);
+ private static void setAccessible(XMember member) {
+ if ( !Modifier.isPublic( member.getModifiers() ) ) {
+ member.setAccessible( true );
}
}
@@ -189,31 +210,30 @@
}
public static Class getDocumentClass(Document document) {
- String className = document.get(DocumentBuilder.CLASS_FIELDNAME);
+ String className = document.get( DocumentBuilder.CLASS_FIELDNAME );
try {
- return ReflectHelper.classForName(className);
+ return ReflectHelper.classForName( className );
}
catch (ClassNotFoundException e) {
- throw new HibernateException("Unable to load indexed class: " +
className, e);
+ throw new HibernateException( "Unable to load indexed class: " +
className, e );
}
}
public static Serializable getDocumentId(LuceneEventListener listener, Class clazz,
Document document) {
- DocumentBuilder builder = listener.getDocumentBuilders().get(clazz);
- if (builder == null) throw new HibernateException("No Lucene configuration
set up for: " + clazz.getName());
- Serializable id = (Serializable)
builder.getIdBridge().get(builder.getIdKeywordName(), document);
- return id;
+ DocumentBuilder builder = listener.getDocumentBuilders().get( clazz );
+ if ( builder == null ) throw new HibernateException( "No Lucene
configuration set up for: " + clazz.getName() );
+ return (Serializable) builder.getIdBridge().get( builder.getIdKeywordName(),
document );
}
public void postInitialize(Set<Class> indexedClasses) {
//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) {
- if (beanClass.isAssignableFrom(currentClass))
tempMappedSubclasses.add(currentClass);
+ for ( Class currentClass : indexedClasses ) {
+ if ( plainClass.isAssignableFrom( currentClass ) ) tempMappedSubclasses.add(
currentClass );
}
- mappedSubclasses = Collections.unmodifiableSet(tempMappedSubclasses);
+ mappedSubclasses = Collections.unmodifiableSet( tempMappedSubclasses );
}
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Keyword.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Text.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/Unstored.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -8,7 +8,7 @@
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
-(a)Target(ElementType.METHOD)
+(a)Target({ElementType.METHOD, ElementType.FIELD})
@Documented
/**
* Specifies that a property of an entity is a Lucene
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/bridge/BridgeFactory.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -8,6 +8,8 @@
import java.util.Map;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.XMember;
+import org.hibernate.reflection.XClass;
import org.hibernate.annotations.Parameter;
import org.hibernate.lucene.util.BinderHelper;
@@ -66,9 +68,9 @@
return new String2FieldBridgeAdaptor( date );
}
- public static FieldBridge guessType(Member member) {
+ public static FieldBridge guessType(XMember member) {
FieldBridge bridge = null;
- org.hibernate.lucene.FieldBridge bridgeAnn = ( (AnnotatedElement) member
).getAnnotation( org.hibernate.lucene.FieldBridge.class );
+ org.hibernate.lucene.FieldBridge bridgeAnn = member.getAnnotation(
org.hibernate.lucene.FieldBridge.class );
if (bridgeAnn != null) {
Class impl = bridgeAnn.impl();
try {
@@ -88,15 +90,17 @@
}
}
catch (Exception e) {
- throw new HibernateException("Unable to instanciate FieldBridge for " +
BinderHelper.getAttributeName(member), e );
+ //TODO add classname
+ throw new HibernateException("Unable to instanciate FieldBridge for
" + member.getName(), e );
}
}
else {
//find in built-ins
- Class<?> returnType = BinderHelper.getReturnType( member );
+ XClass returnType = member.getType();
bridge = builtInBridges.get( returnType.getName() );
}
- if (bridge == null) throw new HibernateException("Unable to guess FieldBridge for
" + BinderHelper.getAttributeName(member) );
+ //TODO add classname
+ if (bridge == null) throw new HibernateException("Unable to guess
FieldBridge for " + member.getName() );
return bridge;
}
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/event/LuceneEventListener.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -19,7 +19,11 @@
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.ReflectionManager;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.java.JavaXFactory;
import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.event.Initializable;
import org.hibernate.event.PostDeleteEvent;
import org.hibernate.event.PostDeleteEventListener;
@@ -46,6 +50,7 @@
//TODO work on sharing the same indexWriters and readers across a single post
operation...
public class LuceneEventListener implements PostDeleteEventListener,
PostInsertEventListener,
PostUpdateEventListener, Initializable {
+ ReflectionManager reflectionManager;
//FIXME keeping this here is a bad decision since you might want to search indexes wo
maintain it
@Deprecated
@@ -63,6 +68,8 @@
public void initialize(Configuration cfg) {
if (initialized) return;
+ //yuk
+ reflectionManager = ( (AnnotationConfiguration) cfg
).createExtendedMappings().getReflectionManager();
Class analyzerClass;
String analyzerClassName = cfg.getProperty(Environment.ANALYZER_CLASS);
@@ -99,14 +106,16 @@
PersistentClass clazz = (PersistentClass) iter.next();
Class<?> mappedClass = clazz.getMappedClass();
if (mappedClass != null) {
- if (mappedClass.isAnnotationPresent(Indexed.class)) {
- DirectoryProvider provider =
factory.createDirectoryProvider(mappedClass, cfg);
- final DocumentBuilder<Object> documentBuilder = new
DocumentBuilder<Object>(
- (Class<Object>) mappedClass, analyzer, provider
- );
+ XClass mappedXClass = reflectionManager.toXClass( mappedClass );
+ if ( mappedXClass != null &&
mappedXClass.isAnnotationPresent(Indexed.class) ) {
+ DirectoryProvider provider =
factory.createDirectoryProvider(mappedXClass, cfg);
if (!indexLock.containsKey(provider)) {
indexLock.put(provider, new ReentrantLock());
}
+ final DocumentBuilder<Object> documentBuilder = new
DocumentBuilder<Object>(
+ mappedXClass, analyzer, provider, reflectionManager
+ );
+
documentBuilders.put(mappedClass, documentBuilder);
}
}
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/store/DirectoryProviderFactory.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -7,8 +7,11 @@
import java.util.Properties;
import org.hibernate.HibernateException;
+import org.hibernate.reflection.XClass;
+import org.hibernate.reflection.ReflectionManager;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.lucene.Indexed;
import org.hibernate.util.ReflectHelper;
import org.hibernate.util.StringHelper;
@@ -36,12 +39,14 @@
private static String LUCENE_DEFAULT = LUCENE_PREFIX + "default.";
private static String DEFAULT_DIRECTORY_PROVIDER = FSDirectoryProvider.class.getName();
+ //TODO for the public?
+ //public DirectoryProvider<?> createDirectoryProvider(XClass entity,
Configuration cfg) {
- public DirectoryProvider<?> createDirectoryProvider(Class<?> entity,
Configuration cfg) {
+ public DirectoryProvider<?> createDirectoryProvider(XClass entity,
Configuration cfg) {
//get properties
String directoryProviderName = getDirectoryProviderName( entity, cfg );
Properties indexProps = getDirectoryProperties( cfg, directoryProviderName );
-
+
//set up the directory
String className = indexProps.getProperty( "directory_provider" );
if ( StringHelper.isEmpty( className ) ) {
@@ -88,20 +93,17 @@
return indexProps;
}
- @Deprecated
- public static String getTypeNameOld(Class<?> clazz) {
- String name = clazz.getAnnotation(Indexed.class).index();
- return "".equals( name ) ? clazz.getName() : name;
- }
-
- public static String getDirectoryProviderName(Class<?> clazz, Configuration cfg)
{
- //get the most specialized (ie subclass > superclass) non default index name
+ public static String getDirectoryProviderName(XClass clazz, Configuration cfg) {
+ //yuk
+ ReflectionManager reflectionManager =
+ ( (AnnotationConfiguration) cfg
).createExtendedMappings().getReflectionManager();
+ //get the most specialized (ie subclass > superclass) non default index name
//if none extract the name from the most generic (superclass > subclass) @Indexed
class in the hierarchy
//FIXME I'm inclined to get rid of the default value
PersistentClass pc = cfg.getClassMapping( clazz.getName() );
- Class rootIndex = null;
+ XClass rootIndex = null;
do {
- Class<?> currentClazz = pc.getMappedClass();
+ XClass currentClazz = reflectionManager.toXClass( pc.getMappedClass() );
Indexed indexAnn = currentClazz.getAnnotation( Indexed.class );
if (indexAnn != null) {
if ( indexAnn.index().length() != 0 ) {
@@ -118,12 +120,7 @@
return rootIndex.getName();
}
else {
- if (clazz == null) {
- throw new HibernateException("Trying to extract the index name a null
entity");
- }
- else {
- throw new HibernateException("Trying to extract the index name from a non
@Indexed class: " + clazz.getName() );
- }
+ throw new HibernateException("Trying to extract the index name from a non
@Indexed class: " + clazz.getName() );
}
}
}
Modified:
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/java/org/hibernate/lucene/util/BinderHelper.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -7,6 +7,7 @@
import java.beans.Introspector;
import org.hibernate.util.StringHelper;
+import org.hibernate.reflection.XMember;
/**
* @author Emmanuel Bernard
@@ -15,37 +16,12 @@
private BinderHelper() {}
- public static String getAttributeName(Member member) {
- return getAttributeName( member, null );
- }
/**
* Get attribute name out of member unless overriden by <code>name</code>
*/
- //TODO move to reflection layer
- public static String getAttributeName(Member member, String name) {
- if( StringHelper.isNotEmpty( name ) ) return name; //explicit field name
- if (member instanceof Field ) {
- return ( (Field) member ).getName();
- }
- else {
- //decapitalize
- String methodName = ( (Method) member).getName();
- //FIXME we probably should exclude methods not starting with "get" nor
"is"
- int startIndex = 3;
- if( methodName.startsWith("is") ) {
- startIndex = 2;
- }
- return Introspector.decapitalize( methodName.substring( startIndex ) );
- }
+ public static String getAttributeName(XMember member, String name) {
+ return StringHelper.isNotEmpty( name ) ?
+ name :
+ member.getName(); //explicit field name
}
-
- //TODO move to reflection layer
- public static Class<?> getReturnType(Member member) {
- if (member instanceof Field) {
- return ( (Field) member ).getType();
- }
- else {
- return ( (Method) member ).getReturnType();
- }
- }
}
Added:
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/Document.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -0,0 +1,79 @@
+//$Id: $
+package org.hibernate.lucene.test.fieldAccess;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.Lob;
+
+import org.hibernate.lucene.Unstored;
+import org.hibernate.lucene.Text;
+import org.hibernate.lucene.Keyword;
+import org.hibernate.lucene.Boost;
+import org.hibernate.lucene.Indexed;
+
+/**
+ * @author Richard Hallier
+ */
+@Entity
+@Indexed(index = "DocumentField")
+public class Document {
+ @Id
+ @GeneratedValue
+ @Keyword(id = true)
+ private Long id;
+
+ @Text
+ @Boost(2)
+ private String title;
+
+ @Unstored(name = "Abstract")
+ private String summary;
+
+ @Lob
+ @Unstored
+ private String text;
+
+ Document() {
+ }
+
+ public Document(String title, String summary, String text) {
+ super();
+ this.summary = summary;
+ this.text = text;
+ this.title = title;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
+
Added:
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java
===================================================================
---
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java 2006-10-13
20:26:32 UTC (rev 10576)
+++
branches/Lucene_Integration/HibernateExt/metadata/src/test/org/hibernate/lucene/test/fieldAccess/FieldAccessTest.java 2006-10-13
22:27:43 UTC (rev 10577)
@@ -0,0 +1,68 @@
+//$Id: $
+package org.hibernate.lucene.test.fieldAccess;
+
+import java.util.List;
+
+import org.hibernate.lucene.test.TestCase;
+import org.hibernate.lucene.LuceneSession;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FieldAccessTest extends TestCase {
+
+ public void testFields() throws Exception {
+ Document doc = new Document( "Hibernate in Action",
"Object/relational mapping with Hibernate", "blah blah blah" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( doc );
+ tx.commit();
+
+ s.clear();
+
+ LuceneSession session = new LuceneSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createLuceneQuery( p.parse( "Abstract:Hibernate"
) ).list();
+ assertEquals( "Query by field", 1, result.size() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testFieldBoost() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(
+ new Document( "Hibernate in Action", "Object and Relational",
"blah blah blah" )
+ );
+ s.persist(
+ new Document( "Object and Relational", "Hibernate in Action",
"blah blah blah" )
+ );
+ tx.commit();
+
+ s.clear();
+
+ LuceneSession session = new LuceneSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createLuceneQuery( p.parse( "title:Action OR
Abstract:Action" ) ).list();
+ assertEquals( "Query by field", 2, result.size() );
+ assertEquals( "@Boost fails", "Hibernate in Action", (
(Document) result.get( 0 ) ).getTitle() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Document.class
+ };
+ }
+}