package org.embulk.spi;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;
import org.slf4j.ILoggerFactory;
import com.google.common.base.Optional;
import com.google.inject.Injector;
import org.embulk.config.Task;
import org.embulk.config.Config;
import org.embulk.config.ConfigDefault;
import org.embulk.config.ModelManager;
import org.embulk.config.CommitReport;
import org.embulk.config.TaskReport;
import org.embulk.config.ConfigDiff;
import org.embulk.config.ConfigSource;
import org.embulk.config.TaskSource;
import org.embulk.config.DataSourceImpl;
import org.embulk.exec.TempFileAllocator;
import org.embulk.plugin.PluginType;
import org.embulk.plugin.PluginManager;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.time.TimestampFormatter;
import org.embulk.spi.time.TimestampFormatter.FormatterTask;
public class ExecSession
{
private final Injector injector;
private final ILoggerFactory loggerFactory;
private final ModelManager modelManager;
private final PluginManager pluginManager;
private final BufferAllocator bufferAllocator;
private final Timestamp transactionTime;
private final TempFileSpace tempFileSpace;
private final boolean preview;
@Deprecated
public interface SessionTask
extends Task
{
@Config("transaction_time")
@ConfigDefault("null")
Optional<Timestamp> getTransactionTime();
}
public static class Builder
{
private final Injector injector;
private ILoggerFactory loggerFactory;
private Timestamp transactionTime;
public Builder(Injector injector)
{
this.injector = injector;
}
public Builder fromExecConfig(ConfigSource configSource)
{
this.transactionTime = configSource.get(Timestamp.class, "transaction_time", null);
return this;
}
public Builder setLoggerFactory(ILoggerFactory loggerFactory)
{
this.loggerFactory = loggerFactory;
return this;
}
public Builder setTransactionTime(Timestamp timestamp)
{
this.transactionTime = timestamp;
return this;
}
public ExecSession build()
{
if (transactionTime == null) {
transactionTime = Timestamp.ofEpochMilli(System.currentTimeMillis()); // TODO get nanoseconds for default
}
return new ExecSession(injector, transactionTime, Optional.fromNullable(loggerFactory));
}
}
public static Builder builder(Injector injector)
{
return new Builder(injector);
}
@Deprecated
public ExecSession(Injector injector, ConfigSource configSource)
{
this(injector,
configSource.loadConfig(SessionTask.class).getTransactionTime().or(
Timestamp.ofEpochMilli(System.currentTimeMillis())
), // TODO get nanoseconds for default
null);
}
private ExecSession(Injector injector, Timestamp transactionTime, Optional<ILoggerFactory> loggerFactory)
{
this.injector = injector;
this.loggerFactory = loggerFactory.or(injector.getInstance(ILoggerFactory.class));
this.modelManager = injector.getInstance(ModelManager.class);
this.pluginManager = injector.getInstance(PluginManager.class);
this.bufferAllocator = injector.getInstance(BufferAllocator.class);
this.transactionTime = transactionTime;
TempFileAllocator tempFileAllocator = injector.getInstance(TempFileAllocator.class);
this.tempFileSpace = tempFileAllocator.newSpace(transactionTime.toString());
this.preview = false;
}
private ExecSession(ExecSession copy, boolean preview)
{
this.injector = copy.injector;
this.loggerFactory = copy.loggerFactory;
this.modelManager = copy.modelManager;
this.pluginManager = copy.pluginManager;
this.bufferAllocator = copy.bufferAllocator;
this.transactionTime = copy.transactionTime;
this.tempFileSpace = copy.tempFileSpace;
this.preview = preview;
}
public ExecSession forPreview()
{
return new ExecSession(this, true);
}
public ConfigSource getSessionExecConfig()
{
return newConfigSource()
.set("transaction_time", transactionTime);
}
public Injector getInjector()
{
return injector;
}
public Timestamp getTransactionTime()
{
return transactionTime;
}
public Logger getLogger(String name)
{
return loggerFactory.getLogger(name);
}
public Logger getLogger(Class<?> name)
{
return loggerFactory.getLogger(name.getName());
}
public BufferAllocator getBufferAllocator()
{
return bufferAllocator;
}
public ModelManager getModelManager()
{
return modelManager;
}
public <T> T newPlugin(Class<T> iface, PluginType type)
{
return pluginManager.newPlugin(iface, type);
}
public TaskReport newTaskReport()
{
return new DataSourceImpl(modelManager);
}
@Deprecated
public CommitReport newCommitReport()
{
return new DataSourceImpl(modelManager);
}
public ConfigDiff newConfigDiff()
{
return new DataSourceImpl(modelManager);
}
public ConfigSource newConfigSource()
{
return new DataSourceImpl(modelManager);
}
public TaskSource newTaskSource()
{
return new DataSourceImpl(modelManager);
}
public TimestampFormatter newTimestampFormatter(String format, DateTimeZone timezone)
{
ConfigSource config = Exec.newConfigSource();
config.set("timezone", timezone.getID());
FormatterTask formatterTask = config.loadConfig(FormatterTask.class);
return new TimestampFormatter(format, formatterTask);
}
public TempFileSpace getTempFileSpace()
{
return tempFileSpace;
}
public boolean isPreview()
{
return preview;
}
public void cleanup()
{
tempFileSpace.cleanup();
}
}