RESOLVED - issue BATCH-1311: SimpleJobExplorer should return null when a StepExecution cannot be found

This commit is contained in:
dsyer
2009-06-26 21:09:21 +00:00
parent e25e9b1ca8
commit 4b8ee536ca
5 changed files with 338 additions and 258 deletions

View File

@@ -45,7 +45,7 @@ public class SimpleJobExplorer implements JobExplorer {
private JobInstanceDao jobInstanceDao;
private JobExecutionDao jobExecutionDao;
private StepExecutionDao stepExecutionDao;
private ExecutionContextDao ecDao;
@@ -57,7 +57,9 @@ public class SimpleJobExplorer implements JobExplorer {
SimpleJobExplorer() {
}
public SimpleJobExplorer(JobInstanceDao jobInstanceDao, JobExecutionDao jobExecutionDao, StepExecutionDao stepExecutionDao, ExecutionContextDao ecDao) {
public SimpleJobExplorer(JobInstanceDao jobInstanceDao,
JobExecutionDao jobExecutionDao, StepExecutionDao stepExecutionDao,
ExecutionContextDao ecDao) {
super();
this.jobInstanceDao = jobInstanceDao;
this.jobExecutionDao = jobExecutionDao;
@@ -65,78 +67,118 @@ public class SimpleJobExplorer implements JobExplorer {
this.ecDao = ecDao;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#findJobExecutions(org.springframework.batch.core.JobInstance)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#findJobExecutions(
* org.springframework.batch.core.JobInstance)
*/
public List<JobExecution> getJobExecutions(JobInstance jobInstance) {
List<JobExecution> executions = jobExecutionDao.findJobExecutions(jobInstance);
for(JobExecution jobExecution:executions){
List<JobExecution> executions = jobExecutionDao
.findJobExecutions(jobInstance);
for (JobExecution jobExecution : executions) {
getJobExecutionDependencies(jobExecution);
}
return executions;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#findRunningJobExecutions(java.lang.String)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#findRunningJobExecutions
* (java.lang.String)
*/
public Set<JobExecution> findRunningJobExecutions(String jobName) {
Set<JobExecution> executions = jobExecutionDao.findRunningJobExecutions(jobName);
for(JobExecution jobExecution:executions){
Set<JobExecution> executions = jobExecutionDao
.findRunningJobExecutions(jobName);
for (JobExecution jobExecution : executions) {
getJobExecutionDependencies(jobExecution);
}
return executions;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#getJobExecution(java.lang.Long)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#getJobExecution(java
* .lang.Long)
*/
public JobExecution getJobExecution(Long executionId) {
JobExecution jobExecution = jobExecutionDao.getJobExecution(executionId);
if (jobExecution==null) {
if (executionId == null) {
return null;
}
JobExecution jobExecution = jobExecutionDao
.getJobExecution(executionId);
if (jobExecution == null) {
return null;
}
getJobExecutionDependencies(jobExecution);
return jobExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#getStepExecution(java.lang.Long)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#getStepExecution(java
* .lang.Long)
*/
public StepExecution getStepExecution(Long jobExecutionId, Long executionId) {
StepExecution stepExecution = stepExecutionDao.getStepExecution(getJobExecution(jobExecutionId), executionId);
JobExecution jobExecution = getJobExecution(jobExecutionId);
if (jobExecution == null) {
return null;
}
StepExecution stepExecution = stepExecutionDao.getStepExecution(
jobExecution, executionId);
getStepExecutionDependencies(stepExecution);
return stepExecution;
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#getJobInstance(java.lang.Long)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#getJobInstance(java
* .lang.Long)
*/
public JobInstance getJobInstance(Long instanceId) {
return jobInstanceDao.getJobInstance(instanceId);
}
/* (non-Javadoc)
* @see org.springframework.batch.core.explore.JobExplorer#getLastJobInstances(java.lang.String, int)
/*
* (non-Javadoc)
*
* @see
* org.springframework.batch.core.explore.JobExplorer#getLastJobInstances
* (java.lang.String, int)
*/
public List<JobInstance> getJobInstances(String jobName, int start, int count) {
public List<JobInstance> getJobInstances(String jobName, int start,
int count) {
return jobInstanceDao.getJobInstances(jobName, start, count);
}
/*
* Find all dependencies for a JobExecution, including JobInstance (which requires JobParameters)
* plus StepExecutions
* Find all dependencies for a JobExecution, including JobInstance (which
* requires JobParameters) plus StepExecutions
*/
private void getJobExecutionDependencies(JobExecution jobExecution){
private void getJobExecutionDependencies(JobExecution jobExecution) {
JobInstance jobInstance = jobInstanceDao.getJobInstance(jobExecution);
stepExecutionDao.addStepExecutions(jobExecution);
jobExecution.setJobInstance(jobInstance);
jobExecution.setExecutionContext(ecDao.getExecutionContext(jobExecution));
jobExecution.setExecutionContext(ecDao
.getExecutionContext(jobExecution));
}
private void getStepExecutionDependencies(StepExecution stepExecution) {
stepExecution.setExecutionContext(ecDao.getExecutionContext(stepExecution));
if (stepExecution != null) {
stepExecution.setExecutionContext(ecDao
.getExecutionContext(stepExecution));
}
}
}

View File

@@ -39,7 +39,7 @@ import org.springframework.batch.core.repository.dao.JobInstanceDao;
import org.springframework.batch.core.repository.dao.StepExecutionDao;
/**
* Test {@link SimpleJobExplorer}.
* Test {@link SimpleJobExplorer}.
*
* @author Dave Syer
*
@@ -49,13 +49,14 @@ public class SimpleJobExplorerTests extends TestCase {
private SimpleJobExplorer jobExplorer;
private JobExecutionDao jobExecutionDao;
private JobInstanceDao jobInstanceDao;
private StepExecutionDao stepExecutionDao;
private JobInstance jobInstance = new JobInstance(111L, new JobParameters(), "job");
private JobInstance jobInstance = new JobInstance(111L,
new JobParameters(), "job");
private ExecutionContextDao ecDao;
private JobExecution jobExecution = new JobExecution(jobInstance, 123L);
@@ -67,14 +68,16 @@ public class SimpleJobExplorerTests extends TestCase {
stepExecutionDao = createMock(StepExecutionDao.class);
ecDao = createMock(ExecutionContextDao.class);
jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao, stepExecutionDao, ecDao);
jobExplorer = new SimpleJobExplorer(jobInstanceDao, jobExecutionDao,
stepExecutionDao, ecDao);
}
@Test
public void testGetJobExecution() throws Exception {
expect(jobExecutionDao.getJobExecution(123L)).andReturn(jobExecution);
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(
jobInstance);
stepExecutionDao.addStepExecutions(jobExecution);
expectLastCall();
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
@@ -94,7 +97,8 @@ public class SimpleJobExplorerTests extends TestCase {
public void testGetStepExecution() throws Exception {
expect(jobExecutionDao.getJobExecution(123L)).andReturn(jobExecution);
StepExecution stepExecution = jobExecution.createStepExecution("foo");
expect(stepExecutionDao.getStepExecution(jobExecution, 123L)).andReturn(stepExecution);
expect(stepExecutionDao.getStepExecution(jobExecution, 123L))
.andReturn(stepExecution);
expect(ecDao.getExecutionContext(jobExecution)).andReturn(null);
expect(ecDao.getExecutionContext(stepExecution)).andReturn(null);
stepExecutionDao.addStepExecutions(jobExecution);
@@ -104,10 +108,33 @@ public class SimpleJobExplorerTests extends TestCase {
verify(jobExecutionDao, stepExecutionDao, ecDao);
}
@Test
public void testGetStepExecutionMissing() throws Exception {
expect(jobExecutionDao.getJobExecution(123L)).andReturn(jobExecution);
stepExecutionDao.addStepExecutions(jobExecution);
expectLastCall();
expect(ecDao.getExecutionContext(jobExecution)).andReturn(null);
expect(stepExecutionDao.getStepExecution(jobExecution, 123L))
.andReturn(null);
replay(jobExecutionDao, stepExecutionDao, ecDao);
assertNull(jobExplorer.getStepExecution(jobExecution.getId(), 123L));
verify(jobExecutionDao, stepExecutionDao, ecDao);
}
@Test
public void testGetStepExecutionMissingJobExecution() throws Exception {
expect(jobExecutionDao.getJobExecution(123L)).andReturn(null);
replay(jobExecutionDao, stepExecutionDao, ecDao);
assertNull(jobExplorer.getStepExecution(jobExecution.getId(), 123L));
verify(jobExecutionDao, stepExecutionDao, ecDao);
}
@Test
public void testFindRunningJobExecutions() throws Exception {
expect(jobExecutionDao.findRunningJobExecutions("job")).andReturn(Collections.singleton(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(jobExecutionDao.findRunningJobExecutions("job")).andReturn(
Collections.singleton(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(
jobInstance);
stepExecutionDao.addStepExecutions(jobExecution);
expectLastCall();
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
@@ -117,8 +144,10 @@ public class SimpleJobExplorerTests extends TestCase {
@Test
public void testFindJobExecutions() throws Exception {
expect(jobExecutionDao.findJobExecutions(jobInstance)).andReturn(Collections.singletonList(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(jobInstance);
expect(jobExecutionDao.findJobExecutions(jobInstance)).andReturn(
Collections.singletonList(jobExecution));
expect(jobInstanceDao.getJobInstance(jobExecution)).andReturn(
jobInstance);
stepExecutionDao.addStepExecutions(jobExecution);
expectLastCall();
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
@@ -138,7 +167,8 @@ public class SimpleJobExplorerTests extends TestCase {
@Test
public void testGetLastJobInstances() throws Exception {
jobInstanceDao.getJobInstances("foo", 0, 1);
EasyMock.expectLastCall().andReturn(Collections.singletonList(jobInstance));
EasyMock.expectLastCall().andReturn(
Collections.singletonList(jobInstance));
replay(jobExecutionDao, jobInstanceDao, stepExecutionDao);
jobExplorer.getJobInstances("foo", 0, 1);
verify(jobExecutionDao, jobInstanceDao, stepExecutionDao);

View File

@@ -5,7 +5,6 @@
<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
<classpathentry kind="output" path="target/classes"/>
</classpath>

View File

@@ -1,37 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>spring-batch-infrastructure</name>
<comment> The Spring Batch Infrastructure is a set of low-level components, interfaces and tools for batch processing applications and optimisations.
<name>spring-batch-infrastructure</name>
<comment> The Spring Batch Infrastructure is a set of low-level components, interfaces and tools for batch processing applications and optimisations.
</comment>
<projects/>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments/>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments/>
</buildCommand>
<buildCommand>
<name>org.springframework.ide.eclipse.core.springbuilder</name>
<arguments/>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments/>
</buildCommand>
<buildCommand>
<name>org.maven.ide.eclipse.maven2Builder</name>
<arguments/>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.springframework.ide.eclipse.core.springnature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
</natures>
</projectDescription>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.wst.common.project.facet.core.builder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.springframework.ide.eclipse.core.springbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.wst.validation.validationbuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.maven.ide.eclipse.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.maven.ide.eclipse.maven2Nature</nature>
<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
<nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
<nature>org.springframework.ide.eclipse.core.springnature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
</projectDescription>

View File

@@ -1,184 +1,187 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-batch-infrastructure</artifactId>
<version>2.0.2.CI-SNAPSHOT </version>
<packaging>jar</packaging>
<name>Infrastructure</name>
<description> The Spring Batch Infrastructure is a set of low-level components, interfaces and tools for batch processing applications and optimisations.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>spring-batch-infrastructure</artifactId>
<version>2.0.2.CI-SNAPSHOT </version>
<packaging>jar</packaging>
<name>Infrastructure</name>
<description><![CDATA[The Spring Batch Infrastructure is a set of
low-level components, interfaces and tools for batch processing
applications and optimisations.]]>
</description>
<parent>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-parent</artifactId>
<version>2.0.2.CI-SNAPSHOT</version>
<relativePath>../spring-batch-parent</relativePath>
</parent>
<profiles>
<profile>
<id>tiger</id>
<activation>
<jdk>1.5</jdk>
</activation>
<dependencies>
<dependency>
<groupId>stax</groupId>
<artifactId>stax</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>com.springsource.bundlor</groupId>
<artifactId>com.springsource.bundlor.maven</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<junitArtifactName>junit:junit</junitArtifactName>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jms_1.1_spec</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-oxm</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>emma-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
</plugin>
</plugins>
</reporting>
<parent>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-parent</artifactId>
<version>2.0.2.CI-SNAPSHOT</version>
<relativePath>../spring-batch-parent</relativePath>
</parent>
<profiles>
<profile>
<id>tiger</id>
<activation>
<jdk>1.5</jdk>
</activation>
<dependencies>
<dependency>
<groupId>stax</groupId>
<artifactId>stax</artifactId>
</dependency>
</dependencies>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>com.springsource.bundlor</groupId>
<artifactId>com.springsource.bundlor.maven</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<junitArtifactName>junit:junit</junitArtifactName>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jms_1.1_spec</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-sqlmap</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-oxm</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<reporting>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>emma-maven-plugin</artifactId>
<version>1.0-alpha-1</version>
</plugin>
</plugins>
</reporting>
</project>