BATCH-1135: added unit tests for StepListenerParser.

This commit is contained in:
dhgarrette
2009-03-12 07:12:52 +00:00
parent 5441a642d1
commit a117b3d21c
8 changed files with 148 additions and 17 deletions

View File

@@ -17,12 +17,19 @@ import org.w3c.dom.NamedNodeMap;
/**
* @author Dan Garrette
* @since 2.0
* @see StepListenerParser
* @see JobExecutionListenerParser
*/
public abstract class AbstractListenerParser {
@SuppressWarnings("unchecked")
public AbstractBeanDefinition parse(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(getBeanClass(null));
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(getBeanClass());
doParse(element, parserContext, builder);
return builder.getBeanDefinition();
}
@SuppressWarnings("unchecked")
public void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
String id = element.getAttribute("id");
String listenerRef = element.getAttribute("ref");
String className = element.getAttribute("class");
@@ -48,7 +55,6 @@ public abstract class AbstractListenerParser {
}
}
builder.addPropertyValue("metaDataMap", metaDataMap);
return builder.getBeanDefinition();
}
private void checkListenerElementAttributes(ParserContext parserContext, Element element, String id,
@@ -77,7 +83,7 @@ public abstract class AbstractListenerParser {
return methodNameAttributes;
}
protected abstract Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element);
protected abstract Class<? extends AbstractListenerFactoryBean> getBeanClass();
protected abstract ListenerMetaData[] getMetaDataValues();

View File

@@ -20,7 +20,6 @@ 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}
@@ -28,10 +27,11 @@ import org.w3c.dom.Element;
*
* @author Dan Garrette
* @since 2.0
* @see AbstractListenerParser
*/
public class JobExecutionListenerParser extends AbstractListenerParser {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass() {
return JobListenerFactoryBean.class;
}

View File

@@ -19,7 +19,6 @@ 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}
@@ -27,10 +26,11 @@ import org.w3c.dom.Element;
*
* @author Dan Garrette
* @since 2.0
* @see AbstractListenerParser
*/
public class StepListenerParser extends AbstractListenerParser {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
protected Class<? extends AbstractListenerFactoryBean> getBeanClass() {
return StepListenerFactoryBean.class;
}

View File

@@ -1,22 +1,29 @@
package org.springframework.batch.core.configuration.xml;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.xml.AbstractBeanDefinitionParser;
import org.springframework.batch.core.listener.AbstractListenerFactoryBean;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;
/**
* Parse &lt;step-listener/&gt; elements in the batch namespace.
*
* @author Dan Garrette
* @since 2.0
*/
public class TopLevelStepListenerParser extends AbstractBeanDefinitionParser {
public class TopLevelStepListenerParser extends AbstractSingleBeanDefinitionParser {
private StepListenerParser stepListenerParser = new StepListenerParser();
@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
StepListenerParser stepListenerParser = new StepListenerParser();
return stepListenerParser.parse(element, parserContext);
protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
stepListenerParser.doParse(element, parserContext, builder);
}
@Override
protected Class<? extends AbstractListenerFactoryBean> getBeanClass(Element element) {
return stepListenerParser.getBeanClass();
}
}

View File

@@ -0,0 +1,92 @@
/*
* Copyright 2002-2008 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.batch.core.configuration.xml;
import static org.junit.Assert.assertTrue;
import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.aop.framework.Advised;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepExecutionListener;
import org.springframework.batch.core.listener.CompositeStepExecutionListener;
import org.springframework.batch.core.listener.StepExecutionListenerSupport;
import org.springframework.batch.core.step.AbstractStep;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Dan Garrette
* @since 2.0
*/
@ContextConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
public class StepListenerParserTests {
@SuppressWarnings("unchecked")
@Test
public void testStepListenerParser() throws Exception {
ConfigurableApplicationContext ctx = new ClassPathXmlApplicationContext(
"org/springframework/batch/core/configuration/xml/StepListenerParserTests-context.xml");
Map<String, Object> beans = ctx.getBeansOfType(Step.class);
assertTrue(beans.containsKey("s1"));
Step s1 = (Step) ctx.getBean("s1");
assertTrue(s1 instanceof TaskletStep);
Field listenerField = AbstractStep.class.getDeclaredField("stepExecutionListener");
listenerField.setAccessible(true);
Object compositeListener = listenerField.get(s1);
Field compositeField = CompositeStepExecutionListener.class.getDeclaredField("list");
compositeField.setAccessible(true);
Object composite = compositeField.get(compositeListener);
Class cls = Class.forName("org.springframework.batch.core.listener.OrderedComposite");
Field listField = cls.getDeclaredField("list");
listField.setAccessible(true);
List<StepExecutionListener> list = (List<StepExecutionListener>) listField.get(composite);
// assertEquals(3, list.size());
boolean a = false;
boolean b = false;
boolean c = false;
for (StepExecutionListener listener : list) {
if (listener instanceof Advised) {
listener = (StepExecutionListener) ((Advised) listener).getTargetSource().getTarget();
}
if (listener instanceof TestListener) {
a = true;
}
if (listener instanceof StepExecutionListenerSupport) {
b = true;
}
if (listener instanceof CompositeStepExecutionListener) {
c = true;
}
}
assertTrue(a);
assertTrue(b);
// assertTrue(c);
}
}

View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/batch" xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/batch http://www.springframework.org/schema/batch/spring-batch-2.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<beans:import resource="common-context.xml" />
<job id="job">
<step id="s1" tasklet="dummyTasklet" parent="baseStep">
<listeners>
<listener class="org.springframework.batch.core.configuration.xml.TestListener"/>
<listener ref="toplevel"/>
</listeners>
</step>
</job>
<step-listener id="toplevel" class="org.springframework.batch.core.listener.StepExecutionListenerSupport"/>
<beans:bean id="baseStep" abstract="true">
<beans:property name="stepExecutionListeners">
<step-listener class="org.springframework.batch.core.listener.CompositeStepExecutionListener"/>
</beans:property>
</beans:bean>
</beans:beans>

View File

@@ -36,6 +36,4 @@
</beans:property>
</beans:bean>
<beans:bean id="dummyTasklet" class="org.springframework.batch.core.configuration.xml.DummyTasklet"/>
</beans:beans>

View File

@@ -37,4 +37,6 @@
<bean id="reader" class="org.springframework.batch.core.configuration.xml.DummyItemReader"/>
<bean id="writer" class="org.springframework.batch.core.configuration.xml.DummyItemWriter"/>
<bean id="dummyTasklet" class="org.springframework.batch.core.configuration.xml.DummyTasklet"/>
</beans>