Hello Hardy, thanks for your attention, I'll attach my current version (absolutely untested) just to give the idea. If you look at the current trunk the last listener handling (PostCollectionUpdateEventListener) is not consistent with the others; I thought it was "suspect", but forgot to mention it in my previous post.
Sanne 2008/8/23 Hardy Ferentschik <[EMAIL PROTECTED]>: > Hi Sanne, > > I have a few comments, since I was the last one working on the code. I hope > you might find this helpful. > First of all, EventListenerRegister has its origin in the Annotations > project and just recently got moved from Annotations to Search (where it > actually belongs). I applied some refactorings, but the biggest outstanding > refactoring would be to generalise the registration of the listeners. I > tried one apporach, but the code became very hard to read. So I decided to > leave this part as is for now. > > Initially I wanted to get rid of the old registration code completely and if > you check the history of the class you will see that I did not have > 'searchEventListenerClass == eventListener.getClass().getSuperclass();' at > all. It worked fine for the latest versions of Annotations and Search. > However, I think there were problems when using different combinations of > Annotations and Search. For that reason Emmanuel added this additional > check. It evades me right now what the actual reason was. > > Regarding "isAssignableFrom" - you might be right. Let me have another look > at the code and come back to you. > > --Hardy >
// $Id: EventListenerRegister.java 14989 2008-07-29 18:09:11Z hardy.ferentschik $ package org.hibernate.search.event; import java.util.Properties; import org.hibernate.event.EventListeners; import org.hibernate.event.PostCollectionRecreateEventListener; import org.hibernate.event.PostCollectionRemoveEventListener; import org.hibernate.event.PostCollectionUpdateEventListener; import org.hibernate.event.PostDeleteEventListener; import org.hibernate.event.PostInsertEventListener; import org.hibernate.event.PostUpdateEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Helper methods initializing Hibernate Search event listeners. * * @author Emmanuel Bernard * @author Hardy Ferentschik * @author Sanne Grinovero */ public class EventListenerRegister { private static final Logger log = LoggerFactory.getLogger(EventListenerRegister.class); public static void enableHibernateSearch(EventListeners eventListeners, Properties properties) { // check whether search is explicitly disabled - if so there is nothing to do String enableSearchListeners = properties.getProperty( "hibernate.search.autoregister_listeners" ); if ( "false".equalsIgnoreCase( enableSearchListeners ) ) { log.info( "Property hibernate.search.autoregister_listeners is set to false." + " No attempt will be made to register Hibernate Search event listeners." ); return; } FullTextIndexEventListener searchEventListener = new FullTextIndexEventListener(); final Class<? extends FullTextIndexEventListener> searchClass = searchEventListener.getClass(); { PostInsertEventListener[] listeners = eventListeners.getPostInsertEventListeners(); listeners = ( listeners == null ) ? new PostInsertEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostInsertEventListeners( listeners ); } { PostUpdateEventListener[] listeners = eventListeners.getPostUpdateEventListeners(); listeners = ( listeners == null ) ? new PostUpdateEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostUpdateEventListeners( listeners ); } { PostDeleteEventListener[] listeners = eventListeners.getPostDeleteEventListeners(); listeners = ( listeners == null ) ? new PostDeleteEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostDeleteEventListeners( listeners ); } { PostCollectionRecreateEventListener[] listeners = eventListeners.getPostCollectionRecreateEventListeners(); listeners = ( listeners == null ) ? new PostCollectionRecreateEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostCollectionRecreateEventListeners( listeners ); } { PostCollectionRemoveEventListener[] listeners = eventListeners.getPostCollectionRemoveEventListeners(); listeners = ( listeners == null ) ? new PostCollectionRemoveEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostCollectionRemoveEventListeners( listeners ); } { PostCollectionUpdateEventListener[] listeners = eventListeners.getPostCollectionUpdateEventListeners(); listeners = ( listeners == null ) ? new PostCollectionUpdateEventListener[] { searchEventListener } : addIfNeeded( listeners, searchClass, searchEventListener ); eventListeners.setPostCollectionUpdateEventListeners( listeners ); } } private static <T> T[] addIfNeeded(T[] listeners, Class<? extends FullTextIndexEventListener> searchClass, T searchEventListener) { if ( ! isPresentInListeners( listeners, searchClass ) ) { return appendToArray( listeners, searchEventListener ); } else { return listeners; } } @SuppressWarnings("unchecked") private static <T> T[] appendToArray(T[] listeners, T newElement) { int length = listeners.length; T[] ret = (T[])java.lang.reflect.Array.newInstance( listeners.getClass().getComponentType(), length + 1 ); System.arraycopy( listeners, 0, ret, 0, length ); ret[length] = newElement; return ret; } private static boolean isPresentInListeners(Object[] listeners, Class searchEventListenerClass) { for (Object eventListener : listeners) { // not isAssignableFrom since the user could subclass if ( searchEventListenerClass == eventListener.getClass() ) { return true; } //for FullTextIndexCollectionEventListener if ( searchEventListenerClass == eventListener.getClass().getSuperclass() ) { return true; } } return false; } }
_______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev