All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.hishidama.embulk.tester.EmbulkTestFileInputPlugin Maven / Gradle / Ivy

package com.hishidama.embulk.tester;

import java.nio.charset.StandardCharsets;
import java.util.List;

import org.embulk.config.ConfigDiff;
import org.embulk.config.ConfigSource;
import org.embulk.config.TaskReport;
import org.embulk.config.TaskSource;
import org.embulk.spi.Buffer;
import org.embulk.spi.BufferImpl;
import org.embulk.spi.FileInputPlugin;
import org.embulk.spi.TransactionalFileInput;
import org.embulk.util.config.Config;
import org.embulk.util.config.ConfigMapper;
import org.embulk.util.config.ConfigMapperFactory;
import org.embulk.util.config.Task;
import org.embulk.util.config.TaskMapper;
import org.embulk.util.config.modules.ZoneIdModule;

public class EmbulkTestFileInputPlugin implements FileInputPlugin {

	public static final String TYPE = "EmbulkTestFileInputPlugin";

	protected static final ConfigMapperFactory CONFIG_MAPPER_FACTORY = ConfigMapperFactory.builder().addDefaultModules()
			.addModule(ZoneIdModule.withLegacyNames()).build();

	protected static final ConfigMapper CONFIG_MAPPER = CONFIG_MAPPER_FACTORY.createConfigMapper();
	protected static final TaskMapper TASK_MAPPER = CONFIG_MAPPER_FACTORY.createTaskMapper();

	public interface PluginTask extends Task {
		@Config("textList")
		List getTextList();

		@Config("taskSize")
		int getTaskSize();
	}

	@Override
	public ConfigDiff transaction(ConfigSource config, Control control) {
		PluginTask task = CONFIG_MAPPER.map(config, PluginTask.class);

		int taskCount = task.getTaskSize(); // タスク数(この数だけopenが呼ばれる)
		return resume(task.toTaskSource(), taskCount, control);
	}

	@Override
	public ConfigDiff resume(TaskSource taskSource, int taskCount, Control control) {
		control.run(taskSource, taskCount);
		return CONFIG_MAPPER_FACTORY.newConfigDiff();
	}

	@Override
	public void cleanup(TaskSource taskSource, int taskCount, List successTaskReports) {
	}

	@Override
	public TransactionalFileInput open(TaskSource taskSource, int taskIndex) {
		PluginTask task = TASK_MAPPER.map(taskSource, PluginTask.class);
		int taskSize = task.getTaskSize();
		List textList = task.getTextList();
		int start = taskIndex * textList.size() / taskSize;
		int end = (taskIndex + 1) * textList.size() / taskSize;
		if (taskIndex == taskSize - 1) {
			end = textList.size();
		}
		List list = textList.subList(start, end);

		return new TransactionalFileInput() {
			private boolean eof = false;
			private int index = 0;

			@Override
			public Buffer poll() {
				if (index < list.size()) {
					String s = list.get(index++) + "\n";
					return BufferImpl.copyOf(s.getBytes(StandardCharsets.UTF_8));
				}

				eof = true;
				return null;
			}

			@Override
			public boolean nextFile() {
				return !eof;
			}

			@Override
			public void close() {
			}

			@Override
			public void abort() {
			}

			@Override
			public TaskReport commit() {
				return CONFIG_MAPPER_FACTORY.newTaskReport();
			}
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy