From 963142cfa837e5d766013510ea4063bce8167dd2 Mon Sep 17 00:00:00 2001 From: dsyer Date: Thu, 24 Jun 2010 11:01:03 +0000 Subject: [PATCH] BATCH-1566: fix dirty flag on ExecutionContext --- .../batch/item/ExecutionContext.java | 7 ++++--- .../batch/item/ExecutionContextTests.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java index 661ed65b2..03723f869 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/ExecutionContext.java @@ -125,12 +125,13 @@ public class ExecutionContext implements Serializable { public void put(String key, Object value) { if (value != null) { Assert.isInstanceOf(Serializable.class, value, "Value: [ " + value + "must be serializable."); - map.put(key, value); + Object result = map.put(key, value); + dirty = result==null || result!=null && !result.equals(value); } else { - map.remove(key); + Object result = map.remove(key); + dirty = result!=null; } - dirty = true; } /** diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java index 719596c5c..fd7ef8f9e 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/ExecutionContextTests.java @@ -89,6 +89,25 @@ public class ExecutionContextTests { assertFalse(context.isDirty()); } + @Test + public void testNotDirtyWithDuplicate() { + context.putString("1", "test"); + assertTrue(context.isDirty()); + context.clearDirtyFlag(); + context.putString("1", "test"); + assertFalse(context.isDirty()); + } + + @Test + public void testNotDirtyWithRemoveMissing() { + context.putString("1", "test"); + assertTrue(context.isDirty()); + context.putString("1", null); // remove an item that was present + assertTrue(context.isDirty()); + context.putString("1", null); // remove a non-existent item + assertFalse(context.isDirty()); + } + @Test public void testContains() { context.putString("1", "testString");