/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.bridge; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.lucene.document.Document; import org.hibernate.Transaction; import org.hibernate.search.annotations.ClassBridge; import org.hibernate.search.annotations.Field; import org.hibernate.search.annotations.Indexed; import org.hibernate.search.annotations.IndexedEmbedded; import org.hibernate.search.bridge.BridgeException; import org.hibernate.search.bridge.FieldBridge; import org.hibernate.search.bridge.LuceneOptions; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.testsupport.TestForIssue; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; /** * @author Hardy Ferentschik */ @TestForIssue(jiraKey = "1045") public class BridgeConversionErrorTest extends SearchTestBase { @Test public void testClassBridgeError() throws Exception { ClassBridged classBridged = new ClassBridged(); org.hibernate.Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( classBridged ); try { tx.commit(); fail(); } catch (Exception e) { Throwable cause = e.getCause(); assertTrue( cause instanceof BridgeException ); String expectedErrorMessage = "Exception while calling bridge#set" + "\n\tentity class: org.hibernate.search.test.bridge.BridgeConversionErrorTest$ClassBridged" + "\n\tdocument field name: test" + "\n\tfield bridge: <result of ExceptionThrowingBridge.toString()>"; assertEquals( "Wrong error message", expectedErrorMessage, cause.getMessage() ); } } @Test public void testFieldBridgeError() throws Exception { SimpleEntity entity = new SimpleEntity( "foo" ); org.hibernate.Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( entity ); try { tx.commit(); fail(); } catch (Exception e) { Throwable cause = e.getCause(); assertTrue( cause instanceof BridgeException ); String expectedErrorMessage = "Exception while calling bridge#set" + "\n\tentity class: org.hibernate.search.test.bridge.BridgeConversionErrorTest$SimpleEntity" + "\n\tentity property path: name" + "\n\tdocument field name: overriddenFieldName" + "\n\tfield bridge: <result of ExceptionThrowingBridge.toString()>"; assertEquals( "Wrong error message", expectedErrorMessage, cause.getMessage() ); } } @Test public void testEmbeddedBridgeError() throws Exception { SimpleEntity entity = new SimpleEntity( null ); // null won't throw an exception EmbeddedEntity embedded = new EmbeddedEntity( "foo" ); entity.setEmbedded( embedded ); org.hibernate.Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( entity ); try { tx.commit(); fail(); } catch (Exception e) { Throwable cause = e.getCause(); assertTrue( cause instanceof BridgeException ); String expectedErrorMessage = "Exception while calling bridge#set" + "\n\tentity class: org.hibernate.search.test.bridge.BridgeConversionErrorTest$SimpleEntity" + "\n\tentity property path: embedded.name" + "\n\tdocument field name: overriddenEmbeddedPrefix.overriddenEmbeddedFieldName" + "\n\tfield bridge: <result of ExceptionThrowingBridge.toString()>"; assertEquals( "Wrong error message", expectedErrorMessage, cause.getMessage() ); } } @Test public void testEmbeddedEmbeddedBridgeError() throws Exception { SimpleEntity entity = new SimpleEntity( null ); // null won't throw an exception EmbeddedEntity embedded = new EmbeddedEntity( null ); // null won't throw an exception entity.setEmbedded( embedded ); embedded.setEmbeddedEmbedded( new EmbeddedEmbeddedEntity( "foo" ) ); org.hibernate.Session s = openSession(); Transaction tx = s.beginTransaction(); s.persist( entity ); try { tx.commit(); fail(); } catch (Exception e) { Throwable cause = e.getCause(); assertTrue( cause instanceof BridgeException ); String expectedErrorMessage = "Exception while calling bridge#set" + "\n\tentity class: org.hibernate.search.test.bridge.BridgeConversionErrorTest$SimpleEntity" + "\n\tentity property path: embedded.embeddedEmbedded.name" + "\n\tdocument field name: overriddenEmbeddedPrefix.overriddenEmbeddedEmbeddedPrefix.overriddenEmbeddedEmbeddedFieldName" + "\n\tfield bridge: <result of ExceptionThrowingBridge.toString()>"; assertEquals( "Wrong error message", expectedErrorMessage, cause.getMessage() ); } } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { ClassBridged.class, SimpleEntity.class, EmbeddedEntity.class, EmbeddedEmbeddedEntity.class }; } public static class ExceptionThrowingBridge implements FieldBridge { @Override public void set(String name, Object value, Document document, LuceneOptions luceneOptions) { if ( value != null ) { throw new RuntimeException( "boom" ); } } @Override public String toString() { return "<result of ExceptionThrowingBridge.toString()>"; } } @Entity @Indexed @Table(name = "CLASSBRIDGED") @ClassBridge(impl = ExceptionThrowingBridge.class, name = "test") public static class ClassBridged { @Id @GeneratedValue private long id; } @Entity @Indexed @Table(name = "SIMPLEENTITY") public static class SimpleEntity { @Id @GeneratedValue private long id; @Field(name = "overriddenFieldName") @org.hibernate.search.annotations.FieldBridge(impl = ExceptionThrowingBridge.class) private String name; @IndexedEmbedded(prefix = "overriddenEmbeddedPrefix.") @OneToOne(cascade = CascadeType.ALL) private EmbeddedEntity embedded; public SimpleEntity(String name) { this.name = name; } public SimpleEntity() { } public void setEmbedded(EmbeddedEntity embedded) { this.embedded = embedded; } } @Entity @Table(name = "EMBEDDEDENTITY") public static class EmbeddedEntity { @Id @GeneratedValue private long id; @Field(name = "overriddenEmbeddedFieldName") @org.hibernate.search.annotations.FieldBridge(impl = ExceptionThrowingBridge.class) private String name; public EmbeddedEntity(String name) { this.name = name; } public EmbeddedEntity() { } @IndexedEmbedded(prefix = "overriddenEmbeddedEmbeddedPrefix.") @OneToOne(cascade = CascadeType.ALL) private EmbeddedEmbeddedEntity embeddedEmbedded; public void setEmbeddedEmbedded(EmbeddedEmbeddedEntity embedded) { this.embeddedEmbedded = embedded; } } @Entity @Table(name = "EMBEDDEDTWICEENTITY") public static class EmbeddedEmbeddedEntity { @Id @GeneratedValue private long id; @Field(name = "overriddenEmbeddedEmbeddedFieldName") @org.hibernate.search.annotations.FieldBridge(impl = ExceptionThrowingBridge.class) private String name; public EmbeddedEmbeddedEntity(String name) { this.name = name; } public EmbeddedEmbeddedEntity() { } } }