Move option interface and default implementation to top-level classes.
[Sone.git] / src / main / java / net / pterodactylus / sone / utils / DefaultOption.java
diff --git a/src/main/java/net/pterodactylus/sone/utils/DefaultOption.java b/src/main/java/net/pterodactylus/sone/utils/DefaultOption.java
new file mode 100644 (file)
index 0000000..0939f21
--- /dev/null
@@ -0,0 +1,84 @@
+package net.pterodactylus.sone.utils;
+
+import com.google.common.base.Predicate;
+
+/**
+ * Basic implementation of an {@link Option}.
+ *
+ * @param <T>
+ *            The type of the option
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class DefaultOption<T> implements Option<T> {
+
+       /** The default value. */
+       private final T defaultValue;
+
+       /** The current value. */
+       private volatile T value;
+
+       /** The validator. */
+       private Predicate<T> validator;
+
+       /**
+        * Creates a new default option.
+        *
+        * @param defaultValue
+        *            The default value of the option
+        */
+       public DefaultOption(T defaultValue) {
+               this(defaultValue, 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, Predicate<T> validator) {
+               this.defaultValue = defaultValue;
+               this.validator = validator;
+       }
+
+       /**
+        * {@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 boolean validate(T value) {
+               return (validator == null) || (value == null) || validator.apply(value);
+       }
+
+       /**
+        * {@inheritDoc}
+        */
+       @Override
+       public void set(T value) {
+               if ((value != null) && (validator != null) && (!validator.apply(value))) {
+                       throw new IllegalArgumentException("New Value (" + value + ") could not be validated.");
+               }
+               this.value = value;
+       }
+
+}