diff --git a/configlib-core/src/main/java/de/exlll/configlib/ConfigurationProperties.java b/configlib-core/src/main/java/de/exlll/configlib/ConfigurationProperties.java index 3303ac5..13e2d07 100644 --- a/configlib-core/src/main/java/de/exlll/configlib/ConfigurationProperties.java +++ b/configlib-core/src/main/java/de/exlll/configlib/ConfigurationProperties.java @@ -40,7 +40,20 @@ class ConfigurationProperties { return new BuilderImpl(); } + /** + * Creates a new builder and initializes it with values taken from this properties object. + * + * @return new builder + */ + public Builder toBuilder() { + return new BuilderImpl(this); + } + private static final class BuilderImpl extends Builder { + private BuilderImpl() {} + + private BuilderImpl(ConfigurationProperties properties) {super(properties);} + @Override protected BuilderImpl getThis() {return this;} @@ -64,6 +77,15 @@ class ConfigurationProperties { protected Builder() {} + protected Builder(ConfigurationProperties properties) { + this.serializersByType.putAll(properties.serializersByType); + this.formatter = properties.formatter; + this.filter = properties.filter; + this.outputNulls = properties.outputNulls; + this.inputNulls = properties.inputNulls; + this.serializeSetsAsLists = properties.serializeSetsAsLists; + } + /** * Sets the field filter. The given filter is applied in addition to and * after the default filter. diff --git a/configlib-core/src/main/java/de/exlll/configlib/FileConfigurationProperties.java b/configlib-core/src/main/java/de/exlll/configlib/FileConfigurationProperties.java index 4793b82..cd8b66b 100644 --- a/configlib-core/src/main/java/de/exlll/configlib/FileConfigurationProperties.java +++ b/configlib-core/src/main/java/de/exlll/configlib/FileConfigurationProperties.java @@ -31,7 +31,15 @@ public class FileConfigurationProperties extends ConfigurationProperties { return new BuilderImpl(); } + public Builder toBuilder() { + return new BuilderImpl(this); + } + private static final class BuilderImpl extends Builder { + private BuilderImpl() {} + + private BuilderImpl(FileConfigurationProperties properties) {super(properties);} + @Override protected BuilderImpl getThis() {return this;} @@ -51,10 +59,23 @@ public class FileConfigurationProperties extends ConfigurationProperties { private boolean createParentDirectories = true; /** - * A constructor that can be overridden by subclasses. + * The default constructor. */ protected Builder() {} + /** + * A constructor that initializes this builder with values taken from the properties object. + * + * @param properties the properties object the values are taken from + * @throws NullPointerException if {@code properties} is null + */ + protected Builder(FileConfigurationProperties properties) { + super(properties); + this.header = properties.header; + this.footer = properties.footer; + this.createParentDirectories = properties.createParentDirectories; + } + /** * Sets the header. The header is written as a comment before the actual configuration. * If the header is set to null (the default), nothing is written. diff --git a/configlib-core/src/main/java/de/exlll/configlib/YamlConfigurationProperties.java b/configlib-core/src/main/java/de/exlll/configlib/YamlConfigurationProperties.java index 93504bf..e9cf7b8 100644 --- a/configlib-core/src/main/java/de/exlll/configlib/YamlConfigurationProperties.java +++ b/configlib-core/src/main/java/de/exlll/configlib/YamlConfigurationProperties.java @@ -24,7 +24,15 @@ public final class YamlConfigurationProperties extends FileConfigurationProperti return new BuilderImpl(); } + public Builder toBuilder() { + return new BuilderImpl(this); + } + private static final class BuilderImpl extends Builder { + private BuilderImpl() {} + + private BuilderImpl(YamlConfigurationProperties properties) {super(properties);} + @Override protected BuilderImpl getThis() {return this;} @@ -41,10 +49,20 @@ public final class YamlConfigurationProperties extends FileConfigurationProperti extends FileConfigurationProperties.Builder { /** - * A constructor that can be overridden by subclasses. + * The default constructor. */ protected Builder() {} + /** + * A constructor that initializes this builder with values taken from the properties object. + * + * @param properties the properties object the values are taken from + * @throws NullPointerException if {@code properties} is null + */ + protected Builder(YamlConfigurationProperties properties) { + super(properties); + } + /** * Builds a {@code ConfigurationProperties} instance. * diff --git a/configlib-core/src/test/java/de/exlll/configlib/ConfigurationPropertiesTest.java b/configlib-core/src/test/java/de/exlll/configlib/ConfigurationPropertiesTest.java index 43c3bcf..c6f57ce 100644 --- a/configlib-core/src/test/java/de/exlll/configlib/ConfigurationPropertiesTest.java +++ b/configlib-core/src/test/java/de/exlll/configlib/ConfigurationPropertiesTest.java @@ -48,6 +48,31 @@ class ConfigurationPropertiesTest { assertThat(properties.getFieldFilter(), sameInstance(filter)); } + @Test + void builderCtorCopiesValues() { + FieldFormatter formatter = field -> field.getName().toLowerCase(Locale.ROOT); + FieldFilter filter = field -> field.getName().startsWith("f"); + TestUtils.PointSerializer serializer = new TestUtils.PointSerializer(); + + ConfigurationProperties properties = ConfigurationProperties.newBuilder() + .addSerializer(Point.class, serializer) + .setFieldFormatter(formatter) + .setFieldFilter(filter) + .outputNulls(true) + .inputNulls(true) + .serializeSetsAsLists(false) + .build() + .toBuilder() + .build(); + + assertThat(properties.getSerializers(), is(Map.of(Point.class, serializer))); + assertThat(properties.outputNulls(), is(true)); + assertThat(properties.inputNulls(), is(true)); + assertThat(properties.serializeSetsAsLists(), is(false)); + assertThat(properties.getFieldFormatter(), sameInstance(formatter)); + assertThat(properties.getFieldFilter(), sameInstance(filter)); + } + @Test void builderSerializersUnmodifiable() { ConfigurationProperties properties = ConfigurationProperties.newBuilder().build(); diff --git a/configlib-core/src/test/java/de/exlll/configlib/FileConfigurationPropertiesTest.java b/configlib-core/src/test/java/de/exlll/configlib/FileConfigurationPropertiesTest.java index 5e4b9b7..e821c2c 100644 --- a/configlib-core/src/test/java/de/exlll/configlib/FileConfigurationPropertiesTest.java +++ b/configlib-core/src/test/java/de/exlll/configlib/FileConfigurationPropertiesTest.java @@ -2,6 +2,8 @@ package de.exlll.configlib; import org.junit.jupiter.api.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.*; class FileConfigurationPropertiesTest { @@ -24,4 +26,21 @@ class FileConfigurationPropertiesTest { assertEquals("THE FOOTER", properties.getFooter()); assertFalse(properties.createParentDirectories()); } + + @Test + void builderCtorCopiesValues() { + FileConfigurationProperties properties = FileConfigurationProperties.newBuilder() + .outputNulls(true) + .header("A") + .footer("B") + .createParentDirectories(false) + .build() + .toBuilder() + .build(); + + assertThat(properties.outputNulls(), is(true)); + assertThat(properties.getHeader(), is("A")); + assertThat(properties.getFooter(), is("B")); + assertThat(properties.createParentDirectories(), is(false)); + } } \ No newline at end of file diff --git a/configlib-core/src/test/java/de/exlll/configlib/YamlConfigurationPropertiesTest.java b/configlib-core/src/test/java/de/exlll/configlib/YamlConfigurationPropertiesTest.java new file mode 100644 index 0000000..c655b5f --- /dev/null +++ b/configlib-core/src/test/java/de/exlll/configlib/YamlConfigurationPropertiesTest.java @@ -0,0 +1,22 @@ +package de.exlll.configlib; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; + +class YamlConfigurationPropertiesTest { + @Test + void builderCtorCopiesValues() { + YamlConfigurationProperties properties = YamlConfigurationProperties.newBuilder() + .outputNulls(true) + .header("A") + .build() + .toBuilder() + .build(); + + assertThat(properties.outputNulls(), is(true)); + assertThat(properties.getHeader(), is("A")); + } +} \ No newline at end of file