[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