X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FOptions.java;h=af81d0fcc3e25b47259c6f7a050e585fed6f3b1d;hp=b7ece81fe64b8f87e794979c980eda6c3625e45d;hb=a47643aed43d118ca68044f95451bb5374cdb332;hpb=33f333b35a73d3d4a4e79f41e9dd7b342db87b1a diff --git a/src/main/java/net/pterodactylus/sone/core/Options.java b/src/main/java/net/pterodactylus/sone/core/Options.java index b7ece81..af81d0f 100644 --- a/src/main/java/net/pterodactylus/sone/core/Options.java +++ b/src/main/java/net/pterodactylus/sone/core/Options.java @@ -1,12 +1,28 @@ +/* + * Sone - Options.java - Copyright © 2010–2012 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.util.validation.Validator; + /** * Stores various options that influence Sone’s behaviour. * @@ -47,12 +63,26 @@ public class Options { public T getReal(); /** + * Validates the given value. Note that {@code null} is always a valid + * value! + * + * @param value + * The value to validate + * @return {@code true} if this option does not have a {@link Validator} + * , or the {@link Validator} validates this object, {@code + * false} otherwise + */ + public boolean validate(T value); + + /** * Sets the current value of the option. * * @param value * The new value of the option + * @throws IllegalArgumentException + * if the value is not valid for this option */ - public void set(T value); + public void set(T value) throws IllegalArgumentException; } @@ -96,8 +126,33 @@ public class Options { /** The current value. */ private volatile T value; + /** The validator. */ + private Validator validator; + /** The option watcher. */ - private final List> optionWatchers = new ArrayList>(); + private final OptionWatcher optionWatcher; + + /** + * Creates a new default option. + * + * @param defaultValue + * The default value of the option + */ + public DefaultOption(T defaultValue) { + this(defaultValue, (OptionWatcher) null); + } + + /** + * Creates a new default option. + * + * @param defaultValue + * The default value of the option + * @param validator + * The validator for value validation (may be {@code null}) + */ + public DefaultOption(T defaultValue, Validator validator) { + this(defaultValue, validator, null); + } /** * Creates a new default option. @@ -105,11 +160,26 @@ public class Options { * @param defaultValue * The default value of the option * @param optionWatchers - * The option watchers + * The option watchers (may be {@code null}) + */ + public DefaultOption(T defaultValue, OptionWatcher optionWatchers) { + this(defaultValue, null, optionWatchers); + } + + /** + * Creates a new default option. + * + * @param defaultValue + * The default value of the option + * @param validator + * The validator for value validation (may be {@code null}) + * @param optionWatcher + * The option watcher (may be {@code null}) */ - public DefaultOption(T defaultValue, OptionWatcher... optionWatchers) { + public DefaultOption(T defaultValue, Validator validator, OptionWatcher optionWatcher) { this.defaultValue = defaultValue; - this.optionWatchers.addAll(Arrays.asList(optionWatchers)); + this.validator = validator; + this.optionWatcher = optionWatcher; } /** @@ -143,11 +213,22 @@ public class Options { * {@inheritDoc} */ @Override + public boolean validate(T value) { + return (validator == null) || (value == null) || validator.validate(value); + } + + /** + * {@inheritDoc} + */ + @Override public void set(T value) { + if ((value != null) && (validator != null) && (!validator.validate(value))) { + throw new IllegalArgumentException("New Value (" + value + ") could not be validated."); + } T oldValue = this.value; this.value = value; if (!get().equals(oldValue)) { - for (OptionWatcher optionWatcher : optionWatchers) { + if (optionWatcher != null) { optionWatcher.optionChanged(this, oldValue, get()); } } @@ -164,6 +245,9 @@ public class Options { /** 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. * @@ -242,4 +326,38 @@ public class Options { return stringOptions.get(name); } + /** + * Adds an {@link Enum} {@link Option}. + * + * @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 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); + } + }