additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ @java.lang.Override
+ public Builder from(DocSignaturesCompleteRequest other) {
+ documentPassword(other.getDocumentPassword());
+ cms(other.getCms());
+ expectedVersion(other.getExpectedVersion());
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("cms")
+ public ExpectedVersionStage cms(@NotNull String cms) {
+ this.cms = Objects.requireNonNull(cms, "cms must not be null");
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("expectedVersion")
+ public _FinalStage expectedVersion(@NotNull DocSignaturesCompleteRequestExpectedVersion expectedVersion) {
+ this.expectedVersion = Objects.requireNonNull(expectedVersion, "expectedVersion must not be null");
+ return this;
+ }
+
+ /**
+ * Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ * @return Reference to {@code this} so that method calls can be chained together.
+ */
+ @java.lang.Override
+ public _FinalStage documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ /**
+ * Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @java.lang.Override
+ public _FinalStage documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ @java.lang.Override
+ public DocSignaturesCompleteRequest build() {
+ return new DocSignaturesCompleteRequest(documentPassword, cms, expectedVersion, additionalProperties);
+ }
+
+ @java.lang.Override
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ @java.lang.Override
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/signatures/requests/ListSignaturesRequest.java b/src/main/java/api/resources/doc/signatures/requests/ListSignaturesRequest.java
new file mode 100644
index 0000000..834511c
--- /dev/null
+++ b/src/main/java/api/resources/doc/signatures/requests/ListSignaturesRequest.java
@@ -0,0 +1,108 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.signatures.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = ListSignaturesRequest.Builder.class)
+public final class ListSignaturesRequest {
+ private final Optional documentPassword;
+
+ private final Map additionalProperties;
+
+ private ListSignaturesRequest(Optional documentPassword, Map additionalProperties) {
+ this.documentPassword = documentPassword;
+ this.additionalProperties = additionalProperties;
+ }
+
+ /**
+ * @return Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @JsonIgnore
+ public Optional getDocumentPassword() {
+ return documentPassword;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof ListSignaturesRequest && equalTo((ListSignaturesRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(ListSignaturesRequest other) {
+ return documentPassword.equals(other.documentPassword);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.documentPassword);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional documentPassword = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(ListSignaturesRequest other) {
+ documentPassword(other.getDocumentPassword());
+ return this;
+ }
+
+ /**
+ * Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ public Builder documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ public Builder documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ public ListSignaturesRequest build() {
+ return new ListSignaturesRequest(documentPassword, additionalProperties);
+ }
+
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/signatures/requests/PrepareSignaturesRequest.java b/src/main/java/api/resources/doc/signatures/requests/PrepareSignaturesRequest.java
new file mode 100644
index 0000000..39f8b6f
--- /dev/null
+++ b/src/main/java/api/resources/doc/signatures/requests/PrepareSignaturesRequest.java
@@ -0,0 +1,108 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.signatures.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = PrepareSignaturesRequest.Builder.class)
+public final class PrepareSignaturesRequest {
+ private final Optional documentPassword;
+
+ private final Map additionalProperties;
+
+ private PrepareSignaturesRequest(Optional documentPassword, Map additionalProperties) {
+ this.documentPassword = documentPassword;
+ this.additionalProperties = additionalProperties;
+ }
+
+ /**
+ * @return Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ @JsonIgnore
+ public Optional getDocumentPassword() {
+ return documentPassword;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof PrepareSignaturesRequest && equalTo((PrepareSignaturesRequest) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(PrepareSignaturesRequest other) {
+ return documentPassword.equals(other.documentPassword);
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.documentPassword);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder {
+ private Optional documentPassword = Optional.empty();
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ public Builder from(PrepareSignaturesRequest other) {
+ documentPassword(other.getDocumentPassword());
+ return this;
+ }
+
+ /**
+ * Base64-encoded password for an encrypted document. Valid only with the API token (403 anywhere else). An encrypted document answers 422 DocPasswordRequired when the header is absent. Viewer doc JWTs use the SDK password-session flow instead.
+ */
+ public Builder documentPassword(Optional documentPassword) {
+ this.documentPassword = documentPassword;
+ return this;
+ }
+
+ public Builder documentPassword(String documentPassword) {
+ this.documentPassword = Optional.ofNullable(documentPassword);
+ return this;
+ }
+
+ public PrepareSignaturesRequest build() {
+ return new PrepareSignaturesRequest(documentPassword, additionalProperties);
+ }
+
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/signatures/types/AnalysisSignaturesRequestLevel.java b/src/main/java/api/resources/doc/signatures/types/AnalysisSignaturesRequestLevel.java
new file mode 100644
index 0000000..d95b797
--- /dev/null
+++ b/src/main/java/api/resources/doc/signatures/types/AnalysisSignaturesRequestLevel.java
@@ -0,0 +1,105 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.signatures.types;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+public final class AnalysisSignaturesRequestLevel {
+ public static final AnalysisSignaturesRequestLevel LTA = new AnalysisSignaturesRequestLevel(Value.LTA, "lta");
+
+ public static final AnalysisSignaturesRequestLevel ANNOTATE =
+ new AnalysisSignaturesRequestLevel(Value.ANNOTATE, "annotate");
+
+ public static final AnalysisSignaturesRequestLevel FILL = new AnalysisSignaturesRequestLevel(Value.FILL, "fill");
+
+ public static final AnalysisSignaturesRequestLevel NONE = new AnalysisSignaturesRequestLevel(Value.NONE, "none");
+
+ private final Value value;
+
+ private final String string;
+
+ AnalysisSignaturesRequestLevel(Value value, String string) {
+ this.value = value;
+ this.string = string;
+ }
+
+ public Value getEnumValue() {
+ return value;
+ }
+
+ @java.lang.Override
+ @JsonValue
+ public String toString() {
+ return this.string;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ return (this == other)
+ || (other instanceof AnalysisSignaturesRequestLevel
+ && this.string.equals(((AnalysisSignaturesRequestLevel) other).string));
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return this.string.hashCode();
+ }
+
+ public T visit(Visitor visitor) {
+ switch (value) {
+ case LTA:
+ return visitor.visitLta();
+ case ANNOTATE:
+ return visitor.visitAnnotate();
+ case FILL:
+ return visitor.visitFill();
+ case NONE:
+ return visitor.visitNone();
+ case UNKNOWN:
+ default:
+ return visitor.visitUnknown(string);
+ }
+ }
+
+ @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
+ public static AnalysisSignaturesRequestLevel valueOf(String value) {
+ switch (value) {
+ case "lta":
+ return LTA;
+ case "annotate":
+ return ANNOTATE;
+ case "fill":
+ return FILL;
+ case "none":
+ return NONE;
+ default:
+ return new AnalysisSignaturesRequestLevel(Value.UNKNOWN, value);
+ }
+ }
+
+ public enum Value {
+ NONE,
+
+ LTA,
+
+ FILL,
+
+ ANNOTATE,
+
+ UNKNOWN
+ }
+
+ public interface Visitor {
+ T visitNone();
+
+ T visitLta();
+
+ T visitFill();
+
+ T visitAnnotate();
+
+ T visitUnknown(String unknownType);
+ }
+}
diff --git a/src/main/java/api/resources/doc/signatures/types/DocSignaturesCompleteRequestExpectedVersion.java b/src/main/java/api/resources/doc/signatures/types/DocSignaturesCompleteRequestExpectedVersion.java
new file mode 100644
index 0000000..d0644ba
--- /dev/null
+++ b/src/main/java/api/resources/doc/signatures/types/DocSignaturesCompleteRequestExpectedVersion.java
@@ -0,0 +1,142 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.signatures.types;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import org.jetbrains.annotations.NotNull;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = DocSignaturesCompleteRequestExpectedVersion.Builder.class)
+public final class DocSignaturesCompleteRequestExpectedVersion {
+ private final String baseSha256;
+
+ private final int editsVersion;
+
+ private final Map additionalProperties;
+
+ private DocSignaturesCompleteRequestExpectedVersion(
+ String baseSha256, int editsVersion, Map additionalProperties) {
+ this.baseSha256 = baseSha256;
+ this.editsVersion = editsVersion;
+ this.additionalProperties = additionalProperties;
+ }
+
+ @JsonProperty("baseSha256")
+ public String getBaseSha256() {
+ return baseSha256;
+ }
+
+ @JsonProperty("editsVersion")
+ public int getEditsVersion() {
+ return editsVersion;
+ }
+
+ @java.lang.Override
+ public boolean equals(Object other) {
+ if (this == other) return true;
+ return other instanceof DocSignaturesCompleteRequestExpectedVersion
+ && equalTo((DocSignaturesCompleteRequestExpectedVersion) other);
+ }
+
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return this.additionalProperties;
+ }
+
+ private boolean equalTo(DocSignaturesCompleteRequestExpectedVersion other) {
+ return baseSha256.equals(other.baseSha256) && editsVersion == other.editsVersion;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ return Objects.hash(this.baseSha256, this.editsVersion);
+ }
+
+ @java.lang.Override
+ public String toString() {
+ return ObjectMappers.stringify(this);
+ }
+
+ public static BaseSha256Stage builder() {
+ return new Builder();
+ }
+
+ public interface BaseSha256Stage {
+ EditsVersionStage baseSha256(@NotNull String baseSha256);
+
+ Builder from(DocSignaturesCompleteRequestExpectedVersion other);
+ }
+
+ public interface EditsVersionStage {
+ _FinalStage editsVersion(int editsVersion);
+ }
+
+ public interface _FinalStage {
+ DocSignaturesCompleteRequestExpectedVersion build();
+
+ _FinalStage additionalProperty(String key, Object value);
+
+ _FinalStage additionalProperties(Map additionalProperties);
+ }
+
+ @JsonIgnoreProperties(ignoreUnknown = true)
+ public static final class Builder implements BaseSha256Stage, EditsVersionStage, _FinalStage {
+ private String baseSha256;
+
+ private int editsVersion;
+
+ @JsonAnySetter
+ private Map additionalProperties = new HashMap<>();
+
+ private Builder() {}
+
+ @java.lang.Override
+ public Builder from(DocSignaturesCompleteRequestExpectedVersion other) {
+ baseSha256(other.getBaseSha256());
+ editsVersion(other.getEditsVersion());
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("baseSha256")
+ public EditsVersionStage baseSha256(@NotNull String baseSha256) {
+ this.baseSha256 = Objects.requireNonNull(baseSha256, "baseSha256 must not be null");
+ return this;
+ }
+
+ @java.lang.Override
+ @JsonSetter("editsVersion")
+ public _FinalStage editsVersion(int editsVersion) {
+ this.editsVersion = editsVersion;
+ return this;
+ }
+
+ @java.lang.Override
+ public DocSignaturesCompleteRequestExpectedVersion build() {
+ return new DocSignaturesCompleteRequestExpectedVersion(baseSha256, editsVersion, additionalProperties);
+ }
+
+ @java.lang.Override
+ public Builder additionalProperty(String key, Object value) {
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ @java.lang.Override
+ public Builder additionalProperties(Map additionalProperties) {
+ this.additionalProperties.putAll(additionalProperties);
+ return this;
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/versions/AsyncRawVersionsClient.java b/src/main/java/api/resources/doc/versions/AsyncRawVersionsClient.java
new file mode 100644
index 0000000..cdc79a3
--- /dev/null
+++ b/src/main/java/api/resources/doc/versions/AsyncRawVersionsClient.java
@@ -0,0 +1,804 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.versions;
+
+import com.cloudpdf.api.core.ClientOptions;
+import com.cloudpdf.api.core.CloudPDFApiException;
+import com.cloudpdf.api.core.CloudPDFClientHttpResponse;
+import com.cloudpdf.api.core.CloudPDFException;
+import com.cloudpdf.api.core.ObjectMappers;
+import com.cloudpdf.api.core.QueryStringMapper;
+import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.core.ResponseBodyInputStream;
+import com.cloudpdf.api.core.RetryInterceptor;
+import com.cloudpdf.api.errors.BadRequestError;
+import com.cloudpdf.api.errors.NotFoundError;
+import com.cloudpdf.api.resources.doc.versions.requests.AnalysisVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.DownloadVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.ListVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.RevisionVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureContentsVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureDigestVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignaturesVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.types.SignatureDigestVersionsRequestAlgorithm;
+import com.cloudpdf.api.types.DocVersionsAnalysis200Response;
+import com.cloudpdf.api.types.DocVersionsList200Response;
+import com.cloudpdf.api.types.DocVersionsSignatures200Response;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.concurrent.CompletableFuture;
+import okhttp3.Call;
+import okhttp3.Callback;
+import okhttp3.Headers;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import org.jetbrains.annotations.NotNull;
+
+public class AsyncRawVersionsClient {
+ protected final ClientOptions clientOptions;
+
+ public AsyncRawVersionsClient(ClientOptions clientOptions) {
+ this.clientOptions = clientOptions;
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture> list(String docId) {
+ return list(docId, ListVersionsRequest.builder().build());
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture> list(
+ String docId, RequestOptions requestOptions) {
+ return list(docId, ListVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture> list(
+ String docId, ListVersionsRequest request) {
+ return list(docId, request, null);
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture> list(
+ String docId, ListVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocVersionsList200Response.class),
+ response));
+ return;
+ }
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture> analysis(
+ String docId, String sha) {
+ return analysis(docId, sha, AnalysisVersionsRequest.builder().build());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture> analysis(
+ String docId, String sha, RequestOptions requestOptions) {
+ return analysis(docId, sha, AnalysisVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture> analysis(
+ String docId, String sha, AnalysisVersionsRequest request) {
+ return analysis(docId, sha, request, null);
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture> analysis(
+ String docId, String sha, AnalysisVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/analysis")
+ .addPathSegment(sha);
+ if (request.getSinceSignature().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "since.signature", request.getSinceSignature().get(), false);
+ }
+ if (request.getSinceRevision().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "since.revision", request.getSinceRevision().get(), false);
+ }
+ if (request.getLevel().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "level", request.getLevel().get(), false);
+ }
+ if (request.getUntil().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "until", request.getUntil().get(), false);
+ }
+ if (request.getPolicy().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "policy", request.getPolicy().get(), false);
+ }
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future =
+ new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocVersionsAnalysis200Response.class),
+ response));
+ return;
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ future.completeExceptionally(new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ case 404:
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class),
+ response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> download(String docId, String sha) {
+ return download(docId, sha, DownloadVersionsRequest.builder().build());
+ }
+
+ public CompletableFuture> download(
+ String docId, String sha, RequestOptions requestOptions) {
+ return download(docId, sha, DownloadVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CompletableFuture> download(
+ String docId, String sha, DownloadVersionsRequest request) {
+ return download(docId, sha, request, null);
+ }
+
+ public CompletableFuture> download(
+ String docId, String sha, DownloadVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/download")
+ .addPathSegment(sha);
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try {
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ future.complete(
+ new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response));
+ return;
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> revision(String docId, String sha, int index) {
+ return revision(docId, sha, index, RevisionVersionsRequest.builder().build());
+ }
+
+ public CompletableFuture> revision(
+ String docId, String sha, int index, RequestOptions requestOptions) {
+ return revision(docId, sha, index, RevisionVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CompletableFuture> revision(
+ String docId, String sha, int index, RevisionVersionsRequest request) {
+ return revision(docId, sha, index, request, null);
+ }
+
+ public CompletableFuture> revision(
+ String docId, String sha, int index, RevisionVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/revisions")
+ .addPathSegment(sha)
+ .addPathSegment(Integer.toString(index));
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try {
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ future.complete(
+ new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response));
+ return;
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ public CompletableFuture> signatures(
+ String docId, String sha) {
+ return signatures(docId, sha, SignaturesVersionsRequest.builder().build());
+ }
+
+ public CompletableFuture> signatures(
+ String docId, String sha, RequestOptions requestOptions) {
+ return signatures(docId, sha, SignaturesVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CompletableFuture> signatures(
+ String docId, String sha, SignaturesVersionsRequest request) {
+ return signatures(docId, sha, request, null);
+ }
+
+ public CompletableFuture> signatures(
+ String docId, String sha, SignaturesVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha);
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future =
+ new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try (ResponseBody responseBody = response.body()) {
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ future.complete(new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(
+ responseBodyString, DocVersionsSignatures200Response.class),
+ response));
+ return;
+ }
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture> signatureContents(
+ String docId, String sha, String fieldKey) {
+ return signatureContents(
+ docId, sha, fieldKey, SignatureContentsVersionsRequest.builder().build());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture> signatureContents(
+ String docId, String sha, String fieldKey, RequestOptions requestOptions) {
+ return signatureContents(
+ docId, sha, fieldKey, SignatureContentsVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture> signatureContents(
+ String docId, String sha, String fieldKey, SignatureContentsVersionsRequest request) {
+ return signatureContents(docId, sha, fieldKey, request, null);
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture> signatureContents(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureContentsVersionsRequest request,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha)
+ .addPathSegment(fieldKey)
+ .addPathSegments("contents");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try {
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ future.complete(
+ new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response));
+ return;
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture> signatureDigest(
+ String docId, String sha, String fieldKey, SignatureDigestVersionsRequestAlgorithm algorithm) {
+ return signatureDigest(
+ docId,
+ sha,
+ fieldKey,
+ algorithm,
+ SignatureDigestVersionsRequest.builder().build());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture> signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ RequestOptions requestOptions) {
+ return signatureDigest(
+ docId,
+ sha,
+ fieldKey,
+ algorithm,
+ SignatureDigestVersionsRequest.builder().build(),
+ requestOptions);
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture> signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request) {
+ return signatureDigest(docId, sha, fieldKey, algorithm, request, null);
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture> signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha)
+ .addPathSegment(fieldKey)
+ .addPathSegments("digest")
+ .addPathSegment(algorithm.toString());
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ CompletableFuture> future = new CompletableFuture<>();
+ client.newCall(okhttpRequest).enqueue(new Callback() {
+ @Override
+ public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
+ try {
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ future.complete(
+ new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response));
+ return;
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ future.completeExceptionally(new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response));
+ return;
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ future.completeExceptionally(new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response));
+ return;
+ } catch (JsonProcessingException e) {
+ future.completeExceptionally(
+ new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e));
+ } catch (IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ }
+
+ @Override
+ public void onFailure(@NotNull Call call, @NotNull IOException e) {
+ future.completeExceptionally(new CloudPDFException("Network error executing HTTP request", e));
+ }
+ });
+ return future;
+ }
+}
diff --git a/src/main/java/api/resources/doc/versions/AsyncVersionsClient.java b/src/main/java/api/resources/doc/versions/AsyncVersionsClient.java
new file mode 100644
index 0000000..b176fbd
--- /dev/null
+++ b/src/main/java/api/resources/doc/versions/AsyncVersionsClient.java
@@ -0,0 +1,244 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.versions;
+
+import com.cloudpdf.api.core.ClientOptions;
+import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.resources.doc.versions.requests.AnalysisVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.DownloadVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.ListVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.RevisionVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureContentsVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureDigestVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignaturesVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.types.SignatureDigestVersionsRequestAlgorithm;
+import com.cloudpdf.api.types.DocVersionsAnalysis200Response;
+import com.cloudpdf.api.types.DocVersionsList200Response;
+import com.cloudpdf.api.types.DocVersionsSignatures200Response;
+import java.io.InputStream;
+import java.util.concurrent.CompletableFuture;
+
+public class AsyncVersionsClient {
+ protected final ClientOptions clientOptions;
+
+ private final AsyncRawVersionsClient rawClient;
+
+ public AsyncVersionsClient(ClientOptions clientOptions) {
+ this.clientOptions = clientOptions;
+ this.rawClient = new AsyncRawVersionsClient(clientOptions);
+ }
+
+ /**
+ * Get responses with HTTP metadata like headers
+ */
+ public AsyncRawVersionsClient withRawResponse() {
+ return this.rawClient;
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture list(String docId) {
+ return this.rawClient.list(docId).thenApply(response -> response.body());
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture list(String docId, RequestOptions requestOptions) {
+ return this.rawClient.list(docId, requestOptions).thenApply(response -> response.body());
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture list(String docId, ListVersionsRequest request) {
+ return this.rawClient.list(docId, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CompletableFuture list(
+ String docId, ListVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.list(docId, request, requestOptions).thenApply(response -> response.body());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture analysis(String docId, String sha) {
+ return this.rawClient.analysis(docId, sha).thenApply(response -> response.body());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture analysis(
+ String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.analysis(docId, sha, requestOptions).thenApply(response -> response.body());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture analysis(
+ String docId, String sha, AnalysisVersionsRequest request) {
+ return this.rawClient.analysis(docId, sha, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CompletableFuture analysis(
+ String docId, String sha, AnalysisVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.analysis(docId, sha, request, requestOptions).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture download(String docId, String sha) {
+ return this.rawClient.download(docId, sha).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture download(String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.download(docId, sha, requestOptions).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture download(String docId, String sha, DownloadVersionsRequest request) {
+ return this.rawClient.download(docId, sha, request).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture download(
+ String docId, String sha, DownloadVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.download(docId, sha, request, requestOptions).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture revision(String docId, String sha, int index) {
+ return this.rawClient.revision(docId, sha, index).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture revision(String docId, String sha, int index, RequestOptions requestOptions) {
+ return this.rawClient.revision(docId, sha, index, requestOptions).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture revision(
+ String docId, String sha, int index, RevisionVersionsRequest request) {
+ return this.rawClient.revision(docId, sha, index, request).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture revision(
+ String docId, String sha, int index, RevisionVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .revision(docId, sha, index, request, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ public CompletableFuture signatures(String docId, String sha) {
+ return this.rawClient.signatures(docId, sha).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture signatures(
+ String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.signatures(docId, sha, requestOptions).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture signatures(
+ String docId, String sha, SignaturesVersionsRequest request) {
+ return this.rawClient.signatures(docId, sha, request).thenApply(response -> response.body());
+ }
+
+ public CompletableFuture signatures(
+ String docId, String sha, SignaturesVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.signatures(docId, sha, request, requestOptions).thenApply(response -> response.body());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture signatureContents(String docId, String sha, String fieldKey) {
+ return this.rawClient.signatureContents(docId, sha, fieldKey).thenApply(response -> response.body());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture signatureContents(
+ String docId, String sha, String fieldKey, RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureContents(docId, sha, fieldKey, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture signatureContents(
+ String docId, String sha, String fieldKey, SignatureContentsVersionsRequest request) {
+ return this.rawClient.signatureContents(docId, sha, fieldKey, request).thenApply(response -> response.body());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CompletableFuture signatureContents(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureContentsVersionsRequest request,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureContents(docId, sha, fieldKey, request, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture signatureDigest(
+ String docId, String sha, String fieldKey, SignatureDigestVersionsRequestAlgorithm algorithm) {
+ return this.rawClient.signatureDigest(docId, sha, fieldKey, algorithm).thenApply(response -> response.body());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, requestOptions)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, request)
+ .thenApply(response -> response.body());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CompletableFuture signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, request, requestOptions)
+ .thenApply(response -> response.body());
+ }
+}
diff --git a/src/main/java/api/resources/doc/versions/RawVersionsClient.java b/src/main/java/api/resources/doc/versions/RawVersionsClient.java
new file mode 100644
index 0000000..d5fb429
--- /dev/null
+++ b/src/main/java/api/resources/doc/versions/RawVersionsClient.java
@@ -0,0 +1,676 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.versions;
+
+import com.cloudpdf.api.core.ClientOptions;
+import com.cloudpdf.api.core.CloudPDFApiException;
+import com.cloudpdf.api.core.CloudPDFClientHttpResponse;
+import com.cloudpdf.api.core.CloudPDFException;
+import com.cloudpdf.api.core.ObjectMappers;
+import com.cloudpdf.api.core.QueryStringMapper;
+import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.core.ResponseBodyInputStream;
+import com.cloudpdf.api.core.RetryInterceptor;
+import com.cloudpdf.api.errors.BadRequestError;
+import com.cloudpdf.api.errors.NotFoundError;
+import com.cloudpdf.api.resources.doc.versions.requests.AnalysisVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.DownloadVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.ListVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.RevisionVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureContentsVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureDigestVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignaturesVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.types.SignatureDigestVersionsRequestAlgorithm;
+import com.cloudpdf.api.types.DocVersionsAnalysis200Response;
+import com.cloudpdf.api.types.DocVersionsList200Response;
+import com.cloudpdf.api.types.DocVersionsSignatures200Response;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.io.IOException;
+import java.io.InputStream;
+import okhttp3.Headers;
+import okhttp3.HttpUrl;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+
+public class RawVersionsClient {
+ protected final ClientOptions clientOptions;
+
+ public RawVersionsClient(ClientOptions clientOptions) {
+ this.clientOptions = clientOptions;
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CloudPDFClientHttpResponse list(String docId) {
+ return list(docId, ListVersionsRequest.builder().build());
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CloudPDFClientHttpResponse list(String docId, RequestOptions requestOptions) {
+ return list(docId, ListVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CloudPDFClientHttpResponse list(String docId, ListVersionsRequest request) {
+ return list(docId, request, null);
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public CloudPDFClientHttpResponse list(
+ String docId, ListVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocVersionsList200Response.class),
+ response);
+ }
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CloudPDFClientHttpResponse analysis(String docId, String sha) {
+ return analysis(docId, sha, AnalysisVersionsRequest.builder().build());
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CloudPDFClientHttpResponse analysis(
+ String docId, String sha, RequestOptions requestOptions) {
+ return analysis(docId, sha, AnalysisVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CloudPDFClientHttpResponse analysis(
+ String docId, String sha, AnalysisVersionsRequest request) {
+ return analysis(docId, sha, request, null);
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public CloudPDFClientHttpResponse analysis(
+ String docId, String sha, AnalysisVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/analysis")
+ .addPathSegment(sha);
+ if (request.getSinceSignature().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "since.signature", request.getSinceSignature().get(), false);
+ }
+ if (request.getSinceRevision().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "since.revision", request.getSinceRevision().get(), false);
+ }
+ if (request.getLevel().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "level", request.getLevel().get(), false);
+ }
+ if (request.getUntil().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "until", request.getUntil().get(), false);
+ }
+ if (request.getPolicy().isPresent()) {
+ QueryStringMapper.addQueryParameter(
+ httpUrl, "policy", request.getPolicy().get(), false);
+ }
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocVersionsAnalysis200Response.class),
+ response);
+ }
+ try {
+ switch (response.code()) {
+ case 400:
+ throw new BadRequestError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ case 404:
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse download(String docId, String sha) {
+ return download(docId, sha, DownloadVersionsRequest.builder().build());
+ }
+
+ public CloudPDFClientHttpResponse download(String docId, String sha, RequestOptions requestOptions) {
+ return download(docId, sha, DownloadVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CloudPDFClientHttpResponse download(String docId, String sha, DownloadVersionsRequest request) {
+ return download(docId, sha, request, null);
+ }
+
+ public CloudPDFClientHttpResponse download(
+ String docId, String sha, DownloadVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/download")
+ .addPathSegment(sha);
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try {
+ Response response = client.newCall(okhttpRequest).execute();
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response);
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse revision(String docId, String sha, int index) {
+ return revision(docId, sha, index, RevisionVersionsRequest.builder().build());
+ }
+
+ public CloudPDFClientHttpResponse revision(
+ String docId, String sha, int index, RequestOptions requestOptions) {
+ return revision(docId, sha, index, RevisionVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CloudPDFClientHttpResponse revision(
+ String docId, String sha, int index, RevisionVersionsRequest request) {
+ return revision(docId, sha, index, request, null);
+ }
+
+ public CloudPDFClientHttpResponse revision(
+ String docId, String sha, int index, RevisionVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/revisions")
+ .addPathSegment(sha)
+ .addPathSegment(Integer.toString(index));
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try {
+ Response response = client.newCall(okhttpRequest).execute();
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response);
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ public CloudPDFClientHttpResponse signatures(String docId, String sha) {
+ return signatures(docId, sha, SignaturesVersionsRequest.builder().build());
+ }
+
+ public CloudPDFClientHttpResponse signatures(
+ String docId, String sha, RequestOptions requestOptions) {
+ return signatures(docId, sha, SignaturesVersionsRequest.builder().build(), requestOptions);
+ }
+
+ public CloudPDFClientHttpResponse signatures(
+ String docId, String sha, SignaturesVersionsRequest request) {
+ return signatures(docId, sha, request, null);
+ }
+
+ public CloudPDFClientHttpResponse signatures(
+ String docId, String sha, SignaturesVersionsRequest request, RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha);
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try (Response response = client.newCall(okhttpRequest).execute()) {
+ ResponseBody responseBody = response.body();
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DocVersionsSignatures200Response.class),
+ response);
+ }
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CloudPDFClientHttpResponse signatureContents(String docId, String sha, String fieldKey) {
+ return signatureContents(
+ docId, sha, fieldKey, SignatureContentsVersionsRequest.builder().build());
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CloudPDFClientHttpResponse signatureContents(
+ String docId, String sha, String fieldKey, RequestOptions requestOptions) {
+ return signatureContents(
+ docId, sha, fieldKey, SignatureContentsVersionsRequest.builder().build(), requestOptions);
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CloudPDFClientHttpResponse signatureContents(
+ String docId, String sha, String fieldKey, SignatureContentsVersionsRequest request) {
+ return signatureContents(docId, sha, fieldKey, request, null);
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public CloudPDFClientHttpResponse signatureContents(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureContentsVersionsRequest request,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha)
+ .addPathSegment(fieldKey)
+ .addPathSegments("contents");
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try {
+ Response response = client.newCall(okhttpRequest).execute();
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response);
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CloudPDFClientHttpResponse signatureDigest(
+ String docId, String sha, String fieldKey, SignatureDigestVersionsRequestAlgorithm algorithm) {
+ return signatureDigest(
+ docId,
+ sha,
+ fieldKey,
+ algorithm,
+ SignatureDigestVersionsRequest.builder().build());
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CloudPDFClientHttpResponse signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ RequestOptions requestOptions) {
+ return signatureDigest(
+ docId,
+ sha,
+ fieldKey,
+ algorithm,
+ SignatureDigestVersionsRequest.builder().build(),
+ requestOptions);
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CloudPDFClientHttpResponse signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request) {
+ return signatureDigest(docId, sha, fieldKey, algorithm, request, null);
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public CloudPDFClientHttpResponse signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request,
+ RequestOptions requestOptions) {
+ HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl())
+ .newBuilder()
+ .addPathSegments("v1/docs")
+ .addPathSegment(docId)
+ .addPathSegments("versions/signatures")
+ .addPathSegment(sha)
+ .addPathSegment(fieldKey)
+ .addPathSegments("digest")
+ .addPathSegment(algorithm.toString());
+ if (requestOptions != null) {
+ requestOptions.getQueryParameters().forEach((_key, _value) -> {
+ httpUrl.addQueryParameter(_key, _value);
+ });
+ }
+ Request.Builder _requestBuilder = new Request.Builder()
+ .url(httpUrl.build())
+ .method("GET", null)
+ .headers(Headers.of(clientOptions.headers(requestOptions)))
+ .addHeader("Accept", "application/json");
+ if (request.getDocumentPassword().isPresent()) {
+ _requestBuilder.addHeader(
+ "X-Document-Password", request.getDocumentPassword().get());
+ }
+ Request okhttpRequest = _requestBuilder.build();
+ OkHttpClient client = clientOptions.httpClient();
+ if (requestOptions != null && requestOptions.getTimeout().isPresent()) {
+ client = clientOptions.httpClientWithTimeout(requestOptions);
+ }
+ if (requestOptions != null && requestOptions.getMaxRetries().isPresent()) {
+ okhttpRequest = okhttpRequest
+ .newBuilder()
+ .tag(
+ RetryInterceptor.MaxRetriesOverride.class,
+ new RetryInterceptor.MaxRetriesOverride(
+ requestOptions.getMaxRetries().get()))
+ .build();
+ }
+ try {
+ Response response = client.newCall(okhttpRequest).execute();
+ ResponseBody responseBody = response.body();
+ if (response.isSuccessful()) {
+ return new CloudPDFClientHttpResponse<>(new ResponseBodyInputStream(response), response);
+ }
+ String responseBodyString = responseBody != null ? responseBody.string() : "{}";
+ try {
+ if (response.code() == 404) {
+ throw new NotFoundError(
+ ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response);
+ }
+ } catch (JsonProcessingException ignored) {
+ // unable to map error response, throwing generic error
+ }
+ Object errorBody = ObjectMappers.parseErrorBody(responseBodyString);
+ throw new CloudPDFApiException(
+ "Error with status code " + response.code(), response.code(), errorBody, response);
+ } catch (JsonProcessingException e) {
+ throw new CloudPDFException("Failed to deserialize response: " + e.getMessage(), e);
+ } catch (IOException e) {
+ throw new CloudPDFException("Network error executing HTTP request", e);
+ }
+ }
+}
diff --git a/src/main/java/api/resources/doc/versions/VersionsClient.java b/src/main/java/api/resources/doc/versions/VersionsClient.java
new file mode 100644
index 0000000..6c01351
--- /dev/null
+++ b/src/main/java/api/resources/doc/versions/VersionsClient.java
@@ -0,0 +1,236 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.versions;
+
+import com.cloudpdf.api.core.ClientOptions;
+import com.cloudpdf.api.core.RequestOptions;
+import com.cloudpdf.api.resources.doc.versions.requests.AnalysisVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.DownloadVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.ListVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.RevisionVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureContentsVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignatureDigestVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.requests.SignaturesVersionsRequest;
+import com.cloudpdf.api.resources.doc.versions.types.SignatureDigestVersionsRequestAlgorithm;
+import com.cloudpdf.api.types.DocVersionsAnalysis200Response;
+import com.cloudpdf.api.types.DocVersionsList200Response;
+import com.cloudpdf.api.types.DocVersionsSignatures200Response;
+import java.io.InputStream;
+
+public class VersionsClient {
+ protected final ClientOptions clientOptions;
+
+ private final RawVersionsClient rawClient;
+
+ public VersionsClient(ClientOptions clientOptions) {
+ this.clientOptions = clientOptions;
+ this.rawClient = new RawVersionsClient(clientOptions);
+ }
+
+ /**
+ * Get responses with HTTP metadata like headers
+ */
+ public RawVersionsClient withRawResponse() {
+ return this.rawClient;
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public DocVersionsList200Response list(String docId) {
+ return this.rawClient.list(docId).body();
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public DocVersionsList200Response list(String docId, RequestOptions requestOptions) {
+ return this.rawClient.list(docId, requestOptions).body();
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public DocVersionsList200Response list(String docId, ListVersionsRequest request) {
+ return this.rawClient.list(docId, request).body();
+ }
+
+ /**
+ * Every completed signature publishes a new version. Never cached: the list grows.
+ */
+ public DocVersionsList200Response list(String docId, ListVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.list(docId, request, requestOptions).body();
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public DocVersionsAnalysis200Response analysis(String docId, String sha) {
+ return this.rawClient.analysis(docId, sha).body();
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public DocVersionsAnalysis200Response analysis(String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.analysis(docId, sha, requestOptions).body();
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public DocVersionsAnalysis200Response analysis(String docId, String sha, AnalysisVersionsRequest request) {
+ return this.rawClient.analysis(docId, sha, request).body();
+ }
+
+ /**
+ * Exactly one of since.signature / since.revision; until=<revision> defaults to the last. The same answer for every layer and every caller.
+ */
+ public DocVersionsAnalysis200Response analysis(
+ String docId, String sha, AnalysisVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.analysis(docId, sha, request, requestOptions).body();
+ }
+
+ public InputStream download(String docId, String sha) {
+ return this.rawClient.download(docId, sha).body();
+ }
+
+ public InputStream download(String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.download(docId, sha, requestOptions).body();
+ }
+
+ public InputStream download(String docId, String sha, DownloadVersionsRequest request) {
+ return this.rawClient.download(docId, sha, request).body();
+ }
+
+ public InputStream download(
+ String docId, String sha, DownloadVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.download(docId, sha, request, requestOptions).body();
+ }
+
+ public InputStream revision(String docId, String sha, int index) {
+ return this.rawClient.revision(docId, sha, index).body();
+ }
+
+ public InputStream revision(String docId, String sha, int index, RequestOptions requestOptions) {
+ return this.rawClient.revision(docId, sha, index, requestOptions).body();
+ }
+
+ public InputStream revision(String docId, String sha, int index, RevisionVersionsRequest request) {
+ return this.rawClient.revision(docId, sha, index, request).body();
+ }
+
+ public InputStream revision(
+ String docId, String sha, int index, RevisionVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient
+ .revision(docId, sha, index, request, requestOptions)
+ .body();
+ }
+
+ public DocVersionsSignatures200Response signatures(String docId, String sha) {
+ return this.rawClient.signatures(docId, sha).body();
+ }
+
+ public DocVersionsSignatures200Response signatures(String docId, String sha, RequestOptions requestOptions) {
+ return this.rawClient.signatures(docId, sha, requestOptions).body();
+ }
+
+ public DocVersionsSignatures200Response signatures(String docId, String sha, SignaturesVersionsRequest request) {
+ return this.rawClient.signatures(docId, sha, request).body();
+ }
+
+ public DocVersionsSignatures200Response signatures(
+ String docId, String sha, SignaturesVersionsRequest request, RequestOptions requestOptions) {
+ return this.rawClient.signatures(docId, sha, request, requestOptions).body();
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public InputStream signatureContents(String docId, String sha, String fieldKey) {
+ return this.rawClient.signatureContents(docId, sha, fieldKey).body();
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public InputStream signatureContents(String docId, String sha, String fieldKey, RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureContents(docId, sha, fieldKey, requestOptions)
+ .body();
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public InputStream signatureContents(
+ String docId, String sha, String fieldKey, SignatureContentsVersionsRequest request) {
+ return this.rawClient.signatureContents(docId, sha, fieldKey, request).body();
+ }
+
+ /**
+ * fieldKey is the field's fully qualified name, token-text encoded (the same encoding attachment keys use).
+ */
+ public InputStream signatureContents(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureContentsVersionsRequest request,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureContents(docId, sha, fieldKey, request, requestOptions)
+ .body();
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public InputStream signatureDigest(
+ String docId, String sha, String fieldKey, SignatureDigestVersionsRequestAlgorithm algorithm) {
+ return this.rawClient.signatureDigest(docId, sha, fieldKey, algorithm).body();
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public InputStream signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, requestOptions)
+ .body();
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public InputStream signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, request)
+ .body();
+ }
+
+ /**
+ * What a CMS verifier compares its message digest to.
+ */
+ public InputStream signatureDigest(
+ String docId,
+ String sha,
+ String fieldKey,
+ SignatureDigestVersionsRequestAlgorithm algorithm,
+ SignatureDigestVersionsRequest request,
+ RequestOptions requestOptions) {
+ return this.rawClient
+ .signatureDigest(docId, sha, fieldKey, algorithm, request, requestOptions)
+ .body();
+ }
+}
diff --git a/src/main/java/api/resources/doc/versions/requests/AnalysisVersionsRequest.java b/src/main/java/api/resources/doc/versions/requests/AnalysisVersionsRequest.java
new file mode 100644
index 0000000..5e1ff1f
--- /dev/null
+++ b/src/main/java/api/resources/doc/versions/requests/AnalysisVersionsRequest.java
@@ -0,0 +1,236 @@
+/**
+ * This file was auto-generated by Fern from our API Definition.
+ */
+package com.cloudpdf.api.resources.doc.versions.requests;
+
+import com.cloudpdf.api.core.ObjectMappers;
+import com.cloudpdf.api.resources.doc.versions.types.AnalysisVersionsRequestLevel;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+
+@JsonInclude(JsonInclude.Include.NON_ABSENT)
+@JsonDeserialize(builder = AnalysisVersionsRequest.Builder.class)
+public final class AnalysisVersionsRequest {
+ private final Optional documentPassword;
+
+ private final Optional sinceSignature;
+
+ private final Optional sinceRevision;
+
+ private final Optional level;
+
+ private final Optional until;
+
+ private final Optional policy;
+
+ private final Map additionalProperties;
+
+ private AnalysisVersionsRequest(
+ Optional documentPassword,
+ Optional sinceSignature,
+ Optional sinceRevision,
+ Optional level,
+ Optional until,
+ Optional