[hibernate-commits] Hibernate SVN: r20806 - 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:21:29 EDT 2010


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

Added:
   search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java
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/engine/DocumentBuilderIndexedEntity.java
   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/Incorrect.java
Log:
HSEARCH-575 Better error report on bridge failure

Add support for Bridge#get method

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:20:20 UTC (rev 20805)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java	2010-10-11 18:21:28 UTC (rev 20806)
@@ -11,13 +11,13 @@
 public class ExceptionWrapper2WayBridge extends ExceptionWrapperBridge implements TwoWayFieldBridge {
 	private TwoWayFieldBridge delegate;
 
-	public ExceptionWrapper2WayBridge setDelegate(TwoWayFieldBridge delegate) {
+	public ExceptionWrapper2WayBridge setFieldBridge(TwoWayFieldBridge delegate) {
 		super.setFieldBridge(delegate);
 		this.delegate = delegate;
 		return this;
 	}
 
-	public ExceptionWrapper2WayBridge setClass(Class<?> clazz, String path) {
+	public ExceptionWrapper2WayBridge setClass(Class<?> clazz) {
 		super.setClass(clazz);
 		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:20:20 UTC (rev 20805)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java	2010-10-11 18:21:28 UTC (rev 20806)
@@ -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.ExceptionWrapper2WayBridge;
 import org.hibernate.search.bridge.util.ExceptionWrapperBridge;
 import org.slf4j.Logger;
 
@@ -416,7 +417,13 @@
 				.setFieldBridge(idBridge)
 				.setClass(entityType)
 				.setFieldName(idKeywordName);
+		if ( idGetter != null) {
+			contextualBridge.pushMethod( idGetter.getName() );
+		}
 		contextualBridge.set( idKeywordName, id, doc, luceneOptions );
+		if ( idGetter != null) {
+			contextualBridge.popMethod();
+		}
 
 		// finally add all other document fields
 		Set<String> processedFieldNames = new HashSet<String>();
@@ -627,8 +634,17 @@
 		if ( builderIndexedEntity == null ) {
 			throw new SearchException( "No Lucene configuration set up for: " + clazz.getName() );
 		}
-		return ( Serializable ) builderIndexedEntity.getIdBridge()
-				.get( builderIndexedEntity.getIdKeywordName(), document );
+
+
+		final TwoWayFieldBridge fieldBridge = builderIndexedEntity.getIdBridge();
+		final String fieldName = builderIndexedEntity.getIdKeywordName();
+		ExceptionWrapper2WayBridge contextualBridge = new ExceptionWrapper2WayBridge();
+		contextualBridge
+				.setClass(clazz)
+				.setFieldName(fieldName)
+				.setFieldBridge(fieldBridge)
+				.pushMethod( "identifier" );
+		return ( Serializable ) contextualBridge.get(fieldName, document );
 	}
 
 	public static String getDocumentIdName(SearchFactoryImplementor searchFactoryImplementor, Class<?> clazz) {
@@ -650,30 +666,40 @@
 		}
 		final int fieldNbr = fields.length;
 		Object[] result = new Object[fieldNbr];
-
+		ExceptionWrapper2WayBridge contextualBridge = new ExceptionWrapper2WayBridge();
+		contextualBridge.setClass(clazz);
 		if ( builderIndexedEntity.idKeywordName != null ) {
+			final XMember member = builderIndexedEntity.idGetter;
+			if ( member != null) {
+				contextualBridge.pushMethod( member.getName() );
+			}
 			populateResult(
 					builderIndexedEntity.idKeywordName,
 					builderIndexedEntity.idBridge,
 					Store.YES,
 					fields,
 					result,
-					document
+					document,
+					contextualBridge
 			);
+			if ( member != null) {
+				contextualBridge.popMethod();
+			}
 		}
 
 		final PropertiesMetadata metadata = builderIndexedEntity.metadata;
-		processFieldsForProjection( metadata, fields, result, document );
+		processFieldsForProjection( metadata, fields, result, document, contextualBridge );
 		return result;
 	}
 
 	private static void populateResult(String fieldName, FieldBridge fieldBridge, Store store,
-									   String[] fields, Object[] result, Document document) {
+									   String[] fields, Object[] result, Document document, ExceptionWrapper2WayBridge contextualBridge) {
 		int matchingPosition = getFieldPosition( fields, fieldName );
 		if ( matchingPosition != -1 ) {
 			//TODO make use of an isTwoWay() method
 			if ( store != Store.NO && TwoWayFieldBridge.class.isAssignableFrom( fieldBridge.getClass() ) ) {
-				result[matchingPosition] = ( ( TwoWayFieldBridge ) fieldBridge ).get( fieldName, document );
+				contextualBridge.setFieldName(fieldName).setFieldBridge( ( TwoWayFieldBridge ) fieldBridge );
+				result[matchingPosition] = contextualBridge.get( fieldName, document );
 				if ( log.isTraceEnabled() ) {
 					log.trace( "Field {} projected as {}", fieldName, result[matchingPosition] );
 				}
@@ -689,18 +715,22 @@
 		}
 	}
 
-	private static void processFieldsForProjection(PropertiesMetadata metadata, String[] fields, Object[] result, Document document) {
+	private static void processFieldsForProjection(PropertiesMetadata metadata, String[] fields, Object[] result, Document document, ExceptionWrapper2WayBridge contextualBridge) {
 		//process base fields
 		final int nbrFoEntityFields = metadata.fieldNames.size();
 		for ( int index = 0; index < nbrFoEntityFields; index++ ) {
+			final String fieldName = metadata.fieldNames.get(index);
+			contextualBridge.pushMethod( metadata.fieldGetters.get(index).getName() );
 			populateResult(
-					metadata.fieldNames.get( index ),
+					fieldName,
 					metadata.fieldBridges.get( index ),
 					metadata.fieldStore.get( index ),
 					fields,
 					result,
-					document
+					document,
+					contextualBridge
 			);
+			contextualBridge.popMethod();
 		}
 
 		//process fields of embedded
@@ -708,9 +738,11 @@
 		for ( int index = 0; index < nbrOfEmbeddedObjects; index++ ) {
 			//there is nothing we can do for collections
 			if ( metadata.embeddedContainers.get( index ) == PropertiesMetadata.Container.OBJECT ) {
+				contextualBridge.pushMethod( metadata.embeddedGetters.get( index ).getName() );
 				processFieldsForProjection(
-						metadata.embeddedPropertiesMetadata.get( index ), fields, result, document
+						metadata.embeddedPropertiesMetadata.get( index ), fields, result, document, contextualBridge
 				);
+				contextualBridge.popMethod();
 			}
 		}
 
@@ -723,7 +755,8 @@
 					metadata.classStores.get( index ),
 					fields,
 					result,
-					document
+					document,
+					contextualBridge
 			);
 		}
 	}

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:20:20 UTC (rev 20805)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java	2010-10-11 18:21:28 UTC (rev 20806)
@@ -43,13 +43,11 @@
 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.*;
 import org.hibernate.search.annotations.Resolution;
 import org.hibernate.search.bridge.BridgeException;
 import org.hibernate.search.bridge.builtin.CalendarBridge;
+import org.hibernate.search.query.dsl.QueryBuilder;
 import org.hibernate.search.test.SearchTestCase;
 
 /**
@@ -272,7 +270,7 @@
 		assertEquals( "20001215", bridge.objectToString( c ) );
 	}
 
-	public void testIncorrectBridge() throws Exception {
+	public void testIncorrectSetBridge() throws Exception {
 		Incorrect incorrect = new Incorrect();
 		incorrect.setSubIncorrect(new Incorrect.SubIncorrect());
 		incorrect.getSubIncorrect().setName("This is a name not a class");
@@ -295,7 +293,6 @@
 			final Throwable throwable = e.getCause();
 			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();
@@ -312,11 +309,59 @@
 		s.close();
 	}
 
+	public void testIncorrectGetBridge() throws Exception {
+		Incorrect2 incorrect = new Incorrect2();
+		incorrect.setSubIncorrect(new Incorrect2.SubIncorrect());
+		incorrect.getSubIncorrect().setName("This is a name not a class");
 
+		FullTextSession s = Search.getFullTextSession( openSession() );
+		Transaction tx = s.beginTransaction();
+		s.persist( incorrect );
+		tx.commit();
+		s.clear();
+		tx = s.beginTransaction();
+		final QueryBuilder builder = s.getSearchFactory().buildQueryBuilder().forEntity(Incorrect2.class).get();
+		final Query query = builder.keyword().onField("subIncorrect.name").matching("name").createQuery();
+
+		try {
+			final FullTextQuery textQuery = s.createFullTextQuery(query, Incorrect2.class).setProjection("subIncorrect.name");
+			final List results = textQuery.list();
+			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() );
+				assertTrue( throwable.getMessage().contains( "class: " + Incorrect2.class.getName() ) );
+				assertTrue( throwable.getMessage().contains("path: subIncorrect.name") );
+				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");
+		}
+
+		tx = s.beginTransaction();
+		s.delete( s.get( Incorrect2.class, incorrect.getId() ) );
+		tx.commit();
+		s.close();
+	}
+
+
 	protected Class<?>[] getAnnotatedClasses() {
 		return new Class[] {
 				Cloud.class,
-				Incorrect.class
+				Incorrect.class,
+				Incorrect2.class
 		};
 	}
 

Modified: 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	2010-10-11 18:20:20 UTC (rev 20805)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java	2010-10-11 18:21:28 UTC (rev 20806)
@@ -4,6 +4,7 @@
 import org.hibernate.search.annotations.FieldBridge;
 import org.hibernate.search.annotations.Indexed;
 import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.bridge.TwoWayStringBridge;
 import org.hibernate.search.bridge.builtin.ClassBridge;
 
 import javax.persistence.Embedded;

Copied: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java (from rev 20805, 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/Incorrect2.java	                        (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java	2010-10-11 18:21:28 UTC (rev 20806)
@@ -0,0 +1,46 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.*;
+import org.hibernate.search.bridge.TwoWayStringBridge;
+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 Incorrect2 {
+	@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 = ErrorOnGetBridge.class), store = Store.YES)
+		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) {
+			throw new RuntimeException("Failure");
+		}
+
+		public String objectToString(Object object) {
+			return object.toString();
+		}
+	}
+}



More information about the hibernate-commits mailing list