package org.embulk.plugin.compat;
import java.util.List;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;
import com.google.common.base.Throwables;
import org.embulk.config.CommitReport;
import org.embulk.config.TaskReport;
import org.embulk.spi.PageOutput;
import org.embulk.spi.Schema;
import org.embulk.spi.InputPlugin;
import org.embulk.config.ConfigSource;
import org.embulk.config.ConfigDiff;
import org.embulk.config.TaskSource;
public class InputPluginWrapper
implements InputPlugin
{
public static InputPlugin wrapIfNecessary(InputPlugin object)
{
Method runMethod = wrapRunMethod(object);
if (runMethod != null) {
return new InputPluginWrapper(object, runMethod);
}
return object;
}
private static Method wrapRunMethod(InputPlugin object)
{
try {
Method m = object.getClass().getMethod("run", TaskSource.class, Schema.class, int.class, PageOutput.class);
if (m.getReturnType().equals(CommitReport.class)) {
return m;
} else {
return null;
}
}
catch (NoSuchMethodException ex) {
return null;
}
}
private final InputPlugin object;
private final Method runMethod;
private InputPluginWrapper(InputPlugin object,
Method runMethod)
{
this.object = object;
this.runMethod = runMethod;
}
@Override
public ConfigDiff transaction(ConfigSource config,
InputPlugin.Control control)
{
return object.transaction(config, control);
}
@Override
public ConfigDiff resume(TaskSource taskSource,
Schema schema, int taskCount,
InputPlugin.Control control)
{
return object.resume(taskSource, schema, taskCount, control);
}
@Override
public void cleanup(TaskSource taskSource,
Schema schema, int taskCount,
List<TaskReport> successTaskReports)
{
object.cleanup(taskSource, schema, taskCount, successTaskReports);
}
@Override
public TaskReport run(TaskSource taskSource,
Schema schema, int taskIndex,
PageOutput output)
{
if (runMethod != null) {
try {
return (TaskReport) runMethod.invoke(object, taskSource, schema, taskIndex, output);
}
catch (IllegalAccessException | IllegalArgumentException ex) {
throw Throwables.propagate(ex);
}
catch (InvocationTargetException ex) {
throw Throwables.propagate(ex.getCause());
}
} else {
return object.run(taskSource, schema, taskIndex, output);
}
}
@Override
public ConfigDiff guess(ConfigSource config)
{
return object.guess(config);
}
}