diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersBuilder.java b/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersBuilder.java index a0728c5fbe..75734bf965 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersBuilder.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/JobParametersBuilder.java @@ -41,6 +41,7 @@ * @author Michael Minella * @author Glenn Renfro * @author Mahmoud Ben Hassine + * @author Minhyeok Jeong * @since 1.0 * @see JobParameters * @see JobParameter @@ -224,15 +225,29 @@ public JobParametersBuilder addParameter(String key, JobParameter jobParameter) } /** - * Copy job parameters into the current state. - * @param jobParameters parameters to copy in + * Add job parameters into the current parameter map. If the map previously + * contained a mapping for the key, the old value is replaced. + * + * @param jobParameters parameters to add to * @return a reference to this object. */ public JobParametersBuilder addJobParameters(JobParameters jobParameters) { Assert.notNull(jobParameters, "jobParameters must not be null"); - this.parameterMap.putAll(jobParameters.getParameters()); + return this; + } + /** + * Add job parameters into the current parameter map. If the map previously + * contained a mapping for the key, the new value is ignored. + * + * @param jobParameters parameters to add to + * @return a reference to this object. + */ + public JobParametersBuilder addJobParametersIfAbsent(JobParameters jobParameters) { + Assert.notNull(jobParameters, "jobParameters must not be null"); + jobParameters.getParameters().forEach( + (key, value) -> this.parameterMap.putIfAbsent(key, value)); return this; } @@ -282,7 +297,7 @@ else if (incrementer != null) { } } - this.parameterMap = addJobParameters(nextParameters) + this.parameterMap = addJobParametersIfAbsent(nextParameters) .toJobParameters() .getParameters(); return this; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/JobParametersBuilderTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/JobParametersBuilderTests.java index 9197d0a48b..e6ae3ca59e 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/JobParametersBuilderTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/JobParametersBuilderTests.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -40,7 +41,7 @@ * @author Michael Minella * @author Glenn Renfro * @author Mahmoud Ben Hassine - * + * @author Minhyeok Jeong */ public class JobParametersBuilderTests { @@ -82,9 +83,31 @@ public void testAddingExistingJobParameters() { .addJobParameters(params2) .toJobParameters(); - assertEquals(finalParams.getString("foo"), "baz"); - assertEquals(finalParams.getString("bar"), "baz"); - assertEquals(finalParams.getString("baz"), "quix"); + assertEquals("baz", finalParams.getString("foo")); + assertEquals("baz", finalParams.getString("bar")); + assertEquals("quix", finalParams.getString("baz")); + } + + @Test + public void testAddingExistingJobParametersIfAbsent() { + JobParameters params1 = new JobParametersBuilder() + .addString("foo", "bar") + .addString("bar", "baz") + .toJobParameters(); + + JobParameters params2 = new JobParametersBuilder() + .addString("foo", "baz") + .toJobParameters(); + + JobParameters finalParams = new JobParametersBuilder() + .addString("baz", "quix") + .addJobParametersIfAbsent(params1) + .addJobParametersIfAbsent(params2) + .toJobParameters(); + + assertEquals("bar", finalParams.getString("foo")); + assertEquals("baz", finalParams.getString("bar")); + assertEquals("quix", finalParams.getString("baz")); } @Test @@ -265,11 +288,16 @@ private void baseJobParametersVerify(JobParameters parameters, int paramCount) { } private JobExecution getJobExecution(JobInstance jobInstance, BatchStatus batchStatus) { - JobExecution jobExecution = new JobExecution(jobInstance, 1L, null, "TestConfig"); + Map parameters = new LinkedHashMap<>(); + parameters.put("STRING", new JobParameter("previous value")); + JobParameters jobParameters = new JobParameters(parameters); + + JobExecution jobExecution = new JobExecution(jobInstance, 1L, jobParameters, "TestConfig"); + if(batchStatus != null) { jobExecution.setStatus(batchStatus); } - return jobExecution; + return jobExecution; } }