[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