diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java index 5da3cceac..2d58ba7ca 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractStepParser.java @@ -53,15 +53,15 @@ public abstract class AbstractStepParser { * @param parserContext * @return a BeanDefinition if possible */ - protected AbstractBeanDefinition parseTasklet(Element element, ParserContext parserContext) { + protected AbstractBeanDefinition parseTasklet(Element element, ParserContext parserContext, String jobRepositoryRef) { - String jobRepositoryRef = element.getAttribute("job-repository"); String taskletRef = element.getAttribute("tasklet"); @SuppressWarnings("unchecked") List taskletElements = (List) DomUtils.getChildElementsByTagName(element, "tasklet"); + boolean taskletElementExists = taskletElements.size() > 0; AbstractBeanDefinition bd = null; if (StringUtils.hasText(taskletRef)) { - if (taskletElements.size() > 0) { + if (taskletElementExists) { parserContext.getReaderContext().error( "The <" + taskletElements.get(0).getNodeName() + "> element can't be combined with the 'tasklet=\"" + taskletRef @@ -69,7 +69,7 @@ public abstract class AbstractStepParser { } bd = parseTaskletRef(element, taskletRef, parserContext, jobRepositoryRef); } - else if (taskletElements.size() > 0) { + else if (taskletElementExists) { Element taskElement = taskletElements.get(0); bd = parseTaskletElement(element, taskElement, parserContext, jobRepositoryRef); } @@ -82,7 +82,7 @@ public abstract class AbstractStepParser { * @param taskletRef * @param parserContext */ - protected AbstractBeanDefinition parseTaskletRef(Element stepElement, String taskletRef, + private AbstractBeanDefinition parseTaskletRef(Element stepElement, String taskletRef, ParserContext parserContext, String jobRepositoryRef) { GenericBeanDefinition bd = new GenericBeanDefinition(); @@ -103,7 +103,7 @@ public abstract class AbstractStepParser { * @param element * @param parserContext */ - protected AbstractBeanDefinition parseTaskletElement(Element stepElement, Element element, + private AbstractBeanDefinition parseTaskletElement(Element stepElement, Element element, ParserContext parserContext, String jobRepositoryRef) { AbstractBeanDefinition bd = taskletElementParser.parse(element, parserContext); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java index b5b3c5e2f..26bb0ca9b 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/InlineStepParser.java @@ -29,8 +29,9 @@ import org.w3c.dom.Element; /** * Internal parser for the <step/> elements inside a job. A step element - * references a bean definition for a {@link org.springframework.batch.core.Step} and goes on to (optionally) - * list a set of transitions from that step to others with <next on="pattern" + * references a bean definition for a + * {@link org.springframework.batch.core.Step} and goes on to (optionally) list + * a set of transitions from that step to others with <next on="pattern" * to="stepName"/>. Used by the {@link JobParser}. * * @see JobParser @@ -46,14 +47,16 @@ public class InlineStepParser extends AbstractStepParser { * * @param element the <step/gt; element to parse * @param parserContext the parser context for the bean factory - * @param jobRepositoryRef the reference to the jobRepository from the enclosing tag - * @return a collection of bean definitions for {@link org.springframework.batch.core.job.flow.support.StateTransition} - * instances objects + * @param jobRepositoryRef the reference to the jobRepository from the + * enclosing tag + * @return a collection of bean definitions for + * {@link org.springframework.batch.core.job.flow.support.StateTransition} + * instances objects */ public Collection parse(Element element, ParserContext parserContext, String jobRepositoryRef) { - BeanDefinitionBuilder stateBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.batch.core.job.flow.support.state.StepState"); + BeanDefinitionBuilder stateBuilder = BeanDefinitionBuilder + .genericBeanDefinition("org.springframework.batch.core.job.flow.support.state.StepState"); String stepId = element.getAttribute("id"); String stepRef = element.getAttribute("ref"); String taskletRef = element.getAttribute("tasklet"); @@ -61,48 +64,50 @@ public class InlineStepParser extends AbstractStepParser { @SuppressWarnings("unchecked") List listOfTaskElements = (List) DomUtils.getChildElementsByTagName(element, "tasklet"); @SuppressWarnings("unchecked") - List listOfListenersElements = (List) DomUtils.getChildElementsByTagName(element, "listeners"); + List listOfListenersElements = (List) DomUtils + .getChildElementsByTagName(element, "listeners"); if (StringUtils.hasText(stepRef)) { if (StringUtils.hasText(taskletRef)) { - parserContext.getReaderContext().error("The 'tasklet' attribute can't be combined with the 'ref=\""+ stepRef +"\"' attribute specification for <" + element.getNodeName() + ">", element); + parserContext.getReaderContext().error( + "The 'tasklet' attribute can't be combined with the 'ref=\"" + stepRef + + "\"' attribute specification for <" + element.getNodeName() + ">", element); } if (listOfTaskElements.size() > 0) { - parserContext.getReaderContext().error("The <" + listOfTaskElements.get(0).getNodeName() + - "> element can't be combined with the 'ref=\""+ stepRef +"\"' attribute specification for <" + element.getNodeName() + ">", element); + parserContext.getReaderContext().error( + "The <" + listOfTaskElements.get(0).getNodeName() + + "> element can't be combined with the 'ref=\"" + stepRef + + "\"' attribute specification for <" + element.getNodeName() + ">", element); } if (listOfListenersElements.size() > 0) { - parserContext.getReaderContext().error("The 'listeners' element can't be combined with the 'ref=\""+ stepRef +"\"' attribute specification for <" + element.getNodeName() + ">", element); + parserContext.getReaderContext().error( + "The 'listeners' element can't be combined with the 'ref=\"" + stepRef + + "\"' attribute specification for <" + element.getNodeName() + ">", element); } if (StringUtils.hasText(element.getAttribute("parent"))) { - parserContext.getReaderContext().error("The 'parent' element can't be combined with the 'ref=\""+ stepRef +"\"' attribute specification for <" + element.getNodeName() + ">", element); + parserContext.getReaderContext().error( + "The 'parent' element can't be combined with the 'ref=\"" + stepRef + + "\"' attribute specification for <" + element.getNodeName() + ">", element); } - BeanDefinitionBuilder stepBuilder = - BeanDefinitionBuilder.genericBeanDefinition("org.springframework.batch.core.configuration.xml.DelegatingStep"); + BeanDefinitionBuilder stepBuilder = BeanDefinitionBuilder + .genericBeanDefinition("org.springframework.batch.core.configuration.xml.DelegatingStep"); stepBuilder.addConstructorArgValue(stepId); stepBuilder.addConstructorArgReference(stepRef); AbstractBeanDefinition bd = stepBuilder.getBeanDefinition(); - bd.setSource(parserContext.extractSource(element)); + bd.setSource(parserContext.extractSource(element)); parserContext.getRegistry().registerBeanDefinition(stepId, bd); stateBuilder.addConstructorArgReference(stepId); } - else if (StringUtils.hasText(taskletRef)) { - if (listOfTaskElements.size() > 0) { - parserContext.getReaderContext().error("The <" + listOfTaskElements.get(0).getNodeName() + - "> element can't be combined with the 'tasklet=\""+ taskletRef +"\"' attribute specification for <" + element.getNodeName() + ">", element); - } - AbstractBeanDefinition bd = parseTaskletRef(element, taskletRef, parserContext, jobRepositoryRef); - parserContext.registerBeanComponent(new BeanComponentDefinition(bd, stepId)); - stateBuilder.addConstructorArgReference(stepId); - } - else if (listOfTaskElements.size() > 0) { - Element taskElement = listOfTaskElements.get(0); - AbstractBeanDefinition bd = parseTaskletElement(element, taskElement, parserContext, jobRepositoryRef); - parserContext.registerBeanComponent(new BeanComponentDefinition(bd, stepId)); - stateBuilder.addConstructorArgReference(stepId); - } else { - parserContext.getReaderContext().error("Incomplete configuration detected while creating step with name " + stepRef, element); + AbstractBeanDefinition bd = parseTasklet(element, parserContext, jobRepositoryRef); + if (bd != null) { + parserContext.registerBeanComponent(new BeanComponentDefinition(bd, stepId)); + stateBuilder.addConstructorArgReference(stepId); + } + else { + parserContext.getReaderContext().error( + "Incomplete configuration detected while creating step with name " + stepRef, element); + } } return FlowParser.getNextElements(parserContext, stepId, stateBuilder.getBeanDefinition(), element); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StandaloneStepParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StandaloneStepParser.java index ddf961a0c..adfef7a3d 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StandaloneStepParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StandaloneStepParser.java @@ -38,7 +38,8 @@ public class StandaloneStepParser extends AbstractStepParser { * @param parserContext the parser context for the bean factory */ public AbstractBeanDefinition parse(Element element, ParserContext parserContext) { - AbstractBeanDefinition bd = parseTasklet(element, parserContext); + String jobRepositoryRef = element.getAttribute("job-repository"); + AbstractBeanDefinition bd = parseTasklet(element, parserContext, jobRepositoryRef); if (bd == null) { bd = new GenericBeanDefinition(); setUpBeanDefinition(element, bd, parserContext, element.getAttribute("job-repository")); @@ -47,5 +48,4 @@ public class StandaloneStepParser extends AbstractStepParser { return bd; } - }