From 754925ca491d60ddf92b3cb21fb38f0666169348 Mon Sep 17 00:00:00 2001 From: =?utf8?q?David=20=E2=80=98Bombe=E2=80=99=20Roden?= Date: Mon, 29 Sep 2014 18:28:27 +0200 Subject: [PATCH] Move option interface and default implementation to top-level classes. --- .../java/net/pterodactylus/sone/core/Core.java | 2 +- .../java/net/pterodactylus/sone/core/Options.java | 132 +-------------------- .../pterodactylus/sone/utils/DefaultOption.java | 84 +++++++++++++ .../java/net/pterodactylus/sone/utils/Option.java | 49 ++++++++ .../pterodactylus/sone/core/DefaultOptionTest.java | 93 --------------- .../net/pterodactylus/sone/core/OptionsTest.java | 2 +- .../pterodactylus/sone/core/PreferencesTest.java | 2 +- .../sone/utils/DefaultOptionTest.java | 89 ++++++++++++++ 8 files changed, 227 insertions(+), 226 deletions(-) create mode 100644 src/main/java/net/pterodactylus/sone/utils/DefaultOption.java create mode 100644 src/main/java/net/pterodactylus/sone/utils/Option.java delete mode 100644 src/test/java/net/pterodactylus/sone/core/DefaultOptionTest.java create mode 100644 src/test/java/net/pterodactylus/sone/utils/DefaultOptionTest.java diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index 12e700e..c10408a 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -43,7 +43,6 @@ import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidImageFound; import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidParentAlbumFound; import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidPostFound; import net.pterodactylus.sone.core.ConfigurationSoneParser.InvalidPostReplyFound; -import net.pterodactylus.sone.core.Options.DefaultOption; import net.pterodactylus.sone.core.SoneChangeDetector.PostProcessor; import net.pterodactylus.sone.core.SoneChangeDetector.PostReplyProcessor; import net.pterodactylus.sone.core.event.ImageInsertFinishedEvent; @@ -90,6 +89,7 @@ import net.pterodactylus.sone.freenet.wot.event.IdentityUpdatedEvent; import net.pterodactylus.sone.freenet.wot.event.OwnIdentityAddedEvent; import net.pterodactylus.sone.freenet.wot.event.OwnIdentityRemovedEvent; import net.pterodactylus.sone.main.SonePlugin; +import net.pterodactylus.sone.utils.DefaultOption; import net.pterodactylus.sone.utils.IntegerRangePredicate; import net.pterodactylus.util.config.Configuration; import net.pterodactylus.util.config.ConfigurationException; diff --git a/src/main/java/net/pterodactylus/sone/core/Options.java b/src/main/java/net/pterodactylus/sone/core/Options.java index 34fc9a3..9e79fca 100644 --- a/src/main/java/net/pterodactylus/sone/core/Options.java +++ b/src/main/java/net/pterodactylus/sone/core/Options.java @@ -21,6 +21,8 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import net.pterodactylus.sone.utils.Option; + import com.google.common.base.Predicate; /** @@ -30,136 +32,6 @@ import com.google.common.base.Predicate; */ 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 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(); - - /** - * 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 validator, or the - * 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) throws IllegalArgumentException; - - } - - /** - * Basic implementation of an {@link Option}. - * - * @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 volatile T value; - - /** The validator. */ - private Predicate 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 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."); - } - T oldValue = this.value; - this.value = value; - } - - } - /** Holds all {@link Boolean} {@link Option}s. */ private final Map> booleanOptions = Collections.synchronizedMap(new HashMap>()); 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 index 0000000..0939f21 --- /dev/null +++ b/src/main/java/net/pterodactylus/sone/utils/DefaultOption.java @@ -0,0 +1,84 @@ +package net.pterodactylus.sone.utils; + +import com.google.common.base.Predicate; + +/** + * Basic implementation of an {@link Option}. + * + * @param + * The type of the option + * @author David ‘Bombe’ Roden + */ +public class DefaultOption implements Option { + + /** The default value. */ + private final T defaultValue; + + /** The current value. */ + private volatile T value; + + /** The validator. */ + private Predicate 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 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; + } + +} diff --git a/src/main/java/net/pterodactylus/sone/utils/Option.java b/src/main/java/net/pterodactylus/sone/utils/Option.java new file mode 100644 index 0000000..9149c07 --- /dev/null +++ b/src/main/java/net/pterodactylus/sone/utils/Option.java @@ -0,0 +1,49 @@ +package net.pterodactylus.sone.utils; + +/** + * Contains current and default value of an option. + * + * @param + * The type of the option + * @author David ‘Bombe’ Roden + */ +public interface Option { + + /** + * 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(); + + /** + * 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 validator, or the + * 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) throws IllegalArgumentException; + +} diff --git a/src/test/java/net/pterodactylus/sone/core/DefaultOptionTest.java b/src/test/java/net/pterodactylus/sone/core/DefaultOptionTest.java deleted file mode 100644 index 6c4bf66..0000000 --- a/src/test/java/net/pterodactylus/sone/core/DefaultOptionTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.pterodactylus.sone.core; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.nullValue; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; - -import javax.annotation.Nullable; - -import net.pterodactylus.sone.core.Options.DefaultOption; -import net.pterodactylus.sone.core.Options.Option; - -import com.google.common.base.Predicate; -import org.junit.Test; - -/** - * Unit test for {@link DefaultOption}. - * - * @author David ‘Bombe’ Roden - */ -public class DefaultOptionTest { - - private final Object defaultValue = new Object(); - private final Object acceptedValue = new Object(); - private final Predicate matchesAcceptedValue = new Predicate() { - @Override - public boolean apply(@Nullable Object object) { - return acceptedValue.equals(object); - } - }; - - @Test - public void defaultOptionReturnsDefaultValueWhenUnset() { - DefaultOption defaultOption = new DefaultOption(defaultValue); - assertThat(defaultOption.get(), is(defaultValue)); - } - - @Test - public void defaultOptionReturnsNullForRealWhenUnset() { - DefaultOption defaultOption = new DefaultOption(defaultValue); - assertThat(defaultOption.getReal(), nullValue()); - } - - @Test - public void defaultOptionWillReturnSetValue() { - DefaultOption defaultOption = new DefaultOption(defaultValue); - Object newValue = new Object(); - defaultOption.set(newValue); - assertThat(defaultOption.get(), is(newValue)); - } - - @Test - public void defaultOptionWithValidatorAcceptsValidValues() { - DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); - defaultOption.set(acceptedValue); - assertThat(defaultOption.get(), is(acceptedValue)); - } - - @Test(expected = IllegalArgumentException.class) - public void defaultOptionWithValidatorRejectsInvalidValues() { - DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); - defaultOption.set(new Object()); - } - - @Test - public void defaultOptionValidatesObjectsCorrectly() { - DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); - assertThat(defaultOption.validate(acceptedValue), is(true)); - assertThat(defaultOption.validate(new Object()), is(false)); - } - - @Test - public void settingToNullWillRestoreDefaultValue() { - DefaultOption defaultOption = new DefaultOption(defaultValue); - defaultOption.set(null); - assertThat(defaultOption.get(), is(defaultValue)); - } - - @Test - public void validateWithoutValidatorWillValidateNull() { - DefaultOption defaultOption = new DefaultOption(defaultValue); - assertThat(defaultOption.validate(null), is(true)); - } - - @Test - public void validateWithValidatorWillValidateNull() { - DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); - assertThat(defaultOption.validate(null), is(true)); - } - -} diff --git a/src/test/java/net/pterodactylus/sone/core/OptionsTest.java b/src/test/java/net/pterodactylus/sone/core/OptionsTest.java index 46b2ad5..cce4df0 100644 --- a/src/test/java/net/pterodactylus/sone/core/OptionsTest.java +++ b/src/test/java/net/pterodactylus/sone/core/OptionsTest.java @@ -5,7 +5,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Mockito.mock; -import net.pterodactylus.sone.core.Options.Option; +import net.pterodactylus.sone.utils.Option; import org.junit.Test; diff --git a/src/test/java/net/pterodactylus/sone/core/PreferencesTest.java b/src/test/java/net/pterodactylus/sone/core/PreferencesTest.java index 65d59e7..ad6bbea 100644 --- a/src/test/java/net/pterodactylus/sone/core/PreferencesTest.java +++ b/src/test/java/net/pterodactylus/sone/core/PreferencesTest.java @@ -11,12 +11,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import net.pterodactylus.sone.core.Options.Option; import net.pterodactylus.sone.core.event.InsertionDelayChangedEvent; import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired; import net.pterodactylus.sone.fcp.event.FcpInterfaceActivatedEvent; import net.pterodactylus.sone.fcp.event.FcpInterfaceDeactivatedEvent; import net.pterodactylus.sone.fcp.event.FullAccessRequiredChanged; +import net.pterodactylus.sone.utils.Option; import com.google.common.eventbus.EventBus; import org.junit.Before; diff --git a/src/test/java/net/pterodactylus/sone/utils/DefaultOptionTest.java b/src/test/java/net/pterodactylus/sone/utils/DefaultOptionTest.java new file mode 100644 index 0000000..b02d530 --- /dev/null +++ b/src/test/java/net/pterodactylus/sone/utils/DefaultOptionTest.java @@ -0,0 +1,89 @@ +package net.pterodactylus.sone.utils; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +import javax.annotation.Nullable; + +import net.pterodactylus.sone.utils.DefaultOption; + +import com.google.common.base.Predicate; +import org.junit.Test; + +/** + * Unit test for {@link DefaultOption}. + * + * @author David ‘Bombe’ Roden + */ +public class DefaultOptionTest { + + private final Object defaultValue = new Object(); + private final Object acceptedValue = new Object(); + private final Predicate matchesAcceptedValue = new Predicate() { + @Override + public boolean apply(@Nullable Object object) { + return acceptedValue.equals(object); + } + }; + + @Test + public void defaultOptionReturnsDefaultValueWhenUnset() { + DefaultOption defaultOption = new DefaultOption(defaultValue); + assertThat(defaultOption.get(), is(defaultValue)); + } + + @Test + public void defaultOptionReturnsNullForRealWhenUnset() { + DefaultOption defaultOption = new DefaultOption(defaultValue); + assertThat(defaultOption.getReal(), nullValue()); + } + + @Test + public void defaultOptionWillReturnSetValue() { + DefaultOption defaultOption = new DefaultOption(defaultValue); + Object newValue = new Object(); + defaultOption.set(newValue); + assertThat(defaultOption.get(), is(newValue)); + } + + @Test + public void defaultOptionWithValidatorAcceptsValidValues() { + DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); + defaultOption.set(acceptedValue); + assertThat(defaultOption.get(), is(acceptedValue)); + } + + @Test(expected = IllegalArgumentException.class) + public void defaultOptionWithValidatorRejectsInvalidValues() { + DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); + defaultOption.set(new Object()); + } + + @Test + public void defaultOptionValidatesObjectsCorrectly() { + DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); + assertThat(defaultOption.validate(acceptedValue), is(true)); + assertThat(defaultOption.validate(new Object()), is(false)); + } + + @Test + public void settingToNullWillRestoreDefaultValue() { + DefaultOption defaultOption = new DefaultOption(defaultValue); + defaultOption.set(null); + assertThat(defaultOption.get(), is(defaultValue)); + } + + @Test + public void validateWithoutValidatorWillValidateNull() { + DefaultOption defaultOption = new DefaultOption(defaultValue); + assertThat(defaultOption.validate(null), is(true)); + } + + @Test + public void validateWithValidatorWillValidateNull() { + DefaultOption defaultOption = new DefaultOption(defaultValue, matchesAcceptedValue); + assertThat(defaultOption.validate(null), is(true)); + } + +} -- 2.7.4