package jalse.actions;
import static jalse.actions.Actions.requireNotStopped;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
abstract class BaseActionContext<T> implements SchedulableActionContext<T> {
private final ActionEngine engine;
private final Action<T> action;
private final ActionBindings bindings;
private final AtomicReference<T> actor;
private final AtomicLong period;
private final AtomicLong initialDelay;
private final AtomicBoolean periodicOnException;
BaseActionContext(final ActionEngine engine, final Action<T> action, final ActionBindings sourceBindings) {
this.engine = requireNotStopped(engine);
this.action = Objects.requireNonNull(action);
bindings = new DefaultActionBindings(sourceBindings);
actor = new AtomicReference<>();
period = new AtomicLong();
initialDelay = new AtomicLong();
periodicOnException = new AtomicBoolean();
}
@Override
public <S> S get(final String key) {
return bindings.get(key);
}
@Override
public Action<T> getAction() {
return action;
}
@Override
public T getActor() {
return actor.get();
}
@Override
public ActionEngine getEngine() {
return engine;
}
@Override
public long getInitialDelay(final TimeUnit unit) {
return unit.convert(initialDelay.get(), TimeUnit.NANOSECONDS);
}
@Override
public long getPeriod(final TimeUnit unit) {
return unit.convert(period.get(), TimeUnit.NANOSECONDS);
}
@Override
public boolean isPeriodicOnException() {
return periodicOnException.get();
}
@Override
public <S> S put(final String key, final S value) {
return bindings.put(key, value);
}
@Override
public void putAll(final Map<String, ?> map) {
bindings.putAll(map);
}
@Override
public <S> S remove(final String key) {
return bindings.remove(key);
}
@Override
public void removeAll() {
bindings.removeAll();
}
@Override
public void setActor(final T actor) {
this.actor.set(actor);
}
@Override
public void setInitialDelay(final long initialDelay, final TimeUnit unit) {
this.initialDelay.set(unit.toNanos(initialDelay));
}
@Override
public void setPeriod(final long period, final TimeUnit unit) {
this.period.set(unit.toNanos(period));
}
@Override
public void setPeriodicOnException(final boolean periodicOnException) {
this.periodicOnException.set(periodicOnException);
}
@Override
public Map<String, ?> toMap() {
return bindings.toMap();
}
}