From: David ‘Bombe’ Roden Date: Mon, 25 Oct 2010 05:26:27 +0000 (+0200) Subject: Add containers for various run-time options. X-Git-Tag: 0.1-RC1~39 X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=a93ce25138d3799324bb0fba0cff589f9b83cc23;p=Sone.git Add containers for various run-time options. --- diff --git a/src/main/java/net/pterodactylus/sone/core/Options.java b/src/main/java/net/pterodactylus/sone/core/Options.java new file mode 100644 index 0000000..04010da --- /dev/null +++ b/src/main/java/net/pterodactylus/sone/core/Options.java @@ -0,0 +1,181 @@ +package net.pterodactylus.sone.core; + +import java.util.HashMap; +import java.util.Map; + +/** + * Stores various options that influence Sone’s behaviour. + * + * @author David ‘Bombe’ Roden + */ +public class Options { + + /** + * Contains current and default value of an option. + * + * @param + * The type of the option + * @author David ‘Bombe’ Roden + */ + public static interface Option { + + /** + * Returns the default value of the option. + * + * @return The default value of the option + */ + public T getDefault(); + + /** + * Returns the current value of the option. If the current value is not + * set (usually {@code null}), the default value is returned. + * + * @return The current value of the option + */ + public T get(); + + /** + * Returns the real value of the option. This will also return an unset + * value (usually {@code null})! + * + * @return The real value of the option + */ + public T getReal(); + + /** + * Sets the current value of the option. + * + * @param value + * The new value of the option + */ + public void set(T value); + + } + + /** + * Interface for objects that want to be notified when an option changes its + * value. + * + * @param + * The type of the option + * @author David ‘Bombe’ Roden + */ + public static interface OptionWatcher { + + /** + * Notifies an object that an option has been changed. + * + * @param option + * The option that has changed + * @param oldValue + * The old value of the option + * @param newValue + * The new value of the option + */ + public void optionChanged(Option option, T oldValue, T newValue); + + } + + /** + * Basic implementation of an {@link Option} that notifies an + * {@link OptionWatcher} if the value changes. + * + * @param + * The type of the option + * @author David ‘Bombe’ Roden + */ + public static class DefaultOption implements Option { + + /** The default value. */ + private final T defaultValue; + + /** The current value. */ + private T value; + + /** The option watcher. */ + private final OptionWatcher optionWatcher; + + /** + * Creates a new default option. + * + * @param defaultValue + * The default value of the option + * @param optionWatcher + * The option watcher + */ + public DefaultOption(T defaultValue, OptionWatcher optionWatcher) { + this.defaultValue = defaultValue; + this.optionWatcher = optionWatcher; + } + + /** + * {@inheritDoc} + */ + @Override + public T getDefault() { + return defaultValue; + } + + /** + * {@inheritDoc} + */ + @Override + public T get() { + return (value != null) ? value : defaultValue; + } + + /** + * Returns the real value of the option. This will also return an unset + * value (usually {@code null})! + * + * @return The real value of the option + */ + @Override + public T getReal() { + return value; + } + + /** + * {@inheritDoc} + */ + @Override + public void set(T value) { + T oldValue = this.value; + this.value = value; + if (!get().equals(oldValue)) { + optionWatcher.optionChanged(this, oldValue, get()); + } + } + + } + + /** Holds all {@link Integer} {@link Option}s. */ + private final Map> integerOptions = new HashMap>(); + + /** + * Adds an {@link Integer} {@link Option}. + * + * @param name + * The name of the option + * @param integerOption + * The option + * @return The given option + */ + public Option addIntegerOption(String name, Option integerOption) { + integerOptions.put(name, integerOption); + return integerOption; + } + + /** + * Returns an {@link Integer} {@link Option}. + * + * @param name + * The name of the integer option to get + * @return The integer option, or {@code null} if there is no option with + * the given name + */ + public Option getIntegerOption(String name) { + return integerOptions.get(name); + } + +}