diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapper.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.java similarity index 70% rename from spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapper.java rename to spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.java index 7ea94b059..33621cc59 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapper.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.java @@ -16,36 +16,36 @@ package org.springframework.batch.item.file.mapping; -import java.util.LinkedHashMap; import java.util.Map; import org.springframework.batch.item.file.transform.LineTokenizer; -import org.springframework.batch.item.file.transform.PrefixMatchingCompositeLineTokenizer; +import org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer; import org.springframework.batch.support.PatternMatcher; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; /** *

- * A {@link LineMapper} implementation that stores a mapping of String prefixes - * to delegate {@link LineTokenizer}s as well as a mapping of String prefixes to + * A {@link LineMapper} implementation that stores a mapping of String patterns + * to delegate {@link LineTokenizer}s as well as a mapping of String patterns to * delegate {@link FieldSetMapper}s. Each line received will be tokenized and * then mapped to a field set. * *

* Both the tokenizing and the mapping work in a similar way. The line will be - * checked for its prefix. If the prefix matches a key in the map of delegates, - * then the corresponding delegate will be used. Prefixes are sorted starting - * with the most specific, and the first match always succeeds. + * checked for its matching pattern. If the key matches a pattern in the map of + * delegates, then the corresponding delegate will be used. Patterns are sorted + * starting with the most specific, and the first match succeeds. * - * @see PrefixMatchingCompositeLineTokenizer + * @see PatternMatchingCompositeLineTokenizer * * @author Dan Garrette + * @author Dave Syer * @since 2.0 */ -public class PrefixMatchingCompositeLineMapper implements LineMapper, InitializingBean { +public class PatternMatchingCompositeLineMapper implements LineMapper, InitializingBean { - private PrefixMatchingCompositeLineTokenizer tokenizer = new PrefixMatchingCompositeLineTokenizer(); + private PatternMatchingCompositeLineTokenizer tokenizer = new PatternMatchingCompositeLineTokenizer(); private PatternMatcher> patternMatcher; @@ -77,14 +77,6 @@ public class PrefixMatchingCompositeLineMapper implements LineMapper, Init public void setFieldSetMappers(Map> fieldSetMappers) { Assert.isTrue(!fieldSetMappers.isEmpty(), "The 'fieldSetMappers' property must be non-empty"); - LinkedHashMap> map = new LinkedHashMap>(); - for (String key : fieldSetMappers.keySet()) { - FieldSetMapper value = fieldSetMappers.get(key); - if (!key.endsWith("*")) { - key = key + "*"; - } - map.put(key, value); - } - this.patternMatcher = new PatternMatcher>(map); + this.patternMatcher = new PatternMatcher>(fieldSetMappers); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizer.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizer.java similarity index 69% rename from spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizer.java rename to spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizer.java index aa3863b82..63cd00d59 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizer.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizer.java @@ -16,7 +16,6 @@ package org.springframework.batch.item.file.transform; -import java.util.LinkedHashMap; import java.util.Map; import org.springframework.batch.support.PatternMatcher; @@ -25,17 +24,17 @@ import org.springframework.util.Assert; /** * A {@link LineTokenizer} implementation that stores a mapping of String - * prefixes to delegate {@link LineTokenizer}s. Each line tokenizied will be - * checked for its prefix. If the prefix matches a key in the map of delegates, - * then the corresponding delegate {@link LineTokenizer} will be used. Prefixes - * are sorted starting with the most specific, and the first match always - * succeeds. + * patterns to delegate {@link LineTokenizer}s. Each line tokenizied will be + * checked to see if it matches a pattern. If the line matches a key in the map + * of delegates, then the corresponding delegate {@link LineTokenizer} will be + * used. Patterns are sorted starting with the most specific, and the first + * match succeeds. * * @author Ben Hale * @author Dan Garrette * @author Dave Syer */ -public class PrefixMatchingCompositeLineTokenizer implements LineTokenizer, InitializingBean { +public class PatternMatchingCompositeLineTokenizer implements LineTokenizer, InitializingBean { private PatternMatcher tokenizers = null; @@ -62,14 +61,6 @@ public class PrefixMatchingCompositeLineTokenizer implements LineTokenizer, Init public void setTokenizers(Map tokenizers) { Assert.isTrue(!tokenizers.isEmpty(), "The 'tokenizers' property must be non-empty"); - LinkedHashMap map = new LinkedHashMap(); - for (String key : tokenizers.keySet()) { - LineTokenizer value = tokenizers.get(key); - if (!key.endsWith("*")) { - key = key + "*"; - } - map.put(key, value); - } - this.tokenizers = new PatternMatcher(map); + this.tokenizers = new PatternMatcher(tokenizers); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapperTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapperTests.java similarity index 86% rename from spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapperTests.java rename to spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapperTests.java index c4aaf51fa..b3dafd3dd 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PrefixMatchingCompositeLineMapperTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapperTests.java @@ -34,9 +34,9 @@ import org.springframework.batch.item.file.transform.Name; * @author Dave Syer * @since 2.0 */ -public class PrefixMatchingCompositeLineMapperTests { +public class PatternMatchingCompositeLineMapperTests { - private PrefixMatchingCompositeLineMapper mapper = new PrefixMatchingCompositeLineMapper(); + private PatternMatchingCompositeLineMapper mapper = new PatternMatchingCompositeLineMapper(); @Test(expected = IllegalArgumentException.class) public void testNoMappers() throws Exception { @@ -49,12 +49,12 @@ public class PrefixMatchingCompositeLineMapperTests { @Test public void testKeyFound() throws Exception { Map tokenizers = new HashMap(); - tokenizers.put("foo", new LineTokenizer() { + tokenizers.put("foo*", new LineTokenizer() { public FieldSet tokenize(String line) { return new DefaultFieldSet(new String[] { "a", "b" }); } }); - tokenizers.put("bar", new LineTokenizer() { + tokenizers.put("bar*", new LineTokenizer() { public FieldSet tokenize(String line) { return new DefaultFieldSet(new String[] { "c", "d" }); } @@ -62,12 +62,12 @@ public class PrefixMatchingCompositeLineMapperTests { mapper.setTokenizers(tokenizers); Map> fieldSetMappers = new HashMap>(); - fieldSetMappers.put("foo", new FieldSetMapper() { + fieldSetMappers.put("foo*", new FieldSetMapper() { public Name mapFieldSet(FieldSet fs) { return new Name(fs.readString(0), fs.readString(1), 0); } }); - fieldSetMappers.put("bar", new FieldSetMapper() { + fieldSetMappers.put("bar*", new FieldSetMapper() { public Name mapFieldSet(FieldSet fs) { return new Name(fs.readString(1), fs.readString(0), 0); } @@ -81,12 +81,12 @@ public class PrefixMatchingCompositeLineMapperTests { @Test(expected = IllegalStateException.class) public void testMapperKeyNotFound() throws Exception { Map tokenizers = new HashMap(); - tokenizers.put("foo", new LineTokenizer() { + tokenizers.put("foo*", new LineTokenizer() { public FieldSet tokenize(String line) { return new DefaultFieldSet(new String[] { "a", "b" }); } }); - tokenizers.put("bar", new LineTokenizer() { + tokenizers.put("bar*", new LineTokenizer() { public FieldSet tokenize(String line) { return new DefaultFieldSet(new String[] { "c", "d" }); } @@ -94,7 +94,7 @@ public class PrefixMatchingCompositeLineMapperTests { mapper.setTokenizers(tokenizers); Map> fieldSetMappers = new HashMap>(); - fieldSetMappers.put("foo", new FieldSetMapper() { + fieldSetMappers.put("foo*", new FieldSetMapper() { public Name mapFieldSet(FieldSet fs) { return new Name(fs.readString(0), fs.readString(1), 0); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizerTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizerTests.java similarity index 86% rename from spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizerTests.java rename to spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizerTests.java index a3388b333..eba968f09 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PrefixMatchingCompositeLineTokenizerTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/file/transform/PatternMatchingCompositeLineTokenizerTests.java @@ -28,10 +28,11 @@ import org.junit.Test; /** * @author Ben Hale * @author Dan Garrette + * @author Dave Syer */ -public class PrefixMatchingCompositeLineTokenizerTests { +public class PatternMatchingCompositeLineTokenizerTests { - private PrefixMatchingCompositeLineTokenizer tokenizer = new PrefixMatchingCompositeLineTokenizer(); + private PatternMatchingCompositeLineTokenizer tokenizer = new PatternMatchingCompositeLineTokenizer(); @Test(expected = IllegalArgumentException.class) public void testNoTokenizers() throws Exception { @@ -42,7 +43,7 @@ public class PrefixMatchingCompositeLineTokenizerTests { @Test public void testEmptyKeyMatchesAnyLine() throws Exception { Map map = new HashMap(); - map.put("", new DelimitedLineTokenizer()); + map.put("*", new DelimitedLineTokenizer()); map.put("foo", new LineTokenizer() { public FieldSet tokenize(String line) { return null; @@ -58,12 +59,12 @@ public class PrefixMatchingCompositeLineTokenizerTests { public void testEmptyKeyDoesNotMatchWhenAlternativeAvailable() throws Exception { Map map = new LinkedHashMap(); - map.put("", new LineTokenizer() { + map.put("*", new LineTokenizer() { public FieldSet tokenize(String line) { return null; } }); - map.put("foo", new DelimitedLineTokenizer()); + map.put("foo*", new DelimitedLineTokenizer()); tokenizer.setTokenizers(map); tokenizer.afterPropertiesSet(); FieldSet fields = tokenizer.tokenize("foo,bar"); @@ -79,7 +80,7 @@ public class PrefixMatchingCompositeLineTokenizerTests { @Test public void testMatchWithPrefix() throws Exception { - tokenizer.setTokenizers(Collections.singletonMap("foo", (LineTokenizer) new LineTokenizer() { + tokenizer.setTokenizers(Collections.singletonMap("foo*", (LineTokenizer) new LineTokenizer() { public FieldSet tokenize(String line) { return new DefaultFieldSet(new String[] { line }); } diff --git a/spring-batch-samples/src/main/resources/jobs/iosample/multiRecordType.xml b/spring-batch-samples/src/main/resources/jobs/iosample/multiRecordType.xml index 77abc6f86..1926f5162 100644 --- a/spring-batch-samples/src/main/resources/jobs/iosample/multiRecordType.xml +++ b/spring-batch-samples/src/main/resources/jobs/iosample/multiRecordType.xml @@ -25,17 +25,17 @@ + class="org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper"> - - + + - - + + diff --git a/spring-batch-samples/src/main/resources/jobs/multilineJob.xml b/spring-batch-samples/src/main/resources/jobs/multilineJob.xml index 0b4a9ec55..ae3e8ff5e 100644 --- a/spring-batch-samples/src/main/resources/jobs/multilineJob.xml +++ b/spring-batch-samples/src/main/resources/jobs/multilineJob.xml @@ -1,6 +1,6 @@ - - - - - - - - - - + + + + + + + + + - - - + + + - - - - - - + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + - - - + + - - - + + - - - - + + + - \ No newline at end of file + \ No newline at end of file diff --git a/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml b/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml index 5f9a40eaa..07259bbfe 100644 --- a/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml +++ b/spring-batch-samples/src/main/resources/jobs/multilineOrderInputTokenizers.xml @@ -4,19 +4,19 @@ http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> + class="org.springframework.batch.item.file.transform.PatternMatchingCompositeLineTokenizer"> - - - - - - - - - - + + + + + + + + + +