dev.fitko.fitconnect.api.domain.subscriber.SendableReply Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of client Show documentation
Show all versions of client Show documentation
Library that provides client access to the FIT-Connect api-endpoints for sending, subscribing and
routing
The newest version!
package dev.fitko.fitconnect.api.domain.subscriber;
import dev.fitko.fitconnect.api.config.ApplicationConfig;
import dev.fitko.fitconnect.api.domain.model.attachment.Attachment;
import dev.fitko.fitconnect.api.domain.model.callback.Callback;
import dev.fitko.fitconnect.api.domain.model.metadata.AdditionalReferenceInfo;
import dev.fitko.fitconnect.api.domain.model.metadata.AuthenticationInformation;
import dev.fitko.fitconnect.api.domain.model.metadata.ContentStructure;
import dev.fitko.fitconnect.api.domain.model.metadata.attachment.Purpose;
import dev.fitko.fitconnect.api.domain.model.metadata.data.MimeType;
import dev.fitko.fitconnect.api.domain.model.metadata.data.SubmissionSchema;
import dev.fitko.fitconnect.api.domain.model.metadata.payment.PaymentInformation;
import dev.fitko.fitconnect.api.domain.model.reply.replychannel.ReplyChannel;
import dev.fitko.fitconnect.api.domain.subscriber.steps.BuildReplyStep;
import dev.fitko.fitconnect.api.domain.subscriber.steps.OptionalReplyPropertiesStep;
import dev.fitko.fitconnect.api.domain.subscriber.steps.ReplyDataStep;
import lombok.Getter;
import java.io.ByteArrayInputStream;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
@Getter
public final class SendableReply {
private final UUID destinationId;
private final UUID caseId;
private final UUID originalSubmissionId;
private final byte[] data;
private final SubmissionSchema submissionSchema;
private final List attachments;
private final String serviceName;
private final String serviceIdentifier;
private final List authenticationInformation;
private final AdditionalReferenceInfo additionalReferenceInfo;
private final PaymentInformation paymentInformation;
private final ReplyChannel replyChannel;
private final Callback callback;
private SendableReply(final Builder builder) {
destinationId = builder.getDestinationId();
caseId = builder.getCaseId();
originalSubmissionId = builder.getOriginalSubmissionId();
data = builder.getData();
submissionSchema = new SubmissionSchema(builder.getSchemaUri(), builder.getDataMimeType());
attachments = Collections.unmodifiableList(builder.getAttachments());
serviceName = builder.getServiceName();
serviceIdentifier = builder.getServiceIdentifier();
authenticationInformation = builder.getAuthenticationInformation();
additionalReferenceInfo = builder.getAdditionalReferenceInfo();
replyChannel = builder.getReplyChannel();
paymentInformation = builder.getPaymentInformation();
callback = builder.getCallback();
}
public static ReplyDataStep from(final ReceivedSubmission receivedSubmission) {
return new Builder(receivedSubmission);
}
@Getter
private static final class Builder implements ReplyDataStep, OptionalReplyPropertiesStep, BuildReplyStep {
private final UUID destinationId;
private final UUID caseId;
private final UUID originalSubmissionId;
private final List attachments = new ArrayList<>();
private byte[] data;
private MimeType dataMimeType;
private final String serviceName;
private final String serviceIdentifier;
private final List authenticationInformation;
private final PaymentInformation paymentInformation;
private final ReplyChannel replyChannel;
private final AdditionalReferenceInfo additionalReferenceInfo;
private URI schemaUri;
private final Callback callback;
private static final byte[] EMPTY_DATA = new byte[0];
private Builder(final ReceivedSubmission receivedSubmission) {
caseId = receivedSubmission.getCaseId();
originalSubmissionId = receivedSubmission.getSubmissionId();
destinationId = receivedSubmission.getDestinationId();
serviceIdentifier = receivedSubmission.getServiceType().getIdentifier();
serviceName = receivedSubmission.getServiceType().getName();
callback = receivedSubmission.getCallback();
replyChannel = receivedSubmission.getMetadata().getReplyChannel();
authenticationInformation = receivedSubmission.getMetadata().getAuthenticationInformation();
paymentInformation = receivedSubmission.getMetadata().getPaymentInformation();
additionalReferenceInfo = receivedSubmission.getMetadata().getAdditionalReferenceInfo();
}
public OptionalReplyPropertiesStep setJsonData(final String replyData, final URI replyDataSchemaUri) {
setJsonData(replyData.getBytes(StandardCharsets.UTF_8), replyDataSchemaUri);
return this;
}
@Override
public OptionalReplyPropertiesStep setJsonData(byte[] data, URI schemaUri) {
this.schemaUri = schemaUri;
this.dataMimeType = MimeType.APPLICATION_JSON;
this.data = getValidatedData(data);
return this;
}
public OptionalReplyPropertiesStep setXmlData(final String replyData, final URI replyDataSchemaUri) {
setXmlData(replyData.getBytes(StandardCharsets.UTF_8), replyDataSchemaUri);
return this;
}
@Override
public OptionalReplyPropertiesStep setXmlData(byte[] data, URI schemaUri) {
this.schemaUri = schemaUri;
this.dataMimeType = MimeType.APPLICATION_XML;
this.data = getValidatedData(data);
return this;
}
@Override
public OptionalReplyPropertiesStep addAttachments(final List attachments) {
if (attachments != null && !attachments.isEmpty()) {
this.attachments.addAll(attachments);
}
return this;
}
@Override
public OptionalReplyPropertiesStep addAttachment(final Attachment attachment) {
this.attachments.add(attachment);
return this;
}
@Override
public SendableReply build() {
return new SendableReply(this);
}
/**
* Sets the reply data either as attachment or as byte[], depending on allowed size.
* In case of an attachment, the data will be transferred with {@link Purpose#DATA} and the data within the {@link ContentStructure} will zero bytes.
*/
private byte[] getValidatedData(byte[] data) {
if (data.length > ApplicationConfig.MAX_DATA_SIZE_IN_BYTE) {
attachments.add(Attachment.fromSubmissionData(new ByteArrayInputStream(data), dataMimeType));
return EMPTY_DATA;
}
return data;
}
}
}