Skip to content

Commit

Permalink
RESOLVED - issue BATCH-45: Create a POJO adapter for batch Tasklet
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
dsyer committed Jan 21, 2008
1 parent d5b0b35 commit 678ccc0
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 1 deletion.
@@ -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;
}

}
@@ -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());
}

}
Expand Up @@ -11,7 +11,7 @@
*
* @author Robert Kasanicky
*/
public class DelegatingItemProcessorIntegrationTests extends AbstractDependencyInjectionSpringContextTests {
public class ItemProcessorAdapterIntegrationTests extends AbstractDependencyInjectionSpringContextTests {

private ItemProcessorAdapter processor;

Expand Down

0 comments on commit 678ccc0

Please sign in to comment.