diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java index 3625badb1df12642eefdcf36e40b4db3d1fb463a..906f065fd3096fd23ff31fb95b36edf5ab4efd4a 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandBodyMapper.java @@ -3,7 +3,9 @@ package de.itvsh.goofy.common.command; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Objects; +import java.util.function.Predicate; import java.util.stream.Collectors; import org.apache.commons.beanutils.BeanMap; @@ -16,10 +18,20 @@ import de.itvsh.ozg.pluto.grpc.command.GrpcCommandBodyField; @Mapper public interface CommandBodyMapper { + final Predicate<Entry<Object, Object>> HAS_NOT_NULL_VALUE = entry -> Objects.nonNull(entry.getValue()); + final Predicate<Entry<Object, Object>> IS_NOT_CLASS_VALUE = entry -> !StringUtils.equals("class", entry.getKey().toString()); + static final String VORGANG_ID_PROPERTY = "vorgangId"; static final String ITEM_NAME_PROPERTY = "itemName"; static final String ITEM_PROPERTY = "item"; + default Map<String, Object> fromObjectToMap(Object object) { + return new BeanMap(object).entrySet().stream() + .filter(HAS_NOT_NULL_VALUE) + .filter(IS_NOT_CLASS_VALUE) + .collect(Collectors.toMap(entry -> entry.getKey().toString(), Entry::getValue)); + } + default GrpcCommandBody mapToBody(Map<String, String> bodyMap) { if (Objects.isNull(bodyMap)) { return GrpcCommandBody.getDefaultInstance(); @@ -49,8 +61,8 @@ public interface CommandBodyMapper { } return bodyMap.entrySet().stream() - .filter(entry -> Objects.nonNull(entry.getValue())) - .filter(entry -> !StringUtils.equals(entry.getKey().toString(), "class")) + .filter(HAS_NOT_NULL_VALUE) + .filter(IS_NOT_CLASS_VALUE) .map(entry -> GrpcCommandBodyField.newBuilder().setName(entry.getKey().toString()).setValue(entry.getValue().toString()).build()) .collect(Collectors.toList()); } diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java index 1ef097ca88a39d71c9a271d55d2cfea39d387b33..bc35a6d14771b3822737b95cf2efa5d5b2677cf1 100644 --- a/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java +++ b/goofy-server/src/main/java/de/itvsh/goofy/common/command/CommandRemoteService.java @@ -1,13 +1,8 @@ package de.itvsh.goofy.common.command; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; import java.util.Optional; -import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.commons.beanutils.BeanMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -26,6 +21,8 @@ import net.devh.boot.grpc.client.inject.GrpcClient; @Service public class CommandRemoteService { + @GrpcClient("pluto") + private CommandServiceBlockingStub commandServiceStub; @Autowired private ContextService contextService; @Autowired @@ -35,9 +32,6 @@ public class CommandRemoteService { @Autowired private GrpcObjectMapper objectMapper; - @GrpcClient("pluto") - private CommandServiceBlockingStub commandServiceStub; - public Command createCommand(CreateCommand command, long version) { return doCreateCommand(buildCreateCommandRequest(command, version)); } @@ -59,7 +53,7 @@ public class CommandRemoteService { .setRelationId(command.getRelationId()) .setRelationVersion(version) .addAllBody(bodyMapper.mapToBodyFields(command.getBody())) - .setBodyObj(objectMapper.fromMap(getBodyAsMap(command.getBody()))) + .setBodyObj(objectMapper.fromMap(bodyMapper.fromObjectToMap(command.getBody()))) .setOrderString(command.getOrder().name()); Optional.ofNullable(command.getRedirectRequest()).map(mapper::toGrpcRedirectRequest).ifPresent(requestBuilder::setRedirectRequest); @@ -67,16 +61,6 @@ public class CommandRemoteService { return requestBuilder.build(); } - Map<String, Object> getBodyAsMap(CommandBody commandBody) { - return new BeanMap(commandBody).entrySet().stream() - .filter(this::isValidEntry) - .collect(Collectors.toMap(entry -> entry.getKey().toString(), Entry::getValue)); - } - - boolean isValidEntry(Entry<Object, Object> entry) { - return Objects.nonNull(entry.getKey()) && Objects.nonNull(entry.getValue()); - } - GrpcCreateCommandRequest buildCreateAttachedItemCommandRequest(CreateCommand command, String itemName) { return GrpcCreateCommandRequest.newBuilder() .setCallContext(contextService.createCallContext()) diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java index d575f4c02da188fe40337249da5530df5f4afb5b..89440b477474c51a4884bcf0f969f27b31656390 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandBodyMapperTest.java @@ -1,12 +1,11 @@ package de.itvsh.goofy.common.command; -import static org.assertj.core.api.Assertions.*; - import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; @@ -14,6 +13,8 @@ import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Spy; +import static org.assertj.core.api.Assertions.*; + import de.itvsh.goofy.common.binaryfile.BinaryFileTestFactory; import de.itvsh.goofy.postfach.PostfachMailTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; @@ -29,6 +30,48 @@ class CommandBodyMapperTest { @Spy private CommandBodyMapper mapper = Mappers.getMapper(CommandBodyMapper.class); + @DisplayName("Map from object to map") + @Nested + class TestFromObjectToMap { + + @Test + void shouldMapAllFieldsExceptClass() { + var commandAsObject = CommandTestFactory.create(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap).hasSize(5).doesNotContainKey("class"); + } + + @Test + void shouldNotMapNullValue() { + var commandAsObject = CommandTestFactory.createBuilder().status(null).build(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap) + .hasSize(4) + .doesNotContainKey("status") + .containsEntry("order", CommandTestFactory.ORDER) + .containsEntry("relationId", CommandTestFactory.RELATION_ID) + .containsEntry("vorgangId", CommandTestFactory.VORGANG_ID); + } + + @Test + void shouldMapAllValues() { + var commandAsObject = CommandTestFactory.create(); + + var mappedMap = mapper.fromObjectToMap(commandAsObject); + + assertThat(mappedMap) + .hasSize(5) + .containsEntry("status", CommandTestFactory.STATUS) + .containsEntry("order", CommandTestFactory.ORDER) + .containsEntry("relationId", CommandTestFactory.RELATION_ID) + .containsEntry("vorgangId", CommandTestFactory.VORGANG_ID); + } + } + @Nested class TestMapToBody { @Test diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java index e7f3da7f7ec1fc753f6c5a0d7ee39295782d8cd5..3b9794b4c12d1a7d2d96c35e805e0c758b02c2b6 100644 --- a/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java +++ b/goofy-server/src/test/java/de/itvsh/goofy/common/command/CommandRemoteServiceTest.java @@ -4,9 +4,7 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Collections; -import java.util.HashMap; import java.util.Map; -import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -27,7 +25,6 @@ import org.mockito.Spy; import static org.assertj.core.api.Assertions.*; import de.itvsh.goofy.common.callcontext.ContextService; -import de.itvsh.goofy.postfach.PostfachMailTestFactory; import de.itvsh.goofy.vorgang.RedirectRequestTestFactory; import de.itvsh.goofy.vorgang.VorgangHeaderTestFactory; import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; @@ -158,7 +155,7 @@ class CommandRemoteServiceTest { void shouldCallBodyMapper() { buildRequest(); - verify(bodyMapper).mapToBodyFields(any(CommandBody.class)); + verify(bodyMapper).fromObjectToMap(any(CommandBody.class)); } @Test @@ -200,51 +197,6 @@ class CommandRemoteServiceTest { CommandTestFactory.VERSION); } } - - @DisplayName("Get command body as map") - @Nested - class TestGetBodyAsMap { - - @Test - void shouldReturnMap() { - var bodyMap = service.getBodyAsMap(PostfachMailTestFactory.create()); - - assertThat(bodyMap).containsEntry("postfachId", PostfachMailTestFactory.POSTFACH_ID); - } - - @DisplayName("is valid entry") - @Nested - class TestIsValidEntry { - - @Test - void shouldReturnFalseOnNullKey() { - var isValidEntry = service.isValidEntry(createEntry(null, "huhu")); - - assertThat(isValidEntry).isFalse(); - } - - @Test - void shouldReturnFalseOnNullValue() { - var isValidEntry = service.isValidEntry(createEntry("huhu", null)); - - assertThat(isValidEntry).isFalse(); - } - - @Test - void shouldReturnFaoseOnValidEntry() { - var isValidEntry = service.isValidEntry(createEntry("huhu", "huhu")); - - assertThat(isValidEntry).isTrue(); - } - - private Entry<Object, Object> createEntry(Object key, Object value) { - var map = new HashMap<Object, Object>(); - map.put(key, value); - - return (Entry<Object, Object>) map.entrySet().toArray()[0]; - } - } - } } @Nested