Browse Source

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.
pull/1/head
Oliver Gierke 14 years ago
parent
commit
f71477f17d
  1. 2
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
  2. 47
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListener.java
  3. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/event/AfterLoadEvent.java
  4. 34
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AbstractMongoEventListenerUnitTest.java
  5. 4
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java

2
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) { public T doWith(DBObject object) {
if (null != object) { if (null != object) {
maybeEmitEvent(new AfterLoadEvent<DBObject>(object)); maybeEmitEvent(new AfterLoadEvent(object));
} }
T source = reader.read(type, object); T source = reader.read(type, object);
if (null != source) { if (null != source) {

47
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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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 Jon Brisbin
* @author Oliver Gierke * @author Oliver Gierke
*/ */
public abstract class AbstractMongoEventListener<E> implements ApplicationListener<MongoMappingEvent<E>> { public abstract class AbstractMongoEventListener<E> implements ApplicationListener<MongoMappingEvent<?>> {
protected final Log log = LogFactory.getLog(getClass()); protected final Log LOG = LogFactory.getLog(getClass());
private final Class<?> domainClass; private final Class<?> domainClass;
/** /**
@ -43,54 +43,59 @@ public abstract class AbstractMongoEventListener<E> implements ApplicationListen
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent) * @see org.springframework.context.ApplicationListener#onApplicationEvent(org.springframework.context.ApplicationEvent)
*/ */
public void onApplicationEvent(MongoMappingEvent<E> 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())) { if (source != null && !domainClass.isAssignableFrom(source.getClass())) {
return; return;
} }
if (event instanceof BeforeConvertEvent) { if (event instanceof BeforeConvertEvent) {
onBeforeConvert(source); onBeforeConvert((E) source);
} else if (event instanceof BeforeSaveEvent) { } else if (event instanceof BeforeSaveEvent) {
onBeforeSave(source, event.getDBObject()); onBeforeSave((E) source, event.getDBObject());
} else if (event instanceof AfterSaveEvent) { } else if (event instanceof AfterSaveEvent) {
onAfterSave(source, event.getDBObject()); onAfterSave((E) source, event.getDBObject());
} else if (event instanceof AfterLoadEvent) {
onAfterLoad((DBObject) event.getSource());
} else if (event instanceof AfterConvertEvent) { } else if (event instanceof AfterConvertEvent) {
onAfterConvert(event.getDBObject(), source); onAfterConvert(event.getDBObject(), (E) source);
} }
} }
public void onBeforeConvert(E source) { public void onBeforeConvert(E source) {
if (log.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
log.debug("onBeforeConvert(" + source + ")"); LOG.debug("onBeforeConvert(" + source + ")");
} }
} }
public void onBeforeSave(E source, DBObject dbo) { public void onBeforeSave(E source, DBObject dbo) {
if (log.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
log.debug("onBeforeSave(" + source + ", " + dbo + ")"); LOG.debug("onBeforeSave(" + source + ", " + dbo + ")");
} }
} }
public void onAfterSave(E source, DBObject dbo) { public void onAfterSave(E source, DBObject dbo) {
if (log.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
log.debug("onAfterSave(" + source + ", " + dbo + ")"); LOG.debug("onAfterSave(" + source + ", " + dbo + ")");
} }
} }
public void onAfterLoad(DBObject dbo) { public void onAfterLoad(DBObject dbo) {
if (log.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
log.debug("onAfterLoad(" + dbo + ")"); LOG.debug("onAfterLoad(" + dbo + ")");
} }
} }
public void onAfterConvert(DBObject dbo, E source) { public void onAfterConvert(DBObject dbo, E source) {
if (log.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
log.debug("onAfterConvert(" + dbo + "," + source + ")"); LOG.debug("onAfterConvert(" + dbo + "," + source + ")");
} }
} }
} }

4
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; package org.springframework.data.mongodb.core.mapping.event;
import com.mongodb.DBObject;
/** /**
* @author Jon Brisbin <jbrisbin@vmware.com> * @author Jon Brisbin <jbrisbin@vmware.com>
*/ */
public class AfterLoadEvent<DBObject> extends MongoMappingEvent<DBObject> { public class AfterLoadEvent extends MongoMappingEvent<DBObject> {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

34
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"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with 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.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.mongodb.repository.Person; import org.springframework.data.mongodb.repository.Person;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
/** /**
* Unit tests for {@link AbstractMongoEventListener}. * Unit tests for {@link AbstractMongoEventListener}.
* *
@ -34,7 +37,7 @@ public class AbstractMongoEventListenerUnitTest {
MongoMappingEvent<Person> event = new BeforeConvertEvent<Person>(new Person("Dave", "Matthews")); MongoMappingEvent<Person> event = new BeforeConvertEvent<Person>(new Person("Dave", "Matthews"));
SampleEventListener listener = new SampleEventListener(); SampleEventListener listener = new SampleEventListener();
listener.onApplicationEvent(event); listener.onApplicationEvent(event);
assertThat(listener.invoked, is(true)); assertThat(listener.invokedOnBeforeConvert, is(true));
} }
@Test @Test
@ -47,21 +50,38 @@ public class AbstractMongoEventListenerUnitTest {
context.addApplicationListener(listener); context.addApplicationListener(listener);
context.publishEvent(new BeforeConvertEvent<Person>(new Person("Dave", "Matthews"))); context.publishEvent(new BeforeConvertEvent<Person>(new Person("Dave", "Matthews")));
assertThat(listener.invoked, is(true)); assertThat(listener.invokedOnBeforeConvert, is(true));
listener.invoked = false; listener.invokedOnBeforeConvert = false;
context.publishEvent(new BeforeConvertEvent<String>("Test")); context.publishEvent(new BeforeConvertEvent<String>("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<Person> { class SampleEventListener extends AbstractMongoEventListener<Person> {
boolean invoked; boolean invokedOnBeforeConvert;
boolean invokedOnAfterLoad;
@Override @Override
public void onBeforeConvert(Person source) { public void onBeforeConvert(Person source) {
invoked = true; invokedOnBeforeConvert = true;
}
@Override
public void onAfterLoad(DBObject dbo) {
invokedOnAfterLoad = true;
} }
} }
} }

4
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/SimpleMappingEventListener.java

@ -25,7 +25,7 @@ public class SimpleMappingEventListener extends AbstractMongoEventListener<Objec
public final ArrayList<BeforeConvertEvent<Object>> onBeforeConvertEvents = new ArrayList<BeforeConvertEvent<Object>>(); public final ArrayList<BeforeConvertEvent<Object>> onBeforeConvertEvents = new ArrayList<BeforeConvertEvent<Object>>();
public final ArrayList<BeforeSaveEvent<Object>> onBeforeSaveEvents = new ArrayList<BeforeSaveEvent<Object>>(); public final ArrayList<BeforeSaveEvent<Object>> onBeforeSaveEvents = new ArrayList<BeforeSaveEvent<Object>>();
public final ArrayList<AfterSaveEvent<Object>> onAfterSaveEvents = new ArrayList<AfterSaveEvent<Object>>(); public final ArrayList<AfterSaveEvent<Object>> onAfterSaveEvents = new ArrayList<AfterSaveEvent<Object>>();
public final ArrayList<AfterLoadEvent<Object>> onAfterLoadEvents = new ArrayList<AfterLoadEvent<Object>>(); public final ArrayList<AfterLoadEvent> onAfterLoadEvents = new ArrayList<AfterLoadEvent>();
public final ArrayList<AfterConvertEvent<Object>> onAfterConvertEvents = new ArrayList<AfterConvertEvent<Object>>(); public final ArrayList<AfterConvertEvent<Object>> onAfterConvertEvents = new ArrayList<AfterConvertEvent<Object>>();
@Override @Override
@ -45,7 +45,7 @@ public class SimpleMappingEventListener extends AbstractMongoEventListener<Objec
@Override @Override
public void onAfterLoad(DBObject dbo) { public void onAfterLoad(DBObject dbo) {
onAfterLoadEvents.add(new AfterLoadEvent<Object>(dbo)); onAfterLoadEvents.add(new AfterLoadEvent(dbo));
} }
@Override @Override

Loading…
Cancel
Save