package org.embulk.plugin.compat; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; import com.google.common.base.Throwables; import org.embulk.config.TaskReport; import org.embulk.config.CommitReport; import org.embulk.spi.Buffer; import org.embulk.spi.TransactionalFileInput; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TransactionalFileInputWrapper implements TransactionalFileInput { private final Logger logger = LoggerFactory.getLogger(PluginWrappers.class); public static TransactionalFileInput wrapIfNecessary(TransactionalFileInput object) { Method runMethod = wrapCommitMethod(object); if (runMethod != null) { return new TransactionalFileInputWrapper(object, runMethod); } return object; } private static Method wrapCommitMethod(TransactionalFileInput object) { try { Method m = object.getClass().getMethod("commit"); if (m.getReturnType().equals(CommitReport.class)) { return m; } else { return null; } } catch (NoSuchMethodException ex) { return null; } } private final TransactionalFileInput object; private final Method commitMethod; private TransactionalFileInputWrapper(TransactionalFileInput object, Method commitMethod) { this.object = object; this.commitMethod = commitMethod; logger.warn("A file input plugin is compiled with old Embulk plugin API. Please update the plugin version using \"embulk gem install\" command, or contact a developer of the plugin to upgrade the plugin code using \"embulk migrate\" command: {}", object.getClass()); } @Override public Buffer poll() { return object.poll(); } @Override public boolean nextFile() { return object.nextFile(); } @Override public void close() { object.close(); } @Override public void abort() { object.abort(); } @Override public TaskReport commit() { if (commitMethod != null) { try { return (TaskReport) commitMethod.invoke(object); } catch (IllegalAccessException | IllegalArgumentException ex) { throw Throwables.propagate(ex); } catch (InvocationTargetException ex) { throw Throwables.propagate(ex.getCause()); } } else { return object.commit(); } } }