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

OZG-1929 OZG-2280 WIP JSON Parsing, Mapping in SemanticAdapter

parent b1dc6dcb
Branches
Tags
No related merge requests found
Showing
with 420 additions and 137 deletions
...@@ -4,20 +4,29 @@ import java.time.ZonedDateTime; ...@@ -4,20 +4,29 @@ import java.time.ZonedDateTime;
public class FormHeaderTestFactory { public class FormHeaderTestFactory {
public static final String CLIENT_ID = "clientId";
public static final String CLIENT = "client";
public static final String CUSTOMER_ID = "customerId";
public static final String CUSTOMER = "customer";
public static final String SENDER = "sender";
public static final String FORM_NAME = "formName";
public static final String FORM_ID = "formId";
public static final String REQUEST_ID = "requestId";
public static FormHeader create() { public static FormHeader create() {
return createBuilder().build(); return createBuilder().build();
} }
public static FormHeader.FormHeaderBuilder createBuilder() { public static FormHeader.FormHeaderBuilder createBuilder() {
return FormHeader.builder() // return FormHeader.builder() //
.requestId("requestId") // .requestId(REQUEST_ID) //
.createdAt(ZonedDateTime.now()) // .createdAt(ZonedDateTime.now()) //
.formId("formId") // .formId(FORM_ID) //
.formName("formName") // .formName(FORM_NAME) //
.sender("sender") // .sender(SENDER) //
.customer("customer") // .customer(CUSTOMER) //
.customerId("customerId") // .customerId(CUSTOMER_ID) //
.client("client") // .client(CLIENT) //
.clientId("clientId"); .clientId(CLIENT_ID);
} }
} }
...@@ -11,6 +11,7 @@ public class FormSolutionsTestFactory { ...@@ -11,6 +11,7 @@ public class FormSolutionsTestFactory {
public static final String IDENTIFIER = "AS_123"; public static final String IDENTIFIER = "AS_123";
public static final String FIM_ID = "S12345678"; public static final String FIM_ID = "S12345678";
public static final List<String> LEIKA_IDS = List.of("123456890", "223456890"); public static final List<String> LEIKA_IDS = List.of("123456890", "223456890");
public static final String VORGANG_NUMMER = "KFAS_KOP_TEST-yCkgCdqG";
public static final String COMPONENT_ID = "Textfeld (einzeilig)"; public static final String COMPONENT_ID = "Textfeld (einzeilig)";
public static final String COMPONENT_VALUE = "kfjhkfjhk"; public static final String COMPONENT_VALUE = "kfjhkfjhk";
...@@ -42,7 +43,8 @@ public class FormSolutionsTestFactory { ...@@ -42,7 +43,8 @@ public class FormSolutionsTestFactory {
} }
}, },
"zustaendigeStelle": "5678", "zustaendigeStelle": "5678",
"postkorbhandle": "51522620-03d2-4507-b1f0-08d86920efed" "postkorbhandle": "51522620-03d2-4507-b1f0-08d86920efed",
"transactionId": "KFAS_KOP_TEST-yCkgCdqG"
}"""; }""";
public static final String NESTED_COMPONENTS_JSON = """ public static final String NESTED_COMPONENTS_JSON = """
{ {
......
...@@ -28,6 +28,10 @@ ...@@ -28,6 +28,10 @@
<groupId>de.itvsh.kop.eingangsadapter</groupId> <groupId>de.itvsh.kop.eingangsadapter</groupId>
<artifactId>router</artifactId> <artifactId>router</artifactId>
</dependency> </dependency>
<dependency>
<groupId>de.itvsh.kop.common</groupId>
<artifactId>kop-common-test</artifactId>
</dependency>
<!-- Spring --> <!-- Spring -->
<dependency> <dependency>
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import java.util.List;
@Getter @Getter
@Builder @Builder
class FormSolutionsEingangData { @JsonIgnoreProperties(ignoreUnknown = true)
class EingangData {
@JsonProperty("assistant") @JsonProperty("assistant")
private FsFormData formData; private FsFormData formData;
...@@ -21,10 +23,14 @@ class FormSolutionsEingangData { ...@@ -21,10 +23,14 @@ class FormSolutionsEingangData {
@JsonProperty("postkorbhandle") @JsonProperty("postkorbhandle")
private String postkorbHandle; private String postkorbHandle;
@JsonProperty("transactionId")
private String formId;
} }
@Getter @Getter
@Builder @Builder
@JsonIgnoreProperties("i18n")
class FsFormData { class FsFormData {
private String identifier; private String identifier;
private List<FsPanel> panels; private List<FsPanel> panels;
...@@ -40,14 +46,15 @@ class OzgContainer { ...@@ -40,14 +46,15 @@ class OzgContainer {
@Getter @Getter
@Builder @Builder
@JsonIgnoreProperties("needed")
class FsPanel { class FsPanel {
private String identifier; private String identifier;
private List<FsComponent> components; private List<FsComponent> components;
} }
@Getter @Getter
@JsonIgnoreProperties("needed")
@Builder @Builder
@JsonIgnoreProperties("needed")
class FsComponent { class FsComponent {
private String identifier; private String identifier;
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
import org.springframework.http.MediaType;
import de.itvsh.kop.eingangsadapter.common.formdata.Antragsteller; import de.itvsh.kop.eingangsadapter.common.formdata.Antragsteller;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData; import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
...@@ -6,18 +16,9 @@ import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader; ...@@ -6,18 +16,9 @@ import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup; import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
import de.itvsh.kop.eingangsadapter.common.formdata.ZustaendigeStelle; import de.itvsh.kop.eingangsadapter.common.formdata.ZustaendigeStelle;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.NullValueCheckStrategy;
import org.springframework.http.MediaType;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = { FormSolutionsFsFormDataMapper.class}) @Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, uses = { FsFormDataMapper.class })
interface FormSolutionsEingangDataMapper { interface EingangDataMapper {
String FILE_NAME_PDF_REP = "eingang.pdf"; String FILE_NAME_PDF_REP = "eingang.pdf";
String PDF_CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; String PDF_CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE;
String FILE_NAME_ZIP_ATTACHMENT = "attachments.zip"; String FILE_NAME_ZIP_ATTACHMENT = "attachments.zip";
...@@ -32,7 +33,7 @@ interface FormSolutionsEingangDataMapper { ...@@ -32,7 +33,7 @@ interface FormSolutionsEingangDataMapper {
@Mapping(target = "representations", expression = "java(mapPdfRepresentation(data.getPdf()))") @Mapping(target = "representations", expression = "java(mapPdfRepresentation(data.getPdf()))")
@Mapping(target = "numberOfRepresentations", constant = "1") @Mapping(target = "numberOfRepresentations", constant = "1")
@Mapping(target = "header", expression = "java(mapHeader(data))") @Mapping(target = "header", expression = "java(mapHeader(data))")
FormData map(FormSolutionsEingangData data); FormData map(EingangData data);
default List<IncomingFile> mapPdfRepresentation(byte[] pdf) { default List<IncomingFile> mapPdfRepresentation(byte[] pdf) {
if (Objects.isNull(pdf) || pdf.length == 0) { if (Objects.isNull(pdf) || pdf.length == 0) {
...@@ -67,19 +68,19 @@ interface FormSolutionsEingangDataMapper { ...@@ -67,19 +68,19 @@ interface FormSolutionsEingangDataMapper {
.build()); .build());
} }
default FormHeader mapHeader(FormSolutionsEingangData data) { default FormHeader mapHeader(EingangData data) {
return FormHeader.builder() return FormHeader.builder()
.formName(data.getFormData().getIdentifier()) .formName(data.getFormData().getIdentifier())
.build(); .build();
} }
default ZustaendigeStelle mapZustaendigeStelle(FormSolutionsEingangData data) { default ZustaendigeStelle mapZustaendigeStelle(EingangData data) {
return ZustaendigeStelle.builder() return ZustaendigeStelle.builder()
.organisationseinheitenId(data.getZustaendigeStelle()) .organisationseinheitenId(data.getZustaendigeStelle())
.build(); .build();
} }
default Antragsteller mapAntragsteller(FormSolutionsEingangData data) { default Antragsteller mapAntragsteller(EingangData data) {
return Antragsteller.builder().postfachId(data.getPostkorbHandle()).build(); return Antragsteller.builder().postfachId(data.getPostkorbHandle()).build();
} }
} }
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@Component import org.springframework.stereotype.Component;
class FormSolutionsMapper implements FormSolutionsEngineBasedMapper {
public static final String JSON_FIELD = "json";
@Autowired
private FormSolutionsEingangDataMapper mapper;
@Autowired import com.fasterxml.jackson.core.JsonProcessingException;
private ObjectMapper objectMapper; import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
@Override import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
public FormData parseFormData(FormData formData) { import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
return map(formData.getFormData());
}
FormData map(Map<String, Object> formData) { @Component
FormSolutionsEingangData data = parseJsonData((String) formData.get(JSON_FIELD)); class FormSolutionsMapper {
return mapper.map(data); private ObjectMapper objectMapper = new ObjectMapper();
}
FormSolutionsEingangData parseJsonData(String jsonData) { public FormData map(String json) {
try { try {
return objectMapper.readValue(jsonData, FormSolutionsEingangData.class); Map<String, Object> plainMap = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {
});
plainMap.put(SendFormEndpoint.JSON_FIELD, json);
return FormData.builder().formData(plainMap).build();
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
var msg = Optional.ofNullable(e.getCause()).map(Throwable::getMessage).orElseGet(e::getMessage); var msg = Optional.ofNullable(e.getCause()).map(Throwable::getMessage).orElseGet(e::getMessage);
throw new TechnicalException("Error parsing JSON from FromSolutions-Server: " + msg, e); throw new TechnicalException("Error parsing JSON from FromSolutions-Server: " + msg, e);
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy; import org.mapstruct.NullValueCheckStrategy;
...@@ -10,7 +10,7 @@ import java.util.function.Predicate; ...@@ -10,7 +10,7 @@ import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) @Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface FormSolutionsFsFormDataMapper { public interface FsFormDataMapper {
Predicate<FsComponent> HAS_CONTENT = component -> Objects.nonNull(component.getComponents()) Predicate<FsComponent> HAS_CONTENT = component -> Objects.nonNull(component.getComponents())
|| Objects.nonNull(component.getValue()); || Objects.nonNull(component.getValue());
Predicate<FsComponent> IS_NODE_COMPONENT = component -> Objects.isNull(component.getComponents()); Predicate<FsComponent> IS_NODE_COMPONENT = component -> Objects.isNull(component.getComponents());
......
package de.itvsh.kop.eingangsadapter.formsolutions; package de.itvsh.kop.eingangsadapter.formsolutions;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import de.itvsh.kop.eingangsadapter.router.VorgangService;
import de.itvsh.kop.eingangsadapter.semantik.enginebased.EngineBasedSemantikAdapter;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.ws.server.endpoint.annotation.Endpoint; import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot; import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload; import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload; import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import java.util.Map; import de.itvsh.kop.eingangsadapter.semantik.SemantikAdapter;
import java.util.UUID;
@Endpoint @Endpoint
public class SendFormEndpoint { public class SendFormEndpoint {
public static final String JSON_FIELD = "json"; public static final String JSON_FIELD = "json";
@Autowired @Autowired
private EngineBasedSemantikAdapter engineBasedSemantikAdapter; private FormSolutionsMapper incommingDataMapper;
@Autowired @Autowired
private VorgangService service; private SemantikAdapter semantikAdapter;
@PayloadRoot(namespace = WebServiceConfiguration.NAMESPACE_URI, localPart = "Request") @PayloadRoot(namespace = WebServiceConfiguration.NAMESPACE_URI, localPart = "Request")
@ResponsePayload @ResponsePayload
public Response receiveForm(@RequestPayload Request request) { public Response receiveForm(@RequestPayload Request request) {
var formData = parseRequestData(request.getJSON()); semantikAdapter.processFormData(incommingDataMapper.map(request.getJSON()));
formData = formData.toBuilder()
.representation(buildJsonRepresentation(request.getJSON()))
.numberOfRepresentations(formData.getNumberOfRepresentations() + 1)
.build();
service.createVorgang(formData);
return buildSuccessResponse(); return buildSuccessResponse();
} }
FormData parseRequestData(String json) {
var formData = FormData.builder().formData(Map.of(JSON_FIELD, json)).build();
return engineBasedSemantikAdapter.parseFormData(formData);
}
private IncomingFile buildJsonRepresentation(String json) {
return IncomingFile.builder()
.name("form-data.json")
.content(json.getBytes())
.contentType(MediaType.APPLICATION_JSON_VALUE)
.size(json.length())
.id(UUID.randomUUID().toString())
.build();
}
Response buildSuccessResponse() { Response buildSuccessResponse() {
var response = new Response(); var response = new Response();
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import java.util.List; import java.util.List;
import de.itvsh.kop.eingangsadapter.formsolutions.FsComponent;
class FormSolutionsComponentTestFactory { class FormSolutionsComponentTestFactory {
public static final String NODE_IDENTIFIER = "Name"; public static final String NODE_IDENTIFIER = "Name";
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
import static de.itvsh.kop.eingangsadapter.formsolutions.EingangDataMapper.*;
import static org.assertj.core.api.Assertions.*;
import java.nio.charset.StandardCharsets;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.mockito.InjectMocks; import org.mockito.InjectMocks;
import org.mockito.Mock; import org.mockito.Mock;
import java.nio.charset.StandardCharsets; import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*; import de.itvsh.kop.eingangsadapter.formsolutions.EingangDataMapper;
import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FormSolutionsEingangDataMapper.*; import de.itvsh.kop.eingangsadapter.formsolutions.FsFormDataMapper;
import static org.assertj.core.api.Assertions.*;
public class FormSolutionsEingangsDataMapperTest { public class FormSolutionsEingangsDataMapperTest {
@InjectMocks @InjectMocks
private FormSolutionsEingangDataMapper mapper = Mappers.getMapper(FormSolutionsEingangDataMapper.class); private EingangDataMapper mapper = Mappers.getMapper(EingangDataMapper.class);
@Mock @Mock
private FormSolutionsFsFormDataMapper formSolutionsFsFormDataMapper; private FsFormDataMapper formSolutionsFsFormDataMapper;
@Nested @Nested
class TestAttachments { class TestAttachments {
private FormData formData;
@BeforeEach
void init() {
formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
}
@Test @Test
void shouldHaveAttachments() { void shouldHaveAttachments() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getAttachments()).isNotEmpty(); assertThat(formData.getAttachments()).isNotEmpty();
} }
@Test @Test
void shouldHaveFileGroupName() { void shouldHaveFileGroupName() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getAttachments().get(0).getName()).isEqualTo(FILE_GROUP_ZIP_NAME); assertThat(formData.getAttachments().get(0).getName()).isEqualTo(FILE_GROUP_ZIP_NAME);
} }
@Test @Test
void shouldHaveName() { void shouldHaveName() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getName()).isEqualTo(FILE_NAME_ZIP_ATTACHMENT); assertThat(getFile(formData).getName()).isEqualTo(FILE_NAME_ZIP_ATTACHMENT);
} }
@Test @Test
void shouldHaveContentType() { void shouldHaveContentType() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getContentType()).isEqualTo(ZIP_CONTENT_TYPE); assertThat(getFile(formData).getContentType()).isEqualTo(ZIP_CONTENT_TYPE);
} }
@Test @Test
void shouldHaveSize() { void shouldHaveSize() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getSize()).isEqualTo(DECODED_CONTENT.length()); assertThat(getFile(formData).getSize()).isEqualTo(DECODED_CONTENT.length());
} }
...@@ -62,35 +67,38 @@ public class FormSolutionsEingangsDataMapperTest { ...@@ -62,35 +67,38 @@ public class FormSolutionsEingangsDataMapperTest {
@Nested @Nested
class TestRepresentations { class TestRepresentations {
private FormData formData;
@BeforeEach
void init() {
formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
}
@Test @Test
void shouldHaveRepresentations() { void shouldHaveRepresentations() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getRepresentations()).isNotEmpty(); assertThat(formData.getRepresentations()).isNotEmpty();
} }
@Test @Test
void shouldHaveName() { void shouldHaveName() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getName()).isEqualTo(FILE_NAME_PDF_REP); assertThat(getFile(formData).getName()).isEqualTo(FILE_NAME_PDF_REP);
} }
@Test @Test
void shouldHaveContentType() { void shouldHaveContentType() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getContentType()).isEqualTo(PDF_CONTENT_TYPE); assertThat(getFile(formData).getContentType()).isEqualTo(PDF_CONTENT_TYPE);
} }
@Test @Test
void shouldHaveContent() { void shouldHaveContent() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getContent()).isEqualTo(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8)); assertThat(getFile(formData).getContent()).isEqualTo(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8));
} }
@Test @Test
void shouldHaveSize() { void shouldHaveSize() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(getFile(formData).getSize()).isEqualTo(DECODED_CONTENT.length()); assertThat(getFile(formData).getSize()).isEqualTo(DECODED_CONTENT.length());
} }
...@@ -101,65 +109,60 @@ public class FormSolutionsEingangsDataMapperTest { ...@@ -101,65 +109,60 @@ public class FormSolutionsEingangsDataMapperTest {
@Nested @Nested
class TestZustaendigeStelle { class TestZustaendigeStelle {
private FormData formData;
@BeforeEach
void init() {
formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
}
@Test @Test
void shouldHaveZustaendigeStelle() { void shouldHaveZustaendigeStelle() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getZustaendigeStelle()).isNotNull(); assertThat(formData.getZustaendigeStelle()).isNotNull();
} }
@Test @Test
void shouldHaveOrganisationseinheitenId() { void shouldHaveOrganisationseinheitenId() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID); assertThat(formData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID);
} }
} }
@Nested @Nested
class TestHeader { class TestHeader {
private FormData formData;
@BeforeEach
void init() {
formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
}
@Test @Test
void shouldHaveHeader() { void shouldHaveHeader() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getHeader()).isNotNull(); assertThat(formData.getHeader()).isNotNull();
} }
@Test @Test
void shouldNotHaveFormId() { void shouldNotHaveFormId() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getHeader().getFormId()).isNull(); assertThat(formData.getHeader().getFormId()).isNull();
} }
@Test @Test
void shouldNotHaveFormName() { void shouldNotHaveFormName() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getHeader().getFormName()).isEqualTo(IDENTIFIER); assertThat(formData.getHeader().getFormName()).isEqualTo(IDENTIFIER);
} }
} }
@Nested @Nested
class TestAntragsteller { class TestAntragsteller {
private FormData formData;
@BeforeEach
void init() {
formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
}
@Test @Test
void shouldHaveAntragsteller() { void shouldHaveAntragsteller() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getAntragsteller()).isNotNull(); assertThat(formData.getAntragsteller()).isNotNull();
} }
@Test @Test
void shouldHavePostfachId() { void shouldHavePostfachId() {
var formData = mapper.map(FormSolutionsEingangsDataTestFactory.createEingangData());
assertThat(formData.getAntragsteller().getPostfachId()).isEqualTo(POSTFACH_ID); assertThat(formData.getAntragsteller().getPostfachId()).isEqualTo(POSTFACH_ID);
} }
} }
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
public class FormSolutionsEingangsDataTestFactory { public class FormSolutionsEingangsDataTestFactory {
public static FormSolutionsEingangData createEingangData() { public static EingangData createEingangData() {
return createEingangDataBuilder().build(); return createEingangDataBuilder().build();
} }
static FormSolutionsEingangData.FormSolutionsEingangDataBuilder createEingangDataBuilder() { static EingangData.EingangDataBuilder createEingangDataBuilder() {
return FormSolutionsEingangData.builder() return EingangData.builder()
.formData(createFsFormData()) .formData(createFsFormData())
.postkorbHandle(POSTFACH_ID) .postkorbHandle(POSTFACH_ID)
.zustaendigeStelle(ORGANISATIONSEINHEITEN_ID) .zustaendigeStelle(ORGANISATIONSEINHEITEN_ID)
.pdf(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8)) .pdf(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8))
.zip(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8)); .zip(DECODED_CONTENT.getBytes(StandardCharsets.UTF_8))
.formId(VORGANG_NUMMER);
} }
static FsFormData createFsFormData() { static FsFormData createFsFormData() {
......
package de.itvsh.kop.eingangsadapter.formsolutions;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.mockito.Spy;
public class FormSolutionsMapperTest {
@Spy
private FormSolutionsMapper mapper = new FormSolutionsMapper();
@Nested
class TestJsonToMapMapping {
@Test
void shouldMap() {
var dataMap = mapper.map(SIMPLE_JSON_DATA);
assertThat(dataMap).isNotNull();
}
}
}
package de.itvsh.kop.eingangsadapter.formsolutions;
import java.util.List;
import de.itvsh.kop.eingangsadapter.formsolutions.FsPanel;
class FormSolutionsPanelTestFactory {
static final String IDENTIFIER = "Kontaktdaten";
static FsPanel create() {
return createBuilder().build();
}
static FsPanel.FsPanelBuilder createBuilder() {
return FsPanel.builder()
.identifier(IDENTIFIER)
.components(List.of(FormSolutionsComponentTestFactory.createGroup()));
}
}
package de.itvsh.kop.eingangsadapter.semantik.enginebased; package de.itvsh.kop.eingangsadapter.formsolutions;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mapstruct.factory.Mappers; import org.mapstruct.factory.Mappers;
import org.mockito.Spy; import org.mockito.Spy;
import de.itvsh.kop.eingangsadapter.formsolutions.FsFormDataMapper;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FormSolutionsPanelTestFactory.*; import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsPanelTestFactory.*;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.anyList;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
public class FormSolutionsFsFormDataMapperTest { public class FsFormDataMapperTest {
@Spy @Spy
private FormSolutionsFsFormDataMapper mapper = Mappers.getMapper(FormSolutionsFsFormDataMapper.class); private FsFormDataMapper mapper = Mappers.getMapper(FsFormDataMapper.class);
@Nested @Nested
class TestMapPanel { class TestMapPanel {
......
package de.itvsh.kop.eingangsadapter.formsolutions; package de.itvsh.kop.eingangsadapter.formsolutions;
import de.itvsh.kop.eingangsadapter.router.VorgangService; import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
import static org.assertj.core.api.Assertions.*;
import java.util.Map;
import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
import java.util.Map; import de.itvsh.kop.common.test.TestUtils;
import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
import static org.assertj.core.api.Assertions.*;
@SpringBootTest @SpringBootTest
@ActiveProfiles({ "local", "itcase" }) @ActiveProfiles({ "local", "itcase" })
...@@ -19,12 +19,26 @@ class SendFormEndpointITCase { ...@@ -19,12 +19,26 @@ class SendFormEndpointITCase {
@SpyBean @SpyBean
private SendFormEndpoint endpoint; private SendFormEndpoint endpoint;
@MockBean
private VorgangService service;
@Nested @Nested
class TestParseSimpleJsonData { class TestParseExampleData {
@Test
void shouldParseData() {
var parsed = endpoint.parseRequestData(TestUtils.loadTextFile("form-data-001.json"));
assertThat(parsed).isNotNull();
}
@Test
void shouldContainEingangData() {
var parsed = endpoint.parseRequestData(TestUtils.loadTextFile("form-data-001.json"));
assertThat(parsed.getFormData()).isNotNull();
}
}
@Nested
class TestParseSimpleJsonData {
@Test @Test
void shouldParseData() { void shouldParseData() {
var parsed = endpoint.parseRequestData(SIMPLE_JSON_DATA); var parsed = endpoint.parseRequestData(SIMPLE_JSON_DATA);
...@@ -67,6 +81,10 @@ class SendFormEndpointITCase { ...@@ -67,6 +81,10 @@ class SendFormEndpointITCase {
void shouldParseRequestJSONData() { void shouldParseRequestJSONData() {
var parsedData = endpoint.parseRequestData(SIMPLE_JSON_DATA); var parsedData = endpoint.parseRequestData(SIMPLE_JSON_DATA);
assertThat(parsedData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID); assertThat(parsedData.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID);
var parsed = endpoint.parseRequestData(SIMPLE_JSON_DATA);
assertThat(parsed.getZustaendigeStelle().getOrganisationseinheitenId()).isEqualTo(ORGANISATIONSEINHEITEN_ID);
} }
} }
...@@ -86,8 +104,6 @@ class SendFormEndpointITCase { ...@@ -86,8 +104,6 @@ class SendFormEndpointITCase {
assertThat(parsed).isNotNull(); assertThat(parsed).isNotNull();
} }
@Test @Test
void shouldHaveComponents() { void shouldHaveComponents() {
var panel = parseAndGetPanel(); var panel = parseAndGetPanel();
...@@ -110,8 +126,7 @@ class SendFormEndpointITCase { ...@@ -110,8 +126,7 @@ class SendFormEndpointITCase {
} }
private Map<String, Object> parseAndGetComponent() { private Map<String, Object> parseAndGetComponent() {
var content =(Map<String, Object>)parseAndGetPanel().get(PANEL_ID); return (Map<String, Object>) parseAndGetPanel().get(PANEL_ID);
return content;
} }
private Map<String, Object> parseAndGetPanel() { private Map<String, Object> parseAndGetPanel() {
......
package de.itvsh.kop.eingangsadapter.semantik.enginebased;
import de.itvsh.kop.eingangsadapter.common.formdata.Antragsteller;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
public class FormSolutionsAntragstellerMapper implements FormSolutionsEngineBasedMapper {
public static final String POSTKORBHANDLE = "postkorbhandle";
@Override
public FormData parseFormData(FormData formData) {
return formData.toBuilder().antragsteller(Antragsteller.builder().postfachId((String) formData.getFormData().get(POSTKORBHANDLE)).build())
.build();
}
}
package de.itvsh.kop.eingangsadapter.semantik.enginebased;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
public class FormSolutionsAttachmentsMapper implements FormSolutionsEngineBasedMapper {
public static final String ZIP = "zip";
public static final String FILE_NAME_ZIP_ATTACHMENT = "attachments.zip";
public static final String ZIP_CONTENT_TYPE = "application/zip";
public static final String FILE_GROUP_ZIP_NAME = "gezippte Anhänge";
@Override
public FormData parseFormData(FormData formData) {
List<IncomingFileGroup> attachments = mapZipRepresentation((byte[]) formData.getFormData().get(ZIP));
return formData.toBuilder().attachments(attachments).numberOfAttachments(attachments.size()).build();
}
List<IncomingFileGroup> mapZipRepresentation(byte[] zip) {
if (Objects.isNull(zip) || zip.length == 0) {
return Collections.emptyList();
}
var files = List.of(IncomingFile.builder()
.name(FILE_NAME_ZIP_ATTACHMENT)
.content(zip)
.contentType(ZIP_CONTENT_TYPE)
.size(zip.length)
.build());
return List.of(IncomingFileGroup.builder()
.name(FILE_GROUP_ZIP_NAME)
.files(files)
.build());
}
}
package de.itvsh.kop.eingangsadapter.semantik.enginebased;
import java.util.Map;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.FormHeader;
public class FormSolutionsHeaderMapper implements FormSolutionsEngineBasedMapper {
public static final String IDENTIFIER = "identifier";
public static final String ASSISTANT = "assistant";
public static final String TRANSACTION_ID = "transactionId";
@Override
public FormData parseFormData(FormData formData) {
return formData.toBuilder().header(mapHeader(formData)).build();
}
@SuppressWarnings("unchecked")
FormHeader mapHeader(FormData formData) {
var assitantMap = (Map<String, Object>) formData.getFormData().get(ASSISTANT);
return FormHeader.builder()
.formName((String) assitantMap.get(IDENTIFIER))
.formId((String) formData.getFormData().get(TRANSACTION_ID))
.build();
}
}
package de.itvsh.kop.eingangsadapter.semantik.enginebased;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import com.google.common.collect.Maps;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
public class FormSolutionsPanelMapper implements FormSolutionsEngineBasedMapper {
public static final String IDENTIFIER = "identifier";
public static final String COMPONENTS = "components";
public static final String STRING_VALUE = "stringValue";
Predicate<Map<String, Object>> HAS_CONTENT = component -> Objects.nonNull(component.get(COMPONENTS))
|| Objects.nonNull(component.get(STRING_VALUE));
Predicate<Map<String, Object>> IS_NODE_COMPONENT = component -> Objects.isNull(component.get(COMPONENTS));
@Override
public FormData parseFormData(FormData formData) {
if (HAS_CONTENT.test(formData.getFormData())) {
return formData.toBuilder().formData(mapPanels((List<Map<String, Object>>) formData.getFormData())).build();
} else {
return formData;
}
}
Map<String, Object> mapPanels(List<Map<String, Object>> panels) {
return panels.stream().collect(Collectors.toMap(panel -> (String) panel.get(IDENTIFIER), panel -> mapComponents(panel.get(COMPONENTS))));
}
Map<String, Object> mapComponents(Object components) {
if (components instanceof Map) {
return (Map<String, Object>) ((Map) components).values().stream().filter(HAS_CONTENT)
.collect(Collectors.toMap(component -> (String) component.get(IDENTIFIER),
this::mapComponent));
} else {
return Maps.newHashMap();
}
}
Object mapComponent(Map<String, Object> component) {
if (IS_NODE_COMPONENT.test(component)) {
return component.get(STRING_VALUE);
} else {
return mapComponents(component.get(COMPONENTS));
}
}
}
package de.itvsh.kop.eingangsadapter.semantik.enginebased;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import org.springframework.http.MediaType;
import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
public class FormSolutionsRepresentationsMapper implements FormSolutionsEngineBasedMapper {
public static final String JSON = "json";
public static final String FILE_NAME_JSON_REP = "form-data.json";
public static final String JSON_CONTENT_TYPE = MediaType.APPLICATION_JSON_VALUE;
public static final String PDF = "pdf";
public static final String FILE_NAME_PDF_REP = "eingang.pdf";
public static final String PDF_CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE;
@Override
public FormData parseFormData(FormData formData) {
List<IncomingFile> representations = new ArrayList<IncomingFile>(mapPdfRepresentation((byte[]) formData.getFormData().get(PDF)));
representations.add(mapJsonRepresentation((String) formData.getFormData().get(JSON)));
formData = formData.toBuilder().representations(representations).numberOfRepresentations(representations.size()).build();
return formData;
}
List<IncomingFile> mapPdfRepresentation(byte[] pdf) {
if (Objects.isNull(pdf) || pdf.length == 0) {
return Collections.emptyList();
}
return List.of(IncomingFile.builder()
.content(pdf)
.contentType(PDF_CONTENT_TYPE)
.size(pdf.length)
.name(FILE_NAME_PDF_REP)
.build());
}
private IncomingFile mapJsonRepresentation(String json) {
return IncomingFile.builder()
.name(FILE_NAME_JSON_REP)
.content(json.getBytes())
.contentType(MediaType.APPLICATION_JSON_VALUE)
.size(json.length())
.id(UUID.randomUUID().toString())
.build();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment