[hibernate-commits] Hibernate SVN: r20804 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/bridge/util and 2 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Mon Oct 11 14:19:21 EDT 2010
Author: epbernard
Date: 2010-10-11 14:19:20 -0400 (Mon, 11 Oct 2010)
New Revision: 20804
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java
Log:
HSEARCH-575 Better error report on bridge failure
Initial wrapper commit
support set wrapping
method logging is still flacky
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,24 @@
+package org.hibernate.search.bridge;
+
+import org.hibernate.search.SearchException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BridgeException extends SearchException {
+ public BridgeException() {
+ super();
+ }
+
+ public BridgeException(String message) {
+ super(message);
+ }
+
+ public BridgeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BridgeException(Throwable cause) {
+ super(cause);
+ }
+}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,47 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ExceptionWrapper2WayBridge extends ExceptionWrapperBridge implements TwoWayFieldBridge {
+ private TwoWayFieldBridge delegate;
+
+ public ExceptionWrapper2WayBridge setDelegate(TwoWayFieldBridge delegate) {
+ super.setFieldBridge(delegate);
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ExceptionWrapper2WayBridge setClassAndMethod(Class<?> clazz, String path) {
+ super.setClassAndMethod(clazz, path);
+ return this;
+ }
+
+ public ExceptionWrapper2WayBridge setFieldName(String fieldName) {
+ super.setFieldName(fieldName);
+ return this;
+ }
+
+ public Object get(String name, Document document) {
+ try {
+ return delegate.get(name, document);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "get");
+ }
+ }
+
+ public String objectToString(Object object) {
+ try {
+ return delegate.objectToString(object);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "objectToString");
+ }
+ }
+}
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,59 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.BridgeException;
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.search.bridge.LuceneOptions;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ExceptionWrapperBridge implements FieldBridge {
+ private FieldBridge delegate;
+ protected Class<?> clazz;
+ protected String path;
+ protected String fieldName;
+
+ public ExceptionWrapperBridge setFieldBridge(FieldBridge delegate) {
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ExceptionWrapperBridge setClassAndMethod(Class<?> clazz, String path) {
+ this.clazz = clazz;
+ this.path = path;
+ return this;
+ }
+
+ public ExceptionWrapperBridge setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ protected BridgeException buildBridgeException(Exception e, String method) {
+ StringBuilder error = new StringBuilder("Exception while calling bridge#");
+ error.append(method);
+ if ( clazz != null ) {
+ error.append("\n\tclass: ").append(clazz);
+ }
+ if ( path != null ) {
+ error.append("\n\tpath: ").append(path);
+ }
+ if ( fieldName != null ) {
+ error.append("\n\tfield bridge: ").append(fieldName);
+ }
+ throw new BridgeException(error.toString(), e);
+ }
+
+ public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
+ try {
+ delegate.set(name, value, document, luceneOptions);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "set");
+ }
+ }
+}
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-10-11 18:18:15 UTC (rev 20803)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -40,6 +40,7 @@
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.index.Term;
+import org.hibernate.search.bridge.util.ExceptionWrapperBridge;
import org.slf4j.Logger;
import org.hibernate.annotations.common.AssertionFailure;
@@ -411,7 +412,11 @@
Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO, idBoost
);
- idBridge.set( idKeywordName, id, doc, luceneOptions );
+ new ExceptionWrapperBridge()
+ .setFieldBridge(idBridge)
+ .setClassAndMethod(entityType, null)
+ .setFieldName(idKeywordName)
+ .set( idKeywordName, id, doc, luceneOptions );
// finally add all other document fields
Set<String> processedFieldNames = new HashSet<String>();
@@ -428,23 +433,37 @@
// needed for field access: I cannot work in the proxied version
Object unproxiedInstance = HibernateHelper.unproxy( instance );
+ ExceptionWrapperBridge wrapperBridge = new ExceptionWrapperBridge()
+ .setClassAndMethod(beanClass, null);
+
// process the class bridges
for ( int i = 0; i < propertiesMetadata.classBridges.size(); i++ ) {
FieldBridge fb = propertiesMetadata.classBridges.get( i );
- fb.set(
- propertiesMetadata.classNames.get( i ), unproxiedInstance,
- doc, propertiesMetadata.getClassLuceneOptions( i )
- );
+ final String fieldName = propertiesMetadata.classNames.get(i);
+ wrapperBridge
+ .setFieldBridge(fb)
+ .setFieldName( fieldName )
+ .set(
+ fieldName, unproxiedInstance,
+ doc, propertiesMetadata.getClassLuceneOptions( i )
+ );
}
// process the indexed fields
for ( int i = 0; i < propertiesMetadata.fieldNames.size(); i++ ) {
XMember member = propertiesMetadata.fieldGetters.get( i );
Object value = ReflectionHelper.getMemberValue( unproxiedInstance, member );
- propertiesMetadata.fieldBridges.get( i ).set(
- propertiesMetadata.fieldNames.get( i ), value, doc,
- propertiesMetadata.getFieldLuceneOptions( i, value )
- );
+
+ final FieldBridge fieldBridge = propertiesMetadata.fieldBridges.get(i);
+ final String fieldName = propertiesMetadata.fieldNames.get(i);
+ wrapperBridge
+ .setFieldBridge(fieldBridge)
+ .setClassAndMethod( beanClass, member.getName() )
+ .setFieldName( fieldName )
+ .set(
+ fieldName, value, doc,
+ propertiesMetadata.getFieldLuceneOptions( i, value )
+ );
}
// allow analyzer override for the fields added by the class and field bridges
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java 2010-10-11 18:18:15 UTC (rev 20803)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -40,12 +40,15 @@
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
+import org.hibernate.HibernateException;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.search.Environment;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
+import org.hibernate.search.SearchException;
import org.hibernate.search.annotations.Resolution;
+import org.hibernate.search.bridge.BridgeException;
import org.hibernate.search.bridge.builtin.CalendarBridge;
import org.hibernate.search.test.SearchTestCase;
@@ -267,13 +270,51 @@
bridgeParams.put( CalendarBridge.RESOLUTION_PARAMETER, Resolution.DAY.toString() );
bridge.setParameterValues( bridgeParams );
assertEquals( "20001215", bridge.objectToString( c ) );
+ }
+ public void testIncorrectBridge() throws Exception {
+ Incorrect incorrect = new Incorrect();
+ incorrect.setSubIncorrect(new Incorrect.SubIncorrect());
+ incorrect.getSubIncorrect().setName("This is a name not a class");
+
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ try {
+ s.persist( incorrect );
+ s.flush();
+ s.clear();
+ s.delete( incorrect );
+ s.flush();
+ tx.commit();
+ fail("Incorrect bridge should fail");
+ }
+ catch (BridgeException e) {
+ tx.rollback();
+ }
+ catch (HibernateException e) {
+ final Throwable throwable = e.getCause();
+ if (throwable instanceof BridgeException) {
+ //expected
+ System.out.println( throwable.getMessage() );
+ tx.rollback();
+ }
+ else {
+ e.printStackTrace();
+ fail("Incorrect bridge should raise a SearchException: " + e.toString() );
+ }
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ fail("Incorrect bridge should raise a SearchException");
+ }
+ s.close();
}
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {
- Cloud.class
+ Cloud.class,
+ Incorrect.class
};
}
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,37 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.bridge.builtin.ClassBridge;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Incorrect {
+ @Id @GeneratedValue
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ private Long id;
+
+ @IndexedEmbedded
+ @Embedded
+ public SubIncorrect getSubIncorrect() { return subIncorrect; }
+ public void setSubIncorrect(SubIncorrect subIncorrect) { this.subIncorrect = subIncorrect; }
+ private SubIncorrect subIncorrect;
+
+ public static class SubIncorrect {
+ @Field( bridge = @FieldBridge(impl = ClassBridge.class) )
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ private String name;
+ }
+}
More information about the hibernate-commits
mailing list