OPEN - issue BATCH-773: Refactor and extend ExportedJobLauncher to JobOperator

Add new interfaces and exceptions.  Re-align JobInstanceDao.
This commit is contained in:
dsyer
2008-08-08 14:04:55 +00:00
parent fca856dc7b
commit 61ccafa25c
17 changed files with 377 additions and 134 deletions

View File

@@ -0,0 +1,57 @@
/*
* 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.core.launch;
import java.util.Collection;
import java.util.Map;
import org.springframework.batch.core.repository.JobInstanceAlreadyExistsException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.batch.core.repository.NoSuchJobException;
import org.springframework.batch.core.repository.NoSuchJobExecutionException;
import org.springframework.batch.core.repository.NoSuchJobInstanceException;
/**
* A really low level interface for inspecting and controlling jobs with access
* only to primitive and collection types. Suitable for a command-line client
* (e.g. that launches a new process for each operation), or a remote launcher
* like a JMX console.
*
* @author Dave Syer
*
*/
public interface JobOperator {
String getParameters(Long instanceId) throws NoSuchJobInstanceException;
Long getLastInstance(String jobName) throws NoSuchJobException;
Long start(String jobName, String parameters) throws NoSuchJobException, JobInstanceAlreadyExistsException,
JobRestartException;
Long resume(Long instanceId) throws LastExecutionNotFailedException, NoSuchJobInstanceException;
Long startNextInstance(String jobName) throws NoSuchJobException, JobParametersIncrementerNotFoundException;
boolean stop(Long executionId) throws NoSuchJobExecutionException;
Map<Long, String> status(Long executionId) throws NoSuchJobExecutionException;
Collection<Long> getRunningExecutions(String jobName) throws NoSuchJobException;
Collection<String> getJobNames();
}

View File

@@ -0,0 +1,30 @@
/*
* 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.core.launch;
import org.springframework.batch.core.JobParameters;
/**
* Interface for obtaining the next {@link JobParameters} in a sequence.
*
* @author Dave Syer
*
*/
public interface JobParametersIncrementer {
JobParameters getNext(JobParameters parameters);
}

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.core.launch;
import org.springframework.batch.core.JobExecutionException;
/**
* Checked exception to indicate that a required {@link JobParametersIncrementer} is not
* available.
*
* @author Dave Syer
*
*/
public class JobParametersIncrementerNotFoundException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public JobParametersIncrementerNotFoundException(String msg) {
super(msg);
}
/**
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public JobParametersIncrementerNotFoundException(String msg, Throwable e) {
super(msg, e);
}
}

View File

@@ -0,0 +1,43 @@
/*
* 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.core.launch;
import org.springframework.batch.core.JobExecutionException;
/**
* Checked exception to indicate that user asked for a job execution to be
* resumed when actually it didn't fail.
*
* @author Dave Syer
*
*/
public class LastExecutionNotFailedException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public LastExecutionNotFailedException(String msg) {
super(msg);
}
/**
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public LastExecutionNotFailedException(String msg, Throwable e) {
super(msg, e);
}
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.repository;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecutionException;
/**
* Checked exception to indicate that a required {@link Job} is not
* available.
*
* @author Dave Syer
*
*/
public class JobInstanceAlreadyExistsException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public JobInstanceAlreadyExistsException(String msg) {
super(msg);
}
/**
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public JobInstanceAlreadyExistsException(String msg, Throwable e) {
super(msg, e);
}
}

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.core.repository;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionException;
/**
* Checked exception to indicate that a required {@link JobExecution} is not
* available.
*
* @author Dave Syer
*
*/
public class NoSuchJobExecutionException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public NoSuchJobExecutionException(String msg) {
super(msg);
}
/**
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public NoSuchJobExecutionException(String msg, Throwable e) {
super(msg, e);
}
}

View File

@@ -0,0 +1,45 @@
/*
* 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.core.repository;
import org.springframework.batch.core.JobExecutionException;
import org.springframework.batch.core.JobInstance;
/**
* Exception that signals that the user requested an operation on a non-existent
* {@link JobInstance}.
*
* @author Dave Syer
*
*/
public class NoSuchJobInstanceException extends JobExecutionException {
/**
* Create an exception with the given message.
*/
public NoSuchJobInstanceException(String msg) {
super(msg);
}
/**
* @param msg The message to send to caller
* @param e the cause of the exception
*/
public NoSuchJobInstanceException(String msg, Throwable e) {
super(msg, e);
}
}

View File

@@ -8,7 +8,6 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameter;
import org.springframework.batch.core.JobParameters;
@@ -51,24 +50,23 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
* jobIncrementer (which is likely a sequence) for the nextLong, and then
* passing the Id and parameter values into an INSERT statement.
*
* @see JobInstanceDao#createJobInstance(Job, JobParameters)
* @see JobInstanceDao#createJobInstance(String, JobParameters)
* @throws IllegalArgumentException if any {@link JobParameters} fields are
* null.
*/
public JobInstance createJobInstance(Job job, JobParameters jobParameters) {
public JobInstance createJobInstance(String jobName, JobParameters jobParameters) {
Assert.notNull(job, "Job must not be null.");
Assert.hasLength(job.getName(), "Job must have a name");
Assert.notNull(jobName, "Job name must not be null.");
Assert.notNull(jobParameters, "JobParameters must not be null.");
Assert.state(getJobInstance(job, jobParameters) == null, "JobInstance must not already exist");
Assert.state(getJobInstance(jobName, jobParameters) == null, "JobInstance must not already exist");
Long jobId = new Long(jobIncrementer.nextLongValue());
JobInstance jobInstance = new JobInstance(jobId, jobParameters, job.getName());
JobInstance jobInstance = new JobInstance(jobId, jobParameters, jobName);
jobInstance.incrementVersion();
Object[] parameters = new Object[] { jobId, job.getName(), createJobKey(jobParameters),
Object[] parameters = new Object[] { jobId, jobName, createJobKey(jobParameters),
jobInstance.getVersion() };
getJdbcTemplate().update(getQuery(CREATE_JOB_INSTANCE), parameters,
new int[] { Types.INTEGER, Types.VARCHAR, Types.VARCHAR, Types.INTEGER });
@@ -132,24 +130,23 @@ public class JdbcJobInstanceDao extends AbstractJdbcBatchMetadataDao implements
* The job table is queried for <strong>any</strong> jobs that match the
* given identifier, adding them to a list via the RowMapper callback.
*
* @see JobInstanceDao#getJobInstance(Job, JobParameters)
* @see JobInstanceDao#getJobInstance(String, JobParameters)
* @throws IllegalArgumentException if any {@link JobParameters} fields are
* null.
*/
@SuppressWarnings("unchecked")
public JobInstance getJobInstance(final Job job, final JobParameters jobParameters) {
public JobInstance getJobInstance(final String jobName, final JobParameters jobParameters) {
Assert.notNull(job, "Job must not be null.");
Assert.hasLength(job.getName(), "Job must have a name");
Assert.notNull(jobName, "Job name must not be null.");
Assert.notNull(jobParameters, "JobParameters must not be null.");
String jobKey = createJobKey(jobParameters);
Object[] parameters = new Object[] { job.getName(), jobKey };
Object[] parameters = new Object[] { jobName, jobKey };
RowMapper rowMapper = new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
JobInstance jobInstance = new JobInstance(new Long(rs.getLong(1)), jobParameters, job.getName());
JobInstance jobInstance = new JobInstance(new Long(rs.getLong(1)), jobParameters, jobName);
return jobInstance;
}
};

View File

@@ -21,22 +21,22 @@ public interface JobInstanceDao {
* PostConditions: A valid job instance will be returned which has been persisted and
* contains an unique Id.
*
* @param job
* @param jobName
* @param jobParameters
* @return JobInstance
*/
JobInstance createJobInstance(Job job, JobParameters jobParameters);
JobInstance createJobInstance(String jobName, JobParameters jobParameters);
/**
* Find all job instances that match the given name and parameters. If no
* matching job instances are found, then a list of size 0 will be
* returned.
*
* @param job
* @param jobName
* @param jobParameters
* @return {@link JobInstance} object matching
* {@link Job} and {@link JobParameters}
*/
JobInstance getJobInstance(Job job, JobParameters jobParameters);
JobInstance getJobInstance(String jobName, JobParameters jobParameters);
}

View File

@@ -2,7 +2,6 @@ package org.springframework.batch.core.repository.dao;
import java.util.Collection;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.support.transaction.TransactionAwareProxyFactory;
@@ -21,21 +20,21 @@ public class MapJobInstanceDao implements JobInstanceDao {
jobInstances.clear();
}
public JobInstance createJobInstance(Job job, JobParameters jobParameters) {
public JobInstance createJobInstance(String jobName, JobParameters jobParameters) {
Assert.state(getJobInstance(job, jobParameters) == null, "JobInstance must not already exist");
Assert.state(getJobInstance(jobName, jobParameters) == null, "JobInstance must not already exist");
JobInstance jobInstance = new JobInstance(new Long(currentId++), jobParameters, job.getName());
JobInstance jobInstance = new JobInstance(new Long(currentId++), jobParameters, jobName);
jobInstance.incrementVersion();
jobInstances.add(jobInstance);
return jobInstance;
}
public JobInstance getJobInstance(Job job, JobParameters jobParameters) {
public JobInstance getJobInstance(String jobName, JobParameters jobParameters) {
for (JobInstance instance : jobInstances) {
if (instance.getJobName().equals(job.getName()) && instance.getJobParameters().equals(jobParameters)) {
if (instance.getJobName().equals(jobName) && instance.getJobParameters().equals(jobParameters)) {
return instance;
}
}

View File

@@ -154,7 +154,7 @@ public class SimpleJobRepository implements JobRepository {
* has finished.
*/
JobInstance jobInstance = jobInstanceDao.getJobInstance(job, jobParameters);
JobInstance jobInstance = jobInstanceDao.getJobInstance(job.getName(), jobParameters);
ExecutionContext executionContext;
// existing job instance found
@@ -181,7 +181,7 @@ public class SimpleJobRepository implements JobRepository {
}
else {
// no job found, create one
jobInstance = jobInstanceDao.createJobInstance(job, jobParameters);
jobInstance = jobInstanceDao.createJobInstance(job.getName(), jobParameters);
executionContext = new ExecutionContext();
}

View File

@@ -445,7 +445,7 @@ public class SimpleJobTests extends TestCase {
* Check JobRepository to ensure status is being saved.
*/
private void checkRepository(BatchStatus status, ExitStatus exitStatus) {
assertEquals(jobInstance, jobInstanceDao.getJobInstance(job, jobParameters));
assertEquals(jobInstance, jobInstanceDao.getJobInstance(job.getName(), jobParameters));
// because map dao stores in memory, it can be checked directly
JobExecution jobExecution = (JobExecution) jobExecutionDao.findJobExecutions(jobInstance).get(0);
assertEquals(jobInstance.getId(), jobExecution.getJobId());

View File

@@ -16,27 +16,29 @@
package org.springframework.batch.core.repository.dao;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.job.JobSupport;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.junit.Before;
import org.junit.Test;
import javax.sql.DataSource;
/**
* @author Dave Syer
@@ -53,7 +55,7 @@ public abstract class AbstractJobDaoTests {
protected JobInstance jobInstance;
protected Job job;
protected String jobName = "Job1";
protected JobExecution jobExecution;
@@ -83,10 +85,8 @@ public abstract class AbstractJobDaoTests {
@Before
public void onSetUpInTransaction() throws Exception {
job = new JobSupport("Job1");
// Create job.
jobInstance = jobInstanceDao.createJobInstance(job, jobParameters);
jobInstance = jobInstanceDao.createJobInstance(jobName, jobParameters);
// Create an execution
jobExecutionStartTime = new Date(System.currentTimeMillis());
@@ -113,14 +113,14 @@ public abstract class AbstractJobDaoTests {
@Transactional @Test
public void testFindNonExistentJob() {
// No job should be found since it hasn't been created.
JobInstance jobInstance = jobInstanceDao.getJobInstance(new JobSupport("nonexistentJob"), jobParameters);
JobInstance jobInstance = jobInstanceDao.getJobInstance("nonexistentJob", jobParameters);
assertNull(jobInstance);
}
@Transactional @Test
public void testFindJob() {
JobInstance instance = jobInstanceDao.getJobInstance(job, jobParameters);
JobInstance instance = jobInstanceDao.getJobInstance(jobName, jobParameters);
assertNotNull(instance);
assertTrue(jobInstance.equals(instance));
assertEquals(jobParameters, instance.getJobParameters());
@@ -146,7 +146,7 @@ public abstract class AbstractJobDaoTests {
@Transactional @Test
public void testCreateJobWithExistingName() {
Job scheduledJob = new JobSupport("ScheduledJob");
String scheduledJob = "ScheduledJob";
jobInstanceDao.createJobInstance(scheduledJob, jobParameters);
// Modifying the key should bring back a completely different
@@ -216,7 +216,7 @@ public abstract class AbstractJobDaoTests {
@Transactional @Test
public void testJobWithSimpleJobIdentifier() throws Exception {
Job testJob = new JobSupport("test");
String testJob = "test";
// Create job.
jobInstance = jobInstanceDao.createJobInstance(testJob, jobParameters);
@@ -231,7 +231,7 @@ public abstract class AbstractJobDaoTests {
@Transactional @Test
public void testJobWithDefaultJobIdentifier() throws Exception {
Job testDefaultJob = new JobSupport("testDefault");
String testDefaultJob = "testDefault";
// Create job.
jobInstance = jobInstanceDao.createJobInstance(testDefaultJob, jobParameters);
@@ -286,10 +286,10 @@ public abstract class AbstractJobDaoTests {
jobParameters = new JobParameters();
jobInstanceDao.createJobInstance(job, jobParameters);
jobInstanceDao.createJobInstance(jobName, jobParameters);
try {
jobInstanceDao.createJobInstance(job, jobParameters);
jobInstanceDao.createJobInstance(jobName, jobParameters);
fail();
}
catch (IllegalStateException e) {
@@ -300,7 +300,7 @@ public abstract class AbstractJobDaoTests {
@Transactional @Test
public void testCreationAddsVersion() {
jobInstance = jobInstanceDao.createJobInstance(new JobSupport("testCreationAddsVersion"), new JobParameters());
jobInstance = jobInstanceDao.createJobInstance("testCreationAddsVersion", new JobParameters());
assertNotNull(jobInstance.getVersion());
}

View File

@@ -1,16 +1,17 @@
package org.springframework.batch.core.repository.dao;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.Date;
import org.springframework.batch.core.Job;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.core.JobInstance;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.job.JobSupport;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import org.springframework.transaction.annotation.Transactional;
@@ -20,7 +21,7 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ
private JobInstanceDao dao = new MapJobInstanceDao();
private Job fooJob = new JobSupport("foo");
private String fooJob = "foo";
private JobParameters fooParams = new JobParametersBuilder().addString("stringKey", "stringValue").addLong(
"longKey", Long.MAX_VALUE).addDouble("doubleKey", Double.MAX_VALUE).addDate(
@@ -41,13 +42,13 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ
JobInstance fooInstance = dao.createJobInstance(fooJob, fooParams);
assertNotNull(fooInstance.getId());
assertEquals(fooJob.getName(), fooInstance.getJobName());
assertEquals(fooJob, fooInstance.getJobName());
assertEquals(fooParams, fooInstance.getJobParameters());
JobInstance retrievedInstance = dao.getJobInstance(fooJob, fooParams);
JobParameters retrievedParams = retrievedInstance.getJobParameters();
assertEquals(fooInstance, retrievedInstance);
assertEquals(fooJob.getName(), retrievedInstance.getJobName());
assertEquals(fooJob, retrievedInstance.getJobName());
assertEquals(fooParams, retrievedParams);
assertEquals(Long.MAX_VALUE, retrievedParams.getLong("longKey"));
@@ -80,7 +81,7 @@ public abstract class AbstractJobInstanceDaoTests extends AbstractTransactionalJ
assertNull(jobInstance.getVersion());
jobInstance = dao.createJobInstance(new JobSupport("testVersion"), new JobParameters());
jobInstance = dao.createJobInstance("testVersion", new JobParameters());
assertNotNull(jobInstance.getVersion());
}

View File

@@ -38,7 +38,7 @@ public class OrderTransformer implements ItemTransformer<Order, List<String>> {
/**
* Aggregators for all types of lines in the output file
*/
private Map<String, LineAggregator<String[]>> aggregators;
private Map<String, LineAggregator<Object[]>> aggregators;
/**
* Converts information from an Order object to a collection of Strings for
@@ -64,11 +64,11 @@ public class OrderTransformer implements ItemTransformer<Order, List<String>> {
return result;
}
public void setAggregators(Map<String, LineAggregator<String[]>> aggregators) {
public void setAggregators(Map<String, LineAggregator<Object[]>> aggregators) {
this.aggregators = aggregators;
}
private LineAggregator<String[]> getAggregator(String name) {
private LineAggregator<Object[]> getAggregator(String name) {
return aggregators.get(name);
}
@@ -80,36 +80,36 @@ public class OrderTransformer implements ItemTransformer<Order, List<String>> {
private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
static String[] headerArgs(Order order) {
return new String[] { "BEGIN_ORDER:", String.valueOf(order.getOrderId()),
static Object[] headerArgs(Order order) {
return new Object[] { "BEGIN_ORDER:", String.valueOf(order.getOrderId()),
dateFormat.format(order.getOrderDate()) };
}
static String[] footerArgs(Order order) {
return new String[] { "END_ORDER:", order.getTotalPrice().toString() };
static Object[] footerArgs(Order order) {
return new Object[] { "END_ORDER:", order.getTotalPrice().toString() };
}
static String[] customerArgs(Order order) {
static Object[] customerArgs(Order order) {
Customer customer = order.getCustomer();
return new String[] { "CUSTOMER:", String.valueOf(customer.getRegistrationId()), customer.getFirstName(),
return new Object[] { "CUSTOMER:", String.valueOf(customer.getRegistrationId()), customer.getFirstName(),
customer.getMiddleName(), customer.getLastName() };
}
static String[] lineItemArgs(LineItem item) {
return new String[] { "ITEM:", String.valueOf(item.getItemId()), item.getPrice().toString() };
static Object[] lineItemArgs(LineItem item) {
return new Object[] { "ITEM:", String.valueOf(item.getItemId()), item.getPrice().toString() };
}
static String[] billingAddressArgs(Order order) {
static Object[] billingAddressArgs(Order order) {
Address address = order.getBillingAddress();
return new String[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() };
return new Object[] { "ADDRESS:", address.getAddrLine1(), address.getCity(), address.getZipCode() };
}
static String[] billingInfoArgs(Order order) {
static Object[] billingInfoArgs(Order order) {
BillingInfo billingInfo = order.getBilling();
return new String[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() };
return new Object[] { "BILLING:", billingInfo.getPaymentId(), billingInfo.getPaymentDesc() };
}
}

View File

@@ -50,10 +50,10 @@ public class FlatFileOrderAggregatorTests {
order.setTotalPrice(BigDecimal.valueOf(0));
// create aggregator stub
LineAggregator<String[]> aggregator = new DelimitedLineAggregator<String>();
LineAggregator<Object[]> aggregator = new DelimitedLineAggregator<Object>();
// create map of aggregators and set it to writer
Map<String, LineAggregator<String[]>> aggregators = new HashMap<String, LineAggregator<String[]>>();
Map<String, LineAggregator<Object[]>> aggregators = new HashMap<String, LineAggregator<Object[]>>();
OrderTransformer converter = new OrderTransformer();
aggregators.put("header", aggregator);

View File

@@ -1,62 +0,0 @@
/*
* Copyright 2006-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.sample.domain.order;
import static org.junit.Assert.assertTrue;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import org.junit.Test;
import org.springframework.batch.item.file.transform.LineAggregator;
import org.springframework.batch.item.file.transform.PassThroughLineAggregator;
import org.springframework.batch.sample.domain.order.internal.OrderTransformer;
/**
* @author Dave Syer
*
*/
public class OrderTransformerTests {
private OrderTransformer converter = new OrderTransformer();
@Test
public void testConvert() throws Exception {
converter.setAggregators(new HashMap<String, LineAggregator<String[]>>() {
{
put("header", new PassThroughLineAggregator<String[]>());
put("customer", new PassThroughLineAggregator<String[]>());
put("address", new PassThroughLineAggregator<String[]>());
put("billing", new PassThroughLineAggregator<String[]>());
put("item", new PassThroughLineAggregator<String[]>());
put("footer", new PassThroughLineAggregator<String[]>());
}
});
Order order = new Order();
order.setOrderDate(new Date());
order.setCustomer(new Customer());
order.setBillingAddress(new Address());
order.setBilling(new BillingInfo());
order.setLineItems(new ArrayList<LineItem>());
order.setTotalPrice(new BigDecimal(10));
Object result = converter.transform(order);
assertTrue(result instanceof Collection);
}
}