Add toBuilder method to create a builder from a properties object

dev
Exlll 3 years ago
parent 7c4f630f7c
commit f70c44f159

@ -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<BuilderImpl> {
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.

@ -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<BuilderImpl> {
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.

@ -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<BuilderImpl> {
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<B> {
/**
* 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.
*

@ -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();

@ -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));
}
}

@ -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"));
}
}
Loading…
Cancel
Save