From 697546837866f5337a79bd9eba11394d4b3280e8 Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Fri, 9 Sep 2022 15:35:46 +0200
Subject: [PATCH] refactor(#484): resolve merge conflicts

---
 .../fitko/fitconnect/client/SenderClient.java | 498 ------------------
 .../client/model/AttachmentPayload.java       |  20 -
 .../fitconnect/client/model/DataPayload.java  |  19 -
 .../client/model/ReceivedSubmission.java      |  18 -
 .../client/model/ServiceTypePayload.java      |  12 -
 .../client/model/SubmissionPayload.java       |  26 -
 .../SendEncryptedSubmissionStrategy.java      |  92 ----
 .../strategies/SendNewSubmissionStrategy.java | 234 --------
 .../client/strategies/SubmitStrategy.java     |  30 --
 .../client/util/SubmissionUtil.java           | 139 -----
 .../client/cmd/CommandLineClient.java         |  23 +-
 .../SendEncryptedSubmissionStrategy.java      |   2 -
 .../factory/ApplicationConfigLoaderTest.java  |   2 +-
 13 files changed, 2 insertions(+), 1113 deletions(-)
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/SenderClient.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/model/AttachmentPayload.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/model/DataPayload.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/model/ReceivedSubmission.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/model/ServiceTypePayload.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/model/SubmissionPayload.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/strategies/SendNewSubmissionStrategy.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/strategies/SubmitStrategy.java
 delete mode 100644 client/src/main/java/de/fitko/fitconnect/client/util/SubmissionUtil.java

diff --git a/client/src/main/java/de/fitko/fitconnect/client/SenderClient.java b/client/src/main/java/de/fitko/fitconnect/client/SenderClient.java
deleted file mode 100644
index ea6225595..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/SenderClient.java
+++ /dev/null
@@ -1,498 +0,0 @@
-package de.fitko.fitconnect.client;
-
-import com.nimbusds.jose.jwk.RSAKey;
-import de.fitko.fitconnect.api.config.Environment;
-import de.fitko.fitconnect.api.domain.model.destination.Destination;
-import de.fitko.fitconnect.api.domain.model.destination.DestinationService;
-import de.fitko.fitconnect.api.domain.model.metadata.ContentStructure;
-import de.fitko.fitconnect.api.domain.model.metadata.Metadata;
-import de.fitko.fitconnect.api.domain.model.metadata.PublicServiceType;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.Attachment;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.Purpose;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.signature.AttachmentSignatureType;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.signature.Hash__1;
-import de.fitko.fitconnect.api.domain.model.metadata.data.*;
-import de.fitko.fitconnect.api.domain.model.submission.CreateSubmission;
-import de.fitko.fitconnect.api.domain.model.submission.ServiceType;
-import de.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
-import de.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
-import de.fitko.fitconnect.api.domain.validation.ValidationResult;
-import de.fitko.fitconnect.api.exceptions.*;
-import de.fitko.fitconnect.api.services.Sender;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.With;
-import org.apache.tika.Tika;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URLConnection;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * A fluent client for announcing and handing in a {@link SubmitSubmission}
- */
-public final class SenderClient {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(SenderClient.class);
-
-    private SenderClient() {
-    }
-
-    public static WithDestination build(final Sender sender, final String metadataSchema, final Environment environment) {
-        return new ClientBuilder(sender, metadataSchema, environment);
-    }
-
-    public interface WithDestination {
-
-        /**
-         * Configures the client for the given destination and loads the public key
-         *
-         * @param destinationId unique identifier of the clients destination
-         * @return the upload step for attachments
-         */
-        WithServiceType withDestination(UUID destinationId);
-    }
-
-    public interface WithAttachments {
-
-        /**
-         * Sends the submission with a list of attachments
-         *
-         * @param attachments that are sent with the submission
-         * @return the next step where additional data can be added to the submission
-         */
-        WithData withAttachments(List<File> attachments);
-
-        /**
-         * Sends the submission with an attachments
-         *
-         * @param attachment that is sent with the submission
-         * @return the next step where additional data can be added to the submission
-         */
-        WithData withAttachment(File attachment);
-
-        /**
-         * XML data as string.
-         *
-         * @param data json string
-         * @return next step to submit the data
-         */
-        Submit withJsonData(String data);
-
-        /**
-         * JSON data as string.
-         *
-         * @param data xml string
-         * @return next step to submit the data
-         */
-        Submit withXmlData(String data);
-    }
-
-    public interface WithServiceType {
-
-        /**
-         * Sets a {@link ServiceType} for a submission
-         *
-         * @param name     a name of the service
-         * @param leikaKey unique identifier of the service in the form <b>urn:de:fim:leika:leistung:</b>
-         * @return next step to add attachments
-         * @see <a href="https://fimportal.de/">Search For Service Types</a>
-         */
-        WithAttachments withServiceType(String name, String leikaKey);
-
-        /**
-         * Sets a {@link ServiceType} for a submission
-         *
-         * @param name        a name of the service
-         * @param description description of the service
-         * @param leikaKey    unique identifier of the service in the form <b>urn:de:fim:leika:leistung:</b>
-         * @return next step to add attachments
-         * @see <a href="https://fimportal.de/">Search For Service Types</a>
-         */
-        WithAttachments withServiceType(String name, String description, String leikaKey);
-    }
-
-    public interface WithData {
-
-        /**
-         * XML data as string.
-         *
-         * @param data json string
-         * @return next step to submit the data
-         */
-        Submit withJsonData(String data);
-
-        /**
-         * JSON data as string.
-         *
-         * @param data xml string
-         * @return next step to submit the data
-         */
-        Submit withXmlData(String data);
-
-    }
-
-    public interface Submit {
-
-        /**
-         * Send submission with attachments and data to FIT-Connect API.
-         *
-         * @return {@link SubmitSubmission} object of the handed in submission
-         */
-        Optional<SubmitSubmission> submit();
-    }
-
-    /**
-     * ClientBuilder that implements all steps to guide through the API calls
-     */
-    public static class ClientBuilder implements WithDestination, WithServiceType, WithAttachments, WithData, Submit {
-
-        private final Sender sender;
-        private final Environment environment;
-        private final String metadataSchema;
-
-        private DataPayload dataPayload;
-        private UUID destinationId;
-        private ServiceType serviceType;
-        private List<File> attachments = new ArrayList<>();
-
-        public ClientBuilder(final Sender sender, final String metadataSchema, final Environment environment) {
-            this.sender = sender;
-            this.metadataSchema = metadataSchema;
-            this.environment = environment;
-        }
-
-        @Override
-        public WithServiceType withDestination(final UUID destinationId) {
-            this.destinationId = destinationId;
-            return this;
-        }
-
-        @Override
-        public WithAttachments withServiceType(final String name, final String leikaKey) {
-            this.serviceType = createServiceTypeWithoutDescription(name, leikaKey);
-            return this;
-        }
-
-        @Override
-        public WithAttachments withServiceType(final String name, final String description, final String leikaKey) {
-            this.serviceType = createServiceTypeWithDescription(name, description, leikaKey);
-            return this;
-        }
-
-        @Override
-        public Submit withXmlData(final String data) {
-            this.dataPayload = getDataPayload(data, MimeType.APPLICATION_XML);
-            return this;
-        }
-
-        @Override
-        public Submit withJsonData(final String data) {
-            this.dataPayload = getDataPayload(data, MimeType.APPLICATION_JSON);
-            return this;
-        }
-
-        @Override
-        public WithData withAttachment(final File attachmentFile) {
-            this.attachments = attachmentFile != null ? List.of(attachmentFile) : List.of();
-            return this;
-        }
-
-        @Override
-        public WithData withAttachments(final List<File> attachmentFiles) {
-            this.attachments = attachmentFiles;
-            return this;
-        }
-
-        @Override
-        public Optional<SubmitSubmission> submit() {
-            try {
-
-                if (!isAllNecessaryDataSet()) {
-                    return Optional.empty();
-                }
-
-                /** Get encryption key for destination **/
-                final Destination destination = sender.getDestination(destinationId);
-                final RSAKey encryptionKey = sender.getEncryptionKeyForDestination(destinationId, destination.getEncryptionKid());
-                final ValidationResult validationResult = sender.validatePublicKey(encryptionKey);
-                if (validationResult.hasError()) {
-                    LOGGER.warn("The public key is not valid, {}", validationResult.getError().getMessage());
-                    if (!environment.isSilentKeyValidation()) {
-                        return Optional.empty();
-                    }
-                }
-
-                /** Create new submission and announce attachments **/
-                final List<AttachmentPayload> attachmentPayloads = encryptAndHashFiles(encryptionKey, attachments);
-                final List<UUID> attachmentIdsToAnnounce = toAttachmentIds(attachmentPayloads);
-                final CreateSubmission newSubmission = createSubmission(attachmentIdsToAnnounce);
-                final SubmissionForPickup announcedSubmission = sender.createSubmission(newSubmission);
-                final UUID submissionId = announcedSubmission.getSubmissionId();
-                uploadAttachments(attachmentPayloads, submissionId);
-
-                /** Prepare submit submission with announced submission id **/
-                final SubmitSubmission submission = new SubmitSubmission();
-                submission.setSubmissionId(submissionId);
-
-                /** Create attachment hashes **/
-                final List<Attachment> hashedAttachments = toHashedAttachments(attachmentPayloads);
-
-                /** Set encrypted metadata with data payload and attachments  **/
-                LOGGER.info("Adding data payload with mime-type {} to submission", this.dataPayload.mimeType);
-                final DataPayload dataToSend = getEncryptedData(this.dataPayload, destination, encryptionKey);
-                final Metadata metadata = createMetadata(hashedAttachments, dataToSend);
-                final ValidationResult validatedMetadata = sender.validateMetadata(metadata, metadataSchema);
-                if (validatedMetadata.hasError()) {
-                    LOGGER.error("Metadata does not match schema", validatedMetadata.getError());
-                    sender.rejectSubmission(submissionId, destinationId, announcedSubmission.getCaseId());
-                    return Optional.empty();
-                }
-                submission.setEncryptedData(dataToSend.getEncryptedData());
-                submission.setEncryptedMetadata(sender.encryptObject(encryptionKey, metadata));
-
-                /** submit submission **/
-                sender.sendSubmission(submission);
-                LOGGER.info("SUCCESSFULLY HANDED IN SUBMISSION !");
-                return Optional.of(submission);
-
-            } catch (final EncryptionException e) {
-                LOGGER.error("Encrypting submission failed", e);
-            } catch (final RestApiException e) {
-                LOGGER.error("Sending submission failed", e);
-            } catch (final SchemaNotFoundException e) {
-                LOGGER.error("Required schema to send valid submission not found", e);
-            } catch (final SubmissionNotCreatedException e) {
-                LOGGER.error("Failed to announce new submission", e);
-            } catch (final KeyNotRetrievedException e) {
-                LOGGER.error("Getting encryption key for destination {} failed", destinationId, e);
-            } catch (final AttachmentCreationException e) {
-                LOGGER.error("Reading file failed. Attachment will not be created.", e);
-            }
-            return Optional.empty();
-        }
-
-        private DataPayload getEncryptedData(final DataPayload dataPayload, final Destination destination, final RSAKey encryptionKey) {
-            final List<SubmissionSchema> submissionSchemas = getSubmissionSchemasFromDestination(destination);
-            final Optional<URI> schemaUriForMimeType = getSchemaUriForMimeType(submissionSchemas, dataPayload.mimeType);
-            if (schemaUriForMimeType.isEmpty()) {
-                throw new SchemaNotFoundException("No data schema for mime-type " + dataPayload.mimeType + " found, please check the allowed type for destination");
-            }
-            final String hashedData = sender.createHash(dataPayload.rawData);
-            final String encryptedData = sender.encryptBytes(encryptionKey, dataPayload.rawData);
-            return dataPayload.withSchemaUri(schemaUriForMimeType.get())
-                    .withEncryptedData(encryptedData)
-                    .withHashedData(hashedData);
-        }
-
-        private List<Attachment> toHashedAttachments(final List<AttachmentPayload> attachmentPayloads) {
-            return attachmentPayloads.stream()
-                    .map(this::toHashedAttachment)
-                    .collect(Collectors.toList());
-        }
-
-        private CreateSubmission createSubmission(final List<UUID> attachmentIdsToAnnounce) {
-            return CreateSubmission.builder()
-                    .destinationId(destinationId)
-                    .announcedAttachments(attachmentIdsToAnnounce)
-                    .serviceType(serviceType)
-                    .build();
-        }
-
-        private List<UUID> toAttachmentIds(final List<AttachmentPayload> attachmentPayloads) {
-            return attachmentPayloads.stream()
-                    .map(AttachmentPayload::getAttachmentId)
-                    .collect(Collectors.toList());
-        }
-
-        private DataPayload getDataPayload(final String data, final MimeType mimeType) {
-            if (data == null) {
-                return null;
-            }
-            return DataPayload.builder()
-                    .rawData(data.getBytes(StandardCharsets.UTF_8))
-                    .mimeType(mimeType)
-                    .build();
-        }
-
-        private List<SubmissionSchema> getSubmissionSchemasFromDestination(final Destination destination) {
-            return destination.getServices().stream()
-                    .map(DestinationService::getSubmissionSchemas)
-                    .flatMap(Collection::stream)
-                    .collect(Collectors.toList());
-        }
-
-        private Optional<URI> getSchemaUriForMimeType(final List<SubmissionSchema> submissionSchemas, final MimeType mimeType) {
-            return submissionSchemas.stream()
-                    .filter(schema -> schema.getMimeType().equals(mimeType))
-                    .map(SubmissionSchema::getSchemaUri)
-                    .findFirst();
-        }
-
-        private void uploadAttachments(final List<AttachmentPayload> attachmentPayloads, final UUID submissionId) {
-            if (attachmentPayloads.isEmpty()) {
-                LOGGER.info("No attachments to upload");
-            } else {
-                LOGGER.info("Uploading {} attachment(s)", attachmentPayloads.size());
-            }
-            for (final AttachmentPayload payload : attachmentPayloads) {
-                sender.uploadAttachment(submissionId, payload.attachmentId, payload.encryptedData);
-            }
-        }
-
-        private ServiceType createServiceTypeWithDescription(final String name, final String description, final String leikaKey) {
-            final var serviceTypeModel = new ServiceType();
-            serviceTypeModel.setName(name);
-            serviceTypeModel.setDescription(description);
-            serviceTypeModel.setIdentifier(leikaKey);
-            return serviceTypeModel;
-        }
-
-        private ServiceType createServiceTypeWithoutDescription(final String name, final String leikaKey) {
-            final var serviceTypeModel = new ServiceType();
-            serviceTypeModel.setName(name);
-            serviceTypeModel.setIdentifier(leikaKey);
-            return serviceTypeModel;
-        }
-
-        private Data createData(final DataPayload dataPayload) {
-            final var hash = new Hash();
-            hash.setContent(dataPayload.hashedData);
-            hash.setDataSignatureType(DataSignatureType.SHA_512);
-
-            final var submissionSchema = new SubmissionSchema();
-            submissionSchema.setMimeType(dataPayload.mimeType);
-            submissionSchema.setSchemaUri(dataPayload.schemaUri);
-
-            final var data = new Data();
-            data.setSubmissionSchema(submissionSchema);
-            data.setHash(hash);
-            return data;
-        }
-
-        private Metadata createMetadata(final List<Attachment> attachments, final DataPayload dataPayload) {
-            final var contentStructure = new ContentStructure();
-            contentStructure.setAttachments(attachments);
-            contentStructure.setData(createData(dataPayload));
-
-            final var metadata = new Metadata();
-            metadata.setContentStructure(contentStructure);
-            metadata.setPublicServiceType(getPublicServiceType());
-            return metadata;
-        }
-
-        private PublicServiceType getPublicServiceType() {
-            final var publicServiceType = new PublicServiceType();
-            publicServiceType.setIdentifier(serviceType.getIdentifier());
-            publicServiceType.setName(serviceType.getName());
-            if (serviceType.getDescription() != null) {
-                publicServiceType.setDescription(serviceType.getDescription());
-            }
-            return publicServiceType;
-        }
-
-        private List<AttachmentPayload> encryptAndHashFiles(final RSAKey encryptionKey, final List<File> attachmentFiles) {
-            return attachmentFiles.stream()
-                    .map(this::readRawData)
-                    .map(this::hashBytes)
-                    .map(payload -> encryptBytes(encryptionKey, payload))
-                    .map(this::setMimeType)
-                    .collect(Collectors.toList());
-        }
-
-        private AttachmentPayload readRawData(final File file) {
-            try {
-                final byte[] rawData = Files.readAllBytes(Paths.get(file.getPath()));
-                return AttachmentPayload.builder().file(file).rawData(rawData).build();
-            } catch (final IOException e) {
-                throw new AttachmentCreationException("Attachment '" + file.getAbsolutePath() + "' could not be read ", e);
-            }
-        }
-
-        private Attachment toHashedAttachment(final AttachmentPayload attachmentPayload) {
-            final var attachment = new Attachment();
-            attachment.setAttachmentId(attachmentPayload.attachmentId);
-            attachment.setPurpose(Purpose.ATTACHMENT);
-            attachment.setFilename(attachmentPayload.file.getName());
-            attachment.setMimeType(attachmentPayload.mimeType);
-
-            final var hash = new Hash__1();
-            hash.setContent(attachmentPayload.hashedData);
-            hash.setAttachmentSignatureType(AttachmentSignatureType.SHA_512);
-            attachment.setHash(hash);
-            return attachment;
-        }
-
-        private AttachmentPayload encryptBytes(final RSAKey encryptionKey, final AttachmentPayload attachmentPayload) {
-            final String encryptedAttachment = sender.encryptBytes(encryptionKey, attachmentPayload.rawData);
-            return attachmentPayload.withEncryptedData(encryptedAttachment);
-        }
-
-        private AttachmentPayload hashBytes(final AttachmentPayload attachmentPayload) {
-            final String hashedBytes = sender.createHash(attachmentPayload.rawData);
-            return attachmentPayload.withHashedData(hashedBytes);
-        }
-
-        private AttachmentPayload setMimeType(final AttachmentPayload attachmentPayload) {
-            final File file = attachmentPayload.file;
-            String mimeType;
-            try {
-                final Tika mimeTypeGuesser = new Tika();
-                mimeType = mimeTypeGuesser.detect(file);
-            } catch (final IOException e) {
-                mimeType = URLConnection.guessContentTypeFromName(file.getName());
-            }
-            LOGGER.info("Detected attachment mime-type {}", mimeType);
-            return attachmentPayload.withMimeType(mimeType);
-        }
-
-        private boolean isAllNecessaryDataSet() {
-            if (this.dataPayload == null) {
-                LOGGER.error("Data is mandatory, but was null.");
-                return false;
-            } else if (this.serviceType.getName() == null) {
-                LOGGER.error("Service type name is mandatory, but was null.");
-                return false;
-            } else if (this.serviceType.getIdentifier() == null) {
-                LOGGER.error("Service type identifier is mandatory, but was null.");
-                return false;
-            } else if (this.destinationId == null) {
-                LOGGER.error("DestinationId is mandatory, but was null.");
-                return false;
-            } else {
-                return true;
-            }
-        }
-
-        @With
-        @Getter
-        @Builder
-        private static class AttachmentPayload {
-            private File file;
-            private byte[] rawData;
-            private String hashedData;
-            private String encryptedData;
-            private String mimeType;
-            private final UUID attachmentId = UUID.randomUUID();
-        }
-
-        @With
-        @Getter
-        @Builder
-        private static class DataPayload {
-            private byte[] rawData;
-            private String hashedData;
-            private String encryptedData;
-            private MimeType mimeType;
-            private URI schemaUri;
-        }
-    }
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/model/AttachmentPayload.java b/client/src/main/java/de/fitko/fitconnect/client/model/AttachmentPayload.java
deleted file mode 100644
index bbf351500..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/model/AttachmentPayload.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package de.fitko.fitconnect.client.model;
-
-import lombok.Builder;
-import lombok.Getter;
-import lombok.With;
-
-import java.io.File;
-import java.util.UUID;
-
-@With
-@Getter
-@Builder
-public class AttachmentPayload {
-    private File file;
-    private byte[] rawData;
-    private String hashedData;
-    private String encryptedData;
-    private String mimeType;
-    private UUID attachmentId;
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/model/DataPayload.java b/client/src/main/java/de/fitko/fitconnect/client/model/DataPayload.java
deleted file mode 100644
index cdd45adaa..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/model/DataPayload.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package de.fitko.fitconnect.client.model;
-
-import de.fitko.fitconnect.api.domain.model.metadata.data.MimeType;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.With;
-
-import java.net.URI;
-
-@With
-@Getter
-@Builder
-public class DataPayload {
-    private byte[] rawData;
-    private String hashedData;
-    private String encryptedData;
-    private MimeType mimeType;
-    private URI schemaUri;
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/model/ReceivedSubmission.java b/client/src/main/java/de/fitko/fitconnect/client/model/ReceivedSubmission.java
deleted file mode 100644
index dd3dc5b15..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/model/ReceivedSubmission.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package de.fitko.fitconnect.client.model;
-
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.AttachmentWithData;
-import de.fitko.fitconnect.api.domain.model.metadata.data.MimeType;
-import lombok.Builder;
-import lombok.Getter;
-import lombok.ToString;
-
-import java.util.List;
-
-@Getter
-@Builder
-@ToString
-public class ReceivedSubmission {
-    private String data;
-    private MimeType mimeType;
-    private List<AttachmentWithData> attachments;
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/model/ServiceTypePayload.java b/client/src/main/java/de/fitko/fitconnect/client/model/ServiceTypePayload.java
deleted file mode 100644
index 26f505e2e..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/model/ServiceTypePayload.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package de.fitko.fitconnect.client.model;
-
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class ServiceTypePayload {
-    private String name;
-    private String description;
-    private String leikaKey;
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/model/SubmissionPayload.java b/client/src/main/java/de/fitko/fitconnect/client/model/SubmissionPayload.java
deleted file mode 100644
index b5f57a10c..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/model/SubmissionPayload.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package de.fitko.fitconnect.client.model;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import lombok.With;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
-
-@Data
-@With
-@AllArgsConstructor
-@NoArgsConstructor
-public class SubmissionPayload {
-
-    private UUID destinationId;
-    private DataPayload data;
-    private String encryptedMetadata;
-    private ServiceTypePayload serviceTypePayLoad;
-
-    // Optional - default empty List
-    private List<AttachmentPayload> attachments = Collections.emptyList();
-    private List<String> encryptedAttachments = Collections.emptyList();
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java b/client/src/main/java/de/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
deleted file mode 100644
index 5c08300d2..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package de.fitko.fitconnect.client.strategies;
-
-import de.fitko.fitconnect.api.domain.model.submission.CreateSubmission;
-import de.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
-import de.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
-import de.fitko.fitconnect.api.exceptions.RestApiException;
-import de.fitko.fitconnect.api.exceptions.SubmissionNotCreatedException;
-import de.fitko.fitconnect.api.services.Sender;
-import de.fitko.fitconnect.client.model.AttachmentPayload;
-import de.fitko.fitconnect.client.model.SubmissionPayload;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-import java.util.Optional;
-import java.util.UUID;
-
-import static de.fitko.fitconnect.client.util.SubmissionUtil.buildSubmissionToAnnounce;
-import static de.fitko.fitconnect.client.util.SubmissionUtil.buildSubmitSubmission;
-
-public class SendEncryptedSubmissionStrategy implements SubmitStrategy {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(SendEncryptedSubmissionStrategy.class);
-
-    private final Sender sender;
-
-    public SendEncryptedSubmissionStrategy(final Sender sender) {
-        this.sender = sender;
-    }
-
-    @Override
-    public Optional<SubmitSubmission> send(final SubmissionPayload submissionPayload) {
-
-        if (!hasValidPayload(submissionPayload)) {
-            return Optional.empty();
-        }
-
-        try {
-            final UUID submissionId = announceNewSubmission(submissionPayload);
-            final SubmitSubmission submission = buildSubmitSubmission(submissionPayload, submissionId);
-            uploadAttachments(submissionPayload.getAttachments(), submissionId);
-            sender.sendSubmission(submission);
-            LOGGER.info("SUCCESSFULLY HANDED IN SUBMISSION !");
-            return Optional.of(submission);
-
-        } catch (final RestApiException e) {
-            LOGGER.error("Sending submission failed", e);
-        } catch (final SubmissionNotCreatedException e) {
-            LOGGER.error("Failed to announce new submission", e);
-        }
-        return Optional.empty();
-    }
-
-    private UUID announceNewSubmission(final SubmissionPayload submissionPayload) {
-        final CreateSubmission submissionToAnnounce = buildSubmissionToAnnounce(submissionPayload);
-        final SubmissionForPickup announcedSubmission = sender.createSubmission(submissionToAnnounce);
-        return announcedSubmission.getSubmissionId();
-    }
-
-    private void uploadAttachments(final List<AttachmentPayload> attachmentPayloads, final UUID submissionId) {
-        if (attachmentPayloads.isEmpty()) {
-            LOGGER.info("No attachments to upload");
-        } else {
-            LOGGER.info("Uploading {} attachment(s)", attachmentPayloads.size());
-        }
-        for (final AttachmentPayload payload : attachmentPayloads) {
-            sender.uploadAttachment(submissionId, payload.getAttachmentId(), payload.getEncryptedData());
-        }
-    }
-
-    @Override
-    public boolean hasValidPayload(final SubmissionPayload submissionPayload) {
-        if (submissionPayload.getData().getEncryptedData() == null) {
-            LOGGER.error("Data is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getEncryptedMetadata() == null) {
-            LOGGER.error("Metadata is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getServiceTypePayLoad().getName() == null) {
-            LOGGER.error("Service type name is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getServiceTypePayLoad().getLeikaKey() == null) {
-            LOGGER.error("Service type identifier is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getDestinationId() == null) {
-            LOGGER.error("DestinationId is mandatory, but was null.");
-            return false;
-        } else {
-            return true;
-        }
-    }
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/strategies/SendNewSubmissionStrategy.java b/client/src/main/java/de/fitko/fitconnect/client/strategies/SendNewSubmissionStrategy.java
deleted file mode 100644
index b4856f1f0..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/strategies/SendNewSubmissionStrategy.java
+++ /dev/null
@@ -1,234 +0,0 @@
-package de.fitko.fitconnect.client.strategies;
-
-import com.nimbusds.jose.jwk.RSAKey;
-import de.fitko.fitconnect.api.config.Environment;
-import de.fitko.fitconnect.api.domain.model.destination.Destination;
-import de.fitko.fitconnect.api.domain.model.destination.DestinationService;
-import de.fitko.fitconnect.api.domain.model.metadata.Metadata;
-import de.fitko.fitconnect.api.domain.model.metadata.PublicServiceType;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.Attachment;
-import de.fitko.fitconnect.api.domain.model.metadata.data.Data;
-import de.fitko.fitconnect.api.domain.model.metadata.data.MimeType;
-import de.fitko.fitconnect.api.domain.model.metadata.data.SubmissionSchema;
-import de.fitko.fitconnect.api.domain.model.submission.CreateSubmission;
-import de.fitko.fitconnect.api.domain.model.submission.ServiceType;
-import de.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
-import de.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
-import de.fitko.fitconnect.api.domain.validation.ValidationResult;
-import de.fitko.fitconnect.api.exceptions.*;
-import de.fitko.fitconnect.api.services.Sender;
-import de.fitko.fitconnect.client.model.AttachmentPayload;
-import de.fitko.fitconnect.client.model.DataPayload;
-import de.fitko.fitconnect.client.model.ServiceTypePayload;
-import de.fitko.fitconnect.client.model.SubmissionPayload;
-import de.fitko.fitconnect.client.util.SubmissionUtil;
-import org.apache.tika.Tika;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URLConnection;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.util.*;
-import java.util.stream.Collectors;
-
-public class SendNewSubmissionStrategy implements SubmitStrategy {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(SendNewSubmissionStrategy.class);
-
-    private final Sender sender;
-    private final String metadataSchema;
-    private final Environment environment;
-
-    public SendNewSubmissionStrategy(final Sender sender, final String metadataSchema, final Environment environment) {
-        this.sender = sender;
-        this.metadataSchema = metadataSchema;
-        this.environment = environment;
-    }
-
-    @Override
-    public Optional<SubmitSubmission> send(final SubmissionPayload submissionPayload) {
-
-        if (!hasValidPayload(submissionPayload)) return Optional.empty();
-
-        final UUID destinationId = submissionPayload.getDestinationId();
-        final ServiceTypePayload serviceTypePayLoad = submissionPayload.getServiceTypePayLoad();
-        final DataPayload userDataPayload = submissionPayload.getData();
-        final List<AttachmentPayload> attachments = submissionPayload.getAttachments();
-
-        try {
-
-            /** Get encryption key for destination **/
-            final Destination destination = sender.getDestination(destinationId);
-            final RSAKey encryptionKey = sender.getEncryptionKeyForDestination(destinationId, destination.getEncryptionKid());
-            final ValidationResult validationResult = sender.validatePublicKey(encryptionKey);
-            if (validationResult.hasError()) {
-                LOGGER.warn("The public key is not valid, {}", validationResult.getError().getMessage());
-                if (!environment.isSilentKeyValidation()) {
-                    return Optional.empty();
-                }
-            }
-
-            /** Create new submission and announce attachments **/
-            final List<AttachmentPayload> encryptedAttachments = encryptAndHashAttachments(encryptionKey, attachments);
-            final CreateSubmission newSubmission = buildSubmissionToAnnounce(destinationId, serviceTypePayLoad, encryptedAttachments);
-            final SubmissionForPickup announcedSubmission = sender.createSubmission(newSubmission);
-
-            final UUID submissionId = announcedSubmission.getSubmissionId();
-            uploadAttachments(encryptedAttachments, submissionId);
-
-            /** Create attachment metadata including hashes **/
-            final List<Attachment> attachmentMetadata = SubmissionUtil.toAttachmentMetadata(encryptedAttachments);
-
-            /** Build encrypted data payload from user data**/
-            LOGGER.info("Adding data payload with mime-type {} to submission", userDataPayload.getMimeType());
-            final DataPayload encryptedDataPayload = encryptDataPayload(userDataPayload, destination, encryptionKey);
-
-            /** Set encrypted metadata with data payload and attachments **/
-            final Data dataToSend = SubmissionUtil.buildData(encryptedDataPayload);
-            final PublicServiceType publicServiceType = SubmissionUtil.buildPublicServiceType(serviceTypePayLoad);
-            final Metadata metadata = SubmissionUtil.buildMetadata(attachmentMetadata, dataToSend, publicServiceType);
-
-            final ValidationResult validatedMetadata = sender.validateMetadata(metadata, metadataSchema);
-            if (validatedMetadata.hasError()) {
-                LOGGER.error("Metadata does not match schema", validatedMetadata.getError());
-                sender.rejectSubmission(submissionId, destinationId, announcedSubmission.getCaseId());
-                return Optional.empty();
-            }
-
-            /** Prepare submit submission with announced submission id **/
-            final SubmitSubmission submission = new SubmitSubmission();
-            submission.setSubmissionId(submissionId);
-            submission.setEncryptedData(encryptedDataPayload.getEncryptedData());
-            submission.setEncryptedMetadata(sender.encryptObject(encryptionKey, metadata));
-
-            /** Submit submission **/
-            sender.sendSubmission(submission);
-            LOGGER.info("SUCCESSFULLY HANDED IN SUBMISSION !");
-            return Optional.of(submission);
-
-        } catch (final EncryptionException e) {
-            LOGGER.error("Encrypting submission failed", e);
-        } catch (final RestApiException e) {
-            LOGGER.error("Sending submission failed", e);
-        } catch (final SchemaNotFoundException e) {
-            LOGGER.error("Required schema to send valid submission not found", e);
-        } catch (final SubmissionNotCreatedException e) {
-            LOGGER.error("Failed to announce new submission", e);
-        } catch (final KeyNotRetrievedException e) {
-            LOGGER.error("Getting encryption key for destination {} failed", destinationId, e);
-        } catch (final AttachmentCreationException e) {
-            LOGGER.error("Reading file failed. Attachment will not be created.", e);
-        }
-        return Optional.empty();
-    }
-
-    @Override
-    public boolean hasValidPayload(final SubmissionPayload submissionPayload) {
-        if (submissionPayload.getData().getRawData() == null) {
-            LOGGER.error("Data is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getServiceTypePayLoad().getName() == null) {
-            LOGGER.error("Service type name is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getServiceTypePayLoad().getLeikaKey() == null) {
-            LOGGER.error("Service type identifier is mandatory, but was null.");
-            return false;
-        } else if (submissionPayload.getDestinationId() == null) {
-            LOGGER.error("DestinationId is mandatory, but was null.");
-            return false;
-        } else {
-            return true;
-        }
-    }
-
-    private DataPayload encryptDataPayload(final DataPayload dataPayload, final Destination destination, final RSAKey encryptionKey) {
-        final List<SubmissionSchema> submissionSchemas = getSubmissionSchemasFromDestination(destination);
-        final Optional<URI> schemaUriForMimeType = getSchemaUriForMimeType(submissionSchemas, dataPayload.getMimeType());
-        if (schemaUriForMimeType.isEmpty()) {
-            throw new SchemaNotFoundException("No data schema for mime-type " + dataPayload.getMimeType() + " found, please check the allowed type for destination");
-        }
-        final String hashedData = sender.createHash(dataPayload.getRawData());
-        final String encryptedData = sender.encryptBytes(encryptionKey, dataPayload.getRawData());
-        return dataPayload.withSchemaUri(schemaUriForMimeType.get())
-                .withEncryptedData(encryptedData)
-                .withHashedData(hashedData);
-    }
-
-    private List<SubmissionSchema> getSubmissionSchemasFromDestination(final Destination destination) {
-        return destination.getServices().stream()
-                .map(DestinationService::getSubmissionSchemas)
-                .flatMap(Collection::stream)
-                .collect(Collectors.toList());
-    }
-
-    private Optional<URI> getSchemaUriForMimeType(final List<SubmissionSchema> submissionSchemas, final MimeType mimeType) {
-        return submissionSchemas.stream()
-                .filter(schema -> schema.getMimeType().equals(mimeType))
-                .map(SubmissionSchema::getSchemaUri)
-                .findFirst();
-    }
-
-    private void uploadAttachments(final List<AttachmentPayload> attachmentPayloads, final UUID submissionId) {
-        if (attachmentPayloads.isEmpty()) {
-            LOGGER.info("No attachments to upload");
-        } else {
-            LOGGER.info("Uploading {} attachment(s)", attachmentPayloads.size());
-        }
-        for (final AttachmentPayload payload : attachmentPayloads) {
-            sender.uploadAttachment(submissionId, payload.getAttachmentId(), payload.getEncryptedData());
-        }
-    }
-
-    private CreateSubmission buildSubmissionToAnnounce(final UUID destinationId, final ServiceTypePayload serviceTypePayLoad, final List<AttachmentPayload> encryptedAttachments) {
-        final ServiceType serviceType = SubmissionUtil.buildServiceType(serviceTypePayLoad);
-        final List<UUID> attachmentIdsToAnnounce = SubmissionUtil.toAttachmentIds(encryptedAttachments);
-        return SubmissionUtil.createSubmission(destinationId, serviceType, attachmentIdsToAnnounce);
-    }
-
-    private List<AttachmentPayload> encryptAndHashAttachments(final RSAKey encryptionKey, final List<AttachmentPayload> attachments) {
-        return attachments.stream()
-                .filter(Objects::nonNull)
-                .map(this::readRawData)
-                .map(this::hashBytes)
-                .map(payload -> encryptBytes(encryptionKey, payload))
-                .map(this::setMimeType)
-                .collect(Collectors.toList());
-    }
-
-    private AttachmentPayload readRawData(final AttachmentPayload attachmentPayload) {
-        final File file = attachmentPayload.getFile();
-        try {
-            final byte[] rawData = Files.readAllBytes(Paths.get(file.getPath()));
-            return attachmentPayload.withRawData(rawData);
-        } catch (final IOException e) {
-            throw new AttachmentCreationException("Attachment '" + file.getAbsolutePath() + "' could not be read ", e);
-        }
-    }
-
-    private AttachmentPayload encryptBytes(final RSAKey encryptionKey, final AttachmentPayload attachmentPayload) {
-        final String encryptedAttachment = sender.encryptBytes(encryptionKey, attachmentPayload.getRawData());
-        return attachmentPayload.withEncryptedData(encryptedAttachment);
-    }
-
-    private AttachmentPayload hashBytes(final AttachmentPayload attachmentPayload) {
-        final String hashedBytes = sender.createHash(attachmentPayload.getRawData());
-        return attachmentPayload.withHashedData(hashedBytes);
-    }
-
-    private AttachmentPayload setMimeType(final AttachmentPayload attachmentPayload) {
-        final File file = attachmentPayload.getFile();
-        String mimeType;
-        try {
-            final Tika mimeTypeGuesser = new Tika();
-            mimeType = mimeTypeGuesser.detect(file);
-        } catch (final IOException e) {
-            mimeType = URLConnection.guessContentTypeFromName(file.getName());
-        }
-        LOGGER.info("Detected attachment mime-type {}", mimeType);
-        return attachmentPayload.withMimeType(mimeType);
-    }
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/strategies/SubmitStrategy.java b/client/src/main/java/de/fitko/fitconnect/client/strategies/SubmitStrategy.java
deleted file mode 100644
index 92d9e3e55..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/strategies/SubmitStrategy.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package de.fitko.fitconnect.client.strategies;
-
-import de.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
-import de.fitko.fitconnect.client.model.SubmissionPayload;
-
-import java.util.Optional;
-
-/**
- * Provides different strategies for assembling, announcing and handing in a new submission.
- */
-public interface SubmitStrategy {
-
-    /**
-     * Send a submission based on specific assumptions on how the submission is assembled.
-     *
-     * @param submissionPayload all necessary data for creating and submitting a submission
-     *
-     * @return {@link SubmitSubmission}, empty if a validation error or technical error occurred.
-     */
-    Optional<SubmitSubmission> send(SubmissionPayload submissionPayload);
-
-    /**
-     * Validate the payload to be sufficient for submission.
-     *
-     * @param submissionPayload payload of all data needed to create a submission
-     *
-     * @return true if all checks apply, false if data is missing
-     */
-    boolean hasValidPayload(SubmissionPayload submissionPayload);
-}
diff --git a/client/src/main/java/de/fitko/fitconnect/client/util/SubmissionUtil.java b/client/src/main/java/de/fitko/fitconnect/client/util/SubmissionUtil.java
deleted file mode 100644
index 748fdfc56..000000000
--- a/client/src/main/java/de/fitko/fitconnect/client/util/SubmissionUtil.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package de.fitko.fitconnect.client.util;
-
-import de.fitko.fitconnect.api.domain.model.metadata.ContentStructure;
-import de.fitko.fitconnect.api.domain.model.metadata.Metadata;
-import de.fitko.fitconnect.api.domain.model.metadata.PublicServiceType;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.Attachment;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.Purpose;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.signature.AttachmentSignatureType;
-import de.fitko.fitconnect.api.domain.model.metadata.attachment.signature.Hash__1;
-import de.fitko.fitconnect.api.domain.model.metadata.data.Data;
-import de.fitko.fitconnect.api.domain.model.metadata.data.DataSignatureType;
-import de.fitko.fitconnect.api.domain.model.metadata.data.Hash;
-import de.fitko.fitconnect.api.domain.model.metadata.data.SubmissionSchema;
-import de.fitko.fitconnect.api.domain.model.submission.CreateSubmission;
-import de.fitko.fitconnect.api.domain.model.submission.ServiceType;
-import de.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
-import de.fitko.fitconnect.client.model.AttachmentPayload;
-import de.fitko.fitconnect.client.model.DataPayload;
-import de.fitko.fitconnect.client.model.ServiceTypePayload;
-import de.fitko.fitconnect.client.model.SubmissionPayload;
-import de.fitko.fitconnect.core.util.Strings;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-public final class SubmissionUtil {
-
-    public static CreateSubmission createSubmission(final UUID destinationId, final ServiceType serviceType, final List<UUID> attachmentIdsToAnnounce) {
-        return CreateSubmission.builder()
-                .destinationId(destinationId)
-                .announcedAttachments(attachmentIdsToAnnounce)
-                .serviceType(serviceType)
-                .build();
-    }
-
-    public static ServiceType buildServiceType(final ServiceTypePayload serviceTypePayload) {
-        final var serviceType = new ServiceType();
-        serviceType.setName(serviceTypePayload.getName());
-        serviceType.setIdentifier(serviceTypePayload.getLeikaKey());
-        if (!Strings.isNullOrEmpty(serviceTypePayload.getDescription())) {
-            serviceType.setDescription(serviceTypePayload.getDescription());
-        }
-        return serviceType;
-    }
-
-    public static PublicServiceType buildPublicServiceType(final ServiceTypePayload serviceTypePayload) {
-        final var publicServiceType = new PublicServiceType();
-        publicServiceType.setIdentifier(serviceTypePayload.getLeikaKey());
-        publicServiceType.setName(serviceTypePayload.getName());
-        if (serviceTypePayload.getDescription() != null) {
-            publicServiceType.setDescription(serviceTypePayload.getDescription());
-        }
-        return publicServiceType;
-    }
-
-    public static Data buildData(final DataPayload dataPayload) {
-        final var hash = new Hash();
-        hash.setContent(dataPayload.getHashedData());
-        hash.setDataSignatureType(DataSignatureType.SHA_512);
-
-        final var submissionSchema = new SubmissionSchema();
-        submissionSchema.setMimeType(dataPayload.getMimeType());
-        submissionSchema.setSchemaUri(dataPayload.getSchemaUri());
-
-        final var data = new Data();
-        data.setSubmissionSchema(submissionSchema);
-        data.setHash(hash);
-        return data;
-    }
-
-    public static Metadata buildMetadata(final List<Attachment> attachments, final Data data, final PublicServiceType publicServiceType) {
-        final var contentStructure = new ContentStructure();
-        contentStructure.setAttachments(attachments);
-        contentStructure.setData(data);
-
-        final var metadata = new Metadata();
-        metadata.setContentStructure(contentStructure);
-        metadata.setPublicServiceType(publicServiceType);
-        return metadata;
-    }
-
-    public static CreateSubmission buildSubmissionToAnnounce(final SubmissionPayload submissionPayload) {
-        final ServiceType serviceType = buildServiceType(submissionPayload.getServiceTypePayLoad());
-        final List<UUID> attachmentIds = toAttachmentIds(submissionPayload.getAttachments());
-        return createSubmission(submissionPayload.getDestinationId(), serviceType, attachmentIds);
-    }
-
-    public static SubmitSubmission buildSubmitSubmission(final SubmissionPayload submissionPayload, final UUID submissionId) {
-        final SubmitSubmission submission = new SubmitSubmission();
-        submission.setSubmissionId(submissionId);
-        submission.setEncryptedData(submissionPayload.getData().getEncryptedData());
-        submission.setEncryptedMetadata(submissionPayload.getEncryptedMetadata());
-        return submission;
-    }
-
-    public static Attachment toHashedAttachment(final AttachmentPayload attachmentPayload) {
-        final var attachment = new Attachment();
-        attachment.setAttachmentId(attachmentPayload.getAttachmentId());
-        attachment.setPurpose(Purpose.ATTACHMENT);
-        attachment.setFilename(attachmentPayload.getFile().getName());
-        attachment.setMimeType(attachmentPayload.getMimeType());
-
-        final var hash = new Hash__1();
-        hash.setContent(attachmentPayload.getHashedData());
-        hash.setAttachmentSignatureType(AttachmentSignatureType.SHA_512);
-        attachment.setHash(hash);
-        return attachment;
-    }
-
-    public static List<UUID> toAttachmentIds(final List<AttachmentPayload> attachmentPayloads) {
-        return attachmentPayloads.stream()
-                .map(AttachmentPayload::getAttachmentId)
-                .collect(Collectors.toList());
-    }
-
-    public static List<Attachment> toAttachmentMetadata(final List<AttachmentPayload> attachmentPayloads) {
-        return attachmentPayloads.stream()
-                .map(SubmissionUtil::toHashedAttachment)
-                .collect(Collectors.toList());
-    }
-
-    public static Function<Map.Entry<UUID, String>, AttachmentPayload> getEncryptedAttachmentPayload() {
-        return attachment -> AttachmentPayload.builder()
-                .encryptedData(attachment.getValue())
-                .attachmentId(attachment.getKey())
-                .build();
-    }
-
-    public static Function<File, AttachmentPayload> getFileAttachmentPayload(final UUID attachmentId) {
-        return file -> AttachmentPayload.builder()
-                .file(file)
-                .attachmentId(attachmentId)
-                .build();
-    }
-}
diff --git a/client/src/main/java/dev/fitko/fitconnect/client/cmd/CommandLineClient.java b/client/src/main/java/dev/fitko/fitconnect/client/cmd/CommandLineClient.java
index 6a021e9d6..46a7dca54 100644
--- a/client/src/main/java/dev/fitko/fitconnect/client/cmd/CommandLineClient.java
+++ b/client/src/main/java/dev/fitko/fitconnect/client/cmd/CommandLineClient.java
@@ -3,13 +3,13 @@ package dev.fitko.fitconnect.client.cmd;
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.ParameterException;
 import dev.fitko.fitconnect.api.domain.model.metadata.attachment.AttachmentWithData;
-import dev.fitko.fitconnect.client.model.ReceivedSubmission;
 import dev.fitko.fitconnect.client.SenderClient;
 import dev.fitko.fitconnect.client.SubscriberClient;
 import dev.fitko.fitconnect.client.cmd.commands.ListAllSubmissionsCommand;
 import dev.fitko.fitconnect.client.cmd.commands.ListOneSubmissionCommand;
 import dev.fitko.fitconnect.client.cmd.commands.SendSubmissionCommand;
 import dev.fitko.fitconnect.client.cmd.util.AttachmentDataType;
+import dev.fitko.fitconnect.client.model.ReceivedSubmission;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -21,9 +21,6 @@ import java.nio.file.Path;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import static dev.fitko.fitconnect.client.cmd.util.AttachmentDataType.JSON;
-import static dev.fitko.fitconnect.client.cmd.util.AttachmentDataType.XML;
-
 public class CommandLineClient {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(CommandLineClient.class);
@@ -118,15 +115,6 @@ public class CommandLineClient {
         }
     }
 
-    private void sendWithXmlData(final SendSubmissionCommand sendSubmissionCommand, final List<File> files) {
-        senderClient.newSubmission()
-                .withAttachments(files)
-                .withXmlData(sendSubmissionCommand.data)
-                .withDestination(sendSubmissionCommand.destinationId)
-                .withServiceType(sendSubmissionCommand.serviceName, sendSubmissionCommand.leikaKey)
-                .submit();
-    }
-
     private void sendWithJsonData(final SendSubmissionCommand sendSubmissionCommand, final List<File> files) {
         senderClient.newSubmission()
                 .withAttachments(files)
@@ -145,15 +133,6 @@ public class CommandLineClient {
                 .submit();
     }
 
-    private void sendWithJsonData(final SendSubmissionCommand sendSubmissionCommand, final List<File> files) {
-        senderClient.newSubmission()
-                .withAttachments(files)
-                .withJsonData(sendSubmissionCommand.data)
-                .withDestination(sendSubmissionCommand.destinationId)
-                .withServiceType(sendSubmissionCommand.serviceName, sendSubmissionCommand.leikaKey)
-                .submit();
-    }
-
     private String getTargetFolderPath(final ListOneSubmissionCommand listOneSubmissionCommand) {
         if (listOneSubmissionCommand.targetFolder != null) {
             return listOneSubmissionCommand.targetFolder + "/" + listOneSubmissionCommand.submissionId;
diff --git a/client/src/main/java/dev/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java b/client/src/main/java/dev/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
index 562390a51..6374f4fd7 100644
--- a/client/src/main/java/dev/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
+++ b/client/src/main/java/dev/fitko/fitconnect/client/strategies/SendEncryptedSubmissionStrategy.java
@@ -1,7 +1,6 @@
 package dev.fitko.fitconnect.client.strategies;
 
 import dev.fitko.fitconnect.api.domain.model.submission.CreateSubmission;
-import dev.fitko.fitconnect.api.domain.model.submission.ServiceType;
 import dev.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
 import dev.fitko.fitconnect.api.domain.model.submission.SubmitSubmission;
 import dev.fitko.fitconnect.api.exceptions.RestApiException;
@@ -9,7 +8,6 @@ import dev.fitko.fitconnect.api.exceptions.SubmissionNotCreatedException;
 import dev.fitko.fitconnect.api.services.Sender;
 import dev.fitko.fitconnect.client.model.AttachmentPayload;
 import dev.fitko.fitconnect.client.model.SubmissionPayload;
-import dev.fitko.fitconnect.client.util.SubmissionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/client/src/test/java/dev/fitko/fitconnect/client/factory/ApplicationConfigLoaderTest.java b/client/src/test/java/dev/fitko/fitconnect/client/factory/ApplicationConfigLoaderTest.java
index 2739f17a9..af26b47f0 100644
--- a/client/src/test/java/dev/fitko/fitconnect/client/factory/ApplicationConfigLoaderTest.java
+++ b/client/src/test/java/dev/fitko/fitconnect/client/factory/ApplicationConfigLoaderTest.java
@@ -3,7 +3,7 @@ package dev.fitko.fitconnect.client.factory;
 import dev.fitko.fitconnect.api.config.ApplicationConfig;
 import dev.fitko.fitconnect.api.config.Environment;
 import dev.fitko.fitconnect.api.config.SenderConfig;
-import de.fitko.fitconnect.api.exceptions.InitializationException;
+import dev.fitko.fitconnect.api.exceptions.InitializationException;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
-- 
GitLab