[hibernate-commits] Hibernate SVN: r11251 - in branches/Branch_3_2/HibernateExt: annotations/src/java/org/hibernate/cfg and 11 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Mar 2 03:26:10 EST 2007


Author: epbernard
Date: 2007-03-02 03:26:10 -0500 (Fri, 02 Mar 2007)
New Revision: 11251

Modified:
   branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml
   branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
   branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java
   branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java
   branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java
   branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml
   branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java
   branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java
   branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
   branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml
   branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java
   branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java
   branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java
Log:
ANN-552 Transparent event registration if validator or search are in the classpath

Modified: branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml	2007-03-02 08:26:10 UTC (rev 11251)
@@ -50,7 +50,7 @@
 
       <para>If Hibernate Validator
       (<filename>hibernate-validator.jar</filename>) is available in the
-      classpath, Hibernate Annotations will integrates in two ways: </para>
+      classpath, Hibernate Annotations will integrates in two ways:</para>
 
       <itemizedlist>
         <listitem>
@@ -74,6 +74,14 @@
       <literal>hibernate.validator.apply_to_ddl</literal> to false in the
       configuration file. Such a need is very uncommon and not
       recommanded.</para>
+
+      <para>To disable pre-entity change validation, set up
+      <literal>hibernate.validator.autoregister_listeners</literal> to false
+      in the configuration file. Such a need is very uncommon and not
+      recommanded.</para>
+
+      <para>Check the Hibernate Validator reference documentation for more
+      information.</para>
     </section>
   </section>
 
@@ -98,9 +106,15 @@
     <section>
       <title>Integration with Hibernate Annotations</title>
 
-      <para>Hibernate Search integrates with Hibernate Annotations through
-      Hibernate event listeners definitions, please check the Hibernate Search
-      reference documentation for more information.</para>
+      <para>Hibernate Search integrates with Hibernate Annotations
+      transparently provided that hibernate-search.jar is present in the
+      classpath. If you do not wish to autoregister Hibernate Search event
+      listeners, you can set
+      <literal>hibernate.search.autoregister_listeners</literal> to false.
+      Such a need is very uncommon and not recommanded.</para>
+
+      <para>Check the Hibernate Search reference documentation for more
+      information.</para>
     </section>
   </section>
 </chapter>
\ No newline at end of file

Modified: branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -4,6 +4,8 @@
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -13,15 +15,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.ResourceBundle;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
-import java.util.ResourceBundle;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
 import javax.persistence.Entity;
 import javax.persistence.MappedSuperclass;
 
@@ -34,16 +32,23 @@
 import org.dom4j.io.SAXReader;
 import org.hibernate.AnnotationException;
 import org.hibernate.AssertionFailure;
+import org.hibernate.HibernateException;
 import org.hibernate.MappingException;
+import org.hibernate.SessionFactory;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
 import org.hibernate.cfg.annotations.Version;
+import org.hibernate.cfg.annotations.reflection.EJB3ReflectionManager;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.event.PostDeleteEventListener;
 import org.hibernate.mapping.Column;
 import org.hibernate.mapping.Join;
 import org.hibernate.mapping.PersistentClass;
 import org.hibernate.mapping.Table;
 import org.hibernate.mapping.UniqueKey;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.cfg.annotations.reflection.EJB3ReflectionManager;
 import org.hibernate.util.JoinedIterator;
 import org.hibernate.util.ReflectHelper;
 import org.hibernate.util.StringHelper;
@@ -739,6 +744,177 @@
 		}
 	}
 
+	public SessionFactory buildSessionFactory() throws HibernateException {
+		//add validator events if the jar is available
+		boolean enableValidatorListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.validator.autoregister_listeners" ) );
+		Class validateEventListenerClass = null;
+		try {
+			validateEventListenerClass = ReflectHelper.classForName(
+					"org.hibernate.validator.event.ValidateEventListener",
+					AnnotationConfiguration.class );
+		}
+		catch (ClassNotFoundException e) {
+			//validator is not present
+			log.debug( "Validator not present in classpath, ignoring event listener registration" );
+		}
+		if (enableValidatorListeners && validateEventListenerClass != null) {
+			//TODO so much duplication
+			Object validateEventListener;
+			try {
+				validateEventListener = validateEventListenerClass.newInstance();
+			}
+			catch (Exception e) {
+				throw new AnnotationException("Unable to load Validator event listener", e );
+			}
+			{
+				boolean present = false;
+				PreInsertEventListener[] listeners = getEventListeners().getPreInsertEventListeners();
+				if (listeners != null) {
+					for ( Object eventListener : listeners ) {
+						//not isAssignableFrom since the user could subclass
+						present = present || validateEventListenerClass == eventListener.getClass();
+					}
+					if (!present) {
+						int length = listeners.length + 1;
+						PreInsertEventListener[] newListeners = new PreInsertEventListener[length];
+						for ( int i = 0 ; i < length - 1 ; i++ ) {
+							newListeners[i] = listeners[i];
+						}
+						newListeners[length-1] = (PreInsertEventListener) validateEventListener;
+						getEventListeners().setPreInsertEventListeners(newListeners);
+					}
+				}
+				else {
+					getEventListeners().setPreInsertEventListeners(
+							new PreInsertEventListener[] { (PreInsertEventListener) validateEventListener }
+					);
+				}
+			}
+
+			//update event listener
+			{
+				boolean present = false;
+				PreUpdateEventListener[] listeners = getEventListeners().getPreUpdateEventListeners();
+				if (listeners != null) {
+					for ( Object eventListener : listeners ) {
+						//not isAssignableFrom since the user could subclass
+						present = present || validateEventListenerClass == eventListener.getClass();
+					}
+					if (!present) {
+						int length = listeners.length + 1;
+						PreUpdateEventListener[] newListeners = new PreUpdateEventListener[length];
+						for ( int i = 0 ; i < length - 1 ; i++ ) {
+							newListeners[i] = listeners[i];
+						}
+						newListeners[length-1] = (PreUpdateEventListener) validateEventListener;
+						getEventListeners().setPreUpdateEventListeners(newListeners);
+					}
+				}
+				else {
+					getEventListeners().setPreUpdateEventListeners(
+							new PreUpdateEventListener[] { (PreUpdateEventListener) validateEventListener }
+					);
+				}
+			}
+		}
+
+		//add search events if the jar is available
+		boolean enableSearchListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.search.autoregister_listeners" ) );
+		Class searchEventListenerClass = null;
+		try {
+			searchEventListenerClass = ReflectHelper.classForName(
+					"org.hibernate.search.event.FullTextIndexEventListener",
+					AnnotationConfiguration.class );
+		}
+		catch (ClassNotFoundException e) {
+			//search is not present
+			log.debug( "Search not present in classpath, ignoring event listener registration" );
+		}
+		if (enableSearchListeners && searchEventListenerClass != null) {
+			//TODO so much duplication
+			Object searchEventListener;
+			try {
+				searchEventListener = searchEventListenerClass.newInstance();
+			}
+			catch (Exception e) {
+				throw new AnnotationException("Unable to load Search event listener", e );
+			}
+			{
+				boolean present = false;
+				PostInsertEventListener[] listeners = getEventListeners().getPostInsertEventListeners();
+				if (listeners != null) {
+					for ( Object eventListener : listeners ) {
+						//not isAssignableFrom since the user could subclass
+						present = present || searchEventListenerClass == eventListener.getClass();
+					}
+					if (!present) {
+						int length = listeners.length + 1;
+						PostInsertEventListener[] newListeners = new PostInsertEventListener[length];
+						for ( int i = 0 ; i < length - 1 ; i++ ) {
+							newListeners[i] = listeners[i];
+						}
+						newListeners[length-1] = (PostInsertEventListener) searchEventListener;
+						getEventListeners().setPostInsertEventListeners(newListeners);
+					}
+				}
+				else {
+					getEventListeners().setPostInsertEventListeners(
+							new PostInsertEventListener[] { (PostInsertEventListener) searchEventListener }
+					);
+				}
+			}
+			{
+				boolean present = false;
+				PostUpdateEventListener[] listeners = getEventListeners().getPostUpdateEventListeners();
+				if (listeners != null) {
+					for ( Object eventListener : listeners ) {
+						//not isAssignableFrom since the user could subclass
+						present = present || searchEventListenerClass == eventListener.getClass();
+					}
+					if (!present) {
+						int length = listeners.length + 1;
+						PostUpdateEventListener[] newListeners = new PostUpdateEventListener[length];
+						for ( int i = 0 ; i < length - 1 ; i++ ) {
+							newListeners[i] = listeners[i];
+						}
+						newListeners[length-1] = (PostUpdateEventListener) searchEventListener;
+						getEventListeners().setPostUpdateEventListeners(newListeners);
+					}
+				}
+				else {
+					getEventListeners().setPostUpdateEventListeners(
+							new PostUpdateEventListener[] { (PostUpdateEventListener) searchEventListener }
+					);
+				}
+			}
+			{
+				boolean present = false;
+				PostDeleteEventListener[] listeners = getEventListeners().getPostDeleteEventListeners();
+				if (listeners != null) {
+					for ( Object eventListener : listeners ) {
+						//not isAssignableFrom since the user could subclass
+						present = present || searchEventListenerClass == eventListener.getClass();
+					}
+					if (!present) {
+						int length = listeners.length + 1;
+						PostDeleteEventListener[] newListeners = new PostDeleteEventListener[length];
+						for ( int i = 0 ; i < length - 1 ; i++ ) {
+							newListeners[i] = listeners[i];
+						}
+						newListeners[length-1] = (PostDeleteEventListener) searchEventListener;
+						getEventListeners().setPostDeleteEventListeners(newListeners);
+					}
+				}
+				else {
+					getEventListeners().setPostDeleteEventListeners(
+							new PostDeleteEventListener[] { (PostDeleteEventListener) searchEventListener }
+					);
+				}
+			}
+		}
+		return super.buildSessionFactory();
+	}
+
 	//not a public API
 	public ReflectionManager getReflectionManager() {
 		return reflectionManager;

Modified: branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -65,7 +65,6 @@
 
 	public EventListenerConfigurator(Ejb3Configuration configuration) {
 		this.configuration = configuration;
-		ValidateEventListener validateEventListener = new ValidateEventListener();
 		EventListeners listenerConfig = configuration.getEventListeners();
 
 		//Action event
@@ -91,13 +90,11 @@
 		listenerConfig.setPreInsertEventListeners(
 				new PreInsertEventListener[]{
 						new JACCPreInsertEventListener(),
-						validateEventListener
 				}
 		);
 		listenerConfig.setPreUpdateEventListeners(
 				new PreUpdateEventListener[]{
 						new JACCPreUpdateEventListener(),
-						validateEventListener
 				}
 		);
 		listenerConfig.setPreDeleteEventListeners(

Modified: branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -214,29 +214,31 @@
 		emf.close();
 	}
 
-	public void testListenersOverridingCfgXmlPar() throws Exception {
-		EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
-		EntityManager em = emf.createEntityManager();
-		Cat cat = new Cat();
-		cat.setName( "123"); //validator catch that
-		em.getTransaction().begin();
-		try {
-			em.persist( cat );
-			em.flush();
-		}
-		catch (InvalidStateException e) {
-			fail("Shouldn't call the ValidatorEvent listener");
-		}
-		catch (PersistenceException e) {
-			if ( ! (e.getCause() instanceof JDBCException ) ) {
-				fail("Unexpected exception: " + e);
-			}
-		}
-		em.getTransaction().rollback();
 
-		em.close();
-		emf.close();
-	}
+//  This test does not make sense anymore, validator being autoregistered at the HAN level
+//	public void testListenersOverridingCfgXmlPar() throws Exception {
+//		EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
+//		EntityManager em = emf.createEntityManager();
+//		Cat cat = new Cat();
+//		cat.setName( "123"); //validator catch that
+//		em.getTransaction().begin();
+//		try {
+//			em.persist( cat );
+//			em.flush();
+//		}
+//		catch (InvalidStateException e) {
+//			fail("Shouldn't call the ValidatorEvent listener");
+//		}
+//		catch (PersistenceException e) {
+//			if ( ! (e.getCause() instanceof JDBCException ) ) {
+//				fail("Unexpected exception: " + e);
+//			}
+//		}
+//		em.getTransaction().rollback();
+//
+//		em.close();
+//		emf.close();
+//	}
 
 	//EM TRANSACTION
 //	public void testEntityManager() {

Modified: branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -7,8 +7,11 @@
 import javax.persistence.Persistence;
 
 import org.hibernate.ejb.test.Cat;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
 import org.hibernate.event.EventListeners;
 import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.Session;
+import org.hibernate.engine.SessionImplementor;
 
 /**
  * @author Emmanuel Bernard
@@ -17,41 +20,24 @@
 
 	public void testEventOverriding() throws Exception {
 		EventListeners eventListeners = configuration.getEventListeners();
-		assertEquals( 2, eventListeners.getPreInsertEventListeners().length );
+		assertEquals( 1, eventListeners.getPreInsertEventListeners().length );
 		eventListeners.setPreInsertEventListeners( new PreInsertEventListener[]{} );
 		Cat cat = new Cat();
 		cat.setLength( 3 );
 		cat.setAge( 34 );
 		cat.setName( "Did" ); //should raise a validation exception
-		EntityManager em = configuration.createEntityManagerFactory().createEntityManager();
-		em.getTransaction().begin();
-		try {
-			em.persist( cat );
-		}
-		catch (Exception e) {
-			fail( "The validation framework is still activated" );
-		}
-		em.flush();
-		em.getTransaction().rollback();
+		EntityManagerFactory entityManagerFactory = configuration.createEntityManagerFactory();
+		EntityManager em = entityManagerFactory.createEntityManager();
+		assertEquals( "only validator should be present", 1,
+				( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
 		em.close();
 	}
 
 	public void testEventPerProperties() throws Exception {
 		EntityManagerFactory emf = Persistence.createEntityManagerFactory( "manager1", new HashMap() );
 		EntityManager em = emf.createEntityManager();
-		em.getTransaction().begin();
-		Cat cat = new Cat();
-		cat.setLength( 3 );
-		cat.setAge( 34 );
-		cat.setName( "Did" ); //should raise a validation exception
-		try {
-			em.persist( cat );
-		}
-		catch (Exception e) {
-			fail( "The validation framework is still activated" );
-		}
-		em.flush();
-		em.getTransaction().rollback();
+		assertEquals( "Only validator should be present", 1,
+				( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
 		em.close();
 		emf.close();
 	}

Modified: branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml	2007-03-02 08:26:10 UTC (rev 11251)
@@ -97,10 +97,17 @@
   <section id="search-configuration-event" revision="1">
     <title>Enabling automatic indexing</title>
 
-    <para>Finally, we enable the <literal>SearchEventListener</literal> for
-    the three Hibernate events that occur after changes are executed to the
-    database.</para>
+    <para>Automatic indexing is enable out of the box when using Hibernate
+    Annotations or Hibernate EntityManager. If, for some reason you need to
+    disable that, set
+    <literal>hibernate.search.autoregister_listeners</literal> to false. Note
+    that there is no performance runtime when the listeners are enabled while
+    no entity is indexable.</para>
 
+    <para>To enable automatic indexing in Hibernate core, add the
+    <literal>SearchEventListener</literal> for the three Hibernate events that
+    occur after changes are executed to the database.</para>
+
     <programlisting>&lt;hibernate-configuration&gt;
     ...
     &lt;event type="post-update"

Modified: branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -6,6 +6,10 @@
  */
 public final class Environment {
 	/**
+	 * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
+	 */
+	public static final String AUTOREGISTER_LISTENERS = "hibernate.search.autoregister_listeners";
+	/**
 	 * Indexes base directory
 	 */
 	public static final String INDEX_BASE_DIR = "hibernate.search.index_dir";

Modified: branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -36,11 +36,13 @@
 		PostUpdateEventListener, Initializable {
 
 	private static final Log log = LogFactory.getLog( FullTextIndexEventListener.class );
+	private boolean used;
 
 	private SearchFactory searchFactory;
 
 	public void initialize(Configuration cfg) {
 		searchFactory = SearchFactory.getSearchFactory( cfg );
+		used = searchFactory.getDocumentBuilders().size() != 0;
 	}
 
 	public SearchFactory getSearchFactory() {
@@ -48,31 +50,35 @@
 	}
 
 	public void onPostDelete(PostDeleteEvent event) {
-		if ( searchFactory.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
+		if ( used && searchFactory.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
 			DeleteWork work = new DeleteWork( event.getId(), event.getEntity().getClass() );
 			processWork( work, event );
 		}
 	}
 
 	public void onPostInsert(PostInsertEvent event) {
-		final Object entity = event.getEntity();
-		DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
-		if ( builder != null ) {
-			Serializable id = event.getId();
-			Document doc = builder.getDocument( entity, id );
-			AddWork work = new AddWork( id, entity.getClass(), doc );
-			processWork( work, event );
+		if (used) {
+			final Object entity = event.getEntity();
+			DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+			if ( builder != null ) {
+				Serializable id = event.getId();
+				Document doc = builder.getDocument( entity, id );
+				AddWork work = new AddWork( id, entity.getClass(), doc );
+				processWork( work, event );
+			}
 		}
 	}
 
 	public void onPostUpdate(PostUpdateEvent event) {
-		final Object entity = event.getEntity();
-		DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
-		if ( builder != null ) {
-			Serializable id = event.getId();
-			Document doc = builder.getDocument( entity, id );
-			UpdateWork work = new UpdateWork( id, entity.getClass(), doc );
-			processWork( work, event );
+		if (used) {
+			final Object entity = event.getEntity();
+			DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+			if ( builder != null ) {
+				Serializable id = event.getId();
+				Document doc = builder.getDocument( entity, id );
+				UpdateWork work = new UpdateWork( id, entity.getClass(), doc );
+				processWork( work, event );
+			}
 		}
 	}
 

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -18,8 +18,8 @@
 import org.hibernate.event.PostInsertEventListener;
 import org.hibernate.event.PostUpdateEventListener;
 import org.hibernate.search.Environment;
+import org.hibernate.search.event.FullTextIndexEventListener;
 import org.hibernate.search.store.FSDirectoryProvider;
-import org.hibernate.search.event.FullTextIndexEventListener;
 
 /**
  * @author Gavin King

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -4,9 +4,7 @@
 import org.apache.lucene.analysis.StopAnalyzer;
 import org.apache.lucene.store.Directory;
 import org.hibernate.HibernateException;
-import org.hibernate.event.PostDeleteEventListener;
 import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEventListener;
 import org.hibernate.impl.SessionFactoryImpl;
 import org.hibernate.search.Environment;
 import org.hibernate.search.event.FullTextIndexEventListener;
@@ -42,9 +40,5 @@
 	protected void configure(org.hibernate.cfg.Configuration cfg) {
 		cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
 		cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
-		//FullTextIndexEventListener del = new FullTextIndexEventListener();
-		cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{ new FullTextIndexEventListener() } );
-		cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{ new FullTextIndexEventListener() } );
-		cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{ new FullTextIndexEventListener() } );
 	}
 }

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -22,10 +22,6 @@
 		cfg.setProperty( Environment.WORKER_PROCESS, "async" );
 		cfg.setProperty( Environment.WORKER_PREFIX + "thread_pool.min", "1" );
 		cfg.setProperty( Environment.WORKER_PREFIX + "thread_pool.max", "10" );
-		FullTextIndexEventListener del = new FullTextIndexEventListener();
-		cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
-		cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
-		cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
 	}
 
 }

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -20,9 +20,5 @@
 		cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
 		cfg.setProperty( Environment.WORKER_SCOPE, "transaction" );
 		cfg.setProperty( Environment.WORKER_PREFIX, "sync" );
-		FullTextIndexEventListener del = new FullTextIndexEventListener();
-		cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
-		cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
-		cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
 	}
 }

Modified: branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -1,26 +1,26 @@
 //$Id: $
 package org.hibernate.search.test.worker;
 
+import java.io.File;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.io.File;
 
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.store.FSDirectoryProvider;
-import org.hibernate.search.Environment;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.impl.FullTextSessionImpl;
-import org.hibernate.search.event.FullTextIndexEventListener;
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.Query;
+import org.hibernate.Session;
 import org.hibernate.SessionFactory;
-import org.hibernate.Session;
 import org.hibernate.Transaction;
 import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEventListener;
 import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.queryParser.ParseException;
+import org.hibernate.search.Environment;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.impl.FullTextSessionImpl;
+import org.hibernate.search.store.FSDirectoryProvider;
+import org.hibernate.search.test.SearchTestCase;
 
 /**
  * @author Emmanuel Bernard

Modified: branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml	2007-03-02 08:26:10 UTC (rev 11251)
@@ -48,6 +48,21 @@
       contains an array of <literal>InvalidValue</literal>s describing each
       failure.</para>
 
+      <para>If Hibernate Validator is present in the classpath, Hibernate
+      Annotations (or Hibernate EntityManager) will use it transparently. If,
+      for some reason, you want to disable this integration, set
+      <literal>hibernate.validator.autoregister_listeners</literal> to
+      false</para>
+
+      <para><note>
+          <para>If the beans are not annotated with validation annotations,
+          there is no runtime performance cost.</para>
+        </note></para>
+
+      <para>In case you need to manually set the event listeners for Hibernate
+      Core, use the following configuration in
+      <literal>hibernate.cfg.xml</literal>:</para>
+
       <programlisting>&lt;hibernate-configuration&gt;
     ...
     &lt;event type="pre-update"&gt;
@@ -59,12 +74,6 @@
           class="org.hibernate.validator.event.ValidateEventListener"/&gt;
     &lt;/event&gt;
 &lt;/hibernate-configuration&gt;</programlisting>
-
-      <para><note>
-          <para>When using Hibernate Entity Manager, the Validation framework
-          is activated out of the box. If the beans are not annotated with
-          validation annotations, there is no performance cost.</para>
-        </note></para>
     </section>
 
     <section id="validator-checkconstraints-orm-jpaevent">

Modified: branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -15,7 +15,12 @@
 	public static final String MESSAGE_INTERPOLATOR_CLASS = "hibernate.validator.message_interpolator_class";
 
 	/**
-	 * Apply DDL changes on Hibernate metamodel when using validator with Hibernate Annotations
+	 * Apply DDL changes on Hibernate metamodel when using validator with Hibernate Annotations. Default to true.
 	 */
 	public static final String APPLY_TO_DDL = "hibernate.validator.apply_to_ddl";
+
+	/**
+	 * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
+	 */
+	public static final String AUTOREGISTER_LISTENERS = "hibernate.validator.autoregister_listeners";
 }

Modified: branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -149,10 +149,6 @@
 
 	protected void configure(Configuration cfg) {
 		cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
-		cfg.getEventListeners()
-				.setPreInsertEventListeners( new PreInsertEventListener[]{new ValidateEventListener()} );
-		cfg.getEventListeners()
-				.setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidateEventListener()} );
 	}
 
 	protected Class[] getMappings() {

Modified: branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java	2007-03-01 17:52:59 UTC (rev 11250)
+++ branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java	2007-03-02 08:26:10 UTC (rev 11251)
@@ -9,6 +9,7 @@
 import org.hibernate.validator.Environment;
 import org.hibernate.validator.test.HANTestCase;
 import org.hibernate.validator.event.ValidateEventListener;
+import org.hibernate.Session;
 
 /**
  * Test the ability to disable DDL update
@@ -16,9 +17,8 @@
  * @author Emmanuel Bernard
  */
 public class NonHibernateAnnotationsIntegrationTest extends HANTestCase {
-	public void testNotApply() throws Exception {
+	public void testNotApplyDll() throws Exception {
 		PersistentClass classMapping = getCfg().getClassMapping( Address.class.getName() );
-		//new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) ).apply( classMapping );
 		Column stateColumn = (Column) classMapping.getProperty( "state" ).getColumnIterator().next();
 		assertFalse( stateColumn.getLength() == 3 );
 		Column zipColumn = (Column) classMapping.getProperty( "zip" ).getColumnIterator().next();
@@ -26,13 +26,18 @@
 		assertTrue( zipColumn.isNullable() );
 	}
 
+	public void testNotApplyListener() throws Exception {
+		Session s = openSession( );
+		Address a = new Address();
+		s.persist( a ); //shouldn't fail
+		s.flush();
+		s.close();
+	}
+
 	protected void configure(Configuration cfg) {
 		cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
 		cfg.setProperty( Environment.APPLY_TO_DDL, "false" );
-		cfg.getEventListeners()
-				.setPreInsertEventListeners( new PreInsertEventListener[]{new ValidateEventListener()} );
-		cfg.getEventListeners()
-				.setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidateEventListener()} );
+		cfg.setProperty( Environment.AUTOREGISTER_LISTENERS, "false" );
 	}
 
 	protected Class[] getMappings() {




More information about the hibernate-commits mailing list