X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FOptions.java;h=398374a0468b23fcb5d89f9b0fe38ec45e8b93bb;hp=cbe88c8ecb12fc37b2bce37f38d6ed14099d3380;hb=64740709990291688170ebd1f192af5eb9090618;hpb=365991b0251eec67549e34a70d0b8bdd130de8f4 diff --git a/src/main/java/net/pterodactylus/sone/core/Options.java b/src/main/java/net/pterodactylus/sone/core/Options.java index cbe88c8..398374a 100644 --- a/src/main/java/net/pterodactylus/sone/core/Options.java +++ b/src/main/java/net/pterodactylus/sone/core/Options.java @@ -1,164 +1,44 @@ +/* + * Sone - Options.java - Copyright © 2010–2020 David Roden + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.pterodactylus.sone.core; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; +import net.pterodactylus.sone.utils.Option; + /** * 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 List> optionWatchers = new ArrayList>(); - - /** - * Creates a new default option. - * - * @param defaultValue - * The default value of the option - * @param optionWatchers - * The option watchers - */ - public DefaultOption(T defaultValue, OptionWatcher... optionWatchers) { - this.defaultValue = defaultValue; - this.optionWatchers.addAll(Arrays.asList(optionWatchers)); - } - - /** - * {@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)) { - for (OptionWatcher optionWatcher : optionWatchers) { - optionWatcher.optionChanged(this, oldValue, get()); - } - } - } - - } - /** Holds all {@link Boolean} {@link Option}s. */ - private final Map> booleanOptions = new HashMap>(); + private final Map> booleanOptions = Collections.synchronizedMap(new HashMap>()); /** Holds all {@link Integer} {@link Option}s. */ - private final Map> integerOptions = new HashMap>(); + private final Map> integerOptions = Collections.synchronizedMap(new HashMap>()); + + /** Holds all {@link String} {@link Option}s. */ + private final Map> stringOptions = Collections.synchronizedMap(new HashMap>()); + + /** Holds all {@link Enum} {@link Option}s. */ + private final Map>> enumOptions = Collections.synchronizedMap(new HashMap>>()); /** * Adds a boolean option. @@ -212,4 +92,68 @@ public class Options { return integerOptions.get(name); } + /** + * Adds a {@link String} {@link Option}. + * + * @param name + * The name of the option + * @param stringOption + * The option + * @return The given option + */ + public Option addStringOption(String name, Option stringOption) { + stringOptions.put(name, stringOption); + return stringOption; + } + + /** + * Returns a {@link String} {@link Option}. + * + * @param name + * The name of the string option to get + * @return The string option, or {@code null} if there is no option with the + * given name + */ + public Option getStringOption(String name) { + return stringOptions.get(name); + } + + /** + * Adds an {@link Enum} {@link Option}. + * + * @param + * The enum type + * @param name + * The name of the option + * @param enumOption + * The option + * @return The given option + */ + public > Option addEnumOption(String name, Option enumOption) { + enumOptions.put(name, enumOption); + return enumOption; + } + + /** + * Returns a {@link Enum} {@link Option}. As the type can probably not be + * interred correctly you could help the compiler by calling this method + * like this: + *

+ * + *

+	 * options.<SomeEnum> getEnumOption("SomeEnumOption").get();
+	 * 
+ * + * @param + * The enum type + * @param name + * The name of the option + * @return The enum option, or {@code null} if there is no enum option with + * the given name + */ + @SuppressWarnings("unchecked") + public > Option getEnumOption(String name) { + return (Option) enumOptions.get(name); + } + }