diff --git a/pluto-utils/pom.xml b/pluto-utils/pom.xml index 0c5d7a2588c59d795f8797c973b3034e20514c90..613685990f4bb953c202e1033da7e2fc3d8c2dc8 100644 --- a/pluto-utils/pom.xml +++ b/pluto-utils/pom.xml @@ -40,7 +40,7 @@ <version>1.9.0-SNAPSHOT</version> <properties> - <pluto.version>1.8.0-SNAPSHOT</pluto.version> + <pluto.version>1.9.0-SNAPSHOT</pluto.version> <maven-compiler-plugin.version>3.10.1</maven-compiler-plugin.version> <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version> @@ -100,6 +100,12 @@ <artifactId>assertj-core</artifactId> <scope>test</scope> </dependency> + + <!-- commons --> + <dependency> + <groupId>commons-beanutils</groupId> + <artifactId>commons-beanutils</artifactId> + </dependency> </dependencies> <build> diff --git a/pluto-utils/src/main/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapper.java b/pluto-utils/src/main/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapper.java index a91550795befdc3662de8fee871a0fd133575544..b4ae99a05170947abf68a4767437a366dfde9cd6 100644 --- a/pluto-utils/src/main/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapper.java +++ b/pluto-utils/src/main/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapper.java @@ -30,7 +30,9 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; +import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.mapstruct.CollectionMappingStrategy; @@ -53,6 +55,9 @@ public interface GrpcFormDataMapper { String VALUE_KEY = "value"; String LABEL_KEY = "label"; + String CONTROL_DATA_KEY = "_kopControlData"; + String LABELS_KEY = "labels"; + default GrpcFormData mapToFormData(Map<String, Object> formData) { return GrpcFormData.newBuilder() .addAllField(mapToAllFields(formData)) @@ -63,10 +68,18 @@ public interface GrpcFormDataMapper { 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()))// + .map(entry -> mapToField(entry.getKey(), entry.getValue().toString(), getFieldLabel(formData, entry.getKey())))// .toList(); } + default Optional<String> getFieldLabel(Map<String, Object> formData, String key) { + return getControlData(formData) + .map(controlData -> controlData.get(LABELS_KEY)) + .map(Map.class::cast) + .map(labelsmap -> labelsmap.get(key)) + .map(String.class::cast); + } + default List<GrpcFormField> mapStringListsToFields(Map<String, Object> formData) { return formData.entrySet().stream() .filter(entry -> entry.getValue() instanceof List) @@ -80,7 +93,7 @@ public interface GrpcFormDataMapper { return ((List<Object>) entry.getValue()).stream() .filter(String.class::isInstance) .map(String.class::cast) - .map(e -> mapToField(entry.getKey(), e)) + .map(e -> mapToField(entry.getKey(), e, Optional.empty())) .toList(); } @@ -109,16 +122,32 @@ public interface GrpcFormDataMapper { .toList(); } + default Optional<String> getSubFormLabel(Map<String, Object> map) { + return getControlData(map).map(controlData -> controlData.get(LABEL_KEY)).map(Object::toString); + } + default GrpcSubForm buildSubForm(String name, Map<String, Object> map) { - return GrpcSubForm.newBuilder().setTitle(name) + var subFormBuilder = GrpcSubForm.newBuilder(); + getLabel(map).ifPresent(subFormBuilder::setLabel); + return subFormBuilder.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(); + default Optional<String> getLabel(Map<String, Object> map) { + return getControlData(map).map(controlData -> controlData.get(LABEL_KEY)).map(Object::toString); + } + + default Optional<Map<String, Object>> getControlData(Map<String, Object> formData) { + return Optional.ofNullable(MapUtils.getMap(formData, CONTROL_DATA_KEY)).map(Map.class::cast); + } + + default GrpcFormField mapToField(String name, String value, Optional<String> label) { + var formFieldBuilder = GrpcFormField.newBuilder().setName(name).setValue(value); + label.ifPresent(formFieldBuilder::setLabel); + return formFieldBuilder.build(); } default Map<String, Object> mapFromFormData(GrpcFormData formData) { diff --git a/pluto-utils/src/test/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapperTest.java b/pluto-utils/src/test/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapperTest.java index 20a049e20f7a0d64c4cb293b48a465a0873bfb90..cac2415723102b3ac15e16cab51e922a9d883c0a 100644 --- a/pluto-utils/src/test/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapperTest.java +++ b/pluto-utils/src/test/java/de/itvsh/kop/pluto/common/grpc/GrpcFormDataMapperTest.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.collections.MapUtils; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -103,108 +104,200 @@ class GrpcFormDataMapperTest { } } - @DisplayName("Mapped SubFormField") + @DisplayName("buildSubForm") @Nested - class TestSubFormFieldMapping { + class TestBuildSubFormWithLabel { - private final GrpcSubForm subForm = GrpcSubFormTestFactory.create(); + @DisplayName("with label") + @Nested + class TestWithLabel { - @Test - void shouldContainField() { - var mapped = mapper.mapSubFormFields(subForm.getFieldList()); + public static final String NODE_ATTRIBUTES = "nodeAttributes"; + public static final String NODE_ATTRIBUTES_LABEL = "nodeAttributesLabel"; - assertThat(mapped).containsKey(GrpcSubFormTestFactory.FIELD_NAME); - } + public static final String SUB_KEY = "subKey"; + public static final String SUB_VALUE = "subValue"; - @Test - void shouldContainValue() { - var mapped = mapper.mapSubFormFields(subForm.getFieldList()); + private final Map<String, Object> map = Map.of( + SUB_KEY, SUB_VALUE, + GrpcFormDataMapper.CONTROL_DATA_KEY, Map.of( + GrpcFormDataMapper.LABEL_KEY, NODE_ATTRIBUTES_LABEL)); - assertThat(mapped).containsEntry(GrpcSubFormTestFactory.FIELD_NAME, GrpcSubFormTestFactory.FIELD_VALUE); + @Test + void shouldContainField() { + var mapped = mapper.buildSubForm(NODE_ATTRIBUTES, map); + + assertThat(mapped.getLabel()).isEqualTo(NODE_ATTRIBUTES_LABEL); + } } + } + @DisplayName("Map to all fields") + @Nested + class TestMapToField { + + @DisplayName("with label") @Nested - class TestCombiner { - @Test - void missingInMap2ShouldContainValue() { - Map<String, Object> map1 = Map.of("TEST", "VALUE1"); - Map<String, Object> map2 = Map.of(); + class TestWithLabel { - var combined = mapper.combiner(map1, map2); + public static final String KEY = "subKey"; + public static final String VALUE = "subValue"; + public static final String LABEL = "NewSubKeyLabel"; - assertThat(combined).containsEntry("TEST", "VALUE1"); - } + private final Map<String, Object> map = Map.of(KEY, VALUE, + GrpcFormDataMapper.CONTROL_DATA_KEY, Map.of( + GrpcFormDataMapper.LABELS_KEY, Map.of(KEY, LABEL))); @Test - void missingInMap1ShouldContainValue() { - Map<String, Object> map1 = new HashMap<>(); - Map<String, Object> map2 = Map.of("TEST", "VALUE1"); - - var combined = mapper.combiner(map1, map2); + void shouldHaveSetLabel() { + var mapped = mapper.mapToAllFields(map); - assertThat(combined).containsEntry("TEST", "VALUE1"); + assertThat(mapped.get(0).getLabel()).isEqualTo(LABEL); } + } + } - @Test - void inBothMapShouldCombineToList() { - Map<String, Object> map1 = new HashMap<>(Map.of("TEST", "VALUE1")); - Map<String, Object> map2 = Map.of("TEST", "VALUE2"); + @DisplayName("Mapped SubForm") + @Nested + class TestSubFormFieldMapping { - var combined = mapper.combiner(map1, map2); + @DisplayName("field") + @Nested + class TestField { - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); - } + private final GrpcSubForm subForm = GrpcSubFormTestFactory.create(); @Test - void listInMap2ShouldStayAList() { - Map<String, Object> map1 = Map.of("TEST", List.of("VALUE1", "VALUE2")); - Map<String, Object> map2 = Map.of(); + void shouldContainField() { + var mapped = mapper.mapSubFormFields(subForm.getFieldList()); - var combined = mapper.combiner(map1, map2); - - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); + assertThat(mapped).containsKey(GrpcSubFormTestFactory.FIELD_NAME); } @Test - void valueInMap1ShouldBeAddedToList() { - Map<String, Object> map1 = new HashMap<>(Map.of("TEST", "VALUE1")); - Map<String, Object> map2 = Map.of("TEST", List.of("VALUE2", "VALUE3")); - - var combined = mapper.combiner(map1, map2); + void shouldContainValue() { + var mapped = mapper.mapSubFormFields(subForm.getFieldList()); - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3")); + assertThat(mapped).containsEntry(GrpcSubFormTestFactory.FIELD_NAME, GrpcSubFormTestFactory.FIELD_VALUE); } + } - @Test - void valueInMap2ShouldBeAddedToList() { - Map<String, Object> map1 = new HashMap<>(Map.of("TEST", List.of("VALUE1", "VALUE2"))); - Map<String, Object> map2 = Map.of("TEST", "VALUE3"); + @DisplayName("field with label") + @Nested + class TestFieldWithLabel { + + private final GrpcSubForm subForm = GrpcSubFormTestFactory.createWithLabels(); - var combined = mapper.combiner(map1, map2); + @Test + void shouldContainField() { + var mapped = mapper.mapSubFormFields(subForm.getFieldList()); - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3")); + assertThat(mapped).containsKey(GrpcSubFormTestFactory.FIELD_NAME); } @Test - void listInMap1ShouldStayAList() { - Map<String, Object> map1 = new HashMap<>(); - Map<String, Object> map2 = Map.of("TEST", List.of("VALUE1", "VALUE2")); + void shouldContainValue() { + var mapped = mapper.mapSubFormFields(subForm.getFieldList()); - var combined = mapper.combiner(map1, map2); - - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); + assertThat(getMapFromMap(mapped, GrpcSubFormTestFactory.FIELD_NAME)).containsEntry("value", GrpcSubFormTestFactory.FIELD_VALUE); } @Test - void listInBothMapsShouldByCombined() { - Map<String, Object> map1 = new HashMap<>(Map.of("TEST", List.of("VALUE1", "VALUE2"))); - Map<String, Object> map2 = Map.of("TEST", List.of("VALUE3", "VALUE4")); - - var combined = mapper.combiner(map1, map2); + void shouldHaveLabel() { + var mapped = mapper.mapSubFormFields(subForm.getFieldList()); - assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3", "VALUE4")); + assertThat(getMapFromMap(mapped, GrpcSubFormTestFactory.FIELD_NAME)).containsEntry("label", + GrpcSubFormTestFactory.FIELD_LABEL); } } + + @SuppressWarnings("unchecked") + private Map<String, Object> getMapFromMap(Map<String, Object> map, String key) { + return MapUtils.getMap(map, key); + } + } + + @Nested + class TestCombiner { + @Test + void missingInMap2ShouldContainValue() { + Map<String, Object> map1 = Map.of("TEST", "VALUE1"); + Map<String, Object> map2 = Map.of(); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", "VALUE1"); + } + + @Test + void missingInMap1ShouldContainValue() { + Map<String, Object> map1 = new HashMap<>(); + Map<String, Object> map2 = Map.of("TEST", "VALUE1"); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", "VALUE1"); + } + + @Test + void inBothMapShouldCombineToList() { + Map<String, Object> map1 = new HashMap<>(Map.of("TEST", "VALUE1")); + Map<String, Object> map2 = Map.of("TEST", "VALUE2"); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); + } + + @Test + void listInMap2ShouldStayAList() { + Map<String, Object> map1 = Map.of("TEST", List.of("VALUE1", "VALUE2")); + Map<String, Object> map2 = Map.of(); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); + } + + @Test + void valueInMap1ShouldBeAddedToList() { + Map<String, Object> map1 = new HashMap<>(Map.of("TEST", "VALUE1")); + Map<String, Object> map2 = Map.of("TEST", List.of("VALUE2", "VALUE3")); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3")); + } + + @Test + void valueInMap2ShouldBeAddedToList() { + Map<String, Object> map1 = new HashMap<>(Map.of("TEST", List.of("VALUE1", "VALUE2"))); + Map<String, Object> map2 = Map.of("TEST", "VALUE3"); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3")); + } + + @Test + void listInMap1ShouldStayAList() { + Map<String, Object> map1 = new HashMap<>(); + Map<String, Object> map2 = Map.of("TEST", List.of("VALUE1", "VALUE2")); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2")); + } + + @Test + void listInBothMapsShouldByCombined() { + Map<String, Object> map1 = new HashMap<>(Map.of("TEST", List.of("VALUE1", "VALUE2"))); + Map<String, Object> map2 = Map.of("TEST", List.of("VALUE3", "VALUE4")); + + var combined = mapper.combiner(map1, map2); + + assertThat(combined).containsEntry("TEST", List.of("VALUE1", "VALUE2", "VALUE3", "VALUE4")); + } } @Nested @@ -320,178 +413,37 @@ class GrpcFormDataMapperTest { } } - @DisplayName("Map with existing labels") + @DisplayName("Map formData") @Nested - class TestMapWithExistingLabels { - - private static final String FIELD_LABEL = "Alternative field label"; + class TestMapFormData { - private final GrpcFormData formData = GrpcFormDataTestFactory.createBuilder() - .clearField().addField(GrpcFormFieldTestFactory.createBuilder().setLabel(FIELD_LABEL)) - .addForm(GrpcSubFormTestFactory.createWithLabelsBuilder()) - .build(); - - @DisplayName("field") + @DisplayName("with subForm") @Nested - class TestField { - - @Test - void shouldHaveSize() { - var mappedFormData = mapFromFormData(); - - var fieldMap = getValueAsMap(mappedFormData, GrpcFormFieldTestFactory.NAME); - assertThat(fieldMap).hasSize(2); - } - - @Test - void shouldContainsValue() { - var mappedFormData = mapFromFormData(); - - var fieldMap = getValueAsMap(mappedFormData, GrpcFormFieldTestFactory.NAME); - assertThat(fieldMap).containsEntry(GrpcFormDataMapper.VALUE_KEY, GrpcFormFieldTestFactory.VALUE); - } - - @Test - void shouldContainsLabel() { - var mappedFormData = mapFromFormData(); - - var fieldMap = getValueAsMap(mappedFormData, GrpcFormFieldTestFactory.NAME); - assertThat(fieldMap).containsEntry(GrpcFormDataMapper.LABEL_KEY, FIELD_LABEL); - } - } - - @DisplayName("form") - @Nested - class TestForm { - - @Test - void shouldMapAsValueLabelMap() { - var mappedFormData = mapFromFormData(); - - var subFormMap = getValueAsMap(mappedFormData, GrpcSubFormTestFactory.TITLE); - assertThat(subFormMap).hasSize(2) - .containsKey(GrpcFormDataMapper.VALUE_KEY) - .containsEntry(GrpcFormDataMapper.LABEL_KEY, GrpcSubFormTestFactory.LABEL); - } - - @Test - void shouldContainsMapOfFieldsAndSubForms() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormValueMap(mappedFormData)).hasSize(2).containsKeys(GrpcSubFormTestFactory.FIELD_NAME, - GrpcSubFormTestFactory.SUBFORM_TITLE); - } - - private Map<String, Object> getFormValueMap(Map<String, Object> formData) { - var formMap = getValueAsMap(formData, GrpcSubFormTestFactory.TITLE); - return getValueAsMap(formMap, GrpcFormDataMapper.VALUE_KEY); - } + class TestSubForm { - @DisplayName("field") + @DisplayName("contains label") @Nested - class TestField { + class TestContainsLabel { @Test - void shouldHaveSize() { - var mappedFormData = mapFromFormData(); + void shouldHaveSetValue() { + var mappedData = mapper.mapFormData(GrpcSubFormTestFactory.createWithLabels().getSubFormList()); - assertThat(getFormValueFieldMap(mappedFormData)).hasSize(2); + assertThat(getSubForm(mappedData)).containsKeys(GrpcFormDataMapper.VALUE_KEY, GrpcFormDataMapper.VALUE_KEY); } @Test - void shouldContainsValue() { - var mappedFormData = mapFromFormData(); + void shouldHaveSetLabel() { + var mappedData = mapper.mapFormData(GrpcSubFormTestFactory.createWithLabels().getSubFormList()); - assertThat(getFormValueFieldMap(mappedFormData)).containsEntry(GrpcFormDataMapper.VALUE_KEY, - GrpcSubFormTestFactory.FIELD_VALUE); + assertThat(getSubForm(mappedData)).containsEntry(GrpcFormDataMapper.LABEL_KEY, GrpcSubFormTestFactory.SUBFORM_LABEL); } - @Test - void shouldContainsLabel() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormValueFieldMap(mappedFormData)).containsEntry(GrpcFormDataMapper.LABEL_KEY, - GrpcSubFormTestFactory.FIELD_LABEL); - } - - private Map<String, Object> getFormValueFieldMap(Map<String, Object> formData) { - return getValueAsMap(getFormValueMap(formData), GrpcSubFormTestFactory.FIELD_NAME); + @SuppressWarnings("unchecked") + private Map<String, Object> getSubForm(Map<String, Object> map) { + return MapUtils.getMap(map, GrpcSubFormTestFactory.SUBFORM_TITLE); } } - - @DisplayName("subForm") - @Nested - class TestSubForm { - - @Test - void shouldHaveSize() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormValueSubFormMap(mappedFormData)).hasSize(2); - } - - @Test - void shouldContainsValue() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormValueSubFormMap(mappedFormData)).containsKey(GrpcFormDataMapper.VALUE_KEY); - } - - @Test - void shouldContainsLabel() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormValueSubFormMap(mappedFormData)).containsEntry(GrpcFormDataMapper.LABEL_KEY, - GrpcSubFormTestFactory.SUBFORM_LABEL); - } - - private Map<String, Object> getFormValueSubFormMap(Map<String, Object> formData) { - return getValueAsMap(getFormValueMap(formData), GrpcSubFormTestFactory.SUBFORM_TITLE); - } - - @DisplayName("field") - @Nested - class TestSubFormField { - - @Test - void shouldHaveSize() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormFieldSubFormMap(mappedFormData)).hasSize(2); - } - - @Test - void shouldContainsValue() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormFieldSubFormMap(mappedFormData)) - .containsEntry(GrpcFormDataMapper.VALUE_KEY, GrpcSubFormTestFactory.SUBFORM_FIELD_VALUE); - } - - @Test - void shouldContainsLabel() { - var mappedFormData = mapFromFormData(); - - assertThat(getFormFieldSubFormMap(mappedFormData)) - .containsEntry(GrpcFormDataMapper.LABEL_KEY, GrpcSubFormTestFactory.SUBFORM_FIELD_LABEL); - } - - private Map<String, Object> getFormFieldSubFormMap(Map<String, Object> formData) { - var subFormFieldMap = getValueAsMap(getFormValueMap(formData), GrpcSubFormTestFactory.SUBFORM_TITLE); - var subFormFieldValueMap = getValueAsMap(subFormFieldMap, GrpcFormDataMapper.VALUE_KEY); - return getValueAsMap(subFormFieldValueMap, GrpcSubFormTestFactory.SUBFORM_FIELD_NAME); - } - } - } - } - - private Map<String, Object> mapFromFormData() { - return mapper.mapFromFormData(formData); - } - - @SuppressWarnings("unchecked") - private Map<String, Object> getValueAsMap(Map<String, Object> map, String key) { - return (Map<String, Object>) map.get(key); } } -} +} \ No newline at end of file