BATCH-1143: Moved common logic from InlineStepParser and StandaloneStepParser to AbstractStepParser

This commit is contained in:
dhgarrette
2009-03-13 05:54:23 +00:00
parent 1ddfe49191
commit 4de7d5ec2d
3 changed files with 45 additions and 40 deletions

View File

@@ -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<Element> taskletElements = (List<Element>) 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);

View File

@@ -29,8 +29,9 @@ import org.w3c.dom.Element;
/**
* Internal parser for the &lt;step/&gt; 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 &lt;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 &lt;next on="pattern"
* to="stepName"/&gt;. Used by the {@link JobParser}.
*
* @see JobParser
@@ -46,14 +47,16 @@ public class InlineStepParser extends AbstractStepParser {
*
* @param element the &lt;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<BeanDefinition> 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<Element> listOfTaskElements = (List<Element>) DomUtils.getChildElementsByTagName(element, "tasklet");
@SuppressWarnings("unchecked")
List<Element> listOfListenersElements = (List<Element>) DomUtils.getChildElementsByTagName(element, "listeners");
List<Element> listOfListenersElements = (List<Element>) 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);

View File

@@ -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;
}
}