Skip to content
Snippets Groups Projects
Commit 80785696 authored by Martin Vogel's avatar Martin Vogel
Browse files

#414 Use runtime exceptions instead of returning optionals if errors occur

parent 3eb37135
No related branches found
No related tags found
2 merge requests!2#414 Remaining changes from MR,!1planning#414 Methoden Signaturen (Zwischenstand)
......@@ -5,28 +5,30 @@ import de.fitko.fitconnect.api.domain.auth.OAuthToken;
import de.fitko.fitconnect.api.domain.model.metadata.Metadata;
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.submission.SubmissionRequest;
import de.fitko.fitconnect.api.domain.model.submission.CreatedSubmission;
import de.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
import de.fitko.fitconnect.api.domain.model.submission.SubmissionSubmit;
import de.fitko.fitconnect.api.domain.validation.ValidationResult;
import de.fitko.fitconnect.api.exceptions.client.ClientNotAuthenticated;
import de.fitko.fitconnect.api.exceptions.AttachmentUploadException;
import de.fitko.fitconnect.api.exceptions.ClientNotAuthenticatedException;
import de.fitko.fitconnect.api.exceptions.EncryptionException;
import de.fitko.fitconnect.api.exceptions.InvalidPublicKeyException;
import de.fitko.fitconnect.api.services.Sender;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* A fluent client for announcing and handing in a {@link SubmissionRequest}
* A fluent client for announcing and handing in a {@link SubmissionSubmit}
*/
public class SenderClient {
private SenderClient() {
}
public static WithDestination build(Sender sender,String clientId, String secret ) {
public static WithDestination build(final Sender sender, final String clientId, final String secret) {
return new ClientBuilder(sender, clientId, secret);
}
......@@ -40,11 +42,11 @@ public class SenderClient {
*/
WithAttachments withDestination(UUID destinationId);
CreatedSubmission send(UUID destinationId, List<File> attachments, String data);
SubmissionForPickup send(UUID destinationId, List<File> attachments, String data);
CreatedSubmission send(UUID destinationId, List<File> attachments, byte[] data);
SubmissionForPickup send(UUID destinationId, List<File> attachments, byte[] data);
CreatedSubmission send(UUID destinationId, List<File> attachments);
SubmissionForPickup send(UUID destinationId, List<File> attachments);
}
public interface WithAttachments {
......@@ -64,16 +66,16 @@ public class SenderClient {
Submit withData(byte[] data);
CreatedSubmission submit();
SubmissionForPickup submit();
}
public interface Submit {
CreatedSubmission submit();
SubmissionForPickup submit();
}
public static class ClientBuilder implements WithDestination, WithAttachments, WithData, Submit {
private Sender sender;
private final Sender sender;
private final String clientId;
private final String secret;
......@@ -83,7 +85,7 @@ public class SenderClient {
private RSAKey encryptionKey;
private UUID submissionId;
public ClientBuilder(Sender sender, String clientId, String secret) {
public ClientBuilder(final Sender sender, final String clientId, final String secret) {
this.sender = sender;
this.clientId = clientId;
this.secret = secret;
......@@ -91,18 +93,18 @@ public class SenderClient {
}
@Override
public WithAttachments withDestination(UUID destinationId) {
public WithAttachments withDestination(final UUID destinationId) {
final RSAKey encryptionKey = sender.getEncryptionKeyForDestination(destinationId);
final ValidationResult validationResult = sender.validatePublicKey(encryptionKey);
if(validationResult.hasErrors()){
throw new RuntimeException("Public encryption key is not valid");
if (validationResult.hasError()) {
throw new InvalidPublicKeyException("Public encryption key is not valid", validationResult.getError());
}
this.encryptionKey = encryptionKey;
return this;
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments, String data) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments, final String data) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.withData(data)
......@@ -110,7 +112,7 @@ public class SenderClient {
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments, byte[] data) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments, final byte[] data) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.withData(data)
......@@ -118,32 +120,29 @@ public class SenderClient {
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.submit();
}
@Override
public Submit withData(String data) {
public Submit withData(final String data) {
return withData(data.getBytes(StandardCharsets.UTF_8));
}
@Override
public Submit withData(byte[] data) {
var unencryptedData = Data.builder().build();
final Optional<Data> encryptedData = sender.encryptSubmissionData(encryptionKey, unencryptedData);
if(encryptedData.isEmpty()){
throw new RuntimeException("Data could not be encrypted");
}
this.data = encryptedData.get();
public Submit withData(final byte[] data) throws EncryptionException {
final var unencryptedData = Data.builder().build();
final Data encryptedData = sender.encryptSubmissionData(encryptionKey, unencryptedData);
this.data = encryptedData;
return this;
}
@Override
public WithData withAttachments(List<File> attachmentFiles) {
public WithData withAttachments(final List<File> attachmentFiles) throws AttachmentUploadException {
final List<Attachment> attachments = readFilesToAttachments(attachmentFiles);
final CreatedSubmission submission = createSubmission(destinationId, attachments);
final SubmissionForPickup submission = createSubmission(destinationId, attachments);
this.submissionId = submission.getSubmissionId();
final List<Attachment> encryptedAttachments = encryptAttachments(encryptionKey, attachments);
sender.uploadAttachments(submissionId, encryptedAttachments);
......@@ -151,66 +150,53 @@ public class SenderClient {
}
@Override
public CreatedSubmission submit() {
final Optional<Metadata> metadata = getMetadata();
if(metadata.isEmpty()){
throw new RuntimeException("Metadata could not be created");
}
return sender.sendSubmission(submissionId, metadata.get()).orElseThrow();
public SubmissionForPickup submit() {
return sender.sendSubmission(submissionId, getMetadata());
}
private Optional<Metadata> getMetadata() {
return this.data == null ? sender.createMetadata(attachments) : sender.createMetadata(data, attachments);
private Metadata getMetadata() {
if (this.data == null) {
return sender.createMetadata(attachments);
}
return sender.createMetadata(data, attachments);
}
private List<Attachment> encryptAttachments(RSAKey encryptionKey, List<Attachment> attachments) {
private List<Attachment> encryptAttachments(final RSAKey encryptionKey, final List<Attachment> attachments) {
return attachments.stream().map(attachment -> encryptAttachment(encryptionKey, attachment)).collect(Collectors.toList());
}
private Attachment encryptAttachment(RSAKey encryptionKey, Attachment attachment) {
final Optional<Attachment> encryptedAttachment = sender.encryptAttachment(encryptionKey, attachment);
if (encryptedAttachment.isEmpty()) {
throw new RuntimeException("Attachment could not be encrypted");
}
return encryptedAttachment.get();
private Attachment encryptAttachment(final RSAKey encryptionKey, final Attachment attachment) {
return sender.encryptAttachment(encryptionKey, attachment);
}
private CreatedSubmission createSubmission(UUID destinationId, List<Attachment> attachments) {
final SubmissionRequest request = SubmissionRequest.builder()
private SubmissionForPickup createSubmission(final UUID destinationId, final List<Attachment> attachments) {
final SubmissionSubmit request = SubmissionSubmit.builder()
.destinationId(destinationId)
.announcedAttachments(asListOfAttachmentsIds(attachments))
.build();
final Optional<CreatedSubmission> response = sender.createSubmission(request);
if (response.isEmpty()) {
throw new RuntimeException("Could not create submission");
}
return response.get();
return sender.createSubmission(request);
}
private List<UUID> asListOfAttachmentsIds(List<Attachment> attachments) {
private List<UUID> asListOfAttachmentsIds(final List<Attachment> attachments) {
return attachments.stream().map(attachment -> attachment.getAttachmentId()).collect(Collectors.toList());
}
private void authenticate() {
final Optional<OAuthToken> oAuthToken = sender.retrieveOAuthToken(clientId, secret);
if (oAuthToken.isEmpty()) {
throw new ClientNotAuthenticated("Client is not authenticated, please authenticate first");
final OAuthToken oAuthToken = sender.retrieveOAuthToken(clientId, secret);
if (oAuthToken == null) {
throw new ClientNotAuthenticatedException("Client is not authenticated, please authenticate first");
}
}
private List<Attachment> readFilesToAttachments(List<File> attachmentFiles) {
private List<Attachment> readFilesToAttachments(final List<File> attachmentFiles) {
return attachmentFiles.stream()
.map(this::readFileToAttachment)
.collect(Collectors.toList());
}
private Attachment readFileToAttachment(File file) {
final Optional<Attachment> attachment = sender.createAttachment(file);
if(attachment.isEmpty()){
throw new RuntimeException("Attachment could not be created");
}
return attachment.get();
private Attachment readFileToAttachment(final File file) {
return sender.createAttachment(file);
}
}
}
\ No newline at end of file
......@@ -5,30 +5,30 @@ import de.fitko.fitconnect.api.domain.auth.OAuthToken;
import de.fitko.fitconnect.api.domain.model.metadata.Metadata;
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.submission.SubmissionRequest;
import de.fitko.fitconnect.api.domain.model.submission.CreatedSubmission;
import de.fitko.fitconnect.api.domain.model.submission.SubmissionForPickup;
import de.fitko.fitconnect.api.domain.model.submission.SubmissionSubmit;
import de.fitko.fitconnect.api.domain.validation.ValidationResult;
import de.fitko.fitconnect.api.exceptions.client.ClientNotAuthenticated;
import de.fitko.fitconnect.api.exceptions.ClientNotAuthenticatedException;
import de.fitko.fitconnect.api.services.Sender;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* A fluent client for announcing and handing in a {@link SubmissionRequest}
* A fluent client for announcing and handing in a {@link SubmissionSubmit}
*/
public class FluentSenderClient extends Client {
private FluentSenderClient() {}
private FluentSenderClient() {
}
public static WithDestination build() {
final Sender sender = getService(Sender.class);
final String clientId = getProperty("clientId");
final String secret = getProperty("clientSecret");
final String clientId = getProperty("clientId");
final String secret = getProperty("clientSecret");
return new ClientBuilder(sender, clientId, secret);
}
......@@ -42,11 +42,11 @@ public class FluentSenderClient extends Client {
*/
WithAttachments withDestination(UUID destinationId);
CreatedSubmission send(UUID destinationId, List<File> attachments, String data);
SubmissionForPickup send(UUID destinationId, List<File> attachments, String data);
CreatedSubmission send(UUID destinationId, List<File> attachments, byte[] data);
SubmissionForPickup send(UUID destinationId, List<File> attachments, byte[] data);
CreatedSubmission send(UUID destinationId, List<File> attachments);
SubmissionForPickup send(UUID destinationId, List<File> attachments);
}
public interface WithAttachments {
......@@ -66,16 +66,16 @@ public class FluentSenderClient extends Client {
Submit withData(byte[] data);
CreatedSubmission submit();
SubmissionForPickup submit();
}
public interface Submit {
CreatedSubmission submit();
SubmissionForPickup submit();
}
public static class ClientBuilder implements WithDestination, WithAttachments, WithData, Submit {
private Sender sender;
private final Sender sender;
private final String clientId;
private final String secret;
......@@ -84,8 +84,9 @@ public class FluentSenderClient extends Client {
private List<Attachment> attachments;
private RSAKey encryptionKey;
private UUID submissionId;
private OAuthToken token;
public ClientBuilder(Sender sender, String clientId, String secret) {
public ClientBuilder(final Sender sender, final String clientId, final String secret) {
this.sender = sender;
this.clientId = clientId;
this.secret = secret;
......@@ -93,18 +94,18 @@ public class FluentSenderClient extends Client {
}
@Override
public WithAttachments withDestination(UUID destinationId) {
public WithAttachments withDestination(final UUID destinationId) {
final RSAKey encryptionKey = sender.getEncryptionKeyForDestination(destinationId);
final ValidationResult validationResult = sender.validatePublicKey(encryptionKey);
if(validationResult.hasErrors()){
throw new RuntimeException("Public encryption key is not valid");
if (validationResult.hasError()) {
throw new RuntimeException("Public encryption key is not valid", validationResult.getError());
}
this.encryptionKey = encryptionKey;
return this;
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments, String data) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments, final String data) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.withData(data)
......@@ -112,7 +113,7 @@ public class FluentSenderClient extends Client {
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments, byte[] data) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments, final byte[] data) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.withData(data)
......@@ -120,32 +121,29 @@ public class FluentSenderClient extends Client {
}
@Override
public CreatedSubmission send(UUID destinationId, List<File> attachments) {
public SubmissionForPickup send(final UUID destinationId, final List<File> attachments) {
return this.withDestination(destinationId)
.withAttachments(attachments)
.submit();
}
@Override
public Submit withData(String data) {
public Submit withData(final String data) {
return withData(data.getBytes(StandardCharsets.UTF_8));
}
@Override
public Submit withData(byte[] data) {
var unencryptedData = Data.builder().build();
final Optional<Data> encryptedData = sender.encryptSubmissionData(encryptionKey, unencryptedData);
if(encryptedData.isEmpty()){
throw new RuntimeException("Data could not be encrypted");
}
this.data = encryptedData.get();
public Submit withData(final byte[] data) {
final var unencryptedData = Data.builder().build();
final Data encryptedData = sender.encryptSubmissionData(encryptionKey, unencryptedData);
this.data = encryptedData;
return this;
}
@Override
public WithData withAttachments(List<File> attachmentFiles) {
public WithData withAttachments(final List<File> attachmentFiles) {
final List<Attachment> attachments = readFilesToAttachments(attachmentFiles);
final CreatedSubmission submission = createSubmission(destinationId, attachments);
final SubmissionForPickup submission = createSubmission(destinationId, attachments);
this.submissionId = submission.getSubmissionId();
final List<Attachment> encryptedAttachments = encryptAttachments(encryptionKey, attachments);
sender.uploadAttachments(submissionId, encryptedAttachments);
......@@ -153,66 +151,50 @@ public class FluentSenderClient extends Client {
}
@Override
public CreatedSubmission submit() {
final Optional<Metadata> metadata = getMetadata();
if(metadata.isEmpty()){
throw new RuntimeException("Metadata could not be created");
}
return sender.sendSubmission(submissionId, metadata.get()).orElseThrow();
public SubmissionForPickup submit() {
return sender.sendSubmission(submissionId, getMetadata());
}
private Optional<Metadata> getMetadata() {
private Metadata getMetadata() {
return this.data == null ? sender.createMetadata(attachments) : sender.createMetadata(data, attachments);
}
private List<Attachment> encryptAttachments(RSAKey encryptionKey, List<Attachment> attachments) {
private List<Attachment> encryptAttachments(final RSAKey encryptionKey, final List<Attachment> attachments) {
return attachments.stream().map(attachment -> encryptAttachment(encryptionKey, attachment)).collect(Collectors.toList());
}
private Attachment encryptAttachment(RSAKey encryptionKey, Attachment attachment) {
final Optional<Attachment> encryptedAttachment = sender.encryptAttachment(encryptionKey, attachment);
if (encryptedAttachment.isEmpty()) {
throw new RuntimeException("Attachment could not be encrypted");
}
return encryptedAttachment.get();
private Attachment encryptAttachment(final RSAKey encryptionKey, final Attachment attachment) {
return sender.encryptAttachment(encryptionKey, attachment);
}
private CreatedSubmission createSubmission(UUID destinationId, List<Attachment> attachments) {
final SubmissionRequest request = SubmissionRequest.builder()
private SubmissionForPickup createSubmission(final UUID destinationId, final List<Attachment> attachments) {
final SubmissionSubmit request = SubmissionSubmit.builder()
.destinationId(destinationId)
.announcedAttachments(asListOfAttachmentsIds(attachments))
.build();
final Optional<CreatedSubmission> response = sender.createSubmission(request);
if (response.isEmpty()) {
throw new RuntimeException("Could not create submission");
}
return response.get();
return sender.createSubmission(request);
}
private List<UUID> asListOfAttachmentsIds(List<Attachment> attachments) {
private List<UUID> asListOfAttachmentsIds(final List<Attachment> attachments) {
return attachments.stream().map(attachment -> attachment.getAttachmentId()).collect(Collectors.toList());
}
private void authenticate() {
final Optional<OAuthToken> oAuthToken = sender.retrieveOAuthToken(clientId, secret);
if (oAuthToken.isEmpty()) {
throw new ClientNotAuthenticated("Client is not authenticated, please authenticate first");
final OAuthToken oAuthToken = sender.retrieveOAuthToken(clientId, secret);
if (oAuthToken == null) {
throw new ClientNotAuthenticatedException("Could not authenticate client, please authenticate first");
}
}
private List<Attachment> readFilesToAttachments(List<File> attachmentFiles) {
private List<Attachment> readFilesToAttachments(final List<File> attachmentFiles) {
return attachmentFiles.stream()
.map(this::readFileToAttachment)
.collect(Collectors.toList());
}
private Attachment readFileToAttachment(File file) {
final Optional<Attachment> attachment = sender.createAttachment(file);
if(attachment.isEmpty()){
throw new RuntimeException("Attachment could not be created");
}
return attachment.get();
private Attachment readFileToAttachment(final File file) {
return sender.createAttachment(file);
}
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment