From 8f92f7ea6d6c327dc3443f476e9fcc949c046d6b Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 14 Jun 2023 10:13:51 +0200
Subject: [PATCH] OZG-3956 use jackson for parsing file data

---
 .../formdata/FormSolutionsTestFactory.java    |   3 +
 .../formsolutions/FileDataDeserializer.java   |  34 ++++
 .../FormSolutionsAttachmentsMapper.java       |  33 +---
 .../formsolutions/FormSolutionsEingang.java   |  29 +++
 .../FormSolutionsRepresentationsMapper.java   |  84 ---------
 .../FormSolutionsRequestMapper.java           |  52 +++---
 .../FormSolutionsAttachmentsMapperTest.java   |  29 ++-
 .../FormSolutionsEingangTestFactory.java      |  18 ++
 .../FormSolutionsFilesTestFactory.java        |   3 -
 ...ormSolutionsRepresentationsMapperTest.java | 168 ------------------
 .../FormSolutionsRequestMapperITCase.java     |   4 +-
 .../FormSolutionsRequestMapperTest.java       | 152 +++++++---------
 pom.xml                                       |   2 +-
 .../FormSolutionsEngineBasedAdapter.java      |   2 +-
 .../FormSolutionsHeaderMapper.java            |   2 +-
 .../FormSolutionsPanelMapper.java             |   2 +-
 .../formsolutions/IdentifierValueParser.java  |   2 +-
 .../FormSolutionsAntragstellerMapperTest.java |   8 +-
 .../FormSolutionsHeaderTestFactory.java       |   2 +-
 .../FormSolutionsPanelTestFactory.java        |  22 +--
 .../IdentifierValueParserTest.java            |   8 +-
 21 files changed, 236 insertions(+), 423 deletions(-)
 create mode 100644 formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FileDataDeserializer.java
 create mode 100644 formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingang.java
 delete mode 100644 formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
 create mode 100644 formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingangTestFactory.java
 delete mode 100644 formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java

diff --git a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/FormSolutionsTestFactory.java b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/FormSolutionsTestFactory.java
index 072b5f876..f7b544448 100644
--- a/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/FormSolutionsTestFactory.java
+++ b/common/src/test/java/de/itvsh/kop/eingangsadapter/common/formdata/FormSolutionsTestFactory.java
@@ -41,8 +41,11 @@ public class FormSolutionsTestFactory {
 	public static final String DATE_COMPONENT_ID = "Datums- / Uhrzeitfeld";
 	public static final String DATE_COMPONENT_VALUE = "22.05.1996";
 	public static final String ZIP_VALUE = "TG9yZW0gaXBzdW0=";
+	public static final String ZIP_VALUE_DECODED = "Lorem ipsum";
 	public static final String PDF_VALUE = "TG9yZW0gaXBzdW0=";
+	public static final String PDF_VALUE_DECODED = "Lorem ipsum";
 	public static final String ZUSTAENDIGE_STELLE_VALUE = "zustaendigeStelle";
+	public static final String ZUSTAENDIGE_STELLE = "5678";
 	public static final String POSTFACH_ID_STELLE = "51522620-03d2-4507-b1f0-08d86920efed";
 	public static final String FORM_ID_VALUE = "KFAS_KOP_TEST-yCkgCdqG";
 	// TODO vereinfachen und in Dateien packen
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FileDataDeserializer.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FileDataDeserializer.java
new file mode 100644
index 000000000..f19dd1212
--- /dev/null
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FileDataDeserializer.java
@@ -0,0 +1,34 @@
+package de.itvsh.kop.eingangsadapter.formsolutions;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import com.fasterxml.jackson.core.JacksonException;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
+import lombok.SneakyThrows;
+
+public class FileDataDeserializer extends StdDeserializer<File> {
+
+	protected FileDataDeserializer() {
+		super(File.class);
+	}
+
+	@SneakyThrows
+	@Override
+	public File deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
+		var tempFile = TempFileUtils.createTmpFile();
+
+		try (var out = new FileOutputStream(tempFile.toFile())) {
+			p.readBinaryValue(out);
+			out.flush();
+		}
+
+		return tempFile.toFile();
+	}
+
+}
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
index 3c55f9a47..43e8508ac 100644
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapper.java
@@ -23,13 +23,10 @@
  */
 package de.itvsh.kop.eingangsadapter.formsolutions;
 
-import java.util.ArrayList;
+import java.io.File;
+import java.util.Collections;
 import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
 
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
@@ -43,16 +40,11 @@ class FormSolutionsAttachmentsMapper {
 	public static final String ZIP_CONTENT_TYPE = "application/zip";
 	public static final String FILE_GROUP_ZIP_NAME = "gezippte Anhänge";
 
-	List<IncomingFileGroup> mapAttachments(Map<String, Object> data) {
-		return mapZipRepresentation(Optional.ofNullable((String) data.get(ZIP)));
-	}
-
-	List<IncomingFileGroup> mapZipRepresentation(Optional<String> encodedZip) {
-		return encodedZip.filter(StringUtils::isNoneEmpty)
-				.map(this::buildZipFile)
-				.map(this::buildFileGroup)
-				.map(this::buildMutableList)
-				.orElseGet(ArrayList::new);
+	public List<IncomingFileGroup> mapAttachments(File zipFile) {
+		if (zipFile.length() > 0) {
+			return Collections.singletonList(buildFileGroup(buildZipFile(zipFile)));
+		}
+		return Collections.emptyList();
 	}
 
 	private IncomingFileGroup buildFileGroup(IncomingFile zipFile) {
@@ -62,18 +54,11 @@ class FormSolutionsAttachmentsMapper {
 				.build();
 	}
 
-	private IncomingFile buildZipFile(String content) {
+	private IncomingFile buildZipFile(File zipFile) {
 		return IncomingFile.builder()
-				.id(UUID.randomUUID().toString())
-				.file(FormSolutionsFileMapperUtils.decodeBase64Content(content))
+				.file(zipFile)
 				.contentType(ZIP_CONTENT_TYPE)
 				.name(FILE_NAME_ZIP_ATTACHMENT)
 				.build();
 	}
-
-	private List<IncomingFileGroup> buildMutableList(IncomingFileGroup fileGroup) {
-		var list = new ArrayList<IncomingFileGroup>();
-		list.add(fileGroup);
-		return list;
-	}
 }
\ No newline at end of file
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingang.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingang.java
new file mode 100644
index 000000000..9cbc0b409
--- /dev/null
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingang.java
@@ -0,0 +1,29 @@
+package de.itvsh.kop.eingangsadapter.formsolutions;
+
+import java.io.File;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+import lombok.Builder;
+import lombok.Getter;
+import lombok.extern.jackson.Jacksonized;
+
+@Getter
+@Builder
+@Jacksonized
+public class FormSolutionsEingang {
+
+	private Map<String, Object> assistant;
+
+	private String postkorbhandle;
+	private String transactionId;
+	private String zustaendigeStelle;
+	@JsonProperty("gemeindeschlüssel")
+	private String gemeindeSchluessel;
+
+	private File pdf;
+	@JsonDeserialize(using = FileDataDeserializer.class)
+	private File zip;
+}
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
deleted file mode 100644
index 7293fb0f6..000000000
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.eingangsadapter.formsolutions;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.http.MediaType;
-import org.springframework.stereotype.Component;
-
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
-
-@Component
-class FormSolutionsRepresentationsMapper {
-
-	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;
-
-	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 TMP_FILE_PREFIX = "filecached-inputstream-fs";
-	public static final String TMP_FILE_SUFFIX = ".ozg-cloud.tmp";
-
-	List<IncomingFile> mapRepresentations(Map<String, Object> plainMap, File jsonFile) {
-		List<IncomingFile> representations = new ArrayList<>();
-
-		Optional.ofNullable((String) plainMap.get(PDF))
-				.filter(StringUtils::isNoneEmpty)
-				.ifPresent(data -> representations.add(buildPdfFile(data)));
-
-		representations.add(buildJsonFile(jsonFile));
-
-		return representations;
-	}
-
-	private IncomingFile buildJsonFile(File jsonFile) {
-		return IncomingFile.builder()
-				.file(jsonFile)
-				.contentType(JSON_CONTENT_TYPE)
-				.name(FILE_NAME_JSON_REP)
-				.size(jsonFile.length())
-				.build();
-	}
-
-	private IncomingFile buildPdfFile(String data) {
-		File file = FormSolutionsFileMapperUtils.decodeBase64Content(data);
-
-		return IncomingFile.builder()
-				.file(file)
-				.contentType(PDF_CONTENT_TYPE)
-				.name(FILE_NAME_PDF_REP)
-				.size(file.length())
-				.build();
-	}
-
-}
\ No newline at end of file
diff --git a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java
index 4d81e9306..a3e77e735 100644
--- a/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java
+++ b/formsolutions-adapter/src/main/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapper.java
@@ -27,8 +27,10 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.Map;
+import java.util.Objects;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.stereotype.Component;
 
 import com.fasterxml.jackson.core.type.TypeReference;
@@ -36,51 +38,59 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.eingangsadapter.common.formdata.FormData;
-import de.itvsh.kop.eingangsadapter.common.formdata.FormDataUtils;
-import de.itvsh.kop.eingangsadapter.semantik.enginebased.FilesMapperHelper;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
 
 @Component
 class FormSolutionsRequestMapper {
 	static final TypeReference<Map<String, Object>> VALUE_TYPE_REF = new TypeReference<Map<String, Object>>() {
 	};
 
+	static final String FILE_NAME_JSON_REPRESENTATION = "form-data.json";
+	static final String FILE_NAME_PDF_REPRESENTATION = "eingang.pdf";
+
 	@Autowired
 	private FormSolutionsAttachmentsMapper attachmentMapper;
 	@Autowired
-	private FormSolutionsRepresentationsMapper representationMapper;
-	@Autowired
 	private ObjectMapper objectMapper;
 
 	public FormData map(File jsonFile) {
-		var formData = buildFormData(jsonFile);
+		var eingang = mapEingang(jsonFile);
 
-		return mapFiles(formData, jsonFile);
-	}
+		var builder = FormData.builder()
+				.formData(Map.of("assistant", eingang.getAssistant()))
+				.attachments(attachmentMapper.mapAttachments(eingang.getZip()))
+				.representation(buildJsonFile(jsonFile));
 
-	private FormData buildFormData(File jsonFile) {
-		return FormData.builder().formData(mapFormData(jsonFile)).build();
+		if (Objects.nonNull(eingang.getPdf())) {
+			builder.representation(buildPdfFile(eingang.getPdf()));
+		}
+
+		return builder.build();
 	}
 
-	Map<String, Object> mapFormData(File jsonFile) {
+	FormSolutionsEingang mapEingang(File jsonFile) {
 		try (var in = new FileInputStream(jsonFile)) {
-			return objectMapper.readValue(in, VALUE_TYPE_REF);
+			return objectMapper.readValue(in, FormSolutionsEingang.class);
 		} catch (IOException e) {
 			throw new TechnicalException("Error parsing JSON from FormSolutions-Server", e);
 		}
 	}
 
-	FormData mapFiles(FormData formData, File jsonFile) {
-		return FormDataUtils.from(formData)
-				.put(FilesMapperHelper.FIELD_NAME_MAPPED_FILES, buildMappedFiles(formData, jsonFile))
-				.remove(FormSolutionsAttachmentsMapper.ZIP)
-				.remove(FormSolutionsRepresentationsMapper.PDF)
+	private IncomingFile buildJsonFile(File jsonFile) {
+		return IncomingFile.builder()
+				.file(jsonFile)
+				.contentType(MediaType.APPLICATION_JSON_VALUE)
+				.name(FILE_NAME_JSON_REPRESENTATION)
+				.size(jsonFile.length())
 				.build();
-
 	}
 
-	private Map<String, Object> buildMappedFiles(FormData formData, File jsonFile) {
-		return Map.of(
-				FilesMapperHelper.ATTACHMENTS, attachmentMapper.mapAttachments(formData.getFormData()),
-				FilesMapperHelper.REPRESENTATIONS, representationMapper.mapRepresentations(formData.getFormData(), jsonFile));
+	private IncomingFile buildPdfFile(File pdfFile) {
+		return IncomingFile.builder()
+				.file(pdfFile)
+				.contentType(MediaType.APPLICATION_PDF_VALUE)
+				.name(FILE_NAME_PDF_REPRESENTATION)
+				.size(pdfFile.length())
+				.build();
 	}
 }
\ No newline at end of file
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapperTest.java
index 35bf7169c..a9190021e 100644
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapperTest.java
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsAttachmentsMapperTest.java
@@ -27,46 +27,65 @@ import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsAttachment
 import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 
+import java.io.File;
 import java.util.List;
 
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
 
 import de.itvsh.kop.common.test.TestUtils;
+import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
 import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
 import lombok.SneakyThrows;
 
 class FormSolutionsAttachmentsMapperTest {
-	private FormSolutionsAttachmentsMapper mapper = new FormSolutionsAttachmentsMapper();
+
+	@InjectMocks
+	private FormSolutionsAttachmentsMapper mapper;
+
+	private File zipFile;
+
+	@BeforeEach
+	void writeZipFile() {
+		zipFile = TempFileUtils.writeTmpFile(ZIP_DECODED);
+	}
+
+	@AfterEach
+	void delZipFile() {
+		zipFile.delete();
+	}
 
 	@Nested
 	class TestAttachmentsMapping {
 		@Test
 		@SneakyThrows
 		void shouldParseZip() {
-			var map = mapper.mapAttachments(FormSolutionsFilesTestFactory.create().getFormData());
+			var map = mapper.mapAttachments(zipFile);
 
 			assertThat(TestUtils.contentStreamToByteArray(getAttachment(map).getContentStream())).isEqualTo(ZIP_DECODED);
 		}
 
 		@Test
 		void shouldSetContentType() {
-			var map = mapper.mapAttachments(FormSolutionsFilesTestFactory.create().getFormData());
+			var map = mapper.mapAttachments(zipFile);
 
 			assertThat(getAttachment(map).getContentType()).isEqualTo(ZIP_CONTENT_TYPE);
 		}
 
 		@Test
 		void shouldSetFileName() {
-			var map = mapper.mapAttachments(FormSolutionsFilesTestFactory.create().getFormData());
+			var map = mapper.mapAttachments(zipFile);
 
 			assertThat(getAttachment(map).getName()).isEqualTo(FILE_NAME_ZIP_ATTACHMENT);
 		}
 
 		@Test
 		void shouldSetGroupName() {
-			var map = mapper.mapAttachments(FormSolutionsFilesTestFactory.create().getFormData());
+			var map = mapper.mapAttachments(zipFile);
 
 			assertThat(map.get(0).getName()).isEqualTo(FILE_GROUP_ZIP_NAME);
 		}
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingangTestFactory.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingangTestFactory.java
new file mode 100644
index 000000000..6ccca7c66
--- /dev/null
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsEingangTestFactory.java
@@ -0,0 +1,18 @@
+package de.itvsh.kop.eingangsadapter.formsolutions;
+
+import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
+
+public class FormSolutionsEingangTestFactory {
+
+	public static FormSolutionsEingang create() {
+		return createBuilder().build();
+	}
+
+	public static FormSolutionsEingang.FormSolutionsEingangBuilder createBuilder() {
+		return FormSolutionsEingang.builder()
+				.zustaendigeStelle(ZUSTAENDIGE_STELLE)
+				.postkorbhandle(POSTFACH_ID_STELLE)
+				.transactionId(FORM_ID_VALUE);
+
+	}
+}
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFilesTestFactory.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFilesTestFactory.java
index 48a893289..9abc61f73 100644
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFilesTestFactory.java
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsFilesTestFactory.java
@@ -24,7 +24,6 @@
 package de.itvsh.kop.eingangsadapter.formsolutions;
 
 import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsAttachmentsMapper.*;
-import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsRepresentationsMapper.*;
 
 import java.util.Base64;
 import java.util.Map;
@@ -40,8 +39,6 @@ public class FormSolutionsFilesTestFactory {
 
 	public static final String JSON_CONTENT = "{}";
 
-	public static final FormData REPRESENTATIONS = FormSolutionsFilesTestFactory.createBuilder().formData(Map.of(PDF, PDF_ENCODED)).build();
-
 	public static FormData create() {
 		return FormSolutionsFilesTestFactory.createBuilder().build();
 	}
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java
deleted file mode 100644
index 928aed3a3..000000000
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRepresentationsMapperTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (C) 2022-2023 Das Land Schleswig-Holstein vertreten durch den
- * Ministerpräsidenten des Landes Schleswig-Holstein
- * Staatskanzlei
- * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
- *
- * Lizenziert unter der EUPL, Version 1.2 oder - sobald
- * diese von der Europäischen Kommission genehmigt wurden -
- * Folgeversionen der EUPL ("Lizenz");
- * Sie dürfen dieses Werk ausschließlich gemäß
- * dieser Lizenz nutzen.
- * Eine Kopie der Lizenz finden Sie hier:
- *
- * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
- *
- * Sofern nicht durch anwendbare Rechtsvorschriften
- * gefordert oder in schriftlicher Form vereinbart, wird
- * die unter der Lizenz verbreitete Software "so wie sie
- * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
- * ausdrücklich oder stillschweigend - verbreitet.
- * Die sprachspezifischen Genehmigungen und Beschränkungen
- * unter der Lizenz sind dem Lizenztext zu entnehmen.
- */
-package de.itvsh.kop.eingangsadapter.formsolutions;
-
-import static de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory.*;
-import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsFilesTestFactory.*;
-import static de.itvsh.kop.eingangsadapter.formsolutions.FormSolutionsRepresentationsMapper.*;
-import static org.assertj.core.api.Assertions.*;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import org.junit.jupiter.api.AfterEach;
-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.mockito.Spy;
-
-import de.itvsh.kop.common.test.TestUtils;
-import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
-import de.itvsh.kop.eingangsadapter.common.formdata.FormSolutionsTestFactory;
-import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFile;
-import lombok.SneakyThrows;
-
-class FormSolutionsRepresentationsMapperTest {
-
-	@Spy
-	private FormSolutionsRepresentationsMapper mapper = new FormSolutionsRepresentationsMapper();
-
-	private File simpleJsonFile;
-
-	@BeforeEach
-	void writeJsonFile() {
-		simpleJsonFile = TempFileUtils.writeTmpFile(SIMPLE_JSON_DATA);
-	}
-
-	@AfterEach
-	void delJsonFile() {
-		simpleJsonFile.delete();
-	}
-
-	@DisplayName("Map representations")
-	@Nested
-	class TestMapRepresentations {
-
-		@DisplayName("pdf")
-		@Nested
-		class TestPdfRepresentations {
-
-			@Test
-			@SneakyThrows
-			void shouldSetContentStrean() {
-				var representation = mapRepresentationPdf();
-
-				assertThat(TestUtils.contentStreamToByteArray(representation.getContentStream())).isEqualTo(PDF_DECODED);
-			}
-
-			@Test
-			void shouldSetHaveContentType() {
-				var representation = mapRepresentationPdf();
-
-				assertThat(representation.getContentType()).isEqualTo(PDF_CONTENT_TYPE);
-			}
-
-			@Test
-			void shouldSetName() {
-				var representation = mapRepresentationPdf();
-
-				assertThat(representation.getName()).isEqualTo(FILE_NAME_PDF_REP);
-			}
-
-			@Test
-			void shouldSetSize() {
-				var representation = mapRepresentationPdf();
-
-				assertThat(representation.getSize()).isEqualTo(FormSolutionsFilesTestFactory.PDF_DECODED.length);
-			}
-
-			private IncomingFile mapRepresentationPdf() {
-				return mapRepresentation().get(0);
-			}
-		}
-
-		@DisplayName("json")
-		@Nested
-		class TestJsonRepresentation {
-
-			@Test
-			void shouldHaveSize() {
-				var map = mapRepresentation();
-
-				assertThat(map).hasSize(2);
-			}
-
-			@Test
-			@SneakyThrows
-			void shouldSetContentStream() {
-				var representation = mapRepresentationJson();
-
-				assertThat(TestUtils.contentStreamToByteArray(representation.getContentStream()))
-						.isEqualTo(FormSolutionsTestFactory.SIMPLE_JSON_DATA.getBytes());
-			}
-
-			@Test
-			void shouldSetContentType() {
-				var representation = mapRepresentationJson();
-
-				assertThat(representation.getContentType()).isEqualTo(JSON_CONTENT_TYPE);
-			}
-
-			@Test
-			void shouldSetName() {
-				var representation = mapRepresentationJson();
-
-				assertThat(representation.getName()).isEqualTo(FILE_NAME_JSON_REP);
-			}
-
-			@Test
-			void shouldSetSize() {
-				var representation = mapRepresentationJson();
-
-				assertThat(representation.getSize()).isEqualTo(SIMPLE_JSON_DATA.getBytes().length);
-			}
-
-			@Test
-			void shouldParseJsonOnly() {
-				var map = mapper.mapRepresentations(
-						FormSolutionsFilesTestFactory.createBuilder().formData(Map.of()).build().getFormData(),
-						simpleJsonFile);
-
-				assertThat(map).hasSize(1);
-				assertThat(map.get(0).getContentType()).isEqualTo(JSON_CONTENT_TYPE);
-			}
-
-			private IncomingFile mapRepresentationJson() {
-				return mapRepresentation().get(1);
-			}
-		}
-
-		private List<IncomingFile> mapRepresentation() {
-			return mapper.mapRepresentations(REPRESENTATIONS.getFormData(), simpleJsonFile);
-		}
-	}
-
-}
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperITCase.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperITCase.java
index 68b831975..3f19ad2d9 100644
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperITCase.java
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperITCase.java
@@ -83,7 +83,7 @@ class FormSolutionsRequestMapperITCase {
 			void shouldHaveIdentifier() {
 				var panel = parseAndGetPanel();
 
-				assertThat(panel.get(FormSolutionsEngineBasedAdapter.IDENTIFIER)).isNotNull();
+				assertThat(panel.get(FormSolutionsEngineBasedAdapter.IDENTIFIER_KEY)).isNotNull();
 			}
 
 			@Test
@@ -123,7 +123,7 @@ class FormSolutionsRequestMapperITCase {
 		void shouldHaveIdentifier() {
 			var component = parseAndGetComponent();
 
-			assertThat(component).containsEntry(FormSolutionsEngineBasedAdapter.IDENTIFIER, OBJEKTGRUPPE_0);
+			assertThat(component).containsEntry(FormSolutionsEngineBasedAdapter.IDENTIFIER_KEY, OBJEKTGRUPPE_0);
 		}
 
 		@Test
diff --git a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java
index 4c8f7428e..2ea67b6a7 100644
--- a/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java
+++ b/formsolutions-adapter/src/test/java/de/itvsh/kop/eingangsadapter/formsolutions/FormSolutionsRequestMapperTest.java
@@ -31,6 +31,7 @@ import static org.mockito.Mockito.*;
 
 import java.io.File;
 import java.io.InputStream;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -39,30 +40,27 @@ 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.mockito.ArgumentCaptor;
+import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.Spy;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
 import de.itvsh.kop.common.errorhandling.TechnicalException;
 import de.itvsh.kop.eingangsadapter.common.file.TempFileUtils;
-import de.itvsh.kop.eingangsadapter.common.formdata.FormDataTestFactory;
-import de.itvsh.kop.eingangsadapter.semantik.enginebased.FilesMapperHelper;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroup;
+import de.itvsh.kop.eingangsadapter.common.formdata.IncomingFileGroupTestFactory;
 import lombok.SneakyThrows;
 
 class FormSolutionsRequestMapperTest {
 
-	private static final String TRANSACTION_ID = "transactionId";
 	private static final String COMPONENTS = "components";
 	private static final String STRING_VALUE = "stringValue";
 	private static final String PANELS = "panels";
-	private static final String ZUSTAENDIGE_STELLE = "zustaendigeStelle";
-	private static final String POSTKORBHANDLE = "postkorbhandle";
 
 	@Spy
 	@InjectMocks
@@ -70,8 +68,8 @@ class FormSolutionsRequestMapperTest {
 
 	@Mock
 	private FormSolutionsAttachmentsMapper attachmentMapper;
-	@Mock
-	private FormSolutionsRepresentationsMapper representationsMapper;
+//	@Mock
+//	private FormSolutionsRepresentationsMapper representationsMapper;
 
 	@Spy
 	private ObjectMapper objectMapper = new ObjectMapper();
@@ -92,100 +90,76 @@ class FormSolutionsRequestMapperTest {
 	}
 
 	@Nested
-	class TestJsonToMapMapping {
-
-		@Test
-		void shouldMap() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
-
-			assertThat(dataMap).isNotNull();
-		}
-
-		@Test
-		void shouldContainZustaendigeStelle() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
-
-			assertThat((String) dataMap.get(ZUSTAENDIGE_STELLE)).isEqualTo(ORGANISATIONSEINHEITEN_ID);
-		}
-
-		@Test
-		void shouldContainsPostfachId() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
-
-			assertThat((String) dataMap.get(POSTKORBHANDLE)).isEqualTo(POSTFACH_ID);
-		}
+	class TestJsonToEingangMapping {
 
 		@Test
-		void shouldContainRequestId() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
+		void shouldMapControlValues() {
+			var eingang = mapper.mapEingang(simpleJsonFile);
 
-			assertThat((String) dataMap.get(TRANSACTION_ID)).isEqualTo(FORM_ID_VALUE);
+			assertThat(eingang).isNotNull().usingRecursiveComparison()
+					.ignoringFields("zip", "pdf", "assistant").isEqualTo(FormSolutionsEingangTestFactory.create());
 		}
 
 		@Test
-		void shouldContainAssitant() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
+		void shouldHaveAssistantData() {
+			var eingang = mapper.mapEingang(simpleJsonFile);
 
-			assertThat(dataMap.get(ASSISTANT)).isNotNull();
+			assertThat(eingang.getAssistant()).isNotEmpty();
 		}
 
 		@Test
 		@SneakyThrows
 		void shouldHandleJsonException() throws JsonMappingException, JsonProcessingException {
-			doThrow(JsonProcessingException.class).when(objectMapper).readValue(any(InputStream.class),
-					Mockito.<TypeReference<Map<String, Object>>>any());
+			doThrow(JsonProcessingException.class).when(objectMapper).readValue(any(InputStream.class), eq(FormSolutionsEingang.class));
 
-			assertThatThrownBy(() -> mapper.mapFormData(simpleJsonFile)).isInstanceOf(TechnicalException.class);
+			assertThatThrownBy(() -> mapper.mapEingang(simpleJsonFile)).isInstanceOf(TechnicalException.class);
 		}
 
 		@Test
-		@SuppressWarnings("unchecked")
 		void shouldContainFormIdentifier() {
-			var dataMap = mapper.mapFormData(simpleJsonFile);
+			var eingang = mapper.mapEingang(simpleJsonFile);
 
-			assertThat((String) ((Map<String, Object>) dataMap.get(ASSISTANT))
-					.get(IDENTIFIER))
-							.isEqualTo(IDENTIFIER_VALUE);
+			assertThat(eingang.getAssistant()).containsEntry(IDENTIFIER_KEY, IDENTIFIER_VALUE);
 		}
 
 		@Nested
 		class TestPanels {
 			@Test
 			void shouldContainPanels() {
-				var dataMap = mapper.mapFormData(simpleJsonFile);
+				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getPanels(dataMap)).isNotNull();
+				assertThat(getPanels(eingang)).isNotNull();
 			}
 
 			@Test
 			void shouldContainPanelIdentifier() {
-				var dataMap = mapper.mapFormData(simpleJsonFile);
+				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getPanels(dataMap).get(0)).containsEntry(IDENTIFIER, PANEL_ID);
+				assertThat(getPanels(eingang).get(0)).containsEntry(IDENTIFIER_KEY, PANEL_ID);
 			}
 
 			@Test
 			void shouldContainPanelComponets() {
-				var dataMap = mapper.mapFormData(simpleJsonFile);
+				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getPanels(dataMap).get(0).get(COMPONENTS)).isNotNull();
+				assertThat(getPanels(eingang).get(0).get(COMPONENTS)).isNotNull();
 			}
 
 			@Test
 			void shouldContainTextComponets() {
-				var dataMap = mapper.mapFormData(simpleJsonFile);
+				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getComponents(dataMap).get(0))
-						.containsEntry(IDENTIFIER, COMPONENT_ID)
+				assertThat(getComponents(eingang).get(0))
+						.containsEntry(IDENTIFIER_KEY, COMPONENT_ID)
 						.containsEntry(STRING_VALUE, COMPONENT_VALUE);
 			}
 
 			@Test
 			void shouldContainDateComponets() {
-				var dataMap = mapper.mapFormData(simpleJsonFile);
+				var eingang = mapper.mapEingang(simpleJsonFile);
 
-				assertThat(getComponents(dataMap).get(1))
-						.containsEntry(IDENTIFIER, DATE_COMPONENT_ID)
+				assertThat(getComponents(eingang).get(1))
+						.containsEntry(IDENTIFIER_KEY, DATE_COMPONENT_ID)
 						.containsEntry(STRING_VALUE, DATE_COMPONENT_VALUE);
 			}
 
@@ -193,35 +167,35 @@ class FormSolutionsRequestMapperTest {
 			class TestNestedPanels {
 				@Test
 				void shouldContainGroup() {
-					var dataMap = mapper.mapFormData(nestedComponenetJsonFile);
+					var eingang = mapper.mapEingang(nestedComponenetJsonFile);
 
-					assertThat(getComponents(dataMap).get(0)).containsEntry(IDENTIFIER, OBJEKTGRUPPE_0);
+					assertThat(getComponents(eingang).get(0)).containsEntry(IDENTIFIER_KEY, OBJEKTGRUPPE_0);
 				}
 
 				@Test
 				void shouldContainDateField() {
-					var dataMap = mapper.mapFormData(nestedComponenetJsonFile);
+					var eingang = mapper.mapEingang(nestedComponenetJsonFile);
 
-					assertThat(getNestedComponents(dataMap).get(0))
-							.containsEntry(IDENTIFIER, DATE_COMPONENT_ID)
+					assertThat(getNestedComponents(eingang).get(0))
+							.containsEntry(IDENTIFIER_KEY, DATE_COMPONENT_ID)
 							.containsEntry(STRING_VALUE, DATE_COMPONENT_VALUE);
 				}
 			}
 		}
 
 		@SuppressWarnings("unchecked")
-		private List<Map<String, Object>> getComponents(Map<String, Object> dataMap) {
-			return (List<Map<String, Object>>) getPanels(dataMap).get(0).get(COMPONENTS);
+		private List<Map<String, Object>> getComponents(FormSolutionsEingang eingang) {
+			return (List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS);
 		}
 
 		@SuppressWarnings("unchecked")
-		private List<Map<String, Object>> getNestedComponents(Map<String, Object> dataMap) {
-			return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(dataMap).get(0).get(COMPONENTS)).get(0).get(COMPONENTS);
+		private List<Map<String, Object>> getNestedComponents(FormSolutionsEingang eingang) {
+			return (List<Map<String, Object>>) ((List<Map<String, Object>>) getPanels(eingang).get(0).get(COMPONENTS)).get(0).get(COMPONENTS);
 		}
 
 		@SuppressWarnings("unchecked")
-		private List<Map<String, Object>> getPanels(Map<String, Object> dataMap) {
-			return (List<Map<String, Object>>) ((Map<String, Object>) dataMap.get(ASSISTANT)).get(PANELS);
+		private List<Map<String, Object>> getPanels(FormSolutionsEingang eingang) {
+			return (List<Map<String, Object>>) eingang.getAssistant().getOrDefault(PANELS, Collections.emptyList());
 		}
 	}
 
@@ -232,6 +206,8 @@ class FormSolutionsRequestMapperTest {
 		class TestMapFiles {
 
 			private File jsonFile;
+			@Captor
+			private ArgumentCaptor<File> fileCaptor;
 
 			@BeforeEach
 			void writeJsonFile() {
@@ -244,44 +220,38 @@ class FormSolutionsRequestMapperTest {
 			}
 
 			@Test
-			void shouldCallAttachmentMappers() {
-				mapper.mapFiles(FormDataTestFactory.create(), jsonFile);
+			void shouldMapZipFile() {
+				var eingang = mapper.mapEingang(jsonFile);
 
-				verify(attachmentMapper).mapAttachments(Mockito.<Map<String, Object>>any());
+				assertThat(eingang.getZip()).exists().content().isEqualTo(ZIP_VALUE_DECODED);
 			}
 
-			@DisplayName("result should have mapped files field")
 			@Test
-			void shouldHaveMappedFilesField() {
-				var result = mapper.mapFiles(FormDataTestFactory.create(), jsonFile);
-
-				assertThat(result.getFormData()).containsKey(FilesMapperHelper.FIELD_NAME_MAPPED_FILES);
-			}
-
-			@Test
-			void shouldCallRepresentationMapper() {
-				mapper.mapFiles(FormDataTestFactory.create(), jsonFile);
+			void shouldCallAttachmentMappers() {
+				mapper.map(jsonFile);
 
-				verify(representationsMapper).mapRepresentations(Mockito.<Map<String, Object>>any(), eq(jsonFile));
+				verify(attachmentMapper).mapAttachments(fileCaptor.capture());
+				assertThat(fileCaptor.getValue()).content().isEqualTo(ZIP_VALUE_DECODED);
 			}
 
+			@DisplayName("result should have mapped files field")
 			@Test
-			void shouldRemoveZip() {
-				var formData = FormDataTestFactory.withFormDataMaps(Map.of(FormSolutionsAttachmentsMapper.ZIP, "test"));
+			void shouldHaveMappedFilesField() {
+				IncomingFileGroup fileGroup = IncomingFileGroupTestFactory.create();
+				when(attachmentMapper.mapAttachments(any())).thenReturn(List.of(fileGroup));
 
-				var dataMap = mapper.mapFiles(formData, jsonFile);
+				var result = mapper.map(jsonFile);
 
-				assertThat(dataMap.getFormData()).doesNotContainKey(FormSolutionsAttachmentsMapper.ZIP);
+				assertThat(result.getAttachments()).containsExactly(fileGroup);
 			}
 
 			@Test
-			void shouldRemovePdf() {
-				var formData = FormDataTestFactory.withFormDataMaps(Map.of(FormSolutionsRepresentationsMapper.PDF, "test"));
-
-				var dataMap = mapper.mapFiles(formData, jsonFile);
+			void shouldAddRepresentations() {
+				var result = mapper.map(jsonFile);
 
-				assertThat(dataMap.getFormData()).doesNotContainKey(FormSolutionsRepresentationsMapper.PDF);
+				assertThat(result.getRepresentations()).hasSize(2);
 			}
+
 		}
 
 	}
diff --git a/pom.xml b/pom.xml
index 498c8c664..6fc246a67 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
 	<parent>
 		<groupId>de.itvsh.kop.common</groupId>
 		<artifactId>kop-common-parent</artifactId>
-		<version>2.1.0</version>
+		<version>2.2.0-SNAPSHOT</version>
 		<relativePath/> <!-- lookup parent from repository -->
 	</parent>
 	
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java
index 529f5a947..ebdce78e8 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsEngineBasedAdapter.java
@@ -33,7 +33,7 @@ import de.itvsh.kop.eingangsadapter.semantik.enginebased.EngineBasedSemantikAdap
 
 public class FormSolutionsEngineBasedAdapter implements EngineBasedSemantikAdapter {
 
-	public static final String IDENTIFIER = "identifier";
+	public static final String IDENTIFIER_KEY = "identifier";
 
 	public static final String ASSISTANT = "assistant";
 	public static final String ANLIEGEN_ID = "anliegenId";
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java
index b9990e766..304ddb05d 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderMapper.java
@@ -72,7 +72,7 @@ class FormSolutionsHeaderMapper implements FormSolutionsEngineBasedMapper {
 	}
 
 	private String getIdentifier(FormData formData) {
-		return (String) getAssistant(formData).get(IDENTIFIER);
+		return (String) getAssistant(formData).get(IDENTIFIER_KEY);
 	}
 
 	private Map<String, Object> getAssistant(FormData formData) {
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java
index 9b3e68345..87d837ef9 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelMapper.java
@@ -55,7 +55,7 @@ class FormSolutionsPanelMapper implements FormSolutionsEngineBasedMapper {
 		}
 		var resultMap = new HashMap<String, Object>();
 		for (Map<String, Object> panel : panels) {
-			var identifier = (String) panel.get(IDENTIFIER);
+			var identifier = (String) panel.get(IDENTIFIER_KEY);
 			if (isNull(identifier)) {
 				continue;
 			}
diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParser.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParser.java
index 59eb0465c..bfc638327 100644
--- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParser.java
+++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParser.java
@@ -54,7 +54,7 @@ class IdentifierValueParser {
 		}
 		for (Map<String, Object> panel : panels) {
 			parse(FormSolutionsPanelMapper.getComponentList(panel));
-			var identifier = (String) panel.get(FormSolutionsEngineBasedAdapter.IDENTIFIER);
+			var identifier = (String) panel.get(FormSolutionsEngineBasedAdapter.IDENTIFIER_KEY);
 			var value = (String) panel.get(FormSolutionsPanelMapper.STRING_VALUE);
 			if (nonNull(identifier) && nonNull(value)) {
 				 resultMap.put(identifier, value);
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java
index b6fc00d00..4bc71654d 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsAntragstellerMapperTest.java
@@ -54,13 +54,13 @@ class FormSolutionsAntragstellerMapperTest {
 	class TestParseFormData {
 		private static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1";
 		private static final List<Map<String, Object>> ANTRAGSTELLER_PANEL_CONTENT_LIST = List.of(
-				Map.of(IDENTIFIER, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER),
+				Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER),
 				Map.of(COMPONENTS, List.of(
-						Map.of(IDENTIFIER, VORNAME_KEY, STRING_VALUE, VORNAME),
-						Map.of(IDENTIFIER, NACHNAME_KEY, STRING_VALUE, NACHNAME))));
+						Map.of(IDENTIFIER_KEY, VORNAME_KEY, STRING_VALUE, VORNAME),
+						Map.of(IDENTIFIER_KEY, NACHNAME_KEY, STRING_VALUE, NACHNAME))));
 
 		private static final Map<String, Object> ASSISTANT_MAP = Map.of(PANELS, List.of(
-				Map.of(IDENTIFIER, ANTRAGSTELLER_PANEL_IDENTIFIER),
+				Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_PANEL_IDENTIFIER),
 				Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT_LIST)));
 
 		private final FormData formData = FormDataTestFactory.createBuilder().antragsteller(null)
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java
index 57ad22fc9..44335bea8 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsHeaderTestFactory.java
@@ -44,7 +44,7 @@ public class FormSolutionsHeaderTestFactory {
 	public static FormData.FormDataBuilder createBuilder() {
 		return FormData.builder()
 				.formData(Map.of(
-						ASSISTANT, Map.of(IDENTIFIER, FORM_NAME),
+						ASSISTANT, Map.of(IDENTIFIER_KEY, FORM_NAME),
 						TRANSACTION_ID, REQUEST_ID,
 						FormSolutionsHeaderMapper.POSTKORBHANDLE, POSTKORBHANDLE_VALUE));
 	}
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java
index 8c492a71b..ce098747e 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/FormSolutionsPanelTestFactory.java
@@ -41,47 +41,47 @@ public class FormSolutionsPanelTestFactory {
 	public static final String FORM = "AS_123";
 	public static final List<Map<String, Object>> COMPONENT_LIST = List.of(
 			Map.of(
-					IDENTIFIER, TEXT_FIELD,
+					IDENTIFIER_KEY, TEXT_FIELD,
 					STRING_VALUE, STRING_VALUE_CONTENT),
 			Map.of(
-					IDENTIFIER, DATE_FIELD,
+					IDENTIFIER_KEY, DATE_FIELD,
 					STRING_VALUE, DATE_VALUE_CONTENT));
 
 	public static final List<Map<String, Object>> EMPTY_COMPONENT_LIST = List.of(
-			Map.of(IDENTIFIER, TEXT_FIELD, "needed", false));
+			Map.of(IDENTIFIER_KEY, TEXT_FIELD, "needed", false));
 
 	public static final List<Map<String, Object>> NESTED_COMPONENT_LIST = List.of(
 			Map.of(
-					IDENTIFIER, GROUP_IDENTIFIER,
+					IDENTIFIER_KEY, GROUP_IDENTIFIER,
 					COMPONENTS, List.of(Map.of(
-							IDENTIFIER, DATE_FIELD,
+							IDENTIFIER_KEY, DATE_FIELD,
 							STRING_VALUE, DATE_VALUE_CONTENT))));
 
 	public static final List<Map<String, Object>> PANEL_LIST = List.of(Map.of(
-			IDENTIFIER, PANEL_0,
+			IDENTIFIER_KEY, PANEL_0,
 			COMPONENTS, COMPONENT_LIST));
 
 	public static final List<Map<String, Object>> PANEL_LIST_EMPTY = List.of(Map.of(
-			IDENTIFIER, PANEL_0,
+			IDENTIFIER_KEY, PANEL_0,
 			COMPONENTS, EMPTY_COMPONENT_LIST));
 
 	public static final List<Map<String, Object>> NESTED_PANEL_LIST = List.of(Map.of(
-			IDENTIFIER, PANEL_0,
+			IDENTIFIER_KEY, PANEL_0,
 			COMPONENTS, NESTED_COMPONENT_LIST));
 
 	public static final Map<String, Object> PANEL_FORM = Map.of(
 			ASSISTANT, Map.of(
-					IDENTIFIER, FORM,
+					IDENTIFIER_KEY, FORM,
 					PANELS, PANEL_LIST));
 
 	public static final Map<String, Object> NESTED_PANEL_FORM = Map.of(
 			ASSISTANT, Map.of(
-					IDENTIFIER, FORM,
+					IDENTIFIER_KEY, FORM,
 					PANELS, NESTED_PANEL_LIST));
 
 	public static final Map<String, Object> PANEL_FORM_EMPTY = Map.of(
 			ASSISTANT, Map.of(
-					IDENTIFIER, FORM,
+					IDENTIFIER_KEY, FORM,
 					PANELS, PANEL_LIST_EMPTY));
 
 	public static FormData create() {
diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParserTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParserTest.java
index d01c5e792..db8051ea4 100644
--- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParserTest.java
+++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/formsolutions/IdentifierValueParserTest.java
@@ -42,13 +42,13 @@ class IdentifierValueParserTest {
 
 	private static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1";
 	private static final List<Map<String, Object>> ANTRAGSTELLER_PANEL_CONTENT_LIST = List.of(
-			Map.of(IDENTIFIER, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER),
+			Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER),
 			Map.of(COMPONENTS, List.of(
-					Map.of(IDENTIFIER, VORNAME_KEY, STRING_VALUE, VORNAME),
-					Map.of(IDENTIFIER, NACHNAME_KEY, STRING_VALUE, NACHNAME))));
+					Map.of(IDENTIFIER_KEY, VORNAME_KEY, STRING_VALUE, VORNAME),
+					Map.of(IDENTIFIER_KEY, NACHNAME_KEY, STRING_VALUE, NACHNAME))));
 
 	private static final Map<String, Object> ASSISTANT_MAP = Map.of(PANELS, List.of(
-			Map.of(IDENTIFIER, ANTRAGSTELLER_PANEL_IDENTIFIER), Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT_LIST)));
+			Map.of(IDENTIFIER_KEY, ANTRAGSTELLER_PANEL_IDENTIFIER), Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT_LIST)));
 
 	private FormData formData = FormDataTestFactory.createBuilder()
 			.formData(Map.of(SIMPLE_VALUE_KEY, SIMPLE_VALUE,
-- 
GitLab