OPEN - issue BATCH-304: BatchCommandLineLauncher simplified and rename
http://jira.springframework.org/browse/BATCH-304 Nuke JobIdentifier
This commit is contained in:
@@ -19,7 +19,6 @@ package org.springframework.batch.execution.bootstrap.support;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.execution.launch.JobLauncher;
|
||||
|
||||
/**
|
||||
|
||||
@@ -22,7 +22,6 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.core.domain.JobParametersBuilder;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* 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.launch;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.NoSuchJobException;
|
||||
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
|
||||
|
||||
/**
|
||||
* Interface which defines a facade for running jobs. The interface is
|
||||
* intentionally minimal and package private. It is convenient to be able to
|
||||
* test a {@link JobLauncher} with stub implementations of this interface.
|
||||
*
|
||||
* @author Lucas Ward
|
||||
* @author Dave Syer
|
||||
*/
|
||||
interface JobExecutorFacade {
|
||||
|
||||
/**
|
||||
* Prepare a job execution identifiable by the {@link JobIdentifier}. THis
|
||||
* can then be used to run the job with the {@link #start(JobExecution)}
|
||||
* method. Implementations normally require a job to be
|
||||
* locatable corresponding to the {@link JobIdentifier}, matching them at
|
||||
* least by name.
|
||||
*
|
||||
* @param jobIdentifier
|
||||
* the identifier of the job to start
|
||||
*
|
||||
* @throws NoSuchJobException
|
||||
* @throws JobExecutionAlreadyRunningException
|
||||
*/
|
||||
JobExecution createExecutionFrom(JobIdentifier jobIdentifier)
|
||||
throws NoSuchJobException, JobExecutionAlreadyRunningException;
|
||||
|
||||
/**
|
||||
* Start a job execution.
|
||||
*
|
||||
* @param execution
|
||||
* the execution of the job to start
|
||||
* @throws NoSuchJobException
|
||||
*/
|
||||
void start(JobExecution execution) throws NoSuchJobException;
|
||||
|
||||
/**
|
||||
* Stop the job execution that was started with this runtime information.
|
||||
*
|
||||
* @param jobIdentifier
|
||||
* the {@link JobIdentifier}.
|
||||
* @throws NoSuchJobExecutionException
|
||||
* if a job with this runtime information is not running
|
||||
*/
|
||||
void stop(JobExecution execution) throws NoSuchJobExecutionException;
|
||||
|
||||
/**
|
||||
* Simple check for whether or not there are jobs in progress. Can be used
|
||||
* by clients to wait for all jobs to finish. Finer grained monitoring and
|
||||
* reporting can be implemented using the persistent execution details
|
||||
* (normally in a database), provided they are maintained by the
|
||||
* implementation.
|
||||
*
|
||||
* @return true if any jobs are active.
|
||||
*/
|
||||
boolean isRunning();
|
||||
|
||||
}
|
||||
@@ -1,308 +0,0 @@
|
||||
/*
|
||||
* 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.launch;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobLocator;
|
||||
import org.springframework.batch.core.domain.NoSuchJobException;
|
||||
import org.springframework.batch.core.domain.StepExecution;
|
||||
import org.springframework.batch.core.executor.JobExecutor;
|
||||
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.execution.job.DefaultJobExecutor;
|
||||
import org.springframework.batch.repeat.RepeatContext;
|
||||
import org.springframework.batch.statistics.StatisticsProvider;
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Simple implementation of (@link {@link JobExecutorFacade}).
|
||||
*
|
||||
* <p>
|
||||
* A {@link JobIdentifier} will be used to uniquely identify the job by the
|
||||
* repository. Once the job is obtained, the {@link JobExecutor} will be used to
|
||||
* run the job.
|
||||
* </p>
|
||||
*
|
||||
* <p>
|
||||
* Listeners can be registered for callbacks at the start and end of a job.
|
||||
* </p>
|
||||
*
|
||||
* @author Lucas Ward
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
class SimpleJobExecutorFacade implements JobExecutorFacade,
|
||||
JobExecutionListener, StatisticsProvider, InitializingBean {
|
||||
|
||||
private Map jobExecutionRegistry = new HashMap();
|
||||
|
||||
private JobExecutor jobExecutor = new DefaultJobExecutor();
|
||||
|
||||
private JobRepository jobRepository;
|
||||
|
||||
// there is no sensible default for this
|
||||
private JobLocator jobLocator;
|
||||
|
||||
private List listeners = new ArrayList();
|
||||
|
||||
private int running = 0;
|
||||
|
||||
private Object mutex = new Object();
|
||||
|
||||
/**
|
||||
* Public setter for the listeners property.
|
||||
*
|
||||
* @param listeners
|
||||
* the listeners to set - a list of {@link JobExecutionListener}.
|
||||
*/
|
||||
public void setJobExecutionListeners(List listeners) {
|
||||
this.listeners = listeners;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check mandatory properties (jobLocator, jobRepository).
|
||||
*
|
||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
||||
*/
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
Assert.notNull(jobRepository, "JobRepository must be provided.");
|
||||
Assert.notNull(jobLocator,
|
||||
"JobLocator must be provided.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Public accessor for the running property.
|
||||
*
|
||||
* @return the running
|
||||
*/
|
||||
public boolean isRunning() {
|
||||
synchronized (mutex) {
|
||||
return running > 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for injection of {@link JobLocator}.
|
||||
*
|
||||
* @param jobLocator
|
||||
* the jobConfigurationLocator to set
|
||||
*/
|
||||
public void setJobLocator(
|
||||
JobLocator jobLocator) {
|
||||
this.jobLocator = jobLocator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for {@link JobExecutor}.
|
||||
*
|
||||
* @param jobExecutor
|
||||
*/
|
||||
public void setJobExecutor(JobExecutor jobExecutor) {
|
||||
this.jobExecutor = jobExecutor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setter for {@link JobRepository}.
|
||||
*
|
||||
* @param jobRepository
|
||||
*/
|
||||
public void setJobRepository(JobRepository jobRepository) {
|
||||
this.jobRepository = jobRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Locates a {@link Job} by using the name of the provided
|
||||
* {@link JobIdentifier} and the {@link JobLocator}.
|
||||
*
|
||||
* @param jobIdentifier
|
||||
* the identifier of the job that is being prepared.
|
||||
*
|
||||
* @throws IllegalArgumentException
|
||||
* if the {@link JobIdentifier} is null or its name is null
|
||||
* @throws NoSuchJobException
|
||||
* if the {@link JobLocator} does not contain a
|
||||
* {@link Job} with the name provided.
|
||||
*
|
||||
* @see org.springframework.batch.execution.launch.JobExecutorFacade#createExecutionFrom(org.springframework.batch.core.domain.JobIdentifier)
|
||||
*/
|
||||
public JobExecution createExecutionFrom(JobIdentifier jobIdentifier)
|
||||
throws NoSuchJobException, JobExecutionAlreadyRunningException {
|
||||
Assert.notNull(jobIdentifier, "JobIdentifier must not be null.");
|
||||
Assert.notNull(jobIdentifier.getName(),
|
||||
"JobIdentifier name must not be null.");
|
||||
|
||||
if (jobExecutionRegistry.containsKey(jobIdentifier)) {
|
||||
throw new JobExecutionAlreadyRunningException(
|
||||
"A job with this JobIdentifier is already executing in this container: "+jobIdentifier);
|
||||
};
|
||||
|
||||
Job job = jobLocator
|
||||
.getJob(jobIdentifier.getName());
|
||||
|
||||
return jobRepository.createJobExecution(job,
|
||||
null);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a job execution that was previously acquired from the
|
||||
* {@link #createExecutionFrom(JobIdentifier)} method.
|
||||
*
|
||||
* @see org.springframework.batch.execution.launch.JobExecutorFacade#start(JobExecution)
|
||||
*
|
||||
* @throws NoSuchJobException
|
||||
* if the {@link JobLocator} does not contain a
|
||||
* {@link Job} with the name provided by the
|
||||
* enclosed {@link JobIdentifier}.
|
||||
*
|
||||
*/
|
||||
public void start(JobExecution execution)
|
||||
throws NoSuchJobException {
|
||||
|
||||
Job job = jobLocator
|
||||
.getJob(execution.getJobInstance().getJobName());
|
||||
|
||||
this.before(execution);
|
||||
try {
|
||||
jobExecutor.run(job, execution);
|
||||
} finally {
|
||||
this.after(execution);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal accounting for the job execution. Callback at start of job,
|
||||
* dealing with internal housekeeping before delegating to listeners in the
|
||||
* order that they were given.
|
||||
*
|
||||
* @param execution
|
||||
*
|
||||
* @see JobExecutionListener#before(JobExecution)
|
||||
*/
|
||||
public void before(JobExecution execution) {
|
||||
synchronized (mutex) {
|
||||
running++;
|
||||
jobExecutionRegistry.put(execution.getJobInstance(),
|
||||
execution);
|
||||
}
|
||||
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
|
||||
JobExecutionListener listener = (JobExecutionListener) iterator
|
||||
.next();
|
||||
listener.before(execution);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcast stop signal to all the registered listeners.
|
||||
*
|
||||
* @param execution
|
||||
*
|
||||
* @see JobExecutionListener#onStop(JobExecution)
|
||||
*/
|
||||
public void onStop(JobExecution execution) {
|
||||
for (Iterator iterator = listeners.iterator(); iterator.hasNext();) {
|
||||
JobExecutionListener listener = (JobExecutionListener) iterator
|
||||
.next();
|
||||
listener.onStop(execution);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal accounting for the job execution. Callback at end of job
|
||||
* delegating first to listeners, in reverse order to the list supplied, and
|
||||
* then finally dealing with internal housekeeping.
|
||||
*
|
||||
* @param execution
|
||||
*
|
||||
* @see JobExecutionListener#after(JobExecution)
|
||||
*/
|
||||
public void after(JobExecution execution) {
|
||||
ArrayList reversed = new ArrayList(listeners);
|
||||
Collections.reverse(reversed);
|
||||
for (Iterator iterator = reversed.iterator(); iterator.hasNext();) {
|
||||
JobExecutionListener listener = (JobExecutionListener) iterator
|
||||
.next();
|
||||
listener.after(execution);
|
||||
}
|
||||
synchronized (mutex) {
|
||||
// assume execution is synchronous so when we get to here we are
|
||||
// not running any more
|
||||
jobExecutionRegistry.remove(execution.getJobInstance());
|
||||
running--;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a stop signal to the running execution by setting all their
|
||||
* {@link RepeatContext} to terminate only. Then call the
|
||||
* {@link JobExecutionListener#onStop(JobExecution)} method.
|
||||
*
|
||||
* @see org.springframework.batch.container.BatchContainer#onStop(org.springframework.batch.container.common.runtime.JobRuntimeInformation)
|
||||
*/
|
||||
public void stop(JobExecution execution) throws NoSuchJobExecutionException {
|
||||
if (!jobExecutionRegistry.containsValue(execution)) {
|
||||
throw new NoSuchJobExecutionException(
|
||||
"The job is not executing in this executor: [" + execution
|
||||
+ "]");
|
||||
}
|
||||
for (Iterator iter = execution.getStepExecutions().iterator(); iter
|
||||
.hasNext();) {
|
||||
StepExecution context = (StepExecution) iter.next();
|
||||
context.setTerminateOnly();
|
||||
}
|
||||
this.onStop(execution);
|
||||
}
|
||||
|
||||
/**
|
||||
* Provides a snapshot of properties from running jobs (the ones that were
|
||||
* launched from this {@link JobExecutorFacade).
|
||||
*
|
||||
* @return a read-only view of the state of the running jobs.
|
||||
*/
|
||||
public Properties getStatistics() {
|
||||
int i = 0;
|
||||
Properties props = new Properties();
|
||||
for (Iterator iter = jobExecutionRegistry.values().iterator(); iter
|
||||
.hasNext();) {
|
||||
JobExecution element = (JobExecution) iter.next();
|
||||
i++;
|
||||
String runtime = "job" + i;
|
||||
props.setProperty(runtime, "" + element.getJobInstance());
|
||||
int j = 0;
|
||||
for (Iterator iterator = element.getStepExecutions().iterator(); iterator
|
||||
.hasNext();) {
|
||||
StepExecution context = (StepExecution) iterator.next();
|
||||
j++;
|
||||
props.setProperty(runtime + ".step" + j, "" + context);
|
||||
}
|
||||
}
|
||||
return props;
|
||||
}
|
||||
}
|
||||
@@ -23,7 +23,6 @@ import java.util.Properties;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.core.domain.Step;
|
||||
|
||||
@@ -29,7 +29,6 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.springframework.batch.core.domain.BatchStatus;
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.core.repository.NoSuchBatchDomainObjectException;
|
||||
|
||||
@@ -19,7 +19,6 @@ package org.springframework.batch.execution.repository.dao;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.batch.core.domain.JobExecution;
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
/*
|
||||
* 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.resource;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.execution.runtime.ScheduledJobIdentifier;
|
||||
|
||||
/**
|
||||
* {@link JobIdentifierLabelGenerator} that knows about
|
||||
* {@link SimpleJobIdentifier} and {@link ScheduledJobIdentifier} and provides a
|
||||
* fixed format label for each.
|
||||
*
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class DefaultJobIdentifierLabelGenerator implements
|
||||
JobIdentifierLabelGenerator {
|
||||
|
||||
private static final DateFormat dateFormat = new SimpleDateFormat(
|
||||
"yyyyMMdd");
|
||||
|
||||
/**
|
||||
* Concatenate the properties of the {@link JobIdentifier}. From a
|
||||
* {@link SimpleJobIdentifier} we just get the name, and from a
|
||||
* {@link ScheduledJobIdentifier} we get the name, stream, run and schedule
|
||||
* date (yyyyMMdd) joined by hyphens.
|
||||
*
|
||||
* @see org.springframework.batch.execution.resource.JobIdentifierLabelGenerator#getLabel(org.springframework.batch.core.domain.JobIdentifier)
|
||||
*/
|
||||
public String getLabel(JobIdentifier jobIdentifier) {
|
||||
if (jobIdentifier == null) {
|
||||
return null;
|
||||
}
|
||||
if (jobIdentifier instanceof ScheduledJobIdentifier) {
|
||||
ScheduledJobIdentifier id = (ScheduledJobIdentifier) jobIdentifier;
|
||||
return jobIdentifier.getName() + "-" + id.getJobKey() + "-"
|
||||
+ dateFormat.format(id.getScheduleDate());
|
||||
}
|
||||
return jobIdentifier.getName();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* 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.resource;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
|
||||
/**
|
||||
* {@link JobInstanceLabelGenerator} that knows about {@link JobParameters} and
|
||||
* provides a fixed format label for each.
|
||||
*
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class DefaultJobInstanceLabelGenerator implements JobInstanceLabelGenerator {
|
||||
|
||||
private static final DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
||||
|
||||
/**
|
||||
* Concatenate the properties of the {@link JobInstance}. From an instance
|
||||
* with no additional parameters we just get the name, otherwise we get the
|
||||
* parameters joined by hyphens (Strings then Longs then Dates). The date
|
||||
* format is "yyyyMMdd".
|
||||
*
|
||||
* @see org.springframework.batch.execution.resource.JobInstanceLabelGenerator#getLabel(JobInstance)
|
||||
*/
|
||||
public String getLabel(JobInstance jobInstance) {
|
||||
if (jobInstance == null) {
|
||||
return null;
|
||||
}
|
||||
StringBuilder builder = new StringBuilder(""+jobInstance.getJobName());
|
||||
Map map = jobInstance.getJobInstanceProperties().getParameters();
|
||||
for (Iterator iterator = map.values().iterator(); iterator.hasNext();) {
|
||||
Object value = iterator.next();
|
||||
builder.append("-" + ((value instanceof Date) ? dateFormat.format(value) : ""+value));
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package org.springframework.batch.execution.resource;
|
||||
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
|
||||
/**
|
||||
* Strategy for generating a label (e.g. for a file name) from a
|
||||
@@ -26,16 +26,16 @@ import org.springframework.batch.core.domain.JobIdentifier;
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public interface JobIdentifierLabelGenerator {
|
||||
public interface JobInstanceLabelGenerator {
|
||||
|
||||
/**
|
||||
* Create a label from the {@link JobIdentifier}.
|
||||
*
|
||||
* @param jobIdentifier
|
||||
* a {@link JobIdentifier}
|
||||
* @return a short string describing the identifier with no whitespace or
|
||||
* @param jobInstance
|
||||
* a {@link JobInstance}
|
||||
* @return a short string describing the job instance with no whitespace or
|
||||
* special characters. Return null if the identifier is null.
|
||||
*/
|
||||
String getLabel(JobIdentifier jobIdentifier);
|
||||
String getLabel(JobInstance jobInstance);
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
* 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.domain.JobParameters;
|
||||
import org.springframework.batch.core.domain.JobParametersBuilder;
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
* @author Lucas Ward
|
||||
*
|
||||
*/
|
||||
public class DefaultJobIdentifier extends SimpleJobIdentifier implements
|
||||
JobIdentifier {
|
||||
|
||||
public static final String JOB_KEY = "job.key";
|
||||
|
||||
/**
|
||||
* Default constructor package access only.
|
||||
*/
|
||||
DefaultJobIdentifier() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name for the job
|
||||
*/
|
||||
public DefaultJobIdentifier(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name the name for the job
|
||||
*/
|
||||
public DefaultJobIdentifier(String name, String key) {
|
||||
this(name, new JobParametersBuilder().addString(JOB_KEY, key).toJobParameters());
|
||||
}
|
||||
|
||||
public DefaultJobIdentifier(String name, JobParameters parameters){
|
||||
super(name, parameters);
|
||||
}
|
||||
|
||||
public String getJobKey() {
|
||||
return getJobInstanceProperties().getString(JOB_KEY);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
/*
|
||||
* 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 java.util.Date;
|
||||
|
||||
import org.springframework.batch.core.domain.JobIdentifier;
|
||||
import org.springframework.batch.core.domain.JobParametersBuilder;
|
||||
|
||||
/**
|
||||
* Convenient {@link JobIdentifier} implementation that identifies itself by a
|
||||
* {@link Date} as well as an optional String key. The time portion of the
|
||||
* schedule date is significant, and clients are responsible for truncating it
|
||||
* if it represents a date rather than a timestamp.
|
||||
*
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class ScheduledJobIdentifier extends DefaultJobIdentifier implements JobIdentifier {
|
||||
|
||||
public static final String SCHEDULE_DATE = "schedule.date";
|
||||
|
||||
ScheduledJobIdentifier() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
public ScheduledJobIdentifier(String name) {
|
||||
super(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience constructor that leaves the schedule date null.
|
||||
*
|
||||
* @param name the name of the job
|
||||
* @param key a unique key for this execution
|
||||
*/
|
||||
public ScheduledJobIdentifier(String name, String key) {
|
||||
super(name, key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience constructor that leaves the key null.
|
||||
*
|
||||
* @param name the name of the job
|
||||
* @param scheduleDate a timestamp
|
||||
*/
|
||||
public ScheduledJobIdentifier(String name, Date scheduleDate) {
|
||||
super(name, new JobParametersBuilder().addDate(SCHEDULE_DATE, scheduleDate).toJobParameters());
|
||||
}
|
||||
|
||||
/**
|
||||
* Convenience constructor with all properties.
|
||||
*
|
||||
* @param name the name of the job
|
||||
* @param key a unique key for this execution
|
||||
* @param scheduleDate a timestamp
|
||||
*/
|
||||
public ScheduledJobIdentifier(String name, String key, Date scheduleDate) {
|
||||
super(name, new JobParametersBuilder().addString(ScheduledJobIdentifier.JOB_KEY, key).addDate(
|
||||
SCHEDULE_DATE, scheduleDate).toJobParameters());
|
||||
}
|
||||
|
||||
public Date getScheduleDate() {
|
||||
return getJobInstanceProperties().getDate(SCHEDULE_DATE);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
<html>
|
||||
<body>
|
||||
<p>
|
||||
Specific implementations of runtime concerns.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,49 +0,0 @@
|
||||
package org.springframework.batch.execution.resource;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.runtime.SimpleJobIdentifier;
|
||||
import org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator;
|
||||
import org.springframework.batch.execution.runtime.ScheduledJobIdentifier;
|
||||
|
||||
public class DefaultJobIdentifierLabelGeneratorTests extends TestCase {
|
||||
|
||||
DefaultJobIdentifierLabelGenerator instance = new DefaultJobIdentifierLabelGenerator();
|
||||
|
||||
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabelFromNull() {
|
||||
assertEquals(null, instance.getLabel(null));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabel() {
|
||||
assertEquals("foo", instance.getLabel(new SimpleJobIdentifier("foo")));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testDefaultGetLabel() throws Exception {
|
||||
System.out.println(instance.getLabel(new ScheduledJobIdentifier(null, dateFormat.parse("19700101"))));
|
||||
assertEquals("null-null-19700101", instance.getLabel(new ScheduledJobIdentifier(null, dateFormat.parse("19700101"))));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobIdentifierLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabelWithAllProperties() throws Exception {
|
||||
ScheduledJobIdentifier identifier = new ScheduledJobIdentifier("foo", "bar",
|
||||
new SimpleDateFormat("yyyyMMdd").parse("20070730"));
|
||||
assertEquals("foo-bar-20070730", instance.getLabel(identifier));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package org.springframework.batch.execution.resource;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.springframework.batch.core.domain.Job;
|
||||
import org.springframework.batch.core.domain.JobInstance;
|
||||
import org.springframework.batch.core.domain.JobParameters;
|
||||
import org.springframework.batch.core.domain.JobParametersBuilder;
|
||||
|
||||
public class DefaultJobInstanceLabelGeneratorTests extends TestCase {
|
||||
|
||||
DefaultJobInstanceLabelGenerator instance = new DefaultJobInstanceLabelGenerator();
|
||||
|
||||
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobInstanceLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabelFromNull() {
|
||||
assertEquals(null, instance.getLabel(null));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobInstanceLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabel() {
|
||||
assertEquals("foo", instance.getLabel(new JobInstance(null, new JobParameters(), new Job("foo"))));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobInstanceLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testDefaultGetLabel() throws Exception {
|
||||
JobParameters jobParameters = new JobParametersBuilder().addDate("schedule.date", new Date(0)).addString("key", "bar").toJobParameters();
|
||||
JobInstance job = new JobInstance(null, jobParameters, new Job(null));
|
||||
assertEquals("null-bar-19700101", instance.getLabel(job));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.execution.resource.DefaultJobInstanceLabelGenerator#getLabel()}.
|
||||
*/
|
||||
public void testGetLabelWithAllProperties() throws Exception {
|
||||
JobParameters jobParameters = new JobParametersBuilder().addDate("schedule.date", new Date(0)).addString("key", "bar").toJobParameters();
|
||||
JobInstance job = new JobInstance(null, jobParameters, new Job("foo"));
|
||||
assertEquals("foo-bar-19700101", instance.getLabel(job));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* 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#getJobName()}.
|
||||
*/
|
||||
public void testGetName() {
|
||||
DefaultJobIdentifier identifier = new DefaultJobIdentifier("foo");
|
||||
assertEquals("foo", identifier.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobKey()}.
|
||||
*/
|
||||
public void testGetJobStream() {
|
||||
DefaultJobIdentifier identifier = new DefaultJobIdentifier("bar", "foo");
|
||||
assertEquals("foo", identifier.getJobKey());
|
||||
}
|
||||
|
||||
|
||||
public void testEqualsSelf() throws Exception {
|
||||
assertEquals(instance, instance);
|
||||
}
|
||||
|
||||
public void testEqualsInstanceWithSameProperties() throws Exception {
|
||||
|
||||
DefaultJobIdentifier identifier = new DefaultJobIdentifier("foo", "bar");
|
||||
DefaultJobIdentifier other = new DefaultJobIdentifier("foo", "bar");
|
||||
|
||||
assertEquals(identifier, other);
|
||||
assertEquals(identifier.hashCode(), other.hashCode());
|
||||
}
|
||||
|
||||
|
||||
public void testEqualsNull() throws Exception {
|
||||
assertNotSame(null, instance);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
/*
|
||||
* 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 java.util.Date;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
/**
|
||||
* @author Dave Syer
|
||||
*
|
||||
*/
|
||||
public class ScheduledJobIdentifierTests extends TestCase {
|
||||
|
||||
private ScheduledJobIdentifier instance = new ScheduledJobIdentifier(null, "");
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobName()}.
|
||||
*/
|
||||
public void testDefaultConstructor() {
|
||||
assertEquals(null, instance.getName());
|
||||
instance = new ScheduledJobIdentifier("foo", "bar", new Date());
|
||||
assertEquals("foo", instance.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobName()}.
|
||||
*/
|
||||
public void testGetName() {
|
||||
|
||||
assertEquals(null, instance.getName());
|
||||
instance = new ScheduledJobIdentifier("foo");
|
||||
assertEquals("foo", instance.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getJobKey()}.
|
||||
*/
|
||||
public void testGetJobStream() {
|
||||
assertEquals("", instance.getJobKey());
|
||||
instance = new ScheduledJobIdentifier("bar", "foo");
|
||||
assertEquals("foo", instance.getJobKey());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link org.springframework.batch.core.domain.JobInstance#getScheduleDate()}.
|
||||
*/
|
||||
public void testGetScheduleDate() {
|
||||
instance = new ScheduledJobIdentifier("foo", "bar", new Date(100L));
|
||||
assertEquals(100L, instance.getScheduleDate().getTime());
|
||||
}
|
||||
|
||||
public void testEqualsSelf() throws Exception {
|
||||
assertEquals(instance, instance);
|
||||
}
|
||||
|
||||
public void testEqualsInstanceWithSameProperties() throws Exception {
|
||||
instance = new ScheduledJobIdentifier("foo", "bar", new Date(100L));
|
||||
ScheduledJobIdentifier other = new ScheduledJobIdentifier("foo", "bar", new Date(100L));
|
||||
assertEquals(instance, other);
|
||||
assertEquals(instance.hashCode(), other.hashCode());
|
||||
}
|
||||
|
||||
public void testEqualsInstanceWithTimestamp() throws Exception {
|
||||
instance = new ScheduledJobIdentifier("foo", "bar", new Date(100L));
|
||||
ScheduledJobIdentifier other = new ScheduledJobIdentifier("foo", "bar", new Date(100L));
|
||||
assertEquals(instance, other);
|
||||
assertEquals(other, instance);
|
||||
assertEquals(instance.hashCode(), other.hashCode());
|
||||
}
|
||||
|
||||
public void testEqualsNull() throws Exception {
|
||||
assertNotSame(null, instance);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user