General cleanup etc around properties and substitution

* Move pre-context init of JobParameters support out of ThreadLocalClassloaderBeanPostProcessor
* General cleanup in BatchPropertyBeanPostProcessor, move artifact type checking into classifer class, minor naming updates
* Refactor BatchPropertyContext to use different data structures for different types of properties and provide named accessors
* Remove path based artifact scoping support
* Make sure expressions are parsed when resolving properties directly from XML
* Update property tests
* Move registration of jobProperties bean into the JsrNamespaceUtils
This commit is contained in:
Chris Schaefer
2013-09-19 11:18:23 -04:00
parent fdef20f431
commit 34f9fa7341
19 changed files with 749 additions and 533 deletions

View File

@@ -16,13 +16,12 @@
package org.springframework.batch.core.jsr.configuration.support;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* <p>
@@ -32,7 +31,10 @@ import static org.junit.Assert.assertTrue;
* @author Chris Schaefer
*/
public class BatchPropertyContextTests {
private List<BatchPropertyContext.BatchPropertyContextEntry> entries = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
private List<BatchPropertyContext.BatchPropertyContextEntry> jobProperties = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
private List<BatchPropertyContext.BatchPropertyContextEntry> stepProperties = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
private List<BatchPropertyContext.BatchPropertyContextEntry> artifactProperties = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
private List<BatchPropertyContext.BatchPropertyContextEntry> stepArtifactProperties = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
@Before
public void setUp() {
@@ -41,83 +43,55 @@ public class BatchPropertyContextTests {
Properties step1Properties = new Properties();
step1Properties.setProperty("step1PropertyName1", "step1PropertyValue1");
step1Properties.setProperty("step1PropertyName2", "step1PropertyValue2");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.step1", step1Properties));
stepProperties.add(batchPropertyContext.new BatchPropertyContextEntry("step1", step1Properties, BatchArtifact.BatchArtifactType.STEP));
Properties step2Properties = new Properties();
step2Properties.setProperty("step2PropertyName1", "step2PropertyValue1");
step2Properties.setProperty("step2PropertyName2", "step2PropertyValue2");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.step2", step2Properties));
stepProperties.add(batchPropertyContext.new BatchPropertyContextEntry("step2", step2Properties, BatchArtifact.BatchArtifactType.STEP));
Properties jobProperties = new Properties();
jobProperties.setProperty("jobProperty1", "jobProperty1value");
jobProperties.setProperty("jobProperty2", "jobProperty2value");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.job-job1", jobProperties));
this.jobProperties.add(batchPropertyContext.new BatchPropertyContextEntry("job1", jobProperties, BatchArtifact.BatchArtifactType.JOB));
Properties artifactProperties = new Properties();
artifactProperties.setProperty("deciderProperty1", "deciderProperty1value");
artifactProperties.setProperty("deciderProperty2", "deciderProperty2value");
this.artifactProperties.add(batchPropertyContext.new BatchPropertyContextEntry("decider1", artifactProperties, BatchArtifact.BatchArtifactType.ARTIFACT));
Properties stepArtifactProperties = new Properties();
stepArtifactProperties.setProperty("readerProperty1", "readerProperty1value");
stepArtifactProperties.setProperty("readerProperty2", "readerProperty2value");
BatchPropertyContext.BatchPropertyContextEntry batchPropertyContextEntry =
batchPropertyContext.new BatchPropertyContextEntry("reader", stepArtifactProperties, BatchArtifact.BatchArtifactType.STEP_ARTIFACT);
batchPropertyContextEntry.setStepName("step1");
this.stepArtifactProperties.add(batchPropertyContextEntry);
}
@Test
public void testAddBatchContextEntries() {
public void testStepLevelProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setBatchContextEntries(entries);
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
batchPropertyContext.setStepPropertiesContextEntry(stepProperties);
Properties step1BatchProperties = batchPropertyContext.getBatchProperties("job1.step1");
assertEquals(4, step1BatchProperties.size());
assertEquals("step1PropertyValue1", step1BatchProperties.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", step1BatchProperties.getProperty("step1PropertyName2"));
assertEquals("jobProperty1value", step1BatchProperties.getProperty("jobProperty1"));
assertEquals("jobProperty2value", step1BatchProperties.getProperty("jobProperty2"));
Properties step1Properties = batchPropertyContext.getStepProperties("step1");
assertEquals(2, step1Properties.size());
assertEquals("step1PropertyValue1", step1Properties.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", step1Properties.getProperty("step1PropertyName2"));
Properties step2BatchProperties = batchPropertyContext.getBatchProperties("job1.step2");
assertEquals(4, step2BatchProperties.size());
assertEquals("step2PropertyValue1", step2BatchProperties.getProperty("step2PropertyName1"));
assertEquals("step2PropertyValue2", step2BatchProperties.getProperty("step2PropertyName2"));
assertEquals("jobProperty1value", step2BatchProperties.getProperty("jobProperty1"));
assertEquals("jobProperty2value", step2BatchProperties.getProperty("jobProperty2"));
Properties jobProperties = batchPropertyContext.getBatchProperties("job1.job-job1");
assertEquals(2, jobProperties.size());
assertEquals("jobProperty1value", jobProperties.getProperty("jobProperty1"));
assertEquals("jobProperty2value", jobProperties.getProperty("jobProperty2"));
Properties step2Properties = batchPropertyContext.getStepProperties("step2");
assertEquals(2, step2Properties.size());
assertEquals("step2PropertyValue1", step2Properties.getProperty("step2PropertyName1"));
assertEquals("step2PropertyValue2", step2Properties.getProperty("step2PropertyName2"));
}
@Test
public void testAddBatchContextEntriesToExistingArtifact() {
public void testJobLevelProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
Properties step1properties = new Properties();
step1properties.setProperty("newStep1PropertyName", "newStep1PropertyValue");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.step1", step1properties));
batchPropertyContext.setBatchContextEntries(entries);
Properties bean2 = batchPropertyContext.getBatchProperties("job1.step1");
assertEquals(5, bean2.size());
assertEquals("step1PropertyValue1", bean2.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", bean2.getProperty("step1PropertyName2"));
assertEquals("newStep1PropertyValue", bean2.getProperty("newStep1PropertyName"));
assertEquals("jobProperty1value", bean2.getProperty("jobProperty1"));
assertEquals("jobProperty2value", bean2.getProperty("jobProperty2"));
}
@Test
public void testGetStepLevelProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setBatchContextEntries(entries);
Properties bean1 = batchPropertyContext.getStepLevelProperties("job1.step1");
assertEquals(2, bean1.size());
assertEquals("step1PropertyValue1", bean1.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", bean1.getProperty("step1PropertyName2"));
Properties bean2 = batchPropertyContext.getStepLevelProperties("job1.step2");
assertEquals(2, bean2.size());
assertEquals("step2PropertyValue1", bean2.getProperty("step2PropertyName1"));
assertEquals("step2PropertyValue2", bean2.getProperty("step2PropertyName2"));
}
@Test
public void testJobProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setBatchContextEntries(entries);
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
Properties jobProperties = batchPropertyContext.getJobProperties();
assertEquals(2, jobProperties.size());
@@ -126,56 +100,83 @@ public class BatchPropertyContextTests {
}
@Test
public void testJobNonOverridingJobProperties() {
public void testAddPropertiesToExistingStep() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
batchPropertyContext.setStepPropertiesContextEntry(stepProperties);
Properties jobProperties = new Properties();
jobProperties.setProperty("step1PropertyName1", "step1PropertyOverride");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.job-job1", jobProperties));
Properties step1 = batchPropertyContext.getStepProperties("step1");
assertEquals(2, step1.size());
assertEquals("step1PropertyValue1", step1.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", step1.getProperty("step1PropertyName2"));
batchPropertyContext.setBatchContextEntries(entries);
Properties step1properties = new Properties();
step1properties.setProperty("newStep1PropertyName", "newStep1PropertyValue");
Properties bean1 = batchPropertyContext.getBatchProperties("job1.step1");
assertEquals(4, bean1.size());
assertEquals("step1PropertyValue1", bean1.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", bean1.getProperty("step1PropertyName2"));
assertEquals("jobProperty1value", bean1.getProperty("jobProperty1"));
assertEquals("jobProperty2value", bean1.getProperty("jobProperty2"));
batchPropertyContext.setStepPropertiesContextEntry(
Collections.singletonList(batchPropertyContext.new BatchPropertyContextEntry("step1", step1properties, BatchArtifact.BatchArtifactType.STEP)));
Properties testJobBean = batchPropertyContext.getBatchProperties("job1.job-job1");
assertEquals(3, testJobBean.size());
assertEquals("step1PropertyOverride", testJobBean.getProperty("step1PropertyName1"));
assertEquals("jobProperty1value", testJobBean.getProperty("jobProperty1"));
assertEquals("jobProperty2value", testJobBean.getProperty("jobProperty2"));
Properties step1updated = batchPropertyContext.getStepProperties("step1");
assertEquals(3, step1updated.size());
assertEquals("step1PropertyValue1", step1updated.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", step1updated.getProperty("step1PropertyName2"));
assertEquals("newStep1PropertyValue", step1updated.getProperty("newStep1PropertyName"));
}
@Test
public void testJobLevelPropertiesWithPath() {
List<BatchPropertyContext.BatchPropertyContextEntry> entries = new ArrayList<BatchPropertyContext.BatchPropertyContextEntry>();
public void testNonStepLevelArtifactProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
batchPropertyContext.setArtifactPropertiesContextEntry(artifactProperties);
batchPropertyContext.setStepPropertiesContextEntry(stepProperties);
Properties jobProperties = new Properties();
jobProperties.setProperty("readerName", "testJobreaderName");
entries.add(batchPropertyContext.new BatchPropertyContextEntry("job1.job-job1.itemReader", jobProperties));
batchPropertyContext.setBatchContextEntries(entries);
Properties props = batchPropertyContext.getJobProperties();
assertEquals(1, props.size());
assertEquals("testJobreaderName", props.getProperty("readerName"));
Properties artifactProperties = batchPropertyContext.getArtifactProperties("decider1");
assertEquals(4, artifactProperties.size());
assertEquals("deciderProperty1value", artifactProperties.getProperty("deciderProperty1"));
assertEquals("deciderProperty2value", artifactProperties.getProperty("deciderProperty2"));
assertEquals("jobProperty1value", artifactProperties.getProperty("jobProperty1"));
assertEquals("jobProperty2value", artifactProperties.getProperty("jobProperty2"));
}
@Test
public void testJobLevelComponentPath() {
public void testStepLevelArtifactProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
assertTrue(batchPropertyContext.isJobLevelComponentPath("myJob.job-myJob"));
assertTrue(batchPropertyContext.isJobLevelComponentPath("myJob.job-myJob.myReader"));
assertTrue(batchPropertyContext.isJobLevelComponentPath("myJob.job-myJob.myReader.something"));
assertFalse(batchPropertyContext.isJobLevelComponentPath("myJob"));
assertFalse(batchPropertyContext.isJobLevelComponentPath("job-myJob"));
assertFalse(batchPropertyContext.isJobLevelComponentPath(null));
assertFalse(batchPropertyContext.isJobLevelComponentPath("myJob."));
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
batchPropertyContext.setArtifactPropertiesContextEntry(artifactProperties);
batchPropertyContext.setStepPropertiesContextEntry(stepProperties);
batchPropertyContext.setStepArtifactPropertiesContextEntry(stepArtifactProperties);
Properties artifactProperties = batchPropertyContext.getStepArtifactProperties("step1", "reader");
assertEquals(4, artifactProperties.size());
assertEquals("readerProperty1value", artifactProperties.getProperty("readerProperty1"));
assertEquals("readerProperty2value", artifactProperties.getProperty("readerProperty2"));
assertEquals("step1PropertyValue1", artifactProperties.getProperty("step1PropertyName1"));
assertEquals("step1PropertyValue2", artifactProperties.getProperty("step1PropertyName2"));
}
@Test
public void testArtifactNonOverridingJobProperties() {
BatchPropertyContext batchPropertyContext = new BatchPropertyContext();
batchPropertyContext.setJobPropertiesContextEntry(jobProperties);
batchPropertyContext.setArtifactPropertiesContextEntry(artifactProperties);
Properties jobProperties = new Properties();
jobProperties.setProperty("deciderProperty1", "decider1PropertyOverride");
batchPropertyContext.setJobPropertiesContextEntry(
Collections.singletonList(batchPropertyContext.new BatchPropertyContextEntry("job1", jobProperties, BatchArtifact.BatchArtifactType.JOB)));
Properties step1 = batchPropertyContext.getArtifactProperties("decider1");
assertEquals(4, step1.size());
assertEquals("deciderProperty1value", step1.getProperty("deciderProperty1"));
assertEquals("deciderProperty2value", step1.getProperty("deciderProperty2"));
assertEquals("jobProperty1value", step1.getProperty("jobProperty1"));
assertEquals("jobProperty2value", step1.getProperty("jobProperty2"));
Properties job = batchPropertyContext.getJobProperties();
assertEquals(3, job.size());
assertEquals("decider1PropertyOverride", job.getProperty("deciderProperty1"));
assertEquals("jobProperty1value", job.getProperty("jobProperty1"));
assertEquals("jobProperty2value", job.getProperty("jobProperty2"));
}
}