diff --git a/pom.xml b/pom.xml index 0d620e4fa701a6a789b828cafd9178cf9870ae23..b70b9355373f00d3b3067158cf2cbb8f2f8b753c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,4 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>de.itvsh.kop.eingangsadapter</groupId> @@ -12,7 +10,7 @@ <parent> <groupId>de.itvsh.kop.common</groupId> <artifactId>kop-common-parent</artifactId> - <version>1.1.0</version> + <version>1.1.1-SNAPSHOT</version> <relativePath /> <!-- lookup parent from repository --> </parent> @@ -28,7 +26,7 @@ <properties> <mapstruct.version>1.4.2.Final</mapstruct.version> - <pluto.version>0.24.0-SNAPSHOT</pluto.version> + <pluto.version>0.25.0-SNAPSHOT</pluto.version> <jsoup.version>1.14.3</jsoup.version> <xmlschema.version>2.3.0</xmlschema.version> @@ -62,6 +60,11 @@ <artifactId>pluto-interface</artifactId> <version>${pluto.version}</version> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-utils</artifactId> + <version>${pluto.version}</version> + </dependency> <dependency> <groupId>org.jsoup</groupId> @@ -83,6 +86,13 @@ <scope>test</scope> <version>${project.version}</version> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-utils</artifactId> + <version>${pluto.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> </dependencies> </dependencyManagement> @@ -142,4 +152,4 @@ </snapshotRepository> </distributionManagement> -</project> +</project> \ No newline at end of file diff --git a/router/pom.xml b/router/pom.xml index 9db3da5a3db3659922b60320f582fc762d81af61..34c0f8c80124d05a5a0f1842a970e7bae1f61753 100644 --- a/router/pom.xml +++ b/router/pom.xml @@ -1,6 +1,4 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>de.itvsh.kop.eingangsadapter</groupId> @@ -22,6 +20,10 @@ <groupId>de.itvsh.ozg.pluto</groupId> <artifactId>pluto-interface</artifactId> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-utils</artifactId> + </dependency> <!-- spring --> <dependency> @@ -48,6 +50,12 @@ <type>test-jar</type> <scope>test</scope> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-utils</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> </dependencies> <build> diff --git a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapper.java b/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapper.java index 7c43018f2b18a945b93168bd6b3d645fd9dc25e9..5dfff0087a58a7937c626fe8cc5f5d31f3b43277 100644 --- a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapper.java +++ b/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapper.java @@ -14,6 +14,7 @@ import com.google.protobuf.ByteString; import de.itvsh.kop.eingangsadapter.common.formdata.Antragsteller; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup; +import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper; import de.itvsh.ozg.pluto.vorgang.GrpcAntragsteller; import de.itvsh.ozg.pluto.vorgang.GrpcEingang; import de.itvsh.ozg.pluto.vorgang.GrpcIncomingFileGroup; diff --git a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapper.java b/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapper.java deleted file mode 100644 index 685746b090fb39bfba9ea537e1a3cc96eb5314c1..0000000000000000000000000000000000000000 --- a/router/src/main/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapper.java +++ /dev/null @@ -1,185 +0,0 @@ -package de.itvsh.kop.eingangsadapter.router; - -import java.util.Collection; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.tuple.Pair; -import org.mapstruct.CollectionMappingStrategy; -import org.mapstruct.Mapper; -import org.mapstruct.NullValueCheckStrategy; -import org.mapstruct.NullValuePropertyMappingStrategy; -import org.mapstruct.ReportingPolicy; - -import de.itvsh.ozg.pluto.vorgang.GrpcFormData; -import de.itvsh.ozg.pluto.vorgang.GrpcFormField; -import de.itvsh.ozg.pluto.vorgang.GrpcSubForm; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, // - unmappedSourcePolicy = ReportingPolicy.WARN, // - nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // - nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, // - collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) -public interface GrpcFormDataMapper { - - default GrpcFormData mapFormData(Map<String, Object> formData) { - return GrpcFormData.newBuilder() - .addAllField(mapToAllFields(formData)) - .addAllForm(mapToSubForms(formData)) - .addAllField(mapStringListsToFields(formData)) - .addAllForm(mapObjectListsToFields(formData)).build(); - } - - default List<GrpcFormField> mapToAllFields(Map<String, Object> formData) { - return formData.entrySet().stream().filter(entry -> entry.getValue() instanceof String)// - .map(entry -> mapToField(entry.getKey(), entry.getValue().toString()))// - .collect(Collectors.toList()); - } - - default List<GrpcFormField> mapStringListsToFields(Map<String, Object> formData) { - return formData.entrySet().stream() - .filter(entry -> entry.getValue() instanceof List) - .map(this::mapListStringElementsToFormFields) - .flatMap(List::stream) - .collect(Collectors.toList()); - } - - @SuppressWarnings("unchecked") - private List<GrpcFormField> mapListStringElementsToFormFields(Entry<String, Object> entry) { - return ((List<Object>) entry.getValue()).stream() - .filter(String.class::isInstance) - .map(String.class::cast) - .map(e -> mapToField(entry.getKey(), e)) - .collect(Collectors.toList()); - } - - default List<GrpcSubForm> mapObjectListsToFields(Map<String, Object> formData) { - return formData.entrySet().stream() - .filter(entry -> entry.getValue() instanceof List) - .map(this::mapListObjectElementsToFormFields) - .flatMap(List::stream) - .collect(Collectors.toList()); - } - - @SuppressWarnings("unchecked") - private List<GrpcSubForm> mapListObjectElementsToFormFields(Entry<String, Object> entry) { - return ((List<Object>) entry.getValue()).stream() - .filter(Map.class::isInstance) - .map(Map.class::cast) - .map(e -> buildSubForm(entry.getKey(), e)) - .collect(Collectors.toList()); - } - - @SuppressWarnings("unchecked") - default List<GrpcSubForm> mapToSubForms(Map<String, Object> formData) { - return formData.entrySet().stream() - .filter(entry -> entry.getValue() instanceof Map) - .map(entry -> buildSubForm(entry.getKey(), (Map<String, Object>) entry.getValue())) - .collect(Collectors.toList()); - } - - default GrpcSubForm buildSubForm(String name, Map<String, Object> map) { - return GrpcSubForm.newBuilder().setTitle(name) - .addAllField(mapToAllFields(map)) - .addAllSubForm(mapToSubForms(map)) - .addAllField(mapStringListsToFields(map)) - .addAllSubForm(mapObjectListsToFields(map)).build(); - } - - default GrpcFormField mapToField(String name, String value) { - return GrpcFormField.newBuilder().setName(name).setValue(value).build(); - } - - // TODO copied from de.itvsh.ozg.pluto.vorgang.GrpcFormDataMapper - // move to mapper util lib (OZG-1517) - default Map<String, Object> mapFromFormData(GrpcFormData formData) { - Map<String, Object> result = new HashMap<>(); - result.putAll(mapSubFormFields(formData.getFieldList())); - result.putAll(mapFormData(formData.getFormList())); - return result; - } - - default Map<String, Object> mapFormData(List<GrpcSubForm> subForms) { - return subForms.stream().map(subForm -> Pair.of(subForm.getTitle(), mapSubForm(subForm))) - .collect(HashMap<String, Object>::new, this::pairAccumulator, this::combiner); - } - - private Map<String, Object> pairAccumulator(Map<String, Object> map, Pair<String, Map<String, Object>> pair) { - return addToMap(map, pair.getLeft(), pair.getRight()); - } - - default Map<String, Object> mapSubForm(GrpcSubForm subForm) { - Map<String, Object> result = new HashMap<>(); - result.putAll(mapSubFormFields(subForm.getFieldList())); - result.putAll(mapFormData(subForm.getSubFormList())); - return result; - } - - default Map<String, Object> mapSubFormFields(List<GrpcFormField> fields) { - return fields.stream().collect(HashMap<String, Object>::new, this::accumulator, this::combiner); - } - - private Map<String, Object> accumulator(Map<String, Object> map, GrpcFormField field) { - return addToMap(map, field.getName(), field.getValue()); - } - - default Map<String, Object> combiner(Map<String, Object> map1, Map<String, Object> map2) { - for (Entry<String, Object> entry : map2.entrySet()) { - addToMap(map1, entry.getKey(), entry.getValue()); - } - - return map1; - } - - @SuppressWarnings("unchecked") - private Map<String, Object> addToMap(Map<String, Object> map, String name, Object value) { - var valueInMap = map.get(name); - if (Objects.isNull(valueInMap)) { - map.put(name, value); - } else { - if (value instanceof Collection) { - addCollectionValue(map, name, (Collection<Object>) value); - } else { - addNonCollectionValue(map, name, value); - } - } - - return map; - } - - @SuppressWarnings("unchecked") - private Map<String, Object> addCollectionValue(Map<String, Object> map, String name, Collection<Object> value) { - var valueInMap = map.get(name); - - var newList = new LinkedList<Object>(); - if (valueInMap instanceof Collection) { - newList.addAll((Collection<? extends Object>) valueInMap); - newList.addAll(value); - } else { - newList.add(valueInMap); - newList.addAll(value); - } - map.put(name, newList); - return map; - } - - @SuppressWarnings("unchecked") - private Map<String, Object> addNonCollectionValue(Map<String, Object> map, String name, Object value) { - var valueInMap = map.get(name); - - if (valueInMap instanceof Collection) { - var newList = new LinkedList<>((Collection<Object>) valueInMap); - newList.add(value); - map.put(name, newList); - } else { - map.put(name, new LinkedList<>(List.of(valueInMap, value))); - } - - return map; - } -} diff --git a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperITCase.java b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperITCase.java index e786ef04df9c4269a7070b1c74d328b65083ea0e..ddda82e1a8aa6d83490e92b2fff1b3c8b58b5982 100644 --- a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperITCase.java +++ b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperITCase.java @@ -17,6 +17,7 @@ import de.itvsh.kop.eingangsadapter.common.formdata.AntragstellerTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.ZustaendigsStelleTestFactory; +import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper; import de.itvsh.ozg.pluto.vorgang.GrpcEingang; import de.itvsh.ozg.pluto.vorgang.GrpcIncomingFile; diff --git a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperTest.java b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperTest.java index 8f1f1138b4450e104c07e4364ca1de9172df5abb..e17eed1b584a98db69c7354543247d7658ea06e3 100644 --- a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperTest.java +++ b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcEingangMapperTest.java @@ -16,6 +16,7 @@ import de.itvsh.kop.eingangsadapter.common.formdata.AntragstellerTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileTestFactory; import de.itvsh.kop.eingangsadapter.common.formdata.ZustaendigsStelleTestFactory; +import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper; import de.itvsh.ozg.pluto.vorgang.GrpcEingang; import de.itvsh.ozg.pluto.vorgang.GrpcFormData; import de.itvsh.ozg.pluto.vorgang.GrpcIncomingFile; @@ -31,7 +32,7 @@ class GrpcEingangMapperTest { @BeforeEach void mockMapperReturnValues() { - lenient().when(grpcFormDataMapper.mapFormData(anyMap())) + lenient().when(grpcFormDataMapper.mapToFormData(anyMap())) .thenReturn(GrpcFormData.newBuilder().addField(GrpcFormFieldTestFactory.create()).build()); } diff --git a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapperTest.java b/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapperTest.java deleted file mode 100644 index dd92cd280bc3cc4a62af6abcc0b12d0d3956c5f2..0000000000000000000000000000000000000000 --- a/router/src/test/java/de/itvsh/kop/eingangsadapter/router/GrpcFormDataMapperTest.java +++ /dev/null @@ -1,208 +0,0 @@ -package de.itvsh.kop.eingangsadapter.router; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mapstruct.factory.Mappers; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -import de.itvsh.ozg.pluto.vorgang.GrpcFormData; -import de.itvsh.ozg.pluto.vorgang.GrpcFormField; -import de.itvsh.ozg.pluto.vorgang.GrpcSubForm; - -class GrpcFormDataMapperTest { - - @InjectMocks - private GrpcFormDataMapper MAPPER_INSTANCE = Mappers.getMapper(GrpcFormDataMapper.class); - - @Mock - private GrpcFormDataMapper grpcFormDataMapper; - - @BeforeEach - void mockMapperReturnValues() { - lenient().when(grpcFormDataMapper.mapFormData(anyMap())) - .thenReturn(GrpcFormData.newBuilder().addField(GrpcFormFieldTestFactory.create()).build()); - } - - @Nested - class TestSimpleValueMapping { - - @Test - void shouldHaveField() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", "value")); - - assertThat(formData.getFieldList()).hasSize(1); - } - - @Test - void shouldNotHaveSubForms() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", "value")); - - assertThat(formData.getFormList()).isEmpty(); - } - - @Test - void shouldHaveNameField() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", "value")); - - assertThat(formData.getField(0).getName()).isEqualTo("key"); - assertThat(formData.getField(0).getValue()).isEqualTo("value"); - } - } - - @Nested - class TestSubFormMapping { - - @Test - void shouldHaveSubForm() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", Map.of("subKey", "value"))); - - assertThat(formData.getFormList()).hasSize(1); - } - - @Test - void shouldNotHaveFields() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", Map.of("subKey", "value"))); - - assertThat(formData.getFieldList()).isEmpty(); - } - - @Test - void shouldHaveSubFormField() { - - GrpcFormData formData = MAPPER_INSTANCE.mapFormData(Map.of("key", Map.of("subKey", "value"))); - - assertThat(formData.getForm(0).getFieldList()).hasSize(1); - assertThat(formData.getForm(0).getTitle()).isEqualTo("key"); - assertThat(formData.getForm(0).getField(0).getName()).isEqualTo("subKey"); - assertThat(formData.getForm(0).getField(0).getValue()).isEqualTo("value"); - } - } - - @Nested - class TestMapStringListsToFields { - - @Test - void emptyMapShouldNotBeMapped() { - - List<GrpcFormField> fields = MAPPER_INSTANCE.mapStringListsToFields(Collections.emptyMap()); - - assertThat(fields).isEmpty(); - } - - @Test - void simpleValueShouldNotBeMapped() { - - List<GrpcFormField> fields = MAPPER_INSTANCE.mapStringListsToFields(Map.of("a", "b")); - - assertThat(fields).isEmpty(); - } - - @Test - void listObjectValuesShouldBeMapped() { - - List<GrpcFormField> fields = MAPPER_INSTANCE.mapStringListsToFields(Map.of("key", List.of("value1", "value2"))); - - assertThat(fields).hasSize(2); - assertThat(fields.get(0).getName()).isEqualTo("key"); - assertThat(fields.get(0).getValue()).isEqualTo("value1"); - - assertThat(fields.get(1).getName()).isEqualTo("key"); - assertThat(fields.get(1).getValue()).isEqualTo("value2"); - } - } - - @Nested - class TestMapObjectListsToFields { - - @Test - void simpleValueShouldNotBeMapped() { - - List<GrpcSubForm> fields = MAPPER_INSTANCE.mapObjectListsToFields(Map.of("a", "b")); - - assertThat(fields).isEmpty(); - } - - @Test - void listOfSimpleValueShouldNotBeMapped() { - - List<GrpcSubForm> fields = MAPPER_INSTANCE.mapObjectListsToFields(Map.of("a", List.of("l1", "l2"))); - - assertThat(fields).isEmpty(); - } - - @Test - void listOfObjectsShouldBeMappedToSubForms() { - - List<GrpcSubForm> fields = MAPPER_INSTANCE - .mapObjectListsToFields(Map.of("key", List.of(Collections.emptyMap(), Collections.emptyMap()))); - - assertThat(fields).hasSize(2); - } - - @Test - void listOfObjectsShouldMappedToSubFormTitle() { - - List<GrpcSubForm> fields = MAPPER_INSTANCE - .mapObjectListsToFields(Map.of("key", List.of(Collections.emptyMap(), Collections.emptyMap()))); - - assertThat(fields.get(0).getTitle()).isEqualTo("key"); - assertThat(fields.get(1).getTitle()).isEqualTo("key"); - } - - @Test - void listOfObjectsShouldBeMapped() { - - List<GrpcSubForm> fields = MAPPER_INSTANCE - .mapObjectListsToFields(Map.of("key", List.of(Map.of("a1", "a2")))); - - assertThat(fields.get(0).getFieldCount()).isEqualTo(1); - assertThat(fields.get(0).getField(0).getName()).isEqualTo("a1"); - assertThat(fields.get(0).getField(0).getValue()).isEqualTo("a2"); - } - - @Test - void doubleNestedListObjectValuesShouldBeMapped() { - GrpcFormData formData = MAPPER_INSTANCE - .mapFormData(Map.of("key1", Map.of("key2", List.of("value1", "value2")))); - - assertThat(formData.getForm(0).getFieldCount()).isEqualTo(2); - } - - @Test - void multipleNestedListObjectValuesShouldBeMapped() { - GrpcFormData formData = MAPPER_INSTANCE - .mapFormData(Map.of("key1", Map.of("key2", Map.of("key3", List.of("value1", "value2"))))); - - assertThat(formData.getForm(0).getSubForm(0).getFieldCount()).isEqualTo(2); - } - } - - @Nested - class TestMapListOfMixedValuesInFormData { - - @Test - void shouldMapListOfStrings() { - - GrpcFormData formData = MAPPER_INSTANCE - .mapFormData(Map.of("key", List.of("value1", "value2", Map.of("internKey1", "internValue1")))); - - assertThat(formData.getFieldCount()).isEqualTo(2); - assertThat(formData.getFormCount()).isEqualTo(1); - } - } -}