[hibernate-commits] Hibernate SVN: r10577 - in branches/Lucene_Integration/HibernateExt/metadata/src: java/org/hibernate/lucene java/org/hibernate/lucene/bridge java/org/hibernate/lucene/event java/org/hibernate/lucene/store java/org/hibernate/lucene/util test/org/hibernate/lucene/test test/org/hibernate/lucene/test/fieldAccess

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Oct 13 18:27:48 EDT 2006


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)
- at Target({ElementType.TYPE, ElementType.METHOD})
+ at 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)
- at Target(ElementType.METHOD)
+ at 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)
- at Target(ElementType.METHOD)
+ at 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)
- at Target(ElementType.METHOD)
+ at 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
+ */
+ at Entity
+ at 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
+        };
+    }
+}




More information about the hibernate-commits mailing list