[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