Hibernate SVN: r20809 - search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 14:29:09 -0400 (Mon, 11 Oct 2010)
New Revision: 20809
Added:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectGet.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectSet.java
Removed:
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
Modified:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java
Log:
HSEARCH-575 Better error report on bridge failure
Rename entities in tests to reflect tested area
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:23:21 UTC (rev 20808)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java 2010-10-11 18:29:09 UTC (rev 20809)
@@ -271,8 +271,8 @@
}
public void testIncorrectSetBridge() throws Exception {
- Incorrect incorrect = new Incorrect();
- incorrect.setSubIncorrect(new Incorrect.SubIncorrect());
+ IncorrectSet incorrect = new IncorrectSet();
+ incorrect.setSubIncorrect(new IncorrectSet.SubIncorrect());
incorrect.getSubIncorrect().setName("This is a name not a class");
org.hibernate.Session s = openSession();
@@ -293,7 +293,7 @@
final Throwable throwable = e.getCause();
if (throwable instanceof BridgeException) {
//expected
- assertTrue( throwable.getMessage().contains( "class: " + Incorrect.class.getName() ) );
+ assertTrue( throwable.getMessage().contains( "class: " + IncorrectSet.class.getName() ) );
assertTrue( throwable.getMessage().contains("path: subIncorrect.name") );
tx.rollback();
}
@@ -310,8 +310,8 @@
}
public void testIncorrectGetBridge() throws Exception {
- Incorrect2 incorrect = new Incorrect2();
- incorrect.setSubIncorrect(new Incorrect2.SubIncorrect());
+ IncorrectGet incorrect = new IncorrectGet();
+ incorrect.setSubIncorrect(new IncorrectGet.SubIncorrect());
incorrect.getSubIncorrect().setName("This is a name not a class");
FullTextSession s = Search.getFullTextSession( openSession() );
@@ -320,11 +320,11 @@
tx.commit();
s.clear();
tx = s.beginTransaction();
- final QueryBuilder builder = s.getSearchFactory().buildQueryBuilder().forEntity(Incorrect2.class).get();
+ final QueryBuilder builder = s.getSearchFactory().buildQueryBuilder().forEntity(IncorrectGet.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 FullTextQuery textQuery = s.createFullTextQuery(query, IncorrectGet.class).setProjection("subIncorrect.name");
final List results = textQuery.list();
fail("Incorrect bridge should fail");
}
@@ -336,7 +336,7 @@
if (throwable instanceof BridgeException) {
//expected
//System.out.println( throwable.getMessage() );
- assertTrue( throwable.getMessage().contains( "class: " + Incorrect2.class.getName() ) );
+ assertTrue( throwable.getMessage().contains( "class: " + IncorrectGet.class.getName() ) );
assertTrue( throwable.getMessage().contains("path: subIncorrect.name") );
tx.rollback();
}
@@ -351,7 +351,7 @@
}
tx = s.beginTransaction();
- s.delete( s.get( Incorrect2.class, incorrect.getId() ) );
+ s.delete( s.get( IncorrectGet.class, incorrect.getId() ) );
tx.commit();
s.close();
}
@@ -378,7 +378,7 @@
final Throwable throwable = e.getCause();
if (throwable instanceof BridgeException) {
//expected
- assertTrue( throwable.getMessage().contains( "class: " + Incorrect.class.getName() ) );
+ assertTrue( throwable.getMessage().contains( "class: " + IncorrectSet.class.getName() ) );
assertTrue( throwable.getMessage().contains("path: id") );
tx.rollback();
}
@@ -398,8 +398,8 @@
protected Class<?>[] getAnnotatedClasses() {
return new Class[] {
Cloud.class,
- Incorrect.class,
- Incorrect2.class,
+ IncorrectSet.class,
+ IncorrectGet.class,
IncorrectObjectToString.class
};
}
Deleted: 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:23:21 UTC (rev 20808)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java 2010-10-11 18:29:09 UTC (rev 20809)
@@ -1,38 +0,0 @@
-package org.hibernate.search.test.bridge;
-
-import org.hibernate.search.annotations.Field;
-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;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
-@Entity
-@Indexed
-public class Incorrect {
- @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 = ClassBridge.class) )
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- private String name;
- }
-}
Deleted: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java 2010-10-11 18:23:21 UTC (rev 20808)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java 2010-10-11 18:29:09 UTC (rev 20809)
@@ -1,46 +0,0 @@
-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
- */
-@Entity
-@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();
- }
- }
-}
Copied: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectGet.java (from rev 20808, search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect2.java)
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectGet.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectGet.java 2010-10-11 18:29:09 UTC (rev 20809)
@@ -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
+ */
+@Entity
+@Indexed
+public class IncorrectGet {
+ @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();
+ }
+ }
+}
Copied: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectSet.java (from rev 20808, 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/IncorrectSet.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/IncorrectSet.java 2010-10-11 18:29:09 UTC (rev 20809)
@@ -0,0 +1,38 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.Field;
+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;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+@Entity
+@Indexed
+public class IncorrectSet {
+ @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 = ClassBridge.class) )
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ private String name;
+ }
+}
14 years, 4 months
Hibernate SVN: r20808 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/bridge/util and 2 other directories.
by hibernate-commits@lists.jboss.org
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
+ */
+@Entity
+@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");
+ }
+ }
+}
14 years, 4 months
Hibernate SVN: r20807 - in search/trunk/hibernate-search/src/main/java/org/hibernate/search: engine and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 14:22:20 -0400 (Mon, 11 Oct 2010)
New Revision: 20807
Added:
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/ContextualExceptionBridge.java
Removed:
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
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java
Log:
HSEARCH-575 Better error report on bridge failure
Rename bridge wrapper
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java (from rev 20806, 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/ContextualException2WayBridge.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualException2WayBridge.java 2010-10-11 18:22:20 UTC (rev 20807)
@@ -0,0 +1,57 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ContextualException2WayBridge extends ContextualExceptionBridge implements TwoWayFieldBridge {
+ private TwoWayFieldBridge delegate;
+
+ public ContextualException2WayBridge setFieldBridge(TwoWayFieldBridge delegate) {
+ super.setFieldBridge(delegate);
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ContextualException2WayBridge setClass(Class<?> clazz) {
+ super.setClass(clazz);
+ return this;
+ }
+
+ public ContextualException2WayBridge setFieldName(String fieldName) {
+ super.setFieldName(fieldName);
+ return this;
+ }
+
+ public Object get(String name, Document document) {
+ try {
+ return delegate.get(name, document);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "get");
+ }
+ }
+
+ public String objectToString(Object object) {
+ try {
+ return delegate.objectToString(object);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "objectToString");
+ }
+ }
+
+ public ContextualException2WayBridge pushMethod(String name) {
+ super.pushMethod(name);
+ return this;
+ }
+
+ public ContextualException2WayBridge popMethod() {
+ super.popMethod();
+ return this;
+ }
+}
Copied: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualExceptionBridge.java (from rev 20806, 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/ContextualExceptionBridge.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ContextualExceptionBridge.java 2010-10-11 18:22:20 UTC (rev 20807)
@@ -0,0 +1,74 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.BridgeException;
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.search.bridge.LuceneOptions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ContextualExceptionBridge implements FieldBridge {
+ private FieldBridge delegate;
+ protected Class<?> clazz;
+ protected List<String> path = new ArrayList<String>(5);
+ protected String fieldName;
+
+ public ContextualExceptionBridge setFieldBridge(FieldBridge delegate) {
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ContextualExceptionBridge setClass(Class<?> clazz) {
+ this.clazz = clazz;
+ return this;
+ }
+
+ public ContextualExceptionBridge setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ protected BridgeException buildBridgeException(Exception e, String method) {
+ StringBuilder error = new StringBuilder("Exception while calling bridge#");
+ error.append(method);
+ if ( clazz != null ) {
+ error.append("\n\tclass: ").append( clazz.getName() );
+ }
+ 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);
+ }
+ throw new BridgeException(error.toString(), e);
+ }
+
+ public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
+ try {
+ delegate.set(name, value, document, luceneOptions);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "set");
+ }
+ }
+
+ public ContextualExceptionBridge pushMethod(String name) {
+ path.add(name);
+ return this;
+ }
+
+ public ContextualExceptionBridge popMethod() {
+ path.remove( path.size() - 1 );
+ return this;
+ }
+}
Deleted: 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:21:28 UTC (rev 20806)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java 2010-10-11 18:22:20 UTC (rev 20807)
@@ -1,57 +0,0 @@
-package org.hibernate.search.bridge.util;
-
-import org.apache.lucene.document.Document;
-import org.hibernate.search.bridge.TwoWayFieldBridge;
-
-/**
- * Wrap the exception with an exception provide contextual feedback
- *
- * @author Emmanuel Bernard
- */
-public class ExceptionWrapper2WayBridge extends ExceptionWrapperBridge implements TwoWayFieldBridge {
- private TwoWayFieldBridge delegate;
-
- public ExceptionWrapper2WayBridge setFieldBridge(TwoWayFieldBridge delegate) {
- super.setFieldBridge(delegate);
- this.delegate = delegate;
- return this;
- }
-
- public ExceptionWrapper2WayBridge setClass(Class<?> clazz) {
- super.setClass(clazz);
- return this;
- }
-
- public ExceptionWrapper2WayBridge setFieldName(String fieldName) {
- super.setFieldName(fieldName);
- return this;
- }
-
- public Object get(String name, Document document) {
- try {
- return delegate.get(name, document);
- }
- catch (Exception e) {
- throw buildBridgeException(e, "get");
- }
- }
-
- public String objectToString(Object object) {
- try {
- return delegate.objectToString(object);
- }
- catch (Exception e) {
- throw buildBridgeException(e, "objectToString");
- }
- }
-
- public ExceptionWrapper2WayBridge pushMethod(String name) {
- super.pushMethod(name);
- return this;
- }
-
- public ExceptionWrapper2WayBridge popMethod() {
- super.popMethod();
- return this;
- }
-}
Deleted: 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:21:28 UTC (rev 20806)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java 2010-10-11 18:22:20 UTC (rev 20807)
@@ -1,76 +0,0 @@
-package org.hibernate.search.bridge.util;
-
-import org.apache.lucene.document.Document;
-import org.hibernate.search.bridge.BridgeException;
-import org.hibernate.search.bridge.FieldBridge;
-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
- *
- * @author Emmanuel Bernard
- */
-public class ExceptionWrapperBridge implements FieldBridge {
- private FieldBridge delegate;
- protected Class<?> clazz;
- protected List<String> path = new ArrayList<String>(5);
- protected String fieldName;
-
- public ExceptionWrapperBridge setFieldBridge(FieldBridge delegate) {
- this.delegate = delegate;
- return this;
- }
-
- public ExceptionWrapperBridge setClass(Class<?> clazz) {
- this.clazz = clazz;
- return this;
- }
-
- public ExceptionWrapperBridge setFieldName(String fieldName) {
- this.fieldName = fieldName;
- return this;
- }
-
- protected BridgeException buildBridgeException(Exception e, String method) {
- StringBuilder error = new StringBuilder("Exception while calling bridge#");
- error.append(method);
- if ( clazz != null ) {
- error.append("\n\tclass: ").append( clazz.getName() );
- }
- 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);
- }
- throw new BridgeException(error.toString(), e);
- }
-
- public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
- try {
- delegate.set(name, value, document, luceneOptions);
- }
- catch (Exception e) {
- 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:21:28 UTC (rev 20806)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-10-11 18:22:20 UTC (rev 20807)
@@ -40,8 +40,8 @@
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.hibernate.search.bridge.util.ContextualException2WayBridge;
+import org.hibernate.search.bridge.util.ContextualExceptionBridge;
import org.slf4j.Logger;
import org.hibernate.annotations.common.AssertionFailure;
@@ -413,7 +413,7 @@
Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO, idBoost
);
- final ExceptionWrapperBridge contextualBridge = new ExceptionWrapperBridge()
+ final ContextualExceptionBridge contextualBridge = new ContextualExceptionBridge()
.setFieldBridge(idBridge)
.setClass(entityType)
.setFieldName(idKeywordName);
@@ -436,7 +436,7 @@
PropertiesMetadata propertiesMetadata,
Map<String, String> fieldToAnalyzerMap,
Set<String> processedFieldNames,
- ExceptionWrapperBridge contextualBridge) {
+ ContextualExceptionBridge contextualBridge) {
if ( instance == null ) {
return;
}
@@ -638,7 +638,7 @@
final TwoWayFieldBridge fieldBridge = builderIndexedEntity.getIdBridge();
final String fieldName = builderIndexedEntity.getIdKeywordName();
- ExceptionWrapper2WayBridge contextualBridge = new ExceptionWrapper2WayBridge();
+ ContextualException2WayBridge contextualBridge = new ContextualException2WayBridge();
contextualBridge
.setClass(clazz)
.setFieldName(fieldName)
@@ -666,7 +666,7 @@
}
final int fieldNbr = fields.length;
Object[] result = new Object[fieldNbr];
- ExceptionWrapper2WayBridge contextualBridge = new ExceptionWrapper2WayBridge();
+ ContextualException2WayBridge contextualBridge = new ContextualException2WayBridge();
contextualBridge.setClass(clazz);
if ( builderIndexedEntity.idKeywordName != null ) {
final XMember member = builderIndexedEntity.idGetter;
@@ -693,7 +693,7 @@
}
private static void populateResult(String fieldName, FieldBridge fieldBridge, Store store,
- String[] fields, Object[] result, Document document, ExceptionWrapper2WayBridge contextualBridge) {
+ String[] fields, Object[] result, Document document, ContextualException2WayBridge contextualBridge) {
int matchingPosition = getFieldPosition( fields, fieldName );
if ( matchingPosition != -1 ) {
//TODO make use of an isTwoWay() method
@@ -715,7 +715,7 @@
}
}
- private static void processFieldsForProjection(PropertiesMetadata metadata, String[] fields, Object[] result, Document document, ExceptionWrapper2WayBridge contextualBridge) {
+ private static void processFieldsForProjection(PropertiesMetadata metadata, String[] fields, Object[] result, Document document, ContextualException2WayBridge contextualBridge) {
//process base fields
final int nbrFoEntityFields = metadata.fieldNames.size();
for ( int index = 0; index < nbrFoEntityFields; index++ ) {
14 years, 4 months
Hibernate SVN: r20806 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/engine and 1 other directories.
by hibernate-commits@lists.jboss.org
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
+ */
+@Entity
+@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();
+ }
+ }
+}
14 years, 4 months
Hibernate SVN: r20805 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/engine and 1 other directories.
by hibernate-commits@lists.jboss.org
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 {
14 years, 4 months
Hibernate SVN: r20804 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/bridge/util and 2 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 14:19:20 -0400 (Mon, 11 Oct 2010)
New Revision: 20804
Added:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/
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/test/java/org/hibernate/search/test/bridge/Incorrect.java
Modified:
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
Initial wrapper commit
support set wrapping
method logging is still flacky
Added: search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/BridgeException.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,24 @@
+package org.hibernate.search.bridge;
+
+import org.hibernate.search.SearchException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BridgeException extends SearchException {
+ public BridgeException() {
+ super();
+ }
+
+ public BridgeException(String message) {
+ super(message);
+ }
+
+ public BridgeException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public BridgeException(Throwable cause) {
+ super(cause);
+ }
+}
Added: 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 (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapper2WayBridge.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,47 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ExceptionWrapper2WayBridge extends ExceptionWrapperBridge implements TwoWayFieldBridge {
+ private TwoWayFieldBridge delegate;
+
+ public ExceptionWrapper2WayBridge setDelegate(TwoWayFieldBridge delegate) {
+ super.setFieldBridge(delegate);
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ExceptionWrapper2WayBridge setClassAndMethod(Class<?> clazz, String path) {
+ super.setClassAndMethod(clazz, path);
+ return this;
+ }
+
+ public ExceptionWrapper2WayBridge setFieldName(String fieldName) {
+ super.setFieldName(fieldName);
+ return this;
+ }
+
+ public Object get(String name, Document document) {
+ try {
+ return delegate.get(name, document);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "get");
+ }
+ }
+
+ public String objectToString(Object object) {
+ try {
+ return delegate.objectToString(object);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "objectToString");
+ }
+ }
+}
Added: 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 (rev 0)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/bridge/util/ExceptionWrapperBridge.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,59 @@
+package org.hibernate.search.bridge.util;
+
+import org.apache.lucene.document.Document;
+import org.hibernate.search.bridge.BridgeException;
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.search.bridge.LuceneOptions;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+
+/**
+ * Wrap the exception with an exception provide contextual feedback
+ *
+ * @author Emmanuel Bernard
+ */
+public class ExceptionWrapperBridge implements FieldBridge {
+ private FieldBridge delegate;
+ protected Class<?> clazz;
+ protected String path;
+ protected String fieldName;
+
+ public ExceptionWrapperBridge setFieldBridge(FieldBridge delegate) {
+ this.delegate = delegate;
+ return this;
+ }
+
+ public ExceptionWrapperBridge setClassAndMethod(Class<?> clazz, String path) {
+ this.clazz = clazz;
+ this.path = path;
+ return this;
+ }
+
+ public ExceptionWrapperBridge setFieldName(String fieldName) {
+ this.fieldName = fieldName;
+ return this;
+ }
+
+ protected BridgeException buildBridgeException(Exception e, String method) {
+ StringBuilder error = new StringBuilder("Exception while calling bridge#");
+ error.append(method);
+ if ( clazz != null ) {
+ error.append("\n\tclass: ").append(clazz);
+ }
+ if ( path != null ) {
+ error.append("\n\tpath: ").append(path);
+ }
+ if ( fieldName != null ) {
+ error.append("\n\tfield bridge: ").append(fieldName);
+ }
+ throw new BridgeException(error.toString(), e);
+ }
+
+ public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
+ try {
+ delegate.set(name, value, document, luceneOptions);
+ }
+ catch (Exception e) {
+ throw buildBridgeException(e, "set");
+ }
+ }
+}
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:18:15 UTC (rev 20803)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/engine/DocumentBuilderIndexedEntity.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -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.ExceptionWrapperBridge;
import org.slf4j.Logger;
import org.hibernate.annotations.common.AssertionFailure;
@@ -411,7 +412,11 @@
Store.YES,
Field.Index.NOT_ANALYZED_NO_NORMS, Field.TermVector.NO, idBoost
);
- idBridge.set( idKeywordName, id, doc, luceneOptions );
+ new ExceptionWrapperBridge()
+ .setFieldBridge(idBridge)
+ .setClassAndMethod(entityType, null)
+ .setFieldName(idKeywordName)
+ .set( idKeywordName, id, doc, luceneOptions );
// finally add all other document fields
Set<String> processedFieldNames = new HashSet<String>();
@@ -428,23 +433,37 @@
// 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 );
- fb.set(
- propertiesMetadata.classNames.get( i ), unproxiedInstance,
- doc, propertiesMetadata.getClassLuceneOptions( i )
- );
+ final String fieldName = propertiesMetadata.classNames.get(i);
+ wrapperBridge
+ .setFieldBridge(fb)
+ .setFieldName( fieldName )
+ .set(
+ fieldName, unproxiedInstance,
+ doc, propertiesMetadata.getClassLuceneOptions( i )
+ );
}
// process the indexed fields
for ( int i = 0; i < propertiesMetadata.fieldNames.size(); i++ ) {
XMember member = propertiesMetadata.fieldGetters.get( i );
Object value = ReflectionHelper.getMemberValue( unproxiedInstance, member );
- propertiesMetadata.fieldBridges.get( i ).set(
- propertiesMetadata.fieldNames.get( i ), value, doc,
- propertiesMetadata.getFieldLuceneOptions( i, value )
- );
+
+ final FieldBridge fieldBridge = propertiesMetadata.fieldBridges.get(i);
+ final String fieldName = propertiesMetadata.fieldNames.get(i);
+ wrapperBridge
+ .setFieldBridge(fieldBridge)
+ .setClassAndMethod( beanClass, member.getName() )
+ .setFieldName( fieldName )
+ .set(
+ fieldName, value, doc,
+ propertiesMetadata.getFieldLuceneOptions( i, value )
+ );
}
// allow analyzer override for the fields added by the class and field bridges
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:18:15 UTC (rev 20803)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/BridgeTest.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -40,12 +40,15 @@
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
+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.annotations.Resolution;
+import org.hibernate.search.bridge.BridgeException;
import org.hibernate.search.bridge.builtin.CalendarBridge;
import org.hibernate.search.test.SearchTestCase;
@@ -267,13 +270,51 @@
bridgeParams.put( CalendarBridge.RESOLUTION_PARAMETER, Resolution.DAY.toString() );
bridge.setParameterValues( bridgeParams );
assertEquals( "20001215", bridge.objectToString( c ) );
+ }
+ public void testIncorrectBridge() throws Exception {
+ Incorrect incorrect = new Incorrect();
+ incorrect.setSubIncorrect(new Incorrect.SubIncorrect());
+ incorrect.getSubIncorrect().setName("This is a name not a class");
+
+ 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
+ System.out.println( throwable.getMessage() );
+ 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
+ Cloud.class,
+ Incorrect.class
};
}
Added: 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 (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/bridge/Incorrect.java 2010-10-11 18:19:20 UTC (rev 20804)
@@ -0,0 +1,37 @@
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.IndexedEmbedded;
+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
+ */
+@Entity
+@Indexed
+public class Incorrect {
+ @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 = ClassBridge.class) )
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ private String name;
+ }
+}
14 years, 4 months
Hibernate SVN: r20803 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/engine and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 14:18:15 -0400 (Mon, 11 Oct 2010)
New Revision: 20803
Added:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/TransactionSynchronizationTest.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java
Log:
HSEARCH-606 Do not register for tx synchronization on local tx
When the transaction is local (ie the TransactionManager is null - not great but I don't have a better approach atm), avoid registering the Synchronization event to the transaction and exclusively use the actionQueue.registerProcess.
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java 2010-10-11 15:00:05 UTC (rev 20802)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/backend/impl/EventSourceTransactionContext.java 2010-10-11 18:18:15 UTC (rev 20803)
@@ -27,6 +27,7 @@
import java.io.Serializable;
import javax.transaction.Status;
import javax.transaction.Synchronization;
+import javax.transaction.TransactionManager;
import org.slf4j.Logger;
@@ -92,12 +93,19 @@
* In a JTA env, the before transaction completion is called before the flush, so not all changes are yet
* written. However, Synchronization-s do propagate exceptions, so they can be safely used.
*/
-
final ActionQueue actionQueue = eventSource.getActionQueue();
- actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
- eventSource.getTransaction().registerSynchronization(
- new BeforeCommitSynchronizationDelegator( synchronization )
- );
+ boolean isLocal = isLocalTransaction();
+ if ( isLocal ) {
+ //if local tx never use Synchronization
+ actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
+ }
+ else {
+ //TODO could we remove the action queue registration in this case?
+ actionQueue.registerProcess( new DelegateToSynchronizationOnBeforeTx( synchronization ) );
+ eventSource.getTransaction().registerSynchronization(
+ new BeforeCommitSynchronizationDelegator( synchronization )
+ );
+ }
//executed in all environments
actionQueue.registerProcess( new DelegateToSynchronizationOnAfterTx( synchronization ) );
@@ -116,7 +124,13 @@
}
}
}
-
+
+ private boolean isLocalTransaction() {
+ //TODO make it better but I don't know how we can optimize it.
+ final TransactionManager transactionManager = eventSource.getFactory().getTransactionManager();
+ return transactionManager == null;
+ }
+
private FullTextIndexEventListener getIndexWorkFlushEventListener() {
if ( this.flushListener != null) {
//for the "transient" case: might have been nullified.
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/TransactionSynchronizationTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/TransactionSynchronizationTest.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/TransactionSynchronizationTest.java 2010-10-11 18:18:15 UTC (rev 20803)
@@ -0,0 +1,67 @@
+package org.hibernate.search.test.engine;
+
+import org.hibernate.Transaction;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.bridge.builtin.ClassBridge;
+import org.hibernate.search.test.SearchTestCase;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TransactionSynchronizationTest extends SearchTestCase {
+
+ public void testProperExceptionPropagation() throws Exception {
+ /**
+ * This test relies on the fact that a bridge accepting an incompatible type raise
+ * an exception when used.
+ */
+ FullTextSession fts = Search.getFullTextSession( openSession() );
+ boolean raised = false;
+ final Transaction transaction = fts.beginTransaction();
+ try {
+ Test test = new Test();
+ test.setIncorrectType("not a class");
+ fts.persist(test);
+ transaction.commit();
+ fail("An exception should have been raised");
+ }
+ catch (Exception e) {
+ //good
+ raised = true;
+ transaction.rollback();
+ }
+ assertTrue("An exception should have been raised", raised);
+ fts.close();
+ }
+
+ @Override
+ protected Class<?>[] getAnnotatedClasses() {
+ return new Class<?>[] {
+ Test.class
+ };
+ }
+
+ @Entity
+ @Indexed
+ @Table(name="Test007")
+ public static class Test {
+ @Id @GeneratedValue
+ public Integer getId() { return id; }
+ public void setId(Integer id) { this.id = id; }
+ private Integer id;
+
+ @Field(bridge = @FieldBridge(impl = ClassBridge.class))
+ public String getIncorrectType() { return incorrectType; }
+ public void setIncorrectType(String incorrectType) { this.incorrectType = incorrectType; }
+ private String incorrectType;
+ }
+}
14 years, 4 months
Hibernate SVN: r20802 - in search/trunk/hibernate-search/src: test/java/org/hibernate/search/test/query and 1 other directory.
by hibernate-commits@lists.jboss.org
Author: hardy.ferentschik
Date: 2010-10-11 11:00:05 -0400 (Mon, 11 Oct 2010)
New Revision: 20802
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java
Log:
HSEARCH-604 Added explicit '0' check in FullTextQueryImpl.calculateTopDocsRetrievalSize
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java 2010-10-11 12:22:35 UTC (rev 20801)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/query/FullTextQueryImpl.java 2010-10-11 15:00:05 UTC (rev 20802)
@@ -435,6 +435,9 @@
// don't return just Integer.MAX_VALUE due to a bug in Lucene - see HSEARCH-330
return Integer.MAX_VALUE - 1;
}
+ if (tmpMaxResult == 0) {
+ return 1; // Lucene enforces that at least one top doc will be retrieved. See also HSEARCH-604
+ }
else {
return ( int ) tmpMaxResult;
}
Modified: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java 2010-10-11 12:22:35 UTC (rev 20801)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/query/LuceneQueryTest.java 2010-10-11 15:00:05 UTC (rev 20802)
@@ -1,8 +1,7 @@
-/* $Id$
- *
+/*
* Hibernate, Relational Persistence for Idiomatic Java
*
- * Copyright (c) 2009, Red Hat, Inc. and/or its affiliates or third-party contributors as
+ * Copyright (c) 2010, Red Hat, Inc. and/or its affiliates or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat, Inc.
@@ -29,6 +28,7 @@
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
+
import org.hibernate.FetchMode;
import org.hibernate.ScrollableResults;
import org.hibernate.Transaction;
@@ -39,10 +39,10 @@
import org.hibernate.search.util.HibernateHelper;
import org.hibernate.stat.Statistics;
-
/**
* @author Emmanuel Bernard
* @author John Griffin
+ * @author Hardy Ferentschik
*/
public class LuceneQueryTest extends SearchTestCase {
@@ -53,7 +53,11 @@
s.save( clock );
clock = new Clock( 2, "Festina" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
s.save( book );
@@ -85,7 +89,7 @@
result = hibQuery.list();
assertNotNull( result );
assertEquals( "Query with no class filter", 2, result.size() );
- for (Object element : result) {
+ for ( Object element : result ) {
assertTrue( HibernateHelper.isInitialized( element ) );
s.delete( element );
}
@@ -96,7 +100,9 @@
assertNotNull( result );
assertEquals( "Query with delete objects", 0, result.size() );
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -108,7 +114,11 @@
s.save( clock );
clock = new Clock( 2, "Festina" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
s.save( book );
@@ -121,7 +131,9 @@
Statistics stats = s.getSessionFactory().getStatistics();
stats.clear();
boolean enabled = stats.isStatisticsEnabled();
- if ( !enabled ) stats.setStatisticsEnabled( true );
+ if ( !enabled ) {
+ stats.setStatisticsEnabled( true );
+ }
FullTextQuery hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
assertEquals( "Exection of getResultSize without actual results", 2, hibQuery.getResultSize() );
assertEquals( "No entity should be loaded", 0, stats.getEntityLoadCount() );
@@ -131,8 +143,12 @@
List result = hibQuery.list();
assertNotNull( result );
assertEquals( "2 entities should be loaded", 2, stats.getEntityLoadCount() );
- if ( !enabled ) stats.setStatisticsEnabled( false );
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ if ( !enabled ) {
+ stats.setStatisticsEnabled( false );
+ }
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -144,7 +160,11 @@
s.save( clock );
clock = new Clock( 2, "Festina" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
s.save( book );
@@ -178,7 +198,9 @@
assertNotNull( result );
assertEquals( "first result out of limit", 0, result.size() );
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -190,7 +212,11 @@
s.save( clock );
clock = new Clock( 2, "Festina" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
s.save( book );
@@ -224,7 +250,9 @@
assertNotNull( result );
assertFalse( result.hasNext() );
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -236,7 +264,11 @@
s.save( clock );
clock = new Clock( 2, "Festina" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
book = new Book( 2, "La gloire de mon père", "Les deboires de mon père en vélo" );
s.save( book );
@@ -267,12 +299,15 @@
while ( result.next() ) {
s.delete( result.get()[0] );
}
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
// Technically this is checked by other tests but let's do it anyway. J.G.
+
public void testDefaultFetchSize() throws Exception {
FullTextSession s = Search.getFullTextSession( openSession() );
prepEmployeeIndex( s );
@@ -294,7 +329,9 @@
assertTrue( projections.isFirst() );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -319,7 +356,9 @@
assertEquals( "incorrect entityInfo returned", 1000, result[0] );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -355,7 +394,9 @@
assertEquals( "incorrect entityInfo returned", 1002, result[0] );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -399,7 +440,9 @@
assertNull( result );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -425,11 +468,47 @@
assertNull( "non-null entity infos returned", result );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
+ /**
+ * Test for HSEARCH-604. Tests that max result 0 does not throw an exception.
+ *
+ * @throws Exception in case the test fails.
+ */
+ public void testMaxResultZero() throws Exception {
+ FullTextSession s = Search.getFullTextSession( openSession() );
+ prepEmployeeIndex( s );
+
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ QueryParser parser = new QueryParser( getTargetLuceneVersion(), "dept", SearchTestCase.standardAnalyzer );
+ Query query = parser.parse( "dept:foo" );
+ org.hibernate.search.FullTextQuery hibQuery = s.createFullTextQuery( query, Employee.class );
+ hibQuery.setFirstResult( 0 );
+ hibQuery.setMaxResults( 0 );
+
+ List result = hibQuery.list();
+ assertTrue( "We should get the empty result list", result.isEmpty() );
+
+ hibQuery.setFirstResult( 1 );
+ hibQuery.setMaxResults( 0 );
+
+ result = hibQuery.list();
+ assertTrue( "We should get the empty result list", result.isEmpty() );
+
+ //cleanup
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
+ tx.commit();
+ s.close();
+ }
+
public void testCurrent() throws Exception {
FullTextSession s = Search.getFullTextSession( openSession() );
prepEmployeeIndex( s );
@@ -443,25 +522,24 @@
hibQuery.setProjection( "id", "lastname", "dept" );
-
ScrollableResults results = hibQuery.scroll();
results.beforeFirst();
results.next();
- assertTrue("beforeFirst() pointer incorrect", results.isFirst());
+ assertTrue( "beforeFirst() pointer incorrect", results.isFirst() );
results.afterLast();
results.previous();
- assertTrue("afterLast() pointer incorrect", results.isLast());
+ assertTrue( "afterLast() pointer incorrect", results.isLast() );
// Let's see if a bad reverse scroll screws things up
results.scroll( -8 );
results.next();
- assertTrue("large negative scroll() pointer incorrect", results.isFirst());
+ assertTrue( "large negative scroll() pointer incorrect", results.isFirst() );
// And test a bad forward scroll.
results.scroll( 10 );
results.previous();
- assertTrue("large positive scroll() pointer incorrect", results.isLast());
+ assertTrue( "large positive scroll() pointer incorrect", results.isLast() );
// Finally, let's test a REAL screwup.
hibQuery.setFirstResult( 3 );
@@ -470,14 +548,16 @@
results = hibQuery.scroll();
results.first();
Object[] result = results.get();
- assertEquals(1004, result[0]);
+ assertEquals( 1004, result[0] );
results.last();
result = results.get();
- assertEquals(1004, result[0]);
+ assertEquals( 1004, result[0] );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -487,9 +567,15 @@
Transaction tx = s.beginTransaction();
Clock clock = new Clock( 1, "Seiko" );
s.save( clock );
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
- AlternateBook alternateBook = new AlternateBook( 1, "La chute de la petite reine a travers les yeux de Festina" );
+ AlternateBook alternateBook = new AlternateBook(
+ 1, "La chute de la petite reine a travers les yeux de Festina"
+ );
s.save( alternateBook );
tx.commit();
s.clear();
@@ -529,11 +615,13 @@
result = hibQuery.list();
assertNotNull( result );
assertEquals( "Query with no class filter", 2, result.size() );
- for (Object element : result) {
+ for ( Object element : result ) {
assertTrue( HibernateHelper.isInitialized( element ) );
s.delete( element );
}
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -541,7 +629,11 @@
public void testCriteria() throws Exception {
FullTextSession s = Search.getFullTextSession( openSession() );
Transaction tx = s.beginTransaction();
- Book book = new Book( 1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah" );
+ Book book = new Book(
+ 1,
+ "La chute de la petite reine a travers les yeux de Festina",
+ "La chute de la petite reine a travers les yeux de Festina, blahblah"
+ );
s.save( book );
Author emmanuel = new Author();
emmanuel.setName( "Emmanuel" );
@@ -561,7 +653,8 @@
assertFalse( "Association should not be inintialized", HibernateHelper.isInitialized( book.getAuthors() ) );
result = s.createFullTextQuery( query ).setCriteriaQuery(
- s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN ) ).list();
+ s.createCriteria( Book.class ).setFetchMode( "authors", FetchMode.JOIN )
+ ).list();
assertNotNull( result );
assertEquals( "Query with explicit criteria", 1, result.size() );
book = (Book) result.get( 0 );
@@ -572,7 +665,9 @@
Author author = book.getAuthors().iterator().next();
book.getAuthors().remove( author );
- for (Object element : s.createQuery( "from java.lang.Object" ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from java.lang.Object" ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -603,7 +698,9 @@
assertNull( projection );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -626,7 +723,9 @@
assertEquals( 0, result.size() );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
@@ -649,7 +748,9 @@
assertFalse( iter.hasNext() );
//cleanup
- for (Object element : s.createQuery( "from " + Employee.class.getName() ).list()) s.delete( element );
+ for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) {
+ s.delete( element );
+ }
tx.commit();
s.close();
}
14 years, 4 months
Hibernate SVN: r20800 - in search/trunk/hibernate-search/src: main/java/org/hibernate/search/jpa/impl and 1 other directories.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 04:54:42 -0400 (Mon, 11 Oct 2010)
New Revision: 20800
Added:
search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/FullTextWrapperTest.java
Modified:
search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java
search/trunk/hibernate-search/src/main/java/org/hibernate/search/jpa/impl/FullTextEntityManagerImpl.java
Log:
HSEARCH-556 Raise IllegaLArgumentException when passing a null Session or EntityManager to Search
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java 2010-10-11 08:53:51 UTC (rev 20799)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/impl/FullTextSessionImpl.java 2010-10-11 08:54:42 UTC (rev 20800)
@@ -100,6 +100,9 @@
public FullTextSessionImpl(org.hibernate.Session session) {
+ if ( session == null ) {
+ throw new IllegalArgumentException("Unable to create a FullTextSession from an null Session object");
+ }
this.session = ( Session ) session;
this.transactionContext = new EventSourceTransactionContext( ( EventSource ) session );
this.sessionImplementor = ( SessionImplementor ) session;
Modified: search/trunk/hibernate-search/src/main/java/org/hibernate/search/jpa/impl/FullTextEntityManagerImpl.java
===================================================================
--- search/trunk/hibernate-search/src/main/java/org/hibernate/search/jpa/impl/FullTextEntityManagerImpl.java 2010-10-11 08:53:51 UTC (rev 20799)
+++ search/trunk/hibernate-search/src/main/java/org/hibernate/search/jpa/impl/FullTextEntityManagerImpl.java 2010-10-11 08:54:42 UTC (rev 20800)
@@ -54,6 +54,9 @@
private FullTextSession ftSession;
public FullTextEntityManagerImpl(EntityManager em) {
+ if ( em == null ) {
+ throw new IllegalArgumentException("Unable to create a FullTextEntityManager from a null EntityManager");
+ }
this.em = em;
}
Added: search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/FullTextWrapperTest.java
===================================================================
--- search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/FullTextWrapperTest.java (rev 0)
+++ search/trunk/hibernate-search/src/test/java/org/hibernate/search/test/engine/FullTextWrapperTest.java 2010-10-11 08:54:42 UTC (rev 20800)
@@ -0,0 +1,40 @@
+package org.hibernate.search.test.engine;
+
+import org.hibernate.search.Search;
+import org.hibernate.search.store.RAMDirectoryProvider;
+import org.hibernate.search.test.SearchTestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FullTextWrapperTest extends SearchTestCase {
+
+ public void testSearch() throws Exception {
+ try {
+ Search.getFullTextSession( null );
+ }
+ catch (IllegalArgumentException e) {
+ //good
+ }
+
+ try {
+ org.hibernate.search.jpa.Search.getFullTextEntityManager( null );
+ }
+ catch (IllegalArgumentException e) {
+ //good
+ }
+ }
+
+ // Test setup options - Entities
+ @Override
+ protected Class<?>[] getAnnotatedClasses() {
+ return new Class[] { BusLine.class, BusStop.class };
+ }
+
+ // Test setup options - SessionFactory Properties
+ @Override
+ protected void configure(org.hibernate.cfg.Configuration configuration) {
+ super.configure( configuration );
+ cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ }
+}
14 years, 4 months
Hibernate SVN: r20799 - search/trunk/hibernate-search/src/main/docbook/en-US/modules.
by hibernate-commits@lists.jboss.org
Author: epbernard
Date: 2010-10-11 04:53:51 -0400 (Mon, 11 Oct 2010)
New Revision: 20799
Modified:
search/trunk/hibernate-search/src/main/docbook/en-US/modules/getting-started.xml
Log:
HSEARCH-594 Fix typo in getting started guide
Modified: search/trunk/hibernate-search/src/main/docbook/en-US/modules/getting-started.xml
===================================================================
--- search/trunk/hibernate-search/src/main/docbook/en-US/modules/getting-started.xml 2010-10-11 01:14:57 UTC (rev 20798)
+++ search/trunk/hibernate-search/src/main/docbook/en-US/modules/getting-started.xml 2010-10-11 08:53:51 UTC (rev 20799)
@@ -336,7 +336,7 @@
(<literal>@ManyToMany</literal>, <literal>@*ToOne</literal> and
<literal>@Embedded</literal>) as part of the owning entity. This is needed
since a Lucene index document is a flat data structure which does not know
- anything about object relations. To ensure that the authors' name wil be
+ anything about object relations. To ensure that the authors' name will be
searchable you have to make sure that the names are indexed as part of the
book itself. On top of <literal>@IndexedEmbedded</literal> you will also
have to mark all fields of the associated entity you want to have included
14 years, 4 months