BATCH-1135: Create top-level element <step-listener/>

This commit is contained in:
dhgarrette
2009-03-11 20:47:24 +00:00
parent 099807521e
commit a273055e9f
9 changed files with 45 additions and 25 deletions

View File

@@ -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<? extends AbstractListenerFactoryBean> getFactoryClass();
protected abstract Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element);
protected abstract ListenerMetaData[] getMetaDataValues();

View File

@@ -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();

View File

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

View File

@@ -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<? extends AbstractListenerFactoryBean> getFactoryClass() {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
return JobListenerFactoryBean.class;
}

View File

@@ -89,7 +89,7 @@ public class JobParser extends AbstractSingleBeanDefinitionParser {
List<BeanDefinition> listeners = new ArrayList<BeanDefinition>();
List<Element> listenerElements = (List<Element>) 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);

View File

@@ -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<? extends AbstractListenerFactoryBean> getFactoryClass() {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
return StepListenerFactoryBean.class;
}

View File

@@ -84,6 +84,19 @@
</xsd:complexType>
</xsd:element>
<xsd:element name="step-listener">
<xsd:annotation>
<xsd:documentation>
A bean definition for a step listener (or POJO if using *-method attributes)
</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="stepListenerType"/>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="job-repository">
<xsd:annotation>
<xsd:documentation><![CDATA[

View File

@@ -41,27 +41,21 @@
<skippable-exception-classes>
org.springframework.batch.item.validator.ValidationException
java.lang.RuntimeException
</skippable-exception-classes>
</skippable-exception-classes>
</tasklet>
</step>
<beans:bean id="baseStep" abstract="true">
<beans:property name="listeners">
<beans:list>
<beans:bean class="org.springframework.batch.core.listener.StepListenerFactoryBean">
<beans:property name="delegate" ref="skipCheckingListener"/>
</beans:bean>
<beans:bean class="org.springframework.batch.core.listener.StepListenerFactoryBean">
<beans:property name="delegate" ref="promotionListener"/>
</beans:bean>
<beans:ref bean="skipCheckingListener"/>
<step-listener ref="promotionListener"/>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="tradeProcessor" class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
<beans:bean id="skipCheckingListener" class="org.springframework.batch.sample.common.SkipCheckingListener"/>
<step-listener id="skipCheckingListener" class="org.springframework.batch.sample.common.SkipCheckingListener"/>
<beans:bean id="promotionListener" class="org.springframework.batch.core.listener.ExecutionContextPromotionListener">
<beans:property name="keys" value="stepName"/>
</beans:bean>
@@ -82,6 +76,8 @@
</beans:property>
</beans:bean>
<beans:bean id="tradeProcessor" class="org.springframework.batch.sample.domain.trade.internal.TradeProcessor"/>
<beans:bean id="tradeSqlItemReader" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="sql" value="SELECT isin, quantity, price, customer from TRADE" />

View File

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