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">