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><hibernate-configuration>
...
<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><hibernate-configuration>
...
<event type="pre-update">
@@ -59,12 +74,6 @@
class="org.hibernate.validator.event.ValidateEventListener"/>
</event>
</hibernate-configuration></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() {