Skip to content
Snippets Groups Projects
Commit ca89f461 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-1517 use formDataMaper from pluto-utils

parent cde5f193
Branches
Tags
No related merge requests found
Showing
with 27 additions and 474 deletions
......@@ -137,6 +137,13 @@
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.itvsh.ozg.pluto</groupId>
<artifactId>pluto-utils</artifactId>
<type>test-jar</type>
<scope>test</scope>
<version>${pluto.version}</version>
</dependency>
<dependency>
<groupId>com.thedeanda</groupId>
......
......@@ -136,8 +136,8 @@ public class ExceptionController {
}
private Optional<DynamicViolationParameter> getDynamicPayload(ConstraintViolation<?> violation) {
var hibernateViolation = violation.unwrap(HibernateConstraintViolation.class);
return Optional.ofNullable((DynamicViolationParameter) hibernateViolation.getDynamicPayload(DynamicViolationParameter.class));
HibernateConstraintViolation<?> hibernateViolation = violation.unwrap(HibernateConstraintViolation.class);
return Optional.ofNullable(hibernateViolation.getDynamicPayload(DynamicViolationParameter.class));
}
@ExceptionHandler(TechnicalException.class)
......
......@@ -4,6 +4,7 @@ import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
import org.mapstruct.NullValuePropertyMappingStrategy;
import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper;
import de.itvsh.ozg.pluto.vorgang.GrpcAntragsteller;
@Mapper(uses = { GrpcFormDataMapper.class }, //
......
package de.itvsh.goofy.vorgang;
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 org.apache.commons.lang3.tuple.Pair;
import org.mapstruct.CollectionMappingStrategy;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
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.GrpcFormField;
import de.itvsh.ozg.pluto.vorgang.GrpcSubForm;
@Mapper(uses = { AntragstellerMapper.class,
EingangHeaderMapper.class, ZustaendigeStelleMapper.class }, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
EingangHeaderMapper.class, ZustaendigeStelleMapper.class,
GrpcFormDataMapper.class }, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
interface EingangMapper {
@Mapping(source = "formData", target = "formData")
Eingang fromGrpc(GrpcEingang eingang);
default Map<String, Object> mapFormData(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;
}
}
package de.itvsh.goofy.vorgang;
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)
interface GrpcFormDataMapper {
default GrpcFormData mapToFormData(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();
}
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;
}
}
......@@ -202,6 +202,7 @@ class CommandBodyMapperTest {
assertThat(mappedItemMap).contains(attachmentsEntry);
}
@SuppressWarnings("unchecked")
private Map<String, Object> getMappedItemEntry() {
return (Map<String, Object>) mapToBodyMap().get(CommandBodyMapper.ITEM_PROPERTY);
}
......
......@@ -33,10 +33,12 @@ public class ExceptionTestFactory {
return ExceptionTestFactory.buildMockedConstraintViolationWithDynamicPayload(null);
}
public static ConstraintViolation<?> buildMockedConstraintViolationWithDynamicPayload(DynamicViolationParameter dynamicViolationParameter) {
var violation = mock(ConstraintViolation.class);
var hibernateViolation = mock(HibernateConstraintViolation.class);
var constraintDescriptor = mock(ConstraintDescriptor.class);
@SuppressWarnings({ "rawtypes", "unchecked" })
public static <T> ConstraintViolation<T> buildMockedConstraintViolationWithDynamicPayload(DynamicViolationParameter dynamicViolationParameter) {
ConstraintViolation violation = mock(ConstraintViolation.class);
HibernateConstraintViolation hibernateViolation = mock(HibernateConstraintViolation.class);
ConstraintDescriptor constraintDescriptor = mock(ConstraintDescriptor.class);
var path = mock(Path.class);
when(path.toString()).thenReturn(PATH);
when(violation.getPropertyPath()).thenReturn(path);
......
......@@ -8,6 +8,8 @@ import org.mapstruct.factory.Mappers;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper;
class AntragstellerMapperTest {
@InjectMocks
......
package de.itvsh.goofy.vorgang;
import static de.itvsh.goofy.vorgang.GrpcSubFormTestFactory.*;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
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 org.mockito.Spy;
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.GrpcSubForm;
class EingangMapperTest {
......@@ -30,6 +24,8 @@ class EingangMapperTest {
private AntragstellerMapper antragstellerMapper;
@Mock
private EingangHeaderMapper eingangHeaderMapper;
@Spy
private GrpcFormDataMapper formDataMapper = Mappers.getMapper(GrpcFormDataMapper.class);
@Nested
class TestGrpcEingangToEingang {
......@@ -79,184 +75,5 @@ class EingangMapperTest {
assertThat(eingang.getAntragsteller()).isNull();
assertThat(eingang.getHeader()).isNull();
}
@DisplayName("Mapped SubFormField")
@Nested
class TestSubFormFieldMapping {
private final GrpcSubForm subForm = GrpcSubFormTestFactory.create();
@Test
void shouldContainField() {
var mapped = mapper.mapSubFormFields(subForm.getFieldList());
assertThat(mapped).containsKey(FIELD_NAME);
}
@Test
void shouldContainValue() {
var mapped = mapper.mapSubFormFields(subForm.getFieldList());
assertThat(mapped).containsEntry(FIELD_NAME, FIELD_VALUE);
}
@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"));
}
}
}
@DisplayName("Mapped FormData")
@Nested
class TestMapGrpcSubFormToSubForm {
@Test
void shouldNotBeEmpty() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
var eingang = mapper.fromGrpc(grpcEingang);
assertThat(eingang.getFormData()).isNotEmpty();
}
@Test
void shouldHaveMappedSubForm() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
var eingang = mapper.fromGrpc(grpcEingang);
assertThat(eingang.getFormData()).containsKey(TITLE);
}
@DisplayName("mapped FormData should contain fields")
@Test
void fieldsInSubForm() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
var eingang = mapper.fromGrpc(grpcEingang);
@SuppressWarnings("unchecked")
Map<String, Object> formData = (Map<String, Object>) eingang.getFormData().get(TITLE);
assertThat(formData).containsEntry(FIELD_NAME, FIELD_VALUE);
}
@DisplayName("mapped FormData should contains subForm")
@Test
void shouldHaveMappedSubFormWithSubForm() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
var eingang = mapper.fromGrpc(grpcEingang);
@SuppressWarnings("unchecked")
Map<String, Object> formData = (Map<String, Object>) eingang.getFormData().get(TITLE);
assertThat(formData).containsKey(GrpcSubFormTestFactory.SUBFORM_NAME);
}
@DisplayName("mapped SubForm should contain List of SubForms")
@Test
void shouldHaveMappedListOfSubForms() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.createBuilder().setFormData(GrpcFormData.newBuilder()
.addForm(GrpcSubFormTestFactory.create())
.addForm(GrpcSubFormTestFactory.create())
.build()).build();
var eingang = mapper.fromGrpc(grpcEingang);
@SuppressWarnings("unchecked")
var formData = (List<Map<String, Object>>) eingang.getFormData().get(TITLE);
assertThat(formData).contains(EingangTestFactory.AS_MAP, EingangTestFactory.AS_MAP);
}
@DisplayName("mapped SubForm should contain field")
@Test
void subFormShouldContainField() {
GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
var eingang = mapper.fromGrpc(grpcEingang);
@SuppressWarnings("unchecked")
Map<String, Object> subForm = (Map<String, Object>) ((Map<String, Object>) eingang.getFormData().get(TITLE)).get(SUBFORM_NAME);
assertThat(subForm).containsEntry(SUBFORM_FIELD_NAME, SUBFORM_FIELD_VALUE);
}
}
}
}
\ No newline at end of file
......@@ -15,6 +15,7 @@ import org.mapstruct.factory.Mappers;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import de.itvsh.kop.pluto.common.grpc.GrpcFormDataMapper;
import de.itvsh.ozg.pluto.vorgang.GrpcFormData;
import de.itvsh.ozg.pluto.vorgang.GrpcFormField;
import de.itvsh.ozg.pluto.vorgang.GrpcSubForm;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment