BATCH-1118:

*Updated JobListenerFactoryBean so that listener methods specified via annotations or the metaDataMap are checked eagerly for correct signatures
 *Extracted common processing of Job/StepListenerFactoryBean classes into new superclass AbstractListenerFactoryBean
 *Created AbstractListenerMetaData interface for Job/StepListenerMetaData enums
 *Fixed JobExecutionListenerParser which had a bug in parsing listener method attributes
 *Corrected job listener attributes in xsd to use before/after-job-method
 *Added unit tests for job listener annotations and metaDataMap
 *Fixed typo in StepListenerFactoryBeanTests
This commit is contained in:
dhgarrette
2009-03-10 19:57:18 +00:00
parent 944b6aa4c8
commit 28d04d424a
11 changed files with 395 additions and 279 deletions

View File

@@ -17,8 +17,11 @@ package org.springframework.batch.core.listener;
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.springframework.batch.core.listener.JobListenerMetaData.AFTER_JOB;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
@@ -28,6 +31,7 @@ import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.batch.core.annotation.AfterJob;
import org.springframework.batch.core.annotation.BeforeJob;
import org.springframework.batch.core.configuration.xml.AbstractTestComponent;
import org.springframework.core.Ordered;
/**
@@ -138,6 +142,100 @@ public class JobListenerFactoryBeanTests {
assertEquals(listener1, listener2);
}
@Test
public void testEmptySignatureAnnotation() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterJob
public void aMethod() {
executed = true;
}
};
factoryBean.setDelegate(delegate);
JobExecutionListener listener = (JobExecutionListener) factoryBean.getObject();
listener.afterJob(new JobExecution(1L));
assertTrue(delegate.isExecuted());
}
@Test
public void testRightSignatureAnnotation() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterJob
public void aMethod(JobExecution jobExecution) {
executed = true;
assertEquals(new Long(25), jobExecution.getId());
}
};
factoryBean.setDelegate(delegate);
JobExecutionListener listener = (JobExecutionListener) factoryBean.getObject();
listener.afterJob(new JobExecution(25L));
assertTrue(delegate.isExecuted());
}
@Test(expected = IllegalArgumentException.class)
public void testWrongSignatureAnnotation() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterJob
public void aMethod(Integer item) {
executed = true;
}
};
factoryBean.setDelegate(delegate);
factoryBean.getObject();
}
@Test
public void testEmptySignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
public void aMethod() {
executed = true;
}
};
factoryBean.setDelegate(delegate);
Map<String, String> metaDataMap = new HashMap<String, String>();
metaDataMap.put(AFTER_JOB.getPropertyName(), "aMethod");
factoryBean.setMetaDataMap(metaDataMap);
JobExecutionListener listener = (JobExecutionListener) factoryBean.getObject();
listener.afterJob(new JobExecution(1L));
assertTrue(delegate.isExecuted());
}
@Test
public void testRightSignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
public void aMethod(JobExecution jobExecution) {
executed = true;
assertEquals(new Long(25), jobExecution.getId());
}
};
factoryBean.setDelegate(delegate);
Map<String, String> metaDataMap = new HashMap<String, String>();
metaDataMap.put(AFTER_JOB.getPropertyName(), "aMethod");
factoryBean.setMetaDataMap(metaDataMap);
JobExecutionListener listener = (JobExecutionListener) factoryBean.getObject();
listener.afterJob(new JobExecution(25L));
assertTrue(delegate.isExecuted());
}
@Test(expected = IllegalArgumentException.class)
public void testWrongSignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
public void aMethod(Integer item) {
executed = true;
}
};
factoryBean.setDelegate(delegate);
Map<String, String> metaDataMap = new HashMap<String, String>();
metaDataMap.put(AFTER_JOB.getPropertyName(), "aMethod");
factoryBean.setMetaDataMap(metaDataMap);
factoryBean.getObject();
}
private class JobListenerWithInterface implements JobExecutionListener {
boolean beforeJobCalled = false;

View File

@@ -311,7 +311,6 @@ public class StepListenerFactoryBeanTests {
public void testEmptySignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterWrite
public void aMethod() {
executed = true;
}
@@ -330,7 +329,6 @@ public class StepListenerFactoryBeanTests {
public void testRightSignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterWrite
public void aMethod(List<String> items) {
executed = true;
assertEquals("foo", items.get(0));
@@ -351,7 +349,6 @@ public class StepListenerFactoryBeanTests {
public void testWrongSignatureNamedMethod() {
AbstractTestComponent delegate = new AbstractTestComponent() {
@SuppressWarnings("unused")
@AfterWrite
public void aMethod(Integer item) {
executed = true;
}