diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepParser.java index 980e68b88..b8234daf4 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepParser.java @@ -266,8 +266,13 @@ public class StepParser { handleListenersElement(element, bd, parserContext); + handleStreamsElement(element, bd, parserContext); + bd.setRole(BeanDefinition.ROLE_SUPPORT); + String id = parserContext.getReaderContext().generateBeanName(bd); + parserContext.getRegistry().registerBeanDefinition(id, bd); + return bd; } @@ -343,15 +348,15 @@ public class StepParser { Element streamsElement = DomUtils.getChildElementByTagName(element, "streams"); if (streamsElement != null) { - List listenerBeans = new ArrayList(); - List listenerElements = - DomUtils.getChildElementsByTagName(streamsElement, "listener"); - if (listenerElements != null) { - for (Element listenerElement : listenerElements) { + List streamBeans = new ArrayList(); + List streamElements = + DomUtils.getChildElementsByTagName(streamsElement, "stream"); + if (streamElements != null) { + for (Element listenerElement : streamElements) { String listenerRef = listenerElement.getAttribute("ref"); if (StringUtils.hasText(listenerRef)) { BeanReference bean = new RuntimeBeanReference(listenerRef); - listenerBeans.add(bean); + streamBeans.add(bean); } else { throw new BeanCreationException("ref not specified for <" + listenerElement.getTagName() + "> element"); @@ -359,7 +364,7 @@ public class StepParser { } } ManagedList arguments = new ManagedList(); - arguments.addAll(listenerBeans); + arguments.addAll(streamBeans); bd.getPropertyValues().addPropertyValue("streams", arguments); } } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithFaultTolerantChunkJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithFaultTolerantChunkJobParserTests.java new file mode 100644 index 000000000..55110c797 --- /dev/null +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithFaultTolerantChunkJobParserTests.java @@ -0,0 +1,101 @@ +/* + * Copyright 2006-2007 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.core.configuration.xml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.batch.core.BatchStatus; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.StepExecutionListener; +import org.springframework.batch.core.StepListener; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean; +import org.springframework.batch.core.step.item.FaultTolerantStepFactoryBean; +import org.springframework.batch.item.ItemStream; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.util.ReflectionTestUtils; + + +/** + * @author Thomas Risberg + * + */ +@ContextConfiguration +@RunWith(SpringJUnit4ClassRunner.class) +public class StepWithFaultTolerantChunkJobParserTests { + + @Autowired + private Job job; + + @Autowired + private JobRepository jobRepository; + + @Autowired + private TestReader reader; + + @Autowired + @Qualifier("listener") + private TestListener listener; + + @Autowired + private TestProcessor processor; + + @Autowired + private TestWriter writer; + + @SuppressWarnings("unchecked") + @Autowired + private FaultTolerantStepFactoryBean factory; + + @Before + public void setUp() { + MapJobRepositoryFactoryBean.clear(); + } + + @Test + public void testStepWithTask() throws Exception { + assertNotNull(job); + Object ci = ReflectionTestUtils.getField(factory, "commitInterval"); + assertEquals("wrong chunk-size:", 10, ci); + Object sl = ReflectionTestUtils.getField(factory, "skipLimit"); + assertEquals("wrong skip-limit:", 20, sl); + Object rl = ReflectionTestUtils.getField(factory, "retryLimit"); + assertEquals("wrong retry-limit:", 3, rl); + Object listeners = ReflectionTestUtils.getField(factory, "listeners"); + assertEquals("wrong number of listeners:", 2, ((StepListener[])listeners).length); + Object streams = ReflectionTestUtils.getField(factory, "streams"); + assertEquals("wrong number of streams:", 1, ((ItemStream[])streams).length); + JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); + job.execute(jobExecution); + assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); + assertEquals(1, jobExecution.getStepExecutions().size()); + assertTrue(reader.isExecuted()); + assertTrue(reader.isOpened()); + assertTrue(processor.isExecuted()); + assertTrue(writer.isExecuted()); + assertTrue(listener.isExecuted()); + } +} diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithChunkJobParserTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests.java similarity index 74% rename from spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithChunkJobParserTests.java rename to spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests.java index 74a6c7720..3f7965f72 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithChunkJobParserTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests.java @@ -26,12 +26,16 @@ import org.springframework.batch.core.BatchStatus; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobExecution; import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.StepListener; import org.springframework.batch.core.repository.JobRepository; import org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean; +import org.springframework.batch.core.step.item.SimpleStepFactoryBean; +import org.springframework.batch.item.ItemStream; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.util.ReflectionTestUtils; /** @@ -40,7 +44,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; */ @ContextConfiguration @RunWith(SpringJUnit4ClassRunner.class) -public class StepWithChunkJobParserTests { +public class StepWithSimpleChunkJobParserTests { @Autowired private Job job; @@ -61,6 +65,10 @@ public class StepWithChunkJobParserTests { @Autowired private TestWriter writer; + @SuppressWarnings("unchecked") + @Autowired + private SimpleStepFactoryBean factory; + @Before public void setUp() { MapJobRepositoryFactoryBean.clear(); @@ -69,11 +77,18 @@ public class StepWithChunkJobParserTests { @Test public void testStepWithTask() throws Exception { assertNotNull(job); + Object ci = ReflectionTestUtils.getField(factory, "commitInterval"); + assertEquals("wrong chunk-size:", 10, ci); + Object listeners = ReflectionTestUtils.getField(factory, "listeners"); + assertEquals("wrong number of listeners:", 2, ((StepListener[])listeners).length); + Object streams = ReflectionTestUtils.getField(factory, "streams"); + assertEquals("wrong number of streams:", 1, ((ItemStream[])streams).length); JobExecution jobExecution = jobRepository.createJobExecution(job.getName(), new JobParameters()); job.execute(jobExecution); assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus()); assertEquals(1, jobExecution.getStepExecutions().size()); assertTrue(reader.isExecuted()); + assertTrue(reader.isOpened()); assertTrue(processor.isExecuted()); assertTrue(writer.isExecuted()); assertTrue(listener.isExecuted()); diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/TestReader.java b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/TestReader.java index ca3b8ad72..e992a8979 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/TestReader.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/configuration/xml/TestReader.java @@ -4,11 +4,16 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemStream; +import org.springframework.batch.item.ItemStreamException; import org.springframework.batch.item.ParseException; import org.springframework.batch.item.UnexpectedInputException; -public class TestReader extends AbstractTestComponent implements ItemReader { +public class TestReader extends AbstractTestComponent implements ItemReader, ItemStream { + + private boolean opened = false; List items = null; @@ -19,6 +24,14 @@ public class TestReader extends AbstractTestComponent implements ItemReader - + diff --git a/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests-context.xml b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests-context.xml new file mode 100644 index 000000000..89f5a35e4 --- /dev/null +++ b/spring-batch-core/src/test/resources/org/springframework/batch/core/configuration/xml/StepWithSimpleChunkJobParserTests-context.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file