package sk.stuba.fiit.perconik.utilities.configuration; import javax.annotation.Nullable; import com.google.common.reflect.TypeToken; import static sk.stuba.fiit.perconik.utilities.Nullables.firstNonNullOrNull; public abstract class AbstractOptionAccessor<T> extends AbstractOptionMapping<T> implements OptionAccessor<T> { /** * Constructor for use by subclasses. */ protected AbstractOptionAccessor(final TypeToken<T> type, final String key, @Nullable final T defaultValue) { super(type, key, defaultValue); } protected abstract OptionsReader reader(final Options options); protected abstract OptionsWriter writer(final Options options); protected abstract OptionParser<? extends T> parser(); public Object putValue(final Options options, @Nullable final T value) { return this.putValue(this.writer(options), value); } public Object putValue(final OptionsWriter writer, @Nullable final T value) { return writer.put(this.parser(), this.key, value); } public Object putDefaultValue(final Options options) { return this.putDefaultValue(this.writer(options)); } public Object putDefaultValue(final OptionsWriter writer) { return writer.put(this.parser(), this.key, this.defaultValue); } public Object putRawValue(final Options options, @Nullable final Object value) { return this.putRawValue(this.writer(options), value); } public Object putRawValue(final OptionsWriter writer, @Nullable final Object value) { return writer.putRaw(this.key, value); } public T getValue(final Options options) { return this.getValue(this.reader(options)); } public T getValue(final OptionsReader reader) { return firstNonNullOrNull(reader.get(this.parser(), this.key), this.defaultValue); } @Override public Object getRawValue(final Options options) { return this.getRawValue(this.reader(options)); } public Object getRawValue(final OptionsReader reader) { return firstNonNullOrNull(reader.getRaw(this.key), this.defaultValue); } public OptionMapping<T> toMapping() { return new SimpleOptionMapping<>(this.type, this.key, this.defaultValue); } }