package org.embulk.test; import com.google.common.base.Function; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.inject.Binder; import com.google.inject.Inject; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.util.Modules; import java.util.List; import org.embulk.config.ConfigSource; import org.embulk.config.TaskReport; import org.embulk.exec.BulkLoader; import org.embulk.exec.ExecutionResult; import org.embulk.exec.ForSystemConfig; import org.embulk.exec.ResumeState; import org.embulk.spi.Exec; import org.embulk.spi.ExecSession; import org.embulk.spi.InputPlugin; import org.embulk.spi.Schema; import org.slf4j.Logger; import static org.embulk.plugin.InjectedPluginSource.registerPluginTo; class TestingBulkLoader extends BulkLoader { static Function<List<Module>, List<Module>> override() { return new Function<List<Module>, List<Module>>() { @Override public List<Module> apply(List<Module> modules) { Module override = new Module() { public void configure(Binder binder) { binder.bind(BulkLoader.class).to(TestingBulkLoader.class); registerPluginTo(binder, InputPlugin.class, "preview_result", PreviewResultInputPlugin.class); } }; return ImmutableList.of(Modules.override(modules).with(ImmutableList.of(override))); } }; } @Inject public TestingBulkLoader(Injector injector, @ForSystemConfig ConfigSource systemConfig) { super(injector, systemConfig); } @Override protected LoaderState newLoaderState(Logger logger, ProcessPluginSet plugins) { return new TestingLoaderState(logger, plugins); } protected static class TestingLoaderState extends LoaderState { public TestingLoaderState(Logger logger, ProcessPluginSet plugins) { super(logger, plugins); } @Override public ExecutionResult buildExecuteResultWithWarningException(Throwable ex) { ExecutionResult result = super.buildExecuteResultWithWarningException(ex); return new TestingExecutionResult(result, buildResumeState(Exec.session()), Exec.session()); } } static class TestingExecutionResult extends ExecutionResult implements TestingEmbulk.RunResult { private final Schema inputSchema; private final Schema outputSchema; private final List<TaskReport> inputTaskReports; private final List<TaskReport> outputTaskReports; public TestingExecutionResult(ExecutionResult orig, ResumeState resumeState, ExecSession session) { super(orig.getConfigDiff(), orig.isSkipped(), orig.getIgnoredExceptions()); this.inputSchema = resumeState.getInputSchema(); this.outputSchema = resumeState.getOutputSchema(); this.inputTaskReports = buildReports(resumeState.getInputTaskReports(), session); this.outputTaskReports = buildReports(resumeState.getOutputTaskReports(), session); } private static List<TaskReport> buildReports(List<Optional<TaskReport>> optionalReports, ExecSession session) { ImmutableList.Builder<TaskReport> reports = ImmutableList.builder(); for (Optional<TaskReport> report : optionalReports) { reports.add(report.or(session.newTaskReport())); } return reports.build(); } @Override public Schema getInputSchema() { return inputSchema; } @Override public Schema getOutputSchema() { return outputSchema; } @Override public List<TaskReport> getInputTaskReports() { return inputTaskReports; } @Override public List<TaskReport> getOutputTaskReports() { return outputTaskReports; } } }