package ${javaPackageName};

import java.util.List;

import com.google.common.base.Optional;

import org.embulk.config.Config; import org.embulk.config.ConfigDefault; import org.embulk.config.ConfigDiff; import org.embulk.config.ConfigSource; import org.embulk.config.Task; import org.embulk.config.TaskReport; import org.embulk.config.TaskSource; import org.embulk.spi.Exec; import org.embulk.spi.InputPlugin; import org.embulk.spi.PageOutput; import org.embulk.spi.Schema; import org.embulk.spi.SchemaConfig;

public class ${javaClassName}

implements InputPlugin

{

public interface PluginTask
        extends Task
{
    // configuration option 1 (required integer)
    @Config("option1")
    public int getOption1();

    // configuration option 2 (optional string, null is not allowed)
    @Config("option2")
    @ConfigDefault("\"myvalue\"")
    public String getOption2();

    // configuration option 3 (optional string, null is allowed)
    @Config("option3")
    @ConfigDefault("null")
    public Optional<String> getOption3();

    // if you get schema from config
    @Config("columns")
    public SchemaConfig getColumns();
}

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

    Schema schema = task.getColumns().toSchema();
    int taskCount = 1;  // number of run() method calls

    return resume(task.dump(), schema, taskCount, control);
}

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

@Override
public void cleanup(TaskSource taskSource,
        Schema schema, int taskCount,
        List<TaskReport> successTaskReports)
{
}

@Override
public TaskReport run(TaskSource taskSource,
        Schema schema, int taskIndex,
        PageOutput output)
{
    PluginTask task = taskSource.loadTask(PluginTask.class);

    // Write your code here :)
    throw new UnsupportedOperationException("${javaClassName}.run method is not implemented yet");
}

@Override
public ConfigDiff guess(ConfigSource config)
{
    return Exec.newConfigDiff();
}

}