RESOLVED - issue BATCH-45: Create a POJO adapter for batch Tasklet

http://jira.springframework.org/browse/BATCH-45

Use the existing method invoking delegator to provide a crude adapter (not trying to pass result back in).
This commit is contained in:
dsyer
2008-01-21 15:29:12 +00:00
parent d5b0b35175
commit 678ccc06d9
3 changed files with 138 additions and 1 deletions

View File

@@ -0,0 +1,65 @@
/*
* 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.tasklet;
import org.springframework.batch.core.tasklet.Tasklet;
import org.springframework.batch.repeat.ExitStatus;
import org.springframework.batch.support.AbstractMethodInvokingDelegator;
/**
* A {@link Tasklet} that wraps a method in a POJO. By default the
* {@link ExitStatus} is determined by comparing the return value from the POJO
* with null. The POJO method is usually going to have no arguments, but a
* static argument or array of arguments can be used by setting the arguments
* property.
*
* @see AbstractMethodInvokingDelegator
*
* @author Dave Syer
*
*/
public class TaskletAdapter extends AbstractMethodInvokingDelegator implements Tasklet {
/**
* Delegate execution to the target object and translate the return value to
* an {@link ExitStatus} by invoking a method in the delegate POJO. N.B. the
* delegate method should not be void, otherwise there is no way to
* determine when the result indicates a finished job.
*
* @see org.springframework.batch.core.tasklet.Tasklet#execute()
*/
public ExitStatus execute() throws Exception {
return mapResult(invokeDelegateMethod());
}
/**
* If the result is an {@link ExitStatus} already just return that,
* otherwise return {@link ExitStatus#FINISHED} if the result is null and
* {@link ExitStatus#CONTINUABLE} if not.
* @param result the value returned by the delegate method
* @return an {@link ExitStatus} consistent with the result
*/
protected ExitStatus mapResult(Object result) {
if (result instanceof ExitStatus) {
return (ExitStatus) result;
}
if (result == null) {
return ExitStatus.FINISHED;
}
return ExitStatus.CONTINUABLE;
}
}

View File

@@ -0,0 +1,72 @@
/*
* 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.tasklet;
import org.springframework.batch.repeat.ExitStatus;
import junit.framework.TestCase;
/**
* @author Dave Syer
*
*/
public class TaskletAdapterTests extends TestCase {
private TaskletAdapter tasklet = new TaskletAdapter();
private Object result = null;
public ExitStatus execute() {
return ExitStatus.NOOP;
}
public Object process() {
return result ;
}
/* (non-Javadoc)
* @see junit.framework.TestCase#setUp()
*/
protected void setUp() throws Exception {
tasklet.setTargetObject(this);
tasklet.setTargetMethod("execute");
}
/**
* Test method for {@link org.springframework.batch.execution.tasklet.TaskletAdapter#execute()}.
* @throws Exception
*/
public void testExecuteWithExitStatus() throws Exception {
assertEquals(ExitStatus.NOOP, tasklet.execute());
}
/**
* Test method for {@link org.springframework.batch.execution.tasklet.TaskletAdapter#mapResult(java.lang.Object)}.
*/
public void testMapResultWithNull() throws Exception {
tasklet.setTargetMethod("process");
assertEquals(ExitStatus.FINISHED, tasklet.execute());
}
/**
* Test method for {@link org.springframework.batch.execution.tasklet.TaskletAdapter#mapResult(java.lang.Object)}.
*/
public void testMapResultWithNonNull() throws Exception {
tasklet.setTargetMethod("process");
this.result = "foo";
assertEquals(ExitStatus.CONTINUABLE, tasklet.execute());
}
}