[hibernate-commits] Hibernate SVN: r20808 - 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:23:22 EDT 2010


Author: epbernard
Date: 2010-10-11 14:23:21 -0400 (Mon, 11 Oct 2010)
New Revision: 20808

Added:
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectObjectToString.java
Modified:
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/EntityConsumerLuceneworkProducer.java
   search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java
   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

Add support for bridge#objectToString

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/EntityConsumerLuceneworkProducer.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/EntityConsumerLuceneworkProducer.java	2010-10-11 18:22:20 UTC (rev 20807)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/batchindexing/EntityConsumerLuceneworkProducer.java	2010-10-11 18:23:21 UTC (rev 20808)
@@ -38,6 +38,7 @@
 import org.hibernate.search.backend.AddLuceneWork;
 import org.hibernate.search.backend.impl.batchlucene.BatchBackend;
 import org.hibernate.search.bridge.TwoWayFieldBridge;
+import org.hibernate.search.bridge.util.ContextualException2WayBridge;
 import org.hibernate.search.engine.DocumentBuilderIndexedEntity;
 import org.hibernate.search.engine.SearchFactoryImplementor;
 import org.hibernate.search.util.HibernateHelper;
@@ -132,7 +133,11 @@
 		Class<?> clazz = HibernateHelper.getClass( entity );
 		DocumentBuilderIndexedEntity docBuilder = documentBuilders.get( clazz );
 		TwoWayFieldBridge idBridge = docBuilder.getIdBridge();
-		String idInString = idBridge.objectToString( id );
+		ContextualException2WayBridge contextualBridge = new ContextualException2WayBridge()
+				.setClass(clazz)
+				.setFieldName(docBuilder.getIdKeywordName())
+				.setFieldBridge(idBridge);
+		String idInString = contextualBridge.objectToString( id );
 		//depending on the complexity of the object graph going to be indexed it's possible
 		//that we hit the database several times during work construction.
 		AddLuceneWork addWork = docBuilder.createAddWork( clazz, entity, id, idInString, true );

Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java	2010-10-11 18:22:20 UTC (rev 20807)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java	2010-10-11 18:23:21 UTC (rev 20808)
@@ -1,6 +1,7 @@
 package org.hibernate.search.bridge.util;
 
 import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.StringBridge;
 import org.hibernate.search.bridge.TwoWayFieldBridge;
 
 /**
@@ -10,10 +11,12 @@
  */
 public class ContextualException2WayBridge extends ContextualExceptionBridge implements TwoWayFieldBridge {
 	private TwoWayFieldBridge delegate;
+	private StringBridge stringBridge;
 
 	public ContextualException2WayBridge setFieldBridge(TwoWayFieldBridge delegate) {
 		super.setFieldBridge(delegate);
 		this.delegate = delegate;
+		this.stringBridge = null;
 		return this;
 	}
 
@@ -38,7 +41,12 @@
 
 	public String objectToString(Object object) {
 		try {
-			return delegate.objectToString(object);
+			if (delegate != null) {
+				return delegate.objectToString(object);
+			}
+			else {
+				return stringBridge.objectToString(object);
+			}
 		}
 		catch (Exception e) {
 			throw buildBridgeException(e, "objectToString");
@@ -54,4 +62,11 @@
 		super.popMethod();
 		return this;
 	}
+
+	//FIXME yuk, create a cleaner inheritance for a ContextualExceptionStringBridge
+	public ContextualException2WayBridge setStringBridge(StringBridge bridge) {
+		this.stringBridge = bridge;
+		this.delegate = null;
+		return this;
+	}
 }

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:22:20 UTC (rev 20807)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java	2010-10-11 18:23:21 UTC (rev 20808)
@@ -336,23 +336,23 @@
 		}
 
 		if ( workType == WorkType.ADD ) {
-			String idInString = idBridge.objectToString( id );
+			String idInString = objectToString(idBridge, idKeywordName, id);
 			queue.add( createAddWork( entityClass, entity, id, idInString, false ) );
 		}
 		else if ( workType == WorkType.DELETE || workType == WorkType.PURGE ) {
-			String idInString = idBridge.objectToString( id );
+			String idInString = objectToString(idBridge, idKeywordName, id);
 			queue.add( new DeleteLuceneWork( id, idInString, entityClass ) );
 		}
 		else if ( workType == WorkType.PURGE_ALL ) {
 			queue.add( new PurgeAllLuceneWork( entityClass ) );
 		}
 		else if ( workType == WorkType.UPDATE || workType == WorkType.COLLECTION ) {
-			String idInString = idBridge.objectToString( id );
+			String idInString = objectToString(idBridge, idKeywordName, id);
 			queue.add( new DeleteLuceneWork( id, idInString, entityClass ) );
 			queue.add( createAddWork( entityClass, entity, id, idInString, false ) );
 		}
 		else if ( workType == WorkType.INDEX ) {
-			String idInString = idBridge.objectToString( id );
+			String idInString = objectToString(idBridge, idKeywordName, id);
 			queue.add( new DeleteLuceneWork( id, idInString, entityClass ) );
 			queue.add( createAddWork( entityClass, entity, id, idInString, true ) );
 		}
@@ -365,6 +365,22 @@
 		}
 	}
 
+	private String objectToString(TwoWayFieldBridge bridge, String fieldName, Object value) {
+		ContextualException2WayBridge contextualBridge = new ContextualException2WayBridge()
+				.setClass(beanClass)
+				.setFieldBridge(bridge)
+				.setFieldName(fieldName);
+		return contextualBridge.objectToString(value);
+	}
+
+	private String objectToString(StringBridge bridge, String fieldName, Object value) {
+		ContextualException2WayBridge contextualBridge = new ContextualException2WayBridge()
+				.setClass(beanClass)
+				.setStringBridge(bridge)
+				.setFieldName(fieldName);
+		return contextualBridge.objectToString(value);
+	}
+
 	public AddLuceneWork createAddWork(Class<T> entityClass, T entity, Serializable id, String idInString, boolean isBatch) {
 		Map<String, String> fieldToAnalyzerMap = new HashMap<String, String>();
 		Document doc = getDocument( entity, id, fieldToAnalyzerMap );
@@ -589,7 +605,7 @@
 			return new Term( idKeywordName, ( String ) id );
 		}
 
-		return new Term( idKeywordName, idBridge.objectToString( id ) );
+		return new Term( idKeywordName, objectToString(idBridge, idKeywordName, id));
 	}
 
 	public TwoWayFieldBridge getIdBridge() {
@@ -776,17 +792,17 @@
 			throw new AssertionFailure( "Field name should not be null" );
 		}
 		if ( fieldName.equals( idKeywordName ) ) {
-			return idBridge.objectToString( value );
+			return objectToString(idBridge, idKeywordName, value);
 		}
 		else {
 			FieldBridge bridge = getBridge( metadata, fieldName );
 			if ( bridge != null ) {
 				final Class<? extends FieldBridge> bridgeClass = bridge.getClass();
 				if ( TwoWayFieldBridge.class.isAssignableFrom( bridgeClass ) ) {
-					return ( ( TwoWayFieldBridge ) bridge ).objectToString( value );
+					return objectToString( ( TwoWayFieldBridge ) bridge, fieldName, value );
 				}
 				else if ( StringBridge.class.isAssignableFrom( bridgeClass ) ) {
-					return ( ( StringBridge ) bridge ).objectToString( value );
+					return objectToString(( StringBridge ) bridge, fieldName, value );
 				}
 				throw new SearchException(
 						"FieldBridge " + bridgeClass + "does not have a objectToString method: field "

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:22:20 UTC (rev 20807)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java	2010-10-11 18:23:21 UTC (rev 20808)
@@ -356,12 +356,51 @@
 		s.close();
 	}
 
+	public void testIncorrectObjectToStringBridge() throws Exception {
+		IncorrectObjectToString incorrect = new IncorrectObjectToString();
+		incorrect.setName("test");
 
+		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
+				assertTrue( throwable.getMessage().contains( "class: " + Incorrect.class.getName() ) );
+				assertTrue( throwable.getMessage().contains("path: id") );
+				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,
 				Incorrect.class,
-				Incorrect2.class
+				Incorrect2.class,
+				IncorrectObjectToString.class
 		};
 	}
 

Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectObjectToString.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectObjectToString.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectObjectToString.java	2010-10-11 18:23:21 UTC (rev 20808)
@@ -0,0 +1,37 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.*;
+import org.hibernate.search.bridge.TwoWayStringBridge;
+
+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 IncorrectObjectToString {
+	@Id @GeneratedValue @Field( bridge = @FieldBridge(impl = ErrorOnGetBridge.class) )
+	public Long getId() { return id; }
+	public void setId(Long id) { this.id = id; }
+	private Long id;
+
+	@Field
+	public String getName() { return name; }
+	public void setName(String name) { this.name = name; }
+	private String name;
+
+	public static class ErrorOnGetBridge implements TwoWayStringBridge {
+
+		public Object stringToObject(String stringValue) {
+			return stringValue;
+		}
+
+		public String objectToString(Object object) {
+			throw new RuntimeException("Failure");
+		}
+	}
+}



More information about the hibernate-commits mailing list