From cf875e0a38c2947fbd86ede585ac36c73379b98a Mon Sep 17 00:00:00 2001 From: dsyer Date: Wed, 4 Feb 2009 15:50:31 +0000 Subject: [PATCH] Tidy up IDE callbacks in xml config --- .../core/configuration/xml/FlowParser.java | 63 ++++++++++++------- .../xml/JobExecutionListenerParser.java | 7 ++- .../core/configuration/xml/JobParser.java | 28 +++++---- .../core/configuration/xml/SplitParser.java | 4 +- .../core/configuration/xml/StepParser.java | 29 ++++----- 5 files changed, 79 insertions(+), 52 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java index fee90dcd9..eed536384 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/FlowParser.java @@ -18,10 +18,12 @@ package org.springframework.batch.core.configuration.xml; import java.util.ArrayList; import java.util.List; +import org.springframework.batch.core.job.flow.support.SimpleFlow; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.RuntimeBeanReference; -import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -31,52 +33,67 @@ import org.w3c.dom.NodeList; * @author Dave Syer * */ -public class FlowParser { +public class FlowParser extends AbstractSingleBeanDefinitionParser { + + private final String flowName; + + /** + * Construct a {@link FlowParser} with the specified name. + * @param flowName the name of the flow + */ + public FlowParser(String flowName) { + this.flowName = flowName; + + } + + /* + * (non-Javadoc) + * + * @see AbstractSingleBeanDefinitionParser#getBeanClass(Element) + */ + @Override + protected Class getBeanClass(Element element) { + return SimpleFlow.class; + } /** * @param element the top level element containing a flow definition - * @param parserContext the {@link ParserContext} - * @param flowName the name of the flow - * @return a bean definition for a {@link org.springframework.batch.core.job.flow.Flow} + * @param outerContext the {@link ParserContext} */ - public AbstractBeanDefinition parse(Element element, ParserContext parserContext, String flowName) { + @Override + protected void doParse(Element element, ParserContext outerContext, BeanDefinitionBuilder builder) { List stateTransitions = new ArrayList(); StepParser stepParser = new StepParser(); DecisionParser decisionParser = new DecisionParser(); SplitParser splitParser = new SplitParser(); - + ParserContext parserContext = new ParserContext(outerContext.getReaderContext(), outerContext.getDelegate(), + builder.getBeanDefinition()); + NodeList children = element.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node instanceof Element) { String nodeName = node.getLocalName(); - if(nodeName.equals("step")) - { - stateTransitions.addAll(stepParser.parse((Element)node, parserContext)); + if (nodeName.equals("step")) { + stateTransitions.addAll(stepParser.parse((Element) node, parserContext)); } - else if(nodeName.equals("decision")) - { - stateTransitions.addAll(decisionParser.parse((Element)node, parserContext)); + else if (nodeName.equals("decision")) { + stateTransitions.addAll(decisionParser.parse((Element) node, parserContext)); } - else if(nodeName.equals("split")) - { - stateTransitions.addAll(splitParser.parse((Element)node, parserContext)); + else if (nodeName.equals("split")) { + stateTransitions.addAll(splitParser.parse((Element) node, parserContext)); } } } - BeanDefinitionBuilder flowBuilder = BeanDefinitionBuilder - .genericBeanDefinition("org.springframework.batch.core.job.flow.support.SimpleFlow"); - flowBuilder.addConstructorArgValue(flowName); + builder.addConstructorArgValue(flowName); ManagedList managedList = new ManagedList(); @SuppressWarnings( { "unchecked", "unused" }) boolean dummy = managedList.addAll(stateTransitions); - flowBuilder.addPropertyValue("stateTransitions", managedList); - AbstractBeanDefinition flowDef = flowBuilder.getBeanDefinition(); - parserContext.getReaderContext().registerWithGeneratedName(flowDef); + builder.addPropertyValue("stateTransitions", managedList); - return flowDef; + builder.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobExecutionListenerParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobExecutionListenerParser.java index 49761d2e2..a8c02e7ab 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobExecutionListenerParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobExecutionListenerParser.java @@ -24,6 +24,7 @@ import java.util.List; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.config.BeanReference; import org.springframework.beans.factory.config.RuntimeBeanReference; +import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; @@ -76,7 +77,8 @@ public class JobExecutionListenerParser { else if(hasText(className)){ RootBeanDefinition beanDef = new RootBeanDefinition(className, null, null); String delegateId = parserContext.getReaderContext().generateBeanName(beanDef); - parserContext.getRegistry().registerBeanDefinition(delegateId, beanDef); + parserContext.registerBeanComponent(new BeanComponentDefinition(beanDef, delegateId)); + beanDef.setSource(parserContext.extractSource(listenerElement)); listenerBuilder.addPropertyReference("delegate", delegateId); } else { @@ -98,7 +100,8 @@ public class JobExecutionListenerParser { if (!StringUtils.hasText(id)) { id = parserContext.getReaderContext().generateBeanName(beanDef); } - parserContext.getRegistry().registerBeanDefinition(id, beanDef); + parserContext.registerBeanComponent(new BeanComponentDefinition(beanDef, id)); + beanDef.setSource(parserContext.extractSource(listenerElement)); BeanReference bean = new RuntimeBeanReference(id); listeners.add(bean); } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java index a1ed84954..16db155b2 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/JobParser.java @@ -15,14 +15,14 @@ */ package org.springframework.batch.core.configuration.xml; -import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.batch.core.job.flow.FlowJob; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedList; -import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; - import org.w3c.dom.Element; /** @@ -32,7 +32,12 @@ import org.w3c.dom.Element; * @author Dave Syer * */ -public class JobParser extends AbstractBeanDefinitionParser { +public class JobParser extends AbstractSingleBeanDefinitionParser { + + @Override + protected Class getBeanClass(Element element) { + return FlowJob.class; + } /** * Create a bean definition for a {@link org.springframework.batch.core.job.flow.FlowJob}. The @@ -40,16 +45,18 @@ public class JobParser extends AbstractBeanDefinitionParser { * {@link org.springframework.batch.core.repository.JobRepository} and defaults to "jobRepository". Nested step * elements are delegated to a {@link StepParser}. * - * @see AbstractBeanDefinitionParser#parseInternal(Element, ParserContext) + * @see AbstractSingleBeanDefinitionParser#doParse(Element, ParserContext, BeanDefinitionBuilder) */ @Override - protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) { + protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { - BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition("org.springframework.batch.core.job.flow.FlowJob"); String jobName = element.getAttribute("id"); builder.addConstructorArgValue(jobName); String repositoryAttribute = element.getAttribute("job-repository"); + if (!StringUtils.hasText(repositoryAttribute)) { + repositoryAttribute = "jobRepository"; + } builder.addPropertyReference("jobRepository", repositoryAttribute); String restartableAttribute = element.getAttribute("restartable"); @@ -62,8 +69,8 @@ public class JobParser extends AbstractBeanDefinitionParser { builder.addPropertyReference("jobParametersIncrementer", incrementer); } - FlowParser flowParser = new FlowParser(); - AbstractBeanDefinition flowDef = flowParser.parse(element, parserContext, jobName); + FlowParser flowParser = new FlowParser(jobName); + BeanDefinition flowDef = flowParser.parse(element, parserContext); builder.addPropertyValue("flow", flowDef); JobExecutionListenerParser listenerParser = new JobExecutionListenerParser(); @@ -72,8 +79,7 @@ public class JobParser extends AbstractBeanDefinitionParser { ManagedList managedList = listenerParser.parse(listenersElement, parserContext); builder.addPropertyValue("jobExecutionListeners", managedList); } - - return builder.getBeanDefinition(); + } } diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java index 7dfe14459..16b17ed66 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/SplitParser.java @@ -62,10 +62,10 @@ public class SplitParser { BeanDefinitionBuilder.genericBeanDefinition("org.springframework.batch.core.job.flow.support.state.SplitState"); Collection flows = new ArrayList(); - FlowParser flowParser = new FlowParser(); int i = 0; for (Element nextElement : flowElements) { - flows.add(flowParser.parse(nextElement, parserContext, idAttribute+"#"+i)); + FlowParser flowParser = new FlowParser(idAttribute+"#"+i); + flows.add(flowParser.parse(nextElement, parserContext)); i++; } ManagedList managedList = new ManagedList(); 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 544154820..d8b32d3c9 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 @@ -31,7 +31,6 @@ import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.springframework.util.xml.DomUtils; - import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; @@ -74,13 +73,12 @@ public class StepParser { @SuppressWarnings("unchecked") List processTaskElements = (List) DomUtils.getChildElementsByTagName(element, "tasklet"); if (StringUtils.hasText(taskletRef)) { - BeanDefinition task = handleTaskletRef(element, taskletRef, parserContext); - parserContext.getRegistry().registerBeanDefinition(stepRef, task); + handleTaskletRef(element, taskletRef, parserContext); stateBuilder.addConstructorArgReference(stepRef); } else if (processTaskElements.size() > 0) { - BeanDefinition task = handleTaskletElement(element, processTaskElements.get(0), parserContext); - parserContext.getRegistry().registerBeanDefinition(stepRef, task); + Element taskElement = processTaskElements.get(0); + handleTaskletElement(element, taskElement, parserContext); stateBuilder.addConstructorArgReference(stepRef); } else if (StringUtils.hasText(stepRef)) { @@ -209,9 +207,8 @@ public class StepParser { * @param stepElement * @param taskletRef * @param parserContext - * @return the TaskletStep bean */ - protected BeanDefinition handleTaskletRef(Element stepElement, String taskletRef, ParserContext parserContext) { + private void handleTaskletRef(Element stepElement, String taskletRef, ParserContext parserContext) { RootBeanDefinition bd = new RootBeanDefinition("org.springframework.batch.core.step.tasklet.TaskletStep", null, null); @@ -232,16 +229,16 @@ public class StepParser { bd.setRole(BeanDefinition.ROLE_SUPPORT); - return bd; + parserContext.registerBeanComponent(new BeanComponentDefinition(bd, stepElement.getAttribute("name"))); + bd.setSource(parserContext.extractSource(stepElement)); } /** * @param element * @param parserContext - * @return the TaskletStep bean */ - protected BeanDefinition handleTaskletElement(Element stepElement, Element element, ParserContext parserContext) { + private void handleTaskletElement(Element stepElement, Element element, ParserContext parserContext) { RootBeanDefinition bd; @@ -360,7 +357,8 @@ public class StepParser { bd.setRole(BeanDefinition.ROLE_SUPPORT); - return bd; + parserContext.registerBeanComponent(new BeanComponentDefinition(bd, stepElement.getAttribute("name"))); + bd.setSource(parserContext.extractSource(element)); } @@ -451,7 +449,8 @@ public class StepParser { if (!StringUtils.hasText(id)) { id = parserContext.getReaderContext().generateBeanName(beanDef); } - parserContext.getRegistry().registerBeanDefinition(id, beanDef); + parserContext.registerBeanComponent(new BeanComponentDefinition(beanDef, id)); + beanDef.setSource(parserContext.extractSource(listenerElement)); BeanReference bean = new RuntimeBeanReference(id); beans.add(bean); } @@ -482,7 +481,8 @@ public class StepParser { else if (StringUtils.hasText(className)) { RootBeanDefinition beanDef = new RootBeanDefinition(className, null, null); String delegateId = parserContext.getReaderContext().generateBeanName(beanDef); - parserContext.getRegistry().registerBeanDefinition(delegateId, beanDef); + parserContext.registerBeanComponent(new BeanComponentDefinition(beanDef, delegateId)); + beanDef.setSource(parserContext.extractSource(listenerElement)); listenerBuilder.addPropertyReference("delegate", delegateId); } else { @@ -520,7 +520,8 @@ public class StepParser { if (!StringUtils.hasText(id)) { id = parserContext.getReaderContext().generateBeanName(beanDef); } - parserContext.getRegistry().registerBeanDefinition(id, beanDef); + parserContext.registerBeanComponent(new BeanComponentDefinition(beanDef, id)); + beanDef.setSource(parserContext.extractSource(listenerElement)); BeanReference bean = new RuntimeBeanReference(id); beans.add(bean); }