[hibernate-commits] Hibernate SVN: r14326 - in search/trunk/src: test/org/hibernate/search/test/embedded and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Sun Feb 10 14:58:01 EST 2008


Author: epbernard
Date: 2008-02-10 14:58:01 -0500 (Sun, 10 Feb 2008)
New Revision: 14326

Modified:
   search/trunk/src/java/org/hibernate/search/event/FullTextIndexCollectionEventListener.java
   search/trunk/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java
Log:
HSEARCH-56

Modified: search/trunk/src/java/org/hibernate/search/event/FullTextIndexCollectionEventListener.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/event/FullTextIndexCollectionEventListener.java	2008-02-10 19:56:04 UTC (rev 14325)
+++ search/trunk/src/java/org/hibernate/search/event/FullTextIndexCollectionEventListener.java	2008-02-10 19:58:01 UTC (rev 14326)
@@ -10,7 +10,11 @@
 import org.hibernate.event.PostCollectionRemoveEvent;
 import org.hibernate.event.PostCollectionUpdateEvent;
 import org.hibernate.event.AbstractEvent;
+import org.hibernate.event.AbstractCollectionEvent;
 import org.hibernate.search.backend.WorkType;
+import org.hibernate.engine.EntityEntry;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 
 /**
  * Support collection event listening (starts from hibernate core 3.2.6)
@@ -22,28 +26,45 @@
 		implements PostCollectionRecreateEventListener,
 		PostCollectionRemoveEventListener,
 		PostCollectionUpdateEventListener {
+	private static Log log = LogFactory.getLog( FullTextIndexCollectionEventListener.class );
+
 	public void onPostRecreateCollection(PostCollectionRecreateEvent event) {
-		Object entity = event.getAffectedOwner();
+		processCollectionEvent( event );
+	}
+
+	private void processCollectionEvent(AbstractCollectionEvent event) {
+		Object entity = event.getAffectedOwnerOrNull();
+		if ( entity == null ) {
+			//Hibernate cannot determine every single time the owner especially incase detached objects are involved
+			// or property-ref is used
+			//Should log really but we don't know if we're interested in this collection for indexing
+			return;
+		}
 		if ( used && searchFactoryImplementor.getDocumentBuilders().containsKey( entity.getClass() ) ) {
-			processWork( entity, getId( entity, event ), WorkType.COLLECTION, event );
+			Serializable id = getId( entity, event );
+			if (id == null) {
+				log.warn( "Unable to reindex entity on collection change, id cannot be extracted: " + event.getAffectedOwnerEntityName() );
+				return;
+			}
+			processWork( entity, id, WorkType.COLLECTION, event );
 		}
 	}
 
-	private Serializable getId(Object entity, AbstractEvent event) {
-		return event.getSession().getPersistenceContext().getEntry( entity ).getId();
+	private Serializable getId(Object entity, AbstractCollectionEvent event) {
+		Serializable id = event.getAffectedOwnerIdOrNull();
+		if ( id == null ) {
+			//most likely this recovery is unnecessary since Hibernate Core probably try that 
+			EntityEntry entityEntry = event.getSession().getPersistenceContext().getEntry( entity );
+			id = entityEntry == null ? null : entityEntry.getId();
+		}
+		return id;
 	}
 
 	public void onPostRemoveCollection(PostCollectionRemoveEvent event) {
-		Object entity = event.getAffectedOwner();
-		if ( used && searchFactoryImplementor.getDocumentBuilders().containsKey( entity.getClass() ) ) {
-			processWork( entity, getId( entity, event ), WorkType.COLLECTION, event );
-		}
+		processCollectionEvent( event );
 	}
 
 	public void onPostUpdateCollection(PostCollectionUpdateEvent event) {
-		Object entity = event.getAffectedOwner();
-		if ( used && searchFactoryImplementor.getDocumentBuilders().containsKey( entity.getClass() ) ) {
-			processWork( entity, getId( entity, event ), WorkType.COLLECTION, event );
-		}
+		processCollectionEvent( event );
 	}
 }

Modified: search/trunk/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java	2008-02-10 19:56:04 UTC (rev 14325)
+++ search/trunk/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java	2008-02-10 19:58:01 UTC (rev 14326)
@@ -152,7 +152,7 @@
 
 	}
 
-	public void testIndexedEmbeddedAndCollectionsFailureExpected() throws Exception {
+	public void testIndexedEmbeddedAndCollections() throws Exception {
 		Author a = new Author();
 		a.setName( "Voltaire" );
 		Author a2 = new Author();
@@ -238,9 +238,9 @@
 	protected void configure(org.hibernate.cfg.Configuration cfg) {
 		super.configure( cfg );
 		FullTextIndexCollectionEventListener del = new FullTextIndexCollectionEventListener();
-		cfg.getEventListeners().setPostCollectionRecreateEventListeners( new PostCollectionRecreateEventListener[]{del} );
-		cfg.getEventListeners().setPostCollectionUpdateEventListeners( new PostCollectionUpdateEventListener[]{del} );
-		cfg.getEventListeners().setPostCollectionRemoveEventListeners( new PostCollectionRemoveEventListener[]{del} );
+		//cfg.getEventListeners().setPostCollectionRecreateEventListeners( new PostCollectionRecreateEventListener[]{del} );
+		//cfg.getEventListeners().setPostCollectionUpdateEventListeners( new PostCollectionUpdateEventListener[]{del} );
+		//cfg.getEventListeners().setPostCollectionRemoveEventListeners( new PostCollectionRemoveEventListener[]{del} );
 	}
 
 	protected Class[] getMappings() {




More information about the hibernate-commits mailing list