From fad3686c2d8bd0b65f296b6011b22493c0939f3d Mon Sep 17 00:00:00 2001 From: robokaso Date: Mon, 12 May 2008 10:53:08 +0000 Subject: [PATCH] RESOLVED - BATCH-530: StepExecutionListener should get a chance to modify the execution context --- .../batch/core/step/AbstractStep.java | 1 + .../batch/core/step/AbstractStepTests.java | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java index 02480fd82..68fa1b42c 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/AbstractStep.java @@ -186,6 +186,7 @@ public abstract class AbstractStep implements Step, InitializingBean, BeanNameAw try { exitStatus = exitStatus.and(getCompositeListener().onErrorInStep(stepExecution, e)); + getJobRepository().saveOrUpdateExecutionContext(stepExecution); } catch (Exception ex) { logger.error("Encountered an error on listener close.", ex); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java index dccfcc415..bc5cb3285 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/step/AbstractStepTests.java @@ -2,6 +2,7 @@ package org.springframework.batch.core.step; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import junit.framework.TestCase; @@ -24,6 +25,8 @@ public class AbstractStepTests extends TestCase { StepExecutionListener listener2 = new EventTrackingListener("listener2"); + JobRepositoryStub repository = new JobRepositoryStub(); + /** * Sequence of events encountered during step execution. */ @@ -36,7 +39,7 @@ public class AbstractStepTests extends TestCase { * Fills the events list when abstract methods are called. */ private class EventTrackingStep extends AbstractStep { - + public EventTrackingStep() { setBeanName("eventTrackingStep"); } @@ -75,24 +78,40 @@ public class AbstractStepTests extends TestCase { public ExitStatus afterStep(StepExecution stepExecution) { assertSame(execution, stepExecution); events.add(getEvent("afterStep")); + stepExecution.getExecutionContext().putString("afterStep", "afterStep"); return stepExecution.getExitStatus(); } public ExitStatus onErrorInStep(StepExecution stepExecution, Throwable e) { assertSame(execution, stepExecution); events.add(getEvent("onErrorInStep")); + stepExecution.getExecutionContext().putString("onErrorInStep", "onErrorInStep"); return stepExecution.getExitStatus(); } public void beforeStep(StepExecution stepExecution) { assertSame(execution, stepExecution); events.add(getEvent("beforeStep")); + stepExecution.getExecutionContext().putString("beforeStep", "beforeStep"); + } + + } + + /** + * Remembers the last saved values of execution context. + */ + private static class JobRepositoryStub extends JobRepositorySupport { + + Properties saved = new Properties(); + + public void saveOrUpdateExecutionContext(StepExecution stepExecution) { + saved = stepExecution.getExecutionContext().getProperties(); } } protected void setUp() throws Exception { - tested.setJobRepository(new JobRepositorySupport()); + tested.setJobRepository(repository); } /** @@ -111,8 +130,13 @@ public class AbstractStepTests extends TestCase { assertEquals("listener2#afterStep", events.get(i++)); assertEquals("close", events.get(i++)); assertEquals(7, events.size()); - + assertEquals(ExitStatus.FINISHED, execution.getExitStatus()); + + assertTrue("Execution context modifications made by listener should be persisted", repository.saved + .containsKey("beforeStep")); + assertTrue("Execution context modifications made by listener should be persisted", repository.saved + .containsKey("afterStep")); } /** @@ -125,7 +149,7 @@ public class AbstractStepTests extends TestCase { throw new RuntimeException("crash!"); } }; - tested.setJobRepository(new JobRepositorySupport()); + tested.setJobRepository(repository); tested.setStepExecutionListeners(new StepExecutionListener[] { listener1, listener2 }); try { @@ -145,8 +169,11 @@ public class AbstractStepTests extends TestCase { assertEquals("listener2#onErrorInStep", events.get(i++)); assertEquals("close", events.get(i++)); assertEquals(7, events.size()); - + assertEquals(ExitStatus.FAILED.getExitCode(), execution.getExitStatus().getExitCode()); + + assertTrue("Execution context modifications made by listener should be persisted", repository.saved + .containsKey("onErrorInStep")); } /**