@Override
  public Object run(Session session, String dbName, Object... input) {

    if (input.length != 3) {
      throw new IllegalArgumentException("Expected input of length 3");
    }

    if (!(input[0] instanceof Object[])) {
      throw new IllegalArgumentException("Expected input[0] to be an Object array");
    }

    if (!(input[1] instanceof Task)) {
      throw new IllegalArgumentException("Expected input[1] to be a Task");
    }

    if (!(input[2] instanceof TaskManager)) {
      throw new IllegalArgumentException("Expected input[2] to be a TaskManager");
    }

    Object[] args = (Object[]) input[0];

    Task taskToRun = (Task) input[1];

    TaskManager taskMgr = (TaskManager) input[2];

    if (taskToRun == taskMgr.getInsertTask()) {
      return dfltTaskMgr.getMergeForInsertTask().run(session, dbName, args);
    } else if (taskToRun == taskMgr.getUpdateTask()) {
      return dfltTaskMgr.getMergeForUpdateTask().run(session, dbName, args);
    } else {
      return args;
    }
  }
  public SpringDataServiceManager(
      String configurationName,
      HibernateTemplate hibernateTemplate,
      PlatformTransactionManager txMgr) {

    this(
        configurationName,
        hibernateTemplate,
        txMgr,
        DefaultTaskManager.getInstance(),
        Collections.<String, String>emptyMap());
  }
/** @author Simon Toens */
public class PreProcessorRouterTask extends BaseTask implements Task {

  private static final DefaultTaskManager dfltTaskMgr = DefaultTaskManager.getInstance();

  @Override
  public Object run(Session session, String dbName, Object... input) {

    if (input.length != 3) {
      throw new IllegalArgumentException("Expected input of length 3");
    }

    if (!(input[0] instanceof Object[])) {
      throw new IllegalArgumentException("Expected input[0] to be an Object array");
    }

    if (!(input[1] instanceof Task)) {
      throw new IllegalArgumentException("Expected input[1] to be a Task");
    }

    if (!(input[2] instanceof TaskManager)) {
      throw new IllegalArgumentException("Expected input[2] to be a TaskManager");
    }

    Object[] args = (Object[]) input[0];

    Task taskToRun = (Task) input[1];

    TaskManager taskMgr = (TaskManager) input[2];

    if (taskToRun == taskMgr.getInsertTask()) {
      return dfltTaskMgr.getMergeForInsertTask().run(session, dbName, args);
    } else if (taskToRun == taskMgr.getUpdateTask()) {
      return dfltTaskMgr.getMergeForUpdateTask().run(session, dbName, args);
    } else {
      return args;
    }
  }

  @Override
  public String getName() {
    return "Built-in PreProcessor Router Task";
  }
}