diff --git a/src/main/java/org/hostsharing/hsadminng/service/dto/CustomerDTO.java b/src/main/java/org/hostsharing/hsadminng/service/dto/CustomerDTO.java index 85908ac9..7713569f 100644 --- a/src/main/java/org/hostsharing/hsadminng/service/dto/CustomerDTO.java +++ b/src/main/java/org/hostsharing/hsadminng/service/dto/CustomerDTO.java @@ -14,7 +14,7 @@ import java.util.Objects; /** * A DTO for the Customer entity. */ -public class CustomerDTO extends FluentBuilder implements AccessMappings { +public class CustomerDTO implements AccessMappings, FluentBuilder { @SelfId(resolver = CustomerService.class) @AccessFor(read = Role.ANY_CUSTOMER_USER) diff --git a/src/main/java/org/hostsharing/hsadminng/service/dto/FluentBuilder.java b/src/main/java/org/hostsharing/hsadminng/service/dto/FluentBuilder.java index 63cf70c6..7ae8e26b 100644 --- a/src/main/java/org/hostsharing/hsadminng/service/dto/FluentBuilder.java +++ b/src/main/java/org/hostsharing/hsadminng/service/dto/FluentBuilder.java @@ -2,10 +2,41 @@ package org.hostsharing.hsadminng.service.dto; import java.util.function.Consumer; -public class FluentBuilder { +/** + * Just 'implement' this interface in your class to get a pseudo fluent builder, no more code needed. + * + * @param class to be build (same as to which the interface was added) + */ +public interface FluentBuilder { + /** + * Allows statements on the target instance possible as expression. + * + * This allows creating nested object structures, e.g. for test data + * in a much more readable way. + * + *

Example

+ * {code + * // adding a fluent builder to your class + * class YourClass implements FluentBuilder { + * public int someField; + * public String anotherField; + * // ... + * } + * + * // using the fluent builder somewhere else + * someMethod( new YourClass().with( it -> { + * it.someField = 5; + * it.anotherField = "Hello"; + * })); + * } + * + * @param builderFunction statements to apply to 'this' + * + * @return the instance on which 'with(...)' was executed. + */ @SuppressWarnings("unchecked") - public T with( + default T with( Consumer builderFunction) { builderFunction.accept((T) this); return (T) this; diff --git a/src/main/java/org/hostsharing/hsadminng/service/dto/MembershipDTO.java b/src/main/java/org/hostsharing/hsadminng/service/dto/MembershipDTO.java index 7efeaaba..c931ce94 100644 --- a/src/main/java/org/hostsharing/hsadminng/service/dto/MembershipDTO.java +++ b/src/main/java/org/hostsharing/hsadminng/service/dto/MembershipDTO.java @@ -8,14 +8,13 @@ import org.springframework.context.ApplicationContext; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import java.io.Serializable; import java.time.LocalDate; import java.util.Objects; /** * A DTO for the Membership entity. */ -public class MembershipDTO extends FluentBuilder implements Serializable, AccessMappings { +public class MembershipDTO implements AccessMappings, FluentBuilder { @SelfId(resolver = MembershipService.class) @AccessFor(read = {Role.CONTRACTUAL_CONTACT, Role.FINANCIAL_CONTACT}) diff --git a/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonAccessFilterTestFixture.java b/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonAccessFilterTestFixture.java index 439f2990..29501f65 100644 --- a/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonAccessFilterTestFixture.java +++ b/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonAccessFilterTestFixture.java @@ -31,7 +31,7 @@ public class JSonAccessFilterTestFixture { return dto; } - static class GivenCustomerDto extends FluentBuilder { + static class GivenCustomerDto implements FluentBuilder { @SelfId(resolver = GivenService.class) @AccessFor(read = ANYBODY) Long id; @@ -44,7 +44,7 @@ public class JSonAccessFilterTestFixture { static abstract class GivenCustomerService implements IdToDtoResolver { } - static class GivenDto extends FluentBuilder { + static class GivenDto implements FluentBuilder { @SelfId(resolver = GivenService.class) @AccessFor(read = ANYBODY) Long id; @@ -109,7 +109,7 @@ public class JSonAccessFilterTestFixture { static abstract class GivenChildService implements IdToDtoResolver { } - public static class GivenChildDto extends FluentBuilder { + public static class GivenChildDto implements FluentBuilder { @SelfId(resolver = GivenChildService.class) @AccessFor(read = Role.ANY_CUSTOMER_USER) diff --git a/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonDeserializationWithAccessFilterUnitTest.java b/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonDeserializationWithAccessFilterUnitTest.java index 501e4d2a..bd97d358 100644 --- a/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonDeserializationWithAccessFilterUnitTest.java +++ b/src/test/java/org/hostsharing/hsadminng/service/accessfilter/JSonDeserializationWithAccessFilterUnitTest.java @@ -73,18 +73,20 @@ public class JSonDeserializationWithAccessFilterUnitTest { given(ctx.getAutowireCapableBeanFactory()).willReturn(autowireCapableBeanFactory); given(autowireCapableBeanFactory.createBean(GivenService.class)).willReturn(givenService); given(givenService.findOne(1234L)).willReturn(Optional.of(new GivenDto() - .with(dto -> dto.id = 1234L) - .with(dto -> dto.customerId = 888L) - .with(dto -> dto.openIntegerField = 11111) - .with(dto -> dto.openPrimitiveIntField = 2222) - .with(dto -> dto.openLongField = 33333333333333L) - .with(dto -> dto.openPrimitiveLongField = 44444444L) - .with(dto -> dto.openBooleanField = true) - .with(dto -> dto.openPrimitiveBooleanField = false) - .with(dto -> dto.openBigDecimalField = SOME_BIG_DECIMAL) - .with(dto -> dto.openStringField = "3333") - .with(dto -> dto.restrictedField = "initial value of restricted field") - .with(dto -> dto.restrictedBigDecimalField = SOME_BIG_DECIMAL) + .with( dto -> { + dto.id = 1234L; + dto.customerId = 888L; + dto.openIntegerField = 11111; + dto.openPrimitiveIntField = 2222; + dto.openLongField = 33333333333333L; + dto.openPrimitiveLongField = 44444444L; + dto.openBooleanField = true; + dto.openPrimitiveBooleanField = false; + dto.openBigDecimalField = SOME_BIG_DECIMAL; + dto.openStringField = "3333"; + dto.restrictedField = "initial value of restricted field"; + dto.restrictedBigDecimalField = SOME_BIG_DECIMAL; + }) )); given(autowireCapableBeanFactory.createBean(GivenCustomerService.class)).willReturn(givenCustomerService); given(givenCustomerService.findOne(888L)).willReturn(Optional.of(new GivenCustomerDto()