From a273055e9f9d67dc06cbb6569271738e6d31baf9 Mon Sep 17 00:00:00 2001 From: dhgarrette Date: Wed, 11 Mar 2009 20:47:24 +0000 Subject: [PATCH] BATCH-1135: Create top-level element --- .../xml/AbstractListenerParser.java | 24 +++++++++++-------- .../configuration/xml/AbstractStepParser.java | 2 +- .../xml/CoreNamespaceHandler.java | 1 + .../xml/JobExecutionListenerParser.java | 3 ++- .../core/configuration/xml/JobParser.java | 2 +- .../configuration/xml/StepListenerParser.java | 3 ++- .../configuration/xml/spring-batch-2.0.xsd | 13 ++++++++++ .../src/main/resources/jobs/skipSampleJob.xml | 18 ++++++-------- .../sample/common/SkipCheckingListener.java | 4 ++++ 9 files changed, 45 insertions(+), 25 deletions(-) diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java index 3fd0758f0..1677c76a7 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/AbstractListenerParser.java @@ -5,10 +5,11 @@ import java.util.List; import org.springframework.batch.core.listener.AbstractListenerFactoryBean; import org.springframework.batch.core.listener.ListenerMetaData; -import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.ManagedMap; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.StringUtils; import org.w3c.dom.Element; @@ -18,22 +19,27 @@ import org.w3c.dom.NamedNodeMap; * @author Dan Garrette * @since 2.0 */ -public abstract class AbstractListenerParser { +public abstract class AbstractListenerParser extends AbstractSingleBeanDefinitionParser { + + public BeanDefinition internalParse(Element element, ParserContext parserContext) { + BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(getBeanClass(null)); + this.doParse(element, parserContext, builder); + return builder.getBeanDefinition(); + } @SuppressWarnings("unchecked") - public AbstractBeanDefinition parse(Element element, ParserContext parserContext) { - BeanDefinitionBuilder listenerBuilder = BeanDefinitionBuilder.genericBeanDefinition(getFactoryClass()); + public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { String id = element.getAttribute("id"); String listenerRef = element.getAttribute("ref"); String className = element.getAttribute("class"); checkListenerElementAttributes(parserContext, element, id, listenerRef, className); if (StringUtils.hasText(listenerRef)) { - listenerBuilder.addPropertyReference("delegate", listenerRef); + builder.addPropertyReference("delegate", listenerRef); } else if (StringUtils.hasText(className)) { RootBeanDefinition beanDef = new RootBeanDefinition(className, null, null); - listenerBuilder.addPropertyValue("delegate", beanDef); + builder.addPropertyValue("delegate", beanDef); } else { parserContext.getReaderContext().error( @@ -47,9 +53,7 @@ public abstract class AbstractListenerParser { metaDataMap.put(metaDataPropertyName, listenerMethod); } } - listenerBuilder.addPropertyValue("metaDataMap", metaDataMap); - - return listenerBuilder.getBeanDefinition(); + builder.addPropertyValue("metaDataMap", metaDataMap); } private void checkListenerElementAttributes(ParserContext parserContext, Element element, String id, @@ -78,7 +82,7 @@ public abstract class AbstractListenerParser { return methodNameAttributes; } - protected abstract Class getFactoryClass(); + protected abstract Class getBeanClass(Element element); protected abstract ListenerMetaData[] getMetaDataValues(); 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 81a45819c..c7a2f06f4 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 @@ -138,7 +138,7 @@ public abstract class AbstractStepParser { DomUtils.getChildElementsByTagName(listenersElement, "listener"); if (listenerElements != null) { for (Element listenerElement : listenerElements) { - listenerBeans.add(stepListenerParser.parse(listenerElement, parserContext)); + listenerBeans.add(stepListenerParser.internalParse(listenerElement, parserContext)); } } ManagedList arguments = new ManagedList(); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/CoreNamespaceHandler.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/CoreNamespaceHandler.java index a312652f7..ff9869651 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/CoreNamespaceHandler.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/CoreNamespaceHandler.java @@ -33,5 +33,6 @@ public class CoreNamespaceHandler extends NamespaceHandlerSupport { this.registerBeanDefinitionParser("job", new JobParser()); this.registerBeanDefinitionParser("step", new TopLevelStepParser()); this.registerBeanDefinitionParser("job-repository", new JobRepositoryParser()); + this.registerBeanDefinitionParser("step-listener", new StepListenerParser()); } } 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 e28215428..c0dab6517 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 @@ -20,6 +20,7 @@ import org.springframework.batch.core.listener.AbstractListenerFactoryBean; import org.springframework.batch.core.listener.JobListenerFactoryBean; import org.springframework.batch.core.listener.JobListenerMetaData; import org.springframework.batch.core.listener.ListenerMetaData; +import org.w3c.dom.Element; /** * Parser for a step listener element. Builds a {@link JobListenerFactoryBean} @@ -30,7 +31,7 @@ import org.springframework.batch.core.listener.ListenerMetaData; */ public class JobExecutionListenerParser extends AbstractListenerParser { - protected Class getFactoryClass() { + protected Class getBeanClass(Element element) { return JobListenerFactoryBean.class; } 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 9bf9c3ff2..10c63a68b 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 @@ -89,7 +89,7 @@ public class JobParser extends AbstractSingleBeanDefinitionParser { List listeners = new ArrayList(); List listenerElements = (List) DomUtils.getChildElementsByTagName(listenersElement, "listener"); for (Element listenerElement : listenerElements) { - listeners.add(listenerParser.parse(listenerElement, parserContext)); + listeners.add(listenerParser.internalParse(listenerElement, parserContext)); } ManagedList managedList = new ManagedList(); managedList.addAll(listeners); diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepListenerParser.java b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepListenerParser.java index a0b7c929c..14bf52b89 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepListenerParser.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/configuration/xml/StepListenerParser.java @@ -19,6 +19,7 @@ import org.springframework.batch.core.listener.AbstractListenerFactoryBean; import org.springframework.batch.core.listener.ListenerMetaData; import org.springframework.batch.core.listener.StepListenerFactoryBean; import org.springframework.batch.core.listener.StepListenerMetaData; +import org.w3c.dom.Element; /** * Parser for a step listener element. Builds a {@link StepListenerFactoryBean} @@ -29,7 +30,7 @@ import org.springframework.batch.core.listener.StepListenerMetaData; */ public class StepListenerParser extends AbstractListenerParser { - protected Class getFactoryClass() { + protected Class getBeanClass(Element element) { return StepListenerFactoryBean.class; } diff --git a/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd b/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd index 12dc58ba5..1f779a203 100644 --- a/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd +++ b/spring-batch-core/src/main/resources/org/springframework/batch/core/configuration/xml/spring-batch-2.0.xsd @@ -84,6 +84,19 @@ + + + + A bean definition for a step listener (or POJO if using *-method attributes) + + + + + + + + + org.springframework.batch.item.validator.ValidationException java.lang.RuntimeException - + - - - - - - + + - - - - + + @@ -82,6 +76,8 @@ + + diff --git a/spring-batch-samples/src/test/java/org/springframework/batch/sample/common/SkipCheckingListener.java b/spring-batch-samples/src/test/java/org/springframework/batch/sample/common/SkipCheckingListener.java index 5c42c9ce5..ada3d8276 100644 --- a/spring-batch-samples/src/test/java/org/springframework/batch/sample/common/SkipCheckingListener.java +++ b/spring-batch-samples/src/test/java/org/springframework/batch/sample/common/SkipCheckingListener.java @@ -5,6 +5,10 @@ import org.springframework.batch.core.StepExecution; import org.springframework.batch.core.annotation.AfterStep; import org.springframework.batch.core.annotation.BeforeStep; +/** + * @author Dan Garrette + * @since 2.0 + */ public class SkipCheckingListener { @AfterStep