package org.embulk.spi.util; import java.util.List; import com.google.common.collect.ImmutableList; import org.embulk.config.TaskSource; import org.embulk.config.ConfigSource; import org.embulk.plugin.PluginType; import org.embulk.spi.ExecSession; import org.embulk.spi.FileOutput; import org.embulk.spi.EncoderPlugin; public abstract class Encoders { private Encoders() { } public static List<EncoderPlugin> newEncoderPlugins(ExecSession exec, List<ConfigSource> configs) { ImmutableList.Builder<EncoderPlugin> builder = ImmutableList.builder(); for (ConfigSource config : configs) { builder.add(exec.newPlugin(EncoderPlugin.class, config.get(PluginType.class, "type"))); } return builder.build(); } public interface Control { public void run(List<TaskSource> taskSources); } public static void transaction(List<EncoderPlugin> plugins, List<ConfigSource> configs, Encoders.Control control) { new RecursiveControl(plugins, configs, control).transaction(); } public static FileOutput open(List<EncoderPlugin> plugins, List<TaskSource> taskSources, FileOutput output) { FileOutput out = output; int pos = 0; while (pos < plugins.size()) { out = plugins.get(pos).open(taskSources.get(pos), out); pos++; } return out; } private static class RecursiveControl { private final List<EncoderPlugin> plugins; private final List<ConfigSource> configs; private final Encoders.Control finalControl; private final ImmutableList.Builder<TaskSource> taskSources; private int pos; RecursiveControl(List<EncoderPlugin> plugins, List<ConfigSource> configs, Encoders.Control finalControl) { this.plugins = plugins; this.configs = configs; this.finalControl = finalControl; this.taskSources = ImmutableList.builder(); } public void transaction() { if (pos < plugins.size()) { plugins.get(pos).transaction(configs.get(pos), new EncoderPlugin.Control() { public void run(TaskSource taskSource) { taskSources.add(taskSource); pos++; transaction(); } }); } else { finalControl.run(taskSources.build()); } } } }