diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/ClassifierCompositeItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/ClassifierCompositeItemWriter.java index 75a5d46d8..ea6733fb5 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/ClassifierCompositeItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/ClassifierCompositeItemWriter.java @@ -24,6 +24,7 @@ import java.util.Map; import org.springframework.classify.Classifier; import org.springframework.classify.ClassifierSupport; import org.springframework.batch.item.ItemWriter; +import org.springframework.util.Assert; /** * Calls one of a collection of ItemWriters for each item, based on a router @@ -32,6 +33,7 @@ import org.springframework.batch.item.ItemWriter; * The implementation is thread-safe if all delegates are thread-safe. * * @author Dave Syer + * @author Glenn Renfro * @since 2.0 */ public class ClassifierCompositeItemWriter implements ItemWriter { @@ -42,6 +44,7 @@ public class ClassifierCompositeItemWriter implements ItemWriter { * @param classifier the classifier to set */ public void setClassifier(Classifier> classifier) { + Assert.notNull(classifier, "A classifier is required."); this.classifier = classifier; } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilder.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilder.java new file mode 100644 index 000000000..fc2060b54 --- /dev/null +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilder.java @@ -0,0 +1,63 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.batch.item.support.builder; + +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.support.ClassifierCompositeItemWriter; +import org.springframework.classify.Classifier; +import org.springframework.classify.ClassifierSupport; +import org.springframework.util.Assert; + +/** + * Creates a fully qualified ClassifierCompositeItemWriter. + * + * @author Glenn Renfro + * + * @since 4.0 + */ +public class ClassifierCompositeItemWriterBuilder { + + private Classifier> classifier; + + /** + * Establish the classifier to be used for the selection of which {@link ItemWriter} + * to use. + * + * @param classifier the classifier to set + * @return this instance for method chaining + * @see org.springframework.batch.item.support.ClassifierCompositeItemWriter#setClassifier(Classifier) + */ + public ClassifierCompositeItemWriterBuilder classifier(Classifier> classifier) { + this.classifier = classifier; + + return this; + } + + /** + * Returns a fully constructed {@link ClassifierCompositeItemWriter}. + * + * @return a new {@link ClassifierCompositeItemWriter} + */ + public ClassifierCompositeItemWriter build() { + Assert.notNull(classifier, "A classifier is required."); + + ClassifierCompositeItemWriter writer = new ClassifierCompositeItemWriter<>(); + writer.setClassifier(this.classifier); + return writer; + } + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/ClassifierCompositeItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/ClassifierCompositeItemWriterTests.java index 0405c940b..665719141 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/ClassifierCompositeItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/ClassifierCompositeItemWriterTests.java @@ -15,8 +15,6 @@ */ package org.springframework.batch.item.support; -import static org.junit.Assert.assertEquals; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -24,11 +22,16 @@ import java.util.List; import java.util.Map; import org.junit.Test; -import org.springframework.classify.PatternMatchingClassifier; + import org.springframework.batch.item.ItemWriter; +import org.springframework.classify.PatternMatchingClassifier; + +import static junit.framework.TestCase.fail; +import static org.junit.Assert.assertEquals; /** * @author Dave Syer + * @author Glenn Renfro * */ public class ClassifierCompositeItemWriterTests { @@ -60,4 +63,16 @@ public class ClassifierCompositeItemWriterTests { assertEquals("[one, two, three]", defaults.toString()); } + @Test + public void testSetNullClassifier() throws Exception { + try { + ClassifierCompositeItemWriter writer = new ClassifierCompositeItemWriter<>(); + writer.setClassifier(null); + fail("A classifier is required."); + } + catch (IllegalArgumentException iae) { + assertEquals("Message returned from exception did not match expected result.", "A classifier is required.", + iae.getMessage()); + } + } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilderTests.java new file mode 100644 index 000000000..22b7ca75e --- /dev/null +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/support/builder/ClassifierCompositeItemWriterBuilderTests.java @@ -0,0 +1,79 @@ +/* + * Copyright 2017 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.batch.item.support.builder; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.junit.Test; + +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.support.ClassifierCompositeItemWriter; +import org.springframework.classify.PatternMatchingClassifier; + +import static junit.framework.TestCase.fail; +import static org.junit.Assert.assertEquals; + +/** + * @author Glenn Renfro + */ +public class ClassifierCompositeItemWriterBuilderTests { + + private List defaults = new ArrayList(); + + private List foos = new ArrayList(); + + @Test + public void testWrite() throws Exception { + Map> map = new HashMap>(); + ItemWriter fooWriter = new ItemWriter() { + @Override + public void write(List items) throws Exception { + foos.addAll(items); + } + }; + ItemWriter defaultWriter = new ItemWriter() { + @Override + public void write(List items) throws Exception { + defaults.addAll(items); + } + }; + map.put("foo", fooWriter); + map.put("*", defaultWriter); + ClassifierCompositeItemWriter writer = new ClassifierCompositeItemWriterBuilder() + .classifier(new PatternMatchingClassifier>(map)).build(); + + writer.write(Arrays.asList("foo", "foo", "one", "two", "three")); + assertEquals("[foo, foo]", foos.toString()); + assertEquals("[one, two, three]", defaults.toString()); + } + + @Test + public void testSetNullClassifier() throws Exception { + try { + new ClassifierCompositeItemWriterBuilder().build(); + fail("A classifier is required."); + } + catch (IllegalArgumentException iae) { + assertEquals("Message returned from exception did not match expected result.", "A classifier is required.", + iae.getMessage()); + } + } +}