[hibernate-commits] Hibernate SVN: r20805 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/engine and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Mon Oct 11 14:20:20 EDT 2010


Author: epbernard
Date: 2010-10-11 14:20:20 -0400 (Mon, 11 Oct 2010)
New Revision: 20805

Modified:
   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/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

Better method and path report

Modified: 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	2010-10-11 18:19:20 UTC (rev 20804)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java	2010-10-11 18:20:20 UTC (rev 20805)
@@ -17,8 +17,8 @@
 		return this;
 	}
 
-	public ExceptionWrapper2WayBridge setClassAndMethod(Class<?> clazz, String path) {
-		super.setClassAndMethod(clazz, path);
+	public ExceptionWrapper2WayBridge setClass(Class<?> clazz, String path) {
+		super.setClass(clazz);
 		return this;
 	}
 
@@ -44,4 +44,14 @@
 			throw buildBridgeException(e, "objectToString");
 		}
 	}
+
+	public ExceptionWrapper2WayBridge pushMethod(String name) {
+		super.pushMethod(name);
+		return this;
+	}
+
+	public ExceptionWrapper2WayBridge popMethod() {
+		super.popMethod();
+		return this;
+	}
 }

Modified: 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	2010-10-11 18:19:20 UTC (rev 20804)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java	2010-10-11 18:20:20 UTC (rev 20805)
@@ -6,6 +6,10 @@
 import org.hibernate.search.bridge.LuceneOptions;
 import org.hibernate.search.bridge.TwoWayFieldBridge;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Stack;
+
 /**
  * Wrap the exception with an exception provide contextual feedback
  *
@@ -14,7 +18,7 @@
 public class ExceptionWrapperBridge implements FieldBridge {
 	private FieldBridge delegate;
 	protected Class<?> clazz;
-	protected String path;
+	protected List<String> path = new ArrayList<String>(5);
 	protected String fieldName;
 
 	public ExceptionWrapperBridge setFieldBridge(FieldBridge delegate) {
@@ -22,9 +26,8 @@
 		return this;
 	}
 
-	public ExceptionWrapperBridge setClassAndMethod(Class<?> clazz, String path) {
+	public ExceptionWrapperBridge setClass(Class<?> clazz) {
 		this.clazz = clazz;
-		this.path = path;
 		return this;
 	}
 
@@ -37,10 +40,14 @@
 		StringBuilder error = new StringBuilder("Exception while calling bridge#");
 		error.append(method);
 		if ( clazz != null ) {
-			error.append("\n\tclass: ").append(clazz);
+			error.append("\n\tclass: ").append( clazz.getName() );
 		}
-		if ( path != null ) {
-			error.append("\n\tpath: ").append(path);
+		if ( path.size() > 0 ) {
+			error.append("\n\tpath: ");
+			for(String pathNode : path) {
+				error.append(pathNode).append(".");
+			}
+			error.deleteCharAt( error.length() - 1 );
 		}
 		if ( fieldName != null ) {
 			error.append("\n\tfield bridge: ").append(fieldName);
@@ -56,4 +63,14 @@
 			throw buildBridgeException(e, "set");
 		}
 	}
+
+	public ExceptionWrapperBridge pushMethod(String name) {
+		path.add(name);
+		return this;
+	}
+
+	public ExceptionWrapperBridge popMethod() {
+		path.remove( path.size() - 1 );
+		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:19:20 UTC (rev 20804)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java	2010-10-11 18:20:20 UTC (rev 20805)
@@ -412,20 +412,24 @@
 				Store.YES,
 				Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO, idBoost
 		);
-		new ExceptionWrapperBridge()
+		final ExceptionWrapperBridge contextualBridge = new ExceptionWrapperBridge()
 				.setFieldBridge(idBridge)
-				.setClassAndMethod(entityType, null)
-				.setFieldName(idKeywordName)
-				.set( idKeywordName, id, doc, luceneOptions );
+				.setClass(entityType)
+				.setFieldName(idKeywordName);
+		contextualBridge.set( idKeywordName, id, doc, luceneOptions );
 
 		// finally add all other document fields
 		Set<String> processedFieldNames = new HashSet<String>();
-		buildDocumentFields( instance, doc, metadata, fieldToAnalyzerMap, processedFieldNames );
+		buildDocumentFields( instance, doc, metadata, fieldToAnalyzerMap, processedFieldNames, contextualBridge );
 		return doc;
 	}
 
-	private void buildDocumentFields(Object instance, Document doc, PropertiesMetadata propertiesMetadata, Map<String, String> fieldToAnalyzerMap,
-									 Set<String> processedFieldNames) {
+	private void buildDocumentFields(Object instance,
+									 Document doc,
+									 PropertiesMetadata propertiesMetadata,
+									 Map<String, String> fieldToAnalyzerMap,
+									 Set<String> processedFieldNames,
+									 ExceptionWrapperBridge contextualBridge) {
 		if ( instance == null ) {
 			return;
 		}
@@ -433,14 +437,11 @@
 		// 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 );
 			final String fieldName = propertiesMetadata.classNames.get(i);
-			wrapperBridge
+			contextualBridge
 					.setFieldBridge(fb)
 					.setFieldName( fieldName )
 					.set(
@@ -456,14 +457,15 @@
 
 			final FieldBridge fieldBridge = propertiesMetadata.fieldBridges.get(i);
 			final String fieldName = propertiesMetadata.fieldNames.get(i);
-			wrapperBridge
+			contextualBridge
 					.setFieldBridge(fieldBridge)
-					.setClassAndMethod( beanClass, member.getName() )
+					.pushMethod( member.getName() )
 					.setFieldName( fieldName )
 					.set(
 						fieldName, value, doc,
 						propertiesMetadata.getFieldLuceneOptions( i, value )
 					);
+			contextualBridge.popMethod();
 		}
 
 		// allow analyzer override for the fields added by the class and field bridges
@@ -474,6 +476,7 @@
 		// recursively process embedded objects
 		for ( int i = 0; i < propertiesMetadata.embeddedGetters.size(); i++ ) {
 			XMember member = propertiesMetadata.embeddedGetters.get( i );
+			contextualBridge.pushMethod( member.getName() );
 			Object value = ReflectionHelper.getMemberValue( unproxiedInstance, member );
 			//TODO handle boost at embedded level: already stored in propertiesMedatada.boost
 
@@ -485,26 +488,26 @@
 				case ARRAY:
 					for ( Object arrayValue : ( Object[] ) value ) {
 						buildDocumentFields(
-								arrayValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames
+								arrayValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames, contextualBridge
 						);
 					}
 					break;
 				case COLLECTION:
 					for ( Object collectionValue : ( Collection ) value ) {
 						buildDocumentFields(
-								collectionValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames
+								collectionValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames, contextualBridge
 						);
 					}
 					break;
 				case MAP:
 					for ( Object collectionValue : ( ( Map ) value ).values() ) {
 						buildDocumentFields(
-								collectionValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames
+								collectionValue, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames, contextualBridge
 						);
 					}
 					break;
 				case OBJECT:
-					buildDocumentFields( value, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames );
+					buildDocumentFields( value, doc, embeddedMetadata, fieldToAnalyzerMap, processedFieldNames, contextualBridge );
 					break;
 				default:
 					throw new AssertionFailure(
@@ -512,6 +515,7 @@
 									+ propertiesMetadata.embeddedContainers.get( i )
 					);
 			}
+			contextualBridge.popMethod();
 		}
 	}
 

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:19:20 UTC (rev 20804)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java	2010-10-11 18:20:20 UTC (rev 20805)
@@ -296,6 +296,8 @@
 			if (throwable instanceof BridgeException) {
 				//expected
 				System.out.println( throwable.getMessage() );
+				assertTrue( throwable.getMessage().contains( "class: " + Incorrect.class.getName() ) );
+				assertTrue( throwable.getMessage().contains("path: subIncorrect.name") );
 				tx.rollback();
 			}
 			else {



More information about the hibernate-commits mailing list