RESOLVED - issue BATCH-195: JobIdentifier with simple string key

http://opensource.atlassian.com/projects/spring/browse/BATCH-195
This commit is contained in:
dsyer
2007-11-09 16:50:28 +00:00
parent dc9d04e705
commit ec63a1c1a1
28 changed files with 398 additions and 147 deletions

View File

@@ -15,20 +15,22 @@
*/
package org.springframework.batch.execution.bootstrap.support;
/**
* Implementation of the {@link SystemExiter} interface
* that calls the standards System.exit method. It should
* be noted that there will be no unit tests for this class,
* since there is only one line of actual code, that would only
* be testable by mocking System or Runtime.
* Implementation of the {@link SystemExiter} interface that calls the standards
* System.exit method. It should be noted that there will be no unit tests for
* this class, since there is only one line of actual code, that would only be
* testable by mocking System or Runtime.
*
* @author Lucas Ward
*
* @author Dave Syer
*
*/
public class JvmSystemExiter implements SystemExiter {
/* (non-Javadoc)
/**
* Delegate call to System.exit() with the argument provided. Do not use
* this at home children!
*
* @see org.springframework.batch.execution.bootstrap.SystemExiter#exit(int)
*/
public void exit(int status) {

View File

@@ -1,12 +1,16 @@
package org.springframework.batch.execution.repository.dao;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.hibernate.EmptyInterceptor;
import org.springframework.batch.core.domain.JobIdentifier;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.execution.runtime.DefaultJobIdentifier;
import org.springframework.batch.execution.runtime.ScheduledJobIdentifier;
import org.springframework.util.ClassUtils;
@@ -25,11 +29,15 @@ import org.springframework.util.ClassUtils;
public class EntityNameInterceptor extends EmptyInterceptor {
private static final String SIMPLE_JOB_INSTANCE = "SimpleJobInstance";
private Map identifierTypes = new HashMap();
private Map identifierTypes;
private Set entrySet;
{
identifierTypes.put(ScheduledJobIdentifier.class,
public EntityNameInterceptor() {
Map types = new HashMap();
types.put(ScheduledJobIdentifier.class,
"ScheduledJobInstance");
types.put(DefaultJobIdentifier.class, "DefaultJobInstance");
setIdentifierTypes(types);
};
/**
@@ -45,6 +53,7 @@ public class EntityNameInterceptor extends EmptyInterceptor {
* the identifierTypes to set
*/
public void setIdentifierTypes(Map types) {
this.identifierTypes = new HashMap();
for (Iterator iterator = types.entrySet().iterator(); iterator
.hasNext();) {
@@ -63,6 +72,10 @@ public class EntityNameInterceptor extends EmptyInterceptor {
}
}
}
this.entrySet = new TreeSet(new ClassComparator());
entrySet.addAll(identifierTypes.keySet());
}
/**
@@ -75,16 +88,38 @@ public class EntityNameInterceptor extends EmptyInterceptor {
public String getEntityName(Object object) {
if (object instanceof JobInstance) {
JobInstance instance = (JobInstance) object;
for (Iterator iterator = identifierTypes.entrySet().iterator(); iterator
.hasNext();) {
Map.Entry entry = (Map.Entry) iterator.next();
Class key = (Class) entry.getKey();
for (Iterator iterator = entrySet.iterator(); iterator.hasNext();) {
Class key = (Class) iterator.next();
if (key.isAssignableFrom(instance.getIdentifier().getClass())) {
return (String) entry.getValue();
return (String) identifierTypes.get(key);
}
}
return SIMPLE_JOB_INSTANCE;
}
return super.getEntityName(object);
}
/**
* Comparator for classes to order by inheritance.
*
* @author Dave Syer
*
*/
private class ClassComparator implements Comparator {
/**
* @return 1 if arg0 is assignable from arg1
* @return -1 otherwise
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object arg0, Object arg1) {
Class cls0 = (Class) arg0;
Class cls1 = (Class) arg1;
if (cls0.isAssignableFrom(cls1)) {
return 1;
}
return -1;
}
}
}

View File

@@ -37,13 +37,12 @@ import org.springframework.util.StringUtils;
/**
* SQL implementation of {@link JobDao}. Uses sequences (via Spring's
*
* @link DataFieldMaxValueIncrementer abstraction) to create all primary keys
* before inserting a new row. Objects are checked to ensure all mandatory
* fields to be stored are not null. If any are found to be null, an
* IllegalArgumentException will be thrown. This could be left to
* JdbcTemplate, however, the exception will be fairly vague, and fails to
* highlight which field caused the exception.
* {@link DataFieldMaxValueIncrementer} abstraction) to create all primary keys
* before inserting a new row. Objects are checked to ensure all mandatory
* fields to be stored are not null. If any are found to be null, an
* IllegalArgumentException will be thrown. This could be left to JdbcTemplate,
* however, the exception will be fairly vague, and fails to highlight which
* field caused the exception.
*
* @author Lucas Ward
* @author Dave Syer
@@ -58,11 +57,11 @@ public class SqlJobDao implements JobDao, InitializingBean {
private String tablePrefix = DEFAULT_TABLE_PREFIX;
// Job SQL statements
private static final String CREATE_JOB = "INSERT into %PREFIX%JOB(ID, JOB_NAME, JOB_STREAM, SCHEDULE_DATE, JOB_RUN)"
+ " values (?, ?, ?, ?, ?)";
private static final String CREATE_JOB = "INSERT into %PREFIX%JOB(ID, JOB_NAME, JOB_KEY, SCHEDULE_DATE)"
+ " values (?, ?, ?, ?)";
private static final String FIND_JOBS = "SELECT ID, STATUS from %PREFIX%JOB where JOB_NAME = ? and "
+ "JOB_STREAM = ? and SCHEDULE_DATE = ? and JOB_RUN = ?";
+ "JOB_KEY = ? and SCHEDULE_DATE = ?";
private static final String UPDATE_JOB = "UPDATE %PREFIX%JOB set STATUS = ? where ID = ?";
@@ -99,12 +98,12 @@ public class SqlJobDao implements JobDao, InitializingBean {
/**
* In this sql implementation a job id is obtained by asking the
* jobIncrementer (which is likely a sequence) for the nextLong, and then
* passing the Id and identifier values (job name, stream, run, schedule
* date) into an INSERT statement.
* passing the Id and identifier values (job name, jobKey, schedule date)
* into an INSERT statement.
*
* @see JobDao#createJob(JobIdentifier)
* @throws IllegalArgumentException
* if any JobRuntimeInformation fields are null.
* if any {@link JobIdentifier} fields are null.
*/
public JobInstance createJob(JobIdentifier jobIdentifier) {
@@ -114,8 +113,7 @@ public class SqlJobDao implements JobDao, InitializingBean {
Long jobId = new Long(jobIncrementer.nextLongValue());
Object[] parameters = new Object[] { jobId, defaultJobId.getName(),
defaultJobId.getJobStream(), defaultJobId.getScheduleDate(),
new Long(defaultJobId.getJobRun()) };
defaultJobId.getJobKey(), defaultJobId.getScheduleDate() };
jdbcTemplate.update(getCreateJobQuery(), parameters);
JobInstance job = new JobInstance(jobIdentifier, jobId);
@@ -128,7 +126,7 @@ public class SqlJobDao implements JobDao, InitializingBean {
*
* @see JobDao#findJobs(JobIdentifier)
* @throws IllegalArgumentException
* if any JobRuntimeInformation fields are null.
* if any {@link JobIdentifier} fields are null.
*/
public List findJobs(final JobIdentifier jobIdentifier) {
@@ -137,8 +135,7 @@ public class SqlJobDao implements JobDao, InitializingBean {
ScheduledJobIdentifier defaultJobId = getScheduledJobIdentifier(jobIdentifier);
Object[] parameters = new Object[] { defaultJobId.getName(),
defaultJobId.getJobStream(), defaultJobId.getScheduleDate(),
new Integer(defaultJobId.getJobRun()) };
defaultJobId.getJobKey(), defaultJobId.getScheduleDate() };
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
@@ -232,10 +229,11 @@ public class SqlJobDao implements JobDao, InitializingBean {
+ " not found.");
}
jdbcTemplate.update(getUpdateJobExecutionQuery(), parameters,
new int[] { Types.TIMESTAMP,
Types.TIMESTAMP, Types.VARCHAR, Types.CHAR,
Types.VARCHAR, Types.VARCHAR, Types.INTEGER });
jdbcTemplate
.update(getUpdateJobExecutionQuery(), parameters,
new int[] { Types.TIMESTAMP, Types.TIMESTAMP,
Types.VARCHAR, Types.CHAR, Types.VARCHAR,
Types.VARCHAR, Types.INTEGER });
}
/**
@@ -340,24 +338,24 @@ public class SqlJobDao implements JobDao, InitializingBean {
"JobExecution status cannot be null.");
}
/*
* Validate JobRuntimeInformation. Due to differing requirements, it is
/**
* Validate {@link JobIdentifier}. Due to differing requirements, it is
* acceptable for any field to be blank, however null fields may cause odd
* and vague exception reports from the database driver.
*/
private void validateJobIdentifier(JobIdentifier jobIdentifier) {
Assert.notNull(jobIdentifier, "JobRuntimeInformation cannot be null.");
Assert.notNull(jobIdentifier, "JobIdentifier cannot be null.");
Assert.notNull(jobIdentifier.getName(),
"JobRuntimeInformation name cannot be null.");
"JobIdentifier name cannot be null.");
if (jobIdentifier instanceof ScheduledJobIdentifier) {
ScheduledJobIdentifier jobRuntimeInformation = (ScheduledJobIdentifier) jobIdentifier;
ScheduledJobIdentifier identifier = (ScheduledJobIdentifier) jobIdentifier;
Assert.notNull(jobRuntimeInformation.getJobStream(),
"JobRuntimeInformation JobStream cannot be null.");
Assert.notNull(jobRuntimeInformation.getScheduleDate(),
"JobRuntimeInformation ScheduleDate cannot be null.");
Assert.notNull(identifier.getJobKey(),
"JobIdentifier JobKey cannot be null.");
Assert.notNull(identifier.getScheduleDate(),
"JobIdentifier ScheduleDate cannot be null.");
}
}

View File

@@ -51,8 +51,7 @@ public class DefaultJobIdentifierLabelGenerator implements
}
if (jobIdentifier instanceof ScheduledJobIdentifier) {
ScheduledJobIdentifier id = (ScheduledJobIdentifier) jobIdentifier;
return jobIdentifier.getName() + "-" + id.getJobStream() + "-"
+ id.getJobRun() + "-"
return jobIdentifier.getName() + "-" + id.getJobKey() + "-"
+ dateFormat.format(id.getScheduleDate());
}
return jobIdentifier.getName();

View File

@@ -0,0 +1,77 @@
/*
* Copyright 2006-2007 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.execution.runtime;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.batch.core.domain.JobIdentifier;
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
/**
* @author Dave Syer
*
*/
public class DefaultJobIdentifier extends SimpleJobIdentifier implements
JobIdentifier {
private String key = "";
/**
* Default constructor package access only.
*/
DefaultJobIdentifier() {
this(null);
}
/**
* @param name the name for the job
*/
public DefaultJobIdentifier(String name) {
super(name);
}
public String getJobKey() {
return key;
}
public void setJobKey(String key) {
this.key = key;
}
/**
* Adds the key data to the base class.
*
* @see org.springframework.batch.core.runtime.SimpleJobIdentifier#toString()
*/
public String toString() {
return super.toString() + ",key=" + key;
}
/**
* Returns true if the provided JobIdentifier equals this JobIdentifier. Two
* Identifiers are considered to be equal if they have the same name,
* stream, run, and schedule date.
*/
public boolean equals(Object other) {
return EqualsBuilder.reflectionEquals(this, other) || EqualsBuilder.reflectionEquals(other, this);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2006-2007 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.execution.runtime;
import org.springframework.batch.core.domain.JobIdentifier;
import org.springframework.batch.core.runtime.JobIdentifierFactory;
/**
* {@link JobIdentifierFactory} for creating {@link DefaultJobIdentifierFactory}
* instances.
*
* @author Dave Syer
*
*/
public class DefaultJobIdentifierFactory implements JobIdentifierFactory {
protected String key = "key";
public JobIdentifier getJobIdentifier(String name) {
DefaultJobIdentifier runtimeInformation = new DefaultJobIdentifier(name);
runtimeInformation.setJobKey(key);
return runtimeInformation;
}
public void setJobKey(String key) {
this.key = key;
}
}

View File

@@ -24,18 +24,13 @@ import java.util.Date;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.batch.core.domain.JobIdentifier;
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
public class ScheduledJobIdentifier extends SimpleJobIdentifier implements JobIdentifier {
public class ScheduledJobIdentifier extends DefaultJobIdentifier implements JobIdentifier {
private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
private Date scheduleDate;
private int jobRun = 0;
private String jobStream = "";
ScheduledJobIdentifier() {
this(null);
}
@@ -49,22 +44,6 @@ public class ScheduledJobIdentifier extends SimpleJobIdentifier implements JobId
}
}
public int getJobRun() {
return jobRun;
}
public void setJobRun(int jobRun) {
this.jobRun = jobRun;
}
public String getJobStream() {
return jobStream;
}
public void setJobStream(String jobStream) {
this.jobStream = jobStream;
}
public Date getScheduleDate() {
return scheduleDate;
}
@@ -74,7 +53,7 @@ public class ScheduledJobIdentifier extends SimpleJobIdentifier implements JobId
}
public String toString() {
return super.toString() + ",stream=" + jobStream + ",run=" + jobRun + ",scheduleDate="
return super.toString() + ",scheduleDate="
+ scheduleDate;
}

View File

@@ -28,29 +28,16 @@ import org.springframework.batch.core.runtime.JobIdentifierFactory;
* @author Dave Syer
*
*/
public class ScheduledJobIdentifierFactory implements JobIdentifierFactory {
private String jobStream = "stream";
private int jobRun = 0;
public class ScheduledJobIdentifierFactory extends DefaultJobIdentifierFactory implements JobIdentifierFactory {
private Date scheduleDate = new Date();
public JobIdentifier getJobIdentifier(String name) {
ScheduledJobIdentifier runtimeInformation = new ScheduledJobIdentifier(name);
runtimeInformation.setJobStream(jobStream);
runtimeInformation.setJobRun(jobRun);
runtimeInformation.setScheduleDate(scheduleDate);
return runtimeInformation;
}
public void setJobRun(int jobRun) {
this.jobRun = jobRun;
}
public void setJobStream(String jobStream) {
this.jobStream = jobStream;
ScheduledJobIdentifier identifier = new ScheduledJobIdentifier(name);
identifier.setJobKey(key);
identifier.setScheduleDate(scheduleDate);
return identifier;
}
public void setScheduleDate(Date scheduleDate) {

View File

@@ -28,11 +28,20 @@
<component name="identifier" access="field"
class="org.springframework.batch.execution.runtime.ScheduledJobIdentifier">
<property name="name" update="false" column="JOB_NAME" />
<property name="jobStream" update="false"
column="JOB_STREAM" />
<property name="jobKey" update="false"
column="JOB_KEY" />
<property name="scheduleDate" update="false"
column="SCHEDULE_DATE" />
<property name="jobRun" update="false" column="JOB_RUN" />
</component>
</subclass>
<subclass entity-name="DefaultJobInstance" name="JobInstance"
discriminator-value="Default">
<component name="identifier" access="field"
class="org.springframework.batch.execution.runtime.ScheduledJobIdentifier">
<property name="name" update="false" column="JOB_NAME" />
<property name="jobKey" update="false"
column="JOB_KEY" />
</component>
</subclass>

View File

@@ -14,9 +14,8 @@ CREATE TABLE BATCH_JOB (
ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -14,9 +14,8 @@ CREATE TABLE BATCH_JOB (
ID BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -14,9 +14,8 @@ CREATE TABLE BATCH_JOB (
ID BIGINT IDENTITY PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -14,9 +14,8 @@ CREATE TABLE BATCH_JOB (
ID NUMBER(38) PRIMARY KEY ,
VERSION NUMBER(38),
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -14,9 +14,8 @@ CREATE TABLE BATCH_JOB (
ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -3,9 +3,8 @@ CREATE TABLE BATCH_JOB (
ID ${BIGINT} $!{IDENTITY} PRIMARY KEY $!{GENERATED},
VERSION ${BIGINT},
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -65,8 +65,7 @@ public abstract class AbstractJobDaoTests extends
protected void onSetUpInTransaction() throws Exception {
jobRuntimeInformation = new ScheduledJobIdentifier("Job1");
jobRuntimeInformation.setName("Job1");
jobRuntimeInformation.setJobStream("TestStream");
jobRuntimeInformation.setJobRun(1);
jobRuntimeInformation.setJobKey("TestStream");
jobRuntimeInformation.setScheduleDate(new SimpleDateFormat("yyyyMMdd")
.parse("20070505"));

View File

@@ -2,12 +2,13 @@ package org.springframework.batch.execution.repository.dao;
import java.util.Collections;
import junit.framework.TestCase;
import org.springframework.batch.core.domain.JobInstance;
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
import org.springframework.batch.execution.runtime.DefaultJobIdentifier;
import org.springframework.batch.execution.runtime.ScheduledJobIdentifier;
import junit.framework.TestCase;
public class EntityNameInterceptorTests extends TestCase {
private EntityNameInterceptor interceptor = new EntityNameInterceptor();
@@ -17,6 +18,11 @@ public class EntityNameInterceptorTests extends TestCase {
assertEquals("ScheduledJobInstance", interceptor.getEntityName(job));
}
public void testGetEntityNameForDefaultJobIdentifier() {
JobInstance job = new JobInstance(new DefaultJobIdentifier("foo"));
assertEquals("DefaultJobInstance", interceptor.getEntityName(job));
}
public void testGetEntityNameForSimpleJobIdentifier() {
JobInstance job = new JobInstance(new SimpleJobIdentifier("foo"));
assertEquals("SimpleJobInstance", interceptor.getEntityName(job));

View File

@@ -94,8 +94,7 @@ public class HibernateJobDaoTests extends AbstractJobDaoTests {
public void testNullScheduleDate(){
ScheduledJobIdentifier scheduledIdentifier = new ScheduledJobIdentifier("ScheduledJob");
scheduledIdentifier.setJobRun(0);
scheduledIdentifier.setJobStream(null);
scheduledIdentifier.setJobKey(null);
try{
jobDao.createJob(scheduledIdentifier);

View File

@@ -69,8 +69,7 @@ public class BatchResourceFactoryBeanTests extends TestCase {
// define mock behaviour
identifier.setScheduleDate(new SimpleDateFormat("yyyyMMdd")
.parse("20070730"));
identifier.setJobStream("testStream");
identifier.setJobRun(11);
identifier.setJobKey("testStream");
SimpleStepContext context = new SimpleStepContext();
JobInstance job = new JobInstance(identifier);
@@ -97,7 +96,7 @@ public class BatchResourceFactoryBeanTests extends TestCase {
* regular use with valid context and pattern provided
*/
public void testCreateFileName() throws Exception {
doTestPathName("testJob-testStream-11-20070730-bar.txt", path);
doTestPathName("testJob-testStream-20070730-bar.txt", path);
}
/**
@@ -130,7 +129,7 @@ public class BatchResourceFactoryBeanTests extends TestCase {
public void testNonStandardFilePattern() throws Exception {
resourceFactory.setFilePattern("/%BATCH_ROOT%/data/%JOB_NAME%/"
+ "%STEP_NAME%+%JOB_IDENTIFIER%");
doTestPathName("bar+testJob-testStream-11-20070730", path);
doTestPathName("bar+testJob-testStream-20070730", path);
}
public void testResoureLoaderAware() throws Exception {
@@ -150,14 +149,14 @@ public class BatchResourceFactoryBeanTests extends TestCase {
String rootDir = getRootDir();
rootDir = StringUtils.replace(rootDir, File.separator, "/") + "/";
resourceFactory.setRootDirectory(rootDir);
doTestPathName("testJob-testStream-11-20070730-bar.txt", path);
doTestPathName("testJob-testStream-20070730-bar.txt", path);
}
public void testRootDirectoryEndsWithBackSlash() throws Exception {
String rootDir = getRootDir();
rootDir = "/"+StringUtils.replace(rootDir, File.separator, "\\") + "\\";
resourceFactory.setRootDirectory(rootDir);
doTestPathName("testJob-testStream-11-20070730-bar.txt", path);
doTestPathName("testJob-testStream-20070730-bar.txt", path);
}
private void doTestPathName(String filename, String path) throws Exception, IOException {

View File

@@ -30,7 +30,7 @@ public class DefaultJobIdentifierLabelGeneratorTests extends TestCase {
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator#getLabel()}.
*/
public void testDefaultGetLabel() throws Exception {
assertEquals("null--0-19700101", instance.getLabel(new ScheduledJobIdentifier(null)));
assertEquals("null--19700101", instance.getLabel(new ScheduledJobIdentifier(null)));
}
/**
@@ -39,10 +39,9 @@ public class DefaultJobIdentifierLabelGeneratorTests extends TestCase {
public void testGetLabelWithAllProperties() throws Exception {
ScheduledJobIdentifier identifier = new ScheduledJobIdentifier(null);
identifier.setName("foo");
identifier.setJobStream("bar");
identifier.setJobRun(11);
identifier.setJobKey("bar");
identifier.setScheduleDate(new SimpleDateFormat("yyyyMMdd").parse("20070730"));
assertEquals("foo-bar-11-20070730", instance.getLabel(identifier));
assertEquals("foo-bar-20070730", instance.getLabel(identifier));
}
}

View File

@@ -0,0 +1,14 @@
package org.springframework.batch.execution.runtime;
import junit.framework.TestCase;
import org.springframework.batch.core.domain.JobIdentifier;
public class DefaultJobIdentifierFactoryTests extends TestCase {
public void testGetJobIdentifier() {
JobIdentifier jobIdentifier = new ScheduledJobIdentifierFactory().getJobIdentifier("foo");
assertEquals("foo", jobIdentifier.getName());
}
}

View File

@@ -0,0 +1,83 @@
/*
* Copyright 2006-2007 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.execution.runtime;
import junit.framework.TestCase;
/**
* @author Dave Syer
*
*/
public class DefaultJobIdentifierTests extends TestCase {
private DefaultJobIdentifier instance = new DefaultJobIdentifier(null);
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getName()}.
*/
public void testDefaultConstructor() {
instance = new DefaultJobIdentifier();
assertEquals(null, instance.getName());
instance.setName("foo");
assertEquals("foo", instance.getName());
}
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getName()}.
*/
public void testGetName() {
assertEquals(null, instance.getName());
instance.setName("foo");
assertEquals("foo", instance.getName());
}
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobKey()}.
*/
public void testGetJobStream() {
assertEquals("", instance.getJobKey());
instance.setJobKey("foo");
assertEquals("foo", instance.getJobKey());
}
public void testEqualsSelf() throws Exception {
assertEquals(instance, instance);
}
public void testEqualsInstanceWithSameProperties() throws Exception {
DefaultJobIdentifier other = new DefaultJobIdentifier(instance.getName());
other.setJobKey(instance.getJobKey());
assertEquals(instance, other);
assertEquals(instance.hashCode(), other.hashCode());
}
public void testEqualsInstanceWithTimestamp() throws Exception {
DefaultJobIdentifier other = new DefaultJobIdentifier(instance.getName());
other.setJobKey(instance.getJobKey());
assertEquals(instance, other);
assertEquals(other, instance);
assertEquals(instance.hashCode(), other.hashCode());
}
public void testEqualsNull() throws Exception {
assertNotSame(null, instance);
}
public void testToString() throws Exception {
assertTrue("String does not contain key: "+instance, instance.toString().indexOf("key=")>=0);
}
}

View File

@@ -0,0 +1,14 @@
package org.springframework.batch.execution.runtime;
import junit.framework.TestCase;
import org.springframework.batch.core.domain.JobIdentifier;
public class ScheduledJobIdentifierFactoryTests extends TestCase {
public void testGetJobIdentifier() {
JobIdentifier jobIdentifier = new DefaultJobIdentifierFactory().getJobIdentifier("foo");
assertEquals("foo", jobIdentifier.getName());
}
}

View File

@@ -28,6 +28,16 @@ public class ScheduledJobIdentifierTests extends TestCase {
private ScheduledJobIdentifier instance = new ScheduledJobIdentifier(null);
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getName()}.
*/
public void testDefaultConstructor() {
instance = new ScheduledJobIdentifier();
assertEquals(null, instance.getName());
instance.setName("foo");
assertEquals("foo", instance.getName());
}
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getName()}.
*/
@@ -38,12 +48,12 @@ public class ScheduledJobIdentifierTests extends TestCase {
}
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobStream()}.
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobKey()}.
*/
public void testGetJobStream() {
assertEquals("", instance.getJobStream());
instance.setJobStream("foo");
assertEquals("foo", instance.getJobStream());
assertEquals("", instance.getJobKey());
instance.setJobKey("foo");
assertEquals("foo", instance.getJobKey());
}
/**
@@ -54,15 +64,6 @@ public class ScheduledJobIdentifierTests extends TestCase {
instance.setScheduleDate(new Date(100L));
assertEquals(100L, instance.getScheduleDate().getTime());
}
/**
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobRun()}.
*/
public void testGetJobRun() {
assertEquals(0, instance.getJobRun());
instance.setJobRun(1);
assertEquals(1, instance.getJobRun());
}
public void testEqualsSelf() throws Exception {
assertEquals(instance, instance);
@@ -70,8 +71,7 @@ public class ScheduledJobIdentifierTests extends TestCase {
public void testEqualsInstanceWithSameProperties() throws Exception {
ScheduledJobIdentifier other = new ScheduledJobIdentifier(instance.getName());
other.setJobRun(instance.getJobRun());
other.setJobStream(instance.getJobStream());
other.setJobKey(instance.getJobKey());
other.setScheduleDate(instance.getScheduleDate());
assertEquals(instance, other);
assertEquals(instance.hashCode(), other.hashCode());
@@ -79,8 +79,7 @@ public class ScheduledJobIdentifierTests extends TestCase {
public void testEqualsInstanceWithTimestamp() throws Exception {
ScheduledJobIdentifier other = new ScheduledJobIdentifier(instance.getName());
other.setJobRun(instance.getJobRun());
other.setJobStream(instance.getJobStream());
other.setJobKey(instance.getJobKey());
other.setScheduleDate(new Timestamp(instance.getScheduleDate().getTime()));
assertEquals(instance, other);
assertEquals(other, instance);
@@ -90,4 +89,9 @@ public class ScheduledJobIdentifierTests extends TestCase {
public void testEqualsNull() throws Exception {
assertNotSame(null, instance);
}
public void testToString() throws Exception {
assertTrue("String does not contain key: "+instance, instance.toString().indexOf("key=")>=0);
assertTrue("String does not contain date: "+instance, instance.toString().indexOf("scheduleDate=")>=0);
}
}

View File

@@ -20,12 +20,10 @@ import java.util.List;
import junit.framework.TestCase;
import org.springframework.batch.execution.scope.StepScope;
import org.springframework.batch.execution.scope.SimpleStepContext;
import org.springframework.batch.execution.scope.StepSynchronizationManager;
import org.springframework.batch.repeat.synch.RepeatSynchronizationManager;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.context.support.StaticApplicationContext;
/**
* @author Dave Syer
@@ -188,5 +186,20 @@ public class StepScopeTests extends TestCase {
scope.remove("foo");
assertFalse(context.hasAttribute("foo"));
}
public void testOrder() throws Exception {
assertEquals(Integer.MAX_VALUE, scope.getOrder());
scope.setOrder(11);
assertEquals(11, scope.getOrder());
}
public void testName() throws Exception {
scope.setName("foo");
StaticApplicationContext beanFactory = new StaticApplicationContext();
scope.postProcessBeanFactory(beanFactory.getDefaultListableBeanFactory());
String[] scopes = beanFactory.getDefaultListableBeanFactory().getRegisteredScopeNames();
assertEquals(1, scopes.length);
assertEquals("foo", scopes[0]);
}
}

View File

@@ -3,9 +3,8 @@ CREATE TABLE BATCH_JOB (
ID BIGINT IDENTITY PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_STREAM VARCHAR(20) ,
JOB_KEY VARCHAR(20) ,
SCHEDULE_DATE DATE ,
JOB_RUN CHAR(2),
STATUS VARCHAR(10) );
CREATE TABLE BATCH_JOB_EXECUTION (

View File

@@ -79,9 +79,8 @@
<bean id="jobRuntimeInformationFactory"
class="org.springframework.batch.execution.runtime.ScheduledJobIdentifierFactory">
<property name="jobStream" value="TestStream" />
<property name="jobKey" value="TestStream" />
<property name="scheduleDate" value="20070505" />
<property name="jobRun" value="1" />
</bean>
<bean

View File

@@ -87,9 +87,8 @@
<bean id="jobRuntimeInformationFactory"
class="org.springframework.batch.execution.runtime.ScheduledJobIdentifierFactory">
<property name="jobStream" value="TestStream" />
<property name="jobKey" value="TestStream" />
<property name="scheduleDate" value="20070505" />
<property name="jobRun" value="1" />
</bean>
<bean id="jdbcTemplate"