From f71477f17dececed7d2c50f68dd46987d6ce738f Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 11 Oct 2011 17:37:32 +0200 Subject: [PATCH] DATADOC-289 - Fixed invocation of AfterLoadEvent in AbstractMongoEventListener. Invoke events that are not bound to the domain type before the domain type check. Removed unnecessary gentrification of AfterLoadEvent. --- .../data/mongodb/core/MongoTemplate.java | 2 +- .../event/AbstractMongoEventListener.java | 47 ++++++++++--------- .../core/mapping/event/AfterLoadEvent.java | 4 +- .../AbstractMongoEventListenerUnitTest.java | 34 +++++++++++--- .../event/SimpleMappingEventListener.java | 4 +- 5 files changed, 59 insertions(+), 32 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 90458e5c2..619b2a277 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -1486,7 +1486,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { public T doWith(DBObject object) { if (null != object) { - maybeEmitEvent(new AfterLoadEvent(object)); + maybeEmitEvent(new AfterLoadEvent(object)); } T source = reader.read(type, object); if (null != source) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java index 933ffc959..13d8380fa 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 by the original author(s). + * Copyright 2011 by the original author(s). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,9 +27,9 @@ import org.springframework.core.GenericTypeResolver; * @author Jon Brisbin * @author Oliver Gierke */ -public abstract class AbstractMongoEventListener implements ApplicationListener> { +public abstract class AbstractMongoEventListener implements ApplicationListener> { - protected final Log log = LogFactory.getLog(getClass()); + protected final Log LOG = LogFactory.getLog(getClass()); private final Class domainClass; /** @@ -43,54 +43,59 @@ public abstract class AbstractMongoEventListener implements ApplicationListen * (non-Javadoc) * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent) */ - public void onApplicationEvent(MongoMappingEvent event) { + @SuppressWarnings("unchecked") + public void onApplicationEvent(MongoMappingEvent event) { - E source = event.getSource(); + Object source = event.getSource(); + // Invoke domain type independent events + if (event instanceof AfterLoadEvent) { + onAfterLoad(((AfterLoadEvent) event).getSource()); + } + + // Check for matching domain type and invoke callbacks if (source != null && !domainClass.isAssignableFrom(source.getClass())) { return; } if (event instanceof BeforeConvertEvent) { - onBeforeConvert(source); + onBeforeConvert((E) source); } else if (event instanceof BeforeSaveEvent) { - onBeforeSave(source, event.getDBObject()); + onBeforeSave((E) source, event.getDBObject()); } else if (event instanceof AfterSaveEvent) { - onAfterSave(source, event.getDBObject()); - } else if (event instanceof AfterLoadEvent) { - onAfterLoad((DBObject) event.getSource()); + onAfterSave((E) source, event.getDBObject()); } else if (event instanceof AfterConvertEvent) { - onAfterConvert(event.getDBObject(), source); + onAfterConvert(event.getDBObject(), (E) source); } } public void onBeforeConvert(E source) { - if (log.isDebugEnabled()) { - log.debug("onBeforeConvert(" + source + ")"); + if (LOG.isDebugEnabled()) { + LOG.debug("onBeforeConvert(" + source + ")"); } } public void onBeforeSave(E source, DBObject dbo) { - if (log.isDebugEnabled()) { - log.debug("onBeforeSave(" + source + ", " + dbo + ")"); + if (LOG.isDebugEnabled()) { + LOG.debug("onBeforeSave(" + source + ", " + dbo + ")"); } } public void onAfterSave(E source, DBObject dbo) { - if (log.isDebugEnabled()) { - log.debug("onAfterSave(" + source + ", " + dbo + ")"); + if (LOG.isDebugEnabled()) { + LOG.debug("onAfterSave(" + source + ", " + dbo + ")"); } } public void onAfterLoad(DBObject dbo) { - if (log.isDebugEnabled()) { - log.debug("onAfterLoad(" + dbo + ")"); + if (LOG.isDebugEnabled()) { + LOG.debug("onAfterLoad(" + dbo + ")"); } } public void onAfterConvert(DBObject dbo, E source) { - if (log.isDebugEnabled()) { - log.debug("onAfterConvert(" + dbo + "," + source + ")"); + if (LOG.isDebugEnabled()) { + LOG.debug("onAfterConvert(" + dbo + "," + source + ")"); } } } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AfterLoadEvent.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AfterLoadEvent.java index 67fc66d5d..8e4c38abc 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AfterLoadEvent.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AfterLoadEvent.java @@ -16,10 +16,12 @@ package org.springframework.data.mongodb.core.mapping.event; +import com.mongodb.DBObject; + /** * @author Jon Brisbin */ -public class AfterLoadEvent extends MongoMappingEvent { +public class AfterLoadEvent extends MongoMappingEvent { private static final long serialVersionUID = 1L; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTest.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTest.java index abe8d09b9..87d9953ff 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTest.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 by the original author(s). + * Copyright 2011 by the original author(s). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,6 +21,9 @@ import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.mongodb.repository.Person; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; + /** * Unit tests for {@link AbstractMongoEventListener}. * @@ -34,7 +37,7 @@ public class AbstractMongoEventListenerUnitTest { MongoMappingEvent event = new BeforeConvertEvent(new Person("Dave", "Matthews")); SampleEventListener listener = new SampleEventListener(); listener.onApplicationEvent(event); - assertThat(listener.invoked, is(true)); + assertThat(listener.invokedOnBeforeConvert, is(true)); } @Test @@ -47,21 +50,38 @@ public class AbstractMongoEventListenerUnitTest { context.addApplicationListener(listener); context.publishEvent(new BeforeConvertEvent(new Person("Dave", "Matthews"))); - assertThat(listener.invoked, is(true)); + assertThat(listener.invokedOnBeforeConvert, is(true)); - listener.invoked = false; + listener.invokedOnBeforeConvert = false; context.publishEvent(new BeforeConvertEvent("Test")); - assertThat(listener.invoked, is(false)); + assertThat(listener.invokedOnBeforeConvert, is(false)); + } + + /** + * @see DATADOC-289 + */ + @Test + public void afterLoadEffectGetsHandledCorrectly() { + SampleEventListener listener = new SampleEventListener(); + listener.onApplicationEvent(new AfterLoadEvent(new BasicDBObject())); + assertThat(listener.invokedOnAfterLoad, is(true)); } + class SampleEventListener extends AbstractMongoEventListener { - boolean invoked; + boolean invokedOnBeforeConvert; + boolean invokedOnAfterLoad; @Override public void onBeforeConvert(Person source) { - invoked = true; + invokedOnBeforeConvert = true; + } + + @Override + public void onAfterLoad(DBObject dbo) { + invokedOnAfterLoad = true; } } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java index 5024bc1ba..b433ff375 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java @@ -25,7 +25,7 @@ public class SimpleMappingEventListener extends AbstractMongoEventListener> onBeforeConvertEvents = new ArrayList>(); public final ArrayList> onBeforeSaveEvents = new ArrayList>(); public final ArrayList> onAfterSaveEvents = new ArrayList>(); - public final ArrayList> onAfterLoadEvents = new ArrayList>(); + public final ArrayList onAfterLoadEvents = new ArrayList(); public final ArrayList> onAfterConvertEvents = new ArrayList>(); @Override @@ -45,7 +45,7 @@ public class SimpleMappingEventListener extends AbstractMongoEventListener(dbo)); + onAfterLoadEvents.add(new AfterLoadEvent(dbo)); } @Override