diff --git a/spring-batch-execution/src/main/java/org/springframework/batch/execution/tasklet/TaskletAdapter.java b/spring-batch-execution/src/main/java/org/springframework/batch/execution/tasklet/TaskletAdapter.java new file mode 100644 index 000000000..0b24f9afa --- /dev/null +++ b/spring-batch-execution/src/main/java/org/springframework/batch/execution/tasklet/TaskletAdapter.java @@ -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; + } + +} diff --git a/spring-batch-execution/src/test/java/org/springframework/batch/execution/tasklet/TaskletAdapterTests.java b/spring-batch-execution/src/test/java/org/springframework/batch/execution/tasklet/TaskletAdapterTests.java new file mode 100644 index 000000000..4248f0f89 --- /dev/null +++ b/spring-batch-execution/src/test/java/org/springframework/batch/execution/tasklet/TaskletAdapterTests.java @@ -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()); + } + +} diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/DelegatingItemProcessorIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/ItemProcessorAdapterIntegrationTests.java similarity index 88% rename from spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/DelegatingItemProcessorIntegrationTests.java rename to spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/ItemProcessorAdapterIntegrationTests.java index c2f5eb4b3..090a52828 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/DelegatingItemProcessorIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/processor/ItemProcessorAdapterIntegrationTests.java @@ -11,7 +11,7 @@ import org.springframework.test.AbstractDependencyInjectionSpringContextTests; * * @author Robert Kasanicky */ -public class DelegatingItemProcessorIntegrationTests extends AbstractDependencyInjectionSpringContextTests { +public class ItemProcessorAdapterIntegrationTests extends AbstractDependencyInjectionSpringContextTests { private ItemProcessorAdapter processor;