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