From 602318e07dc6512e13b8248f233cba7a929fe2b3 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 6 Oct 2026 22:39:08 +0530 Subject: [PATCH 01/41] SK-3175 detect v2 support in flowvault --- common/pom.xml | 9 + .../main/java/com/skyflow/BaseSkyflow.java | 10 +- .../java/com/skyflow/BaseVaultClient.java | 8 +- .../main/java/com/skyflow/detect/Audio.java | 93 ++ .../main/java/com/skyflow/detect/Bleep.java | 113 +++ .../detect/CheckGuardrailsRequest.java | 95 ++ .../detect/CheckGuardrailsResponse.java | 56 ++ .../java/com/skyflow/detect/CustomType.java | 75 ++ .../com/skyflow/detect/DataSourceType.java | 10 + .../skyflow/detect/DeidentificationType.java | 12 + .../skyflow/detect/DeidentifyFileRequest.java | 212 +++++ .../detect/DeidentifyFileResponse.java | 83 ++ .../detect/DeidentifyStringRequest.java | 94 ++ .../detect/DeidentifyStringResponse.java | 48 ++ .../main/java/com/skyflow/detect/Detect.java | 155 ++++ .../skyflow/detect/DetectConfiguration.java | 135 +++ .../com/skyflow/detect/DetectRunStatus.java | 12 + .../com/skyflow/detect/DetectedEntity.java | 68 ++ .../java/com/skyflow/detect/Document.java | 53 ++ .../main/java/com/skyflow/detect/Entity.java | 113 +++ .../com/skyflow/detect/EntityLocation.java | 56 ++ .../java/com/skyflow/detect/EntityType.java | 78 ++ .../com/skyflow/detect/FileDataFormat.java | 30 + .../java/com/skyflow/detect/FileMapping.java | 133 +++ .../java/com/skyflow/detect/FileOutput.java | 46 + .../com/skyflow/detect/GetRunRequest.java | 53 ++ .../com/skyflow/detect/GetRunResponse.java | 78 ++ .../skyflow/detect/GuardrailsValidation.java | 11 + .../main/java/com/skyflow/detect/Image.java | 93 ++ .../com/skyflow/detect/MaskingMethod.java | 10 + .../main/java/com/skyflow/detect/Media.java | 93 ++ .../main/java/com/skyflow/detect/Metrics.java | 76 ++ .../detect/ObjectDeidentificationType.java | 10 + .../java/com/skyflow/detect/ObjectEntity.java | 73 ++ .../com/skyflow/detect/ObjectEntityType.java | 13 + .../detect/OutputTranscriptionType.java | 12 + .../src/main/java/com/skyflow/detect/Pdf.java | 93 ++ .../com/skyflow/detect/PdfProcessingMode.java | 10 + .../java/com/skyflow/detect/PollOptions.java | 91 ++ .../com/skyflow/detect/RedactionLevel.java | 113 +++ .../com/skyflow/detect/RedactionType.java | 11 + .../detect/ReidentifyStringRequest.java | 75 ++ .../detect/ReidentifyStringResponse.java | 36 + .../skyflow/detect/ReturnEntitiesType.java | 10 + .../java/com/skyflow/detect/ShiftDates.java | 73 ++ .../com/skyflow/detect/Transformation.java | 53 ++ .../detect/internal/DeidentifyFileFlow.java | 41 + .../detect/internal/DetectRequestMapper.java | 407 +++++++++ .../detect/internal/DetectResponseMapper.java | 145 ++++ .../detect/internal/DetectValidations.java | 114 +++ .../detect/internal/FileOutputWriter.java | 118 +++ .../com/skyflow/detect/polling/RunPoller.java | 99 +++ ...rrorMessage.java => BaseErrorMessage.java} | 74 +- .../com/skyflow/errors/SkyflowException.java | 2 +- .../rest/core/ApiClientApiException.java | 73 ++ .../detect/rest/core/ApiClientException.java | 17 + .../rest/core/ApiClientHttpResponse.java | 37 + .../detect/rest/core/ClientOptions.java | 320 +++++++ .../detect/rest/core/ConsoleLogger.java | 52 ++ .../rest/core/DateTimeDeserializer.java | 70 ++ .../detect/rest/core/DoubleSerializer.java | 43 + .../detect/rest/core/Environment.java | 25 + .../generated/detect/rest/core/ILogger.java | 38 + .../generated/detect/rest/core/LogConfig.java | 98 +++ .../generated/detect/rest/core/LogLevel.java | 36 + .../generated/detect/rest/core/Logger.java | 97 +++ .../detect/rest/core/LoggingInterceptor.java | 104 +++ .../detect/rest/core/MediaTypes.java | 13 + .../detect/rest/core/ObjectMappers.java | 46 + .../detect/rest/core/QueryStringMapper.java | 142 +++ .../detect/rest/core/RequestOptions.java | 154 ++++ .../ResponseDecompressionInterceptor.java | 56 ++ .../detect/rest/core/RetryInterceptor.java | 242 ++++++ .../detect/rest/errors/BadRequestError.java | 33 + .../rest/errors/InternalServerError.java | 33 + .../detect/rest/errors/UnauthorizedError.java | 33 + .../resources/filesv2/AsyncFilesV2Client.java | 85 ++ .../filesv2/AsyncRawFilesV2Client.java | 350 ++++++++ .../rest/resources/filesv2/FilesV2Client.java | 81 ++ .../resources/filesv2/RawFilesV2Client.java | 282 ++++++ .../requests/DeidentifyFileRequestV2.java | 286 ++++++ .../filesv2/requests/GetRunV2Request.java | 118 +++ .../requests/ReidentifyFileRequestV2.java | 291 +++++++ .../DeidentifyFileRequestV2DataFormat.java | 301 +++++++ .../DeidentifyFileRequestV2DataSource.java | 97 +++ .../ReidentifyFileRequestV2DataFormat.java | 149 ++++ .../ReidentifyFileRequestV2DataSource.java | 97 +++ .../guardrailsv2/AsyncGuardrailsV2Client.java | 43 + .../AsyncRawGuardrailsV2Client.java | 142 +++ .../guardrailsv2/GuardrailsV2Client.java | 42 + .../guardrailsv2/RawGuardrailsV2Client.java | 116 +++ .../requests/DetectGuardrailsRequestV2.java | 253 ++++++ .../stringsv2/AsyncRawStringsV2Client.java | 246 ++++++ .../stringsv2/AsyncStringsV2Client.java | 60 ++ .../stringsv2/RawStringsV2Client.java | 198 +++++ .../resources/stringsv2/StringsV2Client.java | 59 ++ .../requests/DeidentifyStringRequestV2.java | 206 +++++ .../requests/ReidentifyStringRequestV2.java | 209 +++++ .../generated/detect/rest/types/AudioV2.java | 167 ++++ .../detect/rest/types/AudioV2Bleep.java | 203 +++++ .../types/AudioV2OutputTranscription.java | 118 +++ .../rest/types/DeidentifyFileResponseV2.java | 111 +++ .../types/DeidentifyStringResponseV2.java | 168 ++++ ...dentifyStringResponseV2DetectedEntity.java | 229 +++++ ...dentifyStringResponseV2EntityLocation.java | 205 +++++ .../generated/detect/rest/types/Detect.java | 266 ++++++ .../detect/rest/types/DetectConfigV2.java | 470 ++++++++++ .../rest/types/DetectConfigV2VaultType.java | 105 +++ .../detect/rest/types/DetectCustomTypes.java | 141 +++ .../detect/rest/types/DetectEntity.java | 198 +++++ .../DetectEntityDeidentificationType.java | 119 +++ .../rest/types/DetectEntityEntityType.java | 806 +++++++++++++++++ .../types/DetectGuardrailsResponseV2.java | 252 ++++++ .../DetectGuardrailsResponseV2Validation.java | 86 ++ .../detect/rest/types/DetectObjectEntity.java | 142 +++ ...etectObjectEntityDeidentificationType.java | 97 +++ .../types/DetectObjectEntityEntityType.java | 126 +++ .../rest/types/DetectReturnEntities.java | 94 ++ .../rest/types/DetectRunsResponseV2.java | 228 +++++ .../types/DetectRunsResponseV2OutputType.java | 97 +++ .../types/DetectRunsResponseV2Status.java | 115 +++ .../detect/rest/types/DocumentV2.java | 105 +++ .../detect/rest/types/DocumentV2Pdf.java | 173 ++++ .../types/DocumentV2PdfProcessingMode.java | 95 ++ .../rest/types/EntityTransformation.java | 106 +++ .../detect/rest/types/ErrorResponse.java | 118 +++ .../detect/rest/types/ErrorResponseError.java | 236 +++++ .../detect/rest/types/FileMapping.java | 244 ++++++ .../detect/rest/types/FileOutput.java | 173 ++++ .../FileOutputProcessedFileExtension.java | 301 +++++++ .../types/FileOutputProcessedFileType.java | 64 ++ .../generated/detect/rest/types/ImageV2.java | 173 ++++ .../rest/types/ImageV2MaskingMethod.java | 93 ++ .../generated/detect/rest/types/Media.java | 153 ++++ .../generated/detect/rest/types/Metrics.java | 263 ++++++ .../detect/rest/types/RedactionLevel.java | 204 +++++ .../rest/types/RedactionLevelEntityName.java | 812 ++++++++++++++++++ .../types/RedactionLevelRedactionType.java | 106 +++ .../rest/types/ReidentifyFileResponseV2.java | 198 +++++ .../ReidentifyFileResponseV2OutputType.java | 97 +++ .../types/ReidentifyFileResponseV2Status.java | 119 +++ .../types/ReidentifyStringResponseV2.java | 134 +++ .../rest/types/TransformationShiftDates.java | 140 +++ .../main/java/com/skyflow/logs/ErrorLogs.java | 29 +- .../main/java/com/skyflow/logs/InfoLogs.java | 35 +- .../serviceaccount/util/BearerToken.java | 24 +- .../serviceaccount/util/SignedDataTokens.java | 18 +- .../skyflow/serviceaccount/util/Token.java | 8 +- .../java/com/skyflow/utils/BaseConstants.java | 1 + .../java/com/skyflow/utils/BaseUtils.java | 10 +- .../utils/validations/BaseValidations.java | 30 +- .../controller/BaseDetectController.java | 379 ++++++++ .../java/com/skyflow/BaseSkyflowTests.java | 24 +- .../com/skyflow/BaseVaultClientTests.java | 4 +- .../com/skyflow/config/CredentialsTests.java | 28 +- .../internal/DeidentifyFileFlowTests.java | 109 +++ .../internal/DeidentifyFileMapperTests.java | 146 ++++ .../DeidentifyFileValidationsTests.java | 82 ++ .../internal/DetectRequestMapperTests.java | 161 ++++ .../internal/DetectResponseMapperTests.java | 140 +++ .../internal/DetectValidationsTests.java | 138 +++ .../internal/FileOutputWriterTests.java | 119 +++ .../detect/polling/RunPollerTests.java | 162 ++++ .../serviceaccount/util/BearerTokenTests.java | 30 +- .../util/SignedDataTokensTests.java | 24 +- .../com/skyflow/utils/BaseUtilsTests.java | 16 +- .../controller/BaseDetectControllerTests.java | 385 +++++++++ flowvault/README.md | 211 +++++ .../skyflow-flowvault-java.baseline.jar | Bin 499943 -> 938467 bytes flowvault/pom.xml | 6 + .../example/detect/CheckGuardrailsSample.java | 53 ++ .../example/detect/DeidentifyFileSample.java | 66 ++ .../detect/DeidentifyStringSample.java | 94 ++ .../java/com/example/detect/GetRunSample.java | 62 ++ .../example/detect/ReidentifyFileSample.java | 74 ++ .../detect/ReidentifyStringSample.java | 59 ++ .../src/main/java/com/skyflow/Skyflow.java | 52 +- .../skyflow/detect/ReidentifyFileRequest.java | 118 +++ .../detect/ReidentifyFileResponse.java | 59 ++ .../detect/internal/ReidentifyFileMapper.java | 69 ++ .../internal/ReidentifyFileValidations.java | 43 + .../java/com/skyflow/errors/ErrorMessage.java | 77 ++ .../utils/validations/Validations.java | 73 +- .../vault/controller/DetectController.java | 183 ++++ .../internal/ReidentifyFileMapperTests.java | 182 ++++ .../ReidentifyFileValidationsTests.java | 85 ++ .../utils/validations/ValidationsTests.java | 41 +- .../controller/DetectControllerTests.java | 622 ++++++++++++++ .../src/main/java/com/skyflow/Skyflow.java | 17 +- 189 files changed, 22117 insertions(+), 238 deletions(-) create mode 100644 common/src/main/java/com/skyflow/detect/Audio.java create mode 100644 common/src/main/java/com/skyflow/detect/Bleep.java create mode 100644 common/src/main/java/com/skyflow/detect/CheckGuardrailsRequest.java create mode 100644 common/src/main/java/com/skyflow/detect/CheckGuardrailsResponse.java create mode 100644 common/src/main/java/com/skyflow/detect/CustomType.java create mode 100644 common/src/main/java/com/skyflow/detect/DataSourceType.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentificationType.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifyStringResponse.java create mode 100644 common/src/main/java/com/skyflow/detect/Detect.java create mode 100644 common/src/main/java/com/skyflow/detect/DetectConfiguration.java create mode 100644 common/src/main/java/com/skyflow/detect/DetectRunStatus.java create mode 100644 common/src/main/java/com/skyflow/detect/DetectedEntity.java create mode 100644 common/src/main/java/com/skyflow/detect/Document.java create mode 100644 common/src/main/java/com/skyflow/detect/Entity.java create mode 100644 common/src/main/java/com/skyflow/detect/EntityLocation.java create mode 100644 common/src/main/java/com/skyflow/detect/EntityType.java create mode 100644 common/src/main/java/com/skyflow/detect/FileDataFormat.java create mode 100644 common/src/main/java/com/skyflow/detect/FileMapping.java create mode 100644 common/src/main/java/com/skyflow/detect/FileOutput.java create mode 100644 common/src/main/java/com/skyflow/detect/GetRunRequest.java create mode 100644 common/src/main/java/com/skyflow/detect/GetRunResponse.java create mode 100644 common/src/main/java/com/skyflow/detect/GuardrailsValidation.java create mode 100644 common/src/main/java/com/skyflow/detect/Image.java create mode 100644 common/src/main/java/com/skyflow/detect/MaskingMethod.java create mode 100644 common/src/main/java/com/skyflow/detect/Media.java create mode 100644 common/src/main/java/com/skyflow/detect/Metrics.java create mode 100644 common/src/main/java/com/skyflow/detect/ObjectDeidentificationType.java create mode 100644 common/src/main/java/com/skyflow/detect/ObjectEntity.java create mode 100644 common/src/main/java/com/skyflow/detect/ObjectEntityType.java create mode 100644 common/src/main/java/com/skyflow/detect/OutputTranscriptionType.java create mode 100644 common/src/main/java/com/skyflow/detect/Pdf.java create mode 100644 common/src/main/java/com/skyflow/detect/PdfProcessingMode.java create mode 100644 common/src/main/java/com/skyflow/detect/PollOptions.java create mode 100644 common/src/main/java/com/skyflow/detect/RedactionLevel.java create mode 100644 common/src/main/java/com/skyflow/detect/RedactionType.java create mode 100644 common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java create mode 100644 common/src/main/java/com/skyflow/detect/ReidentifyStringResponse.java create mode 100644 common/src/main/java/com/skyflow/detect/ReturnEntitiesType.java create mode 100644 common/src/main/java/com/skyflow/detect/ShiftDates.java create mode 100644 common/src/main/java/com/skyflow/detect/Transformation.java create mode 100644 common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java create mode 100644 common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java create mode 100644 common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java create mode 100644 common/src/main/java/com/skyflow/detect/internal/DetectValidations.java create mode 100644 common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java create mode 100644 common/src/main/java/com/skyflow/detect/polling/RunPoller.java rename common/src/main/java/com/skyflow/errors/{ErrorMessage.java => BaseErrorMessage.java} (72%) create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java create mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java create mode 100644 common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java create mode 100644 common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java create mode 100644 common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java create mode 100644 common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/GetRunSample.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java create mode 100644 flowvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java create mode 100644 flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java create mode 100644 flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java create mode 100644 flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java create mode 100644 flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java create mode 100644 flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java diff --git a/common/pom.xml b/common/pom.xml index 72fff275..99f43063 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -21,4 +21,13 @@ 8 UTF-8 + + + + com.squareup.okhttp3 + mockwebserver + ${okhttp-version} + test + + \ No newline at end of file diff --git a/common/src/main/java/com/skyflow/BaseSkyflow.java b/common/src/main/java/com/skyflow/BaseSkyflow.java index d02dc45a..fdca3f26 100644 --- a/common/src/main/java/com/skyflow/BaseSkyflow.java +++ b/common/src/main/java/com/skyflow/BaseSkyflow.java @@ -4,7 +4,7 @@ import com.skyflow.config.Credentials; import com.skyflow.enums.LogLevel; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -66,7 +66,7 @@ public LogLevel getLogLevel() { } protected static T resolveOrThrow(Map map, String key, - ErrorLogs errorLog, ErrorMessage errorMessage) throws SkyflowException { + ErrorLogs errorLog, BaseErrorMessage errorMessage) throws SkyflowException { T value = key != null ? map.get(key) : map.values().stream().findFirst().orElse(null); if (value == null) { // The log line carries a %s1 placeholder for the id. Callers that resolve the single @@ -125,7 +125,7 @@ protected final void addVaultConfigTemplate(V vaultConfig) throws SkyflowExcepti ErrorLogs.VAULT_CONFIG_EXISTS.getLog(), vaultId )); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.VaultIdAlreadyInConfigList.getMessage()); + BaseErrorMessage.VaultIdAlreadyInConfigList.getMessage()); } onVaultConfigAdded(vaultConfigCopy); this.vaultConfigMap.put(vaultId, vaultConfigCopy); @@ -139,7 +139,7 @@ protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowExce LogUtil.printErrorLog(BaseUtils.parameterizedString( ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.VaultIdNotInConfigList.getMessage()); } V previousConfig = this.vaultConfigMap.get(vaultId); V merged = mergeVaultConfig(vaultConfig, cloneVaultConfig(previousConfig)); @@ -150,7 +150,7 @@ protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowExce protected final void removeVaultConfigTemplate(String vaultId) throws SkyflowException { if (!hasVaultClient(vaultId)) { LogUtil.printErrorLog(BaseUtils.parameterizedString(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId)); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.VaultIdNotInConfigList.getMessage()); } onVaultConfigRemoved(vaultId); this.vaultConfigMap.remove(vaultId); diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java index 3d5b0d32..973510d7 100644 --- a/common/src/main/java/com/skyflow/BaseVaultClient.java +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -5,7 +5,7 @@ import com.skyflow.config.BaseCredentials; import com.skyflow.config.BaseVaultConfig; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -class BaseVaultClient { +public class BaseVaultClient { protected V vaultConfig; protected OkHttpClient sharedHttpClient; protected String currentVaultURL; @@ -69,7 +69,7 @@ protected synchronized void prioritiseCredentials(BaseCredentials vaultSpecificC sysCredentials = dotenv.get(BaseConstants.ENV_CREDENTIALS_KEY_NAME); } if (sysCredentials == null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentials.getMessage()); } else { this.finalCredentials = new BaseCredentials(); this.finalCredentials.setCredentialsString(sysCredentials); @@ -80,7 +80,7 @@ protected synchronized void prioritiseCredentials(BaseCredentials vaultSpecificC apiKey = null; } } catch (DotenvException e) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentials.getMessage()); } catch (SkyflowException e) { throw e; } catch (Exception e) { diff --git a/common/src/main/java/com/skyflow/detect/Audio.java b/common/src/main/java/com/skyflow/detect/Audio.java new file mode 100644 index 00000000..6d4e46f9 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Audio.java @@ -0,0 +1,93 @@ +package com.skyflow.detect; + +/** + * Audio processing options. + */ +public final class Audio { + private final Boolean outputProcessedAudio; + private final OutputTranscriptionType outputTranscription; + private final Bleep bleep; + + private Audio(AudioBuilder builder) { + this.outputProcessedAudio = builder.outputProcessedAudio; + this.outputTranscription = builder.outputTranscription; + this.bleep = builder.bleep; + } + + /** + * @return a new builder + */ + public static AudioBuilder builder() { + return new AudioBuilder(); + } + + /** + * @return Whether to return the processed audio file. + */ + public Boolean getOutputProcessedAudio() { + return outputProcessedAudio; + } + + /** + * @return Transcription output to produce. + */ + public OutputTranscriptionType getOutputTranscription() { + return outputTranscription; + } + + /** + * @return Bleep configuration. + */ + public Bleep getBleep() { + return bleep; + } + + @Override + public String toString() { + return "Audio{" + + "outputProcessedAudio=" + outputProcessedAudio + + ", outputTranscription=" + outputTranscription + + ", bleep=" + bleep + + '}'; + } + + public static final class AudioBuilder { + private Boolean outputProcessedAudio; + private OutputTranscriptionType outputTranscription; + private Bleep bleep; + + private AudioBuilder() { + } + + /** + * @param outputProcessedAudio Whether to return the processed audio file. + * @return this builder + */ + public AudioBuilder outputProcessedAudio(Boolean outputProcessedAudio) { + this.outputProcessedAudio = outputProcessedAudio; + return this; + } + + /** + * @param outputTranscription Transcription output to produce. + * @return this builder + */ + public AudioBuilder outputTranscription(OutputTranscriptionType outputTranscription) { + this.outputTranscription = outputTranscription; + return this; + } + + /** + * @param bleep Bleep configuration. + * @return this builder + */ + public AudioBuilder bleep(Bleep bleep) { + this.bleep = bleep; + return this; + } + + public Audio build() { + return new Audio(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/Bleep.java b/common/src/main/java/com/skyflow/detect/Bleep.java new file mode 100644 index 00000000..63346aeb --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Bleep.java @@ -0,0 +1,113 @@ +package com.skyflow.detect; + +/** + * Bleep tone applied over detected speech in audio. + */ +public final class Bleep { + private final Float startPadding; + private final Float stopPadding; + private final Integer frequency; + private final Integer gain; + + private Bleep(BleepBuilder builder) { + this.startPadding = builder.startPadding; + this.stopPadding = builder.stopPadding; + this.frequency = builder.frequency; + this.gain = builder.gain; + } + + /** + * @return a new builder + */ + public static BleepBuilder builder() { + return new BleepBuilder(); + } + + /** + * @return Seconds of bleep added before the detected span. + */ + public Float getStartPadding() { + return startPadding; + } + + /** + * @return Seconds of bleep added after the detected span. + */ + public Float getStopPadding() { + return stopPadding; + } + + /** + * @return Bleep frequency in Hz. + */ + public Integer getFrequency() { + return frequency; + } + + /** + * @return Bleep gain. + */ + public Integer getGain() { + return gain; + } + + @Override + public String toString() { + return "Bleep{" + + "startPadding=" + startPadding + + ", stopPadding=" + stopPadding + + ", frequency=" + frequency + + ", gain=" + gain + + '}'; + } + + public static final class BleepBuilder { + private Float startPadding; + private Float stopPadding; + private Integer frequency; + private Integer gain; + + private BleepBuilder() { + } + + /** + * @param startPadding Seconds of bleep added before the detected span. + * @return this builder + */ + public BleepBuilder startPadding(Float startPadding) { + this.startPadding = startPadding; + return this; + } + + /** + * @param stopPadding Seconds of bleep added after the detected span. + * @return this builder + */ + public BleepBuilder stopPadding(Float stopPadding) { + this.stopPadding = stopPadding; + return this; + } + + /** + * @param frequency Bleep frequency in Hz. + * @return this builder + */ + public BleepBuilder frequency(Integer frequency) { + this.frequency = frequency; + return this; + } + + /** + * @param gain Bleep gain. + * @return this builder + */ + public BleepBuilder gain(Integer gain) { + this.gain = gain; + return this; + } + + public Bleep build() { + return new Bleep(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/CheckGuardrailsRequest.java b/common/src/main/java/com/skyflow/detect/CheckGuardrailsRequest.java new file mode 100644 index 00000000..526ddd9c --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/CheckGuardrailsRequest.java @@ -0,0 +1,95 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Request for {@code checkGuardrails}: screens text for toxicity and denied topics. + */ +public final class CheckGuardrailsRequest { + private final String text; + private final Boolean checkToxicity; + private final List denyTopics; + + private CheckGuardrailsRequest(CheckGuardrailsRequestBuilder builder) { + this.text = builder.text; + this.checkToxicity = builder.checkToxicity; + this.denyTopics = builder.denyTopics; + } + + /** + * @return a new builder + */ + public static CheckGuardrailsRequestBuilder builder() { + return new CheckGuardrailsRequestBuilder(); + } + + /** + * @return Text to screen. Required. + */ + public String getText() { + return text; + } + + /** + * @return Whether to check the text for toxicity. + */ + public Boolean getCheckToxicity() { + return checkToxicity; + } + + /** + * @return Topics the text must not discuss. + */ + public List getDenyTopics() { + return denyTopics; + } + + @Override + public String toString() { + return "CheckGuardrailsRequest{" + + "text=" + text + + ", checkToxicity=" + checkToxicity + + ", denyTopics=" + denyTopics + + '}'; + } + + public static final class CheckGuardrailsRequestBuilder { + private String text; + private Boolean checkToxicity; + private List denyTopics; + + private CheckGuardrailsRequestBuilder() { + } + + /** + * @param text Text to screen. Required. + * @return this builder + */ + public CheckGuardrailsRequestBuilder text(String text) { + this.text = text; + return this; + } + + /** + * @param checkToxicity Whether to check the text for toxicity. + * @return this builder + */ + public CheckGuardrailsRequestBuilder checkToxicity(Boolean checkToxicity) { + this.checkToxicity = checkToxicity; + return this; + } + + /** + * @param denyTopics Topics the text must not discuss. + * @return this builder + */ + public CheckGuardrailsRequestBuilder denyTopics(List denyTopics) { + this.denyTopics = denyTopics; + return this; + } + + public CheckGuardrailsRequest build() { + return new CheckGuardrailsRequest(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/CheckGuardrailsResponse.java b/common/src/main/java/com/skyflow/detect/CheckGuardrailsResponse.java new file mode 100644 index 00000000..153e68cf --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/CheckGuardrailsResponse.java @@ -0,0 +1,56 @@ +package com.skyflow.detect; + +/** + * Response of {@code checkGuardrails}. + */ +public final class CheckGuardrailsResponse { + private final String text; + private final GuardrailsValidation validation; + private final Boolean toxic; + private final Boolean deniedTopic; + + public CheckGuardrailsResponse(String text, GuardrailsValidation validation, Boolean toxic, Boolean deniedTopic) { + this.text = text; + this.validation = validation; + this.toxic = toxic; + this.deniedTopic = deniedTopic; + } + + /** + * @return The text that was screened. + */ + public String getText() { + return text; + } + + /** + * @return PASSED when no guardrail was triggered, FAILED otherwise. + */ + public GuardrailsValidation getValidation() { + return validation; + } + + /** + * @return Whether the text was judged toxic. Null when toxicity was not checked. + */ + public Boolean getToxic() { + return toxic; + } + + /** + * @return Whether the text touched a denied topic. Null when no topics were supplied. + */ + public Boolean getDeniedTopic() { + return deniedTopic; + } + + @Override + public String toString() { + return "CheckGuardrailsResponse{" + + "text=" + text + + ", validation=" + validation + + ", toxic=" + toxic + + ", deniedTopic=" + deniedTopic + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/CustomType.java b/common/src/main/java/com/skyflow/detect/CustomType.java new file mode 100644 index 00000000..1eee269a --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/CustomType.java @@ -0,0 +1,75 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * A custom, regex-defined entity type. + */ +public final class CustomType { + private final String label; + private final List match; + + private CustomType(CustomTypeBuilder builder) { + this.label = builder.label; + this.match = builder.match; + } + + /** + * @return a new builder + */ + public static CustomTypeBuilder builder() { + return new CustomTypeBuilder(); + } + + /** + * @return Label reported as the entityType of matches. + */ + public String getLabel() { + return label; + } + + /** + * @return Regular expressions that identify the custom entity. + */ + public List getMatch() { + return match; + } + + @Override + public String toString() { + return "CustomType{" + + "label=" + label + + ", match=" + match + + '}'; + } + + public static final class CustomTypeBuilder { + private String label; + private List match; + + private CustomTypeBuilder() { + } + + /** + * @param label Label reported as the entityType of matches. + * @return this builder + */ + public CustomTypeBuilder label(String label) { + this.label = label; + return this; + } + + /** + * @param match Regular expressions that identify the custom entity. + * @return this builder + */ + public CustomTypeBuilder match(List match) { + this.match = match; + return this; + } + + public CustomType build() { + return new CustomType(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/DataSourceType.java b/common/src/main/java/com/skyflow/detect/DataSourceType.java new file mode 100644 index 00000000..d152fbb4 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DataSourceType.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * How file content is supplied to, or returned by, Detect file operations. + */ +public enum DataSourceType { + BASE64, + SKYFLOW_ID, + PRESIGNED_URL; +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentificationType.java b/common/src/main/java/com/skyflow/detect/DeidentificationType.java new file mode 100644 index 00000000..067d533f --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentificationType.java @@ -0,0 +1,12 @@ +package com.skyflow.detect; + +/** + * How a detected entity is replaced in the processed output. + */ +public enum DeidentificationType { + UNKNOWN, + ENTITY_UNIQUE_COUNTER, + ENTITY_ONLY, + VAULT_TOKEN, + MASK; +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java new file mode 100644 index 00000000..b91b3a76 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java @@ -0,0 +1,212 @@ +package com.skyflow.detect; + +import java.io.File; + +/** + * Request for {@code deidentifyFile}. Supply the file through exactly one of {@code value} (with a + * {@code dataSource}), {@code file} or {@code filePath}. The two file forms are builder sugar that set + * {@code dataSource = BASE64}, encode the content into {@code value} when the request is sent, and infer + * {@code dataFormat} from the extension unless it is set explicitly. + * + *

Without {@code pollOptions} the call submits the run and returns its id. With {@code pollOptions} the + * SDK polls the run and, on success for a file-based request, writes the outputs to disk. + */ +public final class DeidentifyFileRequest { + private final DataSourceType dataSource; + private final String value; + private final File file; + private final FileDataFormat dataFormat; + private final String configurationId; + private final DetectConfiguration configuration; + private final PollOptions pollOptions; + private final String outputDirectory; + + private DeidentifyFileRequest(DeidentifyFileRequestBuilder builder) { + this.dataSource = builder.dataSource; + this.value = builder.value; + this.file = builder.file; + this.dataFormat = builder.dataFormat; + this.configurationId = builder.configurationId; + this.configuration = builder.configuration; + this.pollOptions = builder.pollOptions; + this.outputDirectory = builder.outputDirectory; + } + + /** + * @return a new builder + */ + public static DeidentifyFileRequestBuilder builder() { + return new DeidentifyFileRequestBuilder(); + } + + /** + * @return How {@code value} supplies the file. Required unless {@code file} or {@code filePath} was used. + */ + public DataSourceType getDataSource() { + return dataSource; + } + + /** + * @return Base64 content, skyflow id or presigned URL, according to {@code dataSource}. + */ + public String getValue() { + return value; + } + + /** + * @return Local file to de-identify, when {@code file} or {@code filePath} was used. + */ + public File getFile() { + return file; + } + + /** + * @return Format of the file. Optional; inferred from the file extension or by the server when omitted. + */ + public FileDataFormat getDataFormat() { + return dataFormat; + } + + /** + * @return Id of a stored Detect configuration. + */ + public String getConfigurationId() { + return configurationId; + } + + /** + * @return Inline Detect configuration. + */ + public DetectConfiguration getConfiguration() { + return configuration; + } + + /** + * @return Polling settings, or null to submit only. + */ + public PollOptions getPollOptions() { + return pollOptions; + } + + /** + * @return Directory the outputs are written to on success. Only with {@code pollOptions} and a file-based request. + */ + public String getOutputDirectory() { + return outputDirectory; + } + + @Override + public String toString() { + return "DeidentifyFileRequest{" + + "dataSource=" + dataSource + + ", value=" + (value == null ? null : "<" + value.length() + " chars>") + + ", file=" + file + + ", dataFormat=" + dataFormat + + ", configurationId=" + configurationId + + ", configuration=" + configuration + + ", pollOptions=" + pollOptions + + ", outputDirectory=" + outputDirectory + + '}'; + } + + public static final class DeidentifyFileRequestBuilder { + private DataSourceType dataSource; + private String value; + private File file; + private FileDataFormat dataFormat; + private String configurationId; + private DetectConfiguration configuration; + private PollOptions pollOptions; + private String outputDirectory; + + private DeidentifyFileRequestBuilder() { + } + + /** + * @param dataSource How {@code value} supplies the file. + * @return this builder + */ + public DeidentifyFileRequestBuilder dataSource(DataSourceType dataSource) { + this.dataSource = dataSource; + return this; + } + + /** + * @param value Base64 content, skyflow id or presigned URL, according to {@code dataSource}. + * @return this builder + */ + public DeidentifyFileRequestBuilder value(String value) { + this.value = value; + return this; + } + + /** + * @param file Local file to de-identify. Sets {@code dataSource} to BASE64; the content is encoded when sent. + * @return this builder + */ + public DeidentifyFileRequestBuilder file(File file) { + this.file = file; + if (file != null) { + this.dataSource = DataSourceType.BASE64; + } + return this; + } + + /** + * @param filePath Path of a local file to de-identify. Same as {@link #file(File)}. + * @return this builder + */ + public DeidentifyFileRequestBuilder filePath(String filePath) { + return file(filePath == null ? null : new File(filePath)); + } + + /** + * @param dataFormat Format of the file. Optional. + * @return this builder + */ + public DeidentifyFileRequestBuilder dataFormat(FileDataFormat dataFormat) { + this.dataFormat = dataFormat; + return this; + } + + /** + * @param configurationId Id of a stored Detect configuration. + * @return this builder + */ + public DeidentifyFileRequestBuilder configurationId(String configurationId) { + this.configurationId = configurationId; + return this; + } + + /** + * @param configuration Inline Detect configuration. + * @return this builder + */ + public DeidentifyFileRequestBuilder configuration(DetectConfiguration configuration) { + this.configuration = configuration; + return this; + } + + /** + * @param pollOptions Poll the run after submitting. Null to submit only. + * @return this builder + */ + public DeidentifyFileRequestBuilder pollOptions(PollOptions pollOptions) { + this.pollOptions = pollOptions; + return this; + } + + /** + * @param outputDirectory Where to write outputs on success. Requires {@code pollOptions} and a file-based request. + * @return this builder + */ + public DeidentifyFileRequestBuilder outputDirectory(String outputDirectory) { + this.outputDirectory = outputDirectory; + return this; + } + + public DeidentifyFileRequest build() { + return new DeidentifyFileRequest(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java new file mode 100644 index 00000000..482b3b63 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java @@ -0,0 +1,83 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Response of {@code deidentifyFile}. {@code runId} is always present. {@code status} is null when the + * request did not poll; retrieve the run later with {@code getRun}. When polled, the remaining fields + * mirror {@link GetRunResponse}: output, outputType and metrics are populated only on SUCCESS, and + * message carries the failure detail on FAILED. + */ +public final class DeidentifyFileResponse { + private final String runId; + private final DetectRunStatus status; + private final DataSourceType outputType; + private final List output; + private final Metrics metrics; + private final String message; + + public DeidentifyFileResponse(String runId, DetectRunStatus status, DataSourceType outputType, + List output, Metrics metrics, String message) { + this.runId = runId; + this.status = status; + this.outputType = outputType; + this.output = output; + this.metrics = metrics; + this.message = message; + } + + /** + * @return Run id returned by the submit call. Use it with {@code getRun} to retrieve or resume. + */ + public String getRunId() { + return runId; + } + + /** + * @return Run status after polling. Null when the request did not poll. IN_PROGRESS or QUEUED when the + * polling budget ran out before the run finished. + */ + public DetectRunStatus getStatus() { + return status; + } + + /** + * @return How output files are delivered. Null unless polled to SUCCESS. + */ + public DataSourceType getOutputType() { + return outputType; + } + + /** + * @return Output artifacts. Empty unless polled to SUCCESS, never null. + */ + public List getOutput() { + return output; + } + + /** + * @return Processing metrics. Null unless polled to SUCCESS. + */ + public Metrics getMetrics() { + return metrics; + } + + /** + * @return Failure detail when status is FAILED. + */ + public String getMessage() { + return message; + } + + @Override + public String toString() { + return "DeidentifyFileResponse{" + + "runId=" + runId + + ", status=" + status + + ", outputType=" + outputType + + ", output=" + output + + ", metrics=" + metrics + + ", message=" + message + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java new file mode 100644 index 00000000..bde84343 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java @@ -0,0 +1,94 @@ +package com.skyflow.detect; + +/** + * Request for {@code deidentifyString}. configurationId and configuration are both optional and are sent + * exactly as supplied; the server applies its own rules for their combination. + */ +public final class DeidentifyStringRequest { + private final String text; + private final String configurationId; + private final DetectConfiguration configuration; + + private DeidentifyStringRequest(DeidentifyStringRequestBuilder builder) { + this.text = builder.text; + this.configurationId = builder.configurationId; + this.configuration = builder.configuration; + } + + /** + * @return a new builder + */ + public static DeidentifyStringRequestBuilder builder() { + return new DeidentifyStringRequestBuilder(); + } + + /** + * @return Text to de-identify. Required. + */ + public String getText() { + return text; + } + + /** + * @return Id of a stored Detect configuration. + */ + public String getConfigurationId() { + return configurationId; + } + + /** + * @return Inline Detect configuration. + */ + public DetectConfiguration getConfiguration() { + return configuration; + } + + @Override + public String toString() { + return "DeidentifyStringRequest{" + + "text=" + text + + ", configurationId=" + configurationId + + ", configuration=" + configuration + + '}'; + } + + public static final class DeidentifyStringRequestBuilder { + private String text; + private String configurationId; + private DetectConfiguration configuration; + + private DeidentifyStringRequestBuilder() { + } + + /** + * @param text Text to de-identify. Required. + * @return this builder + */ + public DeidentifyStringRequestBuilder text(String text) { + this.text = text; + return this; + } + + /** + * @param configurationId Id of a stored Detect configuration. + * @return this builder + */ + public DeidentifyStringRequestBuilder configurationId(String configurationId) { + this.configurationId = configurationId; + return this; + } + + /** + * @param configuration Inline Detect configuration. + * @return this builder + */ + public DeidentifyStringRequestBuilder configuration(DetectConfiguration configuration) { + this.configuration = configuration; + return this; + } + + public DeidentifyStringRequest build() { + return new DeidentifyStringRequest(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyStringResponse.java b/common/src/main/java/com/skyflow/detect/DeidentifyStringResponse.java new file mode 100644 index 00000000..7ea68dcf --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifyStringResponse.java @@ -0,0 +1,48 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Response of {@code deidentifyString}. + */ +public final class DeidentifyStringResponse { + private final String processedText; + private final List entities; + private final Metrics metrics; + + public DeidentifyStringResponse(String processedText, List entities, Metrics metrics) { + this.processedText = processedText; + this.entities = entities; + this.metrics = metrics; + } + + /** + * @return De-identified text. + */ + public String getProcessedText() { + return processedText; + } + + /** + * @return Detected entities. Never null. + */ + public List getEntities() { + return entities; + } + + /** + * @return Processing metrics. + */ + public Metrics getMetrics() { + return metrics; + } + + @Override + public String toString() { + return "DeidentifyStringResponse{" + + "processedText=" + processedText + + ", entities=" + entities + + ", metrics=" + metrics + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/Detect.java b/common/src/main/java/com/skyflow/detect/Detect.java new file mode 100644 index 00000000..dc998e57 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Detect.java @@ -0,0 +1,155 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Detection policy: which entities to look for and how to replace them. + */ +public final class Detect { + private final List entities; + private final List objectEntities; + private final List restrict; + private final List skip; + private final List customTypes; + private final ReturnEntitiesType returnEntities; + + private Detect(DetectBuilder builder) { + this.entities = builder.entities; + this.objectEntities = builder.objectEntities; + this.restrict = builder.restrict; + this.skip = builder.skip; + this.customTypes = builder.customTypes; + this.returnEntities = builder.returnEntities; + } + + /** + * @return a new builder + */ + public static DetectBuilder builder() { + return new DetectBuilder(); + } + + /** + * @return Per-entity rules. + */ + public List getEntities() { + return entities; + } + + /** + * @return Per-object rules. File inputs only. + */ + public List getObjectEntities() { + return objectEntities; + } + + /** + * @return Regular expressions that are always treated as sensitive. + */ + public List getRestrict() { + return restrict; + } + + /** + * @return Regular expressions that are never treated as sensitive. + */ + public List getSkip() { + return skip; + } + + /** + * @return Custom regex-defined entity types. + */ + public List getCustomTypes() { + return customTypes; + } + + /** + * @return Which entities to return. Defaults to EXCLUDE_SENSITIVE_DATA on the server. + */ + public ReturnEntitiesType getReturnEntities() { + return returnEntities; + } + + @Override + public String toString() { + return "Detect{" + + "entities=" + entities + + ", objectEntities=" + objectEntities + + ", restrict=" + restrict + + ", skip=" + skip + + ", customTypes=" + customTypes + + ", returnEntities=" + returnEntities + + '}'; + } + + public static final class DetectBuilder { + private List entities; + private List objectEntities; + private List restrict; + private List skip; + private List customTypes; + private ReturnEntitiesType returnEntities; + + private DetectBuilder() { + } + + /** + * @param entities Per-entity rules. + * @return this builder + */ + public DetectBuilder entities(List entities) { + this.entities = entities; + return this; + } + + /** + * @param objectEntities Per-object rules. File inputs only. + * @return this builder + */ + public DetectBuilder objectEntities(List objectEntities) { + this.objectEntities = objectEntities; + return this; + } + + /** + * @param restrict Regular expressions that are always treated as sensitive. + * @return this builder + */ + public DetectBuilder restrict(List restrict) { + this.restrict = restrict; + return this; + } + + /** + * @param skip Regular expressions that are never treated as sensitive. + * @return this builder + */ + public DetectBuilder skip(List skip) { + this.skip = skip; + return this; + } + + /** + * @param customTypes Custom regex-defined entity types. + * @return this builder + */ + public DetectBuilder customTypes(List customTypes) { + this.customTypes = customTypes; + return this; + } + + /** + * @param returnEntities Which entities to return. Defaults to EXCLUDE_SENSITIVE_DATA on the server. + * @return this builder + */ + public DetectBuilder returnEntities(ReturnEntitiesType returnEntities) { + this.returnEntities = returnEntities; + return this; + } + + public Detect build() { + return new Detect(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/DetectConfiguration.java b/common/src/main/java/com/skyflow/detect/DetectConfiguration.java new file mode 100644 index 00000000..e9209528 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DetectConfiguration.java @@ -0,0 +1,135 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * An inline Detect configuration, used instead of a stored configuration id. + */ +public final class DetectConfiguration { + private final String name; + private final String description; + private final Detect detect; + private final List fileMapping; + private final Media media; + + private DetectConfiguration(DetectConfigurationBuilder builder) { + this.name = builder.name; + this.description = builder.description; + this.detect = builder.detect; + this.fileMapping = builder.fileMapping; + this.media = builder.media; + } + + /** + * @return a new builder + */ + public static DetectConfigurationBuilder builder() { + return new DetectConfigurationBuilder(); + } + + /** + * @return Configuration name. + */ + public String getName() { + return name; + } + + /** + * @return Configuration description. + */ + public String getDescription() { + return description; + } + + /** + * @return Detection policy. + */ + public Detect getDetect() { + return detect; + } + + /** + * @return File mappings. File inputs only. + */ + public List getFileMapping() { + return fileMapping; + } + + /** + * @return Media options. File inputs only. + */ + public Media getMedia() { + return media; + } + + @Override + public String toString() { + return "DetectConfiguration{" + + "name=" + name + + ", description=" + description + + ", detect=" + detect + + ", fileMapping=" + fileMapping + + ", media=" + media + + '}'; + } + + public static final class DetectConfigurationBuilder { + private String name; + private String description; + private Detect detect; + private List fileMapping; + private Media media; + + private DetectConfigurationBuilder() { + } + + /** + * @param name Configuration name. + * @return this builder + */ + public DetectConfigurationBuilder name(String name) { + this.name = name; + return this; + } + + /** + * @param description Configuration description. + * @return this builder + */ + public DetectConfigurationBuilder description(String description) { + this.description = description; + return this; + } + + /** + * @param detect Detection policy. + * @return this builder + */ + public DetectConfigurationBuilder detect(Detect detect) { + this.detect = detect; + return this; + } + + /** + * @param fileMapping File mappings. File inputs only. + * @return this builder + */ + public DetectConfigurationBuilder fileMapping(List fileMapping) { + this.fileMapping = fileMapping; + return this; + } + + /** + * @param media Media options. File inputs only. + * @return this builder + */ + public DetectConfigurationBuilder media(Media media) { + this.media = media; + return this; + } + + public DetectConfiguration build() { + return new DetectConfiguration(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/DetectRunStatus.java b/common/src/main/java/com/skyflow/detect/DetectRunStatus.java new file mode 100644 index 00000000..3bb05886 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DetectRunStatus.java @@ -0,0 +1,12 @@ +package com.skyflow.detect; + +/** + * Lifecycle status of an asynchronous Detect file run. + */ +public enum DetectRunStatus { + UNKNOWN, + QUEUED, + IN_PROGRESS, + SUCCESS, + FAILED; +} diff --git a/common/src/main/java/com/skyflow/detect/DetectedEntity.java b/common/src/main/java/com/skyflow/detect/DetectedEntity.java new file mode 100644 index 00000000..6a443d1c --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DetectedEntity.java @@ -0,0 +1,68 @@ +package com.skyflow.detect; + +import java.util.Map; + +/** + * An entity detected in the input text. + */ +public final class DetectedEntity { + private final String token; + private final String value; + private final EntityLocation location; + private final String entityType; + private final Map entityScores; + + public DetectedEntity(String token, String value, EntityLocation location, String entityType, Map entityScores) { + this.token = token; + this.value = value; + this.location = location; + this.entityType = entityType; + this.entityScores = entityScores; + } + + /** + * @return Replacement token, for example NAME_1. + */ + public String getToken() { + return token; + } + + /** + * @return Original value. Empty unless returnEntities is ALL. + */ + public String getValue() { + return value; + } + + /** + * @return Where the entity was found. + */ + public EntityLocation getLocation() { + return location; + } + + /** + * @return Entity type. Carries custom-type labels as well as built-in types. + */ + public String getEntityType() { + return entityType; + } + + /** + * @return Confidence scores by entity type, 0.0 to 1.0. + */ + public Map getEntityScores() { + return entityScores; + } + + @Override + public String toString() { + return "DetectedEntity{" + + "token=" + token + + ", value=" + value + + ", location=" + location + + ", entityType=" + entityType + + ", entityScores=" + entityScores + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/Document.java b/common/src/main/java/com/skyflow/detect/Document.java new file mode 100644 index 00000000..2d461196 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Document.java @@ -0,0 +1,53 @@ +package com.skyflow.detect; + +/** + * Document processing options. + */ +public final class Document { + private final Pdf pdf; + + private Document(DocumentBuilder builder) { + this.pdf = builder.pdf; + } + + /** + * @return a new builder + */ + public static DocumentBuilder builder() { + return new DocumentBuilder(); + } + + /** + * @return PDF options. + */ + public Pdf getPdf() { + return pdf; + } + + @Override + public String toString() { + return "Document{" + + "pdf=" + pdf + + '}'; + } + + public static final class DocumentBuilder { + private Pdf pdf; + + private DocumentBuilder() { + } + + /** + * @param pdf PDF options. + * @return this builder + */ + public DocumentBuilder pdf(Pdf pdf) { + this.pdf = pdf; + return this; + } + + public Document build() { + return new Document(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/Entity.java b/common/src/main/java/com/skyflow/detect/Entity.java new file mode 100644 index 00000000..992acafd --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Entity.java @@ -0,0 +1,113 @@ +package com.skyflow.detect; + +/** + * Configures how a single entity type is detected and de-identified. + */ +public final class Entity { + private final EntityType entityType; + private final DeidentificationType deidentificationType; + private final String destination; + private final Transformation transformation; + + private Entity(EntityBuilder builder) { + this.entityType = builder.entityType; + this.deidentificationType = builder.deidentificationType; + this.destination = builder.destination; + this.transformation = builder.transformation; + } + + /** + * @return a new builder + */ + public static EntityBuilder builder() { + return new EntityBuilder(); + } + + /** + * @return Entity type this rule applies to. Defaults to ALL on the server. + */ + public EntityType getEntityType() { + return entityType; + } + + /** + * @return Replacement strategy. Defaults to ENTITY_UNIQUE_COUNTER on the server. + */ + public DeidentificationType getDeidentificationType() { + return deidentificationType; + } + + /** + * @return Where vault tokens are stored: a table.column (skyvault) or token-group name (flowvault). Only used with VAULT_TOKEN. + */ + public String getDestination() { + return destination; + } + + /** + * @return Optional transformation applied to the detected value. + */ + public Transformation getTransformation() { + return transformation; + } + + @Override + public String toString() { + return "Entity{" + + "entityType=" + entityType + + ", deidentificationType=" + deidentificationType + + ", destination=" + destination + + ", transformation=" + transformation + + '}'; + } + + public static final class EntityBuilder { + private EntityType entityType; + private DeidentificationType deidentificationType; + private String destination; + private Transformation transformation; + + private EntityBuilder() { + } + + /** + * @param entityType Entity type this rule applies to. Defaults to ALL on the server. + * @return this builder + */ + public EntityBuilder entityType(EntityType entityType) { + this.entityType = entityType; + return this; + } + + /** + * @param deidentificationType Replacement strategy. Defaults to ENTITY_UNIQUE_COUNTER on the server. + * @return this builder + */ + public EntityBuilder deidentificationType(DeidentificationType deidentificationType) { + this.deidentificationType = deidentificationType; + return this; + } + + /** + * @param destination Where vault tokens are stored: a table.column (skyvault) or token-group name (flowvault). Only used with VAULT_TOKEN. + * @return this builder + */ + public EntityBuilder destination(String destination) { + this.destination = destination; + return this; + } + + /** + * @param transformation Optional transformation applied to the detected value. + * @return this builder + */ + public EntityBuilder transformation(Transformation transformation) { + this.transformation = transformation; + return this; + } + + public Entity build() { + return new Entity(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/EntityLocation.java b/common/src/main/java/com/skyflow/detect/EntityLocation.java new file mode 100644 index 00000000..88b45048 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/EntityLocation.java @@ -0,0 +1,56 @@ +package com.skyflow.detect; + +/** + * Position of a detected entity in the original and processed text. + */ +public final class EntityLocation { + private final Integer startIndex; + private final Integer endIndex; + private final Integer startIndexProcessed; + private final Integer endIndexProcessed; + + public EntityLocation(Integer startIndex, Integer endIndex, Integer startIndexProcessed, Integer endIndexProcessed) { + this.startIndex = startIndex; + this.endIndex = endIndex; + this.startIndexProcessed = startIndexProcessed; + this.endIndexProcessed = endIndexProcessed; + } + + /** + * @return Start index in the original text. + */ + public Integer getStartIndex() { + return startIndex; + } + + /** + * @return End index in the original text. + */ + public Integer getEndIndex() { + return endIndex; + } + + /** + * @return Start index in the processed text. + */ + public Integer getStartIndexProcessed() { + return startIndexProcessed; + } + + /** + * @return End index in the processed text. + */ + public Integer getEndIndexProcessed() { + return endIndexProcessed; + } + + @Override + public String toString() { + return "EntityLocation{" + + "startIndex=" + startIndex + + ", endIndex=" + endIndex + + ", startIndexProcessed=" + startIndexProcessed + + ", endIndexProcessed=" + endIndexProcessed + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/EntityType.java b/common/src/main/java/com/skyflow/detect/EntityType.java new file mode 100644 index 00000000..99cbbd8a --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/EntityType.java @@ -0,0 +1,78 @@ +package com.skyflow.detect; + +/** + * Entity types Skyflow Detect can identify. Also used to target entities in {@link RedactionLevel}. + */ +public enum EntityType { + NONE, + ACCOUNT_NUMBER, + AGE, + ALL, + BANK_ACCOUNT, + BLOOD_TYPE, + CONDITION, + CORPORATE_ACTION, + CREDIT_CARD, + CREDIT_CARD_EXPIRATION, + CVV, + DATE, + DATE_INTERVAL, + DAY, + DOB, + DOSE, + DRIVER_LICENSE, + DRUG, + DURATION, + EFFECT, + EMAIL_ADDRESS, + EVENT, + FILENAME, + FINANCIAL_METRIC, + GENDER, + HEALTHCARE_NUMBER, + INJURY, + IP_ADDRESS, + LANGUAGE, + LOCATION, + LOCATION_ADDRESS, + LOCATION_ADDRESS_STREET, + LOCATION_CITY, + LOCATION_COORDINATE, + LOCATION_COUNTRY, + LOCATION_STATE, + LOCATION_ZIP, + MARITAL_STATUS, + MEDICAL_CODE, + MEDICAL_PROCESS, + MONEY, + MONTH, + NAME, + NAME_FAMILY, + NAME_GIVEN, + NAME_MEDICAL_PROFESSIONAL, + NUMERICAL_PII, + OCCUPATION, + ORGANIZATION, + ORGANIZATION_ID, + ORGANIZATION_MEDICAL_FACILITY, + ORIGIN, + PASSPORT_NUMBER, + PASSWORD, + PHONE_NUMBER, + PHYSICAL_ATTRIBUTE, + POLITICAL_AFFILIATION, + PRODUCT, + PROJECT, + RELIGION, + ROUTING_NUMBER, + SEXUALITY, + SSN, + STATISTICS, + TIME, + TREND, + URL, + USERNAME, + VEHICLE_ID, + YEAR, + ZODIAC_SIGN; +} diff --git a/common/src/main/java/com/skyflow/detect/FileDataFormat.java b/common/src/main/java/com/skyflow/detect/FileDataFormat.java new file mode 100644 index 00000000..047cb54b --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/FileDataFormat.java @@ -0,0 +1,30 @@ +package com.skyflow.detect; + +/** + * File formats understood by Detect file operations. The wire value is the lower-case extension. + */ +public enum FileDataFormat { + BMP, + CSV, + DCM, + DOC, + DOCX, + GIF, + JPEG, + JPG, + JSON, + JSONL, + MP3, + PDF, + PNG, + PPT, + PPTX, + TIF, + TIFF, + TXT, + WAV, + XLS, + XLSX, + XML, + ZIP; +} diff --git a/common/src/main/java/com/skyflow/detect/FileMapping.java b/common/src/main/java/com/skyflow/detect/FileMapping.java new file mode 100644 index 00000000..da0663b0 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/FileMapping.java @@ -0,0 +1,133 @@ +package com.skyflow.detect; + +/** + * Maps an input file location to output locations. File inputs only. + */ +public final class FileMapping { + private final String source; + private final String destination; + private final String outputFileNameSuffix; + private final String entitiesDestination; + private final String objectEntitiesDestination; + + private FileMapping(FileMappingBuilder builder) { + this.source = builder.source; + this.destination = builder.destination; + this.outputFileNameSuffix = builder.outputFileNameSuffix; + this.entitiesDestination = builder.entitiesDestination; + this.objectEntitiesDestination = builder.objectEntitiesDestination; + } + + /** + * @return a new builder + */ + public static FileMappingBuilder builder() { + return new FileMappingBuilder(); + } + + /** + * @return Source location. + */ + public String getSource() { + return source; + } + + /** + * @return Destination for the processed file. + */ + public String getDestination() { + return destination; + } + + /** + * @return Suffix appended to the processed file name. + */ + public String getOutputFileNameSuffix() { + return outputFileNameSuffix; + } + + /** + * @return Destination for the detected entities file. + */ + public String getEntitiesDestination() { + return entitiesDestination; + } + + /** + * @return Destination for the detected object entities file. + */ + public String getObjectEntitiesDestination() { + return objectEntitiesDestination; + } + + @Override + public String toString() { + return "FileMapping{" + + "source=" + source + + ", destination=" + destination + + ", outputFileNameSuffix=" + outputFileNameSuffix + + ", entitiesDestination=" + entitiesDestination + + ", objectEntitiesDestination=" + objectEntitiesDestination + + '}'; + } + + public static final class FileMappingBuilder { + private String source; + private String destination; + private String outputFileNameSuffix; + private String entitiesDestination; + private String objectEntitiesDestination; + + private FileMappingBuilder() { + } + + /** + * @param source Source location. + * @return this builder + */ + public FileMappingBuilder source(String source) { + this.source = source; + return this; + } + + /** + * @param destination Destination for the processed file. + * @return this builder + */ + public FileMappingBuilder destination(String destination) { + this.destination = destination; + return this; + } + + /** + * @param outputFileNameSuffix Suffix appended to the processed file name. + * @return this builder + */ + public FileMappingBuilder outputFileNameSuffix(String outputFileNameSuffix) { + this.outputFileNameSuffix = outputFileNameSuffix; + return this; + } + + /** + * @param entitiesDestination Destination for the detected entities file. + * @return this builder + */ + public FileMappingBuilder entitiesDestination(String entitiesDestination) { + this.entitiesDestination = entitiesDestination; + return this; + } + + /** + * @param objectEntitiesDestination Destination for the detected object entities file. + * @return this builder + */ + public FileMappingBuilder objectEntitiesDestination(String objectEntitiesDestination) { + this.objectEntitiesDestination = objectEntitiesDestination; + return this; + } + + public FileMapping build() { + return new FileMapping(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/FileOutput.java b/common/src/main/java/com/skyflow/detect/FileOutput.java new file mode 100644 index 00000000..a33cafca --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/FileOutput.java @@ -0,0 +1,46 @@ +package com.skyflow.detect; + +/** + * One output artifact of a Detect file run. + */ +public final class FileOutput { + private final String processedFile; + private final String processedFileType; + private final FileDataFormat processedFileExtension; + + public FileOutput(String processedFile, String processedFileType, FileDataFormat processedFileExtension) { + this.processedFile = processedFile; + this.processedFileType = processedFileType; + this.processedFileExtension = processedFileExtension; + } + + /** + * @return Base64 content or presigned URL, according to the run's outputType. + */ + public String getProcessedFile() { + return processedFile; + } + + /** + * @return Kind of output, for example REDACTED_FILE or ENTITIES. Reported as a string because the API does not enumerate it. + */ + public String getProcessedFileType() { + return processedFileType; + } + + /** + * @return Format of the output, or null when not reported. + */ + public FileDataFormat getProcessedFileExtension() { + return processedFileExtension; + } + + @Override + public String toString() { + return "FileOutput{" + + "processedFile=" + processedFile + + ", processedFileType=" + processedFileType + + ", processedFileExtension=" + processedFileExtension + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/GetRunRequest.java b/common/src/main/java/com/skyflow/detect/GetRunRequest.java new file mode 100644 index 00000000..21a02689 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/GetRunRequest.java @@ -0,0 +1,53 @@ +package com.skyflow.detect; + +/** + * Request for {@code getRun}: retrieves the status and outputs of a Detect file run. + */ +public final class GetRunRequest { + private final String runId; + + private GetRunRequest(GetRunRequestBuilder builder) { + this.runId = builder.runId; + } + + /** + * @return a new builder + */ + public static GetRunRequestBuilder builder() { + return new GetRunRequestBuilder(); + } + + /** + * @return Run id returned by {@code deidentifyFile}. Required. + */ + public String getRunId() { + return runId; + } + + @Override + public String toString() { + return "GetRunRequest{" + + "runId=" + runId + + '}'; + } + + public static final class GetRunRequestBuilder { + private String runId; + + private GetRunRequestBuilder() { + } + + /** + * @param runId Run id returned by {@code deidentifyFile}. Required. + * @return this builder + */ + public GetRunRequestBuilder runId(String runId) { + this.runId = runId; + return this; + } + + public GetRunRequest build() { + return new GetRunRequest(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/GetRunResponse.java b/common/src/main/java/com/skyflow/detect/GetRunResponse.java new file mode 100644 index 00000000..e8ffbc27 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/GetRunResponse.java @@ -0,0 +1,78 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Response of {@code getRun}. Output, outputType and metrics are populated only once the run has succeeded. + */ +public final class GetRunResponse { + private final String runId; + private final DetectRunStatus status; + private final DataSourceType outputType; + private final List output; + private final Metrics metrics; + private final String message; + + public GetRunResponse(String runId, DetectRunStatus status, DataSourceType outputType, List output, Metrics metrics, String message) { + this.runId = runId; + this.status = status; + this.outputType = outputType; + this.output = output; + this.metrics = metrics; + this.message = message; + } + + /** + * @return Run id that was queried. + */ + public String getRunId() { + return runId; + } + + /** + * @return Run status. UNKNOWN when the API did not report one. + */ + public DetectRunStatus getStatus() { + return status; + } + + /** + * @return How output files are delivered. Null while the run is pending. + */ + public DataSourceType getOutputType() { + return outputType; + } + + /** + * @return Output artifacts. Empty while the run is pending, never null. + */ + public List getOutput() { + return output; + } + + /** + * @return Processing metrics. Null while the run is pending. + */ + public Metrics getMetrics() { + return metrics; + } + + /** + * @return Failure detail when status is FAILED. + */ + public String getMessage() { + return message; + } + + @Override + public String toString() { + return "GetRunResponse{" + + "runId=" + runId + + ", status=" + status + + ", outputType=" + outputType + + ", output=" + output + + ", metrics=" + metrics + + ", message=" + message + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/GuardrailsValidation.java b/common/src/main/java/com/skyflow/detect/GuardrailsValidation.java new file mode 100644 index 00000000..1d6f0f8c --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/GuardrailsValidation.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * Overall result of a guardrails check. + */ +public enum GuardrailsValidation { + PASSED, + FAILED, + /** The API reported a value this SDK version does not know. */ + UNKNOWN; +} diff --git a/common/src/main/java/com/skyflow/detect/Image.java b/common/src/main/java/com/skyflow/detect/Image.java new file mode 100644 index 00000000..f1e33135 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Image.java @@ -0,0 +1,93 @@ +package com.skyflow.detect; + +/** + * Image processing options. + */ +public final class Image { + private final Boolean outputProcessedImage; + private final Boolean outputOcrText; + private final MaskingMethod maskingMethod; + + private Image(ImageBuilder builder) { + this.outputProcessedImage = builder.outputProcessedImage; + this.outputOcrText = builder.outputOcrText; + this.maskingMethod = builder.maskingMethod; + } + + /** + * @return a new builder + */ + public static ImageBuilder builder() { + return new ImageBuilder(); + } + + /** + * @return Whether to return the processed image. + */ + public Boolean getOutputProcessedImage() { + return outputProcessedImage; + } + + /** + * @return Whether to return OCR text. + */ + public Boolean getOutputOcrText() { + return outputOcrText; + } + + /** + * @return Masking method for detected regions. + */ + public MaskingMethod getMaskingMethod() { + return maskingMethod; + } + + @Override + public String toString() { + return "Image{" + + "outputProcessedImage=" + outputProcessedImage + + ", outputOcrText=" + outputOcrText + + ", maskingMethod=" + maskingMethod + + '}'; + } + + public static final class ImageBuilder { + private Boolean outputProcessedImage; + private Boolean outputOcrText; + private MaskingMethod maskingMethod; + + private ImageBuilder() { + } + + /** + * @param outputProcessedImage Whether to return the processed image. + * @return this builder + */ + public ImageBuilder outputProcessedImage(Boolean outputProcessedImage) { + this.outputProcessedImage = outputProcessedImage; + return this; + } + + /** + * @param outputOcrText Whether to return OCR text. + * @return this builder + */ + public ImageBuilder outputOcrText(Boolean outputOcrText) { + this.outputOcrText = outputOcrText; + return this; + } + + /** + * @param maskingMethod Masking method for detected regions. + * @return this builder + */ + public ImageBuilder maskingMethod(MaskingMethod maskingMethod) { + this.maskingMethod = maskingMethod; + return this; + } + + public Image build() { + return new Image(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/MaskingMethod.java b/common/src/main/java/com/skyflow/detect/MaskingMethod.java new file mode 100644 index 00000000..38402c52 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/MaskingMethod.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * Masking method applied to detected regions in images. + */ +public enum MaskingMethod { + NONE, + BLUR, + BLACKBOX; +} diff --git a/common/src/main/java/com/skyflow/detect/Media.java b/common/src/main/java/com/skyflow/detect/Media.java new file mode 100644 index 00000000..af6f24ac --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Media.java @@ -0,0 +1,93 @@ +package com.skyflow.detect; + +/** + * Media-type specific processing options. File inputs only. + */ +public final class Media { + private final Audio audio; + private final Document document; + private final Image image; + + private Media(MediaBuilder builder) { + this.audio = builder.audio; + this.document = builder.document; + this.image = builder.image; + } + + /** + * @return a new builder + */ + public static MediaBuilder builder() { + return new MediaBuilder(); + } + + /** + * @return Audio options. + */ + public Audio getAudio() { + return audio; + } + + /** + * @return Document options. + */ + public Document getDocument() { + return document; + } + + /** + * @return Image options. + */ + public Image getImage() { + return image; + } + + @Override + public String toString() { + return "Media{" + + "audio=" + audio + + ", document=" + document + + ", image=" + image + + '}'; + } + + public static final class MediaBuilder { + private Audio audio; + private Document document; + private Image image; + + private MediaBuilder() { + } + + /** + * @param audio Audio options. + * @return this builder + */ + public MediaBuilder audio(Audio audio) { + this.audio = audio; + return this; + } + + /** + * @param document Document options. + * @return this builder + */ + public MediaBuilder document(Document document) { + this.document = document; + return this; + } + + /** + * @param image Image options. + * @return this builder + */ + public MediaBuilder image(Image image) { + this.image = image; + return this; + } + + public Media build() { + return new Media(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/Metrics.java b/common/src/main/java/com/skyflow/detect/Metrics.java new file mode 100644 index 00000000..46becb12 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Metrics.java @@ -0,0 +1,76 @@ +package com.skyflow.detect; + +/** + * Processing metrics returned by Detect operations. + */ +public final class Metrics { + private final Double size; + private final Integer wordCount; + private final Integer characterCount; + private final Integer slides; + private final Integer pages; + private final Double duration; + + public Metrics(Double size, Integer wordCount, Integer characterCount, Integer slides, Integer pages, Double duration) { + this.size = size; + this.wordCount = wordCount; + this.characterCount = characterCount; + this.slides = slides; + this.pages = pages; + this.duration = duration; + } + + /** + * @return Input size in kilobytes. + */ + public Double getSize() { + return size; + } + + /** + * @return Number of words. + */ + public Integer getWordCount() { + return wordCount; + } + + /** + * @return Number of characters. + */ + public Integer getCharacterCount() { + return characterCount; + } + + /** + * @return Number of slides. + */ + public Integer getSlides() { + return slides; + } + + /** + * @return Number of pages. + */ + public Integer getPages() { + return pages; + } + + /** + * @return Media duration in seconds. + */ + public Double getDuration() { + return duration; + } + + @Override + public String toString() { + return "Metrics{" + + "size=" + size + + ", wordCount=" + wordCount + + ", characterCount=" + characterCount + + ", slides=" + slides + + ", pages=" + pages + + ", duration=" + duration + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/ObjectDeidentificationType.java b/common/src/main/java/com/skyflow/detect/ObjectDeidentificationType.java new file mode 100644 index 00000000..13f3fd6e --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ObjectDeidentificationType.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * How a detected visual object is handled. + */ +public enum ObjectDeidentificationType { + UNKNOWN, + REDACT, + UNREDACT; +} diff --git a/common/src/main/java/com/skyflow/detect/ObjectEntity.java b/common/src/main/java/com/skyflow/detect/ObjectEntity.java new file mode 100644 index 00000000..1f62853b --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ObjectEntity.java @@ -0,0 +1,73 @@ +package com.skyflow.detect; + +/** + * Configures detection of a visual object type in images or video. + */ +public final class ObjectEntity { + private final ObjectEntityType entityType; + private final ObjectDeidentificationType deidentificationType; + + private ObjectEntity(ObjectEntityBuilder builder) { + this.entityType = builder.entityType; + this.deidentificationType = builder.deidentificationType; + } + + /** + * @return a new builder + */ + public static ObjectEntityBuilder builder() { + return new ObjectEntityBuilder(); + } + + /** + * @return Object type this rule applies to. + */ + public ObjectEntityType getEntityType() { + return entityType; + } + + /** + * @return How matches are handled. + */ + public ObjectDeidentificationType getDeidentificationType() { + return deidentificationType; + } + + @Override + public String toString() { + return "ObjectEntity{" + + "entityType=" + entityType + + ", deidentificationType=" + deidentificationType + + '}'; + } + + public static final class ObjectEntityBuilder { + private ObjectEntityType entityType; + private ObjectDeidentificationType deidentificationType; + + private ObjectEntityBuilder() { + } + + /** + * @param entityType Object type this rule applies to. + * @return this builder + */ + public ObjectEntityBuilder entityType(ObjectEntityType entityType) { + this.entityType = entityType; + return this; + } + + /** + * @param deidentificationType How matches are handled. + * @return this builder + */ + public ObjectEntityBuilder deidentificationType(ObjectDeidentificationType deidentificationType) { + this.deidentificationType = deidentificationType; + return this; + } + + public ObjectEntity build() { + return new ObjectEntity(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/ObjectEntityType.java b/common/src/main/java/com/skyflow/detect/ObjectEntityType.java new file mode 100644 index 00000000..679917c7 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ObjectEntityType.java @@ -0,0 +1,13 @@ +package com.skyflow.detect; + +/** + * Visual objects Skyflow Detect can identify in images and video. + */ +public enum ObjectEntityType { + NONE, + FACE, + LICENSE_PLATE, + LOGO, + SIGNATURE, + ALL; +} diff --git a/common/src/main/java/com/skyflow/detect/OutputTranscriptionType.java b/common/src/main/java/com/skyflow/detect/OutputTranscriptionType.java new file mode 100644 index 00000000..ed2638ed --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/OutputTranscriptionType.java @@ -0,0 +1,12 @@ +package com.skyflow.detect; + +/** + * Transcription output produced for audio inputs. + */ +public enum OutputTranscriptionType { + NONE, + TRANSCRIPTION, + MEDICAL_TRANSCRIPTION, + DIARIZED_TRANSCRIPTION, + MEDICAL_DIARIZED_TRANSCRIPTION; +} diff --git a/common/src/main/java/com/skyflow/detect/Pdf.java b/common/src/main/java/com/skyflow/detect/Pdf.java new file mode 100644 index 00000000..d147d632 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Pdf.java @@ -0,0 +1,93 @@ +package com.skyflow.detect; + +/** + * PDF processing options. + */ +public final class Pdf { + private final PdfProcessingMode processingMode; + private final Integer density; + private final Integer maxResolution; + + private Pdf(PdfBuilder builder) { + this.processingMode = builder.processingMode; + this.density = builder.density; + this.maxResolution = builder.maxResolution; + } + + /** + * @return a new builder + */ + public static PdfBuilder builder() { + return new PdfBuilder(); + } + + /** + * @return Processing mode. + */ + public PdfProcessingMode getProcessingMode() { + return processingMode; + } + + /** + * @return Rendering density (DPI). + */ + public Integer getDensity() { + return density; + } + + /** + * @return Maximum rendering resolution. + */ + public Integer getMaxResolution() { + return maxResolution; + } + + @Override + public String toString() { + return "Pdf{" + + "processingMode=" + processingMode + + ", density=" + density + + ", maxResolution=" + maxResolution + + '}'; + } + + public static final class PdfBuilder { + private PdfProcessingMode processingMode; + private Integer density; + private Integer maxResolution; + + private PdfBuilder() { + } + + /** + * @param processingMode Processing mode. + * @return this builder + */ + public PdfBuilder processingMode(PdfProcessingMode processingMode) { + this.processingMode = processingMode; + return this; + } + + /** + * @param density Rendering density (DPI). + * @return this builder + */ + public PdfBuilder density(Integer density) { + this.density = density; + return this; + } + + /** + * @param maxResolution Maximum rendering resolution. + * @return this builder + */ + public PdfBuilder maxResolution(Integer maxResolution) { + this.maxResolution = maxResolution; + return this; + } + + public Pdf build() { + return new Pdf(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/PdfProcessingMode.java b/common/src/main/java/com/skyflow/detect/PdfProcessingMode.java new file mode 100644 index 00000000..f32399ba --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/PdfProcessingMode.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * How PDF documents are processed. + */ +public enum PdfProcessingMode { + NONE, + OCR, + TEXT_LAYER; +} diff --git a/common/src/main/java/com/skyflow/detect/PollOptions.java b/common/src/main/java/com/skyflow/detect/PollOptions.java new file mode 100644 index 00000000..c1aa656a --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/PollOptions.java @@ -0,0 +1,91 @@ +package com.skyflow.detect; + +/** + * Opts {@code deidentifyFile} into submit-and-poll mode. When present, the SDK polls the run with + * exponential backoff (1, 2, 4, 8, 16, then 32 seconds) until it reaches a terminal status, the + * wait time is used up, or the attempt limit is hit. An empty {@code PollOptions.builder().build()} + * uses the defaults. + */ +public final class PollOptions { + public static final int DEFAULT_WAIT_TIME_SECONDS = 60; + public static final int MAX_WAIT_TIME_SECONDS = 300; + public static final int DEFAULT_MAX_ATTEMPTS = 23; + public static final int MAX_MAX_ATTEMPTS = 23; + + private final Integer waitTime; + private final Integer maxAttempts; + + private PollOptions(PollOptionsBuilder builder) { + this.waitTime = builder.waitTime; + this.maxAttempts = builder.maxAttempts; + } + + /** + * @return a new builder + */ + public static PollOptionsBuilder builder() { + return new PollOptionsBuilder(); + } + + /** + * @return Maximum total seconds to keep polling, or null for the default of 60. At most 300. + */ + public Integer getWaitTime() { + return waitTime; + } + + /** + * @return Maximum number of run lookups, or null for the default of 23. At most 23. + */ + public Integer getMaxAttempts() { + return maxAttempts; + } + + /** @return the wait time with the default applied */ + public int effectiveWaitTime() { + return waitTime == null ? DEFAULT_WAIT_TIME_SECONDS : waitTime; + } + + /** @return the attempt limit with the default applied */ + public int effectiveMaxAttempts() { + return maxAttempts == null ? DEFAULT_MAX_ATTEMPTS : maxAttempts; + } + + @Override + public String toString() { + return "PollOptions{" + + "waitTime=" + waitTime + + ", maxAttempts=" + maxAttempts + + '}'; + } + + public static final class PollOptionsBuilder { + private Integer waitTime; + private Integer maxAttempts; + + private PollOptionsBuilder() { + } + + /** + * @param waitTime Maximum total seconds to keep polling. 1 to 300; default 60. + * @return this builder + */ + public PollOptionsBuilder waitTime(Integer waitTime) { + this.waitTime = waitTime; + return this; + } + + /** + * @param maxAttempts Maximum number of run lookups. 1 to 23; default 23. + * @return this builder + */ + public PollOptionsBuilder maxAttempts(Integer maxAttempts) { + this.maxAttempts = maxAttempts; + return this; + } + + public PollOptions build() { + return new PollOptions(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/RedactionLevel.java b/common/src/main/java/com/skyflow/detect/RedactionLevel.java new file mode 100644 index 00000000..74f04f1e --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/RedactionLevel.java @@ -0,0 +1,113 @@ +package com.skyflow.detect; + +/** + * Controls how one group of tokens is rendered when re-identifying. Supply exactly one source (entityName or tokenGroupName) and exactly one replacement (redactionType or redactionPattern). + */ +public final class RedactionLevel { + private final EntityType entityName; + private final RedactionType redactionType; + private final String tokenGroupName; + private final String redactionPattern; + + private RedactionLevel(RedactionLevelBuilder builder) { + this.entityName = builder.entityName; + this.redactionType = builder.redactionType; + this.tokenGroupName = builder.tokenGroupName; + this.redactionPattern = builder.redactionPattern; + } + + /** + * @return a new builder + */ + public static RedactionLevelBuilder builder() { + return new RedactionLevelBuilder(); + } + + /** + * @return Entity to target. skyvault vaults. + */ + public EntityType getEntityName() { + return entityName; + } + + /** + * @return Replacement rendering. skyvault vaults. + */ + public RedactionType getRedactionType() { + return redactionType; + } + + /** + * @return Token group to target. flowvault vaults. + */ + public String getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Named redaction pattern to apply. flowvault vaults. + */ + public String getRedactionPattern() { + return redactionPattern; + } + + @Override + public String toString() { + return "RedactionLevel{" + + "entityName=" + entityName + + ", redactionType=" + redactionType + + ", tokenGroupName=" + tokenGroupName + + ", redactionPattern=" + redactionPattern + + '}'; + } + + public static final class RedactionLevelBuilder { + private EntityType entityName; + private RedactionType redactionType; + private String tokenGroupName; + private String redactionPattern; + + private RedactionLevelBuilder() { + } + + /** + * @param entityName Entity to target. skyvault vaults. + * @return this builder + */ + public RedactionLevelBuilder entityName(EntityType entityName) { + this.entityName = entityName; + return this; + } + + /** + * @param redactionType Replacement rendering. skyvault vaults. + * @return this builder + */ + public RedactionLevelBuilder redactionType(RedactionType redactionType) { + this.redactionType = redactionType; + return this; + } + + /** + * @param tokenGroupName Token group to target. flowvault vaults. + * @return this builder + */ + public RedactionLevelBuilder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + /** + * @param redactionPattern Named redaction pattern to apply. flowvault vaults. + * @return this builder + */ + public RedactionLevelBuilder redactionPattern(String redactionPattern) { + this.redactionPattern = redactionPattern; + return this; + } + + public RedactionLevel build() { + return new RedactionLevel(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/RedactionType.java b/common/src/main/java/com/skyflow/detect/RedactionType.java new file mode 100644 index 00000000..87b3e891 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/RedactionType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How a token is rendered when re-identifying (skyvault vaults). + */ +public enum RedactionType { + PLAIN_TEXT, + MASKED, + DEFAULT, + REDACTED; +} diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java new file mode 100644 index 00000000..23626297 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java @@ -0,0 +1,75 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Request for {@code reidentifyString}. + */ +public final class ReidentifyStringRequest { + private final String text; + private final List redactionLevel; + + private ReidentifyStringRequest(ReidentifyStringRequestBuilder builder) { + this.text = builder.text; + this.redactionLevel = builder.redactionLevel; + } + + /** + * @return a new builder + */ + public static ReidentifyStringRequestBuilder builder() { + return new ReidentifyStringRequestBuilder(); + } + + /** + * @return Text containing tokens to re-identify. Required. + */ + public String getText() { + return text; + } + + /** + * @return Optional per-group rendering rules. + */ + public List getRedactionLevel() { + return redactionLevel; + } + + @Override + public String toString() { + return "ReidentifyStringRequest{" + + "text=" + text + + ", redactionLevel=" + redactionLevel + + '}'; + } + + public static final class ReidentifyStringRequestBuilder { + private String text; + private List redactionLevel; + + private ReidentifyStringRequestBuilder() { + } + + /** + * @param text Text containing tokens to re-identify. Required. + * @return this builder + */ + public ReidentifyStringRequestBuilder text(String text) { + this.text = text; + return this; + } + + /** + * @param redactionLevel Optional per-group rendering rules. + * @return this builder + */ + public ReidentifyStringRequestBuilder redactionLevel(List redactionLevel) { + this.redactionLevel = redactionLevel; + return this; + } + + public ReidentifyStringRequest build() { + return new ReidentifyStringRequest(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyStringResponse.java b/common/src/main/java/com/skyflow/detect/ReidentifyStringResponse.java new file mode 100644 index 00000000..e1825bf2 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ReidentifyStringResponse.java @@ -0,0 +1,36 @@ +package com.skyflow.detect; + +/** + * Response of {@code reidentifyString}. + */ +public final class ReidentifyStringResponse { + private final String processedText; + private final Metrics metrics; + + public ReidentifyStringResponse(String processedText, Metrics metrics) { + this.processedText = processedText; + this.metrics = metrics; + } + + /** + * @return Re-identified text. + */ + public String getProcessedText() { + return processedText; + } + + /** + * @return Processing metrics. + */ + public Metrics getMetrics() { + return metrics; + } + + @Override + public String toString() { + return "ReidentifyStringResponse{" + + "processedText=" + processedText + + ", metrics=" + metrics + + '}'; + } +} diff --git a/common/src/main/java/com/skyflow/detect/ReturnEntitiesType.java b/common/src/main/java/com/skyflow/detect/ReturnEntitiesType.java new file mode 100644 index 00000000..3ba4fa79 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ReturnEntitiesType.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * Controls which detected entities are returned in the response. + */ +public enum ReturnEntitiesType { + EXCLUDE_SENSITIVE_DATA, + ALL, + NONE; +} diff --git a/common/src/main/java/com/skyflow/detect/ShiftDates.java b/common/src/main/java/com/skyflow/detect/ShiftDates.java new file mode 100644 index 00000000..fd4adc24 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ShiftDates.java @@ -0,0 +1,73 @@ +package com.skyflow.detect; + +/** + * Shifts detected dates by a random number of days within the given range. + */ +public final class ShiftDates { + private final Integer minDays; + private final Integer maxDays; + + private ShiftDates(ShiftDatesBuilder builder) { + this.minDays = builder.minDays; + this.maxDays = builder.maxDays; + } + + /** + * @return a new builder + */ + public static ShiftDatesBuilder builder() { + return new ShiftDatesBuilder(); + } + + /** + * @return Minimum number of days to shift. + */ + public Integer getMinDays() { + return minDays; + } + + /** + * @return Maximum number of days to shift. + */ + public Integer getMaxDays() { + return maxDays; + } + + @Override + public String toString() { + return "ShiftDates{" + + "minDays=" + minDays + + ", maxDays=" + maxDays + + '}'; + } + + public static final class ShiftDatesBuilder { + private Integer minDays; + private Integer maxDays; + + private ShiftDatesBuilder() { + } + + /** + * @param minDays Minimum number of days to shift. + * @return this builder + */ + public ShiftDatesBuilder minDays(Integer minDays) { + this.minDays = minDays; + return this; + } + + /** + * @param maxDays Maximum number of days to shift. + * @return this builder + */ + public ShiftDatesBuilder maxDays(Integer maxDays) { + this.maxDays = maxDays; + return this; + } + + public ShiftDates build() { + return new ShiftDates(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/Transformation.java b/common/src/main/java/com/skyflow/detect/Transformation.java new file mode 100644 index 00000000..5fb9cb69 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/Transformation.java @@ -0,0 +1,53 @@ +package com.skyflow.detect; + +/** + * Transformations applied to detected entities before they are written to the output. + */ +public final class Transformation { + private final ShiftDates shiftDates; + + private Transformation(TransformationBuilder builder) { + this.shiftDates = builder.shiftDates; + } + + /** + * @return a new builder + */ + public static TransformationBuilder builder() { + return new TransformationBuilder(); + } + + /** + * @return Date shifting configuration. + */ + public ShiftDates getShiftDates() { + return shiftDates; + } + + @Override + public String toString() { + return "Transformation{" + + "shiftDates=" + shiftDates + + '}'; + } + + public static final class TransformationBuilder { + private ShiftDates shiftDates; + + private TransformationBuilder() { + } + + /** + * @param shiftDates Date shifting configuration. + * @return this builder + */ + public TransformationBuilder shiftDates(ShiftDates shiftDates) { + this.shiftDates = shiftDates; + return this; + } + + public Transformation build() { + return new Transformation(this); + } + } +} diff --git a/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java b/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java new file mode 100644 index 00000000..4d825983 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java @@ -0,0 +1,41 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.polling.RunPoller; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + +/** + * Everything {@code deidentifyFile} does after the submit call, shared by every SDK: decide whether to + * poll, poll, merge the run into the response, and write outputs for file-based requests. Each + * controller performs the submit itself and hands the run id here. + */ +public final class DeidentifyFileFlow { + private DeidentifyFileFlow() { + } + + public static DeidentifyFileResponse complete(DeidentifyFileRequest request, String runId, RunPoller.RunFetcher fetcher) + throws SkyflowException { + return complete(request, runId, fetcher, Thread::sleep); + } + + static DeidentifyFileResponse complete(DeidentifyFileRequest request, String runId, RunPoller.RunFetcher fetcher, + RunPoller.Sleeper sleeper) throws SkyflowException { + if (request.getPollOptions() == null || runId == null) { + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.DEIDENTIFY_FILE_RUN_SUBMITTED.getLog(), String.valueOf(runId))); + return DetectResponseMapper.submittedDeidentifyFileResponse(runId); + } + GetRunResponse run = RunPoller.poll(runId, request.getPollOptions(), fetcher, sleeper); + DeidentifyFileResponse response = DetectResponseMapper.toDeidentifyFileResponse(runId, run); + if (response.getStatus() == DetectRunStatus.SUCCESS && request.getFile() != null) { + FileOutputWriter.write(response.getOutput(), response.getOutputType(), request.getFile().getName(), + request.getOutputDirectory()); + } + return response; + } +} diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java new file mode 100644 index 00000000..42ef0faf --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -0,0 +1,407 @@ +package com.skyflow.detect.internal; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; + +import com.skyflow.detect.Audio; +import com.skyflow.detect.Bleep; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CustomType; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.Document; +import com.skyflow.detect.Entity; +import com.skyflow.detect.FileMapping; +import com.skyflow.detect.Image; +import com.skyflow.detect.Media; +import com.skyflow.detect.ObjectEntity; +import com.skyflow.detect.Pdf; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ShiftDates; +import com.skyflow.detect.Transformation; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; +import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.AudioV2; +import com.skyflow.generated.detect.rest.types.AudioV2Bleep; +import com.skyflow.generated.detect.rest.types.AudioV2OutputTranscription; +import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import com.skyflow.generated.detect.rest.types.DetectCustomTypes; +import com.skyflow.generated.detect.rest.types.DetectEntity; +import com.skyflow.generated.detect.rest.types.DetectEntityDeidentificationType; +import com.skyflow.generated.detect.rest.types.DetectEntityEntityType; +import com.skyflow.generated.detect.rest.types.DetectObjectEntity; +import com.skyflow.generated.detect.rest.types.DetectObjectEntityDeidentificationType; +import com.skyflow.generated.detect.rest.types.DetectObjectEntityEntityType; +import com.skyflow.generated.detect.rest.types.DetectReturnEntities; +import com.skyflow.generated.detect.rest.types.DocumentV2; +import com.skyflow.generated.detect.rest.types.DocumentV2Pdf; +import com.skyflow.generated.detect.rest.types.DocumentV2PdfProcessingMode; +import com.skyflow.generated.detect.rest.types.EntityTransformation; +import com.skyflow.generated.detect.rest.types.ImageV2; +import com.skyflow.generated.detect.rest.types.ImageV2MaskingMethod; +import com.skyflow.generated.detect.rest.types.RedactionLevelEntityName; +import com.skyflow.generated.detect.rest.types.RedactionLevelRedactionType; +import com.skyflow.generated.detect.rest.types.TransformationShiftDates; + +/** + * Converts public SDK request models into generated V2 API requests. Internal to the SDK. + */ +public final class DetectRequestMapper { + private DetectRequestMapper() { + } + + public static DeidentifyStringRequestV2 toDeidentifyStringRequest(DeidentifyStringRequest request, String vaultId) { + DeidentifyStringRequestV2._FinalStage builder = DeidentifyStringRequestV2.builder().text(request.getText()); + if (request.getConfigurationId() != null) { + builder.configurationId(request.getConfigurationId()); + } + if (request.getConfiguration() != null) { + builder.configuration(toDetectConfig(request.getConfiguration(), vaultId)); + } + return builder.build(); + } + + /** + * Builds the submit request. For file-based requests this reads and base64-encodes the file and infers + * the format from its extension when none was given. + */ + public static DeidentifyFileRequestV2 toDeidentifyFileRequest(DeidentifyFileRequest request, String vaultId) + throws SkyflowException { + String value = request.getValue(); + FileDataFormat format = request.getDataFormat(); + File file = request.getFile(); + if (file != null) { + value = encodeFile(file); + if (format == null) { + format = inferFormat(file.getName()); + } + } + // A local file is always sent as BASE64, whatever dataSource the builder was left with. + DataSourceType dataSource = file != null ? DataSourceType.BASE64 : request.getDataSource(); + DeidentifyFileRequestV2._FinalStage builder = DeidentifyFileRequestV2.builder() + .dataSource(DeidentifyFileRequestV2DataSource.valueOf(dataSource.name())) + .value(value); + if (format != null) { + // The wire value for a file format is the lower-case extension. + builder.dataFormat(DeidentifyFileRequestV2DataFormat.valueOf(format.name().toLowerCase())); + } + if (request.getConfigurationId() != null) { + builder.configurationId(request.getConfigurationId()); + } + if (request.getConfiguration() != null) { + builder.configuration(toDetectConfig(request.getConfiguration(), vaultId)); + } + return builder.build(); + } + + static String encodeFile(File file) throws SkyflowException { + try { + return Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath())); + } catch (IOException | OutOfMemoryError e) { + LogUtil.printErrorLog(BaseUtils.parameterizedString(ErrorLogs.FAILED_TO_ENCODE_FILE_IN_DEIDENTIFY_FILE.getLog(), "detect")); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.FailedToEncodeFile.getMessage()); + } + } + + /** @return the format matching the file extension, or null when unknown so the server infers it */ + static FileDataFormat inferFormat(String fileName) { + int dot = fileName == null ? -1 : fileName.lastIndexOf('.'); + if (dot < 0 || dot == fileName.length() - 1) { + return null; + } + try { + return FileDataFormat.valueOf(fileName.substring(dot + 1).toUpperCase()); + } catch (IllegalArgumentException unknown) { + return null; + } + } + + public static ReidentifyStringRequestV2 toReidentifyStringRequest(ReidentifyStringRequest request, String vaultId) { + ReidentifyStringRequestV2._FinalStage builder = ReidentifyStringRequestV2.builder() + .vaultId(vaultId) + .text(request.getText()); + if (request.getRedactionLevel() != null) { + builder.redactionLevel(toRedactionLevels(request.getRedactionLevel())); + } + return builder.build(); + } + + public static DetectGuardrailsRequestV2 toCheckGuardrailsRequest(CheckGuardrailsRequest request, String vaultId) { + DetectGuardrailsRequestV2._FinalStage builder = DetectGuardrailsRequestV2.builder() + .text(request.getText()) + .vaultId(vaultId); + if (request.getCheckToxicity() != null) { + builder.checkToxicity(request.getCheckToxicity()); + } + if (request.getDenyTopics() != null) { + builder.denyTopics(request.getDenyTopics()); + } + return builder.build(); + } + + public static DetectConfigV2 toDetectConfig(DetectConfiguration configuration, String vaultId) { + DetectConfigV2._FinalStage builder = DetectConfigV2.builder().vaultId(vaultId); + if (configuration.getName() != null) { + builder.name(configuration.getName()); + } + if (configuration.getDescription() != null) { + builder.description(configuration.getDescription()); + } + if (configuration.getDetect() != null) { + builder.detect(toDetect(configuration.getDetect())); + } + if (configuration.getFileMapping() != null) { + builder.fileMapping(toFileMappings(configuration.getFileMapping())); + } + if (configuration.getMedia() != null) { + builder.media(toMedia(configuration.getMedia())); + } + return builder.build(); + } + + static com.skyflow.generated.detect.rest.types.Detect toDetect(Detect detect) { + com.skyflow.generated.detect.rest.types.Detect.Builder builder = + com.skyflow.generated.detect.rest.types.Detect.builder(); + if (detect.getEntities() != null) { + List entities = new ArrayList<>(); + for (Entity entity : detect.getEntities()) { + if (entity != null) { + entities.add(toEntity(entity)); + } + } + builder.entities(entities); + } + if (detect.getObjectEntities() != null) { + List objectEntities = new ArrayList<>(); + for (ObjectEntity objectEntity : detect.getObjectEntities()) { + if (objectEntity != null) { + objectEntities.add(toObjectEntity(objectEntity)); + } + } + builder.objectEntities(objectEntities); + } + if (detect.getRestrict() != null) { + builder.restrict(detect.getRestrict()); + } + if (detect.getSkip() != null) { + builder.skip(detect.getSkip()); + } + if (detect.getCustomTypes() != null) { + List customTypes = new ArrayList<>(); + for (CustomType customType : detect.getCustomTypes()) { + if (customType != null) { + customTypes.add(toCustomType(customType)); + } + } + builder.customTypes(customTypes); + } + if (detect.getReturnEntities() != null) { + builder.returnEntities(DetectReturnEntities.valueOf(detect.getReturnEntities().name())); + } + return builder.build(); + } + + static DetectEntity toEntity(Entity entity) { + DetectEntity.Builder builder = DetectEntity.builder(); + if (entity.getEntityType() != null) { + builder.entityType(DetectEntityEntityType.valueOf(entity.getEntityType().name())); + } + if (entity.getDeidentificationType() != null) { + builder.deidentificationType(DetectEntityDeidentificationType.valueOf(entity.getDeidentificationType().name())); + } + if (entity.getDestination() != null) { + builder.destination(entity.getDestination()); + } + if (entity.getTransformation() != null) { + builder.transformation(toTransformation(entity.getTransformation())); + } + return builder.build(); + } + + static EntityTransformation toTransformation(Transformation transformation) { + EntityTransformation.Builder builder = EntityTransformation.builder(); + ShiftDates shiftDates = transformation.getShiftDates(); + if (shiftDates != null) { + TransformationShiftDates.Builder shift = TransformationShiftDates.builder(); + if (shiftDates.getMinDays() != null) { + shift.minDays(shiftDates.getMinDays()); + } + if (shiftDates.getMaxDays() != null) { + shift.maxDays(shiftDates.getMaxDays()); + } + builder.shiftDates(shift.build()); + } + return builder.build(); + } + + static DetectCustomTypes toCustomType(CustomType customType) { + DetectCustomTypes.Builder builder = DetectCustomTypes.builder(); + if (customType.getLabel() != null) { + builder.label(customType.getLabel()); + } + if (customType.getMatch() != null) { + builder.match(customType.getMatch()); + } + return builder.build(); + } + + static DetectObjectEntity toObjectEntity(ObjectEntity objectEntity) { + DetectObjectEntity.Builder builder = DetectObjectEntity.builder(); + if (objectEntity.getEntityType() != null) { + builder.entityType(DetectObjectEntityEntityType.valueOf(objectEntity.getEntityType().name())); + } + if (objectEntity.getDeidentificationType() != null) { + builder.deidentificationType( + DetectObjectEntityDeidentificationType.valueOf(objectEntity.getDeidentificationType().name())); + } + return builder.build(); + } + + static List toFileMappings(List fileMappings) { + List result = new ArrayList<>(); + for (FileMapping mapping : fileMappings) { + if (mapping == null) { + continue; + } + com.skyflow.generated.detect.rest.types.FileMapping.Builder builder = + com.skyflow.generated.detect.rest.types.FileMapping.builder(); + if (mapping.getSource() != null) { + builder.source(mapping.getSource()); + } + if (mapping.getDestination() != null) { + builder.destination(mapping.getDestination()); + } + if (mapping.getOutputFileNameSuffix() != null) { + builder.outputFileNameSuffix(mapping.getOutputFileNameSuffix()); + } + if (mapping.getEntitiesDestination() != null) { + builder.entitiesDestination(mapping.getEntitiesDestination()); + } + if (mapping.getObjectEntitiesDestination() != null) { + builder.objectEntitiesDestination(mapping.getObjectEntitiesDestination()); + } + result.add(builder.build()); + } + return result; + } + + static com.skyflow.generated.detect.rest.types.Media toMedia(Media media) { + com.skyflow.generated.detect.rest.types.Media.Builder builder = + com.skyflow.generated.detect.rest.types.Media.builder(); + if (media.getAudio() != null) { + builder.audio(toAudio(media.getAudio())); + } + if (media.getDocument() != null) { + builder.document(toDocument(media.getDocument())); + } + if (media.getImage() != null) { + builder.image(toImage(media.getImage())); + } + return builder.build(); + } + + static AudioV2 toAudio(Audio audio) { + AudioV2.Builder builder = AudioV2.builder(); + if (audio.getOutputProcessedAudio() != null) { + builder.outputProcessedAudio(audio.getOutputProcessedAudio()); + } + if (audio.getOutputTranscription() != null) { + builder.outputTranscription(AudioV2OutputTranscription.valueOf(audio.getOutputTranscription().name())); + } + Bleep bleep = audio.getBleep(); + if (bleep != null) { + AudioV2Bleep.Builder bleepBuilder = AudioV2Bleep.builder(); + if (bleep.getStartPadding() != null) { + bleepBuilder.startPadding(bleep.getStartPadding()); + } + if (bleep.getStopPadding() != null) { + bleepBuilder.stopPadding(bleep.getStopPadding()); + } + if (bleep.getFrequency() != null) { + bleepBuilder.frequency(bleep.getFrequency()); + } + if (bleep.getGain() != null) { + bleepBuilder.gain(bleep.getGain()); + } + builder.bleep(bleepBuilder.build()); + } + return builder.build(); + } + + static DocumentV2 toDocument(Document document) { + DocumentV2.Builder builder = DocumentV2.builder(); + Pdf pdf = document.getPdf(); + if (pdf != null) { + DocumentV2Pdf.Builder pdfBuilder = DocumentV2Pdf.builder(); + if (pdf.getProcessingMode() != null) { + pdfBuilder.processingMode(DocumentV2PdfProcessingMode.valueOf(pdf.getProcessingMode().name())); + } + if (pdf.getDensity() != null) { + pdfBuilder.density(pdf.getDensity()); + } + if (pdf.getMaxResolution() != null) { + pdfBuilder.maxResolution(pdf.getMaxResolution()); + } + builder.pdf(pdfBuilder.build()); + } + return builder.build(); + } + + static ImageV2 toImage(Image image) { + ImageV2.Builder builder = ImageV2.builder(); + if (image.getOutputProcessedImage() != null) { + builder.outputProcessedImage(image.getOutputProcessedImage()); + } + if (image.getOutputOcrText() != null) { + builder.outputOcrText(image.getOutputOcrText()); + } + if (image.getMaskingMethod() != null) { + builder.maskingMethod(ImageV2MaskingMethod.valueOf(image.getMaskingMethod().name())); + } + return builder.build(); + } + + public static List toRedactionLevels(List levels) { + List result = new ArrayList<>(); + for (RedactionLevel level : levels) { + if (level == null) { + continue; + } + com.skyflow.generated.detect.rest.types.RedactionLevel.Builder builder = + com.skyflow.generated.detect.rest.types.RedactionLevel.builder(); + if (level.getEntityName() != null) { + builder.entityName(RedactionLevelEntityName.valueOf(level.getEntityName().name())); + } + if (level.getRedactionType() != null) { + builder.redactionType(RedactionLevelRedactionType.valueOf(level.getRedactionType().name())); + } + if (level.getTokenGroupName() != null) { + builder.tokenGroupName(level.getTokenGroupName()); + } + if (level.getRedactionPattern() != null) { + builder.redactionPattern(level.getRedactionPattern()); + } + result.add(builder.build()); + } + return result; + } +} diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java new file mode 100644 index 00000000..f4d2484b --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java @@ -0,0 +1,145 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.DetectedEntity; +import com.skyflow.detect.EntityLocation; +import com.skyflow.detect.Metrics; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2DetectedEntity; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2EntityLocation; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Converts generated V2 API responses into public SDK response models. Internal to the SDK. + */ +public final class DetectResponseMapper { + private DetectResponseMapper() { + } + + public static DeidentifyStringResponse toDeidentifyStringResponse(DeidentifyStringResponseV2 response) { + List entities = new ArrayList<>(); + List apiEntities = response.getEntities().orElse(null); + if (apiEntities != null) { + for (DeidentifyStringResponseV2DetectedEntity apiEntity : apiEntities) { + if (apiEntity != null) { + entities.add(toDetectedEntity(apiEntity)); + } + } + } + return new DeidentifyStringResponse( + response.getProcessedText().orElse(null), + Collections.unmodifiableList(entities), + response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null)); + } + + public static ReidentifyStringResponse toReidentifyStringResponse(ReidentifyStringResponseV2 response) { + return new ReidentifyStringResponse( + response.getProcessedText().orElse(null), + response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null)); + } + + static DetectedEntity toDetectedEntity(DeidentifyStringResponseV2DetectedEntity apiEntity) { + Map scores = apiEntity.getEntityScores().orElse(null); + return new DetectedEntity( + apiEntity.getToken().orElse(null), + apiEntity.getValue().orElse(null), + apiEntity.getLocation().map(DetectResponseMapper::toEntityLocation).orElse(null), + apiEntity.getEntityType().orElse(null), + scores == null ? Collections.emptyMap() : Collections.unmodifiableMap(scores)); + } + + static EntityLocation toEntityLocation(DeidentifyStringResponseV2EntityLocation location) { + return new EntityLocation( + location.getStartIndex().orElse(null), + location.getEndIndex().orElse(null), + location.getStartIndexProcessed().orElse(null), + location.getEndIndexProcessed().orElse(null)); + } + + public static CheckGuardrailsResponse toCheckGuardrailsResponse(DetectGuardrailsResponseV2 response) { + return new CheckGuardrailsResponse( + response.getText(), + enumOrDefault(GuardrailsValidation.class, + response.getValidation() == null ? null : response.getValidation().toString(), GuardrailsValidation.UNKNOWN), + response.getToxic().orElse(null), + response.getDeniedTopic().orElse(null)); + } + + public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 response) { + List outputs = new ArrayList<>(); + List apiOutputs = response.getOutput().orElse(null); + if (apiOutputs != null) { + for (com.skyflow.generated.detect.rest.types.FileOutput apiOutput : apiOutputs) { + if (apiOutput != null) { + outputs.add(toFileOutput(apiOutput)); + } + } + } + return new GetRunResponse( + runId, + response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) + .orElse(DetectRunStatus.UNKNOWN), + response.getOutputType().map(t -> enumOrDefault(DataSourceType.class, t.toString(), null)).orElse(null), + Collections.unmodifiableList(outputs), + response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null), + response.getMessage().orElse(null)); + } + + /** Response for a submit-only call: run id and nothing else. */ + public static DeidentifyFileResponse submittedDeidentifyFileResponse(String runId) { + return new DeidentifyFileResponse(runId, null, null, Collections.emptyList(), null, null); + } + + /** Merges the submit's run id with the polled run. */ + public static DeidentifyFileResponse toDeidentifyFileResponse(String runId, GetRunResponse run) { + return new DeidentifyFileResponse(runId, run.getStatus(), run.getOutputType(), run.getOutput(), + run.getMetrics(), run.getMessage()); + } + + public static FileOutput toFileOutput(com.skyflow.generated.detect.rest.types.FileOutput apiOutput) { + return new FileOutput( + apiOutput.getProcessedFile().orElse(null), + apiOutput.getProcessedFileType().map(Object::toString).orElse(null), + apiOutput.getProcessedFileExtension() + .map(e -> enumOrDefault(FileDataFormat.class, e.toString().toUpperCase(), null)) + .orElse(null)); + } + + /** Maps a wire value onto a public enum, tolerating values this SDK version does not know. */ + static > E enumOrDefault(Class type, String value, E fallback) { + if (value == null) { + return fallback; + } + try { + return Enum.valueOf(type, value); + } catch (IllegalArgumentException unknown) { + return fallback; + } + } + + public static Metrics toMetrics(com.skyflow.generated.detect.rest.types.Metrics metrics) { + return new Metrics( + metrics.getSize().orElse(null), + metrics.getWordCount().orElse(null), + metrics.getCharacterCount().orElse(null), + metrics.getSlides().orElse(null), + metrics.getPages().orElse(null), + metrics.getDuration().orElse(null)); + } +} diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java new file mode 100644 index 00000000..6836dcff --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java @@ -0,0 +1,114 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.PollOptions; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + + +/** + * Client-side validation for Detect V2 requests. Internal to the SDK. + */ +public final class DetectValidations { + static final String INTERFACE_NAME = "detect"; + + private DetectValidations() { + } + + public static void validateDeidentifyStringRequest(DeidentifyStringRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.DEIDENTIFY_STRING_REQUEST_NULL, BaseErrorMessage.DeidentifyStringRequestNull); + } + if (isBlank(request.getText())) { + throw invalid(ErrorLogs.INVALID_TEXT_IN_DEIDENTIFY_STRING, BaseErrorMessage.InvalidTextInDeidentifyString); + } + // configurationId and configuration are both optional on the API and are passed through as given. + } + + public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.DEIDENTIFY_FILE_REQUEST_NULL, BaseErrorMessage.DeidentifyFileRequestNull); + } + if (request.getFile() != null) { + if (!isBlank(request.getValue())) { + throw invalid(ErrorLogs.MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE, BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + } + if (!request.getFile().isFile()) { + throw invalid(ErrorLogs.FILE_NOT_FOUND_IN_DEIDENTIFY_FILE, BaseErrorMessage.FileNotFoundToDeidentify); + } + } else { + if (request.getDataSource() == null) { + throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_DEIDENTIFY_FILE, BaseErrorMessage.InvalidDataSourceInDeidentifyFile); + } + if (isBlank(request.getValue())) { + throw invalid(ErrorLogs.INVALID_VALUE_IN_DEIDENTIFY_FILE, BaseErrorMessage.InvalidValueInDeidentifyFile); + } + } + // configurationId and configuration are both optional on the API and are passed through as given. + validatePollOptions(request.getPollOptions()); + if (request.getPollOptions() == null && !isBlank(request.getOutputDirectory())) { + throw invalid(ErrorLogs.OUTPUT_DIRECTORY_WITHOUT_POLL_OPTIONS, BaseErrorMessage.OutputDirectoryWithoutPollOptions); + } + } + + static void validatePollOptions(PollOptions options) throws SkyflowException { + if (options == null) { + return; + } + Integer waitTime = options.getWaitTime(); + if (waitTime != null && (waitTime < 1 || waitTime > PollOptions.MAX_WAIT_TIME_SECONDS)) { + throw invalid(ErrorLogs.INVALID_WAIT_TIME_IN_POLL_OPTIONS, BaseErrorMessage.InvalidWaitTimeInPollOptions); + } + Integer maxAttempts = options.getMaxAttempts(); + if (maxAttempts != null && (maxAttempts < 1 || maxAttempts > PollOptions.MAX_MAX_ATTEMPTS)) { + throw invalid(ErrorLogs.INVALID_MAX_ATTEMPTS_IN_POLL_OPTIONS, BaseErrorMessage.InvalidMaxAttemptsInPollOptions); + } + } + + public static void validateReidentifyStringRequest(ReidentifyStringRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.REIDENTIFY_STRING_REQUEST_NULL, BaseErrorMessage.ReidentifyStringRequestNull); + } + if (isBlank(request.getText())) { + throw invalid(ErrorLogs.INVALID_TEXT_IN_REIDENTIFY_STRING, BaseErrorMessage.InvalidTextInReidentifyString); + } + // redactionLevel entries are optional on the API and are passed through as given. + } + + public static void validateGetRunRequest(GetRunRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.GET_RUN_REQUEST_NULL, BaseErrorMessage.GetRunRequestNull); + } + if (isBlank(request.getRunId())) { + throw invalid(ErrorLogs.INVALID_RUN_ID_IN_GET_RUN, BaseErrorMessage.InvalidRunIdInGetRun); + } + } + + public static void validateCheckGuardrailsRequest(CheckGuardrailsRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.CHECK_GUARDRAILS_REQUEST_NULL, BaseErrorMessage.CheckGuardrailsRequestNull); + } + if (isBlank(request.getText())) { + throw invalid(ErrorLogs.INVALID_TEXT_IN_CHECK_GUARDRAILS, BaseErrorMessage.InvalidTextInCheckGuardrails); + } + // checkToxicity and denyTopics are optional on the API and are passed through as given. + } + + + static boolean isBlank(String value) { + return value == null || value.trim().isEmpty(); + } + + private static SkyflowException invalid(ErrorLogs log, BaseErrorMessage message) { + LogUtil.printErrorLog(BaseUtils.parameterizedString(log.getLog(), INTERFACE_NAME)); + return new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), message.getMessage()); + } +} diff --git a/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java new file mode 100644 index 00000000..f82f0957 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java @@ -0,0 +1,118 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.FileOutput; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Base64; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Writes the base64 outputs of a successful file run next to, or into a chosen directory for, the + * local file that was submitted. Internal to the SDK. + * + *

Each output becomes {@code processed-.}. Entity outputs carry their + * type in the name so they never collide with a processed file of the same extension: ENTITIES + * becomes {@code processed-entities-.json} and OBJECT_ENTITIES becomes + * {@code processed-object-entities-.json}. If two outputs would still share a name + * the file type is added before the extension. Presigned-URL outputs are not fetched and nothing + * is written for them. + */ +public final class FileOutputWriter { + private static final String ENTITIES_TYPE = "ENTITIES"; + + private FileOutputWriter() { + } + + /** + * @return the files written, in output order; empty when the output type is not BASE64 + * @throws SkyflowException if the directory cannot be created or a file cannot be decoded or written + */ + public static List write(List outputs, DataSourceType outputType, String inputFileName, + String outputDirectory) throws SkyflowException { + List written = new ArrayList<>(); + if (outputs == null || outputs.isEmpty()) { + return written; + } + if (outputType != DataSourceType.BASE64) { + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.OUTPUT_NOT_WRITTEN_FOR_OUTPUT_TYPE.getLog(), + String.valueOf(outputType))); + return written; + } + File directory = outputDirectory == null || outputDirectory.trim().isEmpty() ? null : new File(outputDirectory); + if (directory != null && !directory.isDirectory() && !directory.mkdirs()) { + throw writeFailure(ErrorLogs.OUTPUT_DIRECTORY_NOT_CREATED, directory.getPath(), null); + } + String base = stripExtension(inputFileName); + Set used = new HashSet<>(); + for (FileOutput output : outputs) { + if (output == null || output.getProcessedFile() == null) { + continue; + } + String name = fileName(base, output, used); + File target = directory == null ? new File(name) : new File(directory, name); + try { + byte[] bytes = Base64.getDecoder().decode(output.getProcessedFile()); + Files.write(target.toPath(), bytes); + } catch (IllegalArgumentException | IOException e) { + throw writeFailure(ErrorLogs.OUTPUT_FILE_NOT_WRITTEN, target.getPath(), e); + } + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.OUTPUT_FILE_WRITTEN.getLog(), target.getPath())); + written.add(target); + } + return written; + } + + /** + * @param base the input file name without its extension + * @return {@code processed-.}, or {@code processed--.json} for entity outputs + */ + static String fileName(String base, FileOutput output, Set used) { + String type = output.getProcessedFileType() == null ? "" : output.getProcessedFileType(); + boolean entities = type.toUpperCase().contains(ENTITIES_TYPE); + String extension; + if (output.getProcessedFileExtension() != null) { + extension = output.getProcessedFileExtension().name().toLowerCase(); + } else if (entities) { + extension = "json"; + } else { + extension = "bin"; + } + // ENTITIES -> processed-entities-, OBJECT_ENTITIES -> processed-object-entities- + String stem = entities + ? BaseConstants.PROCESSED_FILE_NAME_PREFIX + type.toLowerCase().replace('_', '-') + "-" + base + : BaseConstants.PROCESSED_FILE_NAME_PREFIX + base; + String name = stem + "." + extension; + if (!used.add(name)) { + name = stem + "." + (type.isEmpty() ? String.valueOf(used.size()) : type.toLowerCase()) + "." + extension; + used.add(name); + } + return name; + } + + static String stripExtension(String fileName) { + if (fileName == null || fileName.isEmpty()) { + return "output"; + } + int dot = fileName.lastIndexOf('.'); + return dot > 0 ? fileName.substring(0, dot) : fileName; + } + + private static SkyflowException writeFailure(ErrorLogs log, String path, Exception cause) { + LogUtil.printErrorLog(BaseUtils.parameterizedString(log.getLog(), path)); + String message = BaseUtils.parameterizedString(BaseErrorMessage.FailedToWriteOutputFile.getMessage(), path); + return cause == null ? new SkyflowException(message) : new SkyflowException(message, cause); + } +} diff --git a/common/src/main/java/com/skyflow/detect/polling/RunPoller.java b/common/src/main/java/com/skyflow/detect/polling/RunPoller.java new file mode 100644 index 00000000..4aff5a31 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/polling/RunPoller.java @@ -0,0 +1,99 @@ +package com.skyflow.detect.polling; + +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.PollOptions; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + +import java.util.Collections; + +/** + * Polls a Detect file run until it reaches a terminal status or the {@link PollOptions} budget is used + * up. Shared by every SDK: the caller supplies how a run is fetched, so each controller plugs in its + * own {@code getRun}. + * + *

Backoff is exponential, 1, 2, 4, 8, 16 then 32 seconds between lookups, with the last sleep + * trimmed so the total never exceeds {@code waitTime}. The first lookup happens immediately after the + * submit. SUCCESS, FAILED and UNKNOWN are terminal; every other status keeps polling. + */ +public final class RunPoller { + /** Longest single pause between two lookups, in seconds. */ + public static final long MAX_DELAY_SECONDS = 32L; + + /** Fetches the current state of a run. */ + public interface RunFetcher { + GetRunResponse fetch(String runId) throws SkyflowException; + } + + /** Pauses the calling thread. Replaceable in tests. */ + public interface Sleeper { + void sleep(long millis) throws InterruptedException; + } + + private RunPoller() { + } + + /** + * Polls on the calling thread. + * + * @param runId run to poll + * @param options wait time and attempt limit, defaults applied + * @param fetcher how to look the run up + * @return the terminal run, or the last non-terminal run seen when the budget ran out or the thread was interrupted + * @throws SkyflowException if a lookup fails + */ + public static GetRunResponse poll(String runId, PollOptions options, RunFetcher fetcher) throws SkyflowException { + return poll(runId, options, fetcher, Thread::sleep); + } + + public static GetRunResponse poll(String runId, PollOptions options, RunFetcher fetcher, Sleeper sleeper) + throws SkyflowException { + int waitTime = options.effectiveWaitTime(); + int maxAttempts = options.effectiveMaxAttempts(); + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.POLL_RUN_STARTED.getLog(), runId, + String.valueOf(waitTime), String.valueOf(maxAttempts))); + + long elapsedSeconds = 0; + long delaySeconds = 1; + int attempts = 0; + while (true) { + GetRunResponse run = fetcher.fetch(runId); + attempts++; + if (run == null || run.getStatus() == null) { + // A fetcher that reports nothing is treated as an unknown, terminal state. + run = new GetRunResponse(runId, DetectRunStatus.UNKNOWN, null, Collections.emptyList(), null, null); + } + switch (run.getStatus()) { + case SUCCESS: + case FAILED: + case UNKNOWN: + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.POLL_RUN_TERMINAL.getLog(), runId, + run.getStatus().name(), String.valueOf(attempts))); + return run; + default: + // QUEUED, IN_PROGRESS: keep polling while the budget allows. + break; + } + if (attempts >= maxAttempts || elapsedSeconds >= waitTime) { + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.POLL_RUN_BUDGET_EXHAUSTED.getLog(), runId, + run.getStatus().name(), String.valueOf(attempts), String.valueOf(elapsedSeconds))); + return run; + } + long sleepSeconds = Math.min(delaySeconds, waitTime - elapsedSeconds); + try { + sleeper.sleep(sleepSeconds * 1000L); + } catch (InterruptedException interrupted) { + Thread.currentThread().interrupt(); + LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.POLL_RUN_INTERRUPTED.getLog(), runId, + run.getStatus().name())); + return run; + } + elapsedSeconds += sleepSeconds; + delaySeconds = Math.min(delaySeconds * 2, MAX_DELAY_SECONDS); + } + } +} diff --git a/common/src/main/java/com/skyflow/errors/ErrorMessage.java b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java similarity index 72% rename from common/src/main/java/com/skyflow/errors/ErrorMessage.java rename to common/src/main/java/com/skyflow/errors/BaseErrorMessage.java index 1e408cca..d3c9c388 100644 --- a/common/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java @@ -2,7 +2,12 @@ import com.skyflow.utils.SdkVersion; -public enum ErrorMessage { +/** + * Validation and client-side error messages shared by every SDK. Named {@code BaseErrorMessage} + * rather than {@code ErrorMessage} so it can never be shadowed by a module's own + * {@code com.skyflow.errors.ErrorMessage}: code in common must reference this enum. + */ +public enum BaseErrorMessage { // Client initialization VaultIdAlreadyInConfigList("%s0 Validation error. VaultId is present in an existing config. Specify a new vaultId in config."), VaultIdNotInConfigList("%s0 Validation error. VaultId is missing from the config. Specify the vaultIds from configs."), @@ -12,18 +17,11 @@ public enum ErrorMessage { ConnectionIdNotInConfigList("%s0 Validation error. ConnectionId is missing from the config. Specify the connectionIds from configs."), EmptyCredentials("%s0 Validation error. Invalid credentials. Credentials must not be empty."), NullCredentials("%s0 Validation error. Credentials object is null. Specify a valid Credentials object."), - TableSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name cannot be specified at both the request and record levels. Please specify the table name in only one place."), - UpsertTableRequestAtRecordLevel("%s0 Validation error. Table name should be present at each record level when upsert is present at record level."), - UpsertTableRequestAtRequestLevel("%s0 Validation error. Upsert should be present at each record level when table name is present at record level."), - TableNotSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name is missing. Table name should be specified at one place either at the request level or record level. Please specify the table name at one place."), // Vault config InvalidVaultId("%s0 Initialization failed. Invalid vault ID. Specify a valid vault ID."), EmptyVaultId("%s0 Initialization failed. Invalid vault ID. Vault ID must not be empty."), InvalidClusterId("%s0 Initialization failed. Invalid cluster ID. Specify cluster ID."), EmptyClusterId("%s0 Initialization failed. Invalid cluster ID. Specify a valid cluster ID."), - EmptyVaultUrl("%s0 Initialization failed. Vault URL is empty. Specify a valid vault URL."), - InvalidVaultUrlFormat("%s0 Initialization failed. Vault URL must start with 'https://'."), - EitherVaultUrlOrClusterIdRequired("%s0 Initialization failed. Specify either 'clusterId' or 'vaultURL'."), // Connection config InvalidConnectionId("%s0 Initialization failed. Invalid connection ID. Specify a valid connection ID."), @@ -69,20 +67,11 @@ public enum ErrorMessage { TableKeyError("%s0 Validation error. 'table' key is missing from the payload. Specify a 'table' key."), EmptyTable("%s0 Validation error. 'table' can't be empty. Specify a table."), ValuesKeyError("%s0 Validation error. 'values' key is missing from the payload. Specify a 'values' key."), - EmptyRecords("%s0 Validation error. 'records' can't be empty. Specify records."), - EmptyKeyInRecords("%s0 Validation error. Invalid key in data in records. Specify a valid key."), - EmptyValueInRecords("%s0 Validation error. Invalid value in records. Specify a valid value."), - RecordsKeyError("%s0 Validation error. 'records' key is missing from the payload. Specify a 'records' key."), - EmptyValues("%s0 Validation error. 'values' can't be empty. Specify values."), EmptyKeyInValues("%s0 Validation error. Invalid key in values. Specify a valid key."), - EmptyValueInValues("%s0 Validation error. Invalid value in values. Specify a valid value."), TokensKeyError("%s0 Validation error. 'tokens' key is missing from the payload. Specify a 'tokens' key."), EmptyTokens("%s0 Validation error. The 'tokens' field is empty. Specify tokens for one or more fields."), EmptyKeyInTokens("%s0 Validation error. Invalid key tokens. Specify a valid key."), - EmptyValueInTokens("%s0 Validation error. Invalid value in tokens. Specify a valid value."), EmptyUpsert("%s0 Validation error. 'upsert' key can't be empty. Specify an upsert column."), - InvalidUpsertUpdateType("%s0 Validation error. Invalid upsert updateType. Specify either 'UPDATE' or 'REPLACE'."), - EmptyUpsertValues("%s0 Validation error. Upsert column values can't be empty. Specify at least one upsert column."), HomogenousNotSupportedWithUpsert("%s0 Validation error. 'homogenous' is not supported with 'upsert'. Specify either 'homogenous' or 'upsert'."), TokensPassedForTokenModeDisable("%s0 Validation error. 'tokenMode' wasn't specified. Set 'tokenMode' to 'ENABLE' to insert tokens."), NoTokensWithTokenMode("%s0 Validation error. Tokens weren't specified for records while 'tokenMode' was %s1. Specify tokens."), @@ -90,22 +79,15 @@ public enum ErrorMessage { InsufficientTokensPassedForTokenModeEnableStrict("%s0 Validation error. 'tokenMode' is set to 'ENABLE_STRICT', but some fields are missing tokens. Specify tokens for all fields."), BatchInsertPartialSuccess("%s0 Insert operation completed with partial success."), BatchInsertFailure("%s0 Insert operation failed."), - RecordSizeExceedError("%s0 Maximum number of records exceeded. The limit is 100000."), // Detokenize InvalidDetokenizeData("%s0 Validation error. Invalid detokenize data. Specify valid detokenize data."), EmptyDetokenizeData("%s0 Validation error. Invalid data tokens. Specify at least one data token."), EmptyTokenInDetokenizeData("%s0 Validation error. Invalid data tokens. Specify a valid data token."), - TokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 100000."), // Delete DeleteRequestNull("%s0 Validation error. DeleteRequest object is null. Specify a valid DeleteRequest object."), - // Delete Tokens - DeleteTokensRequestNull("%s0 Validation error. DeleteTokensRequest object is null. Specify a valid DeleteTokensRequest object."), - EmptyDeleteTokensData("%s0 Validation error. Tokens list is empty. Specify at least one token to delete."), - EmptyTokenInDeleteTokensData("%s0 Validation error. Invalid token in delete tokens request. Specify a valid token."), - DeleteTokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 100000."), // Get GetRequestNull("%s0 Validation error. GetRequest object is null. Specify a valid GetRequest object."), @@ -126,15 +108,6 @@ public enum ErrorMessage { ColumnValuesKeyErrorGet("%s0 Validation error. 'columnValues' aren't specified whereas 'columnName' is specified. Either add 'columnValues' or remove 'columnName'."), EmptyColumnValues("%s0 Validation error. 'columnValues' can't be empty. Specify at least one column value"), EmptyValueInColumnValues("%s0 Validation error. Invalid value in column values. Specify a valid column value."), - IdsOrUniqueValuesKeyError("%s0 Validation error. 'ids' or 'uniqueValues' key is missing from the payload. Specify ids or uniqueValues in payload."), - BothIdsAndUniqueValuesSpecified("%s0 Validation error. Both Skyflow IDs and unique values can't be specified. Either specify Skyflow IDs or unique values."), - EmptyUniqueValues("%s0 Validation error. 'uniqueValues' can't be empty. Specify at least one unique value."), - EmptyUniqueValueInUniqueValues("%s0 Validation error. Invalid unique value in 'uniqueValues'. Specify a valid unique value."), - NullColumnRedactions("%s0 Validation error. Column redaction object can not be null. Specify a valid column redaction object."), - NullColumnNameInColumnRedaction("%s0 Validation error. Column name can not be null or empty in column redaction. Specify a valid column name."), - NullRedactionInColumnRedaction("%s0 Validation error. Redaction can not be null or empty in column redaction. Specify a valid redaction."), - BothSingleTableFieldsAndRecordsSpecified("%s0 Validation error. Both single-table lookup fields ('table', 'ids', 'fields', 'uniqueValues', 'columnRedactions') and 'records' can't be specified. Either specify single-table fields or 'records'."), - NullGetRecordRequest("%s0 Validation error. Record in 'records' is null. Specify a valid record."), TokenKeyError("%s0 Validation error. 'token' key is missing from the payload. Specify a 'token' key."), PartialSuccess("%s0 Validation error. Check 'SkyflowError.data' for details."), @@ -146,9 +119,6 @@ public enum ErrorMessage { InvalidSkyflowIdType("%s0 Validation error. Invalid type for 'skyflow_id' in data payload. Specify 'skyflow_id' as a string."), EmptySkyflowId("%s0 Validation error. 'skyflow_id' can't be empty. Specify a skyflow id."), UpdateRequestNull("%s0 Validation error. UpdateRequest object is null. Specify a valid UpdateRequest object."), - UpdateRecordNull("%s0 Validation error. UpdateRequestRecord object in the list is null. Specify a valid UpdateRequestRecord object."), - RecordSkyflowIdKeyError("%s0 Validation error. 'skyflowId' key is missing from the record. Specify a 'skyflowId' key."), - EmptySkyflowIdInRecord("%s0 Validation error. 'skyflowId' can't be empty in the record. Specify a valid skyflow ID."), // Query QueryRequestNull("%s0 Validation error. QueryRequest object is null. Specify a valid QueryRequest object."), @@ -159,15 +129,6 @@ public enum ErrorMessage { ColumnValuesKeyErrorTokenize("%s0 Validation error. 'columnValues' key is missing from the payload. Specify a 'columnValues' key."), EmptyColumnGroupInColumnValue("%s0 Validation error. Invalid column group in column value. Specify a valid column group."), TokenizeRequestNull("%s0 Validation error. TokenizeRequest object is null. Specify a valid TokenizeRequest object."), - EmptyTokenizeData("%s0 Validation error. Tokenize data is empty. Specify at least one tokenize record."), - TokenizeRecordNull("%s0 Validation error. TokenizeRecord in the list is null. Specify a valid TokenizeRecord object."), - InvalidBulkTokenizeRecordType("%s0 Validation error. Record in the list must be of type BulkTokenizeRequestRecord. Specify a valid BulkTokenizeRequestRecord object."), - EmptyValueInTokenizeRecord("%s0 Validation error. Value in TokenizeRecord is null or empty. Specify a valid value."), - EmptyTokenGroupNamesInTokenizeRecord("%s0 Validation error. TokenGroupNames in TokenizeRecord is null or empty. Specify at least one token group name."), - EmptyTokenGroupNameInTokenizeRecord("%s0 Validation error. Token group name in TokenizeRecord is null or empty. Specify a valid token group name."), - TokenizeDataSizeExceedError("%s0 Maximum number of tokenize records exceeded. The limit is 100000."), - MissingIndexInBulkTokenizeRecord("%s0 Validation error. Index in BulkTokenizeRequestRecord is null. Specify an index for every record."), - DuplicateIndexInBulkTokenizeRecord("%s0 Validation error. Duplicate index in BulkTokenizeRequestRecord. Specify a unique index for every record."), // Connection InvalidRequestHeaders("%s0 Validation error. Request headers aren't valid. Specify valid request headers."), @@ -215,17 +176,30 @@ public enum ErrorMessage { DetokenizeRequestNull("%s0 Validation error. DetokenizeRequest object is null. Specify a valid DetokenizeRequest object."), - NullTokenGroupRedactions("%s0 Validation error. TokenGroupRedaction in the list is null. Specify a valid TokenGroupRedactions object."), - NullRedactionInTokenGroup("%s0 Validation error. Redaction in TokenGroupRedactions is null or empty. Specify a valid redaction."), - NullTokenGroupNameInTokenGroup("%s0 Validation error. TokenGroupName in TokenGroupRedactions is null or empty. Specify a valid tokenGroupName."), - InvalidRecord("%s0 Validation error. InsertRecord object in the list is invalid. Specify a valid InsertRecord object."), + // Detect + DeidentifyStringRequestNull("%s0 Validation error. DeidentifyString request cannot be null."), + InvalidTextInDeidentifyString("%s0 Validation error. Invalid text in deidentify string request. Specify a non-empty text."), + ReidentifyStringRequestNull("%s0 Validation error. ReidentifyString request cannot be null."), + InvalidTextInReidentifyString("%s0 Validation error. Invalid text in reidentify string request. Specify a non-empty text."), + DeidentifyFileRequestNull("%s0 Validation error. DeidentifyFile request cannot be null."), + InvalidDataSourceInDeidentifyFile("%s0 Validation error. Invalid dataSource in deidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL, or supply a file."), + InvalidValueInDeidentifyFile("%s0 Validation error. Invalid value in deidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file, or supply a file."), + MultipleFileSourcesInDeidentifyFile("%s0 Validation error. Specify either value or file in deidentify file request, not both."), + InvalidWaitTimeInPollOptions("%s0 Validation error. waitTime in pollOptions must be between 1 and 300 seconds."), + InvalidMaxAttemptsInPollOptions("%s0 Validation error. maxAttempts in pollOptions must be between 1 and 23."), + OutputDirectoryWithoutPollOptions("%s0 Validation error. outputDirectory in deidentify file request requires pollOptions."), + FailedToWriteOutputFile("%s0 Failed to write the processed output to %s1."), + GetRunRequestNull("%s0 Validation error. GetRun request cannot be null."), + InvalidRunIdInGetRun("%s0 Validation error. Invalid runId in get run request. Specify a non-empty run id."), + CheckGuardrailsRequestNull("%s0 Validation error. CheckGuardrails request cannot be null."), + InvalidTextInCheckGuardrails("%s0 Validation error. Invalid text in check guardrails request. Specify a non-empty text."), ; private final String message; - ErrorMessage(String message) { + BaseErrorMessage(String message) { this.message = message; } diff --git a/common/src/main/java/com/skyflow/errors/SkyflowException.java b/common/src/main/java/com/skyflow/errors/SkyflowException.java index 2b043f92..f8c595ba 100644 --- a/common/src/main/java/com/skyflow/errors/SkyflowException.java +++ b/common/src/main/java/com/skyflow/errors/SkyflowException.java @@ -89,7 +89,7 @@ public SkyflowException(int httpCode, Throwable cause, Map> } catch (Exception e) { this.httpStatus = HttpStatus.BAD_REQUEST.getHttpStatus(); String fullMessage = responseBody != null ? responseBody : - (cause.getLocalizedMessage() != null ? cause.getMessage() : ErrorMessage.ErrorOccurred.getMessage()); + (cause.getLocalizedMessage() != null ? cause.getMessage() : BaseErrorMessage.ErrorOccurred.getMessage()); this.message = fullMessage.split("HTTP response code:")[0].trim(); } } diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java new file mode 100644 index 00000000..d864c404 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java @@ -0,0 +1,73 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import okhttp3.Response; + +/** + * This exception type will be thrown for any non-2XX API responses. + */ +public class ApiClientApiException extends ApiClientException { + /** + * The error code of the response that triggered the exception. + */ + private final int statusCode; + + /** + * The body of the response that triggered the exception. + */ + private final Object body; + + private final Map> headers; + + public ApiClientApiException(String message, int statusCode, Object body) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + } + + public ApiClientApiException(String message, int statusCode, Object body, Response rawResponse) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + this.headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + } + + /** + * @return the statusCode + */ + public int statusCode() { + return this.statusCode; + } + + /** + * @return the body + */ + public Object body() { + return this.body; + } + + /** + * @return the headers + */ + public Map> headers() { + return this.headers; + } + + @Override + public String toString() { + return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + + ObjectMappers.stringify(body) + "}"; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java new file mode 100644 index 00000000..0f99fbc6 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java @@ -0,0 +1,17 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +/** + * This class serves as the base exception for all errors in the SDK. + */ +public class ApiClientException extends RuntimeException { + public ApiClientException(String message) { + super(message); + } + + public ApiClientException(String message, Exception e) { + super(message, e); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java new file mode 100644 index 00000000..4b251a98 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java @@ -0,0 +1,37 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import okhttp3.Response; + +public final class ApiClientHttpResponse { + + private final T body; + + private final Map> headers; + + public ApiClientHttpResponse(T body, Response rawResponse) { + this.body = body; + + Map> headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + this.headers = headers; + } + + public T body() { + return this.body; + } + + public Map> headers() { + return headers; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java new file mode 100644 index 00000000..cf61d5db --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java @@ -0,0 +1,320 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; +import okhttp3.OkHttpClient; + +public final class ClientOptions { + private final Environment environment; + + private final Map headers; + + private final Map> headerSuppliers; + + private final OkHttpClient httpClient; + + private final boolean ownsHttpClient; + + private final int timeout; + + private final int maxRetries; + + private final Optional initialRetryDelayMillis; + + private final Optional maxRetryDelayMillis; + + private final Optional retryJitterFactor; + + private final Optional logging; + + private ClientOptions( + Environment environment, + Map headers, + Map> headerSuppliers, + OkHttpClient httpClient, + boolean ownsHttpClient, + int timeout, + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional retryJitterFactor, + Optional logging) { + this.environment = environment; + this.headers = new HashMap<>(); + this.headers.putAll(headers); + this.headers.putAll(new HashMap() { + { + put("X-Fern-Language", "JAVA"); + put("X-Fern-SDK-Name", "com.skyflow.fern:api-sdk"); + put("X-Fern-SDK-Version", "0.0.98"); + } + }); + this.headerSuppliers = headerSuppliers; + this.httpClient = httpClient; + this.ownsHttpClient = ownsHttpClient; + this.timeout = timeout; + this.maxRetries = maxRetries; + this.initialRetryDelayMillis = initialRetryDelayMillis; + this.maxRetryDelayMillis = maxRetryDelayMillis; + this.retryJitterFactor = retryJitterFactor; + this.logging = logging; + } + + public Environment environment() { + return this.environment; + } + + public Map headers(RequestOptions requestOptions) { + Map values = new HashMap<>(this.headers); + headerSuppliers.forEach((key, supplier) -> { + values.put(key, supplier.get()); + }); + if (requestOptions != null) { + values.putAll(requestOptions.getHeaders()); + } + return values; + } + + public int timeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.timeout; + } + return requestOptions.getTimeout().orElse(this.timeout); + } + + public OkHttpClient httpClient() { + return this.httpClient; + } + + public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.httpClient; + } + return this.httpClient + .newBuilder() + .callTimeout(requestOptions.getTimeout().get(), requestOptions.getTimeoutTimeUnit()) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .build(); + } + + public int maxRetries() { + return this.maxRetries; + } + + public Optional initialRetryDelayMillis() { + return this.initialRetryDelayMillis; + } + + public Optional maxRetryDelayMillis() { + return this.maxRetryDelayMillis; + } + + public Optional retryJitterFactor() { + return this.retryJitterFactor; + } + + /** + * Releases resources owned by this client. Only shuts down the underlying OkHttpClient's + * dispatcher executor and evicts its connection pool when this client created that + * OkHttpClient itself; an OkHttpClient supplied via httpClient is left running, since the + * caller owns its lifecycle. + *

+ * In-flight calls are not cancelled or awaited, and any request issued after this method + * returns fails with a {@code RejectedExecutionException}. Options derived from this one via + * {@code Builder.from(...)} share the same dispatcher and connection pool, so closing either + * releases them for both. Calling this method more than once has no further effect. + */ + public void close() { + if (!this.ownsHttpClient) { + return; + } + this.httpClient.dispatcher().executorService().shutdown(); + this.httpClient.connectionPool().evictAll(); + } + + public Optional logging() { + return this.logging; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private Environment environment; + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + private int maxRetries = 2; + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private Optional timeout = Optional.empty(); + + private OkHttpClient httpClient = null; + + private boolean ownsHttpClient = true; + + private Optional logging = Optional.empty(); + + public Builder environment(Environment environment) { + this.environment = environment; + return this; + } + + public Builder addHeader(String key, String value) { + if (value != null) { + this.headers.put(key, value); + } + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(int timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(Optional timeout) { + this.timeout = timeout; + return this; + } + + /** + * Override the maximum number of retries. Defaults to 2 retries. + */ + public Builder maxRetries(int maxRetries) { + this.maxRetries = maxRetries; + return this; + } + + /** + * Override the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public Builder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Override the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public Builder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Override the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public Builder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); + return this; + } + + /** + * Sets the underlying OkHttp client. The caller retains ownership of its lifecycle: + * close() will not shut down its dispatcher executor or evict its connection pool. + */ + public Builder httpClient(OkHttpClient httpClient) { + this.httpClient = httpClient; + this.ownsHttpClient = httpClient == null; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public Builder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + public ClientOptions build() { + OkHttpClient.Builder httpClientBuilder = + this.httpClient != null ? this.httpClient.newBuilder() : new OkHttpClient.Builder(); + + if (this.httpClient != null) { + timeout.ifPresent(timeout -> httpClientBuilder + .callTimeout(timeout, TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS)); + } else { + httpClientBuilder + .callTimeout(this.timeout.orElse(60), TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .addInterceptor(new RetryInterceptor( + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor)); + } + + Logger logger = Logger.from(this.logging); + httpClientBuilder.addInterceptor(new LoggingInterceptor(logger)); + httpClientBuilder.addInterceptor(new ResponseDecompressionInterceptor()); + + this.httpClient = httpClientBuilder.build(); + this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); + + return new ClientOptions( + environment, + headers, + headerSuppliers, + httpClient, + this.ownsHttpClient, + this.timeout.get(), + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor, + this.logging); + } + + /** + * Create a new Builder initialized with values from an existing ClientOptions + */ + public static Builder from(ClientOptions clientOptions) { + Builder builder = new Builder(); + builder.environment = clientOptions.environment(); + builder.timeout = Optional.of(clientOptions.timeout(null)); + builder.httpClient = clientOptions.httpClient(); + builder.ownsHttpClient = clientOptions.ownsHttpClient; + builder.headers.putAll(clientOptions.headers); + builder.headerSuppliers.putAll(clientOptions.headerSuppliers); + builder.maxRetries = clientOptions.maxRetries(); + builder.initialRetryDelayMillis = clientOptions.initialRetryDelayMillis(); + builder.maxRetryDelayMillis = clientOptions.maxRetryDelayMillis(); + builder.retryJitterFactor = clientOptions.retryJitterFactor(); + builder.logging = clientOptions.logging(); + return builder; + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java new file mode 100644 index 00000000..e4feb843 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java @@ -0,0 +1,52 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.util.logging.Level; + +/** + * Default logger implementation that writes to the console using {@link java.util.logging.Logger}. + * + *

Uses the "fern" logger name with a simple format of "LEVEL - message". + */ +public final class ConsoleLogger implements ILogger { + + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger("fern"); + + static { + if (logger.getHandlers().length == 0) { + java.util.logging.ConsoleHandler handler = new java.util.logging.ConsoleHandler(); + handler.setFormatter(new java.util.logging.SimpleFormatter() { + @Override + public String format(java.util.logging.LogRecord record) { + return record.getLevel() + " - " + record.getMessage() + System.lineSeparator(); + } + }); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } + } + + @Override + public void debug(String message) { + logger.log(Level.FINE, message); + } + + @Override + public void info(String message) { + logger.log(Level.INFO, message); + } + + @Override + public void warn(String message) { + logger.log(Level.WARNING, message); + } + + @Override + public void error(String message) { + logger.log(Level.SEVERE, message); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java new file mode 100644 index 00000000..f2c9053a --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java @@ -0,0 +1,70 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalQueries; + +/** + * Custom deserializer that handles converting date-time strings into {@link OffsetDateTime} objects. + * Supports ISO 8601 format, space-separated variants, and RFC 1123 (RFC 2822) format. + */ +class DateTimeDeserializer extends JsonDeserializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule().addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); + } + + /** + * Gets a module wrapping this deserializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + JsonToken token = parser.currentToken(); + if (token == JsonToken.VALUE_NUMBER_INT) { + return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); + } else { + String value = parser.getValueAsString(); + TemporalAccessor temporal; + try { + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest(value, OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e) { + try { + // Fall back to space-separated format (e.g. "2025-02-15 10:30:00+00:00"). + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( + value.replace(' ', 'T'), OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e2) { + // Fall back to RFC 1123 format (e.g. "Thu, 07 May 2026 14:23:38 +0000"). + temporal = DateTimeFormatter.RFC_1123_DATE_TIME.parseBest( + value, OffsetDateTime::from, LocalDateTime::from); + } + } + + if (temporal.query(TemporalQueries.offset()) == null) { + return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); + } else { + return OffsetDateTime.from(temporal); + } + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java new file mode 100644 index 00000000..635869a6 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import java.io.IOException; + +/** + * Custom serializer that writes integer-valued doubles without a decimal point. + * For example, {@code 24000.0} is serialized as {@code 24000} instead of {@code 24000.0}. + * Non-integer values like {@code 3.14} are serialized normally. + */ +class DoubleSerializer extends JsonSerializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule() + .addSerializer(Double.class, new DoubleSerializer()) + .addSerializer(double.class, new DoubleSerializer()); + } + + /** + * Gets a module wrapping this serializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value != null && value == Math.floor(value) && !Double.isInfinite(value) && !Double.isNaN(value)) { + gen.writeNumber(value.longValue()); + } else { + gen.writeNumber(value); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java new file mode 100644 index 00000000..c95311b0 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +public final class Environment { + public static final Environment PRODUCTION = new Environment("https://%7B%7BvaultUri%7D%7D.vault.skyflowapis.com"); + + public static final Environment SANDBOX = + new Environment("https://%7B%7BvaultUri%7D%7D.vault.skyflowapis-preview.com"); + + private final String url; + + private Environment(String url) { + this.url = url; + } + + public String getUrl() { + return this.url; + } + + public static Environment custom(String url) { + return new Environment(url); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java new file mode 100644 index 00000000..0df7a4f5 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java @@ -0,0 +1,38 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +/** + * Interface for custom logger implementations. + * + *

Implement this interface to provide a custom logging backend for the SDK. + * The SDK will call the appropriate method based on the log level. + * + *

Example: + *

{@code
+ * public class MyCustomLogger implements ILogger {
+ *     public void debug(String message) {
+ *         System.out.println("[DBG] " + message);
+ *     }
+ *     public void info(String message) {
+ *         System.out.println("[INF] " + message);
+ *     }
+ *     public void warn(String message) {
+ *         System.out.println("[WRN] " + message);
+ *     }
+ *     public void error(String message) {
+ *         System.out.println("[ERR] " + message);
+ *     }
+ * }
+ * }
+ */ +public interface ILogger { + void debug(String message); + + void info(String message); + + void warn(String message); + + void error(String message); +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java new file mode 100644 index 00000000..e613616b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java @@ -0,0 +1,98 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +/** + * Configuration for SDK logging. + * + *

Use the builder to configure logging behavior: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Or with a custom logger: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .logger(new MyCustomLogger())
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Defaults: + *

    + *
  • {@code level} — {@link LogLevel#INFO}
  • + *
  • {@code logger} — {@link ConsoleLogger} (writes to stderr via java.util.logging)
  • + *
  • {@code silent} — {@code true} (no output unless explicitly enabled)
  • + *
+ */ +public final class LogConfig { + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + private LogConfig(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + public LogLevel level() { + return level; + } + + public ILogger logger() { + return logger; + } + + public boolean silent() { + return silent; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private LogLevel level = LogLevel.INFO; + private ILogger logger = new ConsoleLogger(); + private boolean silent = true; + + private Builder() {} + + /** + * Set the minimum log level. Only messages at this level or above will be logged. + * Defaults to {@link LogLevel#INFO}. + */ + public Builder level(LogLevel level) { + this.level = level; + return this; + } + + /** + * Set a custom logger implementation. Defaults to {@link ConsoleLogger}. + */ + public Builder logger(ILogger logger) { + this.logger = logger; + return this; + } + + /** + * Set whether logging is silent (disabled). Defaults to {@code true}. + * Set to {@code false} to enable log output. + */ + public Builder silent(boolean silent) { + this.silent = silent; + return this; + } + + public LogConfig build() { + return new LogConfig(level, logger, silent); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java new file mode 100644 index 00000000..b37806c0 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java @@ -0,0 +1,36 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +/** + * Log levels for SDK logging configuration. + * Silent by default — no log output unless explicitly configured. + */ +public enum LogLevel { + DEBUG(1), + INFO(2), + WARN(3), + ERROR(4); + + private final int value; + + LogLevel(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + /** + * Parse a log level from a string (case-insensitive). + * + * @param level the level string (debug, info, warn, error) + * @return the corresponding LogLevel + * @throws IllegalArgumentException if the string does not match any level + */ + public static LogLevel fromString(String level) { + return LogLevel.valueOf(level.toUpperCase()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java new file mode 100644 index 00000000..19a9d1fe --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +/** + * SDK logger that filters messages based on level and silent mode. + * + *

Silent by default — no log output unless explicitly configured. + * Create via {@link LogConfig} or directly: + *

{@code
+ * Logger logger = new Logger(LogLevel.DEBUG, new ConsoleLogger(), false);
+ * logger.debug("request sent");
+ * }
+ */ +public final class Logger { + + private static final Logger DEFAULT = new Logger(LogLevel.INFO, new ConsoleLogger(), true); + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + public Logger(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + /** + * Returns a default silent logger (no output). + */ + public static Logger getDefault() { + return DEFAULT; + } + + /** + * Creates a Logger from a {@link LogConfig}. If config is {@code null}, returns the default silent logger. + */ + public static Logger from(LogConfig config) { + if (config == null) { + return DEFAULT; + } + return new Logger(config.level(), config.logger(), config.silent()); + } + + /** + * Creates a Logger from an {@code Optional}. If empty, returns the default silent logger. + */ + public static Logger from(java.util.Optional config) { + return config.map(Logger::from).orElse(DEFAULT); + } + + private boolean shouldLog(LogLevel messageLevel) { + return !silent && level.getValue() <= messageLevel.getValue(); + } + + public boolean isDebug() { + return shouldLog(LogLevel.DEBUG); + } + + public boolean isInfo() { + return shouldLog(LogLevel.INFO); + } + + public boolean isWarn() { + return shouldLog(LogLevel.WARN); + } + + public boolean isError() { + return shouldLog(LogLevel.ERROR); + } + + public void debug(String message) { + if (isDebug()) { + logger.debug(message); + } + } + + public void info(String message) { + if (isInfo()) { + logger.info(message); + } + } + + public void warn(String message) { + if (isWarn()) { + logger.warn(message); + } + } + + public void error(String message) { + if (isError()) { + logger.error(message); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java new file mode 100644 index 00000000..33c1d6aa --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java @@ -0,0 +1,104 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * OkHttp interceptor that logs HTTP requests and responses. + * + *

Logs request method, URL, and headers (with sensitive values redacted) at debug level. + * Logs response status at debug level, and 4xx/5xx responses at error level. + * Does nothing if the logger is silent. + */ +public final class LoggingInterceptor implements Interceptor { + + private static final Set SENSITIVE_HEADERS = new HashSet<>(Arrays.asList( + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "proxy-authenticate", + "proxy-authorization", + "cookie", + "set-cookie", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token")); + + private final Logger logger; + + public LoggingInterceptor(Logger logger) { + this.logger = logger; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Request: ").append(request.method()).append(" ").append(request.url()); + sb.append(" headers={"); + boolean first = true; + for (String name : request.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(request.header(name)); + } + first = false; + } + sb.append("}"); + sb.append(" has_body=").append(request.body() != null); + logger.debug(sb.toString()); + } + + Response response = chain.proceed(request); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Response: status=").append(response.code()); + sb.append(" url=").append(response.request().url()); + sb.append(" headers={"); + boolean first = true; + for (String name : response.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(response.header(name)); + } + first = false; + } + sb.append("}"); + logger.debug(sb.toString()); + } + + if (response.code() >= 400 && logger.isError()) { + logger.error("HTTP Error: status=" + response.code() + " url=" + + response.request().url()); + } + + return response; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java new file mode 100644 index 00000000..b2d084be --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import okhttp3.MediaType; + +public final class MediaTypes { + + public static final MediaType APPLICATION_JSON = MediaType.parse("application/json"); + + private MediaTypes() {} +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java new file mode 100644 index 00000000..7b4660ad --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java @@ -0,0 +1,46 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import java.io.IOException; + +public final class ObjectMappers { + public static final ObjectMapper JSON_MAPPER = JsonMapper.builder() + .addModule(new Jdk8Module()) + .addModule(new JavaTimeModule()) + .addModule(DateTimeDeserializer.getModule()) + .addModule(DoubleSerializer.getModule()) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .build(); + + private ObjectMappers() {} + + public static String stringify(Object o) { + try { + return JSON_MAPPER + .setSerializationInclusion(JsonInclude.Include.ALWAYS) + .writerWithDefaultPrettyPrinter() + .writeValueAsString(o); + } catch (IOException e) { + return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); + } + } + + public static Object parseErrorBody(String responseBodyString) { + try { + return JSON_MAPPER.readValue(responseBodyString, Object.class); + } catch (JsonProcessingException ignored) { + return responseBodyString; + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java new file mode 100644 index 00000000..ba2dadc4 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java @@ -0,0 +1,142 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; + +public class QueryStringMapper { + + private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; + + public static void addQueryParameter(HttpUrl.Builder httpUrl, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + httpUrl.addQueryParameter(key, valueNode.textValue()); + } else { + httpUrl.addQueryParameter(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().textValue()); + } else { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().toString()); + } + } + } + + public static void addFormDataPart( + MultipartBody.Builder multipartBody, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + multipartBody.addFormDataPart(key, valueNode.textValue()); + } else { + multipartBody.addFormDataPart(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().textValue()); + } else { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().toString()); + } + } + } + + public static List> flattenObject(ObjectNode object, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator> fields = object.fields(); + while (fields.hasNext()) { + Map.Entry field = fields.next(); + + String key = "[" + field.getKey() + "]"; + + if (field.getValue().isObject()) { + List> flatField = + flattenObject((ObjectNode) field.getValue(), arraysAsRepeats); + addAll(flat, flatField, key); + } else if (field.getValue().isArray()) { + List> flatField = + flattenArray((ArrayNode) field.getValue(), key, arraysAsRepeats); + addAll(flat, flatField, ""); + } else { + flat.add(new AbstractMap.SimpleEntry<>(key, field.getValue())); + } + } + + return flat; + } + + private static List> flattenArray( + ArrayNode array, String key, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator elements = array.elements(); + + int index = 0; + while (elements.hasNext()) { + JsonNode element = elements.next(); + + String indexKey = key + "[" + index + "]"; + + if (arraysAsRepeats) { + indexKey = key; + } + + if (element.isObject()) { + List> flatField = flattenObject((ObjectNode) element, arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else if (element.isArray()) { + List> flatField = flattenArray((ArrayNode) element, "", arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else { + flat.add(new AbstractMap.SimpleEntry<>(indexKey, element)); + } + + index++; + } + + return flat; + } + + private static void addAll( + List> target, List> source, String prefix) { + for (Map.Entry entry : source) { + Map.Entry entryToAdd = + new AbstractMap.SimpleEntry<>(prefix + entry.getKey(), entry.getValue()); + target.add(entryToAdd); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java new file mode 100644 index 00000000..7f5ccea0 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java @@ -0,0 +1,154 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +public final class RequestOptions { + private final String token; + + private final Optional timeout; + + private final TimeUnit timeoutTimeUnit; + + private final Optional maxRetries; + + private final Map headers; + + private final Map> headerSuppliers; + + private final Map queryParameters; + + private final Map> queryParameterSuppliers; + + private RequestOptions( + String token, + Optional timeout, + TimeUnit timeoutTimeUnit, + Optional maxRetries, + Map headers, + Map> headerSuppliers, + Map queryParameters, + Map> queryParameterSuppliers) { + this.token = token; + this.timeout = timeout; + this.timeoutTimeUnit = timeoutTimeUnit; + this.maxRetries = maxRetries; + this.headers = headers; + this.headerSuppliers = headerSuppliers; + this.queryParameters = queryParameters; + this.queryParameterSuppliers = queryParameterSuppliers; + } + + public Optional getTimeout() { + return timeout; + } + + public TimeUnit getTimeoutTimeUnit() { + return timeoutTimeUnit; + } + + public Optional getMaxRetries() { + return maxRetries; + } + + public Map getHeaders() { + Map headers = new HashMap<>(); + if (this.token != null) { + headers.put("Authorization", "Bearer " + this.token); + } + headers.putAll(this.headers); + this.headerSuppliers.forEach((key, supplier) -> { + headers.put(key, supplier.get()); + }); + return headers; + } + + public Map getQueryParameters() { + Map queryParameters = new HashMap<>(this.queryParameters); + this.queryParameterSuppliers.forEach((key, supplier) -> { + queryParameters.put(key, supplier.get()); + }); + return queryParameters; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private String token = null; + + private Optional timeout = Optional.empty(); + + private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; + + private Optional maxRetries = Optional.empty(); + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + private final Map queryParameters = new HashMap<>(); + + private final Map> queryParameterSuppliers = new HashMap<>(); + + public Builder token(String token) { + this.token = token; + return this; + } + + public Builder timeout(Integer timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { + this.timeout = Optional.of(timeout); + this.timeoutTimeUnit = timeoutTimeUnit; + return this; + } + + public Builder maxRetries(Integer maxRetries) { + this.maxRetries = Optional.of(maxRetries); + return this; + } + + public Builder addHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + public Builder addQueryParameter(String key, String value) { + this.queryParameters.put(key, value); + return this; + } + + public Builder addQueryParameter(String key, Supplier value) { + this.queryParameterSuppliers.put(key, value); + return this; + } + + public RequestOptions build() { + return new RequestOptions( + token, + timeout, + timeoutTimeUnit, + maxRetries, + headers, + headerSuppliers, + queryParameters, + queryParameterSuppliers); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java new file mode 100644 index 00000000..9988a7fc --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java @@ -0,0 +1,56 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.io.IOException; +import java.util.zip.Inflater; +import okhttp3.Interceptor; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.GzipSource; +import okio.InflaterSource; +import okio.Okio; +import okio.Source; + +/** + * Decompresses gzip and deflate encoded response bodies. OkHttp only performs + * transparent decompression when it adds the Accept-Encoding header itself, so + * responses to requests with an explicitly set Accept-Encoding header would + * otherwise be returned as raw compressed bytes. + */ +public class ResponseDecompressionInterceptor implements Interceptor { + + @Override + public Response intercept(Chain chain) throws IOException { + return decompress(chain.proceed(chain.request())); + } + + private Response decompress(Response response) { + ResponseBody body = response.body(); + if (body == null) { + return response; + } + String encoding = response.header("Content-Encoding"); + if (encoding == null) { + return response; + } + Source decompressedSource; + if (encoding.equalsIgnoreCase("gzip") || encoding.equalsIgnoreCase("x-gzip")) { + decompressedSource = new GzipSource(body.source()); + } else if (encoding.equalsIgnoreCase("deflate")) { + decompressedSource = new InflaterSource(body.source(), new Inflater()); + } else { + return response; + } + ResponseBody decompressedBody = ResponseBody.create(body.contentType(), -1L, Okio.buffer(decompressedSource)); + return response.newBuilder() + .headers(response.headers() + .newBuilder() + .removeAll("Content-Encoding") + .removeAll("Content-Length") + .build()) + .body(decompressedBody) + .build(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java new file mode 100644 index 00000000..c46a526e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java @@ -0,0 +1,242 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.core; + +import java.io.IOException; +import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Optional; +import java.util.Random; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +public class RetryInterceptor implements Interceptor { + + private static final Duration DEFAULT_INITIAL_RETRY_DELAY = Duration.ofMillis(1000); + private static final Duration DEFAULT_MAX_RETRY_DELAY = Duration.ofMillis(60000); + private static final double DEFAULT_JITTER_FACTOR = 0.2; + + private final int maxRetries; + private final Duration initialRetryDelay; + private final Duration maxRetryDelay; + private final double jitterFactor; + private final Random random = new Random(); + + public RetryInterceptor(int maxRetries) { + this(maxRetries, Optional.empty(), Optional.empty(), Optional.empty()); + } + + public RetryInterceptor( + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional jitterFactor) { + initialRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("initialRetryDelayMillis must be non-negative"); + } + }); + maxRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("maxRetryDelayMillis must be non-negative"); + } + }); + jitterFactor.ifPresent(factor -> { + if (factor < 0 || factor > 1) { + throw new IllegalArgumentException("jitterFactor must be between 0 and 1"); + } + }); + this.maxRetries = maxRetries; + this.initialRetryDelay = initialRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_INITIAL_RETRY_DELAY); + this.maxRetryDelay = maxRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_MAX_RETRY_DELAY); + this.jitterFactor = jitterFactor.orElse(DEFAULT_JITTER_FACTOR); + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + int effectiveMaxRetries = resolveMaxRetries(request); + Response response = chain.proceed(request); + + if (shouldRetry(response.code())) { + return retryChain(response, chain, effectiveMaxRetries); + } + + return response; + } + + private int resolveMaxRetries(Request request) { + MaxRetriesOverride override = request.tag(MaxRetriesOverride.class); + return override != null ? override.getValue() : this.maxRetries; + } + + private Response retryChain(Response response, Chain chain, int maxRetries) throws IOException { + ExponentialBackoff backoff = new ExponentialBackoff(maxRetries); + Optional nextBackoff = backoff.nextBackoff(response); + while (nextBackoff.isPresent()) { + try { + Thread.sleep(nextBackoff.get().toMillis()); + } catch (InterruptedException e) { + throw new IOException("Interrupted while trying request", e); + } + response.close(); + response = chain.proceed(chain.request()); + if (shouldRetry(response.code())) { + nextBackoff = backoff.nextBackoff(response); + } else { + return response; + } + } + + return response; + } + + /** + * Calculates the retry delay from response headers, with fallback to exponential backoff. + * Priority: Retry-After > X-RateLimit-Reset > Exponential Backoff + */ + private Duration getRetryDelayFromHeaders(Response response, int retryAttempt) { + // Check for Retry-After header first (RFC 7231), with no jitter + String retryAfter = response.header("Retry-After"); + if (retryAfter != null) { + // Parse as number of seconds... + Optional secondsDelay = tryParseLong(retryAfter) + .map(seconds -> seconds * 1000) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (secondsDelay.isPresent()) { + return secondsDelay.get(); + } + + // ...or as an HTTP date; both are valid + Optional dateDelay = tryParseHttpDate(retryAfter) + .map(resetTime -> resetTime.toInstant().toEpochMilli() - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (dateDelay.isPresent()) { + return dateDelay.get(); + } + } + + // Then check for industry-standard X-RateLimit-Reset header, with positive jitter + String rateLimitReset = response.header("X-RateLimit-Reset"); + if (rateLimitReset != null) { + // Assume Unix timestamp in epoch seconds + Optional rateLimitDelay = tryParseLong(rateLimitReset) + .map(resetTimeSeconds -> (resetTimeSeconds * 1000) - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(this::addPositiveJitter) + .map(Duration::ofMillis); + if (rateLimitDelay.isPresent()) { + return rateLimitDelay.get(); + } + } + + // Fall back to exponential backoff, with symmetric jitter + long initialDelayMillis = initialRetryDelay.toMillis(); + long maxDelayMillis = maxRetryDelay.toMillis(); + long cappedDelay; + if (retryAttempt >= Long.SIZE - 1 || initialDelayMillis > (maxDelayMillis >> retryAttempt)) { + // initialDelayMillis * 2^retryAttempt would exceed maxDelayMillis (or overflow) + cappedDelay = maxDelayMillis; + } else { + cappedDelay = Math.min(initialDelayMillis << retryAttempt, maxDelayMillis); // 2^retryAttempt + } + return Duration.ofMillis(addSymmetricJitter(cappedDelay)); + } + + /** + * Attempts to parse a string as a long, returning empty Optional on failure. + */ + private Optional tryParseLong(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(Long.parseLong(value)); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + /** + * Attempts to parse a string as an HTTP date (RFC 1123), returning empty Optional on failure. + */ + private Optional tryParseHttpDate(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(ZonedDateTime.parse(value, DateTimeFormatter.RFC_1123_DATE_TIME)); + } catch (DateTimeParseException e) { + return Optional.empty(); + } + } + + /** + * Adds positive jitter (100-120% of original value) to prevent thundering herd. + * Used for X-RateLimit-Reset header delays. + */ + private long addPositiveJitter(long delayMs) { + double jitterMultiplier = 1.0 + (random.nextDouble() * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + + /** + * Adds symmetric jitter (90-110% of original value) to prevent thundering herd. + * Used for exponential backoff delays. + */ + private long addSymmetricJitter(long delayMs) { + double jitterMultiplier = 1.0 + ((random.nextDouble() - 0.5) * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + + private static boolean shouldRetry(int statusCode) { + return statusCode == 408 || statusCode == 429 || statusCode >= 500; + } + + /** + * Per-request override carried on the OkHttp {@link Request} as a tag. + * When present, the interceptor uses this value instead of the client-wide + * {@code maxRetries} configured at construction time. + */ + public static final class MaxRetriesOverride { + private final int value; + + public MaxRetriesOverride(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + + private final class ExponentialBackoff { + + private final int maxNumRetries; + + private int retryNumber = 0; + + ExponentialBackoff(int maxNumRetries) { + this.maxNumRetries = maxNumRetries; + } + + public Optional nextBackoff(Response response) { + if (retryNumber >= maxNumRetries) { + return Optional.empty(); + } + + Duration delay = getRetryDelayFromHeaders(response, retryNumber); + retryNumber += 1; + return Optional.of(delay); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java b/common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java new file mode 100644 index 00000000..7858ef63 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.errors; + +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class BadRequestError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public BadRequestError(ErrorResponse body) { + super("BadRequestError", 400, body); + this.body = body; + } + + public BadRequestError(ErrorResponse body, Response rawResponse) { + super("BadRequestError", 400, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java b/common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java new file mode 100644 index 00000000..c21d7766 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.errors; + +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class InternalServerError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public InternalServerError(ErrorResponse body) { + super("InternalServerError", 500, body); + this.body = body; + } + + public InternalServerError(ErrorResponse body, Response rawResponse) { + super("InternalServerError", 500, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java b/common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java new file mode 100644 index 00000000..63754690 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.errors; + +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class UnauthorizedError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public UnauthorizedError(ErrorResponse body) { + super("UnauthorizedError", 401, body); + this.body = body; + } + + public UnauthorizedError(ErrorResponse body, Response rawResponse) { + super("UnauthorizedError", 401, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java new file mode 100644 index 00000000..c032d144 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java @@ -0,0 +1,85 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import java.util.concurrent.CompletableFuture; + +public class AsyncFilesV2Client { + protected final ClientOptions clientOptions; + + private final AsyncRawFilesV2Client rawClient; + + public AsyncFilesV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawFilesV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawFilesV2Client withRawResponse() { + return this.rawClient; + } + + /** + * De-identifies sensitive data from a file.

Note: + *

    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public CompletableFuture deidentifyFileV2(DeidentifyFileRequestV2 request) { + return this.rawClient.deidentifyFileV2(request).thenApply(response -> response.body()); + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public CompletableFuture deidentifyFileV2( + DeidentifyFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.deidentifyFileV2(request, requestOptions).thenApply(response -> response.body()); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture reidentifyFileV2(ReidentifyFileRequestV2 request) { + return this.rawClient.reidentifyFileV2(request).thenApply(response -> response.body()); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture reidentifyFileV2( + ReidentifyFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.reidentifyFileV2(request, requestOptions).thenApply(response -> response.body()); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public CompletableFuture getRunV2(String runId, GetRunV2Request request) { + return this.rawClient.getRunV2(runId, request).thenApply(response -> response.body()); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public CompletableFuture getRunV2( + String runId, GetRunV2Request request, RequestOptions requestOptions) { + return this.rawClient.getRunV2(runId, request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java new file mode 100644 index 00000000..6764e32b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java @@ -0,0 +1,350 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.QueryStringMapper; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import java.io.IOException; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawFilesV2Client { + protected final ClientOptions clientOptions; + + public AsyncRawFilesV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public CompletableFuture> deidentifyFileV2( + DeidentifyFileRequestV2 request) { + return deidentifyFileV2(request, null); + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public CompletableFuture> deidentifyFileV2( + DeidentifyFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/deidentify/file"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeidentifyFileResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture> reidentifyFileV2( + ReidentifyFileRequestV2 request) { + return reidentifyFileV2(request, null); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture> reidentifyFileV2( + ReidentifyFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/reidentify/file"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ReidentifyFileResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public CompletableFuture> getRunV2( + String runId, GetRunV2Request request) { + return getRunV2(runId, request, null); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public CompletableFuture> getRunV2( + String runId, GetRunV2Request request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/runs") + .addPathSegment(runId); + QueryStringMapper.addQueryParameter(httpUrl, "vaultId", request.getVaultId(), 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"); + 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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetectRunsResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java new file mode 100644 index 00000000..9f9f8c1a --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java @@ -0,0 +1,81 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; + +public class FilesV2Client { + protected final ClientOptions clientOptions; + + private final RawFilesV2Client rawClient; + + public FilesV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawFilesV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawFilesV2Client withRawResponse() { + return this.rawClient; + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public DeidentifyFileResponseV2 deidentifyFileV2(DeidentifyFileRequestV2 request) { + return this.rawClient.deidentifyFileV2(request).body(); + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public DeidentifyFileResponseV2 deidentifyFileV2(DeidentifyFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.deidentifyFileV2(request, requestOptions).body(); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ReidentifyFileResponseV2 reidentifyFileV2(ReidentifyFileRequestV2 request) { + return this.rawClient.reidentifyFileV2(request).body(); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ReidentifyFileResponseV2 reidentifyFileV2(ReidentifyFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.reidentifyFileV2(request, requestOptions).body(); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public DetectRunsResponseV2 getRunV2(String runId, GetRunV2Request request) { + return this.rawClient.getRunV2(runId, request).body(); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public DetectRunsResponseV2 getRunV2(String runId, GetRunV2Request request, RequestOptions requestOptions) { + return this.rawClient.getRunV2(runId, request, requestOptions).body(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java new file mode 100644 index 00000000..2ffe352d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java @@ -0,0 +1,282 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.QueryStringMapper; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawFilesV2Client { + protected final ClientOptions clientOptions; + + public RawFilesV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public ApiClientHttpResponse deidentifyFileV2(DeidentifyFileRequestV2 request) { + return deidentifyFileV2(request, null); + } + + /** + * De-identifies sensitive data from a file.

Note: + *
    + *
  • Layout may vary with token-based redaction for MS Office files (PPT, DOCX, and XLS) and PDFs when token-based PDF processing is selected.
  • + *
  • V2 API is in beta.
  • + *
+ */ + public ApiClientHttpResponse deidentifyFileV2( + DeidentifyFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/deidentify/file"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeidentifyFileResponseV2.class), + response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse reidentifyFileV2(ReidentifyFileRequestV2 request) { + return reidentifyFileV2(request, null); + } + + /** + * Re-identifies tokens in a file.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse reidentifyFileV2( + ReidentifyFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/reidentify/file"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ReidentifyFileResponseV2.class), + response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse getRunV2(String runId, GetRunV2Request request) { + return getRunV2(runId, request, null); + } + + /** + * Returns the status of a detect run.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse getRunV2( + String runId, GetRunV2Request request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/runs") + .addPathSegment(runId); + QueryStringMapper.addQueryParameter(httpUrl, "vaultId", request.getVaultId(), 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"); + 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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetectRunsResponseV2.class), response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java new file mode 100644 index 00000000..f95ee7ab --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java @@ -0,0 +1,286 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; +import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; +import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyFileRequestV2.Builder.class) +public final class DeidentifyFileRequestV2 { + private final DeidentifyFileRequestV2DataSource dataSource; + + private final String value; + + private final Optional dataFormat; + + private final Optional configurationId; + + private final Optional configuration; + + private final Map additionalProperties; + + private DeidentifyFileRequestV2( + DeidentifyFileRequestV2DataSource dataSource, + String value, + Optional dataFormat, + Optional configurationId, + Optional configuration, + Map additionalProperties) { + this.dataSource = dataSource; + this.value = value; + this.dataFormat = dataFormat; + this.configurationId = configurationId; + this.configuration = configuration; + this.additionalProperties = additionalProperties; + } + + /** + * @return Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file. + */ + @JsonProperty("dataSource") + public DeidentifyFileRequestV2DataSource getDataSource() { + return dataSource; + } + + /** + * @return File data corresponding to the specified dataSource type. + */ + @JsonProperty("value") + public String getValue() { + return value; + } + + /** + * @return Format of the input file. The VAULT_TOKEN de-identification type is supported only for txt, json, csv, xml, jsonl, docx, xlsx, and pptx files. + */ + @JsonProperty("dataFormat") + public Optional getDataFormat() { + return dataFormat; + } + + /** + * @return ID of the Detect configuration to use for de-identification. + */ + @JsonProperty("configurationId") + public Optional getConfigurationId() { + return configurationId; + } + + @JsonProperty("configuration") + public Optional getConfiguration() { + return configuration; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyFileRequestV2 && equalTo((DeidentifyFileRequestV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyFileRequestV2 other) { + return dataSource.equals(other.dataSource) + && value.equals(other.value) + && dataFormat.equals(other.dataFormat) + && configurationId.equals(other.configurationId) + && configuration.equals(other.configuration); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.dataSource, this.value, this.dataFormat, this.configurationId, this.configuration); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static DataSourceStage builder() { + return new Builder(); + } + + public interface DataSourceStage { + /** + *

Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ */ + ValueStage dataSource(@NotNull DeidentifyFileRequestV2DataSource dataSource); + + Builder from(DeidentifyFileRequestV2 other); + } + + public interface ValueStage { + /** + *

File data corresponding to the specified dataSource type.

+ */ + _FinalStage value(@NotNull String value); + } + + public interface _FinalStage { + DeidentifyFileRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

Format of the input file. The VAULT_TOKEN de-identification type is supported only for txt, json, csv, xml, jsonl, docx, xlsx, and pptx files.

+ */ + _FinalStage dataFormat(Optional dataFormat); + + _FinalStage dataFormat(DeidentifyFileRequestV2DataFormat dataFormat); + + /** + *

ID of the Detect configuration to use for de-identification.

+ */ + _FinalStage configurationId(Optional configurationId); + + _FinalStage configurationId(String configurationId); + + _FinalStage configuration(Optional configuration); + + _FinalStage configuration(DetectConfigV2 configuration); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements DataSourceStage, ValueStage, _FinalStage { + private DeidentifyFileRequestV2DataSource dataSource; + + private String value; + + private Optional configuration = Optional.empty(); + + private Optional configurationId = Optional.empty(); + + private Optional dataFormat = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeidentifyFileRequestV2 other) { + dataSource(other.getDataSource()); + value(other.getValue()); + dataFormat(other.getDataFormat()); + configurationId(other.getConfigurationId()); + configuration(other.getConfiguration()); + return this; + } + + /** + *

Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("dataSource") + public ValueStage dataSource(@NotNull DeidentifyFileRequestV2DataSource dataSource) { + this.dataSource = Objects.requireNonNull(dataSource, "dataSource must not be null"); + return this; + } + + /** + *

File data corresponding to the specified dataSource type.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("value") + public _FinalStage value(@NotNull String value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage configuration(DetectConfigV2 configuration) { + this.configuration = Optional.ofNullable(configuration); + return this; + } + + @java.lang.Override + @JsonSetter(value = "configuration", nulls = Nulls.SKIP) + public _FinalStage configuration(Optional configuration) { + this.configuration = configuration; + return this; + } + + /** + *

ID of the Detect configuration to use for de-identification.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage configurationId(String configurationId) { + this.configurationId = Optional.ofNullable(configurationId); + return this; + } + + /** + *

ID of the Detect configuration to use for de-identification.

+ */ + @java.lang.Override + @JsonSetter(value = "configurationId", nulls = Nulls.SKIP) + public _FinalStage configurationId(Optional configurationId) { + this.configurationId = configurationId; + return this; + } + + /** + *

Format of the input file. The VAULT_TOKEN de-identification type is supported only for txt, json, csv, xml, jsonl, docx, xlsx, and pptx files.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage dataFormat(DeidentifyFileRequestV2DataFormat dataFormat) { + this.dataFormat = Optional.ofNullable(dataFormat); + return this; + } + + /** + *

Format of the input file. The VAULT_TOKEN de-identification type is supported only for txt, json, csv, xml, jsonl, docx, xlsx, and pptx files.

+ */ + @java.lang.Override + @JsonSetter(value = "dataFormat", nulls = Nulls.SKIP) + public _FinalStage dataFormat(Optional dataFormat) { + this.dataFormat = dataFormat; + return this; + } + + @java.lang.Override + public DeidentifyFileRequestV2 build() { + return new DeidentifyFileRequestV2( + dataSource, value, dataFormat, configurationId, configuration, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java new file mode 100644 index 00000000..f90f7153 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java @@ -0,0 +1,118 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.requests; + +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 com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetRunV2Request.Builder.class) +public final class GetRunV2Request { + private final String vaultId; + + private final Map additionalProperties; + + private GetRunV2Request(String vaultId, Map additionalProperties) { + this.vaultId = vaultId; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("vaultId") + public String getVaultId() { + return vaultId; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetRunV2Request && equalTo((GetRunV2Request) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetRunV2Request other) { + return vaultId.equals(other.vaultId); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(GetRunV2Request other); + } + + public interface _FinalStage { + GetRunV2Request build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetRunV2Request other) { + vaultId(other.getVaultId()); + return this; + } + + @java.lang.Override + @JsonSetter("vaultId") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + @java.lang.Override + public GetRunV2Request build() { + return new GetRunV2Request(vaultId, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java new file mode 100644 index 00000000..29751862 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java @@ -0,0 +1,291 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; +import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; +import com.skyflow.generated.detect.rest.types.RedactionLevel; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ReidentifyFileRequestV2.Builder.class) +public final class ReidentifyFileRequestV2 { + private final ReidentifyFileRequestV2DataSource dataSource; + + private final String value; + + private final Optional dataFormat; + + private final String vaultId; + + private final Optional> redactionLevel; + + private final Map additionalProperties; + + private ReidentifyFileRequestV2( + ReidentifyFileRequestV2DataSource dataSource, + String value, + Optional dataFormat, + String vaultId, + Optional> redactionLevel, + Map additionalProperties) { + this.dataSource = dataSource; + this.value = value; + this.dataFormat = dataFormat; + this.vaultId = vaultId; + this.redactionLevel = redactionLevel; + this.additionalProperties = additionalProperties; + } + + /** + * @return Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file. + */ + @JsonProperty("dataSource") + public ReidentifyFileRequestV2DataSource getDataSource() { + return dataSource; + } + + /** + * @return File data corresponding to the specified dataSource type. + */ + @JsonProperty("value") + public String getValue() { + return value; + } + + /** + * @return Format of the input file. Limited to the formats that support the VAULT_TOKEN de-identification type. + */ + @JsonProperty("dataFormat") + public Optional getDataFormat() { + return dataFormat; + } + + /** + * @return ID of the vault used for de-identification. + */ + @JsonProperty("vaultId") + public String getVaultId() { + return vaultId; + } + + /** + * @return Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set redactionType for FlowVault and redactionPattern for SkyVaultto specify the replacement. + */ + @JsonProperty("redactionLevel") + public Optional> getRedactionLevel() { + return redactionLevel; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ReidentifyFileRequestV2 && equalTo((ReidentifyFileRequestV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ReidentifyFileRequestV2 other) { + return dataSource.equals(other.dataSource) + && value.equals(other.value) + && dataFormat.equals(other.dataFormat) + && vaultId.equals(other.vaultId) + && redactionLevel.equals(other.redactionLevel); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.dataSource, this.value, this.dataFormat, this.vaultId, this.redactionLevel); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static DataSourceStage builder() { + return new Builder(); + } + + public interface DataSourceStage { + /** + *

Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ */ + ValueStage dataSource(@NotNull ReidentifyFileRequestV2DataSource dataSource); + + Builder from(ReidentifyFileRequestV2 other); + } + + public interface ValueStage { + /** + *

File data corresponding to the specified dataSource type.

+ */ + VaultIdStage value(@NotNull String value); + } + + public interface VaultIdStage { + /** + *

ID of the vault used for de-identification.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + } + + public interface _FinalStage { + ReidentifyFileRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

Format of the input file. Limited to the formats that support the VAULT_TOKEN de-identification type.

+ */ + _FinalStage dataFormat(Optional dataFormat); + + _FinalStage dataFormat(ReidentifyFileRequestV2DataFormat dataFormat); + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set redactionType for FlowVault and redactionPattern for SkyVaultto specify the replacement.

+ */ + _FinalStage redactionLevel(Optional> redactionLevel); + + _FinalStage redactionLevel(List redactionLevel); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements DataSourceStage, ValueStage, VaultIdStage, _FinalStage { + private ReidentifyFileRequestV2DataSource dataSource; + + private String value; + + private String vaultId; + + private Optional> redactionLevel = Optional.empty(); + + private Optional dataFormat = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ReidentifyFileRequestV2 other) { + dataSource(other.getDataSource()); + value(other.getValue()); + dataFormat(other.getDataFormat()); + vaultId(other.getVaultId()); + redactionLevel(other.getRedactionLevel()); + return this; + } + + /** + *

Data source of the input file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("dataSource") + public ValueStage dataSource(@NotNull ReidentifyFileRequestV2DataSource dataSource) { + this.dataSource = Objects.requireNonNull(dataSource, "dataSource must not be null"); + return this; + } + + /** + *

File data corresponding to the specified dataSource type.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("value") + public VaultIdStage value(@NotNull String value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + /** + *

ID of the vault used for de-identification.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultId") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set redactionType for FlowVault and redactionPattern for SkyVaultto specify the replacement.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redactionLevel(List redactionLevel) { + this.redactionLevel = Optional.ofNullable(redactionLevel); + return this; + } + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set redactionType for FlowVault and redactionPattern for SkyVaultto specify the replacement.

+ */ + @java.lang.Override + @JsonSetter(value = "redactionLevel", nulls = Nulls.SKIP) + public _FinalStage redactionLevel(Optional> redactionLevel) { + this.redactionLevel = redactionLevel; + return this; + } + + /** + *

Format of the input file. Limited to the formats that support the VAULT_TOKEN de-identification type.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage dataFormat(ReidentifyFileRequestV2DataFormat dataFormat) { + this.dataFormat = Optional.ofNullable(dataFormat); + return this; + } + + /** + *

Format of the input file. Limited to the formats that support the VAULT_TOKEN de-identification type.

+ */ + @java.lang.Override + @JsonSetter(value = "dataFormat", nulls = Nulls.SKIP) + public _FinalStage dataFormat(Optional dataFormat) { + this.dataFormat = dataFormat; + return this; + } + + @java.lang.Override + public ReidentifyFileRequestV2 build() { + return new ReidentifyFileRequestV2( + dataSource, value, dataFormat, vaultId, redactionLevel, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java new file mode 100644 index 00000000..6a4aaf01 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java @@ -0,0 +1,301 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DeidentifyFileRequestV2DataFormat { + public static final DeidentifyFileRequestV2DataFormat BMP = new DeidentifyFileRequestV2DataFormat(Value.BMP, "bmp"); + + public static final DeidentifyFileRequestV2DataFormat PPTX = + new DeidentifyFileRequestV2DataFormat(Value.PPTX, "pptx"); + + public static final DeidentifyFileRequestV2DataFormat WAV = new DeidentifyFileRequestV2DataFormat(Value.WAV, "wav"); + + public static final DeidentifyFileRequestV2DataFormat DOC = new DeidentifyFileRequestV2DataFormat(Value.DOC, "doc"); + + public static final DeidentifyFileRequestV2DataFormat XML = new DeidentifyFileRequestV2DataFormat(Value.XML, "xml"); + + public static final DeidentifyFileRequestV2DataFormat ZIP = new DeidentifyFileRequestV2DataFormat(Value.ZIP, "zip"); + + public static final DeidentifyFileRequestV2DataFormat MP3 = new DeidentifyFileRequestV2DataFormat(Value.MP3, "mp3"); + + public static final DeidentifyFileRequestV2DataFormat PPT = new DeidentifyFileRequestV2DataFormat(Value.PPT, "ppt"); + + public static final DeidentifyFileRequestV2DataFormat JPEG = + new DeidentifyFileRequestV2DataFormat(Value.JPEG, "jpeg"); + + public static final DeidentifyFileRequestV2DataFormat TIFF = + new DeidentifyFileRequestV2DataFormat(Value.TIFF, "tiff"); + + public static final DeidentifyFileRequestV2DataFormat PDF = new DeidentifyFileRequestV2DataFormat(Value.PDF, "pdf"); + + public static final DeidentifyFileRequestV2DataFormat DOCX = + new DeidentifyFileRequestV2DataFormat(Value.DOCX, "docx"); + + public static final DeidentifyFileRequestV2DataFormat PNG = new DeidentifyFileRequestV2DataFormat(Value.PNG, "png"); + + public static final DeidentifyFileRequestV2DataFormat JSONL = + new DeidentifyFileRequestV2DataFormat(Value.JSONL, "jsonl"); + + public static final DeidentifyFileRequestV2DataFormat CSV = new DeidentifyFileRequestV2DataFormat(Value.CSV, "csv"); + + public static final DeidentifyFileRequestV2DataFormat JPG = new DeidentifyFileRequestV2DataFormat(Value.JPG, "jpg"); + + public static final DeidentifyFileRequestV2DataFormat DCM = new DeidentifyFileRequestV2DataFormat(Value.DCM, "dcm"); + + public static final DeidentifyFileRequestV2DataFormat JSON = + new DeidentifyFileRequestV2DataFormat(Value.JSON, "json"); + + public static final DeidentifyFileRequestV2DataFormat GIF = new DeidentifyFileRequestV2DataFormat(Value.GIF, "gif"); + + public static final DeidentifyFileRequestV2DataFormat TXT = new DeidentifyFileRequestV2DataFormat(Value.TXT, "txt"); + + public static final DeidentifyFileRequestV2DataFormat XLS = new DeidentifyFileRequestV2DataFormat(Value.XLS, "xls"); + + public static final DeidentifyFileRequestV2DataFormat XLSX = + new DeidentifyFileRequestV2DataFormat(Value.XLSX, "xlsx"); + + public static final DeidentifyFileRequestV2DataFormat TIF = new DeidentifyFileRequestV2DataFormat(Value.TIF, "tif"); + + private final Value value; + + private final String string; + + DeidentifyFileRequestV2DataFormat(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 DeidentifyFileRequestV2DataFormat + && this.string.equals(((DeidentifyFileRequestV2DataFormat) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BMP: + return visitor.visitBmp(); + case PPTX: + return visitor.visitPptx(); + case WAV: + return visitor.visitWav(); + case DOC: + return visitor.visitDoc(); + case XML: + return visitor.visitXml(); + case ZIP: + return visitor.visitZip(); + case MP3: + return visitor.visitMp3(); + case PPT: + return visitor.visitPpt(); + case JPEG: + return visitor.visitJpeg(); + case TIFF: + return visitor.visitTiff(); + case PDF: + return visitor.visitPdf(); + case DOCX: + return visitor.visitDocx(); + case PNG: + return visitor.visitPng(); + case JSONL: + return visitor.visitJsonl(); + case CSV: + return visitor.visitCsv(); + case JPG: + return visitor.visitJpg(); + case DCM: + return visitor.visitDcm(); + case JSON: + return visitor.visitJson(); + case GIF: + return visitor.visitGif(); + case TXT: + return visitor.visitTxt(); + case XLS: + return visitor.visitXls(); + case XLSX: + return visitor.visitXlsx(); + case TIF: + return visitor.visitTif(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DeidentifyFileRequestV2DataFormat valueOf(String value) { + switch (value) { + case "bmp": + return BMP; + case "pptx": + return PPTX; + case "wav": + return WAV; + case "doc": + return DOC; + case "xml": + return XML; + case "zip": + return ZIP; + case "mp3": + return MP3; + case "ppt": + return PPT; + case "jpeg": + return JPEG; + case "tiff": + return TIFF; + case "pdf": + return PDF; + case "docx": + return DOCX; + case "png": + return PNG; + case "jsonl": + return JSONL; + case "csv": + return CSV; + case "jpg": + return JPG; + case "dcm": + return DCM; + case "json": + return JSON; + case "gif": + return GIF; + case "txt": + return TXT; + case "xls": + return XLS; + case "xlsx": + return XLSX; + case "tif": + return TIF; + default: + return new DeidentifyFileRequestV2DataFormat(Value.UNKNOWN, value); + } + } + + public enum Value { + MP3, + + WAV, + + PDF, + + TXT, + + CSV, + + JSON, + + JPG, + + JPEG, + + TIF, + + TIFF, + + PNG, + + BMP, + + XLS, + + XLSX, + + DOC, + + DOCX, + + PPT, + + PPTX, + + XML, + + DCM, + + JSONL, + + ZIP, + + GIF, + + UNKNOWN + } + + public interface Visitor { + T visitMp3(); + + T visitWav(); + + T visitPdf(); + + T visitTxt(); + + T visitCsv(); + + T visitJson(); + + T visitJpg(); + + T visitJpeg(); + + T visitTif(); + + T visitTiff(); + + T visitPng(); + + T visitBmp(); + + T visitXls(); + + T visitXlsx(); + + T visitDoc(); + + T visitDocx(); + + T visitPpt(); + + T visitPptx(); + + T visitXml(); + + T visitDcm(); + + T visitJsonl(); + + T visitZip(); + + T visitGif(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java new file mode 100644 index 00000000..83c9aed3 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DeidentifyFileRequestV2DataSource { + public static final DeidentifyFileRequestV2DataSource BASE64 = + new DeidentifyFileRequestV2DataSource(Value.BASE64, "BASE64"); + + public static final DeidentifyFileRequestV2DataSource SKYFLOW_ID = + new DeidentifyFileRequestV2DataSource(Value.SKYFLOW_ID, "SKYFLOW_ID"); + + public static final DeidentifyFileRequestV2DataSource PRESIGNED_URL = + new DeidentifyFileRequestV2DataSource(Value.PRESIGNED_URL, "PRESIGNED_URL"); + + private final Value value; + + private final String string; + + DeidentifyFileRequestV2DataSource(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 DeidentifyFileRequestV2DataSource + && this.string.equals(((DeidentifyFileRequestV2DataSource) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BASE64: + return visitor.visitBase64(); + case SKYFLOW_ID: + return visitor.visitSkyflowId(); + case PRESIGNED_URL: + return visitor.visitPresignedUrl(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DeidentifyFileRequestV2DataSource valueOf(String value) { + switch (value) { + case "BASE64": + return BASE64; + case "SKYFLOW_ID": + return SKYFLOW_ID; + case "PRESIGNED_URL": + return PRESIGNED_URL; + default: + return new DeidentifyFileRequestV2DataSource(Value.UNKNOWN, value); + } + } + + public enum Value { + BASE64, + + SKYFLOW_ID, + + PRESIGNED_URL, + + UNKNOWN + } + + public interface Visitor { + T visitBase64(); + + T visitSkyflowId(); + + T visitPresignedUrl(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java new file mode 100644 index 00000000..df3c688f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java @@ -0,0 +1,149 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class ReidentifyFileRequestV2DataFormat { + public static final ReidentifyFileRequestV2DataFormat PPTX = + new ReidentifyFileRequestV2DataFormat(Value.PPTX, "pptx"); + + public static final ReidentifyFileRequestV2DataFormat JSONL = + new ReidentifyFileRequestV2DataFormat(Value.JSONL, "jsonl"); + + public static final ReidentifyFileRequestV2DataFormat CSV = new ReidentifyFileRequestV2DataFormat(Value.CSV, "csv"); + + public static final ReidentifyFileRequestV2DataFormat XML = new ReidentifyFileRequestV2DataFormat(Value.XML, "xml"); + + public static final ReidentifyFileRequestV2DataFormat JSON = + new ReidentifyFileRequestV2DataFormat(Value.JSON, "json"); + + public static final ReidentifyFileRequestV2DataFormat TXT = new ReidentifyFileRequestV2DataFormat(Value.TXT, "txt"); + + public static final ReidentifyFileRequestV2DataFormat DOCX = + new ReidentifyFileRequestV2DataFormat(Value.DOCX, "docx"); + + public static final ReidentifyFileRequestV2DataFormat XLSX = + new ReidentifyFileRequestV2DataFormat(Value.XLSX, "xlsx"); + + private final Value value; + + private final String string; + + ReidentifyFileRequestV2DataFormat(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 ReidentifyFileRequestV2DataFormat + && this.string.equals(((ReidentifyFileRequestV2DataFormat) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case PPTX: + return visitor.visitPptx(); + case JSONL: + return visitor.visitJsonl(); + case CSV: + return visitor.visitCsv(); + case XML: + return visitor.visitXml(); + case JSON: + return visitor.visitJson(); + case TXT: + return visitor.visitTxt(); + case DOCX: + return visitor.visitDocx(); + case XLSX: + return visitor.visitXlsx(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static ReidentifyFileRequestV2DataFormat valueOf(String value) { + switch (value) { + case "pptx": + return PPTX; + case "jsonl": + return JSONL; + case "csv": + return CSV; + case "xml": + return XML; + case "json": + return JSON; + case "txt": + return TXT; + case "docx": + return DOCX; + case "xlsx": + return XLSX; + default: + return new ReidentifyFileRequestV2DataFormat(Value.UNKNOWN, value); + } + } + + public enum Value { + TXT, + + CSV, + + JSON, + + XLSX, + + DOCX, + + PPTX, + + XML, + + JSONL, + + UNKNOWN + } + + public interface Visitor { + T visitTxt(); + + T visitCsv(); + + T visitJson(); + + T visitXlsx(); + + T visitDocx(); + + T visitPptx(); + + T visitXml(); + + T visitJsonl(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java new file mode 100644 index 00000000..538cbc49 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.filesv2.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class ReidentifyFileRequestV2DataSource { + public static final ReidentifyFileRequestV2DataSource BASE64 = + new ReidentifyFileRequestV2DataSource(Value.BASE64, "BASE64"); + + public static final ReidentifyFileRequestV2DataSource SKYFLOW_ID = + new ReidentifyFileRequestV2DataSource(Value.SKYFLOW_ID, "SKYFLOW_ID"); + + public static final ReidentifyFileRequestV2DataSource PRESIGNED_URL = + new ReidentifyFileRequestV2DataSource(Value.PRESIGNED_URL, "PRESIGNED_URL"); + + private final Value value; + + private final String string; + + ReidentifyFileRequestV2DataSource(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 ReidentifyFileRequestV2DataSource + && this.string.equals(((ReidentifyFileRequestV2DataSource) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BASE64: + return visitor.visitBase64(); + case SKYFLOW_ID: + return visitor.visitSkyflowId(); + case PRESIGNED_URL: + return visitor.visitPresignedUrl(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static ReidentifyFileRequestV2DataSource valueOf(String value) { + switch (value) { + case "BASE64": + return BASE64; + case "SKYFLOW_ID": + return SKYFLOW_ID; + case "PRESIGNED_URL": + return PRESIGNED_URL; + default: + return new ReidentifyFileRequestV2DataSource(Value.UNKNOWN, value); + } + } + + public enum Value { + BASE64, + + SKYFLOW_ID, + + PRESIGNED_URL, + + UNKNOWN + } + + public interface Visitor { + T visitBase64(); + + T visitSkyflowId(); + + T visitPresignedUrl(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java new file mode 100644 index 00000000..fe74a2d3 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.guardrailsv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import java.util.concurrent.CompletableFuture; + +public class AsyncGuardrailsV2Client { + protected final ClientOptions clientOptions; + + private final AsyncRawGuardrailsV2Client rawClient; + + public AsyncGuardrailsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawGuardrailsV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawGuardrailsV2Client withRawResponse() { + return this.rawClient; + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public CompletableFuture checkGuardrailsV2(DetectGuardrailsRequestV2 request) { + return this.rawClient.checkGuardrailsV2(request).thenApply(response -> response.body()); + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public CompletableFuture checkGuardrailsV2( + DetectGuardrailsRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.checkGuardrailsV2(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java new file mode 100644 index 00000000..c6b84c0e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java @@ -0,0 +1,142 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.guardrailsv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import java.io.IOException; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawGuardrailsV2Client { + protected final ClientOptions clientOptions; + + public AsyncRawGuardrailsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public CompletableFuture> checkGuardrailsV2( + DetectGuardrailsRequestV2 request) { + return checkGuardrailsV2(request, null); + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public CompletableFuture> checkGuardrailsV2( + DetectGuardrailsRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/guardrails"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, DetectGuardrailsResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java new file mode 100644 index 00000000..2d3a9bf7 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java @@ -0,0 +1,42 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.guardrailsv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; + +public class GuardrailsV2Client { + protected final ClientOptions clientOptions; + + private final RawGuardrailsV2Client rawClient; + + public GuardrailsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawGuardrailsV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawGuardrailsV2Client withRawResponse() { + return this.rawClient; + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public DetectGuardrailsResponseV2 checkGuardrailsV2(DetectGuardrailsRequestV2 request) { + return this.rawClient.checkGuardrailsV2(request).body(); + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public DetectGuardrailsResponseV2 checkGuardrailsV2( + DetectGuardrailsRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.checkGuardrailsV2(request, requestOptions).body(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java new file mode 100644 index 00000000..c124c516 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java @@ -0,0 +1,116 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.guardrailsv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawGuardrailsV2Client { + protected final ClientOptions clientOptions; + + public RawGuardrailsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse checkGuardrailsV2(DetectGuardrailsRequestV2 request) { + return checkGuardrailsV2(request, null); + } + + /** + * Preserve safety and compliance with usage policies.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse checkGuardrailsV2( + DetectGuardrailsRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/guardrails"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetectGuardrailsResponseV2.class), + response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java new file mode 100644 index 00000000..f6d8dbad --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java @@ -0,0 +1,253 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.guardrailsv2.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectGuardrailsRequestV2.Builder.class) +public final class DetectGuardrailsRequestV2 { + private final String text; + + private final Optional checkToxicity; + + private final Optional> denyTopics; + + private final String vaultId; + + private final Map additionalProperties; + + private DetectGuardrailsRequestV2( + String text, + Optional checkToxicity, + Optional> denyTopics, + String vaultId, + Map additionalProperties) { + this.text = text; + this.checkToxicity = checkToxicity; + this.denyTopics = denyTopics; + this.vaultId = vaultId; + this.additionalProperties = additionalProperties; + } + + /** + * @return Text to check against guardrails. + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * @return If true, checks for toxicity in the text. + */ + @JsonProperty("checkToxicity") + public Optional getCheckToxicity() { + return checkToxicity; + } + + /** + * @return List of topics to deny. + */ + @JsonProperty("denyTopics") + public Optional> getDenyTopics() { + return denyTopics; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultId") + public String getVaultId() { + return vaultId; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectGuardrailsRequestV2 && equalTo((DetectGuardrailsRequestV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectGuardrailsRequestV2 other) { + return text.equals(other.text) + && checkToxicity.equals(other.checkToxicity) + && denyTopics.equals(other.denyTopics) + && vaultId.equals(other.vaultId); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.text, this.checkToxicity, this.denyTopics, this.vaultId); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TextStage builder() { + return new Builder(); + } + + public interface TextStage { + /** + *

Text to check against guardrails.

+ */ + VaultIdStage text(@NotNull String text); + + Builder from(DetectGuardrailsRequestV2 other); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + } + + public interface _FinalStage { + DetectGuardrailsRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

If true, checks for toxicity in the text.

+ */ + _FinalStage checkToxicity(Optional checkToxicity); + + _FinalStage checkToxicity(Boolean checkToxicity); + + /** + *

List of topics to deny.

+ */ + _FinalStage denyTopics(Optional> denyTopics); + + _FinalStage denyTopics(List denyTopics); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TextStage, VaultIdStage, _FinalStage { + private String text; + + private String vaultId; + + private Optional> denyTopics = Optional.empty(); + + private Optional checkToxicity = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetectGuardrailsRequestV2 other) { + text(other.getText()); + checkToxicity(other.getCheckToxicity()); + denyTopics(other.getDenyTopics()); + vaultId(other.getVaultId()); + return this; + } + + /** + *

Text to check against guardrails.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("text") + public VaultIdStage text(@NotNull String text) { + this.text = Objects.requireNonNull(text, "text must not be null"); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultId") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

List of topics to deny.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage denyTopics(List denyTopics) { + this.denyTopics = Optional.ofNullable(denyTopics); + return this; + } + + /** + *

List of topics to deny.

+ */ + @java.lang.Override + @JsonSetter(value = "denyTopics", nulls = Nulls.SKIP) + public _FinalStage denyTopics(Optional> denyTopics) { + this.denyTopics = denyTopics; + return this; + } + + /** + *

If true, checks for toxicity in the text.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage checkToxicity(Boolean checkToxicity) { + this.checkToxicity = Optional.ofNullable(checkToxicity); + return this; + } + + /** + *

If true, checks for toxicity in the text.

+ */ + @java.lang.Override + @JsonSetter(value = "checkToxicity", nulls = Nulls.SKIP) + public _FinalStage checkToxicity(Optional checkToxicity) { + this.checkToxicity = checkToxicity; + return this; + } + + @java.lang.Override + public DetectGuardrailsRequestV2 build() { + return new DetectGuardrailsRequestV2(text, checkToxicity, denyTopics, vaultId, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java new file mode 100644 index 00000000..cac69231 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java @@ -0,0 +1,246 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import java.io.IOException; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawStringsV2Client { + protected final ClientOptions clientOptions; + + public AsyncRawStringsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public CompletableFuture> deidentifyStringV2( + DeidentifyStringRequestV2 request) { + return deidentifyStringV2(request, null); + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public CompletableFuture> deidentifyStringV2( + DeidentifyStringRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/deidentify/string"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, DeidentifyStringResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture> reidentifyStringV2( + ReidentifyStringRequestV2 request) { + return reidentifyStringV2(request, null); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture> reidentifyStringV2( + ReidentifyStringRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/reidentify/string"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, ReidentifyStringResponseV2.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java new file mode 100644 index 00000000..47c34f06 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java @@ -0,0 +1,60 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import java.util.concurrent.CompletableFuture; + +public class AsyncStringsV2Client { + protected final ClientOptions clientOptions; + + private final AsyncRawStringsV2Client rawClient; + + public AsyncStringsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawStringsV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawStringsV2Client withRawResponse() { + return this.rawClient; + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public CompletableFuture deidentifyStringV2(DeidentifyStringRequestV2 request) { + return this.rawClient.deidentifyStringV2(request).thenApply(response -> response.body()); + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public CompletableFuture deidentifyStringV2( + DeidentifyStringRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.deidentifyStringV2(request, requestOptions).thenApply(response -> response.body()); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture reidentifyStringV2(ReidentifyStringRequestV2 request) { + return this.rawClient.reidentifyStringV2(request).thenApply(response -> response.body()); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public CompletableFuture reidentifyStringV2( + ReidentifyStringRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.reidentifyStringV2(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java new file mode 100644 index 00000000..61f71478 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java @@ -0,0 +1,198 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.MediaTypes; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.core.RetryInterceptor; +import com.skyflow.generated.detect.rest.errors.BadRequestError; +import com.skyflow.generated.detect.rest.errors.InternalServerError; +import com.skyflow.generated.detect.rest.errors.UnauthorizedError; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawStringsV2Client { + protected final ClientOptions clientOptions; + + public RawStringsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse deidentifyStringV2(DeidentifyStringRequestV2 request) { + return deidentifyStringV2(request, null); + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse deidentifyStringV2( + DeidentifyStringRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/deidentify/string"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeidentifyStringResponseV2.class), + response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse reidentifyStringV2(ReidentifyStringRequestV2 request) { + return reidentifyStringV2(request, null); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ApiClientHttpResponse reidentifyStringV2( + ReidentifyStringRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/detect/reidentify/string"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ReidentifyStringResponseV2.class), + response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java new file mode 100644 index 00000000..2a50d897 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java @@ -0,0 +1,59 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2; + +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; + +public class StringsV2Client { + protected final ClientOptions clientOptions; + + private final RawStringsV2Client rawClient; + + public StringsV2Client(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawStringsV2Client(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawStringsV2Client withRawResponse() { + return this.rawClient; + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public DeidentifyStringResponseV2 deidentifyStringV2(DeidentifyStringRequestV2 request) { + return this.rawClient.deidentifyStringV2(request).body(); + } + + /** + * De-identifies sensitive data from a string.

Note: V2 API is in beta. + */ + public DeidentifyStringResponseV2 deidentifyStringV2( + DeidentifyStringRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.deidentifyStringV2(request, requestOptions).body(); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ReidentifyStringResponseV2 reidentifyStringV2(ReidentifyStringRequestV2 request) { + return this.rawClient.reidentifyStringV2(request).body(); + } + + /** + * Re-identifies tokens in a string.

Requires the Detect Invoker, Detect Manager, or Vault Owner role. Re-identifying vault_token values also requires a policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

Note: V2 API is in beta. + */ + public ReidentifyStringResponseV2 reidentifyStringV2( + ReidentifyStringRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.reidentifyStringV2(request, requestOptions).body(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java new file mode 100644 index 00000000..c3964a6d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java @@ -0,0 +1,206 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyStringRequestV2.Builder.class) +public final class DeidentifyStringRequestV2 { + private final String text; + + private final Optional configurationId; + + private final Optional configuration; + + private final Map additionalProperties; + + private DeidentifyStringRequestV2( + String text, + Optional configurationId, + Optional configuration, + Map additionalProperties) { + this.text = text; + this.configurationId = configurationId; + this.configuration = configuration; + this.additionalProperties = additionalProperties; + } + + /** + * @return Text to deidentify. + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * @return ID of the Detect configuration to use for de-identification. + */ + @JsonProperty("configurationId") + public Optional getConfigurationId() { + return configurationId; + } + + @JsonProperty("configuration") + public Optional getConfiguration() { + return configuration; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyStringRequestV2 && equalTo((DeidentifyStringRequestV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyStringRequestV2 other) { + return text.equals(other.text) + && configurationId.equals(other.configurationId) + && configuration.equals(other.configuration); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.text, this.configurationId, this.configuration); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TextStage builder() { + return new Builder(); + } + + public interface TextStage { + /** + *

Text to deidentify.

+ */ + _FinalStage text(@NotNull String text); + + Builder from(DeidentifyStringRequestV2 other); + } + + public interface _FinalStage { + DeidentifyStringRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

ID of the Detect configuration to use for de-identification.

+ */ + _FinalStage configurationId(Optional configurationId); + + _FinalStage configurationId(String configurationId); + + _FinalStage configuration(Optional configuration); + + _FinalStage configuration(DetectConfigV2 configuration); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TextStage, _FinalStage { + private String text; + + private Optional configuration = Optional.empty(); + + private Optional configurationId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeidentifyStringRequestV2 other) { + text(other.getText()); + configurationId(other.getConfigurationId()); + configuration(other.getConfiguration()); + return this; + } + + /** + *

Text to deidentify.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("text") + public _FinalStage text(@NotNull String text) { + this.text = Objects.requireNonNull(text, "text must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage configuration(DetectConfigV2 configuration) { + this.configuration = Optional.ofNullable(configuration); + return this; + } + + @java.lang.Override + @JsonSetter(value = "configuration", nulls = Nulls.SKIP) + public _FinalStage configuration(Optional configuration) { + this.configuration = configuration; + return this; + } + + /** + *

ID of the Detect configuration to use for de-identification.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage configurationId(String configurationId) { + this.configurationId = Optional.ofNullable(configurationId); + return this; + } + + /** + *

ID of the Detect configuration to use for de-identification.

+ */ + @java.lang.Override + @JsonSetter(value = "configurationId", nulls = Nulls.SKIP) + public _FinalStage configurationId(Optional configurationId) { + this.configurationId = configurationId; + return this; + } + + @java.lang.Override + public DeidentifyStringRequestV2 build() { + return new DeidentifyStringRequestV2(text, configurationId, configuration, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java new file mode 100644 index 00000000..b242a87b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java @@ -0,0 +1,209 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.resources.stringsv2.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.types.RedactionLevel; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ReidentifyStringRequestV2.Builder.class) +public final class ReidentifyStringRequestV2 { + private final String vaultId; + + private final String text; + + private final Optional> redactionLevel; + + private final Map additionalProperties; + + private ReidentifyStringRequestV2( + String vaultId, + String text, + Optional> redactionLevel, + Map additionalProperties) { + this.vaultId = vaultId; + this.text = text; + this.redactionLevel = redactionLevel; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault used for re-identification. Requires the Detect Invoker, Detect Manager, or Vault Owner role for this vault. Re-identifying vault_token values also requires a role or policy that separately grants the Detokenization action, unless the caller has the Vault Owner role. + */ + @JsonProperty("vaultId") + public String getVaultId() { + return vaultId; + } + + /** + * @return Text to reidentify. + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * @return Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set exactly one of tokenGroupName or entityName. Use tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set exactly one of redactionType or redactionPattern to specify the replacement. + */ + @JsonProperty("redactionLevel") + public Optional> getRedactionLevel() { + return redactionLevel; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ReidentifyStringRequestV2 && equalTo((ReidentifyStringRequestV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ReidentifyStringRequestV2 other) { + return vaultId.equals(other.vaultId) && text.equals(other.text) && redactionLevel.equals(other.redactionLevel); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.text, this.redactionLevel); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault used for re-identification. Requires the Detect Invoker, Detect Manager, or Vault Owner role for this vault. Re-identifying vault_token values also requires a role or policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

+ */ + TextStage vaultId(@NotNull String vaultId); + + Builder from(ReidentifyStringRequestV2 other); + } + + public interface TextStage { + /** + *

Text to reidentify.

+ */ + _FinalStage text(@NotNull String text); + } + + public interface _FinalStage { + ReidentifyStringRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set exactly one of tokenGroupName or entityName. Use tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set exactly one of redactionType or redactionPattern to specify the replacement.

+ */ + _FinalStage redactionLevel(Optional> redactionLevel); + + _FinalStage redactionLevel(List redactionLevel); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, TextStage, _FinalStage { + private String vaultId; + + private String text; + + private Optional> redactionLevel = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ReidentifyStringRequestV2 other) { + vaultId(other.getVaultId()); + text(other.getText()); + redactionLevel(other.getRedactionLevel()); + return this; + } + + /** + *

ID of the vault used for re-identification. Requires the Detect Invoker, Detect Manager, or Vault Owner role for this vault. Re-identifying vault_token values also requires a role or policy that separately grants the Detokenization action, unless the caller has the Vault Owner role.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultId") + public TextStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

Text to reidentify.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("text") + public _FinalStage text(@NotNull String text) { + this.text = Objects.requireNonNull(text, "text must not be null"); + return this; + } + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set exactly one of tokenGroupName or entityName. Use tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set exactly one of redactionType or redactionPattern to specify the replacement.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redactionLevel(List redactionLevel) { + this.redactionLevel = Optional.ofNullable(redactionLevel); + return this; + } + + /** + *

Replacement patterns or types applied to entity types or token groups during re-identification. Specifies a replacement pattern/type and the token group or entity type it applies to during re-identification. Set exactly one of tokenGroupName or entityName. Use tokenGroupName for FlowVault and entityName for SkyVault. Similarly, set exactly one of redactionType or redactionPattern to specify the replacement.

+ */ + @java.lang.Override + @JsonSetter(value = "redactionLevel", nulls = Nulls.SKIP) + public _FinalStage redactionLevel(Optional> redactionLevel) { + this.redactionLevel = redactionLevel; + return this; + } + + @java.lang.Override + public ReidentifyStringRequestV2 build() { + return new ReidentifyStringRequestV2(vaultId, text, redactionLevel, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java new file mode 100644 index 00000000..eb4be5de --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java @@ -0,0 +1,167 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = AudioV2.Builder.class) +public final class AudioV2 { + private final Optional outputProcessedAudio; + + private final Optional outputTranscription; + + private final Optional bleep; + + private final Map additionalProperties; + + private AudioV2( + Optional outputProcessedAudio, + Optional outputTranscription, + Optional bleep, + Map additionalProperties) { + this.outputProcessedAudio = outputProcessedAudio; + this.outputTranscription = outputTranscription; + this.bleep = bleep; + this.additionalProperties = additionalProperties; + } + + /** + * @return If true, includes processed audio file in the response. Can't be used together with outputTranscription. + */ + @JsonProperty("outputProcessedAudio") + public Optional getOutputProcessedAudio() { + return outputProcessedAudio; + } + + /** + * @return Type of transcription to include in the response. TRANSCRIPTION: standard transcript of the audio. MEDICAL_TRANSCRIPTION: transcript focused on medical content and terminology. DIARIZED_TRANSCRIPTION: speaker-separated transcript that labels each speaker's dialogue. MEDICAL_DIARIZED_TRANSCRIPTION: speaker-separated transcript focused on medical content and terminology. NONE: no transcription is included. Can't be used together with outputProcessedAudio. + */ + @JsonProperty("outputTranscription") + public Optional getOutputTranscription() { + return outputTranscription; + } + + @JsonProperty("bleep") + public Optional getBleep() { + return bleep; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof AudioV2 && equalTo((AudioV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(AudioV2 other) { + return outputProcessedAudio.equals(other.outputProcessedAudio) + && outputTranscription.equals(other.outputTranscription) + && bleep.equals(other.bleep); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.outputProcessedAudio, this.outputTranscription, this.bleep); + } + + @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 outputProcessedAudio = Optional.empty(); + + private Optional outputTranscription = Optional.empty(); + + private Optional bleep = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(AudioV2 other) { + outputProcessedAudio(other.getOutputProcessedAudio()); + outputTranscription(other.getOutputTranscription()); + bleep(other.getBleep()); + return this; + } + + /** + *

If true, includes processed audio file in the response. Can't be used together with outputTranscription.

+ */ + @JsonSetter(value = "outputProcessedAudio", nulls = Nulls.SKIP) + public Builder outputProcessedAudio(Optional outputProcessedAudio) { + this.outputProcessedAudio = outputProcessedAudio; + return this; + } + + public Builder outputProcessedAudio(Boolean outputProcessedAudio) { + this.outputProcessedAudio = Optional.ofNullable(outputProcessedAudio); + return this; + } + + /** + *

Type of transcription to include in the response. TRANSCRIPTION: standard transcript of the audio. MEDICAL_TRANSCRIPTION: transcript focused on medical content and terminology. DIARIZED_TRANSCRIPTION: speaker-separated transcript that labels each speaker's dialogue. MEDICAL_DIARIZED_TRANSCRIPTION: speaker-separated transcript focused on medical content and terminology. NONE: no transcription is included. Can't be used together with outputProcessedAudio.

+ */ + @JsonSetter(value = "outputTranscription", nulls = Nulls.SKIP) + public Builder outputTranscription(Optional outputTranscription) { + this.outputTranscription = outputTranscription; + return this; + } + + public Builder outputTranscription(AudioV2OutputTranscription outputTranscription) { + this.outputTranscription = Optional.ofNullable(outputTranscription); + return this; + } + + @JsonSetter(value = "bleep", nulls = Nulls.SKIP) + public Builder bleep(Optional bleep) { + this.bleep = bleep; + return this; + } + + public Builder bleep(AudioV2Bleep bleep) { + this.bleep = Optional.ofNullable(bleep); + return this; + } + + public AudioV2 build() { + return new AudioV2(outputProcessedAudio, outputTranscription, bleep, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java new file mode 100644 index 00000000..eb234230 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java @@ -0,0 +1,203 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = AudioV2Bleep.Builder.class) +public final class AudioV2Bleep { + private final Optional startPadding; + + private final Optional stopPadding; + + private final Optional frequency; + + private final Optional gain; + + private final Map additionalProperties; + + private AudioV2Bleep( + Optional startPadding, + Optional stopPadding, + Optional frequency, + Optional gain, + Map additionalProperties) { + this.startPadding = startPadding; + this.stopPadding = stopPadding; + this.frequency = frequency; + this.gain = gain; + this.additionalProperties = additionalProperties; + } + + /** + * @return Padding added to the beginning of a bleep, in seconds. Range: 0–20. Defaults to 0.5. + */ + @JsonProperty("startPadding") + public Optional getStartPadding() { + return startPadding; + } + + /** + * @return Padding added to the end of a bleep, in seconds. Range: 0–20. Defaults to 0.2. + */ + @JsonProperty("stopPadding") + public Optional getStopPadding() { + return stopPadding; + } + + /** + * @return Frequency of the sine wave used for the bleep sound, in Hz. + */ + @JsonProperty("frequency") + public Optional getFrequency() { + return frequency; + } + + /** + * @return Relative loudness of the bleep. Positive values increase loudness and negative values decrease it. + */ + @JsonProperty("gain") + public Optional getGain() { + return gain; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof AudioV2Bleep && equalTo((AudioV2Bleep) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(AudioV2Bleep other) { + return startPadding.equals(other.startPadding) + && stopPadding.equals(other.stopPadding) + && frequency.equals(other.frequency) + && gain.equals(other.gain); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.startPadding, this.stopPadding, this.frequency, this.gain); + } + + @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 startPadding = Optional.empty(); + + private Optional stopPadding = Optional.empty(); + + private Optional frequency = Optional.empty(); + + private Optional gain = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(AudioV2Bleep other) { + startPadding(other.getStartPadding()); + stopPadding(other.getStopPadding()); + frequency(other.getFrequency()); + gain(other.getGain()); + return this; + } + + /** + *

Padding added to the beginning of a bleep, in seconds. Range: 0–20. Defaults to 0.5.

+ */ + @JsonSetter(value = "startPadding", nulls = Nulls.SKIP) + public Builder startPadding(Optional startPadding) { + this.startPadding = startPadding; + return this; + } + + public Builder startPadding(Float startPadding) { + this.startPadding = Optional.ofNullable(startPadding); + return this; + } + + /** + *

Padding added to the end of a bleep, in seconds. Range: 0–20. Defaults to 0.2.

+ */ + @JsonSetter(value = "stopPadding", nulls = Nulls.SKIP) + public Builder stopPadding(Optional stopPadding) { + this.stopPadding = stopPadding; + return this; + } + + public Builder stopPadding(Float stopPadding) { + this.stopPadding = Optional.ofNullable(stopPadding); + return this; + } + + /** + *

Frequency of the sine wave used for the bleep sound, in Hz.

+ */ + @JsonSetter(value = "frequency", nulls = Nulls.SKIP) + public Builder frequency(Optional frequency) { + this.frequency = frequency; + return this; + } + + public Builder frequency(Integer frequency) { + this.frequency = Optional.ofNullable(frequency); + return this; + } + + /** + *

Relative loudness of the bleep. Positive values increase loudness and negative values decrease it.

+ */ + @JsonSetter(value = "gain", nulls = Nulls.SKIP) + public Builder gain(Optional gain) { + this.gain = gain; + return this; + } + + public Builder gain(Integer gain) { + this.gain = Optional.ofNullable(gain); + return this; + } + + public AudioV2Bleep build() { + return new AudioV2Bleep(startPadding, stopPadding, frequency, gain, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java new file mode 100644 index 00000000..9d48255f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java @@ -0,0 +1,118 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class AudioV2OutputTranscription { + public static final AudioV2OutputTranscription NONE = new AudioV2OutputTranscription(Value.NONE, "NONE"); + + public static final AudioV2OutputTranscription TRANSCRIPTION = + new AudioV2OutputTranscription(Value.TRANSCRIPTION, "TRANSCRIPTION"); + + public static final AudioV2OutputTranscription MEDICAL_TRANSCRIPTION = + new AudioV2OutputTranscription(Value.MEDICAL_TRANSCRIPTION, "MEDICAL_TRANSCRIPTION"); + + public static final AudioV2OutputTranscription DIARIZED_TRANSCRIPTION = + new AudioV2OutputTranscription(Value.DIARIZED_TRANSCRIPTION, "DIARIZED_TRANSCRIPTION"); + + public static final AudioV2OutputTranscription MEDICAL_DIARIZED_TRANSCRIPTION = + new AudioV2OutputTranscription(Value.MEDICAL_DIARIZED_TRANSCRIPTION, "MEDICAL_DIARIZED_TRANSCRIPTION"); + + private final Value value; + + private final String string; + + AudioV2OutputTranscription(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 AudioV2OutputTranscription + && this.string.equals(((AudioV2OutputTranscription) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case NONE: + return visitor.visitNone(); + case TRANSCRIPTION: + return visitor.visitTranscription(); + case MEDICAL_TRANSCRIPTION: + return visitor.visitMedicalTranscription(); + case DIARIZED_TRANSCRIPTION: + return visitor.visitDiarizedTranscription(); + case MEDICAL_DIARIZED_TRANSCRIPTION: + return visitor.visitMedicalDiarizedTranscription(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static AudioV2OutputTranscription valueOf(String value) { + switch (value) { + case "NONE": + return NONE; + case "TRANSCRIPTION": + return TRANSCRIPTION; + case "MEDICAL_TRANSCRIPTION": + return MEDICAL_TRANSCRIPTION; + case "DIARIZED_TRANSCRIPTION": + return DIARIZED_TRANSCRIPTION; + case "MEDICAL_DIARIZED_TRANSCRIPTION": + return MEDICAL_DIARIZED_TRANSCRIPTION; + default: + return new AudioV2OutputTranscription(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + TRANSCRIPTION, + + MEDICAL_TRANSCRIPTION, + + DIARIZED_TRANSCRIPTION, + + MEDICAL_DIARIZED_TRANSCRIPTION, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitTranscription(); + + T visitMedicalTranscription(); + + T visitDiarizedTranscription(); + + T visitMedicalDiarizedTranscription(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java new file mode 100644 index 00000000..fa5b77eb --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java @@ -0,0 +1,111 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyFileResponseV2.Builder.class) +public final class DeidentifyFileResponseV2 { + private final Optional runId; + + private final Map additionalProperties; + + private DeidentifyFileResponseV2(Optional runId, Map additionalProperties) { + this.runId = runId; + this.additionalProperties = additionalProperties; + } + + /** + * @return Run ID of the deidentification request. + */ + @JsonProperty("runId") + public Optional getRunId() { + return runId; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyFileResponseV2 && equalTo((DeidentifyFileResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyFileResponseV2 other) { + return runId.equals(other.runId); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.runId); + } + + @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 runId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeidentifyFileResponseV2 other) { + runId(other.getRunId()); + return this; + } + + /** + *

Run ID of the deidentification request.

+ */ + @JsonSetter(value = "runId", nulls = Nulls.SKIP) + public Builder runId(Optional runId) { + this.runId = runId; + return this; + } + + public Builder runId(String runId) { + this.runId = Optional.ofNullable(runId); + return this; + } + + public DeidentifyFileResponseV2 build() { + return new DeidentifyFileResponseV2(runId, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java new file mode 100644 index 00000000..eb0eca2d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java @@ -0,0 +1,168 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyStringResponseV2.Builder.class) +public final class DeidentifyStringResponseV2 { + private final Optional processedText; + + private final Optional> entities; + + private final Optional metrics; + + private final Map additionalProperties; + + private DeidentifyStringResponseV2( + Optional processedText, + Optional> entities, + Optional metrics, + Map additionalProperties) { + this.processedText = processedText; + this.entities = entities; + this.metrics = metrics; + this.additionalProperties = additionalProperties; + } + + /** + * @return Deidentified text with sensitive entities replaced. + */ + @JsonProperty("processedText") + public Optional getProcessedText() { + return processedText; + } + + /** + * @return Detected entities. + */ + @JsonProperty("entities") + public Optional> getEntities() { + return entities; + } + + @JsonProperty("metrics") + public Optional getMetrics() { + return metrics; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyStringResponseV2 && equalTo((DeidentifyStringResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyStringResponseV2 other) { + return processedText.equals(other.processedText) + && entities.equals(other.entities) + && metrics.equals(other.metrics); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.processedText, this.entities, this.metrics); + } + + @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 processedText = Optional.empty(); + + private Optional> entities = Optional.empty(); + + private Optional metrics = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeidentifyStringResponseV2 other) { + processedText(other.getProcessedText()); + entities(other.getEntities()); + metrics(other.getMetrics()); + return this; + } + + /** + *

Deidentified text with sensitive entities replaced.

+ */ + @JsonSetter(value = "processedText", nulls = Nulls.SKIP) + public Builder processedText(Optional processedText) { + this.processedText = processedText; + return this; + } + + public Builder processedText(String processedText) { + this.processedText = Optional.ofNullable(processedText); + return this; + } + + /** + *

Detected entities.

+ */ + @JsonSetter(value = "entities", nulls = Nulls.SKIP) + public Builder entities(Optional> entities) { + this.entities = entities; + return this; + } + + public Builder entities(List entities) { + this.entities = Optional.ofNullable(entities); + return this; + } + + @JsonSetter(value = "metrics", nulls = Nulls.SKIP) + public Builder metrics(Optional metrics) { + this.metrics = metrics; + return this; + } + + public Builder metrics(Metrics metrics) { + this.metrics = Optional.ofNullable(metrics); + return this; + } + + public DeidentifyStringResponseV2 build() { + return new DeidentifyStringResponseV2(processedText, entities, metrics, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java new file mode 100644 index 00000000..e3bf15bd --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java @@ -0,0 +1,229 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyStringResponseV2DetectedEntity.Builder.class) +public final class DeidentifyStringResponseV2DetectedEntity { + private final Optional token; + + private final Optional value; + + private final Optional location; + + private final Optional entityType; + + private final Optional> entityScores; + + private final Map additionalProperties; + + private DeidentifyStringResponseV2DetectedEntity( + Optional token, + Optional value, + Optional location, + Optional entityType, + Optional> entityScores, + Map additionalProperties) { + this.token = token; + this.value = value; + this.location = location; + this.entityType = entityType; + this.entityScores = entityScores; + this.additionalProperties = additionalProperties; + } + + /** + * @return Processed text of the entity. + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + /** + * @return Original text of the entity. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + @JsonProperty("location") + public Optional getLocation() { + return location; + } + + /** + * @return Highest-rated label. + */ + @JsonProperty("entityType") + public Optional getEntityType() { + return entityType; + } + + /** + * @return Labels and their scores. + */ + @JsonProperty("entityScores") + public Optional> getEntityScores() { + return entityScores; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyStringResponseV2DetectedEntity + && equalTo((DeidentifyStringResponseV2DetectedEntity) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyStringResponseV2DetectedEntity other) { + return token.equals(other.token) + && value.equals(other.value) + && location.equals(other.location) + && entityType.equals(other.entityType) + && entityScores.equals(other.entityScores); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.location, this.entityType, this.entityScores); + } + + @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 token = Optional.empty(); + + private Optional value = Optional.empty(); + + private Optional location = Optional.empty(); + + private Optional entityType = Optional.empty(); + + private Optional> entityScores = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeidentifyStringResponseV2DetectedEntity other) { + token(other.getToken()); + value(other.getValue()); + location(other.getLocation()); + entityType(other.getEntityType()); + entityScores(other.getEntityScores()); + return this; + } + + /** + *

Processed text of the entity.

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(String token) { + this.token = Optional.ofNullable(token); + return this; + } + + /** + *

Original text of the entity.

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + @JsonSetter(value = "location", nulls = Nulls.SKIP) + public Builder location(Optional location) { + this.location = location; + return this; + } + + public Builder location(DeidentifyStringResponseV2EntityLocation location) { + this.location = Optional.ofNullable(location); + return this; + } + + /** + *

Highest-rated label.

+ */ + @JsonSetter(value = "entityType", nulls = Nulls.SKIP) + public Builder entityType(Optional entityType) { + this.entityType = entityType; + return this; + } + + public Builder entityType(String entityType) { + this.entityType = Optional.ofNullable(entityType); + return this; + } + + /** + *

Labels and their scores.

+ */ + @JsonSetter(value = "entityScores", nulls = Nulls.SKIP) + public Builder entityScores(Optional> entityScores) { + this.entityScores = entityScores; + return this; + } + + public Builder entityScores(Map entityScores) { + this.entityScores = Optional.ofNullable(entityScores); + return this; + } + + public DeidentifyStringResponseV2DetectedEntity build() { + return new DeidentifyStringResponseV2DetectedEntity( + token, value, location, entityType, entityScores, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java new file mode 100644 index 00000000..6ac6a633 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java @@ -0,0 +1,205 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeidentifyStringResponseV2EntityLocation.Builder.class) +public final class DeidentifyStringResponseV2EntityLocation { + private final Optional startIndex; + + private final Optional endIndex; + + private final Optional startIndexProcessed; + + private final Optional endIndexProcessed; + + private final Map additionalProperties; + + private DeidentifyStringResponseV2EntityLocation( + Optional startIndex, + Optional endIndex, + Optional startIndexProcessed, + Optional endIndexProcessed, + Map additionalProperties) { + this.startIndex = startIndex; + this.endIndex = endIndex; + this.startIndexProcessed = startIndexProcessed; + this.endIndexProcessed = endIndexProcessed; + this.additionalProperties = additionalProperties; + } + + /** + * @return Index of the first character of the string in the original text. + */ + @JsonProperty("startIndex") + public Optional getStartIndex() { + return startIndex; + } + + /** + * @return Index of the last character of the string in the original text. + */ + @JsonProperty("endIndex") + public Optional getEndIndex() { + return endIndex; + } + + /** + * @return Index of the first character of the string in the processed text. + */ + @JsonProperty("startIndexProcessed") + public Optional getStartIndexProcessed() { + return startIndexProcessed; + } + + /** + * @return Index of the last character of the string in the processed text. + */ + @JsonProperty("endIndexProcessed") + public Optional getEndIndexProcessed() { + return endIndexProcessed; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeidentifyStringResponseV2EntityLocation + && equalTo((DeidentifyStringResponseV2EntityLocation) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeidentifyStringResponseV2EntityLocation other) { + return startIndex.equals(other.startIndex) + && endIndex.equals(other.endIndex) + && startIndexProcessed.equals(other.startIndexProcessed) + && endIndexProcessed.equals(other.endIndexProcessed); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.startIndex, this.endIndex, this.startIndexProcessed, this.endIndexProcessed); + } + + @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 startIndex = Optional.empty(); + + private Optional endIndex = Optional.empty(); + + private Optional startIndexProcessed = Optional.empty(); + + private Optional endIndexProcessed = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeidentifyStringResponseV2EntityLocation other) { + startIndex(other.getStartIndex()); + endIndex(other.getEndIndex()); + startIndexProcessed(other.getStartIndexProcessed()); + endIndexProcessed(other.getEndIndexProcessed()); + return this; + } + + /** + *

Index of the first character of the string in the original text.

+ */ + @JsonSetter(value = "startIndex", nulls = Nulls.SKIP) + public Builder startIndex(Optional startIndex) { + this.startIndex = startIndex; + return this; + } + + public Builder startIndex(Integer startIndex) { + this.startIndex = Optional.ofNullable(startIndex); + return this; + } + + /** + *

Index of the last character of the string in the original text.

+ */ + @JsonSetter(value = "endIndex", nulls = Nulls.SKIP) + public Builder endIndex(Optional endIndex) { + this.endIndex = endIndex; + return this; + } + + public Builder endIndex(Integer endIndex) { + this.endIndex = Optional.ofNullable(endIndex); + return this; + } + + /** + *

Index of the first character of the string in the processed text.

+ */ + @JsonSetter(value = "startIndexProcessed", nulls = Nulls.SKIP) + public Builder startIndexProcessed(Optional startIndexProcessed) { + this.startIndexProcessed = startIndexProcessed; + return this; + } + + public Builder startIndexProcessed(Integer startIndexProcessed) { + this.startIndexProcessed = Optional.ofNullable(startIndexProcessed); + return this; + } + + /** + *

Index of the last character of the string in the processed text.

+ */ + @JsonSetter(value = "endIndexProcessed", nulls = Nulls.SKIP) + public Builder endIndexProcessed(Optional endIndexProcessed) { + this.endIndexProcessed = endIndexProcessed; + return this; + } + + public Builder endIndexProcessed(Integer endIndexProcessed) { + this.endIndexProcessed = Optional.ofNullable(endIndexProcessed); + return this; + } + + public DeidentifyStringResponseV2EntityLocation build() { + return new DeidentifyStringResponseV2EntityLocation( + startIndex, endIndex, startIndexProcessed, endIndexProcessed, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java new file mode 100644 index 00000000..4935b1d0 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java @@ -0,0 +1,266 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = Detect.Builder.class) +public final class Detect { + private final Optional> entities; + + private final Optional> objectEntities; + + private final Optional> restrict; + + private final Optional> skip; + + private final Optional> customTypes; + + private final Optional returnEntities; + + private final Map additionalProperties; + + private Detect( + Optional> entities, + Optional> objectEntities, + Optional> restrict, + Optional> skip, + Optional> customTypes, + Optional returnEntities, + Map additionalProperties) { + this.entities = entities; + this.objectEntities = objectEntities; + this.restrict = restrict; + this.skip = skip; + this.customTypes = customTypes; + this.returnEntities = returnEntities; + this.additionalProperties = additionalProperties; + } + + /** + * @return Entities and their deidentification settings. + */ + @JsonProperty("entities") + public Optional> getEntities() { + return entities; + } + + /** + * @return Object entities and their deidentification settings. + */ + @JsonProperty("objectEntities") + public Optional> getObjectEntities() { + return objectEntities; + } + + /** + * @return Settings for restricting detected entities. A detected entity is replaced with '[RESTRICTED]' only when a restrict pattern matches the entity's full value. If a pattern matches only a substring of the detected entity, the pattern is ignored and the entity is processed according to the configured tokenization and transformation settings. Patterns don't match across entity boundaries. If an entity matches both a skip and a restrict pattern, skip takes precedence and the entity is displayed in plaintext. Note: Vault tokens are currently not supported. + */ + @JsonProperty("restrict") + public Optional> getRestrict() { + return restrict; + } + + /** + * @return Settings for bypassing deidentification on detected entities. A detected entity is displayed in plaintext when a skip pattern matches either the entity's full value or any substring of it. Patterns don't match across entity boundaries. If an entity matches both a skip and a restrict pattern, skip takes precedence and the entity is displayed in plaintext. + */ + @JsonProperty("skip") + public Optional> getSkip() { + return skip; + } + + /** + * @return Custom entity type definitions. + */ + @JsonProperty("customTypes") + public Optional> getCustomTypes() { + return customTypes; + } + + /** + * @return Controls which detected entities are returned in the response. EXCLUDE_SENSITIVE_DATA: returns each detected entity's metadata (token, entity type, location, and confidence scores) but omits the original sensitive value. ALL: returns each detected entity's metadata and the original sensitive value. NONE: doesn't return detected entities. + */ + @JsonProperty("returnEntities") + public Optional getReturnEntities() { + return returnEntities; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof Detect && equalTo((Detect) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(Detect other) { + return entities.equals(other.entities) + && objectEntities.equals(other.objectEntities) + && restrict.equals(other.restrict) + && skip.equals(other.skip) + && customTypes.equals(other.customTypes) + && returnEntities.equals(other.returnEntities); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.entities, this.objectEntities, this.restrict, this.skip, this.customTypes, this.returnEntities); + } + + @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> entities = Optional.empty(); + + private Optional> objectEntities = Optional.empty(); + + private Optional> restrict = Optional.empty(); + + private Optional> skip = Optional.empty(); + + private Optional> customTypes = Optional.empty(); + + private Optional returnEntities = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(Detect other) { + entities(other.getEntities()); + objectEntities(other.getObjectEntities()); + restrict(other.getRestrict()); + skip(other.getSkip()); + customTypes(other.getCustomTypes()); + returnEntities(other.getReturnEntities()); + return this; + } + + /** + *

Entities and their deidentification settings.

+ */ + @JsonSetter(value = "entities", nulls = Nulls.SKIP) + public Builder entities(Optional> entities) { + this.entities = entities; + return this; + } + + public Builder entities(List entities) { + this.entities = Optional.ofNullable(entities); + return this; + } + + /** + *

Object entities and their deidentification settings.

+ */ + @JsonSetter(value = "objectEntities", nulls = Nulls.SKIP) + public Builder objectEntities(Optional> objectEntities) { + this.objectEntities = objectEntities; + return this; + } + + public Builder objectEntities(List objectEntities) { + this.objectEntities = Optional.ofNullable(objectEntities); + return this; + } + + /** + *

Settings for restricting detected entities. A detected entity is replaced with '[RESTRICTED]' only when a restrict pattern matches the entity's full value. If a pattern matches only a substring of the detected entity, the pattern is ignored and the entity is processed according to the configured tokenization and transformation settings. Patterns don't match across entity boundaries. If an entity matches both a skip and a restrict pattern, skip takes precedence and the entity is displayed in plaintext. Note: Vault tokens are currently not supported.

+ */ + @JsonSetter(value = "restrict", nulls = Nulls.SKIP) + public Builder restrict(Optional> restrict) { + this.restrict = restrict; + return this; + } + + public Builder restrict(List restrict) { + this.restrict = Optional.ofNullable(restrict); + return this; + } + + /** + *

Settings for bypassing deidentification on detected entities. A detected entity is displayed in plaintext when a skip pattern matches either the entity's full value or any substring of it. Patterns don't match across entity boundaries. If an entity matches both a skip and a restrict pattern, skip takes precedence and the entity is displayed in plaintext.

+ */ + @JsonSetter(value = "skip", nulls = Nulls.SKIP) + public Builder skip(Optional> skip) { + this.skip = skip; + return this; + } + + public Builder skip(List skip) { + this.skip = Optional.ofNullable(skip); + return this; + } + + /** + *

Custom entity type definitions.

+ */ + @JsonSetter(value = "customTypes", nulls = Nulls.SKIP) + public Builder customTypes(Optional> customTypes) { + this.customTypes = customTypes; + return this; + } + + public Builder customTypes(List customTypes) { + this.customTypes = Optional.ofNullable(customTypes); + return this; + } + + /** + *

Controls which detected entities are returned in the response. EXCLUDE_SENSITIVE_DATA: returns each detected entity's metadata (token, entity type, location, and confidence scores) but omits the original sensitive value. ALL: returns each detected entity's metadata and the original sensitive value. NONE: doesn't return detected entities.

+ */ + @JsonSetter(value = "returnEntities", nulls = Nulls.SKIP) + public Builder returnEntities(Optional returnEntities) { + this.returnEntities = returnEntities; + return this; + } + + public Builder returnEntities(DetectReturnEntities returnEntities) { + this.returnEntities = Optional.ofNullable(returnEntities); + return this; + } + + public Detect build() { + return new Detect( + entities, objectEntities, restrict, skip, customTypes, returnEntities, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java new file mode 100644 index 00000000..77f00c81 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java @@ -0,0 +1,470 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectConfigV2.Builder.class) +public final class DetectConfigV2 { + private final Optional id; + + private final Optional name; + + private final Optional namespace; + + private final Optional description; + + private final String vaultId; + + private final Optional vaultType; + + private final Optional detect; + + private final Optional> fileMapping; + + private final Optional media; + + private final Map additionalProperties; + + private DetectConfigV2( + Optional id, + Optional name, + Optional namespace, + Optional description, + String vaultId, + Optional vaultType, + Optional detect, + Optional> fileMapping, + Optional media, + Map additionalProperties) { + this.id = id; + this.name = name; + this.namespace = namespace; + this.description = description; + this.vaultId = vaultId; + this.vaultType = vaultType; + this.detect = detect; + this.fileMapping = fileMapping; + this.media = media; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the configuration. + */ + @JsonProperty("ID") + public Optional getId() { + return id; + } + + /** + * @return Name of the configuration. + */ + @JsonProperty("name") + public Optional getName() { + return name; + } + + /** + * @return Namespace of the configuration. + */ + @JsonProperty("namespace") + public Optional getNamespace() { + return namespace; + } + + /** + * @return Description of the configuration. + */ + @JsonProperty("description") + public Optional getDescription() { + return description; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultId") + public String getVaultId() { + return vaultId; + } + + /** + * @return Type of the vault. + */ + @JsonProperty("vaultType") + public Optional getVaultType() { + return vaultType; + } + + @JsonProperty("detect") + public Optional getDetect() { + return detect; + } + + /** + * @return Mappings for source and deidentified file locations. + */ + @JsonProperty("fileMapping") + public Optional> getFileMapping() { + return fileMapping; + } + + @JsonProperty("media") + public Optional getMedia() { + return media; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectConfigV2 && equalTo((DetectConfigV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectConfigV2 other) { + return id.equals(other.id) + && name.equals(other.name) + && namespace.equals(other.namespace) + && description.equals(other.description) + && vaultId.equals(other.vaultId) + && vaultType.equals(other.vaultType) + && detect.equals(other.detect) + && fileMapping.equals(other.fileMapping) + && media.equals(other.media); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.id, + this.name, + this.namespace, + this.description, + this.vaultId, + this.vaultType, + this.detect, + this.fileMapping, + this.media); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DetectConfigV2 other); + } + + public interface _FinalStage { + DetectConfigV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

ID of the configuration.

+ */ + _FinalStage id(Optional id); + + _FinalStage id(String id); + + /** + *

Name of the configuration.

+ */ + _FinalStage name(Optional name); + + _FinalStage name(String name); + + /** + *

Namespace of the configuration.

+ */ + _FinalStage namespace(Optional namespace); + + _FinalStage namespace(String namespace); + + /** + *

Description of the configuration.

+ */ + _FinalStage description(Optional description); + + _FinalStage description(String description); + + /** + *

Type of the vault.

+ */ + _FinalStage vaultType(Optional vaultType); + + _FinalStage vaultType(DetectConfigV2VaultType vaultType); + + _FinalStage detect(Optional detect); + + _FinalStage detect(Detect detect); + + /** + *

Mappings for source and deidentified file locations.

+ */ + _FinalStage fileMapping(Optional> fileMapping); + + _FinalStage fileMapping(List fileMapping); + + _FinalStage media(Optional media); + + _FinalStage media(Media media); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional media = Optional.empty(); + + private Optional> fileMapping = Optional.empty(); + + private Optional detect = Optional.empty(); + + private Optional vaultType = Optional.empty(); + + private Optional description = Optional.empty(); + + private Optional namespace = Optional.empty(); + + private Optional name = Optional.empty(); + + private Optional id = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetectConfigV2 other) { + id(other.getId()); + name(other.getName()); + namespace(other.getNamespace()); + description(other.getDescription()); + vaultId(other.getVaultId()); + vaultType(other.getVaultType()); + detect(other.getDetect()); + fileMapping(other.getFileMapping()); + media(other.getMedia()); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultId") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage media(Media media) { + this.media = Optional.ofNullable(media); + return this; + } + + @java.lang.Override + @JsonSetter(value = "media", nulls = Nulls.SKIP) + public _FinalStage media(Optional media) { + this.media = media; + return this; + } + + /** + *

Mappings for source and deidentified file locations.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage fileMapping(List fileMapping) { + this.fileMapping = Optional.ofNullable(fileMapping); + return this; + } + + /** + *

Mappings for source and deidentified file locations.

+ */ + @java.lang.Override + @JsonSetter(value = "fileMapping", nulls = Nulls.SKIP) + public _FinalStage fileMapping(Optional> fileMapping) { + this.fileMapping = fileMapping; + return this; + } + + @java.lang.Override + public _FinalStage detect(Detect detect) { + this.detect = Optional.ofNullable(detect); + return this; + } + + @java.lang.Override + @JsonSetter(value = "detect", nulls = Nulls.SKIP) + public _FinalStage detect(Optional detect) { + this.detect = detect; + return this; + } + + /** + *

Type of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage vaultType(DetectConfigV2VaultType vaultType) { + this.vaultType = Optional.ofNullable(vaultType); + return this; + } + + /** + *

Type of the vault.

+ */ + @java.lang.Override + @JsonSetter(value = "vaultType", nulls = Nulls.SKIP) + public _FinalStage vaultType(Optional vaultType) { + this.vaultType = vaultType; + return this; + } + + /** + *

Description of the configuration.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage description(String description) { + this.description = Optional.ofNullable(description); + return this; + } + + /** + *

Description of the configuration.

+ */ + @java.lang.Override + @JsonSetter(value = "description", nulls = Nulls.SKIP) + public _FinalStage description(Optional description) { + this.description = description; + return this; + } + + /** + *

Namespace of the configuration.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage namespace(String namespace) { + this.namespace = Optional.ofNullable(namespace); + return this; + } + + /** + *

Namespace of the configuration.

+ */ + @java.lang.Override + @JsonSetter(value = "namespace", nulls = Nulls.SKIP) + public _FinalStage namespace(Optional namespace) { + this.namespace = namespace; + return this; + } + + /** + *

Name of the configuration.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage name(String name) { + this.name = Optional.ofNullable(name); + return this; + } + + /** + *

Name of the configuration.

+ */ + @java.lang.Override + @JsonSetter(value = "name", nulls = Nulls.SKIP) + public _FinalStage name(Optional name) { + this.name = name; + return this; + } + + /** + *

ID of the configuration.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage id(String id) { + this.id = Optional.ofNullable(id); + return this; + } + + /** + *

ID of the configuration.

+ */ + @java.lang.Override + @JsonSetter(value = "ID", nulls = Nulls.SKIP) + public _FinalStage id(Optional id) { + this.id = id; + return this; + } + + @java.lang.Override + public DetectConfigV2 build() { + return new DetectConfigV2( + id, + name, + namespace, + description, + vaultId, + vaultType, + detect, + fileMapping, + media, + 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java new file mode 100644 index 00000000..4249b6a3 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java @@ -0,0 +1,105 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectConfigV2VaultType { + public static final DetectConfigV2VaultType PRIVACYDB = new DetectConfigV2VaultType(Value.PRIVACYDB, "PRIVACYDB"); + + public static final DetectConfigV2VaultType FLOWDB = new DetectConfigV2VaultType(Value.FLOWDB, "FLOWDB"); + + public static final DetectConfigV2VaultType NONE = new DetectConfigV2VaultType(Value.NONE, "NONE"); + + public static final DetectConfigV2VaultType FLOWDB_SCHEMALESS = + new DetectConfigV2VaultType(Value.FLOWDB_SCHEMALESS, "FLOWDB_SCHEMALESS"); + + private final Value value; + + private final String string; + + DetectConfigV2VaultType(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 DetectConfigV2VaultType + && this.string.equals(((DetectConfigV2VaultType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case PRIVACYDB: + return visitor.visitPrivacydb(); + case FLOWDB: + return visitor.visitFlowdb(); + case NONE: + return visitor.visitNone(); + case FLOWDB_SCHEMALESS: + return visitor.visitFlowdbSchemaless(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectConfigV2VaultType valueOf(String value) { + switch (value) { + case "PRIVACYDB": + return PRIVACYDB; + case "FLOWDB": + return FLOWDB; + case "NONE": + return NONE; + case "FLOWDB_SCHEMALESS": + return FLOWDB_SCHEMALESS; + default: + return new DetectConfigV2VaultType(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + PRIVACYDB, + + FLOWDB, + + FLOWDB_SCHEMALESS, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitPrivacydb(); + + T visitFlowdb(); + + T visitFlowdbSchemaless(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java new file mode 100644 index 00000000..a4db8e7c --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java @@ -0,0 +1,141 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectCustomTypes.Builder.class) +public final class DetectCustomTypes { + private final Optional label; + + private final Optional> match; + + private final Map additionalProperties; + + private DetectCustomTypes( + Optional label, Optional> match, Map additionalProperties) { + this.label = label; + this.match = match; + this.additionalProperties = additionalProperties; + } + + /** + * @return Label of the custom type. Note: Vault tokens are currently not supported. + */ + @JsonProperty("label") + public Optional getLabel() { + return label; + } + + /** + * @return Regular expressions to replace with '[<customType.label>]' enclosed in square brackets. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be redacted. Expressions don't match across entity boundaries. If a string or entity matches both skip and customType.label, the entity is displayed in plaintext. If a string is detected as an entity and a customType.match pattern matches the entire detected entity, the entity is replaced with '[<customType.label>]'. If a string is detected as an entity but a customType.match pattern only matches a substring of it, the customType.match pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. + */ + @JsonProperty("match") + public Optional> getMatch() { + return match; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectCustomTypes && equalTo((DetectCustomTypes) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectCustomTypes other) { + return label.equals(other.label) && match.equals(other.match); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.label, this.match); + } + + @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 label = Optional.empty(); + + private Optional> match = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetectCustomTypes other) { + label(other.getLabel()); + match(other.getMatch()); + return this; + } + + /** + *

Label of the custom type. Note: Vault tokens are currently not supported.

+ */ + @JsonSetter(value = "label", nulls = Nulls.SKIP) + public Builder label(Optional label) { + this.label = label; + return this; + } + + public Builder label(String label) { + this.label = Optional.ofNullable(label); + return this; + } + + /** + *

Regular expressions to replace with '[<customType.label>]' enclosed in square brackets. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be redacted. Expressions don't match across entity boundaries. If a string or entity matches both skip and customType.label, the entity is displayed in plaintext. If a string is detected as an entity and a customType.match pattern matches the entire detected entity, the entity is replaced with '[<customType.label>]'. If a string is detected as an entity but a customType.match pattern only matches a substring of it, the customType.match pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

+ */ + @JsonSetter(value = "match", nulls = Nulls.SKIP) + public Builder match(Optional> match) { + this.match = match; + return this; + } + + public Builder match(List match) { + this.match = Optional.ofNullable(match); + return this; + } + + public DetectCustomTypes build() { + return new DetectCustomTypes(label, match, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java new file mode 100644 index 00000000..472e7044 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java @@ -0,0 +1,198 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectEntity.Builder.class) +public final class DetectEntity { + private final Optional entityType; + + private final Optional deidentificationType; + + private final Optional destination; + + private final Optional transformation; + + private final Map additionalProperties; + + private DetectEntity( + Optional entityType, + Optional deidentificationType, + Optional destination, + Optional transformation, + Map additionalProperties) { + this.entityType = entityType; + this.deidentificationType = deidentificationType; + this.destination = destination; + this.transformation = transformation; + this.additionalProperties = additionalProperties; + } + + /** + * @return Type of entity to detect. + */ + @JsonProperty("entityType") + public Optional getEntityType() { + return entityType; + } + + /** + * @return Type of deidentification to apply. VAULT_TOKEN is only supported for the following file formats: txt, json, csv, xml, jsonl, docx, xlsx, pptx. + */ + @JsonProperty("deidentificationType") + public Optional getDeidentificationType() { + return deidentificationType; + } + + /** + * @return Vault destination where detected values of this entity type are stored. For vaults with a schema, specify the table and column in table.column format (for example, persons.name). For schemaless vaults, specify the token group name (for example, personTokenGroup). + */ + @JsonProperty("destination") + public Optional getDestination() { + return destination; + } + + @JsonProperty("transformation") + public Optional getTransformation() { + return transformation; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectEntity && equalTo((DetectEntity) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectEntity other) { + return entityType.equals(other.entityType) + && deidentificationType.equals(other.deidentificationType) + && destination.equals(other.destination) + && transformation.equals(other.transformation); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.entityType, this.deidentificationType, this.destination, this.transformation); + } + + @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 entityType = Optional.empty(); + + private Optional deidentificationType = Optional.empty(); + + private Optional destination = Optional.empty(); + + private Optional transformation = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetectEntity other) { + entityType(other.getEntityType()); + deidentificationType(other.getDeidentificationType()); + destination(other.getDestination()); + transformation(other.getTransformation()); + return this; + } + + /** + *

Type of entity to detect.

+ */ + @JsonSetter(value = "entityType", nulls = Nulls.SKIP) + public Builder entityType(Optional entityType) { + this.entityType = entityType; + return this; + } + + public Builder entityType(DetectEntityEntityType entityType) { + this.entityType = Optional.ofNullable(entityType); + return this; + } + + /** + *

Type of deidentification to apply. VAULT_TOKEN is only supported for the following file formats: txt, json, csv, xml, jsonl, docx, xlsx, pptx.

+ */ + @JsonSetter(value = "deidentificationType", nulls = Nulls.SKIP) + public Builder deidentificationType(Optional deidentificationType) { + this.deidentificationType = deidentificationType; + return this; + } + + public Builder deidentificationType(DetectEntityDeidentificationType deidentificationType) { + this.deidentificationType = Optional.ofNullable(deidentificationType); + return this; + } + + /** + *

Vault destination where detected values of this entity type are stored. For vaults with a schema, specify the table and column in table.column format (for example, persons.name). For schemaless vaults, specify the token group name (for example, personTokenGroup).

+ */ + @JsonSetter(value = "destination", nulls = Nulls.SKIP) + public Builder destination(Optional destination) { + this.destination = destination; + return this; + } + + public Builder destination(String destination) { + this.destination = Optional.ofNullable(destination); + return this; + } + + @JsonSetter(value = "transformation", nulls = Nulls.SKIP) + public Builder transformation(Optional transformation) { + this.transformation = transformation; + return this; + } + + public Builder transformation(EntityTransformation transformation) { + this.transformation = Optional.ofNullable(transformation); + return this; + } + + public DetectEntity build() { + return new DetectEntity( + entityType, deidentificationType, destination, transformation, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java new file mode 100644 index 00000000..26262dce --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java @@ -0,0 +1,119 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectEntityDeidentificationType { + public static final DetectEntityDeidentificationType MASK = + new DetectEntityDeidentificationType(Value.MASK, "MASK"); + + public static final DetectEntityDeidentificationType ENTITY_ONLY = + new DetectEntityDeidentificationType(Value.ENTITY_ONLY, "ENTITY_ONLY"); + + public static final DetectEntityDeidentificationType VAULT_TOKEN = + new DetectEntityDeidentificationType(Value.VAULT_TOKEN, "VAULT_TOKEN"); + + public static final DetectEntityDeidentificationType UNKNOWN = + new DetectEntityDeidentificationType(Value.UNKNOWN, "UNKNOWN"); + + public static final DetectEntityDeidentificationType ENTITY_UNIQUE_COUNTER = + new DetectEntityDeidentificationType(Value.ENTITY_UNIQUE_COUNTER, "ENTITY_UNIQUE_COUNTER"); + + private final Value value; + + private final String string; + + DetectEntityDeidentificationType(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 DetectEntityDeidentificationType + && this.string.equals(((DetectEntityDeidentificationType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case MASK: + return visitor.visitMask(); + case ENTITY_ONLY: + return visitor.visitEntityOnly(); + case VAULT_TOKEN: + return visitor.visitVaultToken(); + case UNKNOWN: + return visitor.visitUnknown(); + case ENTITY_UNIQUE_COUNTER: + return visitor.visitEntityUniqueCounter(); + case _UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectEntityDeidentificationType valueOf(String value) { + switch (value) { + case "MASK": + return MASK; + case "ENTITY_ONLY": + return ENTITY_ONLY; + case "VAULT_TOKEN": + return VAULT_TOKEN; + case "UNKNOWN": + return UNKNOWN; + case "ENTITY_UNIQUE_COUNTER": + return ENTITY_UNIQUE_COUNTER; + default: + return new DetectEntityDeidentificationType(Value._UNKNOWN, value); + } + } + + public enum Value { + UNKNOWN, + + ENTITY_UNIQUE_COUNTER, + + ENTITY_ONLY, + + VAULT_TOKEN, + + MASK, + + _UNKNOWN + } + + public interface Visitor { + T visitUnknown(); + + T visitEntityUniqueCounter(); + + T visitEntityOnly(); + + T visitVaultToken(); + + T visitMask(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java new file mode 100644 index 00000000..7e286cfc --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java @@ -0,0 +1,806 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectEntityEntityType { + public static final DetectEntityEntityType PHONE_NUMBER = + new DetectEntityEntityType(Value.PHONE_NUMBER, "PHONE_NUMBER"); + + public static final DetectEntityEntityType USERNAME = new DetectEntityEntityType(Value.USERNAME, "USERNAME"); + + public static final DetectEntityEntityType VEHICLE_ID = new DetectEntityEntityType(Value.VEHICLE_ID, "VEHICLE_ID"); + + public static final DetectEntityEntityType RELIGION = new DetectEntityEntityType(Value.RELIGION, "RELIGION"); + + public static final DetectEntityEntityType ORIGIN = new DetectEntityEntityType(Value.ORIGIN, "ORIGIN"); + + public static final DetectEntityEntityType PASSPORT_NUMBER = + new DetectEntityEntityType(Value.PASSPORT_NUMBER, "PASSPORT_NUMBER"); + + public static final DetectEntityEntityType YEAR = new DetectEntityEntityType(Value.YEAR, "YEAR"); + + public static final DetectEntityEntityType CONDITION = new DetectEntityEntityType(Value.CONDITION, "CONDITION"); + + public static final DetectEntityEntityType LOCATION = new DetectEntityEntityType(Value.LOCATION, "LOCATION"); + + public static final DetectEntityEntityType LOCATION_CITY = + new DetectEntityEntityType(Value.LOCATION_CITY, "LOCATION_CITY"); + + public static final DetectEntityEntityType LOCATION_COUNTRY = + new DetectEntityEntityType(Value.LOCATION_COUNTRY, "LOCATION_COUNTRY"); + + public static final DetectEntityEntityType PROJECT = new DetectEntityEntityType(Value.PROJECT, "PROJECT"); + + public static final DetectEntityEntityType LOCATION_ZIP = + new DetectEntityEntityType(Value.LOCATION_ZIP, "LOCATION_ZIP"); + + public static final DetectEntityEntityType NAME_MEDICAL_PROFESSIONAL = + new DetectEntityEntityType(Value.NAME_MEDICAL_PROFESSIONAL, "NAME_MEDICAL_PROFESSIONAL"); + + public static final DetectEntityEntityType BANK_ACCOUNT = + new DetectEntityEntityType(Value.BANK_ACCOUNT, "BANK_ACCOUNT"); + + public static final DetectEntityEntityType OCCUPATION = new DetectEntityEntityType(Value.OCCUPATION, "OCCUPATION"); + + public static final DetectEntityEntityType TIME = new DetectEntityEntityType(Value.TIME, "TIME"); + + public static final DetectEntityEntityType LOCATION_STATE = + new DetectEntityEntityType(Value.LOCATION_STATE, "LOCATION_STATE"); + + public static final DetectEntityEntityType EVENT = new DetectEntityEntityType(Value.EVENT, "EVENT"); + + public static final DetectEntityEntityType POLITICAL_AFFILIATION = + new DetectEntityEntityType(Value.POLITICAL_AFFILIATION, "POLITICAL_AFFILIATION"); + + public static final DetectEntityEntityType LANGUAGE = new DetectEntityEntityType(Value.LANGUAGE, "LANGUAGE"); + + public static final DetectEntityEntityType ZODIAC_SIGN = + new DetectEntityEntityType(Value.ZODIAC_SIGN, "ZODIAC_SIGN"); + + public static final DetectEntityEntityType PRODUCT = new DetectEntityEntityType(Value.PRODUCT, "PRODUCT"); + + public static final DetectEntityEntityType SEXUALITY = new DetectEntityEntityType(Value.SEXUALITY, "SEXUALITY"); + + public static final DetectEntityEntityType DURATION = new DetectEntityEntityType(Value.DURATION, "DURATION"); + + public static final DetectEntityEntityType PHYSICAL_ATTRIBUTE = + new DetectEntityEntityType(Value.PHYSICAL_ATTRIBUTE, "PHYSICAL_ATTRIBUTE"); + + public static final DetectEntityEntityType LOCATION_ADDRESS_STREET = + new DetectEntityEntityType(Value.LOCATION_ADDRESS_STREET, "LOCATION_ADDRESS_STREET"); + + public static final DetectEntityEntityType MEDICAL_PROCESS = + new DetectEntityEntityType(Value.MEDICAL_PROCESS, "MEDICAL_PROCESS"); + + public static final DetectEntityEntityType LOCATION_ADDRESS = + new DetectEntityEntityType(Value.LOCATION_ADDRESS, "LOCATION_ADDRESS"); + + public static final DetectEntityEntityType FILENAME = new DetectEntityEntityType(Value.FILENAME, "FILENAME"); + + public static final DetectEntityEntityType DOB = new DetectEntityEntityType(Value.DOB, "DOB"); + + public static final DetectEntityEntityType ORGANIZATION_MEDICAL_FACILITY = + new DetectEntityEntityType(Value.ORGANIZATION_MEDICAL_FACILITY, "ORGANIZATION_MEDICAL_FACILITY"); + + public static final DetectEntityEntityType ROUTING_NUMBER = + new DetectEntityEntityType(Value.ROUTING_NUMBER, "ROUTING_NUMBER"); + + public static final DetectEntityEntityType HEALTHCARE_NUMBER = + new DetectEntityEntityType(Value.HEALTHCARE_NUMBER, "HEALTHCARE_NUMBER"); + + public static final DetectEntityEntityType GENDER = new DetectEntityEntityType(Value.GENDER, "GENDER"); + + public static final DetectEntityEntityType NAME = new DetectEntityEntityType(Value.NAME, "NAME"); + + public static final DetectEntityEntityType DRUG = new DetectEntityEntityType(Value.DRUG, "DRUG"); + + public static final DetectEntityEntityType NONE = new DetectEntityEntityType(Value.NONE, "NONE"); + + public static final DetectEntityEntityType DATE_INTERVAL = + new DetectEntityEntityType(Value.DATE_INTERVAL, "DATE_INTERVAL"); + + public static final DetectEntityEntityType MARITAL_STATUS = + new DetectEntityEntityType(Value.MARITAL_STATUS, "MARITAL_STATUS"); + + public static final DetectEntityEntityType CORPORATE_ACTION = + new DetectEntityEntityType(Value.CORPORATE_ACTION, "CORPORATE_ACTION"); + + public static final DetectEntityEntityType AGE = new DetectEntityEntityType(Value.AGE, "AGE"); + + public static final DetectEntityEntityType CVV = new DetectEntityEntityType(Value.CVV, "CVV"); + + public static final DetectEntityEntityType NAME_GIVEN = new DetectEntityEntityType(Value.NAME_GIVEN, "NAME_GIVEN"); + + public static final DetectEntityEntityType DATE = new DetectEntityEntityType(Value.DATE, "DATE"); + + public static final DetectEntityEntityType DAY = new DetectEntityEntityType(Value.DAY, "DAY"); + + public static final DetectEntityEntityType EFFECT = new DetectEntityEntityType(Value.EFFECT, "EFFECT"); + + public static final DetectEntityEntityType MEDICAL_CODE = + new DetectEntityEntityType(Value.MEDICAL_CODE, "MEDICAL_CODE"); + + public static final DetectEntityEntityType NUMERICAL_PII = + new DetectEntityEntityType(Value.NUMERICAL_PII, "NUMERICAL_PII"); + + public static final DetectEntityEntityType TREND = new DetectEntityEntityType(Value.TREND, "TREND"); + + public static final DetectEntityEntityType INJURY = new DetectEntityEntityType(Value.INJURY, "INJURY"); + + public static final DetectEntityEntityType DRIVER_LICENSE = + new DetectEntityEntityType(Value.DRIVER_LICENSE, "DRIVER_LICENSE"); + + public static final DetectEntityEntityType ALL = new DetectEntityEntityType(Value.ALL, "ALL"); + + public static final DetectEntityEntityType ORGANIZATION_ID = + new DetectEntityEntityType(Value.ORGANIZATION_ID, "ORGANIZATION_ID"); + + public static final DetectEntityEntityType PASSWORD = new DetectEntityEntityType(Value.PASSWORD, "PASSWORD"); + + public static final DetectEntityEntityType DOSE = new DetectEntityEntityType(Value.DOSE, "DOSE"); + + public static final DetectEntityEntityType NAME_FAMILY = + new DetectEntityEntityType(Value.NAME_FAMILY, "NAME_FAMILY"); + + public static final DetectEntityEntityType MONEY = new DetectEntityEntityType(Value.MONEY, "MONEY"); + + public static final DetectEntityEntityType URL = new DetectEntityEntityType(Value.URL, "URL"); + + public static final DetectEntityEntityType LOCATION_COORDINATE = + new DetectEntityEntityType(Value.LOCATION_COORDINATE, "LOCATION_COORDINATE"); + + public static final DetectEntityEntityType FINANCIAL_METRIC = + new DetectEntityEntityType(Value.FINANCIAL_METRIC, "FINANCIAL_METRIC"); + + public static final DetectEntityEntityType ORGANIZATION = + new DetectEntityEntityType(Value.ORGANIZATION, "ORGANIZATION"); + + public static final DetectEntityEntityType IP_ADDRESS = new DetectEntityEntityType(Value.IP_ADDRESS, "IP_ADDRESS"); + + public static final DetectEntityEntityType BLOOD_TYPE = new DetectEntityEntityType(Value.BLOOD_TYPE, "BLOOD_TYPE"); + + public static final DetectEntityEntityType MONTH = new DetectEntityEntityType(Value.MONTH, "MONTH"); + + public static final DetectEntityEntityType CREDIT_CARD = + new DetectEntityEntityType(Value.CREDIT_CARD, "CREDIT_CARD"); + + public static final DetectEntityEntityType ACCOUNT_NUMBER = + new DetectEntityEntityType(Value.ACCOUNT_NUMBER, "ACCOUNT_NUMBER"); + + public static final DetectEntityEntityType CREDIT_CARD_EXPIRATION = + new DetectEntityEntityType(Value.CREDIT_CARD_EXPIRATION, "CREDIT_CARD_EXPIRATION"); + + public static final DetectEntityEntityType SSN = new DetectEntityEntityType(Value.SSN, "SSN"); + + public static final DetectEntityEntityType EMAIL_ADDRESS = + new DetectEntityEntityType(Value.EMAIL_ADDRESS, "EMAIL_ADDRESS"); + + public static final DetectEntityEntityType STATISTICS = new DetectEntityEntityType(Value.STATISTICS, "STATISTICS"); + + private final Value value; + + private final String string; + + DetectEntityEntityType(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 DetectEntityEntityType + && this.string.equals(((DetectEntityEntityType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case PHONE_NUMBER: + return visitor.visitPhoneNumber(); + case USERNAME: + return visitor.visitUsername(); + case VEHICLE_ID: + return visitor.visitVehicleId(); + case RELIGION: + return visitor.visitReligion(); + case ORIGIN: + return visitor.visitOrigin(); + case PASSPORT_NUMBER: + return visitor.visitPassportNumber(); + case YEAR: + return visitor.visitYear(); + case CONDITION: + return visitor.visitCondition(); + case LOCATION: + return visitor.visitLocation(); + case LOCATION_CITY: + return visitor.visitLocationCity(); + case LOCATION_COUNTRY: + return visitor.visitLocationCountry(); + case PROJECT: + return visitor.visitProject(); + case LOCATION_ZIP: + return visitor.visitLocationZip(); + case NAME_MEDICAL_PROFESSIONAL: + return visitor.visitNameMedicalProfessional(); + case BANK_ACCOUNT: + return visitor.visitBankAccount(); + case OCCUPATION: + return visitor.visitOccupation(); + case TIME: + return visitor.visitTime(); + case LOCATION_STATE: + return visitor.visitLocationState(); + case EVENT: + return visitor.visitEvent(); + case POLITICAL_AFFILIATION: + return visitor.visitPoliticalAffiliation(); + case LANGUAGE: + return visitor.visitLanguage(); + case ZODIAC_SIGN: + return visitor.visitZodiacSign(); + case PRODUCT: + return visitor.visitProduct(); + case SEXUALITY: + return visitor.visitSexuality(); + case DURATION: + return visitor.visitDuration(); + case PHYSICAL_ATTRIBUTE: + return visitor.visitPhysicalAttribute(); + case LOCATION_ADDRESS_STREET: + return visitor.visitLocationAddressStreet(); + case MEDICAL_PROCESS: + return visitor.visitMedicalProcess(); + case LOCATION_ADDRESS: + return visitor.visitLocationAddress(); + case FILENAME: + return visitor.visitFilename(); + case DOB: + return visitor.visitDob(); + case ORGANIZATION_MEDICAL_FACILITY: + return visitor.visitOrganizationMedicalFacility(); + case ROUTING_NUMBER: + return visitor.visitRoutingNumber(); + case HEALTHCARE_NUMBER: + return visitor.visitHealthcareNumber(); + case GENDER: + return visitor.visitGender(); + case NAME: + return visitor.visitName(); + case DRUG: + return visitor.visitDrug(); + case NONE: + return visitor.visitNone(); + case DATE_INTERVAL: + return visitor.visitDateInterval(); + case MARITAL_STATUS: + return visitor.visitMaritalStatus(); + case CORPORATE_ACTION: + return visitor.visitCorporateAction(); + case AGE: + return visitor.visitAge(); + case CVV: + return visitor.visitCvv(); + case NAME_GIVEN: + return visitor.visitNameGiven(); + case DATE: + return visitor.visitDate(); + case DAY: + return visitor.visitDay(); + case EFFECT: + return visitor.visitEffect(); + case MEDICAL_CODE: + return visitor.visitMedicalCode(); + case NUMERICAL_PII: + return visitor.visitNumericalPii(); + case TREND: + return visitor.visitTrend(); + case INJURY: + return visitor.visitInjury(); + case DRIVER_LICENSE: + return visitor.visitDriverLicense(); + case ALL: + return visitor.visitAll(); + case ORGANIZATION_ID: + return visitor.visitOrganizationId(); + case PASSWORD: + return visitor.visitPassword(); + case DOSE: + return visitor.visitDose(); + case NAME_FAMILY: + return visitor.visitNameFamily(); + case MONEY: + return visitor.visitMoney(); + case URL: + return visitor.visitUrl(); + case LOCATION_COORDINATE: + return visitor.visitLocationCoordinate(); + case FINANCIAL_METRIC: + return visitor.visitFinancialMetric(); + case ORGANIZATION: + return visitor.visitOrganization(); + case IP_ADDRESS: + return visitor.visitIpAddress(); + case BLOOD_TYPE: + return visitor.visitBloodType(); + case MONTH: + return visitor.visitMonth(); + case CREDIT_CARD: + return visitor.visitCreditCard(); + case ACCOUNT_NUMBER: + return visitor.visitAccountNumber(); + case CREDIT_CARD_EXPIRATION: + return visitor.visitCreditCardExpiration(); + case SSN: + return visitor.visitSsn(); + case EMAIL_ADDRESS: + return visitor.visitEmailAddress(); + case STATISTICS: + return visitor.visitStatistics(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectEntityEntityType valueOf(String value) { + switch (value) { + case "PHONE_NUMBER": + return PHONE_NUMBER; + case "USERNAME": + return USERNAME; + case "VEHICLE_ID": + return VEHICLE_ID; + case "RELIGION": + return RELIGION; + case "ORIGIN": + return ORIGIN; + case "PASSPORT_NUMBER": + return PASSPORT_NUMBER; + case "YEAR": + return YEAR; + case "CONDITION": + return CONDITION; + case "LOCATION": + return LOCATION; + case "LOCATION_CITY": + return LOCATION_CITY; + case "LOCATION_COUNTRY": + return LOCATION_COUNTRY; + case "PROJECT": + return PROJECT; + case "LOCATION_ZIP": + return LOCATION_ZIP; + case "NAME_MEDICAL_PROFESSIONAL": + return NAME_MEDICAL_PROFESSIONAL; + case "BANK_ACCOUNT": + return BANK_ACCOUNT; + case "OCCUPATION": + return OCCUPATION; + case "TIME": + return TIME; + case "LOCATION_STATE": + return LOCATION_STATE; + case "EVENT": + return EVENT; + case "POLITICAL_AFFILIATION": + return POLITICAL_AFFILIATION; + case "LANGUAGE": + return LANGUAGE; + case "ZODIAC_SIGN": + return ZODIAC_SIGN; + case "PRODUCT": + return PRODUCT; + case "SEXUALITY": + return SEXUALITY; + case "DURATION": + return DURATION; + case "PHYSICAL_ATTRIBUTE": + return PHYSICAL_ATTRIBUTE; + case "LOCATION_ADDRESS_STREET": + return LOCATION_ADDRESS_STREET; + case "MEDICAL_PROCESS": + return MEDICAL_PROCESS; + case "LOCATION_ADDRESS": + return LOCATION_ADDRESS; + case "FILENAME": + return FILENAME; + case "DOB": + return DOB; + case "ORGANIZATION_MEDICAL_FACILITY": + return ORGANIZATION_MEDICAL_FACILITY; + case "ROUTING_NUMBER": + return ROUTING_NUMBER; + case "HEALTHCARE_NUMBER": + return HEALTHCARE_NUMBER; + case "GENDER": + return GENDER; + case "NAME": + return NAME; + case "DRUG": + return DRUG; + case "NONE": + return NONE; + case "DATE_INTERVAL": + return DATE_INTERVAL; + case "MARITAL_STATUS": + return MARITAL_STATUS; + case "CORPORATE_ACTION": + return CORPORATE_ACTION; + case "AGE": + return AGE; + case "CVV": + return CVV; + case "NAME_GIVEN": + return NAME_GIVEN; + case "DATE": + return DATE; + case "DAY": + return DAY; + case "EFFECT": + return EFFECT; + case "MEDICAL_CODE": + return MEDICAL_CODE; + case "NUMERICAL_PII": + return NUMERICAL_PII; + case "TREND": + return TREND; + case "INJURY": + return INJURY; + case "DRIVER_LICENSE": + return DRIVER_LICENSE; + case "ALL": + return ALL; + case "ORGANIZATION_ID": + return ORGANIZATION_ID; + case "PASSWORD": + return PASSWORD; + case "DOSE": + return DOSE; + case "NAME_FAMILY": + return NAME_FAMILY; + case "MONEY": + return MONEY; + case "URL": + return URL; + case "LOCATION_COORDINATE": + return LOCATION_COORDINATE; + case "FINANCIAL_METRIC": + return FINANCIAL_METRIC; + case "ORGANIZATION": + return ORGANIZATION; + case "IP_ADDRESS": + return IP_ADDRESS; + case "BLOOD_TYPE": + return BLOOD_TYPE; + case "MONTH": + return MONTH; + case "CREDIT_CARD": + return CREDIT_CARD; + case "ACCOUNT_NUMBER": + return ACCOUNT_NUMBER; + case "CREDIT_CARD_EXPIRATION": + return CREDIT_CARD_EXPIRATION; + case "SSN": + return SSN; + case "EMAIL_ADDRESS": + return EMAIL_ADDRESS; + case "STATISTICS": + return STATISTICS; + default: + return new DetectEntityEntityType(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + BANK_ACCOUNT, + + CREDIT_CARD, + + CREDIT_CARD_EXPIRATION, + + CVV, + + DATE, + + DATE_INTERVAL, + + DOB, + + DRIVER_LICENSE, + + EMAIL_ADDRESS, + + HEALTHCARE_NUMBER, + + IP_ADDRESS, + + LOCATION, + + NAME, + + NUMERICAL_PII, + + PHONE_NUMBER, + + SSN, + + URL, + + VEHICLE_ID, + + MEDICAL_CODE, + + NAME_FAMILY, + + NAME_GIVEN, + + ACCOUNT_NUMBER, + + EVENT, + + FILENAME, + + GENDER, + + LANGUAGE, + + LOCATION_ADDRESS, + + LOCATION_CITY, + + LOCATION_COORDINATE, + + LOCATION_COUNTRY, + + LOCATION_STATE, + + LOCATION_ZIP, + + MARITAL_STATUS, + + MONEY, + + NAME_MEDICAL_PROFESSIONAL, + + OCCUPATION, + + ORGANIZATION, + + ORGANIZATION_MEDICAL_FACILITY, + + ORIGIN, + + PASSPORT_NUMBER, + + PASSWORD, + + PHYSICAL_ATTRIBUTE, + + POLITICAL_AFFILIATION, + + RELIGION, + + TIME, + + USERNAME, + + ZODIAC_SIGN, + + BLOOD_TYPE, + + CONDITION, + + DOSE, + + DRUG, + + INJURY, + + MEDICAL_PROCESS, + + STATISTICS, + + ROUTING_NUMBER, + + CORPORATE_ACTION, + + FINANCIAL_METRIC, + + PRODUCT, + + TREND, + + DURATION, + + LOCATION_ADDRESS_STREET, + + AGE, + + SEXUALITY, + + EFFECT, + + PROJECT, + + ORGANIZATION_ID, + + DAY, + + MONTH, + + YEAR, + + ALL, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitBankAccount(); + + T visitCreditCard(); + + T visitCreditCardExpiration(); + + T visitCvv(); + + T visitDate(); + + T visitDateInterval(); + + T visitDob(); + + T visitDriverLicense(); + + T visitEmailAddress(); + + T visitHealthcareNumber(); + + T visitIpAddress(); + + T visitLocation(); + + T visitName(); + + T visitNumericalPii(); + + T visitPhoneNumber(); + + T visitSsn(); + + T visitUrl(); + + T visitVehicleId(); + + T visitMedicalCode(); + + T visitNameFamily(); + + T visitNameGiven(); + + T visitAccountNumber(); + + T visitEvent(); + + T visitFilename(); + + T visitGender(); + + T visitLanguage(); + + T visitLocationAddress(); + + T visitLocationCity(); + + T visitLocationCoordinate(); + + T visitLocationCountry(); + + T visitLocationState(); + + T visitLocationZip(); + + T visitMaritalStatus(); + + T visitMoney(); + + T visitNameMedicalProfessional(); + + T visitOccupation(); + + T visitOrganization(); + + T visitOrganizationMedicalFacility(); + + T visitOrigin(); + + T visitPassportNumber(); + + T visitPassword(); + + T visitPhysicalAttribute(); + + T visitPoliticalAffiliation(); + + T visitReligion(); + + T visitTime(); + + T visitUsername(); + + T visitZodiacSign(); + + T visitBloodType(); + + T visitCondition(); + + T visitDose(); + + T visitDrug(); + + T visitInjury(); + + T visitMedicalProcess(); + + T visitStatistics(); + + T visitRoutingNumber(); + + T visitCorporateAction(); + + T visitFinancialMetric(); + + T visitProduct(); + + T visitTrend(); + + T visitDuration(); + + T visitLocationAddressStreet(); + + T visitAge(); + + T visitSexuality(); + + T visitEffect(); + + T visitProject(); + + T visitOrganizationId(); + + T visitDay(); + + T visitMonth(); + + T visitYear(); + + T visitAll(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java new file mode 100644 index 00000000..ca14dc32 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java @@ -0,0 +1,252 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectGuardrailsResponseV2.Builder.class) +public final class DetectGuardrailsResponseV2 { + private final String text; + + private final Optional toxic; + + private final Optional deniedTopic; + + private final DetectGuardrailsResponseV2Validation validation; + + private final Map additionalProperties; + + private DetectGuardrailsResponseV2( + String text, + Optional toxic, + Optional deniedTopic, + DetectGuardrailsResponseV2Validation validation, + Map additionalProperties) { + this.text = text; + this.toxic = toxic; + this.deniedTopic = deniedTopic; + this.validation = validation; + this.additionalProperties = additionalProperties; + } + + /** + * @return Text that was checked against guardrails. + */ + @JsonProperty("text") + public String getText() { + return text; + } + + /** + * @return Whether the text is toxic. + */ + @JsonProperty("toxic") + public Optional getToxic() { + return toxic; + } + + /** + * @return Whether the text included a denied topic. + */ + @JsonProperty("deniedTopic") + public Optional getDeniedTopic() { + return deniedTopic; + } + + /** + * @return Whether the text passed validation. + */ + @JsonProperty("validation") + public DetectGuardrailsResponseV2Validation getValidation() { + return validation; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectGuardrailsResponseV2 && equalTo((DetectGuardrailsResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectGuardrailsResponseV2 other) { + return text.equals(other.text) + && toxic.equals(other.toxic) + && deniedTopic.equals(other.deniedTopic) + && validation.equals(other.validation); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.text, this.toxic, this.deniedTopic, this.validation); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TextStage builder() { + return new Builder(); + } + + public interface TextStage { + /** + *

Text that was checked against guardrails.

+ */ + ValidationStage text(@NotNull String text); + + Builder from(DetectGuardrailsResponseV2 other); + } + + public interface ValidationStage { + /** + *

Whether the text passed validation.

+ */ + _FinalStage validation(@NotNull DetectGuardrailsResponseV2Validation validation); + } + + public interface _FinalStage { + DetectGuardrailsResponseV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

Whether the text is toxic.

+ */ + _FinalStage toxic(Optional toxic); + + _FinalStage toxic(Boolean toxic); + + /** + *

Whether the text included a denied topic.

+ */ + _FinalStage deniedTopic(Optional deniedTopic); + + _FinalStage deniedTopic(Boolean deniedTopic); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TextStage, ValidationStage, _FinalStage { + private String text; + + private DetectGuardrailsResponseV2Validation validation; + + private Optional deniedTopic = Optional.empty(); + + private Optional toxic = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetectGuardrailsResponseV2 other) { + text(other.getText()); + toxic(other.getToxic()); + deniedTopic(other.getDeniedTopic()); + validation(other.getValidation()); + return this; + } + + /** + *

Text that was checked against guardrails.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("text") + public ValidationStage text(@NotNull String text) { + this.text = Objects.requireNonNull(text, "text must not be null"); + return this; + } + + /** + *

Whether the text passed validation.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("validation") + public _FinalStage validation(@NotNull DetectGuardrailsResponseV2Validation validation) { + this.validation = Objects.requireNonNull(validation, "validation must not be null"); + return this; + } + + /** + *

Whether the text included a denied topic.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage deniedTopic(Boolean deniedTopic) { + this.deniedTopic = Optional.ofNullable(deniedTopic); + return this; + } + + /** + *

Whether the text included a denied topic.

+ */ + @java.lang.Override + @JsonSetter(value = "deniedTopic", nulls = Nulls.SKIP) + public _FinalStage deniedTopic(Optional deniedTopic) { + this.deniedTopic = deniedTopic; + return this; + } + + /** + *

Whether the text is toxic.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage toxic(Boolean toxic) { + this.toxic = Optional.ofNullable(toxic); + return this; + } + + /** + *

Whether the text is toxic.

+ */ + @java.lang.Override + @JsonSetter(value = "toxic", nulls = Nulls.SKIP) + public _FinalStage toxic(Optional toxic) { + this.toxic = toxic; + return this; + } + + @java.lang.Override + public DetectGuardrailsResponseV2 build() { + return new DetectGuardrailsResponseV2(text, toxic, deniedTopic, validation, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java new file mode 100644 index 00000000..0337a29f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java @@ -0,0 +1,86 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectGuardrailsResponseV2Validation { + public static final DetectGuardrailsResponseV2Validation PASSED = + new DetectGuardrailsResponseV2Validation(Value.PASSED, "PASSED"); + + public static final DetectGuardrailsResponseV2Validation FAILED = + new DetectGuardrailsResponseV2Validation(Value.FAILED, "FAILED"); + + private final Value value; + + private final String string; + + DetectGuardrailsResponseV2Validation(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 DetectGuardrailsResponseV2Validation + && this.string.equals(((DetectGuardrailsResponseV2Validation) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case PASSED: + return visitor.visitPassed(); + case FAILED: + return visitor.visitFailed(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectGuardrailsResponseV2Validation valueOf(String value) { + switch (value) { + case "PASSED": + return PASSED; + case "FAILED": + return FAILED; + default: + return new DetectGuardrailsResponseV2Validation(Value.UNKNOWN, value); + } + } + + public enum Value { + FAILED, + + PASSED, + + UNKNOWN + } + + public interface Visitor { + T visitFailed(); + + T visitPassed(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java new file mode 100644 index 00000000..52333c00 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java @@ -0,0 +1,142 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectObjectEntity.Builder.class) +public final class DetectObjectEntity { + private final Optional entityType; + + private final Optional deidentificationType; + + private final Map additionalProperties; + + private DetectObjectEntity( + Optional entityType, + Optional deidentificationType, + Map additionalProperties) { + this.entityType = entityType; + this.deidentificationType = deidentificationType; + this.additionalProperties = additionalProperties; + } + + /** + * @return Type of entity to detect. + */ + @JsonProperty("entityType") + public Optional getEntityType() { + return entityType; + } + + /** + * @return Type of deidentification to apply. + */ + @JsonProperty("deidentificationType") + public Optional getDeidentificationType() { + return deidentificationType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectObjectEntity && equalTo((DetectObjectEntity) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectObjectEntity other) { + return entityType.equals(other.entityType) && deidentificationType.equals(other.deidentificationType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.entityType, this.deidentificationType); + } + + @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 entityType = Optional.empty(); + + private Optional deidentificationType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetectObjectEntity other) { + entityType(other.getEntityType()); + deidentificationType(other.getDeidentificationType()); + return this; + } + + /** + *

Type of entity to detect.

+ */ + @JsonSetter(value = "entityType", nulls = Nulls.SKIP) + public Builder entityType(Optional entityType) { + this.entityType = entityType; + return this; + } + + public Builder entityType(DetectObjectEntityEntityType entityType) { + this.entityType = Optional.ofNullable(entityType); + return this; + } + + /** + *

Type of deidentification to apply.

+ */ + @JsonSetter(value = "deidentificationType", nulls = Nulls.SKIP) + public Builder deidentificationType(Optional deidentificationType) { + this.deidentificationType = deidentificationType; + return this; + } + + public Builder deidentificationType(DetectObjectEntityDeidentificationType deidentificationType) { + this.deidentificationType = Optional.ofNullable(deidentificationType); + return this; + } + + public DetectObjectEntity build() { + return new DetectObjectEntity(entityType, deidentificationType, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java new file mode 100644 index 00000000..aec7dc98 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectObjectEntityDeidentificationType { + public static final DetectObjectEntityDeidentificationType UNREDACT = + new DetectObjectEntityDeidentificationType(Value.UNREDACT, "UNREDACT"); + + public static final DetectObjectEntityDeidentificationType UNKNOWN = + new DetectObjectEntityDeidentificationType(Value.UNKNOWN, "UNKNOWN"); + + public static final DetectObjectEntityDeidentificationType REDACT = + new DetectObjectEntityDeidentificationType(Value.REDACT, "REDACT"); + + private final Value value; + + private final String string; + + DetectObjectEntityDeidentificationType(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 DetectObjectEntityDeidentificationType + && this.string.equals(((DetectObjectEntityDeidentificationType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case UNREDACT: + return visitor.visitUnredact(); + case UNKNOWN: + return visitor.visitUnknown(); + case REDACT: + return visitor.visitRedact(); + case _UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectObjectEntityDeidentificationType valueOf(String value) { + switch (value) { + case "UNREDACT": + return UNREDACT; + case "UNKNOWN": + return UNKNOWN; + case "REDACT": + return REDACT; + default: + return new DetectObjectEntityDeidentificationType(Value._UNKNOWN, value); + } + } + + public enum Value { + UNKNOWN, + + REDACT, + + UNREDACT, + + _UNKNOWN + } + + public interface Visitor { + T visitUnknown(); + + T visitRedact(); + + T visitUnredact(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java new file mode 100644 index 00000000..93f8b64f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java @@ -0,0 +1,126 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectObjectEntityEntityType { + public static final DetectObjectEntityEntityType FACE = new DetectObjectEntityEntityType(Value.FACE, "FACE"); + + public static final DetectObjectEntityEntityType SIGNATURE = + new DetectObjectEntityEntityType(Value.SIGNATURE, "SIGNATURE"); + + public static final DetectObjectEntityEntityType LICENSE_PLATE = + new DetectObjectEntityEntityType(Value.LICENSE_PLATE, "LICENSE_PLATE"); + + public static final DetectObjectEntityEntityType ALL = new DetectObjectEntityEntityType(Value.ALL, "ALL"); + + public static final DetectObjectEntityEntityType NONE = new DetectObjectEntityEntityType(Value.NONE, "NONE"); + + public static final DetectObjectEntityEntityType LOGO = new DetectObjectEntityEntityType(Value.LOGO, "LOGO"); + + private final Value value; + + private final String string; + + DetectObjectEntityEntityType(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 DetectObjectEntityEntityType + && this.string.equals(((DetectObjectEntityEntityType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case FACE: + return visitor.visitFace(); + case SIGNATURE: + return visitor.visitSignature(); + case LICENSE_PLATE: + return visitor.visitLicensePlate(); + case ALL: + return visitor.visitAll(); + case NONE: + return visitor.visitNone(); + case LOGO: + return visitor.visitLogo(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectObjectEntityEntityType valueOf(String value) { + switch (value) { + case "FACE": + return FACE; + case "SIGNATURE": + return SIGNATURE; + case "LICENSE_PLATE": + return LICENSE_PLATE; + case "ALL": + return ALL; + case "NONE": + return NONE; + case "LOGO": + return LOGO; + default: + return new DetectObjectEntityEntityType(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + FACE, + + LICENSE_PLATE, + + LOGO, + + SIGNATURE, + + ALL, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitFace(); + + T visitLicensePlate(); + + T visitLogo(); + + T visitSignature(); + + T visitAll(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java new file mode 100644 index 00000000..f5435ec2 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java @@ -0,0 +1,94 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectReturnEntities { + public static final DetectReturnEntities ALL = new DetectReturnEntities(Value.ALL, "ALL"); + + public static final DetectReturnEntities NONE = new DetectReturnEntities(Value.NONE, "NONE"); + + public static final DetectReturnEntities EXCLUDE_SENSITIVE_DATA = + new DetectReturnEntities(Value.EXCLUDE_SENSITIVE_DATA, "EXCLUDE_SENSITIVE_DATA"); + + private final Value value; + + private final String string; + + DetectReturnEntities(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 DetectReturnEntities && this.string.equals(((DetectReturnEntities) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case ALL: + return visitor.visitAll(); + case NONE: + return visitor.visitNone(); + case EXCLUDE_SENSITIVE_DATA: + return visitor.visitExcludeSensitiveData(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectReturnEntities valueOf(String value) { + switch (value) { + case "ALL": + return ALL; + case "NONE": + return NONE; + case "EXCLUDE_SENSITIVE_DATA": + return EXCLUDE_SENSITIVE_DATA; + default: + return new DetectReturnEntities(Value.UNKNOWN, value); + } + } + + public enum Value { + EXCLUDE_SENSITIVE_DATA, + + ALL, + + NONE, + + UNKNOWN + } + + public interface Visitor { + T visitExcludeSensitiveData(); + + T visitAll(); + + T visitNone(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java new file mode 100644 index 00000000..372e164d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java @@ -0,0 +1,228 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetectRunsResponseV2.Builder.class) +public final class DetectRunsResponseV2 { + private final Optional status; + + private final Optional outputType; + + private final Optional> output; + + private final Optional message; + + private final Optional metrics; + + private final Map additionalProperties; + + private DetectRunsResponseV2( + Optional status, + Optional outputType, + Optional> output, + Optional message, + Optional metrics, + Map additionalProperties) { + this.status = status; + this.outputType = outputType; + this.output = output; + this.message = message; + this.metrics = metrics; + this.additionalProperties = additionalProperties; + } + + /** + * @return Status of the detect run. + */ + @JsonProperty("status") + public Optional getStatus() { + return status; + } + + /** + * @return Data source of the output file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file. + */ + @JsonProperty("outputType") + public Optional getOutputType() { + return outputType; + } + + /** + * @return Details of output files. + */ + @JsonProperty("output") + public Optional> getOutput() { + return output; + } + + /** + * @return Status details about the Detect run. + */ + @JsonProperty("message") + public Optional getMessage() { + return message; + } + + @JsonProperty("metrics") + public Optional getMetrics() { + return metrics; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetectRunsResponseV2 && equalTo((DetectRunsResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetectRunsResponseV2 other) { + return status.equals(other.status) + && outputType.equals(other.outputType) + && output.equals(other.output) + && message.equals(other.message) + && metrics.equals(other.metrics); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.status, this.outputType, this.output, this.message, this.metrics); + } + + @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 status = Optional.empty(); + + private Optional outputType = Optional.empty(); + + private Optional> output = Optional.empty(); + + private Optional message = Optional.empty(); + + private Optional metrics = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetectRunsResponseV2 other) { + status(other.getStatus()); + outputType(other.getOutputType()); + output(other.getOutput()); + message(other.getMessage()); + metrics(other.getMetrics()); + return this; + } + + /** + *

Status of the detect run.

+ */ + @JsonSetter(value = "status", nulls = Nulls.SKIP) + public Builder status(Optional status) { + this.status = status; + return this; + } + + public Builder status(DetectRunsResponseV2Status status) { + this.status = Optional.ofNullable(status); + return this; + } + + /** + *

Data source of the output file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ */ + @JsonSetter(value = "outputType", nulls = Nulls.SKIP) + public Builder outputType(Optional outputType) { + this.outputType = outputType; + return this; + } + + public Builder outputType(DetectRunsResponseV2OutputType outputType) { + this.outputType = Optional.ofNullable(outputType); + return this; + } + + /** + *

Details of output files.

+ */ + @JsonSetter(value = "output", nulls = Nulls.SKIP) + public Builder output(Optional> output) { + this.output = output; + return this; + } + + public Builder output(List output) { + this.output = Optional.ofNullable(output); + return this; + } + + /** + *

Status details about the Detect run.

+ */ + @JsonSetter(value = "message", nulls = Nulls.SKIP) + public Builder message(Optional message) { + this.message = message; + return this; + } + + public Builder message(String message) { + this.message = Optional.ofNullable(message); + return this; + } + + @JsonSetter(value = "metrics", nulls = Nulls.SKIP) + public Builder metrics(Optional metrics) { + this.metrics = metrics; + return this; + } + + public Builder metrics(Metrics metrics) { + this.metrics = Optional.ofNullable(metrics); + return this; + } + + public DetectRunsResponseV2 build() { + return new DetectRunsResponseV2(status, outputType, output, message, metrics, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java new file mode 100644 index 00000000..cb995d80 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectRunsResponseV2OutputType { + public static final DetectRunsResponseV2OutputType BASE64 = + new DetectRunsResponseV2OutputType(Value.BASE64, "BASE64"); + + public static final DetectRunsResponseV2OutputType SKYFLOW_ID = + new DetectRunsResponseV2OutputType(Value.SKYFLOW_ID, "SKYFLOW_ID"); + + public static final DetectRunsResponseV2OutputType PRESIGNED_URL = + new DetectRunsResponseV2OutputType(Value.PRESIGNED_URL, "PRESIGNED_URL"); + + private final Value value; + + private final String string; + + DetectRunsResponseV2OutputType(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 DetectRunsResponseV2OutputType + && this.string.equals(((DetectRunsResponseV2OutputType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BASE64: + return visitor.visitBase64(); + case SKYFLOW_ID: + return visitor.visitSkyflowId(); + case PRESIGNED_URL: + return visitor.visitPresignedUrl(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectRunsResponseV2OutputType valueOf(String value) { + switch (value) { + case "BASE64": + return BASE64; + case "SKYFLOW_ID": + return SKYFLOW_ID; + case "PRESIGNED_URL": + return PRESIGNED_URL; + default: + return new DetectRunsResponseV2OutputType(Value.UNKNOWN, value); + } + } + + public enum Value { + BASE64, + + SKYFLOW_ID, + + PRESIGNED_URL, + + UNKNOWN + } + + public interface Visitor { + T visitBase64(); + + T visitSkyflowId(); + + T visitPresignedUrl(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java new file mode 100644 index 00000000..c4549699 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java @@ -0,0 +1,115 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetectRunsResponseV2Status { + public static final DetectRunsResponseV2Status IN_PROGRESS = + new DetectRunsResponseV2Status(Value.IN_PROGRESS, "IN_PROGRESS"); + + public static final DetectRunsResponseV2Status QUEUED = new DetectRunsResponseV2Status(Value.QUEUED, "QUEUED"); + + public static final DetectRunsResponseV2Status SUCCESS = new DetectRunsResponseV2Status(Value.SUCCESS, "SUCCESS"); + + public static final DetectRunsResponseV2Status UNKNOWN = new DetectRunsResponseV2Status(Value.UNKNOWN, "UNKNOWN"); + + public static final DetectRunsResponseV2Status FAILED = new DetectRunsResponseV2Status(Value.FAILED, "FAILED"); + + private final Value value; + + private final String string; + + DetectRunsResponseV2Status(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 DetectRunsResponseV2Status + && this.string.equals(((DetectRunsResponseV2Status) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case IN_PROGRESS: + return visitor.visitInProgress(); + case QUEUED: + return visitor.visitQueued(); + case SUCCESS: + return visitor.visitSuccess(); + case UNKNOWN: + return visitor.visitUnknown(); + case FAILED: + return visitor.visitFailed(); + case _UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetectRunsResponseV2Status valueOf(String value) { + switch (value) { + case "IN_PROGRESS": + return IN_PROGRESS; + case "QUEUED": + return QUEUED; + case "SUCCESS": + return SUCCESS; + case "UNKNOWN": + return UNKNOWN; + case "FAILED": + return FAILED; + default: + return new DetectRunsResponseV2Status(Value._UNKNOWN, value); + } + } + + public enum Value { + UNKNOWN, + + FAILED, + + SUCCESS, + + IN_PROGRESS, + + QUEUED, + + _UNKNOWN + } + + public interface Visitor { + T visitUnknown(); + + T visitFailed(); + + T visitSuccess(); + + T visitInProgress(); + + T visitQueued(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java new file mode 100644 index 00000000..4e080422 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java @@ -0,0 +1,105 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DocumentV2.Builder.class) +public final class DocumentV2 { + private final Optional pdf; + + private final Map additionalProperties; + + private DocumentV2(Optional pdf, Map additionalProperties) { + this.pdf = pdf; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("pdf") + public Optional getPdf() { + return pdf; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DocumentV2 && equalTo((DocumentV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DocumentV2 other) { + return pdf.equals(other.pdf); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.pdf); + } + + @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 pdf = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DocumentV2 other) { + pdf(other.getPdf()); + return this; + } + + @JsonSetter(value = "pdf", nulls = Nulls.SKIP) + public Builder pdf(Optional pdf) { + this.pdf = pdf; + return this; + } + + public Builder pdf(DocumentV2Pdf pdf) { + this.pdf = Optional.ofNullable(pdf); + return this; + } + + public DocumentV2 build() { + return new DocumentV2(pdf, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java new file mode 100644 index 00000000..4aae1940 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DocumentV2Pdf.Builder.class) +public final class DocumentV2Pdf { + private final Optional processingMode; + + private final Optional density; + + private final Optional maxResolution; + + private final Map additionalProperties; + + private DocumentV2Pdf( + Optional processingMode, + Optional density, + Optional maxResolution, + Map additionalProperties) { + this.processingMode = processingMode; + this.density = density; + this.maxResolution = maxResolution; + this.additionalProperties = additionalProperties; + } + + /** + * @return Processing mode for the PDF file. TEXT_LAYER: processes the PDF's native text layer and replaces detected entities with entity tokens (for example, [NAME_1]). Fast and accurate for PDFs with selectable text. OCR: processes the PDF as an image using optical character recognition and covers detected content with a gray box. Use for scanned or image-based PDFs. Because OCR rasterizes each page, the output PDF file size can be significantly larger than the input. + */ + @JsonProperty("processingMode") + public Optional getProcessingMode() { + return processingMode; + } + + /** + * @return Pixel density at which to process the PDF file. Applies only when processingMode is OCR. + */ + @JsonProperty("density") + public Optional getDensity() { + return density; + } + + /** + * @return Max resolution at which to process the PDF file. Applies only when processingMode is OCR. + */ + @JsonProperty("maxResolution") + public Optional getMaxResolution() { + return maxResolution; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DocumentV2Pdf && equalTo((DocumentV2Pdf) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DocumentV2Pdf other) { + return processingMode.equals(other.processingMode) + && density.equals(other.density) + && maxResolution.equals(other.maxResolution); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.processingMode, this.density, this.maxResolution); + } + + @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 processingMode = Optional.empty(); + + private Optional density = Optional.empty(); + + private Optional maxResolution = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DocumentV2Pdf other) { + processingMode(other.getProcessingMode()); + density(other.getDensity()); + maxResolution(other.getMaxResolution()); + return this; + } + + /** + *

Processing mode for the PDF file. TEXT_LAYER: processes the PDF's native text layer and replaces detected entities with entity tokens (for example, [NAME_1]). Fast and accurate for PDFs with selectable text. OCR: processes the PDF as an image using optical character recognition and covers detected content with a gray box. Use for scanned or image-based PDFs. Because OCR rasterizes each page, the output PDF file size can be significantly larger than the input.

+ */ + @JsonSetter(value = "processingMode", nulls = Nulls.SKIP) + public Builder processingMode(Optional processingMode) { + this.processingMode = processingMode; + return this; + } + + public Builder processingMode(DocumentV2PdfProcessingMode processingMode) { + this.processingMode = Optional.ofNullable(processingMode); + return this; + } + + /** + *

Pixel density at which to process the PDF file. Applies only when processingMode is OCR.

+ */ + @JsonSetter(value = "density", nulls = Nulls.SKIP) + public Builder density(Optional density) { + this.density = density; + return this; + } + + public Builder density(Integer density) { + this.density = Optional.ofNullable(density); + return this; + } + + /** + *

Max resolution at which to process the PDF file. Applies only when processingMode is OCR.

+ */ + @JsonSetter(value = "maxResolution", nulls = Nulls.SKIP) + public Builder maxResolution(Optional maxResolution) { + this.maxResolution = maxResolution; + return this; + } + + public Builder maxResolution(Integer maxResolution) { + this.maxResolution = Optional.ofNullable(maxResolution); + return this; + } + + public DocumentV2Pdf build() { + return new DocumentV2Pdf(processingMode, density, maxResolution, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java new file mode 100644 index 00000000..2ada581f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DocumentV2PdfProcessingMode { + public static final DocumentV2PdfProcessingMode OCR = new DocumentV2PdfProcessingMode(Value.OCR, "OCR"); + + public static final DocumentV2PdfProcessingMode NONE = new DocumentV2PdfProcessingMode(Value.NONE, "NONE"); + + public static final DocumentV2PdfProcessingMode TEXT_LAYER = + new DocumentV2PdfProcessingMode(Value.TEXT_LAYER, "TEXT_LAYER"); + + private final Value value; + + private final String string; + + DocumentV2PdfProcessingMode(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 DocumentV2PdfProcessingMode + && this.string.equals(((DocumentV2PdfProcessingMode) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case OCR: + return visitor.visitOcr(); + case NONE: + return visitor.visitNone(); + case TEXT_LAYER: + return visitor.visitTextLayer(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DocumentV2PdfProcessingMode valueOf(String value) { + switch (value) { + case "OCR": + return OCR; + case "NONE": + return NONE; + case "TEXT_LAYER": + return TEXT_LAYER; + default: + return new DocumentV2PdfProcessingMode(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + OCR, + + TEXT_LAYER, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitOcr(); + + T visitTextLayer(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java new file mode 100644 index 00000000..870b3e13 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java @@ -0,0 +1,106 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = EntityTransformation.Builder.class) +public final class EntityTransformation { + private final Optional shiftDates; + + private final Map additionalProperties; + + private EntityTransformation( + Optional shiftDates, Map additionalProperties) { + this.shiftDates = shiftDates; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("shiftDates") + public Optional getShiftDates() { + return shiftDates; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof EntityTransformation && equalTo((EntityTransformation) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(EntityTransformation other) { + return shiftDates.equals(other.shiftDates); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.shiftDates); + } + + @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 shiftDates = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(EntityTransformation other) { + shiftDates(other.getShiftDates()); + return this; + } + + @JsonSetter(value = "shiftDates", nulls = Nulls.SKIP) + public Builder shiftDates(Optional shiftDates) { + this.shiftDates = shiftDates; + return this; + } + + public Builder shiftDates(TransformationShiftDates shiftDates) { + this.shiftDates = Optional.ofNullable(shiftDates); + return this; + } + + public EntityTransformation build() { + return new EntityTransformation(shiftDates, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java new file mode 100644 index 00000000..4e29036e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java @@ -0,0 +1,118 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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 com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ErrorResponse.Builder.class) +public final class ErrorResponse { + private final ErrorResponseError error; + + private final Map additionalProperties; + + private ErrorResponse(ErrorResponseError error, Map additionalProperties) { + this.error = error; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("error") + public ErrorResponseError getError() { + return error; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ErrorResponse && equalTo((ErrorResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ErrorResponse other) { + return error.equals(other.error); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.error); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ErrorStage builder() { + return new Builder(); + } + + public interface ErrorStage { + _FinalStage error(@NotNull ErrorResponseError error); + + Builder from(ErrorResponse other); + } + + public interface _FinalStage { + ErrorResponse build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ErrorStage, _FinalStage { + private ErrorResponseError error; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ErrorResponse other) { + error(other.getError()); + return this; + } + + @java.lang.Override + @JsonSetter("error") + public _FinalStage error(@NotNull ErrorResponseError error) { + this.error = Objects.requireNonNull(error, "error must not be null"); + return this; + } + + @java.lang.Override + public ErrorResponse build() { + return new ErrorResponse(error, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java new file mode 100644 index 00000000..5c43d6a6 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java @@ -0,0 +1,236 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ErrorResponseError.Builder.class) +public final class ErrorResponseError { + private final int grpcCode; + + private final int httpCode; + + private final String httpStatus; + + private final String message; + + private final Optional>> details; + + private final Map additionalProperties; + + private ErrorResponseError( + int grpcCode, + int httpCode, + String httpStatus, + String message, + Optional>> details, + Map additionalProperties) { + this.grpcCode = grpcCode; + this.httpCode = httpCode; + this.httpStatus = httpStatus; + this.message = message; + this.details = details; + this.additionalProperties = additionalProperties; + } + + /** + * @return gRPC status codes. See https://grpc.io/docs/guides/status-codes. + */ + @JsonProperty("grpc_code") + public int getGrpcCode() { + return grpcCode; + } + + @JsonProperty("http_code") + public int getHttpCode() { + return httpCode; + } + + @JsonProperty("http_status") + public String getHttpStatus() { + return httpStatus; + } + + @JsonProperty("message") + public String getMessage() { + return message; + } + + @JsonProperty("details") + public Optional>> getDetails() { + return details; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ErrorResponseError && equalTo((ErrorResponseError) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ErrorResponseError other) { + return grpcCode == other.grpcCode + && httpCode == other.httpCode + && httpStatus.equals(other.httpStatus) + && message.equals(other.message) + && details.equals(other.details); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.grpcCode, this.httpCode, this.httpStatus, this.message, this.details); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static GrpcCodeStage builder() { + return new Builder(); + } + + public interface GrpcCodeStage { + /** + *

gRPC status codes. See https://grpc.io/docs/guides/status-codes.

+ */ + HttpCodeStage grpcCode(int grpcCode); + + Builder from(ErrorResponseError other); + } + + public interface HttpCodeStage { + HttpStatusStage httpCode(int httpCode); + } + + public interface HttpStatusStage { + MessageStage httpStatus(@NotNull String httpStatus); + } + + public interface MessageStage { + _FinalStage message(@NotNull String message); + } + + public interface _FinalStage { + ErrorResponseError build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + _FinalStage details(Optional>> details); + + _FinalStage details(List> details); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder + implements GrpcCodeStage, HttpCodeStage, HttpStatusStage, MessageStage, _FinalStage { + private int grpcCode; + + private int httpCode; + + private String httpStatus; + + private String message; + + private Optional>> details = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ErrorResponseError other) { + grpcCode(other.getGrpcCode()); + httpCode(other.getHttpCode()); + httpStatus(other.getHttpStatus()); + message(other.getMessage()); + details(other.getDetails()); + return this; + } + + /** + *

gRPC status codes. See https://grpc.io/docs/guides/status-codes.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("grpc_code") + public HttpCodeStage grpcCode(int grpcCode) { + this.grpcCode = grpcCode; + return this; + } + + @java.lang.Override + @JsonSetter("http_code") + public HttpStatusStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + @java.lang.Override + @JsonSetter("http_status") + public MessageStage httpStatus(@NotNull String httpStatus) { + this.httpStatus = Objects.requireNonNull(httpStatus, "httpStatus must not be null"); + return this; + } + + @java.lang.Override + @JsonSetter("message") + public _FinalStage message(@NotNull String message) { + this.message = Objects.requireNonNull(message, "message must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage details(List> details) { + this.details = Optional.ofNullable(details); + return this; + } + + @java.lang.Override + @JsonSetter(value = "details", nulls = Nulls.SKIP) + public _FinalStage details(Optional>> details) { + this.details = details; + return this; + } + + @java.lang.Override + public ErrorResponseError build() { + return new ErrorResponseError(grpcCode, httpCode, httpStatus, message, details, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java new file mode 100644 index 00000000..75b023be --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java @@ -0,0 +1,244 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileMapping.Builder.class) +public final class FileMapping { + private final Optional source; + + private final Optional destination; + + private final Optional outputFileNameSuffix; + + private final Optional entitiesDestination; + + private final Optional objectEntitiesDestination; + + private final Map additionalProperties; + + private FileMapping( + Optional source, + Optional destination, + Optional outputFileNameSuffix, + Optional entitiesDestination, + Optional objectEntitiesDestination, + Map additionalProperties) { + this.source = source; + this.destination = destination; + this.outputFileNameSuffix = outputFileNameSuffix; + this.entitiesDestination = entitiesDestination; + this.objectEntitiesDestination = objectEntitiesDestination; + this.additionalProperties = additionalProperties; + } + + /** + * @return Location of the source file. + */ + @JsonProperty("source") + public Optional getSource() { + return source; + } + + /** + * @return Location of the target file. + */ + @JsonProperty("destination") + public Optional getDestination() { + return destination; + } + + /** + * @return Suffix of the output file. For example, with outputFileNameSuffix = "_deidentified", "invoice.pdf" becomes "invoice_deidentified.pdf". + */ + @JsonProperty("outputFileNameSuffix") + public Optional getOutputFileNameSuffix() { + return outputFileNameSuffix; + } + + /** + * @return Location of the entities output, as "table.column". For example, "documents.entities_json". Must be in the same table as source. If unset, the entities output is not stored in the vault. + */ + @JsonProperty("entitiesDestination") + public Optional getEntitiesDestination() { + return entitiesDestination; + } + + /** + * @return Location of the object entities output, as "table.column". For example, "documents.object_entities_json". Must be in the same table as source. If unset, the object entities output is not stored in the vault. + */ + @JsonProperty("objectEntitiesDestination") + public Optional getObjectEntitiesDestination() { + return objectEntitiesDestination; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileMapping && equalTo((FileMapping) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileMapping other) { + return source.equals(other.source) + && destination.equals(other.destination) + && outputFileNameSuffix.equals(other.outputFileNameSuffix) + && entitiesDestination.equals(other.entitiesDestination) + && objectEntitiesDestination.equals(other.objectEntitiesDestination); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.source, + this.destination, + this.outputFileNameSuffix, + this.entitiesDestination, + this.objectEntitiesDestination); + } + + @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 source = Optional.empty(); + + private Optional destination = Optional.empty(); + + private Optional outputFileNameSuffix = Optional.empty(); + + private Optional entitiesDestination = Optional.empty(); + + private Optional objectEntitiesDestination = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileMapping other) { + source(other.getSource()); + destination(other.getDestination()); + outputFileNameSuffix(other.getOutputFileNameSuffix()); + entitiesDestination(other.getEntitiesDestination()); + objectEntitiesDestination(other.getObjectEntitiesDestination()); + return this; + } + + /** + *

Location of the source file.

+ */ + @JsonSetter(value = "source", nulls = Nulls.SKIP) + public Builder source(Optional source) { + this.source = source; + return this; + } + + public Builder source(String source) { + this.source = Optional.ofNullable(source); + return this; + } + + /** + *

Location of the target file.

+ */ + @JsonSetter(value = "destination", nulls = Nulls.SKIP) + public Builder destination(Optional destination) { + this.destination = destination; + return this; + } + + public Builder destination(String destination) { + this.destination = Optional.ofNullable(destination); + return this; + } + + /** + *

Suffix of the output file. For example, with outputFileNameSuffix = "_deidentified", "invoice.pdf" becomes "invoice_deidentified.pdf".

+ */ + @JsonSetter(value = "outputFileNameSuffix", nulls = Nulls.SKIP) + public Builder outputFileNameSuffix(Optional outputFileNameSuffix) { + this.outputFileNameSuffix = outputFileNameSuffix; + return this; + } + + public Builder outputFileNameSuffix(String outputFileNameSuffix) { + this.outputFileNameSuffix = Optional.ofNullable(outputFileNameSuffix); + return this; + } + + /** + *

Location of the entities output, as "table.column". For example, "documents.entities_json". Must be in the same table as source. If unset, the entities output is not stored in the vault.

+ */ + @JsonSetter(value = "entitiesDestination", nulls = Nulls.SKIP) + public Builder entitiesDestination(Optional entitiesDestination) { + this.entitiesDestination = entitiesDestination; + return this; + } + + public Builder entitiesDestination(String entitiesDestination) { + this.entitiesDestination = Optional.ofNullable(entitiesDestination); + return this; + } + + /** + *

Location of the object entities output, as "table.column". For example, "documents.object_entities_json". Must be in the same table as source. If unset, the object entities output is not stored in the vault.

+ */ + @JsonSetter(value = "objectEntitiesDestination", nulls = Nulls.SKIP) + public Builder objectEntitiesDestination(Optional objectEntitiesDestination) { + this.objectEntitiesDestination = objectEntitiesDestination; + return this; + } + + public Builder objectEntitiesDestination(String objectEntitiesDestination) { + this.objectEntitiesDestination = Optional.ofNullable(objectEntitiesDestination); + return this; + } + + public FileMapping build() { + return new FileMapping( + source, + destination, + outputFileNameSuffix, + entitiesDestination, + objectEntitiesDestination, + 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/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java new file mode 100644 index 00000000..69f6cdf8 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileOutput.Builder.class) +public final class FileOutput { + private final Optional processedFile; + + private final Optional processedFileType; + + private final Optional processedFileExtension; + + private final Map additionalProperties; + + private FileOutput( + Optional processedFile, + Optional processedFileType, + Optional processedFileExtension, + Map additionalProperties) { + this.processedFile = processedFile; + this.processedFileType = processedFileType; + this.processedFileExtension = processedFileExtension; + this.additionalProperties = additionalProperties; + } + + /** + * @return Value of the processed file. + */ + @JsonProperty("processedFile") + public Optional getProcessedFile() { + return processedFile; + } + + /** + * @return Type of the processed file. + */ + @JsonProperty("processedFileType") + public Optional getProcessedFileType() { + return processedFileType; + } + + /** + * @return Processed file extension. + */ + @JsonProperty("processedFileExtension") + public Optional getProcessedFileExtension() { + return processedFileExtension; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileOutput && equalTo((FileOutput) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileOutput other) { + return processedFile.equals(other.processedFile) + && processedFileType.equals(other.processedFileType) + && processedFileExtension.equals(other.processedFileExtension); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.processedFile, this.processedFileType, this.processedFileExtension); + } + + @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 processedFile = Optional.empty(); + + private Optional processedFileType = Optional.empty(); + + private Optional processedFileExtension = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileOutput other) { + processedFile(other.getProcessedFile()); + processedFileType(other.getProcessedFileType()); + processedFileExtension(other.getProcessedFileExtension()); + return this; + } + + /** + *

Value of the processed file.

+ */ + @JsonSetter(value = "processedFile", nulls = Nulls.SKIP) + public Builder processedFile(Optional processedFile) { + this.processedFile = processedFile; + return this; + } + + public Builder processedFile(String processedFile) { + this.processedFile = Optional.ofNullable(processedFile); + return this; + } + + /** + *

Type of the processed file.

+ */ + @JsonSetter(value = "processedFileType", nulls = Nulls.SKIP) + public Builder processedFileType(Optional processedFileType) { + this.processedFileType = processedFileType; + return this; + } + + public Builder processedFileType(FileOutputProcessedFileType processedFileType) { + this.processedFileType = Optional.ofNullable(processedFileType); + return this; + } + + /** + *

Processed file extension.

+ */ + @JsonSetter(value = "processedFileExtension", nulls = Nulls.SKIP) + public Builder processedFileExtension(Optional processedFileExtension) { + this.processedFileExtension = processedFileExtension; + return this; + } + + public Builder processedFileExtension(FileOutputProcessedFileExtension processedFileExtension) { + this.processedFileExtension = Optional.ofNullable(processedFileExtension); + return this; + } + + public FileOutput build() { + return new FileOutput(processedFile, processedFileType, processedFileExtension, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java new file mode 100644 index 00000000..5eb8fd6f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java @@ -0,0 +1,301 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class FileOutputProcessedFileExtension { + public static final FileOutputProcessedFileExtension BMP = new FileOutputProcessedFileExtension(Value.BMP, "bmp"); + + public static final FileOutputProcessedFileExtension PPTX = + new FileOutputProcessedFileExtension(Value.PPTX, "pptx"); + + public static final FileOutputProcessedFileExtension WAV = new FileOutputProcessedFileExtension(Value.WAV, "wav"); + + public static final FileOutputProcessedFileExtension DOC = new FileOutputProcessedFileExtension(Value.DOC, "doc"); + + public static final FileOutputProcessedFileExtension XML = new FileOutputProcessedFileExtension(Value.XML, "xml"); + + public static final FileOutputProcessedFileExtension ZIP = new FileOutputProcessedFileExtension(Value.ZIP, "zip"); + + public static final FileOutputProcessedFileExtension MP3 = new FileOutputProcessedFileExtension(Value.MP3, "mp3"); + + public static final FileOutputProcessedFileExtension PPT = new FileOutputProcessedFileExtension(Value.PPT, "ppt"); + + public static final FileOutputProcessedFileExtension JPEG = + new FileOutputProcessedFileExtension(Value.JPEG, "jpeg"); + + public static final FileOutputProcessedFileExtension TIFF = + new FileOutputProcessedFileExtension(Value.TIFF, "tiff"); + + public static final FileOutputProcessedFileExtension PDF = new FileOutputProcessedFileExtension(Value.PDF, "pdf"); + + public static final FileOutputProcessedFileExtension DOCX = + new FileOutputProcessedFileExtension(Value.DOCX, "docx"); + + public static final FileOutputProcessedFileExtension PNG = new FileOutputProcessedFileExtension(Value.PNG, "png"); + + public static final FileOutputProcessedFileExtension JSONL = + new FileOutputProcessedFileExtension(Value.JSONL, "jsonl"); + + public static final FileOutputProcessedFileExtension CSV = new FileOutputProcessedFileExtension(Value.CSV, "csv"); + + public static final FileOutputProcessedFileExtension JPG = new FileOutputProcessedFileExtension(Value.JPG, "jpg"); + + public static final FileOutputProcessedFileExtension DCM = new FileOutputProcessedFileExtension(Value.DCM, "dcm"); + + public static final FileOutputProcessedFileExtension JSON = + new FileOutputProcessedFileExtension(Value.JSON, "json"); + + public static final FileOutputProcessedFileExtension GIF = new FileOutputProcessedFileExtension(Value.GIF, "gif"); + + public static final FileOutputProcessedFileExtension TXT = new FileOutputProcessedFileExtension(Value.TXT, "txt"); + + public static final FileOutputProcessedFileExtension XLS = new FileOutputProcessedFileExtension(Value.XLS, "xls"); + + public static final FileOutputProcessedFileExtension XLSX = + new FileOutputProcessedFileExtension(Value.XLSX, "xlsx"); + + public static final FileOutputProcessedFileExtension TIF = new FileOutputProcessedFileExtension(Value.TIF, "tif"); + + private final Value value; + + private final String string; + + FileOutputProcessedFileExtension(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 FileOutputProcessedFileExtension + && this.string.equals(((FileOutputProcessedFileExtension) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BMP: + return visitor.visitBmp(); + case PPTX: + return visitor.visitPptx(); + case WAV: + return visitor.visitWav(); + case DOC: + return visitor.visitDoc(); + case XML: + return visitor.visitXml(); + case ZIP: + return visitor.visitZip(); + case MP3: + return visitor.visitMp3(); + case PPT: + return visitor.visitPpt(); + case JPEG: + return visitor.visitJpeg(); + case TIFF: + return visitor.visitTiff(); + case PDF: + return visitor.visitPdf(); + case DOCX: + return visitor.visitDocx(); + case PNG: + return visitor.visitPng(); + case JSONL: + return visitor.visitJsonl(); + case CSV: + return visitor.visitCsv(); + case JPG: + return visitor.visitJpg(); + case DCM: + return visitor.visitDcm(); + case JSON: + return visitor.visitJson(); + case GIF: + return visitor.visitGif(); + case TXT: + return visitor.visitTxt(); + case XLS: + return visitor.visitXls(); + case XLSX: + return visitor.visitXlsx(); + case TIF: + return visitor.visitTif(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static FileOutputProcessedFileExtension valueOf(String value) { + switch (value) { + case "bmp": + return BMP; + case "pptx": + return PPTX; + case "wav": + return WAV; + case "doc": + return DOC; + case "xml": + return XML; + case "zip": + return ZIP; + case "mp3": + return MP3; + case "ppt": + return PPT; + case "jpeg": + return JPEG; + case "tiff": + return TIFF; + case "pdf": + return PDF; + case "docx": + return DOCX; + case "png": + return PNG; + case "jsonl": + return JSONL; + case "csv": + return CSV; + case "jpg": + return JPG; + case "dcm": + return DCM; + case "json": + return JSON; + case "gif": + return GIF; + case "txt": + return TXT; + case "xls": + return XLS; + case "xlsx": + return XLSX; + case "tif": + return TIF; + default: + return new FileOutputProcessedFileExtension(Value.UNKNOWN, value); + } + } + + public enum Value { + MP3, + + WAV, + + PDF, + + TXT, + + CSV, + + JSON, + + JPG, + + JPEG, + + TIF, + + TIFF, + + PNG, + + BMP, + + XLS, + + XLSX, + + DOC, + + DOCX, + + PPT, + + PPTX, + + XML, + + DCM, + + JSONL, + + ZIP, + + GIF, + + UNKNOWN + } + + public interface Visitor { + T visitMp3(); + + T visitWav(); + + T visitPdf(); + + T visitTxt(); + + T visitCsv(); + + T visitJson(); + + T visitJpg(); + + T visitJpeg(); + + T visitTif(); + + T visitTiff(); + + T visitPng(); + + T visitBmp(); + + T visitXls(); + + T visitXlsx(); + + T visitDoc(); + + T visitDocx(); + + T visitPpt(); + + T visitPptx(); + + T visitXml(); + + T visitDcm(); + + T visitJsonl(); + + T visitZip(); + + T visitGif(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java new file mode 100644 index 00000000..faeb8849 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java @@ -0,0 +1,64 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class FileOutputProcessedFileType { + private final Value value; + + private final String string; + + FileOutputProcessedFileType(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 FileOutputProcessedFileType + && this.string.equals(((FileOutputProcessedFileType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static FileOutputProcessedFileType valueOf(String value) { + switch (value) { + default: + return new FileOutputProcessedFileType(Value.UNKNOWN, value); + } + } + + public enum Value { + UNKNOWN + } + + public interface Visitor { + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java new file mode 100644 index 00000000..ebcc89de --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ImageV2.Builder.class) +public final class ImageV2 { + private final Optional outputProcessedImage; + + private final Optional outputOcrText; + + private final Optional maskingMethod; + + private final Map additionalProperties; + + private ImageV2( + Optional outputProcessedImage, + Optional outputOcrText, + Optional maskingMethod, + Map additionalProperties) { + this.outputProcessedImage = outputProcessedImage; + this.outputOcrText = outputOcrText; + this.maskingMethod = maskingMethod; + this.additionalProperties = additionalProperties; + } + + /** + * @return If true, includes processed image in the output. + */ + @JsonProperty("outputProcessedImage") + public Optional getOutputProcessedImage() { + return outputProcessedImage; + } + + /** + * @return If true, includes text detected by OCR in the response. + */ + @JsonProperty("outputOcrText") + public Optional getOutputOcrText() { + return outputOcrText; + } + + /** + * @return Method used to mask detected entities in the image. BLUR: blurs each detected entity so the sensitive content is unreadable while the rest of the image is preserved. BLACKBOX: covers each detected entity with a solid black box. + */ + @JsonProperty("maskingMethod") + public Optional getMaskingMethod() { + return maskingMethod; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ImageV2 && equalTo((ImageV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ImageV2 other) { + return outputProcessedImage.equals(other.outputProcessedImage) + && outputOcrText.equals(other.outputOcrText) + && maskingMethod.equals(other.maskingMethod); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.outputProcessedImage, this.outputOcrText, this.maskingMethod); + } + + @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 outputProcessedImage = Optional.empty(); + + private Optional outputOcrText = Optional.empty(); + + private Optional maskingMethod = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ImageV2 other) { + outputProcessedImage(other.getOutputProcessedImage()); + outputOcrText(other.getOutputOcrText()); + maskingMethod(other.getMaskingMethod()); + return this; + } + + /** + *

If true, includes processed image in the output.

+ */ + @JsonSetter(value = "outputProcessedImage", nulls = Nulls.SKIP) + public Builder outputProcessedImage(Optional outputProcessedImage) { + this.outputProcessedImage = outputProcessedImage; + return this; + } + + public Builder outputProcessedImage(Boolean outputProcessedImage) { + this.outputProcessedImage = Optional.ofNullable(outputProcessedImage); + return this; + } + + /** + *

If true, includes text detected by OCR in the response.

+ */ + @JsonSetter(value = "outputOcrText", nulls = Nulls.SKIP) + public Builder outputOcrText(Optional outputOcrText) { + this.outputOcrText = outputOcrText; + return this; + } + + public Builder outputOcrText(Boolean outputOcrText) { + this.outputOcrText = Optional.ofNullable(outputOcrText); + return this; + } + + /** + *

Method used to mask detected entities in the image. BLUR: blurs each detected entity so the sensitive content is unreadable while the rest of the image is preserved. BLACKBOX: covers each detected entity with a solid black box.

+ */ + @JsonSetter(value = "maskingMethod", nulls = Nulls.SKIP) + public Builder maskingMethod(Optional maskingMethod) { + this.maskingMethod = maskingMethod; + return this; + } + + public Builder maskingMethod(ImageV2MaskingMethod maskingMethod) { + this.maskingMethod = Optional.ofNullable(maskingMethod); + return this; + } + + public ImageV2 build() { + return new ImageV2(outputProcessedImage, outputOcrText, maskingMethod, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java new file mode 100644 index 00000000..41f59512 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class ImageV2MaskingMethod { + public static final ImageV2MaskingMethod BLUR = new ImageV2MaskingMethod(Value.BLUR, "BLUR"); + + public static final ImageV2MaskingMethod NONE = new ImageV2MaskingMethod(Value.NONE, "NONE"); + + public static final ImageV2MaskingMethod BLACKBOX = new ImageV2MaskingMethod(Value.BLACKBOX, "BLACKBOX"); + + private final Value value; + + private final String string; + + ImageV2MaskingMethod(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 ImageV2MaskingMethod && this.string.equals(((ImageV2MaskingMethod) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BLUR: + return visitor.visitBlur(); + case NONE: + return visitor.visitNone(); + case BLACKBOX: + return visitor.visitBlackbox(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static ImageV2MaskingMethod valueOf(String value) { + switch (value) { + case "BLUR": + return BLUR; + case "NONE": + return NONE; + case "BLACKBOX": + return BLACKBOX; + default: + return new ImageV2MaskingMethod(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + BLUR, + + BLACKBOX, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitBlur(); + + T visitBlackbox(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java new file mode 100644 index 00000000..7bba13bb --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java @@ -0,0 +1,153 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = Media.Builder.class) +public final class Media { + private final Optional audio; + + private final Optional document; + + private final Optional image; + + private final Map additionalProperties; + + private Media( + Optional audio, + Optional document, + Optional image, + Map additionalProperties) { + this.audio = audio; + this.document = document; + this.image = image; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("audio") + public Optional getAudio() { + return audio; + } + + @JsonProperty("document") + public Optional getDocument() { + return document; + } + + @JsonProperty("image") + public Optional getImage() { + return image; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof Media && equalTo((Media) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(Media other) { + return audio.equals(other.audio) && document.equals(other.document) && image.equals(other.image); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.audio, this.document, this.image); + } + + @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 audio = Optional.empty(); + + private Optional document = Optional.empty(); + + private Optional image = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(Media other) { + audio(other.getAudio()); + document(other.getDocument()); + image(other.getImage()); + return this; + } + + @JsonSetter(value = "audio", nulls = Nulls.SKIP) + public Builder audio(Optional audio) { + this.audio = audio; + return this; + } + + public Builder audio(AudioV2 audio) { + this.audio = Optional.ofNullable(audio); + return this; + } + + @JsonSetter(value = "document", nulls = Nulls.SKIP) + public Builder document(Optional document) { + this.document = document; + return this; + } + + public Builder document(DocumentV2 document) { + this.document = Optional.ofNullable(document); + return this; + } + + @JsonSetter(value = "image", nulls = Nulls.SKIP) + public Builder image(Optional image) { + this.image = image; + return this; + } + + public Builder image(ImageV2 image) { + this.image = Optional.ofNullable(image); + return this; + } + + public Media build() { + return new Media(audio, document, image, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java new file mode 100644 index 00000000..ac525333 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java @@ -0,0 +1,263 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = Metrics.Builder.class) +public final class Metrics { + private final Optional size; + + private final Optional wordCount; + + private final Optional characterCount; + + private final Optional slides; + + private final Optional pages; + + private final Optional duration; + + private final Map additionalProperties; + + private Metrics( + Optional size, + Optional wordCount, + Optional characterCount, + Optional slides, + Optional pages, + Optional duration, + Map additionalProperties) { + this.size = size; + this.wordCount = wordCount; + this.characterCount = characterCount; + this.slides = slides; + this.pages = pages; + this.duration = duration; + this.additionalProperties = additionalProperties; + } + + /** + * @return Size of the input text(KB). + */ + @JsonProperty("size") + public Optional getSize() { + return size; + } + + /** + * @return Total number of words processed. + */ + @JsonProperty("wordCount") + public Optional getWordCount() { + return wordCount; + } + + /** + * @return Total number of characters processed. + */ + @JsonProperty("characterCount") + public Optional getCharacterCount() { + return characterCount; + } + + /** + * @return Total number of slides processed. + */ + @JsonProperty("slides") + public Optional getSlides() { + return slides; + } + + /** + * @return Total number of pages processed. + */ + @JsonProperty("pages") + public Optional getPages() { + return pages; + } + + /** + * @return Total duration processed(seconds). + */ + @JsonProperty("duration") + public Optional getDuration() { + return duration; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof Metrics && equalTo((Metrics) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(Metrics other) { + return size.equals(other.size) + && wordCount.equals(other.wordCount) + && characterCount.equals(other.characterCount) + && slides.equals(other.slides) + && pages.equals(other.pages) + && duration.equals(other.duration); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.size, this.wordCount, this.characterCount, this.slides, this.pages, this.duration); + } + + @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 size = Optional.empty(); + + private Optional wordCount = Optional.empty(); + + private Optional characterCount = Optional.empty(); + + private Optional slides = Optional.empty(); + + private Optional pages = Optional.empty(); + + private Optional duration = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(Metrics other) { + size(other.getSize()); + wordCount(other.getWordCount()); + characterCount(other.getCharacterCount()); + slides(other.getSlides()); + pages(other.getPages()); + duration(other.getDuration()); + return this; + } + + /** + *

Size of the input text(KB).

+ */ + @JsonSetter(value = "size", nulls = Nulls.SKIP) + public Builder size(Optional size) { + this.size = size; + return this; + } + + public Builder size(Double size) { + this.size = Optional.ofNullable(size); + return this; + } + + /** + *

Total number of words processed.

+ */ + @JsonSetter(value = "wordCount", nulls = Nulls.SKIP) + public Builder wordCount(Optional wordCount) { + this.wordCount = wordCount; + return this; + } + + public Builder wordCount(Integer wordCount) { + this.wordCount = Optional.ofNullable(wordCount); + return this; + } + + /** + *

Total number of characters processed.

+ */ + @JsonSetter(value = "characterCount", nulls = Nulls.SKIP) + public Builder characterCount(Optional characterCount) { + this.characterCount = characterCount; + return this; + } + + public Builder characterCount(Integer characterCount) { + this.characterCount = Optional.ofNullable(characterCount); + return this; + } + + /** + *

Total number of slides processed.

+ */ + @JsonSetter(value = "slides", nulls = Nulls.SKIP) + public Builder slides(Optional slides) { + this.slides = slides; + return this; + } + + public Builder slides(Integer slides) { + this.slides = Optional.ofNullable(slides); + return this; + } + + /** + *

Total number of pages processed.

+ */ + @JsonSetter(value = "pages", nulls = Nulls.SKIP) + public Builder pages(Optional pages) { + this.pages = pages; + return this; + } + + public Builder pages(Integer pages) { + this.pages = Optional.ofNullable(pages); + return this; + } + + /** + *

Total duration processed(seconds).

+ */ + @JsonSetter(value = "duration", nulls = Nulls.SKIP) + public Builder duration(Optional duration) { + this.duration = duration; + return this; + } + + public Builder duration(Double duration) { + this.duration = Optional.ofNullable(duration); + return this; + } + + public Metrics build() { + return new Metrics(size, wordCount, characterCount, slides, pages, duration, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java new file mode 100644 index 00000000..961c2f2f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java @@ -0,0 +1,204 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = RedactionLevel.Builder.class) +public final class RedactionLevel { + private final Optional tokenGroupName; + + private final Optional entityName; + + private final Optional redactionType; + + private final Optional redactionPattern; + + private final Map additionalProperties; + + private RedactionLevel( + Optional tokenGroupName, + Optional entityName, + Optional redactionType, + Optional redactionPattern, + Map additionalProperties) { + this.tokenGroupName = tokenGroupName; + this.entityName = entityName; + this.redactionType = redactionType; + this.redactionPattern = redactionPattern; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the token group whose detokenized values should be masked (e.g., a token in personTokenGroup that detokenizes to John Doe is masked as JoXXXe). Use this for FlowVault. + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Entity type whose detokenized values should be shown in plain text, redacted, or masked based on redactionType (e.g., a NAME entity that detokenizes to John Doe is masked as JoXXXe). Use this for SkyVault. + */ + @JsonProperty("entityName") + public Optional getEntityName() { + return entityName; + } + + /** + * @return Redaction method to apply to the detokenized value (e.g., for the value John Doe, MASKED transforms it into JoXXXe, REDACTED transforms it into *REDACTED*, and PLAIN_TEXT keeps it as John Doe). Use this for SkyVault. + */ + @JsonProperty("redactionType") + public Optional getRedactionType() { + return redactionType; + } + + /** + * @return Redaction method to apply to the detokenized value. Use the name of a redaction pattern configured in the vault (e.g., personMaskPattern transforms John Doe into JoXXXe). Use this for FlowVault. + */ + @JsonProperty("redactionPattern") + public Optional getRedactionPattern() { + return redactionPattern; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof RedactionLevel && equalTo((RedactionLevel) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(RedactionLevel other) { + return tokenGroupName.equals(other.tokenGroupName) + && entityName.equals(other.entityName) + && redactionType.equals(other.redactionType) + && redactionPattern.equals(other.redactionPattern); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokenGroupName, this.entityName, this.redactionType, this.redactionPattern); + } + + @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 tokenGroupName = Optional.empty(); + + private Optional entityName = Optional.empty(); + + private Optional redactionType = Optional.empty(); + + private Optional redactionPattern = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(RedactionLevel other) { + tokenGroupName(other.getTokenGroupName()); + entityName(other.getEntityName()); + redactionType(other.getRedactionType()); + redactionPattern(other.getRedactionPattern()); + return this; + } + + /** + *

Name of the token group whose detokenized values should be masked (e.g., a token in personTokenGroup that detokenizes to John Doe is masked as JoXXXe). Use this for FlowVault.

+ */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

Entity type whose detokenized values should be shown in plain text, redacted, or masked based on redactionType (e.g., a NAME entity that detokenizes to John Doe is masked as JoXXXe). Use this for SkyVault.

+ */ + @JsonSetter(value = "entityName", nulls = Nulls.SKIP) + public Builder entityName(Optional entityName) { + this.entityName = entityName; + return this; + } + + public Builder entityName(RedactionLevelEntityName entityName) { + this.entityName = Optional.ofNullable(entityName); + return this; + } + + /** + *

Redaction method to apply to the detokenized value (e.g., for the value John Doe, MASKED transforms it into JoXXXe, REDACTED transforms it into *REDACTED*, and PLAIN_TEXT keeps it as John Doe). Use this for SkyVault.

+ */ + @JsonSetter(value = "redactionType", nulls = Nulls.SKIP) + public Builder redactionType(Optional redactionType) { + this.redactionType = redactionType; + return this; + } + + public Builder redactionType(RedactionLevelRedactionType redactionType) { + this.redactionType = Optional.ofNullable(redactionType); + return this; + } + + /** + *

Redaction method to apply to the detokenized value. Use the name of a redaction pattern configured in the vault (e.g., personMaskPattern transforms John Doe into JoXXXe). Use this for FlowVault.

+ */ + @JsonSetter(value = "redactionPattern", nulls = Nulls.SKIP) + public Builder redactionPattern(Optional redactionPattern) { + this.redactionPattern = redactionPattern; + return this; + } + + public Builder redactionPattern(String redactionPattern) { + this.redactionPattern = Optional.ofNullable(redactionPattern); + return this; + } + + public RedactionLevel build() { + return new RedactionLevel( + tokenGroupName, entityName, redactionType, redactionPattern, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java new file mode 100644 index 00000000..a4e9acb6 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java @@ -0,0 +1,812 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class RedactionLevelEntityName { + public static final RedactionLevelEntityName PHONE_NUMBER = + new RedactionLevelEntityName(Value.PHONE_NUMBER, "PHONE_NUMBER"); + + public static final RedactionLevelEntityName USERNAME = new RedactionLevelEntityName(Value.USERNAME, "USERNAME"); + + public static final RedactionLevelEntityName VEHICLE_ID = + new RedactionLevelEntityName(Value.VEHICLE_ID, "VEHICLE_ID"); + + public static final RedactionLevelEntityName RELIGION = new RedactionLevelEntityName(Value.RELIGION, "RELIGION"); + + public static final RedactionLevelEntityName ORIGIN = new RedactionLevelEntityName(Value.ORIGIN, "ORIGIN"); + + public static final RedactionLevelEntityName PASSPORT_NUMBER = + new RedactionLevelEntityName(Value.PASSPORT_NUMBER, "PASSPORT_NUMBER"); + + public static final RedactionLevelEntityName YEAR = new RedactionLevelEntityName(Value.YEAR, "YEAR"); + + public static final RedactionLevelEntityName CONDITION = new RedactionLevelEntityName(Value.CONDITION, "CONDITION"); + + public static final RedactionLevelEntityName LOCATION = new RedactionLevelEntityName(Value.LOCATION, "LOCATION"); + + public static final RedactionLevelEntityName LOCATION_CITY = + new RedactionLevelEntityName(Value.LOCATION_CITY, "LOCATION_CITY"); + + public static final RedactionLevelEntityName LOCATION_COUNTRY = + new RedactionLevelEntityName(Value.LOCATION_COUNTRY, "LOCATION_COUNTRY"); + + public static final RedactionLevelEntityName PROJECT = new RedactionLevelEntityName(Value.PROJECT, "PROJECT"); + + public static final RedactionLevelEntityName LOCATION_ZIP = + new RedactionLevelEntityName(Value.LOCATION_ZIP, "LOCATION_ZIP"); + + public static final RedactionLevelEntityName NAME_MEDICAL_PROFESSIONAL = + new RedactionLevelEntityName(Value.NAME_MEDICAL_PROFESSIONAL, "NAME_MEDICAL_PROFESSIONAL"); + + public static final RedactionLevelEntityName BANK_ACCOUNT = + new RedactionLevelEntityName(Value.BANK_ACCOUNT, "BANK_ACCOUNT"); + + public static final RedactionLevelEntityName OCCUPATION = + new RedactionLevelEntityName(Value.OCCUPATION, "OCCUPATION"); + + public static final RedactionLevelEntityName TIME = new RedactionLevelEntityName(Value.TIME, "TIME"); + + public static final RedactionLevelEntityName LOCATION_STATE = + new RedactionLevelEntityName(Value.LOCATION_STATE, "LOCATION_STATE"); + + public static final RedactionLevelEntityName EVENT = new RedactionLevelEntityName(Value.EVENT, "EVENT"); + + public static final RedactionLevelEntityName POLITICAL_AFFILIATION = + new RedactionLevelEntityName(Value.POLITICAL_AFFILIATION, "POLITICAL_AFFILIATION"); + + public static final RedactionLevelEntityName LANGUAGE = new RedactionLevelEntityName(Value.LANGUAGE, "LANGUAGE"); + + public static final RedactionLevelEntityName ZODIAC_SIGN = + new RedactionLevelEntityName(Value.ZODIAC_SIGN, "ZODIAC_SIGN"); + + public static final RedactionLevelEntityName PRODUCT = new RedactionLevelEntityName(Value.PRODUCT, "PRODUCT"); + + public static final RedactionLevelEntityName SEXUALITY = new RedactionLevelEntityName(Value.SEXUALITY, "SEXUALITY"); + + public static final RedactionLevelEntityName DURATION = new RedactionLevelEntityName(Value.DURATION, "DURATION"); + + public static final RedactionLevelEntityName PHYSICAL_ATTRIBUTE = + new RedactionLevelEntityName(Value.PHYSICAL_ATTRIBUTE, "PHYSICAL_ATTRIBUTE"); + + public static final RedactionLevelEntityName LOCATION_ADDRESS_STREET = + new RedactionLevelEntityName(Value.LOCATION_ADDRESS_STREET, "LOCATION_ADDRESS_STREET"); + + public static final RedactionLevelEntityName MEDICAL_PROCESS = + new RedactionLevelEntityName(Value.MEDICAL_PROCESS, "MEDICAL_PROCESS"); + + public static final RedactionLevelEntityName LOCATION_ADDRESS = + new RedactionLevelEntityName(Value.LOCATION_ADDRESS, "LOCATION_ADDRESS"); + + public static final RedactionLevelEntityName FILENAME = new RedactionLevelEntityName(Value.FILENAME, "FILENAME"); + + public static final RedactionLevelEntityName DOB = new RedactionLevelEntityName(Value.DOB, "DOB"); + + public static final RedactionLevelEntityName ORGANIZATION_MEDICAL_FACILITY = + new RedactionLevelEntityName(Value.ORGANIZATION_MEDICAL_FACILITY, "ORGANIZATION_MEDICAL_FACILITY"); + + public static final RedactionLevelEntityName ROUTING_NUMBER = + new RedactionLevelEntityName(Value.ROUTING_NUMBER, "ROUTING_NUMBER"); + + public static final RedactionLevelEntityName HEALTHCARE_NUMBER = + new RedactionLevelEntityName(Value.HEALTHCARE_NUMBER, "HEALTHCARE_NUMBER"); + + public static final RedactionLevelEntityName GENDER = new RedactionLevelEntityName(Value.GENDER, "GENDER"); + + public static final RedactionLevelEntityName NAME = new RedactionLevelEntityName(Value.NAME, "NAME"); + + public static final RedactionLevelEntityName DRUG = new RedactionLevelEntityName(Value.DRUG, "DRUG"); + + public static final RedactionLevelEntityName NONE = new RedactionLevelEntityName(Value.NONE, "NONE"); + + public static final RedactionLevelEntityName DATE_INTERVAL = + new RedactionLevelEntityName(Value.DATE_INTERVAL, "DATE_INTERVAL"); + + public static final RedactionLevelEntityName MARITAL_STATUS = + new RedactionLevelEntityName(Value.MARITAL_STATUS, "MARITAL_STATUS"); + + public static final RedactionLevelEntityName CORPORATE_ACTION = + new RedactionLevelEntityName(Value.CORPORATE_ACTION, "CORPORATE_ACTION"); + + public static final RedactionLevelEntityName AGE = new RedactionLevelEntityName(Value.AGE, "AGE"); + + public static final RedactionLevelEntityName CVV = new RedactionLevelEntityName(Value.CVV, "CVV"); + + public static final RedactionLevelEntityName NAME_GIVEN = + new RedactionLevelEntityName(Value.NAME_GIVEN, "NAME_GIVEN"); + + public static final RedactionLevelEntityName DATE = new RedactionLevelEntityName(Value.DATE, "DATE"); + + public static final RedactionLevelEntityName DAY = new RedactionLevelEntityName(Value.DAY, "DAY"); + + public static final RedactionLevelEntityName EFFECT = new RedactionLevelEntityName(Value.EFFECT, "EFFECT"); + + public static final RedactionLevelEntityName MEDICAL_CODE = + new RedactionLevelEntityName(Value.MEDICAL_CODE, "MEDICAL_CODE"); + + public static final RedactionLevelEntityName NUMERICAL_PII = + new RedactionLevelEntityName(Value.NUMERICAL_PII, "NUMERICAL_PII"); + + public static final RedactionLevelEntityName TREND = new RedactionLevelEntityName(Value.TREND, "TREND"); + + public static final RedactionLevelEntityName INJURY = new RedactionLevelEntityName(Value.INJURY, "INJURY"); + + public static final RedactionLevelEntityName DRIVER_LICENSE = + new RedactionLevelEntityName(Value.DRIVER_LICENSE, "DRIVER_LICENSE"); + + public static final RedactionLevelEntityName ALL = new RedactionLevelEntityName(Value.ALL, "ALL"); + + public static final RedactionLevelEntityName ORGANIZATION_ID = + new RedactionLevelEntityName(Value.ORGANIZATION_ID, "ORGANIZATION_ID"); + + public static final RedactionLevelEntityName PASSWORD = new RedactionLevelEntityName(Value.PASSWORD, "PASSWORD"); + + public static final RedactionLevelEntityName DOSE = new RedactionLevelEntityName(Value.DOSE, "DOSE"); + + public static final RedactionLevelEntityName NAME_FAMILY = + new RedactionLevelEntityName(Value.NAME_FAMILY, "NAME_FAMILY"); + + public static final RedactionLevelEntityName MONEY = new RedactionLevelEntityName(Value.MONEY, "MONEY"); + + public static final RedactionLevelEntityName URL = new RedactionLevelEntityName(Value.URL, "URL"); + + public static final RedactionLevelEntityName LOCATION_COORDINATE = + new RedactionLevelEntityName(Value.LOCATION_COORDINATE, "LOCATION_COORDINATE"); + + public static final RedactionLevelEntityName FINANCIAL_METRIC = + new RedactionLevelEntityName(Value.FINANCIAL_METRIC, "FINANCIAL_METRIC"); + + public static final RedactionLevelEntityName ORGANIZATION = + new RedactionLevelEntityName(Value.ORGANIZATION, "ORGANIZATION"); + + public static final RedactionLevelEntityName IP_ADDRESS = + new RedactionLevelEntityName(Value.IP_ADDRESS, "IP_ADDRESS"); + + public static final RedactionLevelEntityName BLOOD_TYPE = + new RedactionLevelEntityName(Value.BLOOD_TYPE, "BLOOD_TYPE"); + + public static final RedactionLevelEntityName MONTH = new RedactionLevelEntityName(Value.MONTH, "MONTH"); + + public static final RedactionLevelEntityName CREDIT_CARD = + new RedactionLevelEntityName(Value.CREDIT_CARD, "CREDIT_CARD"); + + public static final RedactionLevelEntityName ACCOUNT_NUMBER = + new RedactionLevelEntityName(Value.ACCOUNT_NUMBER, "ACCOUNT_NUMBER"); + + public static final RedactionLevelEntityName CREDIT_CARD_EXPIRATION = + new RedactionLevelEntityName(Value.CREDIT_CARD_EXPIRATION, "CREDIT_CARD_EXPIRATION"); + + public static final RedactionLevelEntityName SSN = new RedactionLevelEntityName(Value.SSN, "SSN"); + + public static final RedactionLevelEntityName EMAIL_ADDRESS = + new RedactionLevelEntityName(Value.EMAIL_ADDRESS, "EMAIL_ADDRESS"); + + public static final RedactionLevelEntityName STATISTICS = + new RedactionLevelEntityName(Value.STATISTICS, "STATISTICS"); + + private final Value value; + + private final String string; + + RedactionLevelEntityName(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 RedactionLevelEntityName + && this.string.equals(((RedactionLevelEntityName) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case PHONE_NUMBER: + return visitor.visitPhoneNumber(); + case USERNAME: + return visitor.visitUsername(); + case VEHICLE_ID: + return visitor.visitVehicleId(); + case RELIGION: + return visitor.visitReligion(); + case ORIGIN: + return visitor.visitOrigin(); + case PASSPORT_NUMBER: + return visitor.visitPassportNumber(); + case YEAR: + return visitor.visitYear(); + case CONDITION: + return visitor.visitCondition(); + case LOCATION: + return visitor.visitLocation(); + case LOCATION_CITY: + return visitor.visitLocationCity(); + case LOCATION_COUNTRY: + return visitor.visitLocationCountry(); + case PROJECT: + return visitor.visitProject(); + case LOCATION_ZIP: + return visitor.visitLocationZip(); + case NAME_MEDICAL_PROFESSIONAL: + return visitor.visitNameMedicalProfessional(); + case BANK_ACCOUNT: + return visitor.visitBankAccount(); + case OCCUPATION: + return visitor.visitOccupation(); + case TIME: + return visitor.visitTime(); + case LOCATION_STATE: + return visitor.visitLocationState(); + case EVENT: + return visitor.visitEvent(); + case POLITICAL_AFFILIATION: + return visitor.visitPoliticalAffiliation(); + case LANGUAGE: + return visitor.visitLanguage(); + case ZODIAC_SIGN: + return visitor.visitZodiacSign(); + case PRODUCT: + return visitor.visitProduct(); + case SEXUALITY: + return visitor.visitSexuality(); + case DURATION: + return visitor.visitDuration(); + case PHYSICAL_ATTRIBUTE: + return visitor.visitPhysicalAttribute(); + case LOCATION_ADDRESS_STREET: + return visitor.visitLocationAddressStreet(); + case MEDICAL_PROCESS: + return visitor.visitMedicalProcess(); + case LOCATION_ADDRESS: + return visitor.visitLocationAddress(); + case FILENAME: + return visitor.visitFilename(); + case DOB: + return visitor.visitDob(); + case ORGANIZATION_MEDICAL_FACILITY: + return visitor.visitOrganizationMedicalFacility(); + case ROUTING_NUMBER: + return visitor.visitRoutingNumber(); + case HEALTHCARE_NUMBER: + return visitor.visitHealthcareNumber(); + case GENDER: + return visitor.visitGender(); + case NAME: + return visitor.visitName(); + case DRUG: + return visitor.visitDrug(); + case NONE: + return visitor.visitNone(); + case DATE_INTERVAL: + return visitor.visitDateInterval(); + case MARITAL_STATUS: + return visitor.visitMaritalStatus(); + case CORPORATE_ACTION: + return visitor.visitCorporateAction(); + case AGE: + return visitor.visitAge(); + case CVV: + return visitor.visitCvv(); + case NAME_GIVEN: + return visitor.visitNameGiven(); + case DATE: + return visitor.visitDate(); + case DAY: + return visitor.visitDay(); + case EFFECT: + return visitor.visitEffect(); + case MEDICAL_CODE: + return visitor.visitMedicalCode(); + case NUMERICAL_PII: + return visitor.visitNumericalPii(); + case TREND: + return visitor.visitTrend(); + case INJURY: + return visitor.visitInjury(); + case DRIVER_LICENSE: + return visitor.visitDriverLicense(); + case ALL: + return visitor.visitAll(); + case ORGANIZATION_ID: + return visitor.visitOrganizationId(); + case PASSWORD: + return visitor.visitPassword(); + case DOSE: + return visitor.visitDose(); + case NAME_FAMILY: + return visitor.visitNameFamily(); + case MONEY: + return visitor.visitMoney(); + case URL: + return visitor.visitUrl(); + case LOCATION_COORDINATE: + return visitor.visitLocationCoordinate(); + case FINANCIAL_METRIC: + return visitor.visitFinancialMetric(); + case ORGANIZATION: + return visitor.visitOrganization(); + case IP_ADDRESS: + return visitor.visitIpAddress(); + case BLOOD_TYPE: + return visitor.visitBloodType(); + case MONTH: + return visitor.visitMonth(); + case CREDIT_CARD: + return visitor.visitCreditCard(); + case ACCOUNT_NUMBER: + return visitor.visitAccountNumber(); + case CREDIT_CARD_EXPIRATION: + return visitor.visitCreditCardExpiration(); + case SSN: + return visitor.visitSsn(); + case EMAIL_ADDRESS: + return visitor.visitEmailAddress(); + case STATISTICS: + return visitor.visitStatistics(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static RedactionLevelEntityName valueOf(String value) { + switch (value) { + case "PHONE_NUMBER": + return PHONE_NUMBER; + case "USERNAME": + return USERNAME; + case "VEHICLE_ID": + return VEHICLE_ID; + case "RELIGION": + return RELIGION; + case "ORIGIN": + return ORIGIN; + case "PASSPORT_NUMBER": + return PASSPORT_NUMBER; + case "YEAR": + return YEAR; + case "CONDITION": + return CONDITION; + case "LOCATION": + return LOCATION; + case "LOCATION_CITY": + return LOCATION_CITY; + case "LOCATION_COUNTRY": + return LOCATION_COUNTRY; + case "PROJECT": + return PROJECT; + case "LOCATION_ZIP": + return LOCATION_ZIP; + case "NAME_MEDICAL_PROFESSIONAL": + return NAME_MEDICAL_PROFESSIONAL; + case "BANK_ACCOUNT": + return BANK_ACCOUNT; + case "OCCUPATION": + return OCCUPATION; + case "TIME": + return TIME; + case "LOCATION_STATE": + return LOCATION_STATE; + case "EVENT": + return EVENT; + case "POLITICAL_AFFILIATION": + return POLITICAL_AFFILIATION; + case "LANGUAGE": + return LANGUAGE; + case "ZODIAC_SIGN": + return ZODIAC_SIGN; + case "PRODUCT": + return PRODUCT; + case "SEXUALITY": + return SEXUALITY; + case "DURATION": + return DURATION; + case "PHYSICAL_ATTRIBUTE": + return PHYSICAL_ATTRIBUTE; + case "LOCATION_ADDRESS_STREET": + return LOCATION_ADDRESS_STREET; + case "MEDICAL_PROCESS": + return MEDICAL_PROCESS; + case "LOCATION_ADDRESS": + return LOCATION_ADDRESS; + case "FILENAME": + return FILENAME; + case "DOB": + return DOB; + case "ORGANIZATION_MEDICAL_FACILITY": + return ORGANIZATION_MEDICAL_FACILITY; + case "ROUTING_NUMBER": + return ROUTING_NUMBER; + case "HEALTHCARE_NUMBER": + return HEALTHCARE_NUMBER; + case "GENDER": + return GENDER; + case "NAME": + return NAME; + case "DRUG": + return DRUG; + case "NONE": + return NONE; + case "DATE_INTERVAL": + return DATE_INTERVAL; + case "MARITAL_STATUS": + return MARITAL_STATUS; + case "CORPORATE_ACTION": + return CORPORATE_ACTION; + case "AGE": + return AGE; + case "CVV": + return CVV; + case "NAME_GIVEN": + return NAME_GIVEN; + case "DATE": + return DATE; + case "DAY": + return DAY; + case "EFFECT": + return EFFECT; + case "MEDICAL_CODE": + return MEDICAL_CODE; + case "NUMERICAL_PII": + return NUMERICAL_PII; + case "TREND": + return TREND; + case "INJURY": + return INJURY; + case "DRIVER_LICENSE": + return DRIVER_LICENSE; + case "ALL": + return ALL; + case "ORGANIZATION_ID": + return ORGANIZATION_ID; + case "PASSWORD": + return PASSWORD; + case "DOSE": + return DOSE; + case "NAME_FAMILY": + return NAME_FAMILY; + case "MONEY": + return MONEY; + case "URL": + return URL; + case "LOCATION_COORDINATE": + return LOCATION_COORDINATE; + case "FINANCIAL_METRIC": + return FINANCIAL_METRIC; + case "ORGANIZATION": + return ORGANIZATION; + case "IP_ADDRESS": + return IP_ADDRESS; + case "BLOOD_TYPE": + return BLOOD_TYPE; + case "MONTH": + return MONTH; + case "CREDIT_CARD": + return CREDIT_CARD; + case "ACCOUNT_NUMBER": + return ACCOUNT_NUMBER; + case "CREDIT_CARD_EXPIRATION": + return CREDIT_CARD_EXPIRATION; + case "SSN": + return SSN; + case "EMAIL_ADDRESS": + return EMAIL_ADDRESS; + case "STATISTICS": + return STATISTICS; + default: + return new RedactionLevelEntityName(Value.UNKNOWN, value); + } + } + + public enum Value { + NONE, + + BANK_ACCOUNT, + + CREDIT_CARD, + + CREDIT_CARD_EXPIRATION, + + CVV, + + DATE, + + DATE_INTERVAL, + + DOB, + + DRIVER_LICENSE, + + EMAIL_ADDRESS, + + HEALTHCARE_NUMBER, + + IP_ADDRESS, + + LOCATION, + + NAME, + + NUMERICAL_PII, + + PHONE_NUMBER, + + SSN, + + URL, + + VEHICLE_ID, + + MEDICAL_CODE, + + NAME_FAMILY, + + NAME_GIVEN, + + ACCOUNT_NUMBER, + + EVENT, + + FILENAME, + + GENDER, + + LANGUAGE, + + LOCATION_ADDRESS, + + LOCATION_CITY, + + LOCATION_COORDINATE, + + LOCATION_COUNTRY, + + LOCATION_STATE, + + LOCATION_ZIP, + + MARITAL_STATUS, + + MONEY, + + NAME_MEDICAL_PROFESSIONAL, + + OCCUPATION, + + ORGANIZATION, + + ORGANIZATION_MEDICAL_FACILITY, + + ORIGIN, + + PASSPORT_NUMBER, + + PASSWORD, + + PHYSICAL_ATTRIBUTE, + + POLITICAL_AFFILIATION, + + RELIGION, + + TIME, + + USERNAME, + + ZODIAC_SIGN, + + BLOOD_TYPE, + + CONDITION, + + DOSE, + + DRUG, + + INJURY, + + MEDICAL_PROCESS, + + STATISTICS, + + ROUTING_NUMBER, + + CORPORATE_ACTION, + + FINANCIAL_METRIC, + + PRODUCT, + + TREND, + + DURATION, + + LOCATION_ADDRESS_STREET, + + AGE, + + SEXUALITY, + + EFFECT, + + PROJECT, + + ORGANIZATION_ID, + + DAY, + + MONTH, + + YEAR, + + ALL, + + UNKNOWN + } + + public interface Visitor { + T visitNone(); + + T visitBankAccount(); + + T visitCreditCard(); + + T visitCreditCardExpiration(); + + T visitCvv(); + + T visitDate(); + + T visitDateInterval(); + + T visitDob(); + + T visitDriverLicense(); + + T visitEmailAddress(); + + T visitHealthcareNumber(); + + T visitIpAddress(); + + T visitLocation(); + + T visitName(); + + T visitNumericalPii(); + + T visitPhoneNumber(); + + T visitSsn(); + + T visitUrl(); + + T visitVehicleId(); + + T visitMedicalCode(); + + T visitNameFamily(); + + T visitNameGiven(); + + T visitAccountNumber(); + + T visitEvent(); + + T visitFilename(); + + T visitGender(); + + T visitLanguage(); + + T visitLocationAddress(); + + T visitLocationCity(); + + T visitLocationCoordinate(); + + T visitLocationCountry(); + + T visitLocationState(); + + T visitLocationZip(); + + T visitMaritalStatus(); + + T visitMoney(); + + T visitNameMedicalProfessional(); + + T visitOccupation(); + + T visitOrganization(); + + T visitOrganizationMedicalFacility(); + + T visitOrigin(); + + T visitPassportNumber(); + + T visitPassword(); + + T visitPhysicalAttribute(); + + T visitPoliticalAffiliation(); + + T visitReligion(); + + T visitTime(); + + T visitUsername(); + + T visitZodiacSign(); + + T visitBloodType(); + + T visitCondition(); + + T visitDose(); + + T visitDrug(); + + T visitInjury(); + + T visitMedicalProcess(); + + T visitStatistics(); + + T visitRoutingNumber(); + + T visitCorporateAction(); + + T visitFinancialMetric(); + + T visitProduct(); + + T visitTrend(); + + T visitDuration(); + + T visitLocationAddressStreet(); + + T visitAge(); + + T visitSexuality(); + + T visitEffect(); + + T visitProject(); + + T visitOrganizationId(); + + T visitDay(); + + T visitMonth(); + + T visitYear(); + + T visitAll(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java new file mode 100644 index 00000000..5e9b0807 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java @@ -0,0 +1,106 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class RedactionLevelRedactionType { + public static final RedactionLevelRedactionType DEFAULT = new RedactionLevelRedactionType(Value.DEFAULT, "DEFAULT"); + + public static final RedactionLevelRedactionType PLAIN_TEXT = + new RedactionLevelRedactionType(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final RedactionLevelRedactionType MASKED = new RedactionLevelRedactionType(Value.MASKED, "MASKED"); + + public static final RedactionLevelRedactionType REDACTED = + new RedactionLevelRedactionType(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + RedactionLevelRedactionType(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 RedactionLevelRedactionType + && this.string.equals(((RedactionLevelRedactionType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static RedactionLevelRedactionType valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new RedactionLevelRedactionType(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java new file mode 100644 index 00000000..b7b8e3e5 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java @@ -0,0 +1,198 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ReidentifyFileResponseV2.Builder.class) +public final class ReidentifyFileResponseV2 { + private final Optional status; + + private final Optional outputType; + + private final Optional> output; + + private final Optional metrics; + + private final Map additionalProperties; + + private ReidentifyFileResponseV2( + Optional status, + Optional outputType, + Optional> output, + Optional metrics, + Map additionalProperties) { + this.status = status; + this.outputType = outputType; + this.output = output; + this.metrics = metrics; + this.additionalProperties = additionalProperties; + } + + /** + * @return Status of the reidentification request. + */ + @JsonProperty("status") + public Optional getStatus() { + return status; + } + + /** + * @return Data source of the output file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file. + */ + @JsonProperty("outputType") + public Optional getOutputType() { + return outputType; + } + + /** + * @return Details of output files + */ + @JsonProperty("output") + public Optional> getOutput() { + return output; + } + + @JsonProperty("metrics") + public Optional getMetrics() { + return metrics; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ReidentifyFileResponseV2 && equalTo((ReidentifyFileResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ReidentifyFileResponseV2 other) { + return status.equals(other.status) + && outputType.equals(other.outputType) + && output.equals(other.output) + && metrics.equals(other.metrics); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.status, this.outputType, this.output, this.metrics); + } + + @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 status = Optional.empty(); + + private Optional outputType = Optional.empty(); + + private Optional> output = Optional.empty(); + + private Optional metrics = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ReidentifyFileResponseV2 other) { + status(other.getStatus()); + outputType(other.getOutputType()); + output(other.getOutput()); + metrics(other.getMetrics()); + return this; + } + + /** + *

Status of the reidentification request.

+ */ + @JsonSetter(value = "status", nulls = Nulls.SKIP) + public Builder status(Optional status) { + this.status = status; + return this; + } + + public Builder status(ReidentifyFileResponseV2Status status) { + this.status = Optional.ofNullable(status); + return this; + } + + /** + *

Data source of the output file. BASE64: Base64-encoded file string. SKYFLOW_ID: Reference file by vault ID. PRESIGNED_URL: S3 presigned URL of input file.

+ */ + @JsonSetter(value = "outputType", nulls = Nulls.SKIP) + public Builder outputType(Optional outputType) { + this.outputType = outputType; + return this; + } + + public Builder outputType(ReidentifyFileResponseV2OutputType outputType) { + this.outputType = Optional.ofNullable(outputType); + return this; + } + + /** + *

Details of output files

+ */ + @JsonSetter(value = "output", nulls = Nulls.SKIP) + public Builder output(Optional> output) { + this.output = output; + return this; + } + + public Builder output(List output) { + this.output = Optional.ofNullable(output); + return this; + } + + @JsonSetter(value = "metrics", nulls = Nulls.SKIP) + public Builder metrics(Optional metrics) { + this.metrics = metrics; + return this; + } + + public Builder metrics(Metrics metrics) { + this.metrics = Optional.ofNullable(metrics); + return this; + } + + public ReidentifyFileResponseV2 build() { + return new ReidentifyFileResponseV2(status, outputType, output, metrics, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java new file mode 100644 index 00000000..ad4ea20f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class ReidentifyFileResponseV2OutputType { + public static final ReidentifyFileResponseV2OutputType BASE64 = + new ReidentifyFileResponseV2OutputType(Value.BASE64, "BASE64"); + + public static final ReidentifyFileResponseV2OutputType SKYFLOW_ID = + new ReidentifyFileResponseV2OutputType(Value.SKYFLOW_ID, "SKYFLOW_ID"); + + public static final ReidentifyFileResponseV2OutputType PRESIGNED_URL = + new ReidentifyFileResponseV2OutputType(Value.PRESIGNED_URL, "PRESIGNED_URL"); + + private final Value value; + + private final String string; + + ReidentifyFileResponseV2OutputType(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 ReidentifyFileResponseV2OutputType + && this.string.equals(((ReidentifyFileResponseV2OutputType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case BASE64: + return visitor.visitBase64(); + case SKYFLOW_ID: + return visitor.visitSkyflowId(); + case PRESIGNED_URL: + return visitor.visitPresignedUrl(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static ReidentifyFileResponseV2OutputType valueOf(String value) { + switch (value) { + case "BASE64": + return BASE64; + case "SKYFLOW_ID": + return SKYFLOW_ID; + case "PRESIGNED_URL": + return PRESIGNED_URL; + default: + return new ReidentifyFileResponseV2OutputType(Value.UNKNOWN, value); + } + } + + public enum Value { + BASE64, + + SKYFLOW_ID, + + PRESIGNED_URL, + + UNKNOWN + } + + public interface Visitor { + T visitBase64(); + + T visitSkyflowId(); + + T visitPresignedUrl(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java new file mode 100644 index 00000000..250bd1a9 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java @@ -0,0 +1,119 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class ReidentifyFileResponseV2Status { + public static final ReidentifyFileResponseV2Status IN_PROGRESS = + new ReidentifyFileResponseV2Status(Value.IN_PROGRESS, "IN_PROGRESS"); + + public static final ReidentifyFileResponseV2Status QUEUED = + new ReidentifyFileResponseV2Status(Value.QUEUED, "QUEUED"); + + public static final ReidentifyFileResponseV2Status SUCCESS = + new ReidentifyFileResponseV2Status(Value.SUCCESS, "SUCCESS"); + + public static final ReidentifyFileResponseV2Status UNKNOWN = + new ReidentifyFileResponseV2Status(Value.UNKNOWN, "UNKNOWN"); + + public static final ReidentifyFileResponseV2Status FAILED = + new ReidentifyFileResponseV2Status(Value.FAILED, "FAILED"); + + private final Value value; + + private final String string; + + ReidentifyFileResponseV2Status(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 ReidentifyFileResponseV2Status + && this.string.equals(((ReidentifyFileResponseV2Status) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case IN_PROGRESS: + return visitor.visitInProgress(); + case QUEUED: + return visitor.visitQueued(); + case SUCCESS: + return visitor.visitSuccess(); + case UNKNOWN: + return visitor.visitUnknown(); + case FAILED: + return visitor.visitFailed(); + case _UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static ReidentifyFileResponseV2Status valueOf(String value) { + switch (value) { + case "IN_PROGRESS": + return IN_PROGRESS; + case "QUEUED": + return QUEUED; + case "SUCCESS": + return SUCCESS; + case "UNKNOWN": + return UNKNOWN; + case "FAILED": + return FAILED; + default: + return new ReidentifyFileResponseV2Status(Value._UNKNOWN, value); + } + } + + public enum Value { + UNKNOWN, + + FAILED, + + SUCCESS, + + IN_PROGRESS, + + QUEUED, + + _UNKNOWN + } + + public interface Visitor { + T visitUnknown(); + + T visitFailed(); + + T visitSuccess(); + + T visitInProgress(); + + T visitQueued(); + + T visitUnknown(String unknownType); + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java new file mode 100644 index 00000000..2c836067 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java @@ -0,0 +1,134 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ReidentifyStringResponseV2.Builder.class) +public final class ReidentifyStringResponseV2 { + private final Optional processedText; + + private final Optional metrics; + + private final Map additionalProperties; + + private ReidentifyStringResponseV2( + Optional processedText, Optional metrics, Map additionalProperties) { + this.processedText = processedText; + this.metrics = metrics; + this.additionalProperties = additionalProperties; + } + + /** + * @return Reidentified text. + */ + @JsonProperty("processedText") + public Optional getProcessedText() { + return processedText; + } + + @JsonProperty("metrics") + public Optional getMetrics() { + return metrics; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ReidentifyStringResponseV2 && equalTo((ReidentifyStringResponseV2) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ReidentifyStringResponseV2 other) { + return processedText.equals(other.processedText) && metrics.equals(other.metrics); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.processedText, this.metrics); + } + + @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 processedText = Optional.empty(); + + private Optional metrics = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ReidentifyStringResponseV2 other) { + processedText(other.getProcessedText()); + metrics(other.getMetrics()); + return this; + } + + /** + *

Reidentified text.

+ */ + @JsonSetter(value = "processedText", nulls = Nulls.SKIP) + public Builder processedText(Optional processedText) { + this.processedText = processedText; + return this; + } + + public Builder processedText(String processedText) { + this.processedText = Optional.ofNullable(processedText); + return this; + } + + @JsonSetter(value = "metrics", nulls = Nulls.SKIP) + public Builder metrics(Optional metrics) { + this.metrics = metrics; + return this; + } + + public Builder metrics(Metrics metrics) { + this.metrics = Optional.ofNullable(metrics); + return this; + } + + public ReidentifyStringResponseV2 build() { + return new ReidentifyStringResponseV2(processedText, metrics, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java b/common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java new file mode 100644 index 00000000..78879313 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java @@ -0,0 +1,140 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.detect.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TransformationShiftDates.Builder.class) +public final class TransformationShiftDates { + private final Optional minDays; + + private final Optional maxDays; + + private final Map additionalProperties; + + private TransformationShiftDates( + Optional minDays, Optional maxDays, Map additionalProperties) { + this.minDays = minDays; + this.maxDays = maxDays; + this.additionalProperties = additionalProperties; + } + + /** + * @return Minimum number of days to shift dates. + */ + @JsonProperty("minDays") + public Optional getMinDays() { + return minDays; + } + + /** + * @return Maximum number of days to shift dates. + */ + @JsonProperty("maxDays") + public Optional getMaxDays() { + return maxDays; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TransformationShiftDates && equalTo((TransformationShiftDates) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TransformationShiftDates other) { + return minDays.equals(other.minDays) && maxDays.equals(other.maxDays); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.minDays, this.maxDays); + } + + @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 minDays = Optional.empty(); + + private Optional maxDays = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TransformationShiftDates other) { + minDays(other.getMinDays()); + maxDays(other.getMaxDays()); + return this; + } + + /** + *

Minimum number of days to shift dates.

+ */ + @JsonSetter(value = "minDays", nulls = Nulls.SKIP) + public Builder minDays(Optional minDays) { + this.minDays = minDays; + return this; + } + + public Builder minDays(Integer minDays) { + this.minDays = Optional.ofNullable(minDays); + return this; + } + + /** + *

Maximum number of days to shift dates.

+ */ + @JsonSetter(value = "maxDays", nulls = Nulls.SKIP) + public Builder maxDays(Optional maxDays) { + this.maxDays = maxDays; + return this; + } + + public Builder maxDays(Integer maxDays) { + this.maxDays = Optional.ofNullable(maxDays); + return this; + } + + public TransformationShiftDates build() { + return new TransformationShiftDates(minDays, maxDays, 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/common/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java index 418d08bc..2051cedc 100644 --- a/common/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -1,6 +1,34 @@ package com.skyflow.logs; public enum ErrorLogs { + CHECK_GUARDRAILS_REQUEST_NULL("Invalid %s1 request. CheckGuardrails request can not be null."), + INVALID_TEXT_IN_CHECK_GUARDRAILS("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), + CHECK_GUARDRAILS_REQUEST_REJECTED("Check guardrails request resulted in failure."), + GET_RUN_REQUEST_NULL("Invalid %s1 request. GetRun request can not be null."), + INVALID_RUN_ID_IN_GET_RUN("Invalid %s1 request. The runId field is required and must be a non-empty string. Specify a valid run id."), + GET_RUN_REQUEST_REJECTED("Get run request resulted in failure."), + DEIDENTIFY_STRING_REQUEST_NULL("Invalid %s1 request. DeidentifyString request can not be null."), + INVALID_TEXT_IN_DEIDENTIFY_STRING("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), + DEIDENTIFY_STRING_REQUEST_REJECTED("DeIdentify string request resulted in failure."), + REIDENTIFY_STRING_REQUEST_NULL("Invalid %s1 request. ReidentifyString request can not be null."), + INVALID_TEXT_IN_REIDENTIFY_STRING("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), + REIDENTIFY_STRING_REQUEST_REJECTED("ReIdentify string request resulted in failure."), + DEIDENTIFY_FILE_REQUEST_NULL("Invalid %s1 request. DeidentifyFile request can not be null."), + INVALID_DATA_SOURCE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required unless a file is supplied."), + INVALID_VALUE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The value field is required and must be a non-empty string unless a file is supplied."), + MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE("Invalid %s1 request. Specify either value or file, not both."), + FILE_NOT_FOUND_IN_DEIDENTIFY_FILE("Invalid %s1 request. The file to deidentify was not found."), + FAILED_TO_ENCODE_FILE_IN_DEIDENTIFY_FILE("Invalid %s1 request. Failed to read and encode the file to deidentify."), + INVALID_WAIT_TIME_IN_POLL_OPTIONS("Invalid %s1 request. waitTime in pollOptions must be between 1 and 300."), + INVALID_MAX_ATTEMPTS_IN_POLL_OPTIONS("Invalid %s1 request. maxAttempts in pollOptions must be between 1 and 23."), + OUTPUT_DIRECTORY_WITHOUT_POLL_OPTIONS("Invalid %s1 request. outputDirectory requires pollOptions."), + DEIDENTIFY_FILE_REQUEST_REJECTED("DeIdentify file request resulted in failure."), + OUTPUT_DIRECTORY_NOT_CREATED("Could not create output directory %s1."), + OUTPUT_FILE_NOT_WRITTEN("Could not write processed output to %s1."), + REIDENTIFY_FILE_REQUEST_NULL("Invalid %s1 request. ReidentifyFile request can not be null."), + INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), + INVALID_VALUE_IN_REIDENTIFY_FILE("Invalid %s1 request. The value field is required and must be a non-empty string. Specify the base64 content, skyflow id or presigned URL of the file."), + REIDENTIFY_FILE_REQUEST_REJECTED("ReIdentify file request resulted in failure."), // Client initialization VAULT_CONFIG_EXISTS("Vault config with vault ID %s1 already exists."), VAULT_CONFIG_DOES_NOT_EXIST("Vault config with vault ID %s1 doesn't exist."), @@ -184,7 +212,6 @@ public enum ErrorLogs { REIDENTIFY_TEXT_REQUEST_NULL("Invalid %s1 request. ReidentifyText request can not be null."), INVALID_TEXT_IN_REIDENTIFY("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), REIDENTIFY_TEXT_REQUEST_REJECTED("ReIdentify text request resulted in failure."), - DEIDENTIFY_FILE_REQUEST_REJECTED("DeIdentify file request resulted in failure."), GET_DETECT_RUN_REQUEST_REJECTED("Get detect run request resulted in failure."), INVALID_NULL_FILE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The file field is required and must not be null. Specify a valid file."), FILE_NOT_FOUND_TO_DEIDENTIFY("Invalid %s1 request. The file field is required and must not be empty. Specify a valid file."), diff --git a/common/src/main/java/com/skyflow/logs/InfoLogs.java b/common/src/main/java/com/skyflow/logs/InfoLogs.java index b4045229..3c332232 100644 --- a/common/src/main/java/com/skyflow/logs/InfoLogs.java +++ b/common/src/main/java/com/skyflow/logs/InfoLogs.java @@ -1,6 +1,37 @@ package com.skyflow.logs; public enum InfoLogs { + CHECK_GUARDRAILS_TRIGGERED("Check guardrails method triggered."), + VALIDATE_CHECK_GUARDRAILS_REQUEST("Validating check guardrails request."), + CHECK_GUARDRAILS_REQUEST_RESOLVED("Check guardrails request resolved."), + CHECK_GUARDRAILS_SUCCESS("Guardrails check completed."), + GET_RUN_TRIGGERED("Get run method triggered."), + VALIDATE_GET_RUN_REQUEST("Validating get run request."), + GET_RUN_REQUEST_RESOLVED("Get run request resolved."), + GET_RUN_SUCCESS("Detect run retrieved."), + DEIDENTIFY_STRING_TRIGGERED("DeIdentify string method triggered."), + VALIDATE_DEIDENTIFY_STRING_REQUEST("Validating deidentify string request."), + DEIDENTIFY_STRING_REQUEST_RESOLVED("DeIdentify string request resolved."), + DEIDENTIFY_STRING_SUCCESS("String data de-identified."), + REIDENTIFY_STRING_TRIGGERED("ReIdentify string method triggered."), + VALIDATE_REIDENTIFY_STRING_REQUEST("Validating reidentify string request."), + REIDENTIFY_STRING_REQUEST_RESOLVED("ReIdentify string request resolved."), + REIDENTIFY_STRING_SUCCESS("String data re-identified."), + DEIDENTIFY_FILE_TRIGGERED("DeIdentify file method triggered."), + VALIDATE_DEIDENTIFY_FILE_REQUEST("Validating deidentify file request."), + DEIDENTIFY_FILE_REQUEST_RESOLVED("DeIdentify file request resolved."), + DEIDENTIFY_FILE_RUN_SUBMITTED("DeIdentify file run %s1 submitted; retrieve it with getRun."), + DEIDENTIFY_FILE_SUCCESS("File data de-identified."), + POLL_RUN_STARTED("Polling run %s1 for up to %s2 seconds and %s3 attempts."), + POLL_RUN_TERMINAL("Run %s1 reached status %s2 after %s3 attempts."), + POLL_RUN_BUDGET_EXHAUSTED("Run %s1 still %s2 after %s3 attempts and %s4 seconds; returning run id."), + POLL_RUN_INTERRUPTED("Polling of run %s1 interrupted while %s2; returning run id."), + OUTPUT_FILE_WRITTEN("Processed output written to %s1."), + OUTPUT_NOT_WRITTEN_FOR_OUTPUT_TYPE("Outputs delivered as %s1 are not written to disk."), + REIDENTIFY_FILE_TRIGGERED("ReIdentify file method triggered."), + VALIDATE_REIDENTIFY_FILE_REQUEST("Validating reidentify file request."), + REIDENTIFY_FILE_REQUEST_RESOLVED("ReIdentify file request resolved."), + REIDENTIFY_FILE_SUCCESS("File data re-identified."), // Client initialization CLIENT_INITIALIZED("Initialized skyflow client."), VALIDATING_VAULT_CONFIG("Validating vault config."), @@ -91,10 +122,6 @@ public enum InfoLogs { VALIDATE_REIDENTIFY_TEXT_REQUEST("Validating reidentify text request."), REIDENTIFY_TEXT_TRIGGERED("ReIdentify text method triggered."), REIDENTIFY_TEXT_REQUEST_RESOLVED("ReIdentify text request resolved."), - DEIDENTIFY_FILE_TRIGGERED("DeIdentify file method triggered."), - VALIDATE_DEIDENTIFY_FILE_REQUEST("Validating deidentify file request."), - DEIDENTIFY_FILE_REQUEST_RESOLVED("DeIdentify file request resolved."), - DEIDENTIFY_FILE_SUCCESS("File deidentified successfully."), GET_DETECT_RUN_TRIGGERED("Get detect run method triggered."), VALIDATE_GET_DETECT_RUN_REQUEST("Validating get detect run request."), REIDENTIFY_TEXT_SUCCESS("Text data re-identified."), diff --git a/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java index 882df51c..a98f4e3a 100644 --- a/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java @@ -2,7 +2,7 @@ import com.google.gson.*; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.auth.rest.ApiClient; import com.skyflow.generated.auth.rest.ApiClientBuilder; @@ -56,7 +56,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentials( try { if (credentialsFile == null) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidCredentials.getMessage()); } FileReader reader = new FileReader(String.valueOf(credentialsFile)); try { @@ -68,11 +68,11 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentials( } catch (JsonSyntaxException | IllegalStateException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( - ErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); + BaseErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); } catch (FileNotFoundException e) { LogUtil.printErrorLog(ErrorLogs.CREDENTIALS_FILE_NOT_FOUND.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( - ErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); + BaseErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); } } @@ -83,14 +83,14 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentialString( try { if (credentials == null || credentials.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidCredentials.getMessage()); } JsonObject serviceAccountCredentials = JsonParser.parseString(credentials).getAsJsonObject(); return getBearerTokenFromCredentials(serviceAccountCredentials, context, roles); } catch (JsonSyntaxException | IllegalStateException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.CredentialsStringInvalidJson.getMessage()); + BaseErrorMessage.CredentialsStringInvalidJson.getMessage()); } } @@ -101,7 +101,7 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( JsonElement privateKey = credentials.get("privateKey"); if (privateKey == null) { LogUtil.printErrorLog(ErrorLogs.PRIVATE_KEY_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingPrivateKey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingPrivateKey.getMessage()); } // Accept both new-form keys (clientId/keyId/tokenUri) and legacy all-caps form for migration @@ -114,7 +114,7 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( } if (clientId == null) { LogUtil.printErrorLog(ErrorLogs.CLIENT_ID_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingClientId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingClientId.getMessage()); } JsonElement keyId = credentials.get("keyId"); @@ -126,7 +126,7 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( } if (keyId == null) { LogUtil.printErrorLog(ErrorLogs.KEY_ID_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingKeyId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingKeyId.getMessage()); } JsonElement tokenUri = credentials.get("tokenUri"); @@ -138,7 +138,7 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( } if (tokenUri == null) { LogUtil.printErrorLog(ErrorLogs.TOKEN_URI_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingTokenUri.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingTokenUri.getMessage()); } PrivateKey pvtKey = BaseUtils.getPrivateKeyFromPem(privateKey.getAsString()); @@ -160,7 +160,7 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( return authenticationApi.authenticationServiceGetAuthToken(authTokenBuilder.build()); } catch (MalformedURLException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_TOKEN_URI.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidTokenUri.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidTokenUri.getMessage()); } catch (ApiClientApiException e) { String bodyString = GSON.toJson(e.body()); LogUtil.printErrorLog(ErrorLogs.BEARER_TOKEN_REJECTED.getLog()); @@ -218,7 +218,7 @@ public synchronized String getBearerToken() throws SkyflowException { private static String extractAccessToken(V1GetAuthTokenResponse response) throws SkyflowException { if (!response.getAccessToken().isPresent()) { LogUtil.printErrorLog(ErrorLogs.MISSING_ACCESS_TOKEN.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingAccessToken.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingAccessToken.getMessage()); } return response.getAccessToken().get(); } diff --git a/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java index 630a0aee..a4a2c57d 100644 --- a/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java @@ -5,7 +5,7 @@ import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -49,7 +49,7 @@ private static List generateSignedTokenFromCredentialsF try { if (credentialsFile == null) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidCredentials.getMessage()); } FileReader reader = new FileReader(String.valueOf(credentialsFile)); try { @@ -61,11 +61,11 @@ private static List generateSignedTokenFromCredentialsF } catch (JsonSyntaxException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( - ErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); + BaseErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); } catch (FileNotFoundException e) { LogUtil.printErrorLog(ErrorLogs.CREDENTIALS_FILE_NOT_FOUND.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( - ErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); + BaseErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); } return responseToken; } @@ -78,14 +78,14 @@ private static List generateSignedTokensFromCredentials try { if (credentials == null || credentials.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidCredentials.getMessage()); } JsonObject serviceAccountCredentials = JsonParser.parseString(credentials).getAsJsonObject(); responseToken = generateSignedTokensFromCredentials(serviceAccountCredentials, dataTokens, timeToLive, context); } catch (JsonSyntaxException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.CredentialsStringInvalidJson.getMessage()); + BaseErrorMessage.CredentialsStringInvalidJson.getMessage()); } return responseToken; } @@ -98,7 +98,7 @@ private static List generateSignedTokensFromCredentials JsonElement privateKey = credentials.get("privateKey"); if (privateKey == null) { LogUtil.printErrorLog(ErrorLogs.PRIVATE_KEY_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingPrivateKey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingPrivateKey.getMessage()); } // Accept both new-form keys (clientId/keyId) and legacy all-caps form for migration @@ -111,7 +111,7 @@ private static List generateSignedTokensFromCredentials } if (clientId == null) { LogUtil.printErrorLog(ErrorLogs.CLIENT_ID_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingClientId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingClientId.getMessage()); } JsonElement keyId = credentials.get("keyId"); @@ -123,7 +123,7 @@ private static List generateSignedTokensFromCredentials } if (keyId == null) { LogUtil.printErrorLog(ErrorLogs.KEY_ID_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingKeyId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingKeyId.getMessage()); } PrivateKey pvtKey = BaseUtils.getPrivateKeyFromPem(privateKey.getAsString()); signedDataTokens = getSignedToken( diff --git a/common/src/main/java/com/skyflow/serviceaccount/util/Token.java b/common/src/main/java/com/skyflow/serviceaccount/util/Token.java index 0359d944..19edf0c8 100644 --- a/common/src/main/java/com/skyflow/serviceaccount/util/Token.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/Token.java @@ -5,7 +5,7 @@ import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -29,7 +29,7 @@ public static boolean isExpired(String token) { JsonElement exp = decoded(token).get("exp"); if (exp == null) { LogUtil.printErrorLog(ErrorLogs.INVALID_BEARER_TOKEN.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtDecodeError.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.JwtDecodeError.getMessage()); } expiryTime = exp.getAsLong(); @@ -44,14 +44,14 @@ static JsonObject decoded(String encodedToken) throws JsonSyntaxException, Skyfl String[] split = encodedToken.split("\\."); if (split.length < 3) { LogUtil.printErrorLog(ErrorLogs.INVALID_BEARER_TOKEN.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtDecodeError.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.JwtDecodeError.getMessage()); } try { byte[] decodedBytes = Base64.getUrlDecoder().decode(split[1]); return JsonParser.parseString(new String(decodedBytes, StandardCharsets.UTF_8)).getAsJsonObject(); } catch (IllegalArgumentException | IllegalStateException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_BEARER_TOKEN.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtDecodeError.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.JwtDecodeError.getMessage()); } } } diff --git a/common/src/main/java/com/skyflow/utils/BaseConstants.java b/common/src/main/java/com/skyflow/utils/BaseConstants.java index e9946a40..8d0ea8d8 100644 --- a/common/src/main/java/com/skyflow/utils/BaseConstants.java +++ b/common/src/main/java/com/skyflow/utils/BaseConstants.java @@ -27,6 +27,7 @@ public class BaseConstants { public static final String SDK_METRIC_RUNTIME_DETAILS_PREFIX = "Java@"; public static final String SDK_AUTH_HEADER_KEY = "x-skyflow-authorization"; public static final String SDK_METRICS_HEADER_KEY = "sky-metadata"; + public static final String PROCESSED_FILE_NAME_PREFIX = "processed-"; public static final String REQUEST_ID_HEADER_KEY = "x-request-id"; public static final String ERROR_FROM_CLIENT_HEADER_KEY = "error-from-client"; diff --git a/common/src/main/java/com/skyflow/utils/BaseUtils.java b/common/src/main/java/com/skyflow/utils/BaseUtils.java index e536c111..8e076c1b 100644 --- a/common/src/main/java/com/skyflow/utils/BaseUtils.java +++ b/common/src/main/java/com/skyflow/utils/BaseUtils.java @@ -15,7 +15,7 @@ import com.skyflow.config.BaseCredentials; import com.skyflow.enums.Env; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -87,11 +87,11 @@ public static PrivateKey getPrivateKeyFromPem(String pemKey) throws SkyflowExcep privateKey = parsePkcs8PrivateKey(Base64.getDecoder().decode(privateKeyContent)); } catch (IllegalArgumentException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_KEY_SPEC.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidKeySpec.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidKeySpec.getMessage()); } } else { LogUtil.printErrorLog(ErrorLogs.JWT_INVALID_FORMAT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtInvalidFormat.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.JwtInvalidFormat.getMessage()); } return privateKey; } @@ -165,10 +165,10 @@ private static PrivateKey parsePkcs8PrivateKey(byte[] pkcs8Bytes) throws Skyflow privateKey = keyFactory.generatePrivate(keySpec); } catch (NoSuchAlgorithmException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_ALGORITHM.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidAlgorithm.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidAlgorithm.getMessage()); } catch (InvalidKeySpecException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_KEY_SPEC.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidKeySpec.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidKeySpec.getMessage()); } return privateKey; } diff --git a/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java b/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java index b542589a..89bfb501 100644 --- a/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java +++ b/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java @@ -2,7 +2,7 @@ import com.skyflow.config.BaseCredentials; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.BaseConstants; @@ -21,7 +21,7 @@ public class BaseValidations { public static void validateCredentials(BaseCredentials credentials) throws SkyflowException { if (credentials == null) { LogUtil.printErrorLog(ErrorLogs.CREDENTIALS_IS_NULL.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullCredentials.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.NullCredentials.getMessage()); } int nonNullMembers = 0; String path = credentials.getPath(); @@ -39,38 +39,38 @@ public static void validateCredentials(BaseCredentials credentials) throws Skyfl if (nonNullMembers > 1) { LogUtil.printErrorLog(ErrorLogs.MULTIPLE_TOKEN_GENERATION_MEANS_PASSED.getLog()); throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() + ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() ); } else if (nonNullMembers < 1) { LogUtil.printErrorLog(ErrorLogs.NO_TOKEN_GENERATION_MEANS_PASSED.getLog()); throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NoTokenGenerationMeansPassed.getMessage() + ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage() ); } else if (path != null && path.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_PATH.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialFilePath.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentialFilePath.getMessage()); } else if (credentialsString != null && credentialsString.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_STRING.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialsString.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentialsString.getMessage()); } else if (token != null && token.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_TOKEN_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyToken.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyToken.getMessage()); } else if (apiKey != null) { if (apiKey.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_API_KEY_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyApikey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyApikey.getMessage()); } else { Pattern pattern = Pattern.compile(BaseConstants.API_KEY_REGEX); Matcher matcher = pattern.matcher(apiKey); if (!matcher.matches()) { LogUtil.printErrorLog(ErrorLogs.INVALID_API_KEY.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidApikey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidApikey.getMessage()); } } } else if (roles != null) { if (roles.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_ROLES.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoles.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyRoles.getMessage()); } else { for (int index = 0; index < roles.size(); index++) { String role = roles.get(index); @@ -78,7 +78,7 @@ public static void validateCredentials(BaseCredentials credentials) throws Skyfl LogUtil.printErrorLog(BaseUtils.parameterizedString( ErrorLogs.EMPTY_OR_NULL_ROLE_IN_ROLES.getLog(), Integer.toString(index) )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoleInRoles.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyRoleInRoles.getMessage()); } } } @@ -88,13 +88,13 @@ public static void validateCredentials(BaseCredentials credentials) throws Skyfl String ctxStr = (String) context; if (ctxStr.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyContext.getMessage()); } } else if (context instanceof Map) { Map ctxMap = (Map) context; if (ctxMap.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyContext.getMessage()); } Pattern ctxKeyPattern = Pattern.compile(BaseConstants.CONTEXT_KEY_REGEX); for (Object key : ctxMap.keySet()) { @@ -103,12 +103,12 @@ public static void validateCredentials(BaseCredentials credentials) throws Skyfl LogUtil.printErrorLog(BaseUtils.parameterizedString( ErrorLogs.INVALID_CONTEXT_MAP_KEY.getLog(), keyStr)); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - BaseUtils.parameterizedString(ErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); + BaseUtils.parameterizedString(BaseErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); } } } else { LogUtil.printErrorLog(ErrorLogs.INVALID_CONTEXT_TYPE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidContextType.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidContextType.getMessage()); } } } diff --git a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java new file mode 100644 index 00000000..71f6217d --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java @@ -0,0 +1,379 @@ +package com.skyflow.vault.controller; + +import com.skyflow.BaseVaultClient; +import com.skyflow.config.BaseCredentials; +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.detect.internal.DetectRequestMapper; +import com.skyflow.detect.internal.DetectResponseMapper; +import com.skyflow.detect.internal.DetectValidations; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ClientOptions; +import com.skyflow.generated.detect.rest.core.Environment; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.filesv2.FilesV2Client; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.GuardrailsV2Client; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.StringsV2Client; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.logger.LogUtil; + +/** + * Shared implementation of the Skyflow Detect V2 API. Each SDK's {@code DetectController} + * extends this class and supplies only what differs per vault type: how the vault URL is + * resolved, the SDK metrics header, and any vault-level timeout and retry overrides. + * + *

Credentials, bearer-token refresh and the vault configuration come from + * {@link BaseVaultClient}. The generated V2 client is created lazily and rebuilt whenever the + * vault URL or the effective HTTP settings change. + * + * @param the SDK's vault configuration type + */ +public abstract class BaseDetectController extends BaseVaultClient { + private static final String AUTHORIZATION_HEADER = "Authorization"; + private static final String BEARER_PREFIX = "Bearer "; + + private Integer commonTimeoutSeconds; + private Integer commonMaxRetries; + private Long commonInitialRetryDelayMillis; + private Long commonMaxRetryDelayMillis; + + private ClientOptions clientOptions; + private String clientOptionsKey; + private StringsV2Client stringsClient; + private FilesV2Client filesClient; + private GuardrailsV2Client guardrailsClient; + + protected BaseDetectController(V vaultConfig, BaseCredentials credentials) { + super(vaultConfig, credentials); + } + + // ------------------------------------------------------------------ + // Hooks for the concrete SDK controllers + // ------------------------------------------------------------------ + + /** + * @return the vault base URL requests are sent to, for example + * {@code https://.vault.skyflowapis.com} + * @throws SkyflowException if the URL cannot be determined + */ + protected abstract String resolveVaultUrl() throws SkyflowException; + + /** + * @return JSON sent in the {@code sky-metadata} header. Override to report SDK name and version. + */ + protected String getSdkMetrics() { + return "{}"; + } + + /** + * Resolves the bearer token or API key for the next call, refreshing it when expired. + * The default uses the credential chain in {@link BaseVaultClient}. + */ + protected String resolveToken() throws SkyflowException { + setBearerToken(this.vaultConfig.getCredentials()); + return this.token; + } + + /** @return overall call timeout in seconds, or {@code null} for the transport default */ + protected Integer effectiveTimeoutSeconds() { + return commonTimeoutSeconds; + } + + /** @return retries on retryable HTTP statuses, or {@code null} for the transport default */ + protected Integer effectiveMaxRetries() { + return commonMaxRetries; + } + + protected Long effectiveInitialRetryDelayMillis() { + return commonInitialRetryDelayMillis; + } + + protected Long effectiveMaxRetryDelayMillis() { + return commonMaxRetryDelayMillis; + } + + // ------------------------------------------------------------------ + // Lifecycle, driven by each SDK's Skyflow builder. Public because the builders live in + // com.skyflow while this class lives in com.skyflow.vault.controller; applications have + // no reason to call these directly. + // ------------------------------------------------------------------ + + /** Applies client-level credentials; vault-level credentials keep precedence. */ + public void setCommonCredentials(BaseCredentials commonCredentials) throws SkyflowException { + this.commonCredentials = commonCredentials; + prioritiseCredentials(this.vaultConfig.getCredentials()); + onCommonCredentialsUpdated(commonCredentials); + } + + /** + * Called after client-level credentials change. Subclasses that hold other clients (for + * example a V1 delegate) override this to forward the update; the default does nothing. + */ + protected void onCommonCredentialsUpdated(BaseCredentials commonCredentials) throws SkyflowException { + } + + /** Applies client-level timeout and retry settings; vault-level settings keep precedence. */ + public synchronized void setCommonHttpConfig(Integer timeoutSeconds, Integer maxRetries, + Long initialRetryDelayMillis, Long maxRetryDelayMillis) { + this.commonTimeoutSeconds = timeoutSeconds; + this.commonMaxRetries = maxRetries; + this.commonInitialRetryDelayMillis = initialRetryDelayMillis; + this.commonMaxRetryDelayMillis = maxRetryDelayMillis; + invalidateClients(); + } + + /** Replaces the vault configuration, for example after {@code updateVaultConfig}. */ + public synchronized void setVaultConfig(V vaultConfig) throws SkyflowException { + this.vaultConfig = vaultConfig; + invalidateClients(); + } + + /** Forces the vault URL to be resolved again on the next call. */ + public synchronized void refreshVaultUrl() throws SkyflowException { + invalidateClients(); + } + + /** Drops cached generated clients so the next call rebuilds them from current settings. */ + protected synchronized void invalidateClients() { + this.clientOptions = null; + this.clientOptionsKey = null; + this.stringsClient = null; + this.filesClient = null; + this.guardrailsClient = null; + } + + // ------------------------------------------------------------------ + // Detect V2 operations + // ------------------------------------------------------------------ + + /** + * Detects and de-identifies sensitive data in a string. Synchronous. + * + * @param request text plus exactly one of a stored configuration id or an inline configuration + * @return processed text, detected entities and metrics + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public DeidentifyStringResponse deidentifyString(DeidentifyStringRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_STRING_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_STRING_REQUEST.getLog()); + DetectValidations.validateDeidentifyStringRequest(request); + String token = resolveToken(); + DeidentifyStringRequestV2 apiRequest = + DetectRequestMapper.toDeidentifyStringRequest(request, this.vaultConfig.getVaultId()); + try { + DeidentifyStringResponseV2 apiResponse = stringsClient().deidentifyStringV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_STRING_REQUEST_RESOLVED.getLog()); + DeidentifyStringResponse response = DetectResponseMapper.toDeidentifyStringResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_STRING_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.DEIDENTIFY_STRING_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_STRING_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + + /** + * Replaces tokens in a string with their original values or a redacted rendering. Synchronous. + * + * @param request text containing tokens plus optional per-group redaction rules + * @return re-identified text and metrics + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public ReidentifyStringResponse reidentifyString(ReidentifyStringRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_STRING_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_STRING_REQUEST.getLog()); + DetectValidations.validateReidentifyStringRequest(request); + String token = resolveToken(); + ReidentifyStringRequestV2 apiRequest = + DetectRequestMapper.toReidentifyStringRequest(request, this.vaultConfig.getVaultId()); + try { + ReidentifyStringResponseV2 apiResponse = stringsClient().reidentifyStringV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_STRING_REQUEST_RESOLVED.getLog()); + ReidentifyStringResponse response = DetectResponseMapper.toReidentifyStringResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_STRING_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.REIDENTIFY_STRING_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_STRING_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + + /** + * Retrieves the status and, once complete, the outputs of a Detect file run. + * + * @param request the run id returned by {@code deidentifyFile} + * @return status, output files, metrics and failure message + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public GetRunResponse getRun(GetRunRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.GET_RUN_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_GET_RUN_REQUEST.getLog()); + DetectValidations.validateGetRunRequest(request); + String token = resolveToken(); + String runId = request.getRunId().trim(); + GetRunV2Request apiRequest = GetRunV2Request.builder().vaultId(this.vaultConfig.getVaultId()).build(); + try { + DetectRunsResponseV2 apiResponse = filesClient().getRunV2(runId, apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.GET_RUN_REQUEST_RESOLVED.getLog()); + GetRunResponse response = DetectResponseMapper.toGetRunResponse(runId, apiResponse); + LogUtil.printInfoLog(InfoLogs.GET_RUN_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.GET_RUN_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.GET_RUN_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + + /** + * Screens text for toxicity and denied topics. Synchronous. + * + * @param request text plus the checks to apply + * @return the overall validation result and the individual check outcomes + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public CheckGuardrailsResponse checkGuardrails(CheckGuardrailsRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.CHECK_GUARDRAILS_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_CHECK_GUARDRAILS_REQUEST.getLog()); + DetectValidations.validateCheckGuardrailsRequest(request); + String token = resolveToken(); + DetectGuardrailsRequestV2 apiRequest = + DetectRequestMapper.toCheckGuardrailsRequest(request, this.vaultConfig.getVaultId()); + try { + DetectGuardrailsResponseV2 apiResponse = guardrailsClient().checkGuardrailsV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.CHECK_GUARDRAILS_REQUEST_RESOLVED.getLog()); + CheckGuardrailsResponse response = DetectResponseMapper.toCheckGuardrailsResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.CHECK_GUARDRAILS_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.CHECK_GUARDRAILS_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.CHECK_GUARDRAILS_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + + // ------------------------------------------------------------------ + // Transport plumbing + // ------------------------------------------------------------------ + + /** + * @return client options for the current URL, vault id and HTTP settings, rebuilt when any change + */ + private synchronized ClientOptions clientOptions() throws SkyflowException { + String vaultUrl = resolveVaultUrl(); + String key = clientKey(vaultUrl); + if (clientOptions == null || !key.equals(clientOptionsKey)) { + clientOptions = buildClientOptions(vaultUrl); + clientOptionsKey = key; + stringsClient = null; + filesClient = null; + guardrailsClient = null; + } + return clientOptions; + } + + /** @return the generated strings client for the current settings */ + protected synchronized StringsV2Client stringsClient() throws SkyflowException { + ClientOptions options = clientOptions(); + if (stringsClient == null) { + stringsClient = new StringsV2Client(options); + } + return stringsClient; + } + + /** @return the generated guardrails client for the current settings */ + protected synchronized GuardrailsV2Client guardrailsClient() throws SkyflowException { + ClientOptions options = clientOptions(); + if (guardrailsClient == null) { + guardrailsClient = new GuardrailsV2Client(options); + } + return guardrailsClient; + } + + /** @return the generated files client for the current settings */ + protected synchronized FilesV2Client filesClient() throws SkyflowException { + ClientOptions options = clientOptions(); + if (filesClient == null) { + filesClient = new FilesV2Client(options); + } + return filesClient; + } + + private String clientKey(String vaultUrl) { + return vaultUrl + "|" + this.vaultConfig.getVaultId() + "|" + effectiveTimeoutSeconds() + "|" + + effectiveMaxRetries() + "|" + effectiveInitialRetryDelayMillis() + "|" + effectiveMaxRetryDelayMillis(); + } + + private ClientOptions buildClientOptions(String vaultUrl) { + ClientOptions.Builder builder = ClientOptions.builder().environment(Environment.custom(vaultUrl)); + Integer timeout = effectiveTimeoutSeconds(); + if (timeout != null) { + builder.timeout(timeout); + } + Integer maxRetries = effectiveMaxRetries(); + if (maxRetries != null) { + builder.maxRetries(maxRetries); + } + Long initialDelay = effectiveInitialRetryDelayMillis(); + if (initialDelay != null) { + builder.initialRetryDelayMillis(initialDelay); + } + Long maxDelay = effectiveMaxRetryDelayMillis(); + if (maxDelay != null) { + builder.maxRetryDelayMillis(maxDelay); + } + return builder.build(); + } + + private RequestOptions requestOptions(String token) { + return RequestOptions.builder() + .addHeader(AUTHORIZATION_HEADER, BEARER_PREFIX + token) + .addHeader(BaseConstants.SDK_METRICS_HEADER_KEY, getSdkMetrics()) + .build(); + } + + private static SkyflowException toSkyflowException(ApiClientApiException e, ErrorLogs errorLog) { + LogUtil.printErrorLog(errorLog.getLog()); + return new SkyflowException(e.statusCode(), e, e.headers(), bodyAsString(e.body())); + } + + static String bodyAsString(Object body) { + if (body == null) { + return null; + } + if (body instanceof String) { + return (String) body; + } + try { + return ObjectMappers.JSON_MAPPER.writeValueAsString(body); + } catch (Exception ex) { + return body.toString(); + } + } +} diff --git a/common/src/test/java/com/skyflow/BaseSkyflowTests.java b/common/src/test/java/com/skyflow/BaseSkyflowTests.java index cfd65ad5..45d5278c 100644 --- a/common/src/test/java/com/skyflow/BaseSkyflowTests.java +++ b/common/src/test/java/com/skyflow/BaseSkyflowTests.java @@ -5,7 +5,7 @@ import com.skyflow.enums.Env; import com.skyflow.enums.LogLevel; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import org.junit.Assert; @@ -45,7 +45,7 @@ public void testAddingExistingVaultConfigThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdAlreadyInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdAlreadyInConfigList.getMessage(), e.getMessage()); } } @@ -57,7 +57,7 @@ public void testUpdatingNonExistentVaultConfigInBuilderThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -70,7 +70,7 @@ public void testUpdatingNonExistentVaultConfigInClientThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -81,7 +81,7 @@ public void testRemovingNonExistentVaultConfigInBuilderThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -104,7 +104,7 @@ public void testRemovingVaultConfigWithoutAddingThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -122,7 +122,7 @@ public void testVaultThrowsWhenNoConfigAdded() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -137,7 +137,7 @@ public void testVaultByIdThrowsAfterRemoval() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @@ -163,7 +163,7 @@ public void testAddingInvalidSkyflowCredentialsThrows() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } @@ -350,12 +350,12 @@ protected TestSkyflow self() { Object vault() throws SkyflowException { return resolveOrThrow(this.builder.vaultClientsMap, null, - ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } Object vault(String vaultId) throws SkyflowException { return resolveOrThrow(this.builder.vaultClientsMap, vaultId, - ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } private static class TestSkyflowClientBuilder extends BaseSkyflowClientBuilder { @@ -365,7 +365,7 @@ private static class TestSkyflowClientBuilder extends BaseSkyflowClientBuilder { }; + + private static GetRunResponse success() { + return new GetRunResponse("run-1", DetectRunStatus.SUCCESS, DataSourceType.BASE64, + Collections.singletonList(new FileOutput(Base64.getEncoder().encodeToString("redacted".getBytes()), + "REDACTED_FILE", FileDataFormat.TXT)), + new Metrics(null, 1, 8, null, null, null), null); + } + + @Test + public void withoutPollOptionsReturnsRunIdAndNeverFetches() throws Exception { + AtomicInteger fetches = new AtomicInteger(); + DeidentifyFileResponse response = DeidentifyFileFlow.complete( + DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("x").build(), "run-1", + id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); + Assert.assertEquals("run-1", response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertEquals(0, fetches.get()); + } + + @Test + public void missingRunIdSkipsPollingEvenWhenRequested() throws Exception { + AtomicInteger fetches = new AtomicInteger(); + DeidentifyFileResponse response = DeidentifyFileFlow.complete( + DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("x") + .pollOptions(PollOptions.builder().build()).build(), null, + id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); + Assert.assertNull(response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertEquals(0, fetches.get()); + } + + @Test + public void polledRawRequestMergesRunButWritesNothing() throws Exception { + DeidentifyFileResponse response = DeidentifyFileFlow.complete( + DeidentifyFileRequest.builder().dataSource(DataSourceType.SKYFLOW_ID).value("rec") + .pollOptions(PollOptions.builder().build()).outputDirectory(folder.getRoot().getPath()).build(), + "run-1", id -> success(), NO_SLEEP); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(1, response.getOutput().size()); + Assert.assertEquals(Integer.valueOf(8), response.getMetrics().getCharacterCount()); + Assert.assertEquals(0, folder.getRoot().list().length); + } + + @Test + public void polledFileRequestWritesOutputsOnSuccess() throws Exception { + File input = folder.newFile("notes.txt"); + Files.write(input.toPath(), "hello".getBytes()); + File outDir = folder.newFolder("out"); + + DeidentifyFileResponse response = DeidentifyFileFlow.complete( + DeidentifyFileRequest.builder().file(input).pollOptions(PollOptions.builder().build()) + .outputDirectory(outDir.getPath()).build(), + "run-1", id -> success(), NO_SLEEP); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + File written = new File(outDir, "processed-notes.txt"); + Assert.assertTrue(written.isFile()); + Assert.assertEquals("redacted", new String(Files.readAllBytes(written.toPath()))); + } + + @Test + public void polledFileRequestWritesNothingWhenRunFailsOrIsPending() throws Exception { + File input = folder.newFile("notes.txt"); + File outDir = folder.newFolder("out"); + DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(input) + .pollOptions(PollOptions.builder().maxAttempts(1).build()).outputDirectory(outDir.getPath()).build(); + + DeidentifyFileResponse failed = DeidentifyFileFlow.complete(request, "run-1", + id -> new GetRunResponse(id, DetectRunStatus.FAILED, null, Collections.emptyList(), null, "bad input"), NO_SLEEP); + Assert.assertEquals(DetectRunStatus.FAILED, failed.getStatus()); + Assert.assertEquals("bad input", failed.getMessage()); + + DeidentifyFileResponse pending = DeidentifyFileFlow.complete(request, "run-2", + id -> new GetRunResponse(id, DetectRunStatus.IN_PROGRESS, null, Collections.emptyList(), null, null), NO_SLEEP); + Assert.assertEquals("run-2", pending.getRunId()); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, pending.getStatus()); + Assert.assertEquals(0, outDir.list().length); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java new file mode 100644 index 00000000..41886c3c --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java @@ -0,0 +1,146 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.file.Files; +import java.util.Base64; +import java.util.Collections; + +public class DeidentifyFileMapperTests { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + private static String wire(DeidentifyFileRequestV2 request) throws Exception { + return ObjectMappers.JSON_MAPPER.writeValueAsString(request); + } + + @Test + public void mapsRawValueRequest() throws Exception { + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").configurationId("cfg-1").build(), "vault-1"); + Assert.assertEquals("SKYFLOW_ID", api.getDataSource().toString()); + Assert.assertEquals("rec-1", api.getValue()); + Assert.assertEquals("cfg-1", api.getConfigurationId().get()); + Assert.assertFalse(api.getDataFormat().isPresent()); + Assert.assertFalse(api.getConfiguration().isPresent()); + String json = wire(api); + Assert.assertTrue(json, json.contains("\"dataSource\":\"SKYFLOW_ID\"")); + Assert.assertTrue(json, json.contains("\"configurationId\":\"cfg-1\"")); + Assert.assertFalse(json, json.contains("dataFormat")); + Assert.assertFalse(json, json.contains("\"configuration\"")); + } + + @Test + public void dataFormatIsSentLowerCase() throws Exception { + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://s3/in").dataFormat(FileDataFormat.PDF).build(), "v"); + Assert.assertTrue(wire(api).contains("\"dataFormat\":\"pdf\"")); + } + + @Test + public void inlineConfigurationGetsVaultId() throws Exception { + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v") + .configuration(DetectConfiguration.builder().detect(Detect.builder().entities(Collections.singletonList( + Entity.builder().entityType(EntityType.NAME).build())).build()).build()) + .build(), "vault-9"); + String json = wire(api); + Assert.assertTrue(json, json.contains("\"vaultId\":\"vault-9\"")); + Assert.assertTrue(json, json.contains("\"entityType\":\"NAME\"")); + } + + @Test + public void fileRequestIsEncodedAndFormatInferred() throws Exception { + File input = folder.newFile("patient-notes.PDF"); + byte[] content = {1, 2, 3, 4, 5}; + Files.write(input.toPath(), content); + + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest( + DeidentifyFileRequest.builder().file(input).build(), "v"); + Assert.assertEquals("BASE64", api.getDataSource().toString()); + Assert.assertEquals(Base64.getEncoder().encodeToString(content), api.getValue()); + Assert.assertEquals("pdf", api.getDataFormat().get().toString()); + + DeidentifyFileRequestV2 explicit = DetectRequestMapper.toDeidentifyFileRequest( + DeidentifyFileRequest.builder().filePath(input.getPath()).dataFormat(FileDataFormat.TXT).build(), "v"); + Assert.assertEquals("txt", explicit.getDataFormat().get().toString()); + } + + @Test + public void localFileIsAlwaysSentAsBase64EvenIfDataSourceWasCleared() throws Exception { + File input = folder.newFile("a.txt"); + Files.write(input.toPath(), new byte[]{1}); + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest( + DeidentifyFileRequest.builder().file(input).dataSource(null).build(), "v"); + Assert.assertEquals("BASE64", api.getDataSource().toString()); + } + + @Test + public void unknownOrMissingExtensionLeavesFormatForTheServer() throws Exception { + for (String name : new String[]{"archive.heic", "README", "trailing."}) { + File input = folder.newFile(name); + Files.write(input.toPath(), new byte[]{9}); + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest( + DeidentifyFileRequest.builder().file(input).build(), "v"); + Assert.assertFalse(name, api.getDataFormat().isPresent()); + } + } + + @Test + public void unreadableFileIsReportedAsEncodeFailure() { + try { + DetectRequestMapper.toDeidentifyFileRequest( + DeidentifyFileRequest.builder().file(new File(folder.getRoot(), "nope.txt")).build(), "v"); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(BaseErrorMessage.FailedToEncodeFile.getMessage(), e.getMessage()); + } + } + + @Test + public void submittedResponseCarriesOnlyRunId() { + DeidentifyFileResponse response = DetectResponseMapper.submittedDeidentifyFileResponse("run-7"); + Assert.assertEquals("run-7", response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertNull(response.getOutputType()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertNull(response.getMetrics()); + Assert.assertNull(response.getMessage()); + } + + @Test + public void polledResponseMergesRunIdWithRun() throws Exception { + DetectRunsResponseV2 api = ObjectMappers.JSON_MAPPER.readValue( + "{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\",\"output\":[{\"processedFile\":\"UERG\"," + + "\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}],\"metrics\":{\"pages\":2}}", + DetectRunsResponseV2.class); + GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-7", api); + DeidentifyFileResponse response = DetectResponseMapper.toDeidentifyFileResponse("run-7", run); + Assert.assertEquals("run-7", response.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals("UERG", response.getOutput().get(0).getProcessedFile()); + Assert.assertEquals(FileDataFormat.PDF, response.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(2), response.getMetrics().getPages()); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java new file mode 100644 index 00000000..9f9a3f62 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java @@ -0,0 +1,82 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.PollOptions; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.file.Files; + +public class DeidentifyFileValidationsTests { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + private static void assertRejected(DeidentifyFileRequest request, BaseErrorMessage expected) { + try { + DetectValidations.validateDeidentifyFileRequest(request); + Assert.fail("expected SkyflowException: " + expected); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected.getMessage(), e.getMessage()); + } + } + + private static DeidentifyFileRequest.DeidentifyFileRequestBuilder raw() { + return DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); + } + + @Test + public void rejectsNullRequest() { + assertRejected(null, BaseErrorMessage.DeidentifyFileRequestNull); + } + + @Test + public void rawValueRequiresDataSourceAndValue() throws SkyflowException { + assertRejected(DeidentifyFileRequest.builder().value("x").build(), BaseErrorMessage.InvalidDataSourceInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().dataSource(DataSourceType.SKYFLOW_ID).build(), BaseErrorMessage.InvalidValueInDeidentifyFile); + assertRejected(raw().value(" ").build(), BaseErrorMessage.InvalidValueInDeidentifyFile); + DetectValidations.validateDeidentifyFileRequest(raw().build()); + DetectValidations.validateDeidentifyFileRequest(raw().configurationId("cfg").build()); + } + + @Test + public void fileRequestsNeedAnExistingFileAndNoValue() throws Exception { + File existing = folder.newFile("notes.txt"); + Files.write(existing.toPath(), "hello".getBytes("UTF-8")); + DetectValidations.validateDeidentifyFileRequest(DeidentifyFileRequest.builder().file(existing).build()); + DetectValidations.validateDeidentifyFileRequest(DeidentifyFileRequest.builder().filePath(existing.getPath()).build()); + + assertRejected(DeidentifyFileRequest.builder().file(existing).value("Zm9v").build(), BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().filePath(new File(folder.getRoot(), "missing.txt").getPath()).build(), + BaseErrorMessage.FileNotFoundToDeidentify); + assertRejected(DeidentifyFileRequest.builder().file(folder.getRoot()).build(), BaseErrorMessage.FileNotFoundToDeidentify); + } + + @Test + public void pollOptionsBoundsAreEnforced() throws SkyflowException { + DetectValidations.validateDeidentifyFileRequest(raw().pollOptions(PollOptions.builder().build()).build()); + DetectValidations.validateDeidentifyFileRequest(raw().pollOptions(PollOptions.builder().waitTime(1).maxAttempts(1).build()).build()); + DetectValidations.validateDeidentifyFileRequest(raw().pollOptions(PollOptions.builder().waitTime(300).maxAttempts(23).build()).build()); + for (int bad : new int[]{0, -1, 301}) { + assertRejected(raw().pollOptions(PollOptions.builder().waitTime(bad).build()).build(), BaseErrorMessage.InvalidWaitTimeInPollOptions); + } + for (int bad : new int[]{0, -5, 24}) { + assertRejected(raw().pollOptions(PollOptions.builder().maxAttempts(bad).build()).build(), BaseErrorMessage.InvalidMaxAttemptsInPollOptions); + } + } + + @Test + public void outputDirectoryRequiresPollOptions() throws SkyflowException { + assertRejected(raw().outputDirectory("/tmp/out").build(), BaseErrorMessage.OutputDirectoryWithoutPollOptions); + DetectValidations.validateDeidentifyFileRequest(raw().outputDirectory(" ").build()); + DetectValidations.validateDeidentifyFileRequest(raw().outputDirectory("/tmp/out").pollOptions(PollOptions.builder().build()).build()); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java new file mode 100644 index 00000000..facad0ec --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java @@ -0,0 +1,161 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CustomType; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.Image; +import com.skyflow.detect.MaskingMethod; +import com.skyflow.detect.Media; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReturnEntitiesType; +import com.skyflow.detect.ShiftDates; +import com.skyflow.detect.Transformation; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import com.skyflow.detect.FileMapping; +import com.skyflow.detect.ObjectEntity; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +public class DetectRequestMapperTests { + + @Test + public void storedConfigurationSendsOnlyTextAndId() throws Exception { + DeidentifyStringRequestV2 mapped = DetectRequestMapper.toDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello").configurationId("cfg-1").build(), "vault-1"); + Assert.assertEquals("hello", mapped.getText()); + Assert.assertEquals("cfg-1", mapped.getConfigurationId().get()); + Assert.assertFalse(mapped.getConfiguration().isPresent()); + String json = ObjectMappers.JSON_MAPPER.writeValueAsString(mapped); + Assert.assertTrue(json, json.contains("\"configurationId\":\"cfg-1\"")); + Assert.assertFalse("no vault id outside a configuration: " + json, json.contains("vaultId")); + Assert.assertFalse(json, json.contains("\"configuration\":")); + } + + @Test + public void inlineConfigurationIsScopedToVaultAndFullyMapped() throws Exception { + DetectConfiguration configuration = DetectConfiguration.builder() + .name("inline") + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder().entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("persons.name").build(), + Entity.builder().entityType(EntityType.DOB) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .transformation(Transformation.builder() + .shiftDates(ShiftDates.builder().minDays(10).maxDays(30).build()).build()) + .build())) + .restrict(Collections.singletonList("[0-9]{3}-[0-9]{2}-[0-9]{4}")) + .skip(Collections.singletonList("Skyflow")) + .customTypes(Collections.singletonList( + CustomType.builder().label("EMPLOYEE_ID").match(Collections.singletonList("EMP-[0-9]{6}")).build())) + .returnEntities(ReturnEntitiesType.ALL) + .build()) + .media(Media.builder().image(Image.builder().maskingMethod(MaskingMethod.BLUR).outputOcrText(true).build()).build()) + .build(); + + DeidentifyStringRequestV2 mapped = DetectRequestMapper.toDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello").configuration(configuration).build(), "vault-1"); + + DetectConfigV2 config = mapped.getConfiguration().get(); + Assert.assertEquals("vault-1", config.getVaultId()); + Assert.assertEquals("inline", config.getName().get()); + Assert.assertFalse(mapped.getConfigurationId().isPresent()); + + String json = ObjectMappers.JSON_MAPPER.writeValueAsString(mapped); + Assert.assertEquals("vault id appears once, inside the inline configuration", + 1, json.split("\"vaultId\":\"vault-1\"", -1).length - 1); + for (String expected : new String[]{ + "\"vaultId\":\"vault-1\"", "\"entityType\":\"NAME\"", "\"deidentificationType\":\"VAULT_TOKEN\"", + "\"destination\":\"persons.name\"", "\"minDays\":10", "\"maxDays\":30", + "\"restrict\":[\"[0-9]{3}-[0-9]{2}-[0-9]{4}\"]", "\"skip\":[\"Skyflow\"]", + "\"label\":\"EMPLOYEE_ID\"", "\"returnEntities\":\"ALL\"", "\"maskingMethod\":\"BLUR\"", "\"outputOcrText\":true"}) { + Assert.assertTrue("missing " + expected + " in " + json, json.contains(expected)); + } + Assert.assertFalse("unset fields must be omitted: " + json, json.contains("\"description\"")); + } + + @Test + public void reidentifyStringCarriesVaultIdAndRedactionLevels() throws Exception { + ReidentifyStringRequestV2 mapped = DetectRequestMapper.toReidentifyStringRequest( + ReidentifyStringRequest.builder() + .text("[NAME_1]") + .redactionLevel(Arrays.asList( + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), + RedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) + .build(), "vault-1"); + Assert.assertEquals("vault-1", mapped.getVaultId()); + Assert.assertEquals("[NAME_1]", mapped.getText()); + Assert.assertEquals(2, mapped.getRedactionLevel().get().size()); + String json = ObjectMappers.JSON_MAPPER.writeValueAsString(mapped); + Assert.assertTrue(json, json.contains("\"entityName\":\"NAME\"")); + Assert.assertTrue(json, json.contains("\"redactionType\":\"MASKED\"")); + Assert.assertTrue(json, json.contains("\"tokenGroupName\":\"group\"")); + Assert.assertTrue(json, json.contains("\"redactionPattern\":\"pattern\"")); + } + + @Test + public void reidentifyStringWithoutRedactionLevelsOmitsField() throws Exception { + ReidentifyStringRequestV2 mapped = DetectRequestMapper.toReidentifyStringRequest( + ReidentifyStringRequest.builder().text("[NAME_1]").build(), "vault-1"); + Assert.assertFalse(mapped.getRedactionLevel().isPresent()); + Assert.assertFalse(ObjectMappers.JSON_MAPPER.writeValueAsString(mapped).contains("redactionLevel")); + } + + @Test + public void everyPublicEntityTypeMapsToAGeneratedValue() { + for (EntityType type : EntityType.values()) { + Entity entity = Entity.builder().entityType(type).build(); + Assert.assertEquals(type.name(), DetectRequestMapper.toEntity(entity).getEntityType().get().toString()); + RedactionLevel level = RedactionLevel.builder().entityName(type).redactionType(RedactionType.DEFAULT).build(); + Assert.assertEquals(type.name(), + DetectRequestMapper.toRedactionLevels(Collections.singletonList(level)).get(0).getEntityName().get().toString()); + } + } + + @Test + public void checkGuardrailsCarriesVaultIdAndOnlySetOptions() throws Exception { + DetectGuardrailsRequestV2 full = DetectRequestMapper.toCheckGuardrailsRequest( + CheckGuardrailsRequest.builder().text("t").checkToxicity(false).denyTopics(Collections.singletonList("x")).build(), "vault-1"); + Assert.assertEquals("vault-1", full.getVaultId()); + Assert.assertEquals("t", full.getText()); + Assert.assertEquals(Boolean.FALSE, full.getCheckToxicity().get()); + Assert.assertEquals(Collections.singletonList("x"), full.getDenyTopics().get()); + + DetectGuardrailsRequestV2 minimal = DetectRequestMapper.toCheckGuardrailsRequest( + CheckGuardrailsRequest.builder().text("t").build(), "vault-1"); + Assert.assertFalse(minimal.getCheckToxicity().isPresent()); + Assert.assertFalse(minimal.getDenyTopics().isPresent()); + } + + @Test + public void nullElementsInConfigurationListsAreSkipped() throws Exception { + com.skyflow.generated.detect.rest.types.DetectConfigV2 api = DetectRequestMapper.toDetectConfig( + DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList(null, Entity.builder().entityType(EntityType.NAME).build())) + .objectEntities(Arrays.asList((ObjectEntity) null)) + .customTypes(Arrays.asList(null, CustomType.builder().label("ID").build())) + .build()) + .fileMapping(Arrays.asList(null, FileMapping.builder().source("in").build())) + .build(), "v"); + Assert.assertEquals(1, api.getDetect().get().getEntities().get().size()); + Assert.assertTrue(api.getDetect().get().getObjectEntities().get().isEmpty()); + Assert.assertEquals(1, api.getDetect().get().getCustomTypes().get().size()); + Assert.assertEquals(1, api.getFileMapping().get().size()); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java new file mode 100644 index 00000000..0a4ab894 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java @@ -0,0 +1,140 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.DetectedEntity; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import org.junit.Assert; +import org.junit.Test; + +public class DetectResponseMapperTests { + + @Test + public void mapsFullDeidentifyStringResponse() throws Exception { + String json = "{\"processedText\":\"My name is [NAME_1].\",\"entities\":[{\"token\":\"NAME_1\",\"value\":\"\"," + + "\"location\":{\"startIndex\":11,\"endIndex\":19,\"startIndexProcessed\":11,\"endIndexProcessed\":19}," + + "\"entityType\":\"NAME\",\"entityScores\":{\"NAME\":0.9152}}]," + + "\"metrics\":{\"size\":0.05,\"wordCount\":4,\"characterCount\":20,\"duration\":0.2}}"; + DeidentifyStringResponseV2 api = ObjectMappers.JSON_MAPPER.readValue(json, DeidentifyStringResponseV2.class); + + DeidentifyStringResponse response = DetectResponseMapper.toDeidentifyStringResponse(api); + Assert.assertEquals("My name is [NAME_1].", response.getProcessedText()); + Assert.assertEquals(1, response.getEntities().size()); + DetectedEntity entity = response.getEntities().get(0); + Assert.assertEquals("NAME_1", entity.getToken()); + Assert.assertEquals("", entity.getValue()); + Assert.assertEquals("NAME", entity.getEntityType()); + Assert.assertEquals(Integer.valueOf(11), entity.getLocation().getStartIndex()); + Assert.assertEquals(Integer.valueOf(19), entity.getLocation().getEndIndexProcessed()); + Assert.assertEquals(0.9152, entity.getEntityScores().get("NAME"), 1e-9); + Assert.assertEquals(Integer.valueOf(4), response.getMetrics().getWordCount()); + Assert.assertEquals(Integer.valueOf(20), response.getMetrics().getCharacterCount()); + Assert.assertEquals(0.05, response.getMetrics().getSize(), 1e-9); + Assert.assertNull(response.getMetrics().getPages()); + } + + @Test + public void emptyResponseYieldsEmptyEntitiesNotNull() throws Exception { + DeidentifyStringResponseV2 api = ObjectMappers.JSON_MAPPER.readValue("{}", DeidentifyStringResponseV2.class); + DeidentifyStringResponse response = DetectResponseMapper.toDeidentifyStringResponse(api); + Assert.assertNull(response.getProcessedText()); + Assert.assertNotNull(response.getEntities()); + Assert.assertTrue(response.getEntities().isEmpty()); + Assert.assertNull(response.getMetrics()); + } + + @Test + public void nullListElementsFromTheApiAreSkipped() throws Exception { + DeidentifyStringResponseV2 strings = ObjectMappers.JSON_MAPPER.readValue( + "{\"entities\":[null,{\"token\":\"NAME_1\"},null]}", DeidentifyStringResponseV2.class); + Assert.assertEquals(1, DetectResponseMapper.toDeidentifyStringResponse(strings).getEntities().size()); + + DetectRunsResponseV2 run = ObjectMappers.JSON_MAPPER.readValue( + "{\"status\":\"SUCCESS\",\"output\":[null,{\"processedFile\":\"x\"}]}", DetectRunsResponseV2.class); + Assert.assertEquals(1, DetectResponseMapper.toGetRunResponse("r", run).getOutput().size()); + } + + @Test + public void guardrailsResponseWithoutValidationMapsToUnknown() throws Exception { + DetectGuardrailsResponseV2 api = ObjectMappers.JSON_MAPPER.readValue("{}", DetectGuardrailsResponseV2.class); + CheckGuardrailsResponse response = DetectResponseMapper.toCheckGuardrailsResponse(api); + Assert.assertNull(response.getText()); + Assert.assertEquals(GuardrailsValidation.UNKNOWN, response.getValidation()); + Assert.assertNull(response.getToxic()); + Assert.assertNull(response.getDeniedTopic()); + } + + @Test + public void entityWithoutScoresGetsEmptyMap() throws Exception { + DeidentifyStringResponseV2 api = ObjectMappers.JSON_MAPPER.readValue( + "{\"entities\":[{\"token\":\"NAME_1\"}]}", DeidentifyStringResponseV2.class); + DetectedEntity entity = DetectResponseMapper.toDeidentifyStringResponse(api).getEntities().get(0); + Assert.assertNotNull(entity.getEntityScores()); + Assert.assertTrue(entity.getEntityScores().isEmpty()); + Assert.assertNull(entity.getLocation()); + } + + @Test + public void mapsReidentifyStringResponse() throws Exception { + ReidentifyStringResponseV2 api = ObjectMappers.JSON_MAPPER.readValue( + "{\"processedText\":\"My name is John Doe.\",\"metrics\":{\"wordCount\":5}}", ReidentifyStringResponseV2.class); + ReidentifyStringResponse response = DetectResponseMapper.toReidentifyStringResponse(api); + Assert.assertEquals("My name is John Doe.", response.getProcessedText()); + Assert.assertEquals(Integer.valueOf(5), response.getMetrics().getWordCount()); + } + + @Test + public void mapsCompletedRun() throws Exception { + DetectRunsResponseV2 api = ObjectMappers.JSON_MAPPER.readValue( + "{\"status\":\"SUCCESS\",\"outputType\":\"PRESIGNED_URL\",\"output\":[{\"processedFile\":\"https://x/y.pdf\"," + + "\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}],\"metrics\":{\"pages\":2}}", + DetectRunsResponseV2.class); + GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-1", api); + Assert.assertEquals("run-1", run.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, run.getStatus()); + Assert.assertEquals(DataSourceType.PRESIGNED_URL, run.getOutputType()); + Assert.assertEquals("https://x/y.pdf", run.getOutput().get(0).getProcessedFile()); + Assert.assertEquals(FileDataFormat.PDF, run.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(2), run.getMetrics().getPages()); + } + + @Test + public void runWithoutStatusIsUnknownAndUnknownWireValuesAreTolerated() throws Exception { + GetRunResponse empty = DetectResponseMapper.toGetRunResponse("r", + ObjectMappers.JSON_MAPPER.readValue("{}", DetectRunsResponseV2.class)); + Assert.assertEquals(DetectRunStatus.UNKNOWN, empty.getStatus()); + Assert.assertTrue(empty.getOutput().isEmpty()); + Assert.assertNull(empty.getOutputType()); + + GetRunResponse odd = DetectResponseMapper.toGetRunResponse("r", ObjectMappers.JSON_MAPPER.readValue( + "{\"status\":\"NEW_STATE\",\"outputType\":\"FTP\",\"output\":[{\"processedFileExtension\":\"heic\"}]}", + DetectRunsResponseV2.class)); + Assert.assertEquals(DetectRunStatus.UNKNOWN, odd.getStatus()); + Assert.assertNull(odd.getOutputType()); + Assert.assertNull(odd.getOutput().get(0).getProcessedFileExtension()); + } + + @Test + public void mapsGuardrailsResponseAndToleratesUnknownValidation() throws Exception { + CheckGuardrailsResponse failed = DetectResponseMapper.toCheckGuardrailsResponse(ObjectMappers.JSON_MAPPER.readValue( + "{\"text\":\"t\",\"validation\":\"FAILED\",\"toxic\":true}", DetectGuardrailsResponseV2.class)); + Assert.assertEquals("t", failed.getText()); + Assert.assertEquals(GuardrailsValidation.FAILED, failed.getValidation()); + Assert.assertEquals(Boolean.TRUE, failed.getToxic()); + Assert.assertNull(failed.getDeniedTopic()); + + CheckGuardrailsResponse odd = DetectResponseMapper.toCheckGuardrailsResponse(ObjectMappers.JSON_MAPPER.readValue( + "{\"text\":\"t\",\"validation\":\"MAYBE\"}", DetectGuardrailsResponseV2.class)); + Assert.assertEquals(GuardrailsValidation.UNKNOWN, odd.getValidation()); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java new file mode 100644 index 00000000..dd154096 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java @@ -0,0 +1,138 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +public class DetectValidationsTests { + + private static void assertInvalid(SkyflowException e, BaseErrorMessage expected) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected.getMessage(), e.getMessage()); + } + + @Test + public void deidentifyStringRejectsNullRequest() { + try { + DetectValidations.validateDeidentifyStringRequest(null); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.DeidentifyStringRequestNull); + } + } + + @Test + public void deidentifyStringRejectsBlankText() { + try { + DetectValidations.validateDeidentifyStringRequest( + DeidentifyStringRequest.builder().text(" ").configurationId("cfg").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.InvalidTextInDeidentifyString); + } + } + + @Test + public void deidentifyStringDoesNotConstrainConfigurationSources() throws SkyflowException { + // configurationId and configuration are both optional on the API: none, either or both pass through + DetectValidations.validateDeidentifyStringRequest(DeidentifyStringRequest.builder().text("hello").build()); + DetectValidations.validateDeidentifyStringRequest(DeidentifyStringRequest.builder().text("hello") + .configurationId("cfg").configuration(DetectConfiguration.builder().build()).build()); + DetectValidations.validateDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello").configurationId("cfg").build()); + DetectValidations.validateDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello") + .configuration(DetectConfiguration.builder().build()).build()); + } + + @Test + public void reidentifyStringRejectsNullAndBlank() { + try { + DetectValidations.validateReidentifyStringRequest(null); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.ReidentifyStringRequestNull); + } + try { + DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder().text("").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.InvalidTextInReidentifyString); + } + } + + @Test + public void reidentifyStringAcceptsValidRedactionLevels() throws SkyflowException { + DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder() + .text("[NAME_1]") + .redactionLevel(Arrays.asList( + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), + RedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) + .build()); + DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + } + + @Test + public void reidentifyStringPassesAnyRedactionLevelShapeThrough() throws SkyflowException { + // The API marks every RedactionLevel field optional; the server applies its own rules. + DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder().text("[NAME_1]") + .redactionLevel(Arrays.asList( + RedactionLevel.builder().build(), + RedactionLevel.builder().tokenGroupName("g").build(), + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).redactionPattern("p").build(), + null)) + .build()); + } + + @Test + public void getRunRequiresRunId() throws SkyflowException { + try { + DetectValidations.validateGetRunRequest(null); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.GetRunRequestNull); + } + try { + DetectValidations.validateGetRunRequest(GetRunRequest.builder().runId(" ").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.InvalidRunIdInGetRun); + } + DetectValidations.validateGetRunRequest(GetRunRequest.builder().runId("run-1").build()); + } + + @Test + public void checkGuardrailsRequiresOnlyText() throws SkyflowException { + try { + DetectValidations.validateCheckGuardrailsRequest(null); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.CheckGuardrailsRequestNull); + } + try { + DetectValidations.validateCheckGuardrailsRequest(CheckGuardrailsRequest.builder().build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + assertInvalid(e, BaseErrorMessage.InvalidTextInCheckGuardrails); + } + // denyTopics is optional on the API and its entries are not inspected by the SDK. + DetectValidations.validateCheckGuardrailsRequest( + CheckGuardrailsRequest.builder().text("hi").denyTopics(Arrays.asList("politics", "", null)).build()); + DetectValidations.validateCheckGuardrailsRequest(CheckGuardrailsRequest.builder().text("hi").build()); + DetectValidations.validateCheckGuardrailsRequest( + CheckGuardrailsRequest.builder().text("hi").checkToxicity(true).denyTopics(Collections.singletonList("politics")).build()); + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java new file mode 100644 index 00000000..4672d7a0 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java @@ -0,0 +1,119 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; +import java.util.List; + +public class FileOutputWriterTests { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + private static String b64(String text) { + return Base64.getEncoder().encodeToString(text.getBytes()); + } + + @Test + public void writesEachOutputWithV1StyleNames() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("%PDF"), "REDACTED_FILE", FileDataFormat.PDF), + new FileOutput(b64("[]"), "ENTITIES", null)), + DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + + Assert.assertEquals(2, written.size()); + Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); + Assert.assertEquals("processed-entities-invoice.json", written.get(1).getName()); + Assert.assertEquals("%PDF", new String(Files.readAllBytes(written.get(0).toPath()))); + Assert.assertEquals("[]", new String(Files.readAllBytes(written.get(1).toPath()))); + Assert.assertEquals(folder.getRoot(), written.get(0).getParentFile()); + } + + @Test + public void entityOutputsCarryTheirTypeInTheName() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), + new FileOutput(b64("b"), "OBJECT_ENTITIES", FileDataFormat.JSON)), + DataSourceType.BASE64, "scan.png", folder.getRoot().getPath()); + Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); + Assert.assertEquals("processed-object-entities-scan.json", written.get(1).getName()); + } + + @Test + public void jsonInputDoesNotCollideWithItsEntitiesOutput() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("{}"), "REDACTED_TEXT", FileDataFormat.JSON), + new FileOutput(b64("[]"), "ENTITIES", FileDataFormat.JSON)), + DataSourceType.BASE64, "data.json", folder.getRoot().getPath()); + Assert.assertEquals("processed-data.json", written.get(0).getName()); + Assert.assertEquals("processed-entities-data.json", written.get(1).getName()); + } + + @Test + public void nameCollisionsGetTheFileTypeInserted() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.TXT), + new FileOutput(b64("b"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals("processed-notes.txt", written.get(0).getName()); + Assert.assertEquals("processed-notes.redacted_text.txt", written.get(1).getName()); + } + + @Test + public void createsMissingOutputDirectory() throws Exception { + File nested = new File(folder.getRoot(), "a/b/c"); + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", nested.getPath()); + Assert.assertTrue(nested.isDirectory()); + Assert.assertEquals(new File(nested, "processed-notes.txt"), written.get(0)); + } + + @Test + public void presignedUrlOutputsAreNotWritten() throws Exception { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput("https://s3/out", "REDACTED_FILE", FileDataFormat.PDF)), + DataSourceType.PRESIGNED_URL, "invoice.pdf", folder.getRoot().getPath()); + Assert.assertTrue(written.isEmpty()); + Assert.assertEquals(0, folder.getRoot().list().length); + } + + @Test + public void emptyOrNullOutputsWriteNothing() throws Exception { + Assert.assertTrue(FileOutputWriter.write(null, DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(Collections.emptyList(), DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(Collections.singletonList(new FileOutput(null, "ENTITIES", null)), + DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + } + + @Test + public void invalidBase64IsReportedAsWriteFailure() { + try { + FileOutputWriter.write(Collections.singletonList(new FileOutput("not base64!", "REDACTED_FILE", FileDataFormat.TXT)), + DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-x.txt")); + } + } + + @Test + public void nameHelpers() { + Assert.assertEquals("notes", FileOutputWriter.stripExtension("notes.txt")); + Assert.assertEquals("archive.tar", FileOutputWriter.stripExtension("archive.tar.gz")); + Assert.assertEquals("README", FileOutputWriter.stripExtension("README")); + Assert.assertEquals(".hidden", FileOutputWriter.stripExtension(".hidden")); + Assert.assertEquals("output", FileOutputWriter.stripExtension(null)); + } +} diff --git a/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java new file mode 100644 index 00000000..1030eec6 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java @@ -0,0 +1,162 @@ +package com.skyflow.detect.polling; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.PollOptions; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +public class RunPollerTests { + + private static GetRunResponse run(DetectRunStatus status) { + return new GetRunResponse("run-1", status, status == DetectRunStatus.SUCCESS ? DataSourceType.BASE64 : null, + Collections.emptyList(), null, status == DetectRunStatus.FAILED ? "boom" : null); + } + + /** Serves a scripted sequence of statuses and records every sleep instead of sleeping. */ + private static final class Script implements RunPoller.RunFetcher, RunPoller.Sleeper { + final Iterator statuses; + final List sleepsMillis = new ArrayList<>(); + int fetches; + + Script(DetectRunStatus... statuses) { + this.statuses = Arrays.asList(statuses).iterator(); + } + + @Override + public GetRunResponse fetch(String runId) { + Assert.assertEquals("run-1", runId); + fetches++; + Assert.assertTrue("fetched more times than scripted", statuses.hasNext()); + return run(statuses.next()); + } + + @Override + public void sleep(long millis) { + sleepsMillis.add(millis); + } + } + + private static PollOptions options(Integer waitTime, Integer maxAttempts) { + return PollOptions.builder().waitTime(waitTime).maxAttempts(maxAttempts).build(); + } + + @Test + public void terminalStatusesStopImmediatelyWithoutSleeping() throws SkyflowException { + for (DetectRunStatus terminal : new DetectRunStatus[]{DetectRunStatus.SUCCESS, DetectRunStatus.FAILED, DetectRunStatus.UNKNOWN}) { + Script script = new Script(terminal); + GetRunResponse result = RunPoller.poll("run-1", options(null, null), script, script); + Assert.assertEquals(terminal, result.getStatus()); + Assert.assertEquals(1, script.fetches); + Assert.assertTrue(script.sleepsMillis.isEmpty()); + } + } + + @Test + public void nonTerminalStatusesKeepPollingWithExponentialBackoff() throws SkyflowException { + Script script = new Script(DetectRunStatus.QUEUED, DetectRunStatus.QUEUED, DetectRunStatus.IN_PROGRESS, + DetectRunStatus.IN_PROGRESS, DetectRunStatus.SUCCESS); + GetRunResponse result = RunPoller.poll("run-1", options(null, null), script, script); + Assert.assertEquals(DetectRunStatus.SUCCESS, result.getStatus()); + Assert.assertEquals(5, script.fetches); + Assert.assertEquals(Arrays.asList(1000L, 2000L, 4000L, 8000L), script.sleepsMillis); + } + + @Test + public void defaultWaitTimeIsSpentExactlyThenRunIdIsReturned() throws SkyflowException { + DetectRunStatus[] forever = new DetectRunStatus[30]; + Arrays.fill(forever, DetectRunStatus.IN_PROGRESS); + Script script = new Script(forever); + GetRunResponse result = RunPoller.poll("run-1", options(null, null), script, script); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, result.getStatus()); + // 1+2+4+8+16 = 31, then the 32 s step is trimmed to 29 so the total is exactly 60. + Assert.assertEquals(Arrays.asList(1000L, 2000L, 4000L, 8000L, 16000L, 29000L), script.sleepsMillis); + Assert.assertEquals(7, script.fetches); + } + + @Test + public void delayPlateausAt32SecondsForLongWaits() throws SkyflowException { + DetectRunStatus[] forever = new DetectRunStatus[30]; + Arrays.fill(forever, DetectRunStatus.QUEUED); + Script script = new Script(forever); + RunPoller.poll("run-1", options(300, null), script, script); + // 1+2+4+8+16 = 31, then eight 32 s steps reach 287, and the last step is trimmed to 13 so the total is exactly 300. + Assert.assertEquals(Arrays.asList(1000L, 2000L, 4000L, 8000L, 16000L, 32000L, 32000L, 32000L, 32000L, 32000L, + 32000L, 32000L, 32000L, 13000L), script.sleepsMillis); + Assert.assertEquals(15, script.fetches); + } + + @Test + public void maxAttemptsCapsLookupsBeforeWaitTime() throws SkyflowException { + Script script = new Script(DetectRunStatus.IN_PROGRESS, DetectRunStatus.IN_PROGRESS, DetectRunStatus.IN_PROGRESS); + GetRunResponse result = RunPoller.poll("run-1", options(300, 3), script, script); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, result.getStatus()); + Assert.assertEquals(3, script.fetches); + Assert.assertEquals(Arrays.asList(1000L, 2000L), script.sleepsMillis); + } + + @Test + public void singleAttemptNeverSleeps() throws SkyflowException { + Script script = new Script(DetectRunStatus.QUEUED); + RunPoller.poll("run-1", options(null, 1), script, script); + Assert.assertEquals(1, script.fetches); + Assert.assertTrue(script.sleepsMillis.isEmpty()); + } + + @Test + public void shortWaitTimeTrimsTheFirstSleep() throws SkyflowException { + Script script = new Script(DetectRunStatus.QUEUED, DetectRunStatus.QUEUED); + RunPoller.poll("run-1", options(1, null), script, script); + Assert.assertEquals(Collections.singletonList(1000L), script.sleepsMillis); + Assert.assertEquals(2, script.fetches); + } + + @Test + public void interruptionReturnsLastRunAndRestoresFlag() throws SkyflowException { + Script script = new Script(DetectRunStatus.IN_PROGRESS, DetectRunStatus.SUCCESS); + RunPoller.Sleeper interrupting = millis -> { + throw new InterruptedException(); + }; + try { + GetRunResponse result = RunPoller.poll("run-1", options(null, null), script, interrupting); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, result.getStatus()); + Assert.assertEquals(1, script.fetches); + Assert.assertTrue(Thread.currentThread().isInterrupted()); + } finally { + Thread.interrupted(); // clear so later tests are unaffected + } + } + + @Test + public void nullRunOrStatusFromFetcherIsTerminalUnknown() throws SkyflowException { + GetRunResponse fromNull = RunPoller.poll("run-1", options(null, null), runId -> null, millis -> { }); + Assert.assertEquals("run-1", fromNull.getRunId()); + Assert.assertEquals(DetectRunStatus.UNKNOWN, fromNull.getStatus()); + Assert.assertTrue(fromNull.getOutput().isEmpty()); + + GetRunResponse fromNullStatus = RunPoller.poll("run-1", options(null, null), + runId -> new GetRunResponse(runId, null, null, Collections.emptyList(), null, null), millis -> { }); + Assert.assertEquals(DetectRunStatus.UNKNOWN, fromNullStatus.getStatus()); + } + + @Test + public void fetchFailurePropagates() { + RunPoller.RunFetcher failing = runId -> { + throw new SkyflowException(404, "run not found"); + }; + try { + RunPoller.poll("run-1", options(null, null), failing, millis -> { }); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + } + } +} diff --git a/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java index 141548f8..9557b48b 100644 --- a/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java @@ -3,7 +3,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.auth.rest.core.ApiClientException; import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; @@ -102,7 +102,7 @@ public void testEmptyCredentialsFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage() + BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), ""), e.getMessage() ); } } @@ -117,7 +117,7 @@ public void testInvalidFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), invalidFilePath), e.getMessage() ); } @@ -133,7 +133,7 @@ public void testInvalidCredentialsFile() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), e.getMessage() ); } @@ -147,7 +147,7 @@ public void testEmptyCredentialsString() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidCredentials.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidCredentials.getMessage(), e.getMessage()); } } @@ -159,7 +159,7 @@ public void testInvalidCredentialsString() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); } } @@ -174,7 +174,7 @@ public void testNoPrivateKeyInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingPrivateKey.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingPrivateKey.getMessage(), e.getMessage()); } } @@ -188,7 +188,7 @@ public void testNoClientIDInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingClientId.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingClientId.getMessage(), e.getMessage()); } } @@ -202,7 +202,7 @@ public void testNoKeyIDInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingKeyId.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingKeyId.getMessage(), e.getMessage()); } } @@ -216,7 +216,7 @@ public void testNoTokenURIInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingTokenUri.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingTokenUri.getMessage(), e.getMessage()); } } @@ -230,7 +230,7 @@ public void testInvalidPrivateKeyInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); } } @@ -243,7 +243,7 @@ public void testInvalidKeySpecInCredentialsForCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); } } @@ -257,7 +257,7 @@ public void testInvalidTokenURIInCredentialsForCredentials() throws SkyflowExcep Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidTokenUri.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidTokenUri.getMessage(), e.getMessage()); } } @@ -274,7 +274,7 @@ public void testBearerTokenWithNewFormCredentialKeys() { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); // InvalidKeySpec confirms all credential fields were resolved — failure is at RSA parsing, not field lookup Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.InvalidKeySpec.getMessage(), BaseConstants.SDK_PREFIX), + BaseUtils.parameterizedString(BaseErrorMessage.InvalidKeySpec.getMessage(), BaseConstants.SDK_PREFIX), e.getMessage()); } } @@ -371,7 +371,7 @@ public void testExtractAccessTokenMissingThrowsSkyflowException() throws Excepti Assert.assertTrue(e.getCause() instanceof SkyflowException); SkyflowException skyflowException = (SkyflowException) e.getCause(); Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), skyflowException.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingAccessToken.getMessage(), skyflowException.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingAccessToken.getMessage(), skyflowException.getMessage()); } } diff --git a/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java index dab89e53..790de436 100644 --- a/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java @@ -4,7 +4,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.utils.BaseConstants; import com.skyflow.utils.BaseUtils; @@ -94,7 +94,7 @@ public void testEmptyCredentialsFilePath() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage()); + Assert.assertEquals(BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), ""), e.getMessage()); } } @@ -108,7 +108,7 @@ public void testInvalidFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), invalidFilePath), e.getMessage()); } } @@ -123,7 +123,7 @@ public void testInvalidCredentialsFile() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), e.getMessage() ); } @@ -138,7 +138,7 @@ public void testEmptyCredentialsString() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); // InvalidCredentials has no %s1 placeholder, so no extra arg is passed here. - Assert.assertEquals(ErrorMessage.InvalidCredentials.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidCredentials.getMessage(), e.getMessage()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e); } @@ -153,7 +153,7 @@ public void testInvalidCredentialsString() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); // CredentialsStringInvalidJson has no %s1 placeholder, so no extra arg is passed here. - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); } } @@ -167,7 +167,7 @@ public void testNoPrivateKeyInCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingPrivateKey.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingPrivateKey.getMessage(), e.getMessage()); } } @@ -181,7 +181,7 @@ public void testNoClientIDInCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingClientId.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingClientId.getMessage(), e.getMessage()); } } @@ -195,7 +195,7 @@ public void testNoKeyIDInCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.MissingKeyId.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.MissingKeyId.getMessage(), e.getMessage()); } } @@ -209,7 +209,7 @@ public void testInvalidPrivateKeyInCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); } } @@ -225,7 +225,7 @@ public void testInvalidKeySpecInCredentials() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); } } @@ -245,7 +245,7 @@ public void testSignedDataTokensWithNewFormCredentialKeys() { } catch (SkyflowException e) { // Failure at RSA key parsing (not field lookup) confirms new-form keys clientId/keyId were found Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); } } diff --git a/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java b/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java index bc1bd216..257e9d9b 100644 --- a/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java +++ b/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java @@ -4,7 +4,7 @@ import com.skyflow.config.Credentials; import com.skyflow.enums.Env; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import org.junit.Assert; import org.junit.BeforeClass; @@ -105,7 +105,7 @@ public void testGenerateBearerTokenWithCredentialsFile() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), filePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), filePath), e.getMessage() ); } @@ -122,7 +122,7 @@ public void testGenerateBearerTokenWithCredentialsString() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); } } @@ -166,7 +166,7 @@ public void testGenerateBearerTokenWithCredentialsFileAndMapContext() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), filePath), + BaseUtils.parameterizedString(BaseErrorMessage.FileNotFound.getMessage(), filePath), e.getMessage() ); } @@ -187,7 +187,7 @@ public void testGenerateBearerTokenWithCredentialsStringAndMapContext() { Assert.fail("Map context should not cause a ClassCastException"); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); } } @@ -205,7 +205,7 @@ public void testGenerateBearerTokenWithContextNeitherStringNorMap() { Assert.fail("Non String/Map context should not cause a ClassCastException"); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); } } @@ -216,7 +216,7 @@ public void testGetPrivateKeyFromPemWithMissingHeader() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.JwtInvalidFormat.getMessage(), e.getMessage()); } } @@ -230,7 +230,7 @@ public void testGetPrivateKeyFromPemWithInvalidBase64Body() { Assert.fail("Invalid base64 content should be wrapped into a SkyflowException, not thrown raw"); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.InvalidKeySpec.getMessage(), e.getMessage()); } } diff --git a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java new file mode 100644 index 00000000..4b267bb3 --- /dev/null +++ b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java @@ -0,0 +1,385 @@ +package com.skyflow.vault.controller; + +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.Entity; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.enums.Env; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.concurrent.atomic.AtomicInteger; + +public class BaseDetectControllerTests { + + /** Minimal SDK controller: fixed URL, counted tokens, no credential chain. */ + private static final class TestDetectController extends BaseDetectController { + private String vaultUrl; + private final AtomicInteger tokenCalls = new AtomicInteger(); + private SkyflowException tokenFailure; + + TestDetectController(BaseVaultConfig config, String vaultUrl) { + super(config, null); + this.vaultUrl = vaultUrl; + } + + @Override + protected String resolveVaultUrl() { + return vaultUrl; + } + + @Override + protected String getSdkMetrics() { + return "{\"sdk_name_version\":\"test\"}"; + } + + @Override + protected String resolveToken() throws SkyflowException { + if (tokenFailure != null) { + throw tokenFailure; + } + return "token-" + tokenCalls.incrementAndGet(); + } + } + + private MockWebServer server; + private TestDetectController controller; + + private static BaseVaultConfig config(String vaultId) { + BaseVaultConfig config = new BaseVaultConfig(); + config.setVaultId(vaultId); + config.setClusterId("cluster"); + config.setEnv(Env.PROD); + return config; + } + + @Before + public void setUp() throws Exception { + server = new MockWebServer(); + server.start(); + controller = new TestDetectController(config("vault-1"), server.url("").toString()); + controller.setCommonHttpConfig(null, 0, null, null); + } + + @After + public void tearDown() throws Exception { + server.shutdown(); + } + + @Test + public void deidentifyStringSendsScopedRequestAndMapsResponse() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"processedText\":\"My name is [NAME_1].\",\"entities\":[{\"token\":\"NAME_1\",\"entityType\":\"NAME\"," + + "\"location\":{\"startIndex\":11,\"endIndex\":19}}],\"metrics\":{\"wordCount\":4}}")); + + DeidentifyStringResponse response = controller.deidentifyString(DeidentifyStringRequest.builder() + .text("My name is John Doe.") + .configuration(DetectConfiguration.builder() + .detect(Detect.builder().entities(Collections.singletonList( + Entity.builder().entityType(EntityType.NAME).build())).build()) + .build()) + .build()); + + Assert.assertEquals("My name is [NAME_1].", response.getProcessedText()); + Assert.assertEquals("NAME_1", response.getEntities().get(0).getToken()); + Assert.assertEquals(Integer.valueOf(4), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("POST", recorded.getMethod()); + Assert.assertEquals("/v2/detect/deidentify/string", recorded.getPath()); + Assert.assertEquals("Bearer token-1", recorded.getHeader("Authorization")); + Assert.assertEquals("{\"sdk_name_version\":\"test\"}", recorded.getHeader("sky-metadata")); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is John Doe.\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"entityType\":\"NAME\"")); + Assert.assertFalse(body, body.contains("configurationId")); + } + + @Test + public void reidentifyStringSendsVaultIdInBodyAndRefreshesTokenPerCall() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"My name is John Doe.\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"My name is J**n D*e.\"}")); + + ReidentifyStringResponse first = controller.reidentifyString( + ReidentifyStringRequest.builder().text("My name is [NAME_1].").build()); + ReidentifyStringResponse second = controller.reidentifyString(ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder().tokenGroupName("group").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals("My name is John Doe.", first.getProcessedText()); + Assert.assertEquals("My name is J**n D*e.", second.getProcessedText()); + + RecordedRequest r1 = server.takeRequest(); + Assert.assertEquals("/v2/detect/reidentify/string", r1.getPath()); + Assert.assertEquals("Bearer token-1", r1.getHeader("Authorization")); + String body1 = r1.getBody().readUtf8(); + Assert.assertTrue(body1, body1.contains("\"vaultId\":\"vault-1\"")); + Assert.assertFalse(body1, body1.contains("redactionLevel")); + + RecordedRequest r2 = server.takeRequest(); + Assert.assertEquals("Bearer token-2", r2.getHeader("Authorization")); + String body2 = r2.getBody().readUtf8(); + Assert.assertTrue(body2, body2.contains("\"tokenGroupName\":\"group\"")); + Assert.assertTrue(body2, body2.contains("\"redactionPattern\":\"mask\"")); + } + + @Test + public void getRunQueriesRunByIdScopedToVault() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody( + "{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\",\"output\":[{\"processedFile\":\"QUJD\"," + + "\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}," + + "{\"processedFile\":\"e30=\",\"processedFileType\":\"ENTITIES\",\"processedFileExtension\":\"json\"}]," + + "\"metrics\":{\"pages\":3,\"size\":12.5}}")); + + GetRunResponse response = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); + + Assert.assertEquals("run-42", response.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + Assert.assertEquals("QUJD", response.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REDACTED_FILE", response.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.PDF, response.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(FileDataFormat.JSON, response.getOutput().get(1).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getPages()); + Assert.assertNull(response.getMessage()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("GET", recorded.getMethod()); + Assert.assertEquals("/v2/detect/runs/run-42?vaultId=vault-1", recorded.getPath()); + Assert.assertEquals("Bearer token-1", recorded.getHeader("Authorization")); + Assert.assertEquals("{\"sdk_name_version\":\"test\"}", recorded.getHeader("sky-metadata")); + } + + @Test + public void getRunReportsPendingAndFailedRuns() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody( + "{\"status\":\"FAILED\",\"message\":\"unsupported file\",\"output\":[]}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); + + GetRunResponse pending = controller.getRun(GetRunRequest.builder().runId("r1").build()); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, pending.getStatus()); + Assert.assertNotNull(pending.getOutput()); + Assert.assertTrue(pending.getOutput().isEmpty()); + Assert.assertNull(pending.getOutputType()); + Assert.assertNull(pending.getMetrics()); + + GetRunResponse failed = controller.getRun(GetRunRequest.builder().runId("r2").build()); + Assert.assertEquals(DetectRunStatus.FAILED, failed.getStatus()); + Assert.assertEquals("unsupported file", failed.getMessage()); + + GetRunResponse unknown = controller.getRun(GetRunRequest.builder().runId("r3").build()); + Assert.assertEquals("unrecognised statuses degrade to UNKNOWN", DetectRunStatus.UNKNOWN, unknown.getStatus()); + } + + @Test + public void getRunValidatesRunIdBeforeTokenOrNetwork() throws Exception { + for (GetRunRequest bad : new GetRunRequest[]{null, GetRunRequest.builder().build(), GetRunRequest.builder().runId(" ").build()}) { + try { + controller.getRun(bad); + Assert.fail("expected SkyflowException for " + bad); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + } + } + Assert.assertEquals(0, controller.tokenCalls.get()); + Assert.assertEquals(0, server.getRequestCount()); + } + + @Test + public void getRunMapsNotFound() throws Exception { + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\"error\":{\"grpc_code\":5,\"http_code\":404,\"message\":\"run not found\",\"http_status\":\"Not Found\",\"details\":[]}}")); + try { + controller.getRun(GetRunRequest.builder().runId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("run not found", e.getMessage()); + } + } + + @Test + public void checkGuardrailsSendsScopedRequestAndMapsResponse() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody( + "{\"text\":\"tell me about politics\",\"validation\":\"FAILED\",\"toxic\":false,\"deniedTopic\":true}")); + + CheckGuardrailsResponse response = controller.checkGuardrails(CheckGuardrailsRequest.builder() + .text("tell me about politics") + .checkToxicity(true) + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + + Assert.assertEquals("tell me about politics", response.getText()); + Assert.assertEquals(GuardrailsValidation.FAILED, response.getValidation()); + Assert.assertEquals(Boolean.FALSE, response.getToxic()); + Assert.assertEquals(Boolean.TRUE, response.getDeniedTopic()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("POST", recorded.getMethod()); + Assert.assertEquals("/v2/detect/guardrails", recorded.getPath()); + Assert.assertEquals("Bearer token-1", recorded.getHeader("Authorization")); + Assert.assertEquals("{\"sdk_name_version\":\"test\"}", recorded.getHeader("sky-metadata")); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"tell me about politics\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"checkToxicity\":true")); + Assert.assertTrue(body, body.contains("\"denyTopics\":[\"politics\",\"medical advice\"]")); + } + + @Test + public void checkGuardrailsOmitsUnsetOptionsAndMapsPassed() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"text\":\"hello\",\"validation\":\"PASSED\"}")); + CheckGuardrailsResponse response = controller.checkGuardrails(CheckGuardrailsRequest.builder().text("hello").build()); + Assert.assertEquals(GuardrailsValidation.PASSED, response.getValidation()); + Assert.assertNull(response.getToxic()); + Assert.assertNull(response.getDeniedTopic()); + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(body, body.contains("checkToxicity")); + Assert.assertFalse(body, body.contains("denyTopics")); + } + + @Test + public void checkGuardrailsValidatesBeforeTokenOrNetwork() throws Exception { + CheckGuardrailsRequest[] bad = { + null, + CheckGuardrailsRequest.builder().text(" ").build(), + }; + for (CheckGuardrailsRequest request : bad) { + try { + controller.checkGuardrails(request); + Assert.fail("expected SkyflowException for " + request); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + } + } + Assert.assertEquals(0, controller.tokenCalls.get()); + Assert.assertEquals(0, server.getRequestCount()); + } + + @Test + public void deidentifyStringWithStoredConfigurationSendsOnlyTextAndId() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"[NAME_1]\"}")); + controller.deidentifyString(DeidentifyStringRequest.builder().text("John").configurationId("cfg-1").build()); + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertEquals("{\"text\":\"John\",\"configurationId\":\"cfg-1\"}", body); + } + + @Test + public void apiErrorIsMappedToSkyflowExceptionWithServerMessage() throws Exception { + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-123") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\"," + + "\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controller.deidentifyString(DeidentifyStringRequest.builder().text("hello").configurationId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("configuration not found", e.getMessage()); + Assert.assertEquals("req-123", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(3), e.getGrpcCode()); + } + } + + @Test + public void unmodelledStatusIsStillMapped() throws Exception { + server.enqueue(new MockResponse().setResponseCode(404) + .setBody("{\"error\":{\"grpc_code\":5,\"http_code\":404,\"message\":\"not found\",\"http_status\":\"Not Found\",\"details\":[]}}")); + try { + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("not found", e.getMessage()); + } + } + + @Test + public void validationFailsBeforeTokenOrNetwork() throws Exception { + try { + controller.deidentifyString(DeidentifyStringRequest.builder().text(" ").configurationId("cfg").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInDeidentifyString.getMessage(), e.getMessage()); + } + Assert.assertEquals(0, controller.tokenCalls.get()); + Assert.assertEquals(0, server.getRequestCount()); + } + + @Test + public void tokenFailurePropagatesWithoutNetworkCall() throws Exception { + controller.tokenFailure = new SkyflowException(401, "no credentials"); + try { + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals("no credentials", e.getMessage()); + } + Assert.assertEquals(0, server.getRequestCount()); + } + + @Test + public void clientIsRebuiltWhenUrlOrHttpConfigChanges() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Object first = controller.stringsClient(); + Assert.assertSame("same settings must reuse the client", first, controller.stringsClient()); + + controller.setCommonHttpConfig(30, 0, null, null); + Object afterConfig = controller.stringsClient(); + Assert.assertNotSame("changed http config must rebuild", first, afterConfig); + + MockWebServer other = new MockWebServer(); + other.start(); + try { + controller.vaultUrl = other.url("").toString(); + other.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"moved\"}")); + Assert.assertEquals("moved", controller.reidentifyString( + ReidentifyStringRequest.builder().text("[NAME_1]").build()).getProcessedText()); + Assert.assertNotSame("changed url must rebuild", afterConfig, controller.stringsClient()); + Assert.assertEquals(1, other.getRequestCount()); + } finally { + other.shutdown(); + } + } + + @Test + public void setVaultConfigRescopesRequests() throws Exception { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{}")); + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + controller.setVaultConfig(config("vault-2")); + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.assertTrue(server.takeRequest().getBody().readUtf8().contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(server.takeRequest().getBody().readUtf8().contains("\"vaultId\":\"vault-2\"")); + } +} diff --git a/flowvault/README.md b/flowvault/README.md index c6d78f26..a668231c 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -49,6 +49,11 @@ The `flowvault` module is a Skyflow Java SDK built for high-throughput vault ope - [Get](#get) - [Update](#update) - [Delete](#delete) +- [Detect](#detect) + - [Deidentify string](#deidentify-string) + - [Reidentify string](#reidentify-string) + - [Get run](#get-run) + - [Check guardrails](#check-guardrails) - [Custom Request Headers](#custom-request-headers) - [Error Handling](#error-handling) - [Two layers of errors](#two-layers-of-errors) @@ -1624,6 +1629,212 @@ for (DeleteResponseRecord record : deleteResponse.getRecords()) { } ``` +# Detect + +Skyflow Detect finds and de-identifies sensitive data in free text, then re-identifies it on demand. The flowvault SDK exposes the Detect V2 API through `DetectController`, returned by `skyflowClient.detect()` and `skyflowClient.detect(vaultId)`. Every request is scoped to that vault, and the controller honours the same credentials, [timeouts and retries](#timeouts-and-retries) as `vault()`. + +Detect configurations are created in Studio or through the management API. The SDK does not create, update or delete them. + +| Method | Request | Response | Description | +|--------|---------|----------|-------------| +| `deidentifyString(DeidentifyStringRequest)` | `com.skyflow.detect.DeidentifyStringRequest` | `com.skyflow.detect.DeidentifyStringResponse` | Detect and replace sensitive data in a string | +| `deidentifyFile(DeidentifyFileRequest)` | `com.skyflow.detect.DeidentifyFileRequest` | `com.skyflow.detect.DeidentifyFileResponse` | Submit a file for de-identification, optionally polling the run to completion | +| `reidentifyString(ReidentifyStringRequest)` | `com.skyflow.detect.ReidentifyStringRequest` | `com.skyflow.detect.ReidentifyStringResponse` | Replace tokens in a string with their original or redacted values | +| `reidentifyFile(ReidentifyFileRequest)` | `com.skyflow.detect.ReidentifyFileRequest` | `com.skyflow.detect.ReidentifyFileResponse` | Replace tokens in a file with their original or redacted values | +| `getRun(GetRunRequest)` | `com.skyflow.detect.GetRunRequest` | `com.skyflow.detect.GetRunResponse` | Retrieve the status and outputs of a Detect file run | +| `checkGuardrails(CheckGuardrailsRequest)` | `com.skyflow.detect.CheckGuardrailsRequest` | `com.skyflow.detect.CheckGuardrailsResponse` | Screen text for toxicity and denied topics | + +> Detect V2 is in beta. + +## Deidentify string + +`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) and/or `configuration` (an inline `DetectConfiguration`). Both are optional on the API and are sent exactly as supplied. The SDK fills the vault id from the controller. + +```java +import com.skyflow.detect.*; + +// Stored configuration +DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configurationId("") + .build()); + +System.out.println(response.getProcessedText()); +// My name is [NAME_1], and my email is [EMAIL_ADDRESS_1]. + +// Inline configuration +DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("") // token group that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); + +response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configuration(configuration) + .build()); + +for (DetectedEntity entity : response.getEntities()) { + System.out.println(entity.getEntityType() + " " + entity.getToken() + + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); +} +System.out.println(response.getMetrics().getWordCount()); +``` + +`DeidentifyStringResponse` carries `getProcessedText()`, `getEntities()` (a `List` with token, entity type, location and confidence scores; never `null`) and `getMetrics()`. + +## Deidentify file + +File de-identification is asynchronous on the API: the submit call returns a run id and the result is retrieved from the run. `deidentifyFile` exposes both modes. + +- **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). +- **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. + +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. + +```java +// Submit only +DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") // BASE64 + pdf inferred + .configurationId("") + .build()); +String runId = submitted.getRunId(); + +// Submit and poll +DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") // optional + .build()); + +switch (response.getStatus()) { + case SUCCESS: + // For file-based requests the outputs are already on disk: + // /data/processed/processed-patient-notes.pdf the redacted file + // /data/processed/processed-entities-patient-notes.json the detected entities + // response.getOutput() and getMetrics() carry the same data. + break; + case FAILED: + System.err.println(response.getMessage()); + break; + default: // IN_PROGRESS or QUEUED: budget ran out, resume with getRun(runId) + break; +} +``` + +Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. + +## Reidentify string + +`ReidentifyStringRequest` takes the tokenised text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. + +```java +ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .tokenGroupName("") + .redactionPattern("") + .build())) + .build()); + +System.out.println(response.getProcessedText()); +// My name is J**n D*e. +``` + +A `RedactionLevel` is expected to name one source (`tokenGroupName` or `entityName`) and one replacement (`redactionPattern` or `redactionType`). Every field is optional on the API, so the SDK passes the list through as given and the server enforces the combination rules, including which fields apply to flowvault vaults. + +## Reidentify file + +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. + +```java +byte[] content = Files.readAllBytes(Paths.get("tokenised.txt")); + +ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(Base64.getEncoder().encodeToString(content)) + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .tokenGroupName("") + .redactionPattern("") + .build())) + .build()); + +if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); + } +} +``` + +`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. This method is specific to the flowvault SDK. + +## Get run + +File de-identification is asynchronous: the submit call returns a run id, and `getRun` retrieves the run's status and, once it has succeeded, its outputs. `GetRunResponse.getOutput()` is empty and `getOutputType()` and `getMetrics()` are `null` until the run completes. + +```java +GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder().runId("").build()); + +switch (run.getStatus()) { + case SUCCESS: + for (FileOutput output : run.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() + // output.getProcessedFileType() is e.g. REDACTED_FILE or ENTITIES + // output.getProcessedFileExtension() is a FileDataFormat such as PDF + } + break; + case FAILED: + System.err.println(run.getMessage()); + break; + default: // QUEUED, IN_PROGRESS, UNKNOWN + // poll again later +} +``` + +## Check guardrails + +`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. Each check runs only when requested: `getToxic()` is `null` unless `checkToxicity(true)` was set, and `getDeniedTopic()` is `null` unless `denyTopics` was supplied. `getValidation()` is `FAILED` if any requested check triggered. + +```java +CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text(userPrompt) + .checkToxicity(true) + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + +if (response.getValidation() == GuardrailsValidation.FAILED) { + throw new IllegalArgumentException("blocked: toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); +} +``` + +All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. + +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java) [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). + # Custom Request Headers To include custom HTTP headers on an outgoing request — bulk or unary — pass a `RequestInterceptor` via that operation's options object. The headers available are defined by the `CustomHeaderKey` enum: diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index 1defab788fc417ec802d64ef31280779b3bf4a5e..733abb00cced1a4d560ad72fbc1204990731cb76 100644 GIT binary patch delta 516312 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≫)5 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ºUK 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 y-?UV7>9|2aqsb89)1mwvC@!jN0JBj?D=zt;$1.0.0 compile + + com.squareup.okhttp3 + mockwebserver + ${okhttp-version} + test + diff --git a/flowvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java b/flowvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java new file mode 100644 index 00000000..a48efaf2 --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java @@ -0,0 +1,53 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; + +/** + * Screens a prompt for toxicity and denied topics before it is sent to an LLM. + */ +public class CheckGuardrailsSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + String userPrompt = "Which party should I vote for?"; + try { + CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text(userPrompt) + .checkToxicity(true) + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + + if (response.getValidation() == GuardrailsValidation.FAILED) { + System.out.println("Blocked: toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); + } else { + System.out.println("Prompt passed guardrails."); + } + } catch (SkyflowException e) { + System.err.println("Error during checkGuardrails:"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java new file mode 100644 index 00000000..c373f181 --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -0,0 +1,66 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.PollOptions; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +/** + * De-identifies a local file with the Detect V2 API. The first call submits the run and returns its + * id; the second submits and polls, and writes the outputs next to the input on success. + */ +public class DeidentifyFileSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + // Submit only: the API's own behaviour. Keep the run id and retrieve the result with getRun. + DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") // BASE64 and the format are derived from the file + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Submitted run " + submitted.getRunId()); + + // Submit and poll: waits up to 90 seconds with exponential backoff, then writes + // processed-. and processed-.json into the output directory. + DeidentifyFileResponse polled = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(90).build()) + .outputDirectory("") // optional; defaults to the working directory + .build()); + + System.out.println("Run " + polled.getRunId() + " status: " + polled.getStatus()); + if (polled.getStatus() == DetectRunStatus.SUCCESS) { + System.out.println("Outputs: " + polled.getOutput().size() + ", metrics: " + polled.getMetrics()); + } else if (polled.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + polled.getMessage()); + } else { + System.out.println("Still running; poll later with getRun(" + polled.getRunId() + ")"); + } + } catch (SkyflowException e) { + System.err.println("Error during deidentifyFile:"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java b/flowvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java new file mode 100644 index 00000000..b38ba42e --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java @@ -0,0 +1,94 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectedEntity; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.ReturnEntitiesType; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; +import java.util.Collections; + +/** + * De-identifies sensitive data in a string with the Detect V2 API, first with a stored + * configuration id and then with an inline configuration. + */ +public class DeidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + String text = "My name is John Doe, and my email is johndoe@acme.com."; + + // 1. Stored configuration, created in Studio or through the management API. + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (stored configuration):"); + e.printStackTrace(); + } + + // 2. Inline configuration, nothing to create beforehand. + DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("") // flowvault: token group that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); + + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configuration(configuration) + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + for (DetectedEntity entity : response.getEntities()) { + System.out.printf("%-16s %-18s [%d,%d] %s%n", + entity.getEntityType(), entity.getToken(), + entity.getLocation().getStartIndex(), entity.getLocation().getEndIndex(), + entity.getEntityScores()); + } + System.out.println("Metrics: " + response.getMetrics()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (inline configuration):"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java new file mode 100644 index 00000000..cc3e7667 --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -0,0 +1,62 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.io.File; +import java.nio.file.Files; +import java.util.Base64; + +/** + * Retrieves a Detect file run by id and, once it has succeeded, writes the base64 outputs to disk. + */ +public class GetRunSample { + public static void main(String[] args) throws Exception { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder() + .runId("") // Replace with the run id returned by deidentifyFile + .build()); + + System.out.println("Run " + run.getRunId() + " status: " + run.getStatus()); + if (run.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : run.getOutput()) { + String name = "processed-" + run.getRunId() + "-" + output.getProcessedFileType() + + "." + output.getProcessedFileExtension().name().toLowerCase(); + Files.write(new File(name).toPath(), Base64.getDecoder().decode(output.getProcessedFile())); + System.out.println("Wrote " + name); + } + System.out.println("Metrics: " + run.getMetrics()); + } else if (run.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + run.getMessage()); + } else { + System.out.println("Run still pending, poll again later."); + } + } catch (SkyflowException e) { + System.err.println("Error during getRun:"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java new file mode 100644 index 00000000..587d58eb --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -0,0 +1,74 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.io.File; +import java.nio.file.Files; +import java.util.Base64; +import java.util.Collections; + +/** + * Re-identifies the tokens in a text file with the Detect V2 API. The file is sent as base64 and + * the re-identified file is returned synchronously and written next to the input. + */ +public class ReidentifyFileSample { + public static void main(String[] args) throws Exception { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + File input = new File(""); // Replace with a file produced by deidentification + String base64 = Base64.getEncoder().encodeToString(Files.readAllBytes(input.toPath())); + + try { + ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(base64) + .dataFormat(FileDataFormat.TXT) + // Optional: render one token group with a named redaction pattern instead of its plain value. + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .tokenGroupName("") // Replace with a token group name + .redactionPattern("") // Replace with a redaction pattern name + .build())) + .build()); + + System.out.println("Status: " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + String name = "reidentified-" + input.getName(); + Files.write(new File(input.getParentFile(), name).toPath(), + Base64.getDecoder().decode(output.getProcessedFile())); + System.out.println("Wrote " + name + " (" + output.getProcessedFileType() + ")"); + } + System.out.println("Metrics: " + response.getMetrics()); + } + } catch (SkyflowException e) { + System.err.println("Error during reidentifyFile:"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java b/flowvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java new file mode 100644 index 00000000..508bcc6c --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java @@ -0,0 +1,59 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Collections; + +/** + * Re-identifies tokens in a string with the Detect V2 API. For flowvault vaults, redaction + * levels target a token group and apply a named redaction pattern. + */ +public class ReidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + // Plain re-identification: every token is replaced by its original value. + ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + + // Targeted rendering: tokens from one token group are rendered with a named pattern. + ReidentifyStringResponse masked = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .tokenGroupName("") // Replace with a token group name + .redactionPattern("") // Replace with a redaction pattern name + .build())) + .build()); + System.out.println("Masked text: " + masked.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during reidentifyString:"); + e.printStackTrace(); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/Skyflow.java b/flowvault/src/main/java/com/skyflow/Skyflow.java index c2647824..b1955b63 100644 --- a/flowvault/src/main/java/com/skyflow/Skyflow.java +++ b/flowvault/src/main/java/com/skyflow/Skyflow.java @@ -3,7 +3,7 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.enums.LogLevel; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -12,6 +12,7 @@ import com.skyflow.utils.Utils; import com.skyflow.utils.logger.LogUtil; import com.skyflow.utils.validations.Validations; +import com.skyflow.vault.controller.DetectController; import com.skyflow.vault.controller.VaultController; import java.util.LinkedHashMap; @@ -55,16 +56,38 @@ public Skyflow updateVaultConfig(VaultConfig vaultConfig) throws SkyflowExceptio } public VaultController vault() throws SkyflowException { - return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public VaultController vault(String vaultId) throws SkyflowException { - return resolveOrThrow(this.builder.vaultClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.vaultClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); + } + + /** + * Detect operations for the single configured vault. + * + * @return the detect controller + * @throws SkyflowException if no vault is configured + */ + public DetectController detect() throws SkyflowException { + return resolveOrThrow(this.builder.detectClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); + } + + /** + * Detect operations for a specific configured vault. + * + * @param vaultId id of a configured vault + * @return the detect controller + * @throws SkyflowException if the vault is not configured + */ + public DetectController detect(String vaultId) throws SkyflowException { + return resolveOrThrow(this.builder.detectClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public static final class SkyflowClientBuilder extends BaseSkyflowClientBuilder { private final LinkedHashMap vaultClientsMap = new LinkedHashMap<>(); + private final LinkedHashMap detectClientsMap = new LinkedHashMap<>(); // Client-wide HTTP config. Resolution per vault, most specific first: // VaultConfig value -> the value set here -> SDK default (60s call timeout, 0 retries). // null here means "not set", so the SDK default applies to vaults that don't override it. @@ -89,6 +112,9 @@ protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowExcepti this.writeTimeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis); this.vaultClientsMap.put(vaultConfig.getVaultId(), controller); + DetectController detectController = new DetectController(vaultConfig, this.skyflowCredentials); + detectController.setCommonHttpConfig(this.timeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis); + this.detectClientsMap.put(vaultConfig.getVaultId(), detectController); LogUtil.printInfoLog(Utils.parameterizedString(InfoLogs.VAULT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); } @@ -106,11 +132,20 @@ protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowExc updated.setCommonHttpConfig(this.timeout, this.connectTimeout, this.readTimeout, this.writeTimeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis); + DetectController updatedDetect = this.detectClientsMap.get(updatedConfig.getVaultId()); + if (updatedDetect == null) { + updatedDetect = new DetectController(updatedConfig, this.skyflowCredentials); + this.detectClientsMap.put(updatedConfig.getVaultId(), updatedDetect); + } else { + updatedDetect.setVaultConfig(updatedConfig); + } + updatedDetect.setCommonHttpConfig(this.timeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis); } @Override protected void onVaultConfigRemoved(String vaultId) throws SkyflowException { this.vaultClientsMap.remove(vaultId); + this.detectClientsMap.remove(vaultId); } @Override @@ -123,6 +158,9 @@ protected void onCredentialsUpdated(Credentials credentials) throws SkyflowExcep for (VaultController vault : this.vaultClientsMap.values()) { vault.setCommonCredentials(credentials); } + for (DetectController detect : this.detectClientsMap.values()) { + detect.setCommonCredentials(credentials); + } } @Override @@ -179,6 +217,10 @@ private void carryVaultOverrides(VaultConfig incoming) throws SkyflowException { if (controller != null) { controller.refreshVaultUrl(); } + DetectController detectController = this.detectClientsMap.get(incoming.getVaultId()); + if (detectController != null) { + detectController.refreshVaultUrl(); + } } } @@ -294,6 +336,10 @@ private void propagateHttpConfig() { this.writeTimeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis); } + for (DetectController detect : this.detectClientsMap.values()) { + detect.setCommonHttpConfig(this.timeout, this.maxRetries, this.initialRetryDelayMillis, + this.maxRetryDelayMillis); + } } public Skyflow build() { diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java new file mode 100644 index 00000000..9aa7135e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java @@ -0,0 +1,118 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Request for {@code reidentifyFile}. Supply the file through exactly one {@link DataSourceType}: + * the base64-encoded content, the skyflow id of a vault record that holds the file, or an S3 + * presigned URL. The vault id is filled in by the controller. + */ +public final class ReidentifyFileRequest { + private final DataSourceType dataSource; + private final String value; + private final FileDataFormat dataFormat; + private final List redactionLevel; + + private ReidentifyFileRequest(ReidentifyFileRequestBuilder builder) { + this.dataSource = builder.dataSource; + this.value = builder.value; + this.dataFormat = builder.dataFormat; + this.redactionLevel = builder.redactionLevel; + } + + /** + * @return a new builder + */ + public static ReidentifyFileRequestBuilder builder() { + return new ReidentifyFileRequestBuilder(); + } + + /** + * @return How {@code value} supplies the file. Required. + */ + public DataSourceType getDataSource() { + return dataSource; + } + + /** + * @return Base64 content, skyflow id or presigned URL of the file, according to {@code dataSource}. Required. + */ + public String getValue() { + return value; + } + + /** + * @return Format of the file. Optional; the API infers it when omitted. Re-identification supports text formats + * such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. + */ + public FileDataFormat getDataFormat() { + return dataFormat; + } + + /** + * @return Optional per-group rendering rules. + */ + public List getRedactionLevel() { + return redactionLevel; + } + + @Override + public String toString() { + return "ReidentifyFileRequest{" + + "dataSource=" + dataSource + + ", value=" + value + + ", dataFormat=" + dataFormat + + ", redactionLevel=" + redactionLevel + + '}'; + } + + public static final class ReidentifyFileRequestBuilder { + private DataSourceType dataSource; + private String value; + private FileDataFormat dataFormat; + private List redactionLevel; + + private ReidentifyFileRequestBuilder() { + } + + /** + * @param dataSource How {@code value} supplies the file. Required. + * @return this builder + */ + public ReidentifyFileRequestBuilder dataSource(DataSourceType dataSource) { + this.dataSource = dataSource; + return this; + } + + /** + * @param value Base64 content, skyflow id or presigned URL of the file, according to {@code dataSource}. Required. + * @return this builder + */ + public ReidentifyFileRequestBuilder value(String value) { + this.value = value; + return this; + } + + /** + * @param dataFormat Format of the file. Optional. + * @return this builder + */ + public ReidentifyFileRequestBuilder dataFormat(FileDataFormat dataFormat) { + this.dataFormat = dataFormat; + return this; + } + + /** + * @param redactionLevel Optional per-group rendering rules. + * @return this builder + */ + public ReidentifyFileRequestBuilder redactionLevel(List redactionLevel) { + this.redactionLevel = redactionLevel; + return this; + } + + public ReidentifyFileRequest build() { + return new ReidentifyFileRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java b/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java new file mode 100644 index 00000000..17d32f3e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java @@ -0,0 +1,59 @@ +package com.skyflow.detect; + +import java.util.List; + +/** + * Response of {@code reidentifyFile}. File re-identification is synchronous, so a {@code SUCCESS} + * status carries the output in the same response. + */ +public final class ReidentifyFileResponse { + private final DetectRunStatus status; + private final DataSourceType outputType; + private final List output; + private final Metrics metrics; + + public ReidentifyFileResponse(DetectRunStatus status, DataSourceType outputType, List output, Metrics metrics) { + this.status = status; + this.outputType = outputType; + this.output = output; + this.metrics = metrics; + } + + /** + * @return Processing status. UNKNOWN when the API did not report one. + */ + public DetectRunStatus getStatus() { + return status; + } + + /** + * @return How output files are delivered, or null when not reported. + */ + public DataSourceType getOutputType() { + return outputType; + } + + /** + * @return Output artifacts. Empty when none were returned, never null. + */ + public List getOutput() { + return output; + } + + /** + * @return Processing metrics, or null when not reported. + */ + public Metrics getMetrics() { + return metrics; + } + + @Override + public String toString() { + return "ReidentifyFileResponse{" + + "status=" + status + + ", outputType=" + outputType + + ", output=" + output + + ", metrics=" + metrics + + '}'; + } +} diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java new file mode 100644 index 00000000..d1653166 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java @@ -0,0 +1,69 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; +import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Converts the flowvault {@code reidentifyFile} models to and from the generated V2 API types. + * Internal to the SDK. + */ +public final class ReidentifyFileMapper { + private ReidentifyFileMapper() { + } + + public static ReidentifyFileRequestV2 toApiRequest(ReidentifyFileRequest request, String vaultId) { + ReidentifyFileRequestV2._FinalStage builder = ReidentifyFileRequestV2.builder() + .dataSource(ReidentifyFileRequestV2DataSource.valueOf(request.getDataSource().name())) + .value(request.getValue()) + .vaultId(vaultId); + if (request.getDataFormat() != null) { + // The wire value for a file format is the lower-case extension. + builder.dataFormat(ReidentifyFileRequestV2DataFormat.valueOf(request.getDataFormat().name().toLowerCase())); + } + if (request.getRedactionLevel() != null) { + builder.redactionLevel(DetectRequestMapper.toRedactionLevels(request.getRedactionLevel())); + } + return builder.build(); + } + + public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 response) { + List outputs = new ArrayList<>(); + List apiOutputs = response.getOutput().orElse(null); + if (apiOutputs != null) { + for (com.skyflow.generated.detect.rest.types.FileOutput apiOutput : apiOutputs) { + if (apiOutput != null) { + outputs.add(DetectResponseMapper.toFileOutput(apiOutput)); + } + } + } + return new ReidentifyFileResponse( + response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) + .orElse(DetectRunStatus.UNKNOWN), + response.getOutputType().map(t -> enumOrDefault(DataSourceType.class, t.toString(), null)).orElse(null), + Collections.unmodifiableList(outputs), + response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null)); + } + + /** Maps a wire value onto a public enum, tolerating values this SDK version does not know. */ + private static > E enumOrDefault(Class type, String value, E fallback) { + if (value == null) { + return fallback; + } + try { + return Enum.valueOf(type, value); + } catch (IllegalArgumentException unknown) { + return fallback; + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java b/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java new file mode 100644 index 00000000..0eafdcc8 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java @@ -0,0 +1,43 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + + +/** + * Client-side validation for the flowvault {@code reidentifyFile} request. Internal to the SDK. + */ +public final class ReidentifyFileValidations { + private static final String INTERFACE_NAME = "detect"; + + private ReidentifyFileValidations() { + } + + public static void validateReidentifyFileRequest(ReidentifyFileRequest request) throws SkyflowException { + if (request == null) { + throw invalid(ErrorLogs.REIDENTIFY_FILE_REQUEST_NULL, ErrorMessage.ReidentifyFileRequestNull); + } + if (request.getDataSource() == null) { + throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidDataSourceInReidentifyFile); + } + if (isBlank(request.getValue())) { + throw invalid(ErrorLogs.INVALID_VALUE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidValueInReidentifyFile); + } + // redactionLevel entries are optional on the API and are passed through as given. + } + + + private static boolean isBlank(String value) { + return value == null || value.trim().isEmpty(); + } + + private static SkyflowException invalid(ErrorLogs log, ErrorMessage message) { + LogUtil.printErrorLog(BaseUtils.parameterizedString(log.getLog(), INTERFACE_NAME)); + return new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), message.getMessage()); + } +} diff --git a/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java new file mode 100644 index 00000000..cceec8b8 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -0,0 +1,77 @@ +package com.skyflow.errors; + +import com.skyflow.utils.Constants; + +/** + * Validation messages specific to the flowvault SDK. Messages shared by every SDK live in + * {@link BaseErrorMessage} in common; this enum holds only what common and skyvault do not use. + */ +public enum ErrorMessage { + // Vault config + EmptyVaultUrl("%s0 Initialization failed. Vault URL is empty. Specify a valid vault URL."), + InvalidVaultUrlFormat("%s0 Initialization failed. Vault URL must start with 'https://'."), + EitherVaultUrlOrClusterIdRequired("%s0 Initialization failed. Specify either 'clusterId' or 'vaultURL'."), + // Insert / upsert + TableSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name cannot be specified at both the request and record levels. Please specify the table name in only one place."), + TableNotSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name is missing. Table name should be specified at one place either at the request level or record level. Please specify the table name at one place."), + UpsertTableRequestAtRecordLevel("%s0 Validation error. Table name should be present at each record level when upsert is present at record level."), + UpsertTableRequestAtRequestLevel("%s0 Validation error. Upsert should be present at each record level when table name is present at record level."), + EmptyRecords("%s0 Validation error. 'records' can't be empty. Specify records."), + EmptyKeyInRecords("%s0 Validation error. Invalid key in data in records. Specify a valid key."), + EmptyValueInRecords("%s0 Validation error. Invalid value in records. Specify a valid value."), + RecordsKeyError("%s0 Validation error. 'records' key is missing from the payload. Specify a 'records' key."), + InvalidUpsertUpdateType("%s0 Validation error. Invalid upsert updateType. Specify either 'UPDATE' or 'REPLACE'."), + EmptyUpsertValues("%s0 Validation error. Upsert column values can't be empty. Specify at least one upsert column."), + RecordSizeExceedError("%s0 Maximum number of records exceeded. The limit is 100000."), + InvalidRecord("%s0 Validation error. InsertRecord object in the list is invalid. Specify a valid InsertRecord object."), + BothSingleTableFieldsAndRecordsSpecified("%s0 Validation error. Both single-table lookup fields ('table', 'ids', 'fields', 'uniqueValues', 'columnRedactions') and 'records' can't be specified. Either specify single-table fields or 'records'."), + // Detokenize / delete tokens + EmptyValues("%s0 Validation error. 'values' can't be empty. Specify values."), + EmptyValueInValues("%s0 Validation error. Invalid value in values. Specify a valid value."), + EmptyValueInTokens("%s0 Validation error. Invalid value in tokens. Specify a valid value."), + TokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 100000."), + DeleteTokensRequestNull("%s0 Validation error. DeleteTokensRequest object is null. Specify a valid DeleteTokensRequest object."), + EmptyDeleteTokensData("%s0 Validation error. Tokens list is empty. Specify at least one token to delete."), + EmptyTokenInDeleteTokensData("%s0 Validation error. Invalid token in delete tokens request. Specify a valid token."), + DeleteTokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 100000."), + NullTokenGroupRedactions("%s0 Validation error. TokenGroupRedaction in the list is null. Specify a valid TokenGroupRedactions object."), + NullRedactionInTokenGroup("%s0 Validation error. Redaction in TokenGroupRedactions is null or empty. Specify a valid redaction."), + NullTokenGroupNameInTokenGroup("%s0 Validation error. TokenGroupName in TokenGroupRedactions is null or empty. Specify a valid tokenGroupName."), + // Get / update + IdsOrUniqueValuesKeyError("%s0 Validation error. 'ids' or 'uniqueValues' key is missing from the payload. Specify ids or uniqueValues in payload."), + BothIdsAndUniqueValuesSpecified("%s0 Validation error. Both Skyflow IDs and unique values can't be specified. Either specify Skyflow IDs or unique values."), + EmptyUniqueValues("%s0 Validation error. 'uniqueValues' can't be empty. Specify at least one unique value."), + EmptyUniqueValueInUniqueValues("%s0 Validation error. Invalid unique value in 'uniqueValues'. Specify a valid unique value."), + NullColumnRedactions("%s0 Validation error. Column redaction object can not be null. Specify a valid column redaction object."), + NullColumnNameInColumnRedaction("%s0 Validation error. Column name can not be null or empty in column redaction. Specify a valid column name."), + NullRedactionInColumnRedaction("%s0 Validation error. Redaction can not be null or empty in column redaction. Specify a valid redaction."), + NullGetRecordRequest("%s0 Validation error. Record in 'records' is null. Specify a valid record."), + UpdateRecordNull("%s0 Validation error. UpdateRequestRecord object in the list is null. Specify a valid UpdateRequestRecord object."), + RecordSkyflowIdKeyError("%s0 Validation error. 'skyflowId' key is missing from the record. Specify a 'skyflowId' key."), + EmptySkyflowIdInRecord("%s0 Validation error. 'skyflowId' can't be empty in the record. Specify a valid skyflow ID."), + // Tokenize + EmptyTokenizeData("%s0 Validation error. Tokenize data is empty. Specify at least one tokenize record."), + TokenizeRecordNull("%s0 Validation error. TokenizeRecord in the list is null. Specify a valid TokenizeRecord object."), + InvalidBulkTokenizeRecordType("%s0 Validation error. Record in the list must be of type BulkTokenizeRequestRecord. Specify a valid BulkTokenizeRequestRecord object."), + EmptyValueInTokenizeRecord("%s0 Validation error. Value in TokenizeRecord is null or empty. Specify a valid value."), + EmptyTokenGroupNamesInTokenizeRecord("%s0 Validation error. TokenGroupNames in TokenizeRecord is null or empty. Specify at least one token group name."), + EmptyTokenGroupNameInTokenizeRecord("%s0 Validation error. Token group name in TokenizeRecord is null or empty. Specify a valid token group name."), + TokenizeDataSizeExceedError("%s0 Maximum number of tokenize records exceeded. The limit is 100000."), + MissingIndexInBulkTokenizeRecord("%s0 Validation error. Index in BulkTokenizeRequestRecord is null. Specify an index for every record."), + DuplicateIndexInBulkTokenizeRecord("%s0 Validation error. Duplicate index in BulkTokenizeRequestRecord. Specify a unique index for every record."), + // Detect (flowvault only) + ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), + InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), + InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), + ; + + private final String message; + + ErrorMessage(String message) { + this.message = message.replace("%s0", Constants.SDK_PREFIX); + } + + public String getMessage() { + return message; + } +} diff --git a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java index 084b01d7..257685f1 100644 --- a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -5,6 +5,7 @@ import com.skyflow.enums.InterfaceName; import com.skyflow.generated.rest.types.FlowEnumUpdateType; import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; @@ -42,38 +43,38 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx if (nonNullMembers > 1) { LogUtil.printErrorLog(ErrorLogs.MULTIPLE_TOKEN_GENERATION_MEANS_PASSED.getLog()); throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() + ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() ); } else if (nonNullMembers < 1) { LogUtil.printErrorLog(ErrorLogs.NO_TOKEN_GENERATION_MEANS_PASSED.getLog()); throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NoTokenGenerationMeansPassed.getMessage() + ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage() ); } else if (path != null && path.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_PATH.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialFilePath.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentialFilePath.getMessage()); } else if (credentialsString != null && credentialsString.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_STRING.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialsString.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyCredentialsString.getMessage()); } else if (token != null && token.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_TOKEN_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyToken.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyToken.getMessage()); } else if (apiKey != null) { if (apiKey.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_API_KEY_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyApikey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyApikey.getMessage()); } else { Pattern pattern = Pattern.compile(Constants.API_KEY_REGEX); Matcher matcher = pattern.matcher(apiKey); if (!matcher.matches()) { LogUtil.printErrorLog(ErrorLogs.INVALID_API_KEY.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidApikey.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidApikey.getMessage()); } } } else if (roles != null) { if (roles.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_ROLES.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoles.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyRoles.getMessage()); } else { for (int index = 0; index < roles.size(); index++) { String role = roles.get(index); @@ -81,7 +82,7 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_OR_NULL_ROLE_IN_ROLES.getLog(), Integer.toString(index) )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoleInRoles.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyRoleInRoles.getMessage()); } } } @@ -91,13 +92,13 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx String ctxStr = (String) context; if (ctxStr.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyContext.getMessage()); } } else if (context instanceof Map) { Map ctxMap = (Map) context; if (ctxMap.isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyContext.getMessage()); } Pattern ctxKeyPattern = Pattern.compile(Constants.CONTEXT_KEY_REGEX); for (Object key : ctxMap.keySet()) { @@ -106,12 +107,12 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.INVALID_CONTEXT_MAP_KEY.getLog(), keyStr)); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - Utils.parameterizedString(ErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); + Utils.parameterizedString(BaseErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); } } } else { LogUtil.printErrorLog(ErrorLogs.INVALID_CONTEXT_TYPE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidContextType.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidContextType.getMessage()); } } } @@ -120,7 +121,7 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx public static void validateVaultConfiguration(VaultConfig vaultConfig) throws SkyflowException { if (vaultConfig == null) { LogUtil.printErrorLog(ErrorLogs.VAULT_CONFIG_IS_NULL.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullVaultConfig.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.NullVaultConfig.getMessage()); } String vaultId = vaultConfig.getVaultId(); String clusterId = vaultConfig.getClusterId(); @@ -129,10 +130,10 @@ public static void validateVaultConfiguration(VaultConfig vaultConfig) throws Sk if (vaultId == null) { LogUtil.printErrorLog(ErrorLogs.VAULT_ID_IS_REQUIRED.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidVaultId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidVaultId.getMessage()); } else if (vaultId.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_VAULT_ID.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyVaultId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyVaultId.getMessage()); } else if (credentials != null) { validateCredentials(credentials); } @@ -153,7 +154,7 @@ public static void validateVaultConfiguration(VaultConfig vaultConfig) throws Sk throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EitherVaultUrlOrClusterIdRequired.getMessage()); } else if (clusterId.trim().isEmpty()) { LogUtil.printErrorLog(ErrorLogs.EMPTY_CLUSTER_ID.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyClusterId.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyClusterId.getMessage()); } } } @@ -164,7 +165,7 @@ public static void validateInsertRequest(InsertRequest insertRequest) throws Sky LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.INSERT_REQUEST_NULL.getLog(), InterfaceName.INSERT.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InsertRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InsertRequestNull.getMessage()); } List records = insertRequest.getRecords(); if (records == null) { @@ -225,14 +226,14 @@ private static void validateInsertRecordTokens(Map tokens) throw LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.INSERT.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokens.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyTokens.getMessage()); } for (String key : tokens.keySet()) { if (key == null || key.trim().isEmpty()) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_OR_NULL_KEY_IN_TOKENS.getLog(), InterfaceName.INSERT.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInTokens.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyKeyInTokens.getMessage()); } Object value = tokens.get(key); if (value == null || value.toString().trim().isEmpty()) { @@ -332,14 +333,14 @@ public static void validateDetokenizeRequest(DetokenizeRequest request) throws S LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.DETOKENIZE_REQUEST_NULL.getLog(), InterfaceName.DETOKENIZE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DetokenizeRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.DetokenizeRequestNull.getMessage()); } List tokens = request.getTokens(); if (tokens == null || tokens.isEmpty()) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyDetokenizeData.getMessage()); } for (int index = 0; index < tokens.size(); index++) { @@ -349,7 +350,7 @@ public static void validateDetokenizeRequest(DetokenizeRequest request) throws S ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName(), String.valueOf(index))); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDetokenizeData.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyTokenInDetokenizeData.getMessage()); } } @@ -418,7 +419,7 @@ public static void validateDeleteRequest(DeleteRequest deleteRequest) throws Sky LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.DELETE_REQUEST_NULL.getLog(), InterfaceName.DELETE_RECORDS.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeleteRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.DeleteRequestNull.getMessage()); } validateTableRequired(deleteRequest.getTableName(), InterfaceName.DELETE_RECORDS); validateIdsOrUniqueValues(deleteRequest.getSkyflowIds(), deleteRequest.getUniqueValues(), InterfaceName.DELETE_RECORDS); @@ -458,19 +459,19 @@ public static void validateUpdateRequest(UpdateRequest updateRequest) throws Sky LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.UPDATE_REQUEST_NULL.getLog(), InterfaceName.UPDATE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.UpdateRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.UpdateRequestNull.getMessage()); } String tableName = updateRequest.getTableName(); if (tableName == null) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.TABLE_IS_REQUIRED.getLog(), InterfaceName.UPDATE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableKeyError.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.TableKeyError.getMessage()); } else if (tableName.trim().isEmpty()) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_TABLE_NAME.getLog(), InterfaceName.UPDATE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTable.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyTable.getMessage()); } List records = updateRequest.getRecords(); @@ -532,14 +533,14 @@ public static void validateUpdateRequest(UpdateRequest updateRequest) throws Sky LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.UPDATE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokens.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyTokens.getMessage()); } for (String key : tokens.keySet()) { if (key == null || key.trim().isEmpty()) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_OR_NULL_KEY_IN_TOKENS.getLog(), InterfaceName.UPDATE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInTokens.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyKeyInTokens.getMessage()); } Object value = tokens.get(key); if (value == null || value.toString().trim().isEmpty()) { @@ -559,7 +560,7 @@ public static void validateGetRequest(GetRequest getRequest) throws SkyflowExcep LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.GET_REQUEST_NULL.getLog(), InterfaceName.GET.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.GetRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.GetRequestNull.getMessage()); } boolean hasSingleTableFields = hasText(getRequest.getTableName()) @@ -603,12 +604,12 @@ private static void validateTableRequired(String table, InterfaceName interfaceN LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.TABLE_IS_REQUIRED.getLog(), interfaceName.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableKeyError.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.TableKeyError.getMessage()); } else if (table.trim().isEmpty()) { LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_TABLE_NAME.getLog(), interfaceName.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTable.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyTable.getMessage()); } } @@ -638,7 +639,7 @@ private static void validateIdsOrUniqueValues(List ids, List fields) throws SkyflowException LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_FIELDS.getLog(), InterfaceName.GET.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFields.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyFields.getMessage()); } for (int index = 0; index < fields.size(); index++) { String field = fields.get(index); @@ -671,7 +672,7 @@ private static void validateFields(List fields) throws SkyflowException LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.EMPTY_OR_NULL_FIELD_IN_FIELDS.getLog(), InterfaceName.GET.getName(), String.valueOf(index) )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFieldInFields.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.EmptyFieldInFields.getMessage()); } } } @@ -711,7 +712,7 @@ public static void validateBulkTokenizeRequest(BulkTokenizeRequest request) thro LogUtil.printErrorLog(Utils.parameterizedString( ErrorLogs.TOKENIZE_REQUEST_NULL.getLog(), InterfaceName.TOKENIZE.getName() )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRequestNull.getMessage()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.TokenizeRequestNull.getMessage()); } List records = request.getRecords(); if (records == null || records.isEmpty()) { diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java new file mode 100644 index 00000000..3f86640d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -0,0 +1,183 @@ +package com.skyflow.vault.controller; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.detect.internal.DeidentifyFileFlow; +import com.skyflow.detect.internal.DetectRequestMapper; +import com.skyflow.detect.internal.DetectValidations; +import com.skyflow.detect.internal.ReidentifyFileMapper; +import com.skyflow.detect.internal.ReidentifyFileValidations; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.detect.rest.core.ApiClientApiException; +import com.skyflow.generated.detect.rest.core.ApiClientException; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.core.RequestOptions; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.Utils; +import com.skyflow.utils.logger.LogUtil; + +/** + * Skyflow Detect operations for a flowvault vault, returned by {@code Skyflow.detect()} and + * {@code Skyflow.detect(vaultId)}. The shared Detect V2 methods are inherited from + * {@link BaseDetectController}; this class adds the flowvault-only {@link #deidentifyFile} and + * {@link #reidentifyFile} and + * supplies the flowvault URL rules, SDK metrics and the vault-level timeout and retry overrides + * from {@link VaultConfig}. + */ +public final class DetectController extends BaseDetectController { + private static final int DEFAULT_TIMEOUT_SECONDS = 60; + private static final int DEFAULT_MAX_RETRIES = 0; + private static final long DEFAULT_INITIAL_RETRY_DELAY_MILLIS = 500L; + private static final long DEFAULT_MAX_RETRY_DELAY_MILLIS = 2000L; + + public DetectController(VaultConfig vaultConfig, Credentials credentials) { + super(vaultConfig, credentials); + } + + /** Same precedence as the vault controller: environment variable, explicit vaultUrl, then cluster id and env. */ + @Override + protected String resolveVaultUrl() throws SkyflowException { + String vaultUrl = Utils.getEnvVaultUrl(); + if (vaultUrl == null || vaultUrl.isEmpty()) { + vaultUrl = getVaultConfig().getVaultUrl(); + } + if (vaultUrl == null || vaultUrl.isEmpty()) { + vaultUrl = Utils.getVaultUrl(getVaultConfig().getClusterId(), getVaultConfig().getEnv()); + } + return vaultUrl; + } + + @Override + protected String getSdkMetrics() { + return Utils.getMetrics().toString(); + } + + @Override + protected Integer effectiveTimeoutSeconds() { + return firstNonNull(getVaultConfig().getTimeout(), super.effectiveTimeoutSeconds(), DEFAULT_TIMEOUT_SECONDS); + } + + @Override + protected Integer effectiveMaxRetries() { + return firstNonNull(getVaultConfig().getMaxRetries(), super.effectiveMaxRetries(), DEFAULT_MAX_RETRIES); + } + + @Override + protected Long effectiveInitialRetryDelayMillis() { + return firstNonNull(getVaultConfig().getInitialRetryDelayMillis(), super.effectiveInitialRetryDelayMillis(), + DEFAULT_INITIAL_RETRY_DELAY_MILLIS); + } + + @Override + protected Long effectiveMaxRetryDelayMillis() { + return firstNonNull(getVaultConfig().getMaxRetryDelayMillis(), super.effectiveMaxRetryDelayMillis(), + DEFAULT_MAX_RETRY_DELAY_MILLIS); + } + + // ------------------------------------------------------------------ + // Flowvault-only Detect V2 operations + // ------------------------------------------------------------------ + + /** + * Detects and de-identifies sensitive data in a file. The API is asynchronous: by default this + * submits the run and returns its id for use with {@link #getRun}. With + * {@link DeidentifyFileRequest#getPollOptions() pollOptions} the SDK polls the run with exponential + * backoff and returns the completed run, or the run id with a non-terminal status if the budget + * runs out. On success, a request built from a local file has its outputs written to disk. + * + * @param request the file (base64, skyflow id, presigned URL, or a local file) plus a stored or inline configuration + * @return run id, and the run's status, outputs and metrics when polled + * @throws SkyflowException on validation failure, credential failure, an API error or an output write failure + */ + public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); + DetectValidations.validateDeidentifyFileRequest(request); + String token = resolveToken(); + DeidentifyFileRequestV2 apiRequest = DetectRequestMapper.toDeidentifyFileRequest(request, getVaultConfig().getVaultId()); + String runId; + try { + DeidentifyFileResponseV2 apiResponse = filesClient().deidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + runId = apiResponse.getRunId().orElse(null); + } catch (ApiClientApiException e) { + LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + DeidentifyFileResponse response = DeidentifyFileFlow.complete(request, runId, + id -> getRun(GetRunRequest.builder().runId(id).build())); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } + + /** + * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: + * the re-identified file is returned in the response rather than through a run id. + * + * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules + * @return status, output files and metrics + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_FILE_REQUEST.getLog()); + ReidentifyFileValidations.validateReidentifyFileRequest(request); + String token = resolveToken(); + ReidentifyFileRequestV2 apiRequest = ReidentifyFileMapper.toApiRequest(request, getVaultConfig().getVaultId()); + try { + ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + + private RequestOptions requestOptions(String token) { + return RequestOptions.builder() + .addHeader("Authorization", "Bearer " + token) + .addHeader(BaseConstants.SDK_METRICS_HEADER_KEY, getSdkMetrics()) + .build(); + } + + private static String responseBody(Object body) { + if (body == null) { + return null; + } + if (body instanceof String) { + return (String) body; + } + try { + return ObjectMappers.JSON_MAPPER.writeValueAsString(body); + } catch (Exception ex) { + return body.toString(); + } + } + + private static T firstNonNull(T vaultLevel, T clientLevel, T defaultValue) { + if (vaultLevel != null) { + return vaultLevel; + } + return clientLevel != null ? clientLevel : defaultValue; + } +} diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java new file mode 100644 index 00000000..88da01e4 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java @@ -0,0 +1,182 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +/** Request mapping is checked on the serialised wire JSON, response mapping from raw API JSON. */ +public class ReidentifyFileMapperTests { + + private static String wire(ReidentifyFileRequestV2 request) throws Exception { + return ObjectMappers.JSON_MAPPER.writeValueAsString(request); + } + + private static ReidentifyFileResponse fromJson(String json) throws Exception { + return ReidentifyFileMapper.toResponse(ObjectMappers.JSON_MAPPER.readValue(json, ReidentifyFileResponseV2.class)); + } + + // ─── request ────────────────────────────────────────────────────────────── + + @Test + public void mapsRequiredFieldsAndInjectsVaultId() throws Exception { + ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("W05BTUVfMV0=").build(), "vault-1"); + + Assert.assertEquals("BASE64", api.getDataSource().toString()); + Assert.assertEquals("W05BTUVfMV0=", api.getValue()); + Assert.assertEquals("vault-1", api.getVaultId()); + Assert.assertFalse(api.getDataFormat().isPresent()); + Assert.assertFalse(api.getRedactionLevel().isPresent()); + + String json = wire(api); + Assert.assertTrue(json, json.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(json, json.contains("\"value\":\"W05BTUVfMV0=\"")); + Assert.assertTrue(json, json.contains("\"vaultId\":\"vault-1\"")); + Assert.assertFalse(json, json.contains("dataFormat")); + Assert.assertFalse(json, json.contains("redactionLevel")); + } + + @Test + public void mapsEveryDataSource() throws Exception { + for (DataSourceType source : DataSourceType.values()) { + ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() + .dataSource(source).value("x").build(), "v"); + Assert.assertEquals(source.name(), api.getDataSource().toString()); + Assert.assertTrue(wire(api).contains("\"dataSource\":\"" + source.name() + "\"")); + } + } + + @Test + public void dataFormatIsSentAsLowerCaseWireValue() throws Exception { + for (FileDataFormat format : new FileDataFormat[]{FileDataFormat.TXT, FileDataFormat.CSV, FileDataFormat.JSON, + FileDataFormat.JSONL, FileDataFormat.XML, FileDataFormat.DOCX, FileDataFormat.XLSX, FileDataFormat.PPTX}) { + ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec").dataFormat(format).build(), "v"); + Assert.assertEquals(format.name().toLowerCase(), api.getDataFormat().get().toString()); + Assert.assertTrue(wire(api).contains("\"dataFormat\":\"" + format.name().toLowerCase() + "\"")); + } + } + + @Test + public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { + ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://s3/presigned") + .redactionLevel(Arrays.asList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask-middle").build(), + RedactionLevel.builder().entityName(EntityType.EMAIL_ADDRESS).redactionType(RedactionType.MASKED).build())) + .build(), "v"); + + Assert.assertEquals(2, api.getRedactionLevel().get().size()); + String json = wire(api); + Assert.assertTrue(json, json.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(json, json.contains("\"redactionPattern\":\"mask-middle\"")); + Assert.assertTrue(json, json.contains("\"entityName\":\"EMAIL_ADDRESS\"")); + Assert.assertTrue(json, json.contains("\"redactionType\":\"MASKED\"")); + // Unset halves of each level must not be serialised as nulls. + Assert.assertFalse(json, json.contains("null")); + } + + @Test + public void emptyRedactionLevelListIsSentAsEmptyArray() throws Exception { + ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); + Assert.assertTrue(api.getRedactionLevel().get().isEmpty()); + Assert.assertTrue(wire(api).contains("\"redactionLevel\":[]")); + } + + // ─── response ───────────────────────────────────────────────────────────── + + @Test + public void mapsFullResponse() throws Exception { + ReidentifyFileResponse response = fromJson("{\"status\":\"SUCCESS\",\"outputType\":\"PRESIGNED_URL\"," + + "\"output\":[{\"processedFile\":\"https://s3/out-1\",\"processedFileType\":\"REIDENTIFIED_FILE\",\"processedFileExtension\":\"docx\"}," + + "{\"processedFile\":\"https://s3/out-2\",\"processedFileType\":\"ENTITIES\",\"processedFileExtension\":\"json\"}]," + + "\"metrics\":{\"size\":12.5,\"wordCount\":120,\"characterCount\":800,\"pages\":2,\"slides\":0,\"duration\":1.25}}"); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + FileOutput first = response.getOutput().get(0); + Assert.assertEquals("https://s3/out-1", first.getProcessedFile()); + Assert.assertEquals("REIDENTIFIED_FILE", first.getProcessedFileType()); + Assert.assertEquals(FileDataFormat.DOCX, first.getProcessedFileExtension()); + Assert.assertEquals("ENTITIES", response.getOutput().get(1).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.JSON, response.getOutput().get(1).getProcessedFileExtension()); + Assert.assertEquals(12.5, response.getMetrics().getSize(), 1e-9); + Assert.assertEquals(Integer.valueOf(120), response.getMetrics().getWordCount()); + Assert.assertEquals(Integer.valueOf(800), response.getMetrics().getCharacterCount()); + Assert.assertEquals(Integer.valueOf(2), response.getMetrics().getPages()); + Assert.assertEquals(Integer.valueOf(0), response.getMetrics().getSlides()); + Assert.assertEquals(1.25, response.getMetrics().getDuration(), 1e-9); + } + + @Test + public void mapsEveryKnownStatusAndOutputType() throws Exception { + for (DetectRunStatus status : DetectRunStatus.values()) { + Assert.assertEquals(status, fromJson("{\"status\":\"" + status.name() + "\"}").getStatus()); + } + for (DataSourceType type : DataSourceType.values()) { + Assert.assertEquals(type, fromJson("{\"outputType\":\"" + type.name() + "\"}").getOutputType()); + } + } + + @Test + public void emptyResponseYieldsDefaultsNotNulls() throws Exception { + ReidentifyFileResponse response = fromJson("{}"); + Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); + Assert.assertNull(response.getOutputType()); + Assert.assertNotNull(response.getOutput()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertNull(response.getMetrics()); + } + + @Test + public void unknownWireValuesDegradeGracefully() throws Exception { + ReidentifyFileResponse response = fromJson("{\"status\":\"BRAND_NEW\",\"outputType\":\"FTP\"," + + "\"output\":[{\"processedFile\":\"x\",\"processedFileType\":\"NEW_KIND\",\"processedFileExtension\":\"heic\"}]}"); + Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); + Assert.assertNull(response.getOutputType()); + FileOutput output = response.getOutput().get(0); + Assert.assertEquals("x", output.getProcessedFile()); + Assert.assertEquals("NEW_KIND", output.getProcessedFileType()); + Assert.assertNull(output.getProcessedFileExtension()); + } + + @Test + public void nullOutputElementsAreSkipped() throws Exception { + Assert.assertEquals(1, fromJson("{\"output\":[null,{\"processedFile\":\"x\"},null]}").getOutput().size()); + } + + @Test + public void outputWithMissingFieldsMapsToNulls() throws Exception { + FileOutput output = fromJson("{\"output\":[{}]}").getOutput().get(0); + Assert.assertNull(output.getProcessedFile()); + Assert.assertNull(output.getProcessedFileType()); + Assert.assertNull(output.getProcessedFileExtension()); + } + + @Test + public void outputListIsUnmodifiable() throws Exception { + ReidentifyFileResponse response = fromJson("{\"output\":[{\"processedFile\":\"x\"}]}"); + try { + response.getOutput().clear(); + Assert.fail("expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + Assert.assertEquals(1, response.getOutput().size()); + } + } +} diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java new file mode 100644 index 00000000..5d1cc3fb --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -0,0 +1,85 @@ +package com.skyflow.detect.internal; + +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +public class ReidentifyFileValidationsTests { + + private static ReidentifyFileRequest.ReidentifyFileRequestBuilder valid() { + return ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); + } + + private static void assertRejected(ReidentifyFileRequest request, ErrorMessage expected) { + try { + ReidentifyFileValidations.validateReidentifyFileRequest(request); + Assert.fail("expected SkyflowException: " + expected); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected.getMessage(), e.getMessage()); + } + } + + @Test + public void rejectsNullRequest() { + assertRejected(null, ErrorMessage.ReidentifyFileRequestNull); + } + + @Test + public void rejectsMissingDataSource() { + assertRejected(ReidentifyFileRequest.builder().value("Zm9v").build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + } + + @Test + public void rejectsNullOrBlankValue() { + assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), ErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value("").build(), ErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value(" \t").build(), ErrorMessage.InvalidValueInReidentifyFile); + } + + @Test + public void checksFieldsInOrderDataSourceBeforeValue() { + // Both missing: dataSource is reported first. + assertRejected(ReidentifyFileRequest.builder().build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + } + + @Test + public void acceptsMinimalAndFullValidRequests() throws SkyflowException { + ReidentifyFileValidations.validateReidentifyFileRequest(valid().build()); + ReidentifyFileValidations.validateReidentifyFileRequest(valid() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f") + .redactionLevel(Arrays.asList( + RedactionLevel.builder().tokenGroupName("g").redactionPattern("p").build(), + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.REDACTED).build(), + RedactionLevel.builder().tokenGroupName("g2").redactionType(RedactionType.PLAIN_TEXT).build(), + RedactionLevel.builder().entityName(EntityType.SSN).redactionPattern("p2").build())) + .build()); + } + + @Test + public void nullOrEmptyRedactionLevelListIsAllowed() throws SkyflowException { + ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(null).build()); + ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(Collections.emptyList()).build()); + } + + @Test + public void anyRedactionLevelShapePassesThrough() throws SkyflowException { + // Every RedactionLevel field is optional on the API; the server applies its own rules. + ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(Arrays.asList( + null, + RedactionLevel.builder().build(), + RedactionLevel.builder().tokenGroupName("g").build(), + RedactionLevel.builder().tokenGroupName("g").entityName(EntityType.NAME) + .redactionPattern("p").redactionType(RedactionType.MASKED).build())).build()); + } +} diff --git a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java index f900c03a..fb40b63c 100644 --- a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -15,6 +15,7 @@ import com.skyflow.config.VaultConfig; import com.skyflow.enums.Env; import com.skyflow.enums.UpdateType; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.utils.Constants; @@ -232,7 +233,7 @@ public void testValidateVaultConfiguration_nullRequest() { Validations.validateVaultConfiguration(null); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.NullVaultConfig.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.NullVaultConfig.getMessage(), e.getMessage()); } } @@ -582,7 +583,7 @@ public void testValidateInsertRequest_emptyTokensMapThrows() { Validations.validateInsertRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyTokens.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyTokens.getMessage(), e.getMessage()); } } @@ -597,7 +598,7 @@ public void testValidateInsertRequest_nullKeyInTokensThrows() { Validations.validateInsertRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); } } @@ -612,7 +613,7 @@ public void testValidateInsertRequest_blankKeyInTokensThrows() { Validations.validateInsertRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); } } @@ -1610,7 +1611,7 @@ public void testValidateDeleteRequest_nullRequestThrows() { Validations.validateDeleteRequest(null); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.DeleteRequestNull.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.DeleteRequestNull.getMessage(), e.getMessage()); } } @@ -1621,7 +1622,7 @@ public void testValidateDeleteRequest_nullTableThrows() { Validations.validateDeleteRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.TableKeyError.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.TableKeyError.getMessage(), e.getMessage()); } } @@ -1632,7 +1633,7 @@ public void testValidateDeleteRequest_blankTableThrows() { Validations.validateDeleteRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyTable.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyTable.getMessage(), e.getMessage()); } } @@ -1671,7 +1672,7 @@ public void testValidateDeleteRequest_blankIdInIdsThrows() { Validations.validateDeleteRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyIdInIds.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyIdInIds.getMessage(), e.getMessage()); } } @@ -1722,7 +1723,7 @@ public void testValidateUpdateRequest_nullRequestThrows() { Validations.validateUpdateRequest(null); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.UpdateRequestNull.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.UpdateRequestNull.getMessage(), e.getMessage()); } } @@ -1734,7 +1735,7 @@ public void testValidateUpdateRequest_nullTableNameThrows() { Validations.validateUpdateRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.TableKeyError.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.TableKeyError.getMessage(), e.getMessage()); } } @@ -1746,7 +1747,7 @@ public void testValidateUpdateRequest_blankTableNameThrows() { Validations.validateUpdateRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyTable.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyTable.getMessage(), e.getMessage()); } } @@ -1845,7 +1846,7 @@ public void testValidateUpdateRequest_emptyTokensMapThrows() { Validations.validateUpdateRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyTokens.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyTokens.getMessage(), e.getMessage()); } } @@ -1859,7 +1860,7 @@ public void testValidateUpdateRequest_blankKeyInTokensThrows() { Validations.validateUpdateRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyKeyInTokens.getMessage(), e.getMessage()); } } @@ -1917,7 +1918,7 @@ public void testValidateGetRequest_nullRequestThrows() { Validations.validateGetRequest(null); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.GetRequestNull.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.GetRequestNull.getMessage(), e.getMessage()); } } @@ -1957,7 +1958,7 @@ public void testValidateGetRequest_nullTableThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.TableKeyError.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.TableKeyError.getMessage(), e.getMessage()); } } @@ -1968,7 +1969,7 @@ public void testValidateGetRequest_blankTableThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyTable.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyTable.getMessage(), e.getMessage()); } } @@ -2010,7 +2011,7 @@ public void testValidateGetRequest_blankIdInIdsThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyIdInIds.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyIdInIds.getMessage(), e.getMessage()); } } @@ -2039,7 +2040,7 @@ public void testValidateGetRequest_emptyFieldsThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyFields.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyFields.getMessage(), e.getMessage()); } } @@ -2054,7 +2055,7 @@ public void testValidateGetRequest_blankFieldInFieldsThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyFieldInFields.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.EmptyFieldInFields.getMessage(), e.getMessage()); } } @@ -2163,7 +2164,7 @@ public void testValidateGetRequest_multiTableRecordMissingTableThrows() { Validations.validateGetRequest(request); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.TableKeyError.getMessage(), e.getMessage()); + Assert.assertEquals(BaseErrorMessage.TableKeyError.getMessage(), e.getMessage()); } } } diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java new file mode 100644 index 00000000..07f6e2f1 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -0,0 +1,622 @@ +package com.skyflow.vault.controller; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.PollOptions; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.enums.Env; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.SkyflowException; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.File; +import java.nio.file.Files; +import java.util.Base64; + +import java.util.Arrays; +import java.util.Collections; + +public class DetectControllerTests { + + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + + private static VaultConfig vaultConfig(String vaultId) { + VaultConfig config = new VaultConfig(); + config.setVaultId(vaultId); + config.setClusterId("cluster123"); + config.setEnv(Env.PROD); + return config; + } + + @Test + public void detectAccessorResolvesConfiguredVaults() throws SkyflowException { + Skyflow client = Skyflow.builder() + .addVaultConfig(vaultConfig("vault-a")) + .addVaultConfig(vaultConfig("vault-b")) + .build(); + Assert.assertNotNull(client.detect()); + Assert.assertSame(client.detect(), client.detect("vault-a")); + Assert.assertNotSame(client.detect("vault-a"), client.detect("vault-b")); + try { + client.detect("vault-c"); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void detectAccessorFollowsVaultConfigRemoval() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(vaultConfig("vault-a")).build(); + client.removeVaultConfig("vault-a"); + try { + client.detect(); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void deidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + try { + controller.deidentifyString(DeidentifyStringRequest.builder().text(" ").configurationId("cfg").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInDeidentifyString.getMessage(), e.getMessage()); + } + } + + @Test + public void reidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + try { + controller.reidentifyString(ReidentifyStringRequest.builder().text(" ").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInReidentifyString.getMessage(), e.getMessage()); + } + } + + @Test + public void missingCredentialsSurfaceAsSkyflowExceptionWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + try { + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(BaseErrorMessage.EmptyCredentials.getMessage(), e.getMessage()); + } + } + + // ─── reidentifyFile (flowvault only) ────────────────────────────────────── + + /** API-key credentials resolve without a token exchange, so the only network call is the Detect request. */ + private static Credentials apiKeyCredentials() { + Credentials credentials = new Credentials(); + credentials.setApiKey("sky-abcde-0123456789abcdef0123456789abcdef"); + return credentials; + } + + private static DetectController controllerFor(MockWebServer server) { + VaultConfig config = vaultConfig("vault-1"); + config.setVaultUrl(server.url("").toString()); + DetectController controller = new DetectController(config, apiKeyCredentials()); + controller.setCommonHttpConfig(null, 0, null, null); + return controller; + } + + @Test + public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + ReidentifyFileRequest[] bad = { + null, + ReidentifyFileRequest.builder().value("Zm9v").build(), + ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), + }; + ErrorMessage[] expected = { + ErrorMessage.ReidentifyFileRequestNull, + ErrorMessage.InvalidDataSourceInReidentifyFile, + ErrorMessage.InvalidValueInReidentifyFile, + }; + for (int i = 0; i < bad.length; i++) { + try { + controller.reidentifyFile(bad[i]); + Assert.fail("expected SkyflowException for case " + i); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected[i].getMessage(), e.getMessage()); + } + } + } + + @Test + public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + try { + controller.reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(BaseErrorMessage.EmptyCredentials.getMessage(), e.getMessage()); + } + } + + @Test + public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"SGVsbG8=\",\"processedFileType\":\"REIDENTIFIED_FILE\"," + + "\"processedFileExtension\":\"txt\"}]," + + "\"metrics\":{\"size\":0.5,\"wordCount\":3,\"characterCount\":12}}")); + + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value("W05BTUVfMV0=") + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Arrays.asList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(1, response.getOutput().size()); + Assert.assertEquals("SGVsbG8=", response.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REIDENTIFIED_FILE", response.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.TXT, response.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("POST", recorded.getMethod()); + Assert.assertEquals("/v2/detect/reidentify/file", recorded.getPath()); + Assert.assertEquals("Bearer sky-abcde-0123456789abcdef0123456789abcdef", recorded.getHeader("Authorization")); + Assert.assertNotNull(recorded.getHeader("sky-metadata")); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"W05BTUVfMV0=\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); + } + } + + @Test + public void reidentifyFileToleratesSparseAndUnknownResponseValues() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").build()); + Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); + Assert.assertNull(response.getOutputType()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertNull(response.getMetrics()); + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(body, body.contains("dataFormat")); + Assert.assertFalse(body, body.contains("redactionLevel")); + } finally { + server.shutdown(); + } + } + + @Test + public void reidentifyFileMapsApiErrors() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-9") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"unsupported format\"," + + "\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("unsupported format", e.getMessage()); + Assert.assertEquals("req-9", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(3), e.getGrpcCode()); + } + } finally { + server.shutdown(); + } + } + + // ─── inherited Detect V2 methods, exercised through the flowvault controller ── + // These prove the flowvault wiring (vault URL from VaultConfig, API-key credentials, + // flowvault SDK metrics header) end to end, not just the shared base logic. + + private static final String API_KEY = "sky-abcde-0123456789abcdef0123456789abcdef"; + + private static void assertCommonHeaders(RecordedRequest recorded, String method, String path) { + Assert.assertEquals(method, recorded.getMethod()); + Assert.assertEquals(path, recorded.getPath()); + Assert.assertEquals("Bearer " + API_KEY, recorded.getHeader("Authorization")); + String metrics = recorded.getHeader("sky-metadata"); + Assert.assertNotNull(metrics); + Assert.assertTrue(metrics, metrics.contains("skyflow-flowvault-java@")); + } + + @Test + public void deidentifyStringRoundTripWithStoredConfiguration() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"processedText\":\"My name is [NAME_1].\"," + + "\"entities\":[{\"token\":\"NAME_1\",\"value\":\"John Doe\",\"entityType\":\"NAME\"," + + "\"location\":{\"startIndex\":11,\"endIndex\":19,\"startIndexProcessed\":11,\"endIndexProcessed\":19}," + + "\"entityScores\":{\"NAME\":0.98}}]," + + "\"metrics\":{\"wordCount\":4,\"characterCount\":20}}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("My name is John Doe.").configurationId("cfg-123").build()); + + Assert.assertEquals("My name is [NAME_1].", response.getProcessedText()); + Assert.assertEquals(1, response.getEntities().size()); + Assert.assertEquals("NAME_1", response.getEntities().get(0).getToken()); + Assert.assertEquals("John Doe", response.getEntities().get(0).getValue()); + Assert.assertEquals("NAME", response.getEntities().get(0).getEntityType()); + Assert.assertEquals(Integer.valueOf(11), response.getEntities().get(0).getLocation().getStartIndex()); + Assert.assertEquals(Integer.valueOf(19), response.getEntities().get(0).getLocation().getEndIndexProcessed()); + Assert.assertEquals(0.98, response.getEntities().get(0).getEntityScores().get("NAME"), 1e-9); + Assert.assertEquals(Integer.valueOf(4), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is John Doe.\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-123\"")); + Assert.assertFalse(body, body.contains("\"configuration\":")); + } finally { + server.shutdown(); + } + } + + @Test + public void deidentifyStringRoundTripWithInlineConfigurationScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"[NAME_1]\"}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("John") + .configuration(DetectConfiguration.builder() + .detect(Detect.builder().entities(Collections.singletonList( + Entity.builder().entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("names").build())).build()) + .build()) + .build()); + + Assert.assertEquals("[NAME_1]", response.getProcessedText()); + Assert.assertTrue(response.getEntities().isEmpty()); + Assert.assertNull(response.getMetrics()); + + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"configuration\":{")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); // injected by the controller + Assert.assertTrue(body, body.contains("\"entityType\":\"NAME\"")); + Assert.assertTrue(body, body.contains("\"deidentificationType\":\"VAULT_TOKEN\"")); + Assert.assertTrue(body, body.contains("\"destination\":\"names\"")); + Assert.assertFalse(body, body.contains("configurationId")); + } finally { + server.shutdown(); + } + } + + @Test + public void reidentifyStringRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"processedText\":\"My name is J**n D*e.\",\"metrics\":{\"wordCount\":5}}")); + + ReidentifyStringResponse response = controllerFor(server).reidentifyString(ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals("My name is J**n D*e.", response.getProcessedText()); + Assert.assertEquals(Integer.valueOf(5), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/reidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is [NAME_1].\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); + } + } + + @Test + public void getRunRoundTripQueriesByIdScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"UERG\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}]," + + "\"metrics\":{\"pages\":3}}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); + + DetectController controller = controllerFor(server); + GetRunResponse done = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); + Assert.assertEquals("run-42", done.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, done.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, done.getOutputType()); + Assert.assertEquals("UERG", done.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REDACTED_FILE", done.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.PDF, done.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), done.getMetrics().getPages()); + Assert.assertNull(done.getMessage()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "GET", "/v2/detect/runs/run-42?vaultId=vault-1"); + Assert.assertEquals(0L, recorded.getBodySize()); + + GetRunResponse failed = controller.getRun(GetRunRequest.builder().runId("run-43").build()); + Assert.assertEquals(DetectRunStatus.FAILED, failed.getStatus()); + Assert.assertEquals("unsupported file", failed.getMessage()); + Assert.assertTrue(failed.getOutput().isEmpty()); + Assert.assertNull(failed.getOutputType()); + Assert.assertEquals("/v2/detect/runs/run-43?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); + } + } + + @Test + public void checkGuardrailsRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"tell me about politics\",\"validation\":\"FAILED\",\"toxic\":false,\"deniedTopic\":true}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"hello\",\"validation\":\"PASSED\"}")); + + DetectController controller = controllerFor(server); + CheckGuardrailsResponse blocked = controller.checkGuardrails(CheckGuardrailsRequest.builder() + .text("tell me about politics").checkToxicity(true).denyTopics(Arrays.asList("politics", "religion")).build()); + Assert.assertEquals("tell me about politics", blocked.getText()); + Assert.assertEquals(GuardrailsValidation.FAILED, blocked.getValidation()); + Assert.assertEquals(Boolean.FALSE, blocked.getToxic()); + Assert.assertEquals(Boolean.TRUE, blocked.getDeniedTopic()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/guardrails"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"tell me about politics\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"checkToxicity\":true")); + Assert.assertTrue(body, body.contains("\"denyTopics\":[\"politics\",\"religion\"]")); + + CheckGuardrailsResponse passed = controller.checkGuardrails(CheckGuardrailsRequest.builder().text("hello").build()); + Assert.assertEquals(GuardrailsValidation.PASSED, passed.getValidation()); + Assert.assertNull(passed.getToxic()); + Assert.assertNull(passed.getDeniedTopic()); + String minimal = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(minimal, minimal.contains("checkToxicity")); + Assert.assertFalse(minimal, minimal.contains("denyTopics")); + } finally { + server.shutdown(); + } + } + + @Test + public void apiErrorsOnInheritedMethodsMapToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(404).setHeader("x-request-id", "req-404") + .setBody("{\"error\":{\"grpc_code\":5,\"http_code\":404,\"message\":\"run not found\",\"http_status\":\"Not Found\",\"details\":[]}}")); + try { + controllerFor(server).getRun(GetRunRequest.builder().runId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("run not found", e.getMessage()); + Assert.assertEquals("req-404", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(5), e.getGrpcCode()); + } + } finally { + server.shutdown(); + } + } + + // ─── deidentifyFile (flowvault only) ────────────────────────────────────── + + @Test + public void deidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + try { + controller.deidentifyFile(DeidentifyFileRequest.builder().value("Zm9v").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidDataSourceInDeidentifyFile.getMessage(), e.getMessage()); + } + } + + @Test + public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .configurationId("cfg-1").build()); + + Assert.assertEquals("run-42", response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/file"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"SKYFLOW_ID\"")); + Assert.assertTrue(body, body.contains("\"value\":\"rec-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"pdf\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-1\"")); + Assert.assertEquals("only the submit call was made", 1, server.getRequestCount()); + } finally { + server.shutdown(); + } + } + + @Test + public void deidentifyFilePollsToSuccessAndWritesOutputsForLocalFile() throws Exception { + File input = folder.newFile("invoice.txt"); + Files.write(input.toPath(), "Pay John Doe".getBytes("UTF-8")); + File outDir = folder.newFolder("out"); + String redacted = Base64.getEncoder().encodeToString("Pay [NAME_1]".getBytes("UTF-8")); + + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-7\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"QUEUED\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"" + redacted + "\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"txt\"}," + + "{\"processedFile\":\"W10=\",\"processedFileType\":\"ENTITIES\",\"processedFileExtension\":\"json\"}]," + + "\"metrics\":{\"wordCount\":3}}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .file(input).configurationId("cfg-1") + .pollOptions(PollOptions.builder().waitTime(1).build()) // one real 1 s sleep at most + .outputDirectory(outDir.getPath()) + .build()); + + Assert.assertEquals("run-7", response.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + Assert.assertEquals("Pay [NAME_1]", new String(Files.readAllBytes(new File(outDir, "processed-invoice.txt").toPath()), "UTF-8")); + Assert.assertEquals("[]", new String(Files.readAllBytes(new File(outDir, "processed-entities-invoice.json").toPath()), "UTF-8")); + + RecordedRequest submit = server.takeRequest(); + assertCommonHeaders(submit, "POST", "/v2/detect/deidentify/file"); + String body = submit.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"" + Base64.getEncoder().encodeToString("Pay John Doe".getBytes("UTF-8")) + "\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); + } + } + + @Test + public void deidentifyFileReturnsRunIdWithStatusWhenBudgetRunsOut() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-8\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v") + .pollOptions(PollOptions.builder().maxAttempts(1).build()).build()); + + Assert.assertEquals("run-8", response.getRunId()); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); + } + } + + @Test + public void deidentifyFileSurfacesFailedRunMessage() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-9\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); + + Assert.assertEquals(DetectRunStatus.FAILED, response.getStatus()); + Assert.assertEquals("unsupported file", response.getMessage()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); + } + } + + @Test + public void deidentifyFileSubmitErrorMapsToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); + try { + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-1") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\",\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").configurationId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("configuration not found", e.getMessage()); + Assert.assertEquals("req-1", e.getRequestId()); + } + } finally { + server.shutdown(); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/Skyflow.java b/skyvault/src/main/java/com/skyflow/Skyflow.java index 940f5008..53692860 100644 --- a/skyvault/src/main/java/com/skyflow/Skyflow.java +++ b/skyvault/src/main/java/com/skyflow/Skyflow.java @@ -5,10 +5,13 @@ import com.skyflow.config.VaultConfig; import com.skyflow.enums.LogLevel; import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.Constants; +import com.skyflow.utils.SdkVersion; import com.skyflow.utils.Utils; import com.skyflow.utils.logger.LogUtil; import com.skyflow.utils.validations.Validations; @@ -32,6 +35,8 @@ protected Skyflow self() { } public static SkyflowClientBuilder builder() { + // Keep common's BaseErrorMessage prefix in step with this SDK's own ErrorMessage prefix. + SdkVersion.setSdkPrefix(Constants.SDK_PREFIX); return new SkyflowClientBuilder(); } @@ -99,27 +104,27 @@ public Skyflow updateLogLevel(LogLevel logLevel) { } public VaultController vault() throws SkyflowException { - return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public VaultController vault(String vaultId) throws SkyflowException { - return resolveOrThrow(this.builder.vaultClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.vaultClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public ConnectionController connection() throws SkyflowException { - return resolveOrThrow(this.builder.connectionsMap, null, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, ErrorMessage.ConnectionIdNotInConfigList); + return resolveOrThrow(this.builder.connectionsMap, null, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.ConnectionIdNotInConfigList); } public ConnectionController connection(String connectionId) throws SkyflowException { - return resolveOrThrow(this.builder.connectionsMap, connectionId, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, ErrorMessage.ConnectionIdNotInConfigList); + return resolveOrThrow(this.builder.connectionsMap, connectionId, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.ConnectionIdNotInConfigList); } public DetectController detect() throws SkyflowException { - return resolveOrThrow(this.builder.detectClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.detectClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public DetectController detect(String vaultId) throws SkyflowException { - return resolveOrThrow(this.builder.detectClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + return resolveOrThrow(this.builder.detectClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, BaseErrorMessage.VaultIdNotInConfigList); } public static final class SkyflowClientBuilder extends BaseSkyflowClientBuilder { From 1fa3589db8f4a26359dc9cf23b2add9218b12289 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 8 Oct 2026 18:42:49 +0530 Subject: [PATCH 02/41] SK-3175 detect v2 add tests --- .../internal/DeidentifyFileFlowTests.java | 36 +++- .../internal/FileOutputWriterTests.java | 155 ++++++++++++++++++ 2 files changed, 187 insertions(+), 4 deletions(-) diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java index 9afa58bc..a55d5078 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java @@ -17,6 +17,7 @@ import java.io.File; import java.nio.file.Files; +import java.util.Arrays; import java.util.Base64; import java.util.Collections; import java.util.concurrent.atomic.AtomicInteger; @@ -29,9 +30,16 @@ public class DeidentifyFileFlowTests { private static final RunPoller.Sleeper NO_SLEEP = millis -> { }; private static GetRunResponse success() { - return new GetRunResponse("run-1", DetectRunStatus.SUCCESS, DataSourceType.BASE64, - Collections.singletonList(new FileOutput(Base64.getEncoder().encodeToString("redacted".getBytes()), - "REDACTED_FILE", FileDataFormat.TXT)), + return success(DataSourceType.BASE64); + } + + private static GetRunResponse success(DataSourceType outputType) { + return new GetRunResponse("run-1", DetectRunStatus.SUCCESS, outputType, + Arrays.asList( + new FileOutput(Base64.getEncoder().encodeToString("redacted".getBytes()), + "REDACTED_FILE", FileDataFormat.TXT), + new FileOutput(Base64.getEncoder().encodeToString("[]".getBytes()), + "ENTITIES", FileDataFormat.JSON)), new Metrics(null, 1, 8, null, null, null), null); } @@ -66,7 +74,7 @@ public void polledRawRequestMergesRunButWritesNothing() throws Exception { .pollOptions(PollOptions.builder().build()).outputDirectory(folder.getRoot().getPath()).build(), "run-1", id -> success(), NO_SLEEP); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(1, response.getOutput().size()); + Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals(Integer.valueOf(8), response.getMetrics().getCharacterCount()); Assert.assertEquals(0, folder.getRoot().list().length); } @@ -86,6 +94,26 @@ public void polledFileRequestWritesOutputsOnSuccess() throws Exception { File written = new File(outDir, "processed-notes.txt"); Assert.assertTrue(written.isFile()); Assert.assertEquals("redacted", new String(Files.readAllBytes(written.toPath()))); + File entities = new File(outDir, "processed-entities-notes.json"); + Assert.assertTrue(entities.isFile()); + Assert.assertEquals("[]", new String(Files.readAllBytes(entities.toPath()))); + Assert.assertEquals(2, outDir.list().length); + } + + @Test + public void polledFileRequestWritesNothingForPresignedUrlOutputs() throws Exception { + File input = folder.newFile("notes.txt"); + File outDir = folder.newFolder("out"); + + DeidentifyFileResponse response = DeidentifyFileFlow.complete( + DeidentifyFileRequest.builder().file(input).pollOptions(PollOptions.builder().build()) + .outputDirectory(outDir.getPath()).build(), + "run-1", id -> success(DataSourceType.PRESIGNED_URL), NO_SLEEP); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + Assert.assertEquals(0, outDir.list().length); } @Test diff --git a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java index 4672d7a0..70297c59 100644 --- a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java @@ -108,6 +108,161 @@ public void invalidBase64IsReportedAsWriteFailure() { } } + // ---- naming branches ------------------------------------------------------------------- + + @Test + public void nullOrEmptyTypeFallsBackToPlainName() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), null, FileDataFormat.PDF), + new FileOutput(b64("b"), "", FileDataFormat.TXT)), + DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); + Assert.assertEquals("processed-invoice.txt", written.get(1).getName()); + } + + @Test + public void nonEntityOutputWithoutExtensionGetsBin() throws Exception { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TRANSCRIPTION", null)), + DataSourceType.BASE64, "call.mp3", folder.getRoot().getPath()); + Assert.assertEquals("processed-call.bin", written.get(0).getName()); + } + + @Test + public void entityOutputHonoursAnExplicitExtension() throws Exception { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals("processed-entities-notes.txt", written.get(0).getName()); + } + + @Test + public void entityTypeMatchIsCaseInsensitive() throws Exception { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "entities", null)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals("processed-entities-notes.json", written.get(0).getName()); + } + + @Test + public void duplicateEntityOutputsGetTheTypeInsertedOnCollision() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), + new FileOutput(b64("b"), "ENTITIES", FileDataFormat.JSON)), + DataSourceType.BASE64, "scan.png", folder.getRoot().getPath()); + Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); + Assert.assertEquals("processed-entities-scan.entities.json", written.get(1).getName()); + } + + @Test + public void collisionWithoutATypeUsesARunningNumber() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), null, FileDataFormat.TXT), + new FileOutput(b64("b"), null, FileDataFormat.TXT), + new FileOutput(b64("c"), null, FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals("processed-notes.txt", written.get(0).getName()); + Assert.assertEquals("processed-notes.1.txt", written.get(1).getName()); + Assert.assertEquals("processed-notes.2.txt", written.get(2).getName()); + } + + @Test + public void inputNamesWithoutAnExtensionOrWithLeadingDotAreKept() throws Exception { + List plain = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", null)), + DataSourceType.BASE64, "README", folder.getRoot().getPath()); + Assert.assertEquals("processed-entities-README.json", plain.get(0).getName()); + + List dotted = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, ".notes", folder.getRoot().getPath()); + Assert.assertEquals("processed-.notes.txt", dotted.get(0).getName()); + } + + @Test + public void missingInputNameFallsBackToOutput() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.PDF), + new FileOutput(b64("b"), "ENTITIES", null)), + DataSourceType.BASE64, null, folder.getRoot().getPath()); + Assert.assertEquals("processed-output.pdf", written.get(0).getName()); + Assert.assertEquals("processed-entities-output.json", written.get(1).getName()); + } + + // ---- directory and output-type branches --------------------------------------------------- + + @Test + public void nullOutputTypeWritesNothing() throws Exception { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_FILE", FileDataFormat.PDF)), + null, "invoice.pdf", folder.getRoot().getPath()); + Assert.assertTrue(written.isEmpty()); + Assert.assertEquals(0, folder.getRoot().list().length); + } + + @Test + public void nullElementsInTheOutputListAreSkipped() throws Exception { + List written = FileOutputWriter.write(Arrays.asList( + null, + new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals(1, written.size()); + Assert.assertEquals("processed-notes.txt", written.get(0).getName()); + } + + @Test + public void blankOutputDirectoryWritesToTheWorkingDirectory() throws Exception { + File expected = new File("processed-writer-cwd-test.txt"); + try { + List written = FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "writer-cwd-test.txt", " "); + Assert.assertEquals(expected, written.get(0)); + Assert.assertNull(written.get(0).getParentFile()); + Assert.assertTrue(expected.isFile()); + } finally { + Files.deleteIfExists(expected.toPath()); + } + } + + @Test + public void outputDirectoryThatIsAFileIsReportedAsWriteFailure() throws Exception { + File notADirectory = folder.newFile("blocker"); + try { + FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", notADirectory.getPath()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertTrue(e.getMessage(), e.getMessage().contains(notADirectory.getPath())); + } + } + + @Test + public void existingFilesAreOverwritten() throws Exception { + File target = new File(folder.getRoot(), "processed-notes.txt"); + Files.write(target.toPath(), "old".getBytes()); + FileOutputWriter.write( + Collections.singletonList(new FileOutput(b64("new"), "REDACTED_TEXT", FileDataFormat.TXT)), + DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + Assert.assertEquals("new", new String(Files.readAllBytes(target.toPath()))); + } + + @Test + public void aLaterFailureLeavesEarlierFilesOnDisk() throws Exception { + try { + FileOutputWriter.write(Arrays.asList( + new FileOutput(b64("ok"), "REDACTED_FILE", FileDataFormat.PDF), + new FileOutput("not base64!", "ENTITIES", null)), + DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-entities-invoice.json")); + } + Assert.assertTrue(new File(folder.getRoot(), "processed-invoice.pdf").isFile()); + Assert.assertFalse(new File(folder.getRoot(), "processed-entities-invoice.json").exists()); + } + @Test public void nameHelpers() { Assert.assertEquals("notes", FileOutputWriter.stripExtension("notes.txt")); From 1377c1f3fd57900501454663b92f16958aaaf6f8 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 8 Oct 2026 19:22:38 +0530 Subject: [PATCH 03/41] SK-3175 fix ci check --- flowvault/README.md | 4 ++-- flowvault/pom.xml | 29 +++++++++++------------------ skyvault/pom.xml | 31 ++++++++++++------------------- 3 files changed, 25 insertions(+), 39 deletions(-) diff --git a/flowvault/README.md b/flowvault/README.md index a668231c..f51dd137 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1742,7 +1742,7 @@ Outputs are written only when polling reached `SUCCESS`, the request was built f ## Reidentify string -`ReidentifyStringRequest` takes the tokenised text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. +`ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. ```java ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( @@ -1766,7 +1766,7 @@ A `RedactionLevel` is expected to name one source (`tokenGroupName` or `entityNa `reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. ```java -byte[] content = Files.readAllBytes(Paths.get("tokenised.txt")); +byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 76a711d9..2221a64a 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -82,25 +82,18 @@ - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - + shade-for-japicmp package diff --git a/skyvault/pom.xml b/skyvault/pom.xml index ce14cc82..23cb42d5 100644 --- a/skyvault/pom.xml +++ b/skyvault/pom.xml @@ -57,26 +57,19 @@ - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.6.0 - + shade-for-japicmp package From 495a6dcc7233782e30344cf9177c9063b92de79e Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 8 Oct 2026 19:29:34 +0530 Subject: [PATCH 04/41] SK-3175 fix ci check --- .../controller/DetectControllerTests.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index 07f6e2f1..f21fe9f3 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -112,17 +112,28 @@ public void reidentifyStringValidatesBeforeResolvingCredentials() throws Skyflow } } + /** + * Null credentials would make the SDK fall back to SKYFLOW_CREDENTIALS from the environment or a + * .env file, which CI provides, so the outcome would depend on the machine. An explicitly empty + * {@link Credentials} is rejected by validation the same way everywhere, before any network call. + */ @Test public void missingCredentialsSurfaceAsSkyflowExceptionWithoutNetworkCall() throws SkyflowException { - DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(BaseErrorMessage.EmptyCredentials.getMessage(), e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } + /** Credentials with no path, string, token or API key set. */ + private static Credentials emptyCredentials() { + return new Credentials(); + } + // ─── reidentifyFile (flowvault only) ────────────────────────────────────── /** API-key credentials resolve without a token exchange, so the only network call is the Detect request. */ @@ -166,13 +177,14 @@ public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowEx @Test public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws SkyflowException { - DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { controller.reidentifyFile(ReidentifyFileRequest.builder() .dataSource(DataSourceType.BASE64).value("Zm9v").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(BaseErrorMessage.EmptyCredentials.getMessage(), e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } From 932676d8d0014911044b964e14766805345275d6 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 8 Oct 2026 14:02:01 +0000 Subject: [PATCH 05/41] [AUTOMATED] Private Release 1.2.0-dev-5aa7241b --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 2221a64a..ea28c99b 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0 + 1.2.0-dev.5aa7241b jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 6a3034135e6eb525e59ab41c24c0561a49bc954b Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Wed, 14 Oct 2026 13:06:03 +0530 Subject: [PATCH 06/41] SK-3175 try internal release --- flowvault/src/main/java/com/skyflow/VaultClient.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/flowvault/src/main/java/com/skyflow/VaultClient.java b/flowvault/src/main/java/com/skyflow/VaultClient.java index 93a677e0..8a7264c9 100644 --- a/flowvault/src/main/java/com/skyflow/VaultClient.java +++ b/flowvault/src/main/java/com/skyflow/VaultClient.java @@ -1,5 +1,7 @@ package com.skyflow; +import java.util.concurrent.TimeUnit; + import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.errors.SkyflowException; @@ -9,8 +11,6 @@ import com.skyflow.utils.SkyflowRetryInterceptor; import com.skyflow.utils.Utils; -import java.util.concurrent.TimeUnit; - import okhttp3.ConnectionPool; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -63,6 +63,7 @@ private static int resolveInt(Integer vaultLevel, Integer clientLevel, int defau if (vaultLevel != null) { return vaultLevel; } + return clientLevel != null ? clientLevel : defaultValue; } From 16de996bb54a84f0994ac07b99d7e66cca0f059f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Wed, 14 Oct 2026 07:36:42 +0000 Subject: [PATCH 07/41] [AUTOMATED] Private Release 1.2.0-dev-6a303413 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index ea28c99b..bbed6589 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.5aa7241b + 1.2.0-dev.6a303413 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 95175076b45831b1507b64c6bee8003ba1094767 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 18:27:00 +0530 Subject: [PATCH 08/41] SK-3175 try internal release --- flowvault/src/main/java/com/skyflow/config/VaultConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/flowvault/src/main/java/com/skyflow/config/VaultConfig.java b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java index 3369abc7..0de26f42 100644 --- a/flowvault/src/main/java/com/skyflow/config/VaultConfig.java +++ b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java @@ -37,6 +37,7 @@ public VaultConfig() { } public String getVaultUrl() { + return vaultUrl; } From 6f25cc16c188cf391da5077045dbf4ee1044817d Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 12:57:33 +0000 Subject: [PATCH 09/41] [AUTOMATED] Private Release 1.2.0-dev-95175076 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index bbed6589..db41b827 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.6a303413 + 1.2.0-dev.95175076 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From b71f6e0b7a32b967eafb43f45903d5efcf30072f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 19:08:12 +0530 Subject: [PATCH 10/41] SK-3175 try internal release --- .github/workflows/internal-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/internal-release.yml b/.github/workflows/internal-release.yml index 808cc7e4..5b13107b 100644 --- a/.github/workflows/internal-release.yml +++ b/.github/workflows/internal-release.yml @@ -46,7 +46,7 @@ jobs: uses: ./.github/workflows/shared-build-and-deploy.yml with: ref: ${{ github.ref_name }} - server-id: central + server-id: skyflow-jfrog profile: jfrog tag: 'internal' module: ${{ needs.resolve-module.outputs.module }} From 47375d96c0d9b658a6d521cbc25ba28e8879cacf Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 13:38:42 +0000 Subject: [PATCH 11/41] [AUTOMATED] Private Release 1.2.0-dev-b71f6e0b --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index db41b827..b0d4eec4 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.95175076 + 1.2.0-dev.b71f6e0b jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From ee51b1dcc33bab232bd77946bc31ff94cbf006a8 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 19:11:54 +0530 Subject: [PATCH 12/41] SK-3175 try internal release --- flowvault/pom.xml | 2 +- skyvault/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index b0d4eec4..f0272438 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -179,7 +179,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/skyvault/pom.xml b/skyvault/pom.xml index 23cb42d5..47c04de5 100644 --- a/skyvault/pom.xml +++ b/skyvault/pom.xml @@ -163,7 +163,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java From af38a326ef44b2060967c420284634b202937493 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 15 Oct 2026 13:42:22 +0000 Subject: [PATCH 13/41] [AUTOMATED] Private Release 1.2.0-dev-ee51b1dc --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index f0272438..e71d8077 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.b71f6e0b + 1.2.0-dev.ee51b1dc jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 04fe9777f38285b69c04270641aa9dfd96e94ded Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:12:22 +0530 Subject: [PATCH 14/41] SK-3175 add v2 detect for skyvault also --- .../skyflow/detect/ReidentifyFileRequest.java | 0 .../detect/ReidentifyFileResponse.java | 0 .../detect/internal/ReidentifyFileMapper.java | 0 .../internal/ReidentifyFileValidations.java | 10 +- .../com/skyflow/errors/BaseErrorMessage.java | 3 + .../controller/BaseDetectController.java | 73 + .../internal/ReidentifyFileMapperTests.java | 0 .../ReidentifyFileValidationsTests.java | 16 +- docs/api_reference.md | 379 ++--- flowvault/README.md | 65 +- .../skyflow-flowvault-java.baseline.jar | Bin 938467 -> 937609 bytes flowvault/pom.xml | 2 +- .../java/com/skyflow/errors/ErrorMessage.java | 3 - .../vault/controller/DetectController.java | 118 +- .../controller/DetectControllerTests.java | 9 +- skyvault/README.md | 893 +++------- skyvault/api-report/skyflow-java.baseline.jar | Bin 986461 -> 1373082 bytes skyvault/pom.xml | 8 +- skyvault/samples/pom.xml | 2 +- .../example/detect/CheckGuardrailsSample.java | 51 + .../example/detect/DeidentifyFileExample.java | 114 -- .../detect/DeidentifyFileExampleAsync.java | 121 -- .../example/detect/DeidentifyFileSample.java | 74 + .../detect/DeidentifyStringSample.java | 93 ++ .../example/detect/DeidentifyTextExample.java | 142 -- .../example/detect/GetDetectRunExample.java | 55 - .../java/com/example/detect/GetRunSample.java | 55 + .../example/detect/ReidentifyFileSample.java | 71 + .../detect/ReidentifyStringSample.java | 58 + .../example/detect/ReidentifyTextExample.java | 95 -- .../src/main/java/com/skyflow/Skyflow.java | 7 + .../main/java/com/skyflow/VaultClient.java | 607 ------- .../skyflow/enums/DeidentifyFileStatus.java | 18 - .../com/skyflow/enums/DetectEntities.java | 90 - .../enums/DetectOutputTranscriptions.java | 23 - .../java/com/skyflow/enums/MaskingMethod.java | 21 - .../java/com/skyflow/enums/TokenType.java | 27 - .../java/com/skyflow/errors/ErrorMessage.java | 26 - .../java/com/skyflow/utils/Constants.java | 2 - .../utils/validations/Validations.java | 158 -- .../vault/controller/DetectController.java | 460 +----- .../com/skyflow/vault/detect/AudioBleep.java | 64 - .../vault/detect/DateTransformation.java | 30 - .../vault/detect/DeidentifyFileRequest.java | 192 --- .../vault/detect/DeidentifyFileResponse.java | 105 -- .../vault/detect/DeidentifyTextRequest.java | 88 - .../vault/detect/DeidentifyTextResponse.java | 44 - .../com/skyflow/vault/detect/EntityInfo.java | 46 - .../skyflow/vault/detect/FileEntityInfo.java | 20 - .../com/skyflow/vault/detect/FileInfo.java | 33 - .../com/skyflow/vault/detect/FileInput.java | 46 - .../vault/detect/GetDetectRunRequest.java | 33 - .../vault/detect/ReidentifyTextRequest.java | 68 - .../vault/detect/ReidentifyTextResponse.java | 23 - .../com/skyflow/vault/detect/TextIndex.java | 29 - .../com/skyflow/vault/detect/TokenFormat.java | 71 - .../skyflow/vault/detect/Transformations.java | 14 - .../java/com/skyflow/VaultClientTests.java | 747 --------- .../enums/DeidentifyFileStatusTest.java | 27 - .../com/skyflow/enums/DetectEntitiesTest.java | 24 - .../enums/DetectOutputTranscriptionsTest.java | 31 - .../com/skyflow/enums/MaskingMethodTest.java | 19 - .../java/com/skyflow/enums/TokenTypeTest.java | 30 - .../controller/DetectControllerFileTests.java | 466 ------ .../controller/DetectControllerTests.java | 1472 ++++++----------- .../detect/DeidentifyFileRequestTest.java | 150 -- .../detect/DeidentifyFileResponseTest.java | 69 - .../vault/detect/DeidentifyTextTests.java | 299 ---- .../vault/detect/FileEntityInfoTest.java | 22 - .../skyflow/vault/detect/FileInfoTest.java | 41 - .../vault/detect/ReidentifyTextTests.java | 169 -- 71 files changed, 1488 insertions(+), 6933 deletions(-) rename {flowvault => common}/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java (100%) rename {flowvault => common}/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java (82%) rename {flowvault => common}/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java (100%) rename {flowvault => common}/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java (86%) create mode 100644 skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/GetRunSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java delete mode 100644 skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DetectEntities.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/TokenType.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java delete mode 100644 skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java rename to common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java rename to common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java similarity index 100% rename from flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java rename to common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java diff --git a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java similarity index 82% rename from flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java rename to common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java index 0eafdcc8..46106c96 100644 --- a/flowvault/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java +++ b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileValidations.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.ReidentifyFileRequest; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; @@ -20,13 +20,13 @@ private ReidentifyFileValidations() { public static void validateReidentifyFileRequest(ReidentifyFileRequest request) throws SkyflowException { if (request == null) { - throw invalid(ErrorLogs.REIDENTIFY_FILE_REQUEST_NULL, ErrorMessage.ReidentifyFileRequestNull); + throw invalid(ErrorLogs.REIDENTIFY_FILE_REQUEST_NULL, BaseErrorMessage.ReidentifyFileRequestNull); } if (request.getDataSource() == null) { - throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidDataSourceInReidentifyFile); + throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE, BaseErrorMessage.InvalidDataSourceInReidentifyFile); } if (isBlank(request.getValue())) { - throw invalid(ErrorLogs.INVALID_VALUE_IN_REIDENTIFY_FILE, ErrorMessage.InvalidValueInReidentifyFile); + throw invalid(ErrorLogs.INVALID_VALUE_IN_REIDENTIFY_FILE, BaseErrorMessage.InvalidValueInReidentifyFile); } // redactionLevel entries are optional on the API and are passed through as given. } @@ -36,7 +36,7 @@ private static boolean isBlank(String value) { return value == null || value.trim().isEmpty(); } - private static SkyflowException invalid(ErrorLogs log, ErrorMessage message) { + private static SkyflowException invalid(ErrorLogs log, BaseErrorMessage message) { LogUtil.printErrorLog(BaseUtils.parameterizedString(log.getLog(), INTERFACE_NAME)); return new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), message.getMessage()); } diff --git a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java index d3c9c388..ff51fb89 100644 --- a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java +++ b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java @@ -192,6 +192,9 @@ public enum BaseErrorMessage { OutputDirectoryWithoutPollOptions("%s0 Validation error. outputDirectory in deidentify file request requires pollOptions."), FailedToWriteOutputFile("%s0 Failed to write the processed output to %s1."), GetRunRequestNull("%s0 Validation error. GetRun request cannot be null."), + ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), + InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), + InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), InvalidRunIdInGetRun("%s0 Validation error. Invalid runId in get run request. Specify a non-empty run id."), CheckGuardrailsRequestNull("%s0 Validation error. CheckGuardrails request cannot be null."), InvalidTextInCheckGuardrails("%s0 Validation error. Invalid text in check guardrails request. Specify a non-empty text."), diff --git a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java index 71f6217d..865bd1ff 100644 --- a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java +++ b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java @@ -5,15 +5,22 @@ import com.skyflow.config.BaseVaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.GetRunRequest; import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.detect.internal.DeidentifyFileFlow; import com.skyflow.detect.internal.DetectRequestMapper; import com.skyflow.detect.internal.DetectResponseMapper; import com.skyflow.detect.internal.DetectValidations; +import com.skyflow.detect.internal.ReidentifyFileMapper; +import com.skyflow.detect.internal.ReidentifyFileValidations; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.detect.rest.core.ApiClientApiException; import com.skyflow.generated.detect.rest.core.ApiClientException; @@ -22,15 +29,19 @@ import com.skyflow.generated.detect.rest.core.ObjectMappers; import com.skyflow.generated.detect.rest.core.RequestOptions; import com.skyflow.generated.detect.rest.resources.filesv2.FilesV2Client; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; import com.skyflow.generated.detect.rest.resources.guardrailsv2.GuardrailsV2Client; import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; import com.skyflow.generated.detect.rest.resources.stringsv2.StringsV2Client; import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; @@ -222,6 +233,68 @@ public ReidentifyStringResponse reidentifyString(ReidentifyStringRequest request } } + /** + * Detects and de-identifies sensitive data in a file. The API is asynchronous: by default this + * submits the run and returns its id for use with {@link #getRun}. With + * {@link DeidentifyFileRequest#getPollOptions() pollOptions} the SDK polls the run with exponential + * backoff and returns the completed run, or the run id with a non-terminal status if the budget + * runs out. On success, a request built from a local file has its outputs written to disk. + * + * @param request the file (base64, skyflow id, presigned URL, or a local file) plus a stored or inline configuration + * @return run id, and the run's status, outputs and metrics when polled + * @throws SkyflowException on validation failure, credential failure, an API error or an output write failure + */ + public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); + DetectValidations.validateDeidentifyFileRequest(request); + String token = resolveToken(); + DeidentifyFileRequestV2 apiRequest = DetectRequestMapper.toDeidentifyFileRequest(request, this.vaultConfig.getVaultId()); + String runId; + try { + DeidentifyFileResponseV2 apiResponse = filesClient().deidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + runId = apiResponse.getRunId().orElse(null); + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + DeidentifyFileResponse response = DeidentifyFileFlow.complete(request, runId, + id -> getRun(GetRunRequest.builder().runId(id).build())); + LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } + + /** + * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: + * the re-identified file is returned in the response rather than through a run id. + * + * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules + * @return status, output files and metrics + * @throws SkyflowException on validation failure, credential failure or an API error + */ + public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_FILE_REQUEST.getLog()); + ReidentifyFileValidations.validateReidentifyFileRequest(request); + String token = resolveToken(); + ReidentifyFileRequestV2 apiRequest = ReidentifyFileMapper.toApiRequest(request, this.vaultConfig.getVaultId()); + try { + ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); + ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); + LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); + return response; + } catch (ApiClientApiException e) { + throw toSkyflowException(e, ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e); + } + } + /** * Retrieves the status and, once complete, the outputs of a Detect file run. * diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java similarity index 100% rename from flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java rename to common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java diff --git a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java similarity index 86% rename from flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java rename to common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index 5d1cc3fb..d910fa77 100644 --- a/flowvault/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -6,7 +6,7 @@ import com.skyflow.detect.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; import org.junit.Assert; import org.junit.Test; @@ -20,7 +20,7 @@ private static ReidentifyFileRequest.ReidentifyFileRequestBuilder valid() { return ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); } - private static void assertRejected(ReidentifyFileRequest request, ErrorMessage expected) { + private static void assertRejected(ReidentifyFileRequest request, BaseErrorMessage expected) { try { ReidentifyFileValidations.validateReidentifyFileRequest(request); Assert.fail("expected SkyflowException: " + expected); @@ -32,25 +32,25 @@ private static void assertRejected(ReidentifyFileRequest request, ErrorMessage e @Test public void rejectsNullRequest() { - assertRejected(null, ErrorMessage.ReidentifyFileRequestNull); + assertRejected(null, BaseErrorMessage.ReidentifyFileRequestNull); } @Test public void rejectsMissingDataSource() { - assertRejected(ReidentifyFileRequest.builder().value("Zm9v").build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().value("Zm9v").build(), BaseErrorMessage.InvalidDataSourceInReidentifyFile); } @Test public void rejectsNullOrBlankValue() { - assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), ErrorMessage.InvalidValueInReidentifyFile); - assertRejected(valid().value("").build(), ErrorMessage.InvalidValueInReidentifyFile); - assertRejected(valid().value(" \t").build(), ErrorMessage.InvalidValueInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value("").build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(valid().value(" \t").build(), BaseErrorMessage.InvalidValueInReidentifyFile); } @Test public void checksFieldsInOrderDataSourceBeforeValue() { // Both missing: dataSource is reported first. - assertRejected(ReidentifyFileRequest.builder().build(), ErrorMessage.InvalidDataSourceInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().build(), BaseErrorMessage.InvalidDataSourceInReidentifyFile); } @Test diff --git a/docs/api_reference.md b/docs/api_reference.md index 8f5716a5..5908751c 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -204,60 +204,69 @@ Parameters listed with their defaults as defined in the builders. |----------------|---------|-------------| | `values(List)` | _(required)_ | List of [`ColumnValue`](#columnvalue) objects to tokenize. | -### `DeidentifyTextRequest` +### `DeidentifyStringRequest` -`com.skyflow.vault.detect` — passed to `detect().deidentifyText()`. +`com.skyflow.detect` — passed to `detect().deidentifyString()`. | Builder method | Default | Description | |----------------|---------|-------------| | `text(String)` | _(required)_ | Text to de-identify. | -| `entities(List)` | `null` | Entity types to detect. See [`DetectEntities`](#detectentities). | -| `allowRegexList(List)` | `null` | Regex patterns to always treat as detectable. | -| `restrictRegexList(List)` | `null` | Regex patterns to exclude from detection. | -| `tokenFormat(TokenFormat)` | `null` | Token format controlling token types per entity. See [`TokenFormat`](#tokenformat). | -| `transformations(Transformations)` | `null` | Data transformations (e.g. date shifting). See [`Transformations`](#transformations). | +| `configurationId(String)` | `null` | Id of a Detect configuration created in Studio or through the management API. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). Supply this or `configurationId`. | -### `ReidentifyTextRequest` +### `DeidentifyFileRequest` -`com.skyflow.vault.detect` — passed to `detect().reidentifyText()`. +`com.skyflow.detect` — passed to `detect().deidentifyFile()`. Supply the file through exactly one of `value` (with a `dataSource`), `file` or `filePath`. | Builder method | Default | Description | |----------------|---------|-------------| -| `text(String)` | _(required)_ | The redacted/de-identified text to re-identify. | -| `redactedEntities(List)` | `null` | Entity types to keep redacted. | -| `maskedEntities(List)` | `null` | Entity types to mask. | -| `plainTextEntities(List)` | `null` | Entity types to reveal as plain text. | +| `dataSource(DataSourceType)` | `null` | How `value` supplies the file. See [`DataSourceType`](#datasourcetype). | +| `value(String)` | `null` | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | +| `file(File)` | `null` | Local file; read and base64-encoded when sent, `dataSource` set to `BASE64`. | +| `filePath(String)` | `null` | Same as `file(File)`, from a path. | +| `dataFormat(FileDataFormat)` | inferred from the extension | File format. See [`FileDataFormat`](#filedataformat). | +| `configurationId(String)` | `null` | Id of a stored Detect configuration. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). | +| `pollOptions(PollOptions)` | `null` | Poll the run after submitting. `null` submits only and returns the run id. See [`PollOptions`](#polloptions). | +| `outputDirectory(String)` | working directory | Where outputs are written on success. Requires `pollOptions` and a local file. | -### `DeidentifyFileRequest` +### `ReidentifyStringRequest` + +`com.skyflow.detect` — passed to `detect().reidentifyString()`. + +| Builder method | Default | Description | +|----------------|---------|-------------| +| `text(String)` | _(required)_ | The de-identified text to re-identify. | +| `redactionLevel(List)` | `null` | Per-entity redaction rules. See [`RedactionLevel`](#redactionlevel). Without rules every token is replaced by its original value. | + +### `ReidentifyFileRequest` -`com.skyflow.vault.detect` — passed to `detect().deidentifyFile()`. +`com.skyflow.detect` — passed to `detect().reidentifyFile()`. Synchronous: the re-identified file comes back in the response. | Builder method | Default | Description | |----------------|---------|-------------| -| `file(FileInput)` | _(required)_ | File source. See [`FileInput`](#fileinput). | -| `entities(List)` | `null` | Entity types to detect. | -| `allowRegexList(List)` | `null` | Regex patterns to always treat as detectable. | -| `restrictRegexList(List)` | `null` | Regex patterns to exclude. | -| `tokenFormat(TokenFormat)` | `null` | Token format per entity. | -| `transformations(Transformations)` | `null` | Transformations (not supported for Documents/Images/PDFs). | -| `outputProcessedImage(Boolean)` | `false` | Include the processed image in the response. | -| `outputOcrText(Boolean)` | `false` | Include OCR text in the response. | -| `maskingMethod(MaskingMethod)` | `null` | See [`MaskingMethod`](#maskingmethod). | -| `pixelDensity(Number)` | `null` | Pixel density for PDF processing. | -| `maxResolution(Number)` | `null` | Max resolution for PDF processing. | -| `outputProcessedAudio(Boolean)` | `false` | Include processed audio in the response. | -| `outputTranscription(DetectOutputTranscriptions)` | `null` | See [`DetectOutputTranscriptions`](#detectoutputtranscriptions). | -| `bleep(AudioBleep)` | `null` | Audio bleep configuration. See [`AudioBleep`](#audiobleep). | -| `outputDirectory(String)` | `null` | Directory to write the processed file. | -| `waitTime(Integer)` | `null` | Max seconds to wait for async file processing (≤ 64). | - -### `GetDetectRunRequest` - -`com.skyflow.vault.detect` — passed to `detect().getDetectRun()`. +| `dataSource(DataSourceType)` | _(required)_ | `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. | +| `value(String)` | _(required)_ | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | +| `dataFormat(FileDataFormat)` | `null` | File format. | +| `redactionLevel(List)` | `null` | Per-entity redaction rules. See [`RedactionLevel`](#redactionlevel). | + +### `GetRunRequest` + +`com.skyflow.detect` — passed to `detect().getRun()`. | Builder method | Default | Description | |----------------|---------|-------------| -| `runId(String)` | _(required)_ | The `run_id` returned by a prior `deidentifyFile` call. | +| `runId(String)` | _(required)_ | The run id returned by a prior `deidentifyFile` call. | + +### `CheckGuardrailsRequest` + +`com.skyflow.detect` — passed to `detect().checkGuardrails()`. + +| Builder method | Default | Description | +|----------------|---------|-------------| +| `text(String)` | _(required)_ | Text to screen. | +| `checkToxicity(Boolean)` | `true` on the server | Whether to check for toxicity. | +| `denyTopics(List)` | `null` | Topics to deny. | ### `InvokeConnectionRequest` @@ -363,44 +372,63 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. |--------|-------------|-------------| | `getTokens()` | `List` | One token per input `ColumnValue`, in order. | -### `DeidentifyTextResponse` +### `DeidentifyStringResponse` -`com.skyflow.vault.detect` — returned by `detect().deidentifyText()`. +`com.skyflow.detect` — returned by `detect().deidentifyString()`. | Getter | Return type | Description | |--------|-------------|-------------| | `getProcessedText()` | `String` | The de-identified text with entity values replaced by tokens. | -| `getEntities()` | `List` | Detected entities. See [`EntityInfo`](#entityinfo). | -| `getWordCount()` | `int` | Word count of the input text. | -| `getCharCount()` | `int` | Character count of the input text. | +| `getEntities()` | `List` | Detected entities, never `null`. See [`DetectedEntity`](#detectedentity). | +| `getMetrics()` | `Metrics` | Word and character counts. See [`Metrics`](#metrics). | -### `ReidentifyTextResponse` +### `ReidentifyStringResponse` -`com.skyflow.vault.detect` — returned by `detect().reidentifyText()`. +`com.skyflow.detect` — returned by `detect().reidentifyString()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getProcessedText()` | `String` | The re-identified text with tokens replaced by their original values. | +| `getProcessedText()` | `String` | The re-identified text. | +| `getMetrics()` | `Metrics` | Word and character counts. | ### `DeidentifyFileResponse` -`com.skyflow.vault.detect` — returned by `detect().deidentifyFile()`. +`com.skyflow.detect` — returned by `detect().deidentifyFile()`. Without `pollOptions` only `getRunId()` is set. + +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getRunId()` | `String` | Run id, always present. | +| `getStatus()` | `DetectRunStatus` | Run status when polled, `null` when submit only. See [`DetectRunStatus`](#detectrunstatus). | +| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`, `null` until the run completes. | +| `getOutput()` | `List` | Every output of the run, empty until complete, never `null`. See [`FileOutput`](#fileoutput). | +| `getMetrics()` | `Metrics` | Size, counts, pages, slides, duration. `null` until complete. | +| `getMessage()` | `String` | Failure detail when the status is `FAILED`. | + +### `ReidentifyFileResponse` + +`com.skyflow.detect` — returned by `detect().reidentifyFile()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getFile()` | `FileInfo` | Metadata about the processed file. See [`FileInfo`](#fileinfo). | -| `getFileBase64()` | `String` | Base64-encoded processed file content (when `outputProcessedImage=true`). | -| `getType()` | `String` | MIME type of the output file. | -| `getExtension()` | `String` | File extension of the output file. | -| `getWordCount()` | `Integer` | Word count (text/document files). | -| `getCharCount()` | `Integer` | Character count (text/document files). | -| `getSizeInKb()` | `Float` | Output file size in kilobytes. | -| `getDurationInSeconds()` | `Float` | Duration in seconds (audio/video files). | -| `getPageCount()` | `Integer` | Page count (PDF files). | -| `getSlideCount()` | `Integer` | Slide count (presentation files). | -| `getEntities()` | `List` | Detected entities. See [`FileEntityInfo`](#fileentityinfo). | -| `getRunId()` | `String` | Run ID for async polling with `getDetectRun()`. | -| `getStatus()` | `String` | Processing status. See [`DeidentifyFileStatus`](#deidentifyfilestatus). | +| `getStatus()` | `DetectRunStatus` | Status of the re-identification. | +| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`. | +| `getOutput()` | `List` | Re-identified file outputs, never `null`. | +| `getMetrics()` | `Metrics` | Size and counts. | + +### `GetRunResponse` + +`com.skyflow.detect` — returned by `detect().getRun()`. Same getters as [`DeidentifyFileResponse`](#deidentifyfileresponse). + +### `CheckGuardrailsResponse` + +`com.skyflow.detect` — returned by `detect().checkGuardrails()`. + +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getText()` | `String` | The screened text. | +| `getValidation()` | `GuardrailsValidation` | `PASSED` or `FAILED`. See [`GuardrailsValidation`](#guardrailsvalidation). | +| `getToxic()` | `Boolean` | Whether the text was judged toxic, `null` when the check did not run. | +| `getDeniedTopic()` | `Boolean` | Whether a denied topic was found, `null` when no topics were supplied. | ### `InvokeConnectionResponse` @@ -444,117 +472,137 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `getValue()` | `String` | The value to tokenize. | | `getColumnGroup()` | `String` | The column group name. | -### `FileInput` +### `DetectConfiguration` -`com.skyflow.vault.detect` — used inside [`DeidentifyFileRequest`](#deidentifyfilerequest). Provide exactly one source. +`com.skyflow.detect` — inline Detect policy for `deidentifyString` and `deidentifyFile`. | Builder method | Default | Description | |----------------|---------|-------------| -| `file(File)` | `null` | A `java.io.File` object. | -| `filePath(String)` | `null` | Path to a file. | +| `name(String)` | `null` | Configuration name. | +| `description(String)` | `null` | Configuration description. | +| `detect(Detect)` | `null` | What to detect and how to de-identify it. See [`Detect`](#detect). | +| `fileMapping(List)` | `null` | Per-column handling for structured files. See [`FileMapping`](#filemapping). | +| `media(Media)` | `null` | Audio, document and image options for file calls. See [`Media`](#media). | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getFile()` | `File` | The file object. | -| `getFilePath()` | `String` | The file path. | +### `Detect` -### `AudioBleep` +| Builder method | Default | Description | +|----------------|---------|-------------| +| `entities(List)` | `null` | Entities to detect, each with its own de-identification type. See [`Entity`](#entity). | +| `objectEntities(List)` | `null` | Visual objects to detect in images. See [`ObjectEntity`](#objectentity). | +| `restrict(List)` | `null` | Regexes to always treat as restricted. | +| `skip(List)` | `null` | Regexes to never treat as sensitive. | +| `customTypes(List)` | `null` | Regex-defined entity types. See [`CustomType`](#customtype). | +| `returnEntities(ReturnEntitiesType)` | `EXCLUDE_SENSITIVE_DATA` | Whether raw values come back in the response. See [`ReturnEntitiesType`](#returnentitiestype). | -`com.skyflow.vault.detect` — used inside [`DeidentifyFileRequest`](#deidentifyfilerequest) for audio bleeping. +### `Entity` | Builder method | Default | Description | |----------------|---------|-------------| -| `gain(Double)` | `null` | Gain level of the bleep tone. | -| `frequency(Double)` | `null` | Frequency (Hz) of the bleep tone. | -| `startPadding(Double)` | `null` | Seconds of silence before the bleep. | -| `stopPadding(Double)` | `null` | Seconds of silence after the bleep. | +| `entityType(EntityType)` | `ALL` | Entity type. See [`EntityType`](#entitytype). | +| `deidentificationType(DeidentificationType)` | `ENTITY_UNIQUE_COUNTER` | How the value is replaced. See [`DeidentificationType`](#deidentificationtype). | +| `destination(String)` | `null` | For `VAULT_TOKEN`: the `table.column` that stores the value. | +| `transformation(Transformation)` | `null` | Date shifting. See [`Transformation`](#transformation). | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getGain()` | `Double` | Gain level. | -| `getFrequency()` | `Double` | Frequency. | -| `getStartPadding()` | `Double` | Start padding in seconds. | -| `getStopPadding()` | `Double` | Stop padding in seconds. | +### `Transformation` and `ShiftDates` -### `TokenFormat` +`Transformation.builder().shiftDates(ShiftDates)`; `ShiftDates.builder().minDays(Integer).maxDays(Integer)`. Dates are shifted by a random amount within the range. -`com.skyflow.vault.detect` — used inside [`DeidentifyTextRequest`](#deidentifytextrequest) and [`DeidentifyFileRequest`](#deidentifyfilerequest) to control token types per entity. +### `CustomType` | Builder method | Default | Description | |----------------|---------|-------------| -| `defaultType(TokenType)` | `TokenType.ENTITY_UNIQUE_COUNTER` | Default token type for entities not explicitly listed. See [`TokenType`](#tokentype). | -| `vaultToken(List)` | `null` | Entities to tokenize as vault tokens. | -| `entityUniqueCounter(List)` | `null` | Entities to tokenize as entity-unique-counter tokens. | -| `entityOnly(List)` | `null` | Entities to tokenize as entity-only tokens. | +| `label(String)` | `null` | Becomes the entity type on the response. | +| `match(List)` | `null` | Regexes that define the type. | -### `Transformations` +### `ObjectEntity` -`com.skyflow.vault.detect` — used inside [`DeidentifyTextRequest`](#deidentifytextrequest) and [`DeidentifyFileRequest`](#deidentifyfilerequest). +| Builder method | Default | Description | +|----------------|---------|-------------| +| `entityType(ObjectEntityType)` | `null` | `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE` or `ALL`. | +| `deidentificationType(ObjectDeidentificationType)` | `null` | `REDACT` or `UNREDACT`. | -| Constructor | Description | -|-------------|-------------| -| `new Transformations(DateTransformation shiftDates)` | Apply date shifting. | +### `FileMapping` -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getShiftDates()` | `DateTransformation` | The date transformation to apply. | +| Builder method | Description | +|----------------|-------------| +| `source(String)` | Source column. | +| `destination(String)` | Destination column. | +| `outputFileNameSuffix(String)` | Suffix added to the output file name. | +| `entitiesDestination(String)` | Column that receives the detected entities. | +| `objectEntitiesDestination(String)` | Column that receives the detected object entities. | -### `DateTransformation` +### `Media` -`com.skyflow.vault.detect` — used inside [`Transformations`](#transformations). +`Media.builder().audio(Audio).document(Document).image(Image)`. -| Constructor | Description | -|-------------|-------------| -| `new DateTransformation(int max, int min, List entities)` | Shift dates by a random amount within `[min, max]` days. | +| Class | Builder methods | +|-------|-----------------| +| `Audio` | `outputProcessedAudio(Boolean)`, `outputTranscription(OutputTranscriptionType)`, `bleep(Bleep)` | +| `Bleep` | `startPadding(Float)`, `stopPadding(Float)`, `frequency(Integer)`, `gain(Integer)` | +| `Document` | `pdf(Pdf)` | +| `Pdf` | `processingMode(PdfProcessingMode)`, `density(Integer)`, `maxResolution(Integer)` | +| `Image` | `outputProcessedImage(Boolean)`, `outputOcrText(Boolean)`, `maskingMethod(MaskingMethod)` | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getMax()` | `int` | Maximum day-shift value. | -| `getMin()` | `int` | Minimum day-shift value. | -| `getEntities()` | `List` | Entity types to date-shift. | +### `PollOptions` -### `EntityInfo` +`com.skyflow.detect` — opts `deidentifyFile` into submit-and-poll mode. The SDK polls with exponential backoff (1, 2, 4, 8, 16, then 32 seconds) on the calling thread. -`com.skyflow.vault.detect` — element of `DeidentifyTextResponse.getEntities()`. +| Builder method | Default | Description | +|----------------|---------|-------------| +| `waitTime(Integer)` | `60` | Maximum total seconds to keep polling, 1 to 300. | +| `maxAttempts(Integer)` | `23` | Maximum number of run lookups, 1 to 23. | -| Getter | Return type | Description | -|--------|-------------|-------------| -| `getToken()` | `String` | The token that replaced the original entity value. | -| `getValue()` | `String` | The original entity value. | -| `getTextIndex()` | `TextIndex` | Character offsets of the entity in the original text. | -| `getProcessedIndex()` | `TextIndex` | Character offsets of the token in the processed text. | -| `getEntity()` | `String` | Entity type label (e.g. `"EMAIL_ADDRESS"`). | -| `getScores()` | `Map` | Confidence scores per entity type. | +### `RedactionLevel` + +`com.skyflow.detect` — element of `ReidentifyStringRequest.redactionLevel()`. For skyvault vaults name an entity and a redaction type. + +| Builder method | Description | +|----------------|-------------| +| `entityName(EntityType)` | Entity the rule applies to. | +| `redactionType(RedactionType)` | `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`. See [`RedactionType`](#redactiontype). | +| `tokenGroupName(String)` | Flowvault vaults only. | +| `redactionPattern(String)` | Flowvault vaults only. | -### `TextIndex` +### `DetectedEntity` -`com.skyflow.vault.detect` — used in [`EntityInfo`](#entityinfo). +`com.skyflow.detect` — element of `DeidentifyStringResponse.getEntities()`. | Getter | Return type | Description | |--------|-------------|-------------| -| `getStart()` | `int` | Start character offset (inclusive). | -| `getEnd()` | `int` | End character offset (exclusive). | +| `getToken()` | `String` | The token that replaced the value, e.g. `NAME_1`. | +| `getValue()` | `String` | The original value; empty unless `returnEntities` is `ALL`. | +| `getLocation()` | `EntityLocation` | Offsets in the original and processed text. | +| `getEntityType()` | `String` | Entity type label, including custom type labels. | +| `getEntityScores()` | `Map` | Confidence scores per entity type. | -### `FileEntityInfo` +### `EntityLocation` -`com.skyflow.vault.detect` — element of `DeidentifyFileResponse.getEntities()`. +| Getter | Return type | Description | +|--------|-------------|-------------| +| `getStartIndex()` / `getEndIndex()` | `Integer` | Offsets into the original text. | +| `getStartIndexProcessed()` / `getEndIndexProcessed()` | `Integer` | Offsets into the processed text. | + +### `Metrics` | Getter | Return type | Description | |--------|-------------|-------------| -| `getFile()` | `String` | File name or identifier. | -| `getType()` | `String` | Output file type. | -| `getExtension()` | `String` | Output file extension. | +| `getSize()` | `Double` | Size in kilobytes. | +| `getWordCount()` | `Integer` | Word count. | +| `getCharacterCount()` | `Integer` | Character count. | +| `getPages()` | `Integer` | Page count, documents only. | +| `getSlides()` | `Integer` | Slide count, presentations only. | +| `getDuration()` | `Double` | Duration in seconds, audio only. | -### `FileInfo` +### `FileOutput` -`com.skyflow.vault.detect` — returned by `DeidentifyFileResponse.getFile()`. +`com.skyflow.detect` — element of `getOutput()` on the file responses. | Getter | Return type | Description | |--------|-------------|-------------| -| `getName()` | `String` | Original file name. | -| `getSize()` | `long` | File size in bytes. | -| `getType()` | `String` | MIME type. | -| `getLastModified()` | `long` | Last-modified timestamp (milliseconds since epoch). | +| `getProcessedFile()` | `String` | Base64 content or a presigned URL, per the response's `getOutputType()`. | +| `getProcessedFileType()` | `String` | `REDACTED_FILE`, `ENTITIES`, `OBJECT_ENTITIES`, `REDACTED_TEXT`, and so on. | +| `getProcessedFileExtension()` | `FileDataFormat` | Extension of the output. | --- @@ -604,16 +652,6 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `ENABLE` | Use provided tokens where supplied; generate tokens for missing fields. | | `ENABLE_STRICT` | All fields must supply a BYOT token; missing tokens cause an error. | -### `TokenType` - -`com.skyflow.enums` — used in [`TokenFormat`](#tokenformat) for Detect operations. - -| Value | Description | -|-------|-------------| -| `VAULT_TOKEN` | Token stored in the vault and associated with a skyflow_id. | -| `ENTITY_UNIQUE_COUNTER` | Deterministic token unique to the entity value (consistent across occurrences). | -| `ENTITY_ONLY` | Token represents the entity type only, with no value stored in the vault. | - ### `RequestMethod` `com.skyflow.enums` — used in [`InvokeConnectionRequest`](#invokeconnectionrequest). @@ -626,54 +664,25 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | `PATCH` | HTTP PATCH. | | `DELETE` | HTTP DELETE. | -### `MaskingMethod` - -`com.skyflow.enums` — used in [`DeidentifyFileRequest`](#deidentifyfilerequest). - -| Value | Description | -|-------|-------------| -| `BLACKBOX` | Cover detected entities with a solid black rectangle. | -| `BLUR` | Blur detected entities. | - -### `DetectOutputTranscriptions` - -`com.skyflow.enums` — used in [`DeidentifyFileRequest`](#deidentifyfilerequest). - -| Value | Description | -|-------|-------------| -| `TRANSCRIPTION` | Standard transcription. | -| `DIARIZED_TRANSCRIPTION` | Transcription with speaker diarization. | -| `MEDICAL_TRANSCRIPTION` | Medical-domain transcription. | -| `MEDICAL_DIARIZED_TRANSCRIPTION` | Medical transcription with speaker diarization. | - -### `DeidentifyFileStatus` - -`com.skyflow.enums` — returned in `DeidentifyFileResponse.getStatus()`. - -| Value | Description | -|-------|-------------| -| `IN_PROGRESS` | File processing is ongoing. Poll with `getDetectRun()`. | -| `SUCCESS` | Processing completed successfully. | -| `FAILED` | Processing failed. | -| `UNKNOWN` | Status could not be determined. | - -### `DetectEntities` - -`com.skyflow.enums` — entity type values for Detect operations. - -| Category | Values | -|----------|--------| -| Personal identity | `NAME`, `NAME_GIVEN`, `NAME_FAMILY`, `NAME_MEDICAL_PROFESSIONAL`, `DOB`, `AGE`, `GENDER`, `MARITAL_STATUS`, `SEXUALITY`, `RELIGION`, `POLITICAL_AFFILIATION`, `PHYSICAL_ATTRIBUTE`, `ORIGIN`, `NATIONALITY` | -| Contact | `EMAIL_ADDRESS`, `PHONE_NUMBER`, `LOCATION`, `LOCATION_ADDRESS`, `LOCATION_ADDRESS_STREET`, `LOCATION_CITY`, `LOCATION_STATE`, `LOCATION_COUNTRY`, `LOCATION_ZIP`, `LOCATION_COORDINATE` | -| Financial | `CREDIT_CARD`, `CREDIT_CARD_EXPIRATION`, `CVV`, `BANK_ACCOUNT`, `ACCOUNT_NUMBER`, `ROUTING_NUMBER`, `MONEY`, `FINANCIAL_METRIC`, `CORPORATE_ACTION` | -| Government ID | `SSN`, `DRIVER_LICENSE`, `PASSPORT_NUMBER`, `HEALTHCARE_NUMBER`, `ORGANIZATION_ID`, `NUMERICAL_PII` | -| Medical | `BLOOD_TYPE`, `CONDITION`, `DRUG`, `DOSE`, `EFFECT`, `INJURY`, `MEDICAL_CODE`, `MEDICAL_PROCESS`, `ORGANIZATION_MEDICAL_FACILITY` | -| Date & time | `DATE`, `DAY`, `MONTH`, `YEAR`, `TIME`, `DURATION`, `DATE_INTERVAL`, `EVENT` | -| Technology | `IP_ADDRESS`, `URL`, `USERNAME`, `PASSWORD`, `FILENAME`, `VEHICLE_ID` | -| Organization | `ORGANIZATION`, `OCCUPATION`, `PROJECT`, `PRODUCT` | -| Other | `LANGUAGE`, `STATISTICS`, `TREND`, `ZODIAC_SIGN`, `ALL` | - -Use `DetectEntities.ALL` to detect all supported entity types. +### Detect enums + +All in `com.skyflow.detect`. + +| Enum | Values | +|------|--------| +| `EntityType` | the 70 entity types (`NAME`, `EMAIL_ADDRESS`, `SSN`, `CREDIT_CARD`, `DOB`, ...), plus `ALL` and `NONE` | +| `DeidentificationType` | `ENTITY_UNIQUE_COUNTER` _(default)_, `ENTITY_ONLY`, `VAULT_TOKEN`, `MASK`, `UNKNOWN` | +| `DataSourceType` | `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL` | +| `FileDataFormat` | `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML`, `ZIP` | +| `DetectRunStatus` | `QUEUED`, `IN_PROGRESS`, `SUCCESS`, `FAILED`, `UNKNOWN`. `SUCCESS`, `FAILED` and `UNKNOWN` end polling. | +| `ReturnEntitiesType` | `EXCLUDE_SENSITIVE_DATA` _(default)_, `ALL`, `NONE` | +| `RedactionType` | `PLAIN_TEXT`, `MASKED`, `REDACTED`, `DEFAULT` | +| `MaskingMethod` | `NONE`, `BLUR`, `BLACKBOX` | +| `OutputTranscriptionType` | `NONE`, `TRANSCRIPTION`, `MEDICAL_TRANSCRIPTION`, `DIARIZED_TRANSCRIPTION`, `MEDICAL_DIARIZED_TRANSCRIPTION` | +| `PdfProcessingMode` | `NONE`, `OCR`, `TEXT_LAYER` | +| `ObjectEntityType` | `NONE`, `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE`, `ALL` | +| `ObjectDeidentificationType` | `UNKNOWN`, `REDACT`, `UNREDACT` | +| `GuardrailsValidation` | `PASSED`, `FAILED`, `UNKNOWN` | --- diff --git a/flowvault/README.md b/flowvault/README.md index f51dd137..589e7107 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1740,6 +1740,69 @@ switch (response.getStatus()) { Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. +### Polling from a worker thread + +With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. + +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. + +```java +ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ + +pool.execute(() -> { + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") + .build()); + handle(response); // SUCCESS, FAILED, UNKNOWN, or IN_PROGRESS/QUEUED if the budget ran out + } catch (SkyflowException e) { + handleError(e); // catch inside the task; an uncaught exception only ends this thread + } +}); +``` + +Use `pool.submit(...)` instead of `execute` if you want a `Future` to cancel with: interrupting the thread wakes the sleep and the SDK returns the last run it saw. Bound the pool, since every in-flight run parks one thread. + +**Submit only, then poll `getRun` on a scheduler.** Best for services and anything concurrent. No thread is held between lookups, so one scheduler thread serves any number of runs. You control the backoff and budget, and you write the outputs yourself since the SDK only writes them when it polls. + +```java +ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); + +String runId = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .build()) // no pollOptions: returns the run id immediately + .getRunId(); + +scheduler.schedule(new Runnable() { + long delaySeconds = 1; + + @Override + public void run() { + try { + GetRunResponse run = skyflowClient.detect().getRun(GetRunRequest.builder().runId(runId).build()); + switch (run.getStatus()) { + case SUCCESS: case FAILED: case UNKNOWN: + handle(run); + return; + default: // QUEUED, IN_PROGRESS + scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS); + delaySeconds = Math.min(delaySeconds * 2, 32); + } + } catch (SkyflowException e) { + handleError(e); + } + } +}, 0, TimeUnit.SECONDS); +``` + +Either way the main thread only pays for the submit round trip. Avoid `new Thread(...)` per file or `CompletableFuture.runAsync` on the common pool for anything that runs at scale: the first has no bound on threads, and the second blocks a shared pool sized for CPU work. + ## Reidentify string `ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. @@ -1788,7 +1851,7 @@ if (response.getStatus() == DetectRunStatus.SUCCESS) { } ``` -`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. This method is specific to the flowvault SDK. +`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. ## Get run diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index 733abb00cced1a4d560ad72fbc1204990731cb76..813b5c66bd070f9b4d27256f46e4a1eb8b7eab5f 100644 GIT binary patch delta 179092 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�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�-uLYh3C#_$+nJxxmT%q8;N>fu~d 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%0AEo*y(`@;DAz_N^GmAETzwx2t| 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 z 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 B5Lf^J delta 179609 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

Y$6ecWfS> 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 QQ!baN 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 G0`~vNWhGny diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 2221a64a..4425a60f 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -179,7 +179,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java index cceec8b8..d2c92a4c 100644 --- a/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/flowvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -60,9 +60,6 @@ public enum ErrorMessage { MissingIndexInBulkTokenizeRecord("%s0 Validation error. Index in BulkTokenizeRequestRecord is null. Specify an index for every record."), DuplicateIndexInBulkTokenizeRecord("%s0 Validation error. Duplicate index in BulkTokenizeRequestRecord. Specify a unique index for every record."), // Detect (flowvault only) - ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), - InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), - InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), ; private final String message; diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java index 3f86640d..573eb349 100644 --- a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -2,38 +2,15 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DeidentifyFileRequest; -import com.skyflow.detect.DeidentifyFileResponse; -import com.skyflow.detect.GetRunRequest; -import com.skyflow.detect.ReidentifyFileRequest; -import com.skyflow.detect.ReidentifyFileResponse; -import com.skyflow.detect.internal.DeidentifyFileFlow; -import com.skyflow.detect.internal.DetectRequestMapper; -import com.skyflow.detect.internal.DetectValidations; -import com.skyflow.detect.internal.ReidentifyFileMapper; -import com.skyflow.detect.internal.ReidentifyFileValidations; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.BaseConstants; import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; /** * Skyflow Detect operations for a flowvault vault, returned by {@code Skyflow.detect()} and * {@code Skyflow.detect(vaultId)}. The shared Detect V2 methods are inherited from - * {@link BaseDetectController}; this class adds the flowvault-only {@link #deidentifyFile} and - * {@link #reidentifyFile} and - * supplies the flowvault URL rules, SDK metrics and the vault-level timeout and retry overrides - * from {@link VaultConfig}. + * {@link BaseDetectController} and shared with the skyvault SDK; this class only supplies the + * flowvault URL rules, SDK metrics and the vault-level timeout and retry overrides from + * {@link VaultConfig}. */ public final class DetectController extends BaseDetectController { private static final int DEFAULT_TIMEOUT_SECONDS = 60; @@ -85,95 +62,6 @@ protected Long effectiveMaxRetryDelayMillis() { DEFAULT_MAX_RETRY_DELAY_MILLIS); } - // ------------------------------------------------------------------ - // Flowvault-only Detect V2 operations - // ------------------------------------------------------------------ - - /** - * Detects and de-identifies sensitive data in a file. The API is asynchronous: by default this - * submits the run and returns its id for use with {@link #getRun}. With - * {@link DeidentifyFileRequest#getPollOptions() pollOptions} the SDK polls the run with exponential - * backoff and returns the completed run, or the run id with a non-terminal status if the budget - * runs out. On success, a request built from a local file has its outputs written to disk. - * - * @param request the file (base64, skyflow id, presigned URL, or a local file) plus a stored or inline configuration - * @return run id, and the run's status, outputs and metrics when polled - * @throws SkyflowException on validation failure, credential failure, an API error or an output write failure - */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); - DetectValidations.validateDeidentifyFileRequest(request); - String token = resolveToken(); - DeidentifyFileRequestV2 apiRequest = DetectRequestMapper.toDeidentifyFileRequest(request, getVaultConfig().getVaultId()); - String runId; - try { - DeidentifyFileResponseV2 apiResponse = filesClient().deidentifyFileV2(apiRequest, requestOptions(token)); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); - runId = apiResponse.getRunId().orElse(null); - } catch (ApiClientApiException e) { - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); - } catch (ApiClientException e) { - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e); - } - DeidentifyFileResponse response = DeidentifyFileFlow.complete(request, runId, - id -> getRun(GetRunRequest.builder().runId(id).build())); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_SUCCESS.getLog()); - return response; - } - - /** - * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: - * the re-identified file is returned in the response rather than through a run id. - * - * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules - * @return status, output files and metrics - * @throws SkyflowException on validation failure, credential failure or an API error - */ - public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_TRIGGERED.getLog()); - LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_FILE_REQUEST.getLog()); - ReidentifyFileValidations.validateReidentifyFileRequest(request); - String token = resolveToken(); - ReidentifyFileRequestV2 apiRequest = ReidentifyFileMapper.toApiRequest(request, getVaultConfig().getVaultId()); - try { - ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); - ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); - return response; - } catch (ApiClientApiException e) { - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), responseBody(e.body())); - } catch (ApiClientException e) { - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e); - } - } - - private RequestOptions requestOptions(String token) { - return RequestOptions.builder() - .addHeader("Authorization", "Bearer " + token) - .addHeader(BaseConstants.SDK_METRICS_HEADER_KEY, getSdkMetrics()) - .build(); - } - - private static String responseBody(Object body) { - if (body == null) { - return null; - } - if (body instanceof String) { - return (String) body; - } - try { - return ObjectMappers.JSON_MAPPER.writeValueAsString(body); - } catch (Exception ex) { - return body.toString(); - } - } - private static T firstNonNull(T vaultLevel, T clientLevel, T defaultValue) { if (vaultLevel != null) { return vaultLevel; diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index f21fe9f3..0af983c8 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -28,7 +28,6 @@ import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; import com.skyflow.errors.BaseErrorMessage; -import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; import okhttp3.mockwebserver.MockResponse; @@ -159,10 +158,10 @@ public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowEx ReidentifyFileRequest.builder().value("Zm9v").build(), ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), }; - ErrorMessage[] expected = { - ErrorMessage.ReidentifyFileRequestNull, - ErrorMessage.InvalidDataSourceInReidentifyFile, - ErrorMessage.InvalidValueInReidentifyFile, + BaseErrorMessage[] expected = { + BaseErrorMessage.ReidentifyFileRequestNull, + BaseErrorMessage.InvalidDataSourceInReidentifyFile, + BaseErrorMessage.InvalidValueInReidentifyFile, }; for (int i = 0; i < bad.length; i++) { try { diff --git a/skyvault/README.md b/skyvault/README.md index e996553a..b5302dd5 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -44,12 +44,12 @@ The Skyflow Java SDK is designed to help with integrating Skyflow into a Java ba - [Upload File](#upload-file) - [Detect](#detect) - - [Deidentify Text](#deidentify-text) - - [Reidentify Text](#reidentify-text) - - [Deidentify File](#deidentify-file) - - [Get Run](#get-run) - - [Detect response types](#detect-response-types) - - [Detect enums](#detect-enums) + - [Deidentify string](#deidentify-string) + - [Deidentify file](#deidentify-file) + - [Reidentify string](#reidentify-string) + - [Reidentify file](#reidentify-file) + - [Get run](#get-run) + - [Check guardrails](#check-guardrails) - [Connections](#connections) - [ConnectionController](#connectioncontroller) - [Invoke a connection](#invoke-a-connection) @@ -1664,754 +1664,277 @@ Sample response: ``` # Detect -Skyflow Detect enables you to deidentify and reidentify sensitive data in text and files, supporting advanced privacy-preserving workflows. -`DetectController` is the class returned by `skyflowClient.detect()` and `skyflowClient.detect(vaultId)`. +Skyflow Detect finds and de-identifies sensitive data in free text, then re-identifies it on demand. The skyvault SDK exposes the Detect V2 API through `DetectController`, returned by `skyflowClient.detect()` and `skyflowClient.detect(vaultId)`. Every request is scoped to that vault, and the controller honours the same credentials, timeouts and retries as `vault()`. -```java -// Uses the default (first configured) vault -DetectController detect = skyflowClient.detect(); - -// Uses a specific vault by ID -DetectController detect = skyflowClient.detect(""); -``` +Detect configurations are created in Studio or through the management API. The SDK does not create, update or delete them. -**Methods:** +| Method | Request | Response | Description | +|--------|---------|----------|-------------| +| `deidentifyString(DeidentifyStringRequest)` | `com.skyflow.detect.DeidentifyStringRequest` | `com.skyflow.detect.DeidentifyStringResponse` | Detect and replace sensitive data in a string | +| `deidentifyFile(DeidentifyFileRequest)` | `com.skyflow.detect.DeidentifyFileRequest` | `com.skyflow.detect.DeidentifyFileResponse` | Submit a file for de-identification, optionally polling the run to completion | +| `reidentifyString(ReidentifyStringRequest)` | `com.skyflow.detect.ReidentifyStringRequest` | `com.skyflow.detect.ReidentifyStringResponse` | Replace tokens in a string with their original or redacted values | +| `reidentifyFile(ReidentifyFileRequest)` | `com.skyflow.detect.ReidentifyFileRequest` | `com.skyflow.detect.ReidentifyFileResponse` | Replace tokens in a file with their original or redacted values | +| `getRun(GetRunRequest)` | `com.skyflow.detect.GetRunRequest` | `com.skyflow.detect.GetRunResponse` | Retrieve the status and outputs of a Detect file run | +| `checkGuardrails(CheckGuardrailsRequest)` | `com.skyflow.detect.CheckGuardrailsRequest` | `com.skyflow.detect.CheckGuardrailsResponse` | Screen text for toxicity and denied topics | -| Method | Parameters | Returns | Description | -|--------|-----------|---------|-------------| -| `deidentifyText(DeidentifyTextRequest)` | [`DeidentifyTextRequest`](../docs/api_reference.md#deidentifytextrequest) | [`DeidentifyTextResponse`](../docs/api_reference.md#deidentifytextresponse) | Deidentify sensitive entities in text | -| `reidentifyText(ReidentifyTextRequest)` | [`ReidentifyTextRequest`](../docs/api_reference.md#reidentifytextrequest) | [`ReidentifyTextResponse`](../docs/api_reference.md#reidentifytextresponse) | Restore original values from a deidentified text | -| `deidentifyFile(DeidentifyFileRequest)` | [`DeidentifyFileRequest`](../docs/api_reference.md#deidentifyfilerequest) | [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse) | Deidentify sensitive data in a file | -| `getDetectRun(GetDetectRunRequest)` | [`GetDetectRunRequest`](../docs/api_reference.md#getdetectrunrequest) | [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse) | Poll for the result of an async file deidentification | +> Detect V2 is in beta. -## Deidentify Text -To deidentify text, use the `deidentifyText` method. [`DeidentifyTextRequest`](../docs/api_reference.md#deidentifytextrequest) accepts the text to deidentify along with optional entity types, regex lists, token format, and transformations. Returns a [`DeidentifyTextResponse`](../docs/api_reference.md#deidentifytextresponse). +## Deidentify string -### Construct an deidentify text request +`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) and/or `configuration` (an inline `DetectConfiguration`). Both are optional on the API and are sent exactly as supplied. The SDK fills the vault id from the controller. ```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.vault.detect.DateTransformation; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.TokenFormat; -import com.skyflow.vault.detect.Transformations; -import com.skyflow.vault.detect.DeidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * This example demonstrate to build deidentify text request. - */ -public class DeidentifyTextSchema { - - public static void main(String[] args) { - - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configure the options for deidentify text - - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with entity only - List entityOnlyList = new ArrayList<>(); - entityOnlyList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with entity unique counter - List entityUniqueCounterList = new ArrayList<>(); - entityUniqueCounterList.add(DetectEntities.SSN); - - // Replace with the regex patterns you want to allow during deidentification - List allowRegexList = new ArrayList<>(); - allowRegexList.add(""); - - // Replace with the regex patterns you want to restrict during deidentification - List restrictRegexList = new ArrayList<>(); - restrictRegexList.add("YOUR_RESTRICT_REGEX_LIST"); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .entityOnly(entityOnlyList) - .entityUniqueCounter(entityUniqueCounterList) - .build(); - - // Configure Transformation - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform - - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - // Step 3: Create a deidentify text request for the vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); +import com.skyflow.detect.*; + +// Stored configuration +DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configurationId("") + .build()); + +System.out.println(response.getProcessedText()); +// My name is [NAME_1], and my email is [EMAIL_ADDRESS_1]. + +// Inline configuration +DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination(".") // skyvault: table.column that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); - // Step 4: Use the Skyflow client to perform the deidentifyText operation - // Replace with your actual vault ID - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect("").deidentifyText(deidentifyTextRequest); +response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text("My name is John Doe, and my email is johndoe@acme.com.") + .configuration(configuration) + .build()); - // Step 5: Print the response - System.out.println("Deidentify text Response: " + deidentifyTextResponse); - } +for (DetectedEntity entity : response.getEntities()) { + System.out.println(entity.getEntityType() + " " + entity.getToken() + + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); } - +System.out.println(response.getMetrics().getWordCount()); ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/DeidentifyTextExample.java) of deidentify text: -```java -import java.util.ArrayList; -import java.util.List; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DateTransformation; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.TokenFormat; -import com.skyflow.vault.detect.Transformations; - -/** - * Skyflow Deidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing deidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class DeidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for deidentify - - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - detectEntitiesList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .build(); - - // Configure Transformation for deidentified entities - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform +`DeidentifyStringResponse` carries `getProcessedText()`, `getEntities()` (a `List` with token, entity type, location and confidence scores; never `null`) and `getMetrics()`. - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - // Step 3: invoking Deidentify text on the vault - try { - // Create a deidentify text request for the vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with your deidentify text - .entities(detectEntitiesList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").deidentifyText(deidentifyTextRequest); - - System.out.println("Deidentify text Response: " + deidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify: "); - e.printStackTrace(); // Print the exception for debugging purposes - } - } -} -``` - -Sample Response: -```json -{ - "processedText": "My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].", - "entities": [ - { - "token": "SSN_IWdexZe", - "value": "123-45-6789", - "textIndex": { - "start": 10, - "end": 21 - }, - "processedIndex": { - "start": 10, - "end": 23 - }, - "entity": "SSN", - "scores": { - "SSN": 0.9384 - } - }, - { - "token": "CREDIT_CARD_rUzMjdQ", - "value": "4111 1111 1111 1111", - "textIndex": { - "start": 37, - "end": 56 - }, - "processedIndex": { - "start": 39, - "end": 60 - }, - "entity": "CREDIT_CARD", - "scores": { - "CREDIT_CARD": 0.9051 - } - } - ], - "wordCount": 9, - "charCount": 57 -} -``` - -## Reidentify Text -To reidentify text, use the `reidentifyText` method. [`ReidentifyTextRequest`](../docs/api_reference.md#reidentifytextrequest) accepts the redacted/deidentified text and optional entity lists controlling which entities to reveal, mask, or keep redacted. Returns a [`ReidentifyTextResponse`](../docs/api_reference.md#reidentifytextresponse). - -### Construct an reidentify text request - -```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * This example demonstrates how to build a reidentify text request. - */ -public class ReidentifyTextSchema { - public static void main(String[] args) { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for reidentify - List maskedEntity = new ArrayList<>(); - maskedEntity.add(DetectEntities.CREDIT_CARD); // Replace with the entity you want to mask - - List plainTextEntity = new ArrayList<>(); - plainTextEntity.add(DetectEntities.SSN); // Replace with the entity you want to keep in plain text - - // List redactedEntity = new ArrayList<>(); - // redactedEntity.add(DetectEntities.SSN); // Replace with the entity you want to redact +## Deidentify file +File de-identification is asynchronous on the API: the submit call returns a run id and the result is retrieved from the run. `deidentifyFile` exposes both modes. - // Step 3: Create a reidentify text request with the configured entities - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentify text - .maskedEntities(maskedEntity) -// .redactedEntities(redactedEntity) - .plainTextEntities(plainTextEntity) - .build(); +- **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). +- **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. - // Step 4: Invoke reidentify text on the vault - ReidentifyTextResponse reidentifyTextResponse = skyflowClient.detect("").reidentifyText(reidentifyTextRequest); - System.out.println("Reidentify text Response: " + reidentifyTextResponse); - } -} -``` - -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/ReidentifyTextExample.java) of Reidentify text +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. ```java -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * Skyflow Reidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to reidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing reidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class ReidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Configuring the different options for reidentify - List maskedEntity = new ArrayList<>(); - maskedEntity.add(DetectEntities.CREDIT_CARD); // Replace with the entity you want to mask - - List plainTextEntity = new ArrayList<>(); - plainTextEntity.add(DetectEntities.SSN); // Replace with the entity you want to keep in plain text - - try { - // Step 3: Create a reidentify text request with the configured options - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentify text - .maskedEntities(maskedEntity) - .plainTextEntities(plainTextEntity) - .build(); - - // Step 4: Invoke Reidentify text on the vault - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - ReidentifyTextResponse reidentifyTextResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").reidentifyText(reidentifyTextRequest); - - // Handle the response from the reidentify text request - System.out.println("Reidentify text Response: " + reidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during reidentify : "); - e.printStackTrace(); - } - } +// Submit only +DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") // BASE64 + pdf inferred + .configurationId("") + .build()); +String runId = submitted.getRunId(); + +// Submit and poll +DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") // optional + .build()); + +switch (response.getStatus()) { + case SUCCESS: + // For file-based requests the outputs are already on disk: + // /data/processed/processed-patient-notes.pdf the redacted file + // /data/processed/processed-entities-patient-notes.json the detected entities + // response.getOutput() and getMetrics() carry the same data. + break; + case FAILED: + System.err.println(response.getMessage()); + break; + default: // IN_PROGRESS or QUEUED: budget ran out, resume with getRun(runId) + break; } ``` -Sample Response: +Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. -```json -{ - "processedText":"My SSN is 123-45-6789 and my card is XXXXX1111." -} -``` - -## Deidentify file -To deidentify files, use the `deidentifyFile` method. [`DeidentifyFileRequest`](../docs/api_reference.md#deidentifyfilerequest) accepts a [`FileInput`](../docs/api_reference.md#fileinput) and optional parameters controlling entity detection, masking, output format, and async wait time. Supports images, PDFs, audio, documents, spreadsheets, and presentations. Returns a [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse). - -### AudioBleep - -[`AudioBleep`](../docs/api_reference.md#audiobleep) controls how detected sensitive audio segments are replaced with a bleep tone. Used in `DeidentifyFileRequest.builder().bleep(audioBleep)` for audio files. - -```java -import com.skyflow.vault.detect.AudioBleep; +### Polling from a worker thread -AudioBleep audioBleep = AudioBleep.builder() - .frequency(1000D) // bleep tone frequency in Hz - .gain(0.5D) // bleep tone gain (volume level) - .startPadding(0.2D) // silence padding before the bleep (seconds) - .stopPadding(0.2D) // silence padding after the bleep (seconds) - .build(); -``` +With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. -### Construct an deidentify file request +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. ```java -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; - -import java.io.File; - -/** - * This example demonstrates how to build a deidentify file request. - */ - -public class DeidentifyFileSchema { - - public static void main(String[] args) { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Create a deidentify file request with all options - - // Create file object - File file = new File(""); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("").deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); +ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ + +pool.execute(() -> { + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("/data/processed") + .build()); + handle(response); // SUCCESS, FAILED, UNKNOWN, or IN_PROGRESS/QUEUED if the budget ran out + } catch (SkyflowException e) { + handleError(e); // catch inside the task; an uncaught exception only ends this thread } -} +}); ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/DeidentifyFileExample.java) of Deidentify file +Use `pool.submit(...)` instead of `execute` if you want a `Future` to cancel with: interrupting the thread wakes the sleep and the SDK returns the last run it saw. Bound the pool, since every in-flight run parks one thread. + +**Submit only, then poll `getRun` on a scheduler.** Best for services and anything concurrent. No thread is held between lookups, so one scheduler thread serves any number of runs. You control the backoff and budget, and you write the outputs yourself since the SDK only writes them when it polls. ```java -import java.io.File; +ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; +String runId = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("/data/intake/patient-notes.pdf") + .configurationId("") + .build()) // no pollOptions: returns the run id immediately + .getRunId(); -/** - * Skyflow Deidentify File Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file. - * 5. Handle response and errors - */ -public class DeidentifyFileExample { +scheduler.schedule(new Runnable() { + long delaySeconds = 1; - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. + @Override + public void run() { try { - // Step 2: Create a deidentify file request with all options - - - // Create file object - File file = new File("sensitive-folder/personal-info.txt"); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = "deidentified-file/"; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - .build(); - - // Step 3: Invoking deidentifyFile - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); + GetRunResponse run = skyflowClient.detect().getRun(GetRunRequest.builder().runId(runId).build()); + switch (run.getStatus()) { + case SUCCESS: case FAILED: case UNKNOWN: + handle(run); + return; + default: // QUEUED, IN_PROGRESS + scheduler.schedule(this, delaySeconds, TimeUnit.SECONDS); + delaySeconds = Math.min(delaySeconds * 2, 32); + } } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify file: "); - e.printStackTrace(); + handleError(e); } } -} - -``` - -Sample response: - -```json -{ - "file": { - "name": "deidentified.txt", - "size": 33, - "type": "", - "lastModified": 1751355183039 - }, - "fileBase64": "bXkgY2FyZCBudW1iZXIgaXMgW0NSRURJVF", - "type": "redacted_file", - "extension": "txt", - "wordCount": 11, - "charCount": 61, - "sizeInKb": 0, - "entities": [ - { - "file": "bmFtZTogW05BTUVfMV0gCm==", - "type": "entities", - "extension": "json" - } - ], - "runId": "undefined", - "status": "success" -} - +}, 0, TimeUnit.SECONDS); ``` -**Supported file types:** -- Documents: `doc`, `docx`, `pdf` -- PDFs: `pdf` -- Images: `bmp`, `jpeg`, `jpg`, `png`, `tif`, `tiff` -- Structured text: `json`, `xml` -- Spreadsheets: `csv`, `xls`, `xlsx` -- Presentations: `ppt`, `pptx` -- Audio: `mp3`, `wav` +Either way the main thread only pays for the submit round trip. Avoid `new Thread(...)` per file or `CompletableFuture.runAsync` on the common pool for anything that runs at scale: the first has no bound on threads, and the second blocks a shared pool sized for CPU work. -**Note:** -- Transformations cannot be applied to Documents, Images, or PDFs file formats. +## Reidentify string -- The `waitTime` option must be ≤ 64 seconds; otherwise, an error is thrown. - -- If the API takes more than 64 seconds to process the file, it will return only the run ID in the response. - -Sample response (when the API takes more than 64 seconds): -```json -{ - "file": null, - "fileBase64": null, - "type": null, - "extension": null, - "wordCount": null, - "charCount": null, - "sizeInKb": null, - "durationInSeconds": null, - "pageCount": null, - "slideCount": null, - "entities": null, - "runId": "1273a8c6-c498-4293-a9d6-389864cd3a44", - "status": "IN_PROGRESS", - "errors": null -} -``` - -## Get run: -To retrieve the results of a previously started file deidentification operation, use the `getDetectRun` method. [`GetDetectRunRequest`](../docs/api_reference.md#getdetectrunrequest) accepts the `runId` returned from a prior `deidentifyFile` call. Returns a [`DeidentifyFileResponse`](../docs/api_reference.md#deidentifyfileresponse). - -### Construct an get run request +`ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For skyvault vaults each rule names an `entityName` and the `redactionType` to apply to it: `PLAIN_TEXT` reveals the original value, `MASKED` masks it, `REDACTED` keeps the token, `DEFAULT` applies the vault's default. Without rules every token is replaced by its original value. ```java -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; - -/** - * Skyflow Get Detect Run Example - */ - -public class GetDetectRunSchema { - - public static void main(String[] args) { - try { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - - // Step 2: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("") // Replace with the runId from deidentifyFile call - .build(); - - // Step 3: Call getDetectRun to poll for file processing results - // Replace with your actual vault ID - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("").getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} +ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") + .redactionLevel(Arrays.asList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build(), + RedactionLevel.builder() + .entityName(EntityType.EMAIL_ADDRESS) + .redactionType(RedactionType.MASKED) + .build())) + .build()); +System.out.println(response.getProcessedText()); +// My name is John Doe and my email is j*******@acme.com. ``` -## An [example](https://github.com/skyflowapi/skyflow-java/blob/main/samples/src/main/java/com/example/detect/GetDetectRunExample.java) of get run -```java -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; +A `RedactionLevel` is expected to name one source (`entityName`) and one replacement (`redactionType`). Every field is optional on the API, so the SDK passes the list through as given and the server enforces the combination rules. The `tokenGroupName` and `redactionPattern` fields apply to flowvault vaults only. -/** - * Skyflow Get Detect Run Example - *

- * This example demonstrates how to: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a get detect run request - * 4. Call getDetectRun to poll for file processing results - * 5. Handle response and errors - */ -public class GetDetectRunExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Initialize the Skyflow client by configuring the credentials & vault config. - try { +## Reidentify file - // Step 2: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("e0038196-4a20-422b-bad7-e0477117f9bb") // Replace with the runId from deidentifyFile call - .build(); +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. - // Step 3: Call getDetectRun to poll for file processing results - // Replace `9f27764a10f7946fe56b3258e117` with the actual vault id - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect("9f27764a10f7946fe56b3258e117").getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} -``` - -Sample Response: - -```json -{ - "file": "bmFtZTogW05BTET0JfMV0K", - "type": "redacted_file", - "extension": "txt", - "wordCount": 11, - "charCount": 61, - "sizeInKb": 0.0, - "entities": [ - { - "file": "gW05BTUVfMV0gCmNhcmQ0K", - "type": "entities", - "extension": "json" +```java +byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); + +ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(Base64.getEncoder().encodeToString(content)) + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build())) + .build()); + +if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); } - ], - "runId": "e0038196-4a20-422b-bad7-e0477117f9bb", - "status": "success" } - ``` -## Detect response types +`ReidentifyFileResponse` carries `getStatus()`, `getOutputType()`, `getOutput()` (never `null`) and `getMetrics()`. -The Detect API returns structured objects for detected entities. See the API Reference for full attribute lists: [`EntityInfo`](../docs/api_reference.md#entityinfo), [`TextIndex`](../docs/api_reference.md#textindex), [`FileEntityInfo`](../docs/api_reference.md#fileentityinfo), [`FileInfo`](../docs/api_reference.md#fileinfo). +## Get run -### EntityInfo and TextIndex - -[`EntityInfo`](../docs/api_reference.md#entityinfo) appears in `DeidentifyTextResponse.getEntities()`. Each entry includes the detected entity type, original value, replacement token, character positions ([`TextIndex`](../docs/api_reference.md#textindex)), and confidence scores. +File de-identification is asynchronous: the submit call returns a run id, and `getRun` retrieves the run's status and, once it has succeeded, its outputs. `GetRunResponse.getOutput()` is empty and `getOutputType()` and `getMetrics()` are `null` until the run completes. ```java -DeidentifyTextResponse response = skyflowClient.detect("").deidentifyText(request); - -for (EntityInfo entity : response.getEntities()) { - System.out.println("Entity : " + entity.getEntity()); - System.out.println("Value : " + entity.getValue()); - System.out.println("Token : " + entity.getToken()); - System.out.println("Start : " + entity.getTextIndex().getStart()); - System.out.println("End : " + entity.getTextIndex().getEnd()); - System.out.println("Score : " + entity.getScores().get(entity.getEntity())); +GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder().runId("").build()); + +switch (run.getStatus()) { + case SUCCESS: + for (FileOutput output : run.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() + // output.getProcessedFileType() is e.g. REDACTED_FILE or ENTITIES + // output.getProcessedFileExtension() is a FileDataFormat such as PDF + } + break; + case FAILED: + System.err.println(run.getMessage()); + break; + default: // QUEUED, IN_PROGRESS, UNKNOWN + // poll again later } ``` -### FileEntityInfo and FileInfo - -[`FileEntityInfo`](../docs/api_reference.md#fileentityinfo) appears in `DeidentifyFileResponse.getEntities()`. [`FileInfo`](../docs/api_reference.md#fileinfo) is returned by `DeidentifyFileResponse.getFile()` and contains file metadata. - -## Detect enums - -See the API Reference for full value descriptions: [`TokenType`](../docs/api_reference.md#tokentype), [`DeidentifyFileStatus`](../docs/api_reference.md#deidentifyfilestatus), [`DetectOutputTranscriptions`](../docs/api_reference.md#detectoutputtranscriptions), [`MaskingMethod`](../docs/api_reference.md#maskingmethod), [`DetectEntities`](../docs/api_reference.md#detectentities). +## Check guardrails -### TokenType - -[`TokenType`](../docs/api_reference.md#tokentype) controls how detected entities are tokenized. Used in `TokenFormat.builder()`. - -```java -import com.skyflow.enums.TokenType; - -TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) // uses VAULT_TOKEN - .entityOnly(entityOnlyList) // uses ENTITY_ONLY - .entityUniqueCounter(entityUniqueCounterList) // uses ENTITY_UNIQUE_COUNTER - .build(); -``` - -### DeidentifyFileStatus - -[`DeidentifyFileStatus`](../docs/api_reference.md#deidentifyfilestatus) is returned in `DeidentifyFileResponse.getStatus()` to indicate async processing state. +`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. Each check runs only when requested: `getToxic()` is `null` unless `checkToxicity(true)` was set, and `getDeniedTopic()` is `null` unless `denyTopics` was supplied. `getValidation()` is `FAILED` if any requested check triggered. ```java -import com.skyflow.enums.DeidentifyFileStatus; - -DeidentifyFileResponse response = skyflowClient.detect("").getDetectRun(request); -if (DeidentifyFileStatus.SUCCESS.value().equals(response.getStatus())) { - // safe to read response.getFile() -} else if (DeidentifyFileStatus.IN_PROGRESS.value().equals(response.getStatus())) { - // poll again using the runId +CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text(userPrompt) + .checkToxicity(true) + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + +if (response.getValidation() == GuardrailsValidation.FAILED) { + throw new IllegalArgumentException("blocked: toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); } ``` -### DetectOutputTranscriptions +All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -[`DetectOutputTranscriptions`](../docs/api_reference.md#detectoutputtranscriptions) controls the transcription format for audio file deidentification. - -```java -import com.skyflow.enums.DetectOutputTranscriptions; - -DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputTranscription(DetectOutputTranscriptions.TRANSCRIPTION) - .build(); -``` +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Connections diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index 6ba58495ffdcbf1a11e1c18ca922e4bc6fa4c446..da729c8793f74d796093dbc51159c28932ad6b0b 100644 GIT binary patch delta 604404 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�!=ad5%?I&O#aoV=9{F*G}n=g^O z^f-VvwCk}_(koM-J)D&Dsin!vQz-X5&=53CoIRM-eQ4x1blab#S+0=N=kpkf*|SMd z0SEh3(Re0GHg2fGMS#~)+K9@YQD5&U-d!C=szbJ%Cc6K(+3A1i8Lt1(GrH) zBL$`oNGR#ha}y@)4h>eWrpqSK5}8PYWby_X*~8=G9&zoWE^D_dP3<}zIw^4l9%iM5 z!uMaF-dEdt$F#fKMu1A=2n)Si0909Wi`_g>7Y(x!+Vjv z`J~aoT4zfo)o3{FAA|<|UxbDOg3yrsgV4wYNdGTFGi0P7FeMfB_>kKFSYXKjgN=+3 zt5t&&gA_CQYw{$Ro0S_lgq%YmyjHLDA`V)#IFdzj<)r7;>UY(V*&Uq@J;QCZllY6! zFv|SMd?M-vS=jHYTB6#jL79d`S`m$XO*dj;rBiYitloxd#m*e84oIFMuCui3Y*!7qOph*$-aHtt07F9BCAOKDII8@Fy>Auu z7Ym#eKgL$>c$Q_`?twq5t1j?-QD25pwOn^M?!vDzV*1oJ zz$)2LJihX=ZLPo{ST>KZ>fQJZoM@$sabz|iU+~dA`U*mc;~tf^v<6#ZgU6VHrZlnm zhh18eD6%mvAn4an@&h)NEIfwezyiYP2UnI+^LY;+4a*Xa9zKk?@>-1}rwLF}|pWrqUdHGvrN}gn@{3${doz?9AGhFq=DhWVU`;y!R z)cEpyQ=>E`x9jGY?W*%wYPKBj4!hS`HM)3e#he1fwDI#}AMaAg`7&tYzK~yNoeN!QeL|eFNwut$9~~3dhxxH%_S!%$VAx zcs`N0wPJ|z&p+c48^bfV+ahB`A8ZiAfkDN{n#ksK8s88YRPq45LDjuc;dhzOMygO zD(YP4``*aip8}9_wmms%GvAH8QHzxS!!&eV(31b5s!oQVC&3JbC+uh%>8o;8AnMI|H_E46;pTfTWZ|a;X8yhfw0OG>LAG~N|BXQ-gNiLS~tzq>@ z8;h23hUgd>p?3(=RW|Mge0n`P?!fI82RH#Xf}G=JR0ZB&>NQhzsykk4j*B&MRdtS6 z%s(iMlD7zb2+tP|5!Vzu0xj9+mS1*caGkbVF%mA+li!d?am zJg2#{YYM+TZSFAjv3=oxv|uma7W4`h*}a3cXxET^Z}vh@(q_IbzjG zIr{tsTQ-zshbZGGANLT#w1)n7oH&Ip+VcXWQ~Kk6cZ|%T7>So>m{-k<$r280hFGn0 z|7ErQNApq){`T@XY7nj=`Dzzd%z*;r-4!w(|&VtDv{7Ir0*{c3lN{2BYSY}xiVMAC6cGGqId@^ZHy^EUU^<_8I%rr)M5QF{GoPP}+{kW| zVhpDwKb3>**xb#A?T3H50z)95bM(%VQG6ZFvHG+F9@s^yS-`m*B!KT*wL>NEGEE0= z-s4zysb@_A+Ig7x`vYx)D=a@+A&ac9UP$TZ@QeV~Jg@S^UP+onF6x=sR*mC1mp8Vc zj3Y~B*@xGTqDf3%LealD8d`}pZn1xoG(zEg$zNn7b=LmLt?GxMP-xG6gUikx+LCtt zSuMd}Z0u`q!NsBb8e4U|iieyaHxU-qp(T*_%WB!0I4GKIs{O7mQWzQ7ZTy;BwfrYZ zqyL(uQA~m)X@tA?n`|L{JkaPmA8+`&J38(0y2#jOJfaM0oh18BVFCz`oA;WtzwND< z%p+%Qe(_NviwdC#hlK=T;Q)0cbK|aw;CI8GNJ}Z!xio`Ad}D?<3l`7|z?bg7xmBsS z1kTgu%}`bHGAGUG=X42i@t6a=-qUggK|DRLcy;NIoIJt%o%&X(dJVzNNu+qMO*(q? zHD+qPy{Q!Zh!4C{{EVKwb;;}YeioroGGS4+p!S3K6I|h<4OiDZf_FS>G+%lXgRNEA zuI3iJw;xK1drWL9)q%;-*`U%~I5X+G4@@{cZfRuKA1}a1va9k(t4!LY_~l|tdW`3u z*kyKe5dhGQAZm)CGdcATcypjxF1(k%Fji4Hwpj34QI-TFwKuP;*K~jR`BjiOe=nl^aAIWl?^;3`<-f8c2|)94s74xDTYw z&Yhs7XYBaguV_7IZIZQ;BX-gjN~mQkAEYuyybXF_f=ck7$Ye#SftICbxgMtCi9eK# zTHb5obRzFZc*Z};$9fIYEE{$!ee^vJL^aIH5&we$$9~e12Q#QZlaVr)`!ULEmI;7g@f~6~FnVlX=dY+z@DDs3)6$X3#MfZ!kKOYmBZZ zx#8?3HC_b$MiI`tRk8V1_M3$z;e}Kd`23;yQ%=&YMdewsnI`G*!QFd`^ zV8K}>u8VlWu3IuZ_=3U+Ly`QzvQ2ykn7mCp@xz24I|yhFu@ zPZ3dskNBj|!!T=DInO_Z8NBlIQI>&J7FsP{j%#4nF18ZmZQ*JaGA}c6cDFA6@)B=2 z;v`>Uc=+=_+q>`Rpyb!Pit+y?b^ifIS;4>ofFo4eDfn~%pbRw45Ha^f{$}39c=?;T zs338M-ww?@f*DV%S7RNv%EV@5gaA>R{alGL&HdP5y@e`AQQ#7waQCBt+BeyP0fu;q z%ix{Pjw>N}g!7f6eqgYE=*wceE0)j()8prQK>YzQu z+wHdGOfEO~Y;)R67|XHxOZ$5I5|}ovUL)ei@xkgkH6Ww|0kVPeOW&pEEB`!NHjxC{ zjiJ0%!G=T22Mn|QZZD$#u?YS(FdoT`{OCy~Hg4ApGly?yV7fhk#Q61BYrAW^u_dML z@Ohg?^I0x^HF za&%Ix00&ieKHu<#Bo|zV=B)@>jkk^rZVP-dAMJar-3QL)eixIF5yUx9gZB%L+u{A~ zZ)2_ogTTi_01@DKSfb83_+!gofu;AmF}Yfk$93@HSdv;zh&`GQ1hq(yJW{0zhGBbX z($xGvO5(Vkrf(VOwEJQ~jjZ+Bpysj@^FHL}SO@0NjpRS$tgg%}VX5phjqJ-lo}M1C zMaj5HGnn&6F@Cb*d^tLtf6_wt2m{xtsm3wXddAs46J49X)&1y|ovs+>roVNrx64|J-{tPLoayy~g|cC4XgKuBlqYK&rsntWzgtis^=60xX8N{%^N@WDLE`0!k`+9)z~!kz)Ja5XQ_C_6w!BxRaM zf)z>jwwvgJ1XaCC8pAVbD|&s5F#E1si8i*+H1*)q5dabD4}mds%tR;^N&=v{b!a^p z{}+IXl+MkeQnn~q_C+tg8-YTCI^GofC#zgcMSLC_e}3*h*y0y}7bw5C50(DIRx50a zH_94|dGn*x`^|*B5B1e7{E7my%4+nqrAdhzKjm8bP~?8bR<|y^X%Asp!#tNgi_Wul zHJYF>(zv3iqJs=8{A`&I_1#0zGM3=T-2_P9$K_t;nDD&N-=I5gfL*^BOTxb3Pd@F@ zog1%b4bDzwz4J2g5 z$AgcI+s^M=xQMJvso`yrH3@`^$XTS)K=;%PyEgZ9F{Pgm3(q@Y z3i0`NH!#bX@LY4KocyqBROE~0$5b|^3aIRXNjFBbfh!CydfK1r3|`oDFVSOtsPZu4 z;WV{;MOWNP`1^(=H8k~-w>W;TTVL?)Ebm=N`Rn3amlckW{quw>U0N0421r900{Z_o z?D%1kz5to>`3M*gOsUm@ zmk}XR&L&8OB*%HN2uLpBnPRd9yuW!JmR$om=~+fsJQHdV+2 zQU~l?p#Gu)^x$AC@n%C3WDc(hGD%2+%n#ealK0;P8B3}uj8`HgLB^jMnuy(}nHj8( z&;N`}h2$do9;@kyjp#eAKx%W~S3jE)@6>uofXoBZqTPY7kTDr!3ki^ALKw1><<|fi zelh)gl^HAs(tuXvYk&+`WxHpa{hA=FAW~wmvE=n8F8*^5g>H5=lHHZwk@QH8nZhhN z5sLySE*}>?wiAFl!#^~r+LQKV{Q8iUsB@&ZAp3Jt=)LY~AeqOXln}VQ|a7c}s9wiawMH51i-c6)0m1gF9Izym2q)ppi45_N+UQ4Vq zO4B1hyu^-|kHvQG+d2k}W7f7iuqdqJsQJ&r@hbU{nMLQ7%wZC6%JEI|$eJ2|=2$ zd8LxX0+=D_eTHS|1>aOov|q<5tdW5QBa2paNfT6lpEbk;lgTKAvYuu4ACguRHJ~Q@ zf!9FuFlX%ZJ<`4}rR+M(g*}qomv6o%Q=k!=)>E430Ltsa{LvpAqC5$~Dn>eAm~5TKq9T-8+tsR|jy1m$b{Nk8^8 zHxuh0(S8s(Qg1(ig2d`wUdmcUAXV5Q+ZKGR)CCrq>@$Ky^BsJ>k0-j2D(vEM+E^Vqm0exroUC#K*q#P(O=M$Tl@p3Q%VX&0gt(9RakAZUYv}KE7k~3M8-8E z#fXNR+TWO2pb!`7X&I>|Iiv_@(C4E>-PCasM{x9QF$)6z}Rj6 z^p0st}c%(}}lb=MznvS(apOA~nzu}ZJdySDfqX)dk$TTsl z6yn-rM&{ol^|QREU{sB4s*PwD*9&twVF;~)`y336md~B=$D4(<;KK4 z9d9<*Kn#|K(o*AQ4sq}u83*VX<1^Y6TE$-`a3exDui%Ty)Bj= zM^~bD{wX+Brx$D4<%?MbJ!v7^|Hsx@##PlnYhMvI-Q6JFDIL-&-3`(W(zO8r3F+8$ zmk3CAr+{>KiF7GQ!?S?c#k)I5x=c4ENWvu9m=xv-*cb)y7*mO3E09p2pUE zj~qR}1jLyyZ;dl=U)+XV(me!r@h(%8Y0T)%!Ic00n{p&%nDr;)8_V@Z+Jg@$8}-35 zFc5^z21a%|FyXOkl51*j;In9E@CxH!;(#)k5BpaFgn2(d*4G0!6&Ny_q8_t?_W6km0hxIAA?gu7MwmBe;G_-5NmAf@NRaIK}C(2}UePMq-gb&UP7BU281FZo1nYXgsW zdE76}b@cR%QF;#j{(4}&1Td9<1u$Ab02^_oteF6%ZtYQQzOmKahiUsNs(wdM`TY^x7QPQu z%mBCzireY~Pr=leFJHnE`VEoc$pbtY;f07oMlvq!vGpbO%6VI>^Cz_@h(D&?3zZi% zxBBo&OH`IF1vh_4>IRzK6O0#yJxC#@BX5ws7fu*YTUYQgXKA`mF3`+w#*vg+`#yTs z^B8;dVE~<QO3>m!siR9 z?U7118>)vZlHK&*Y;ds_pG5hk_bs0VV90SW_RmHRi#TQf62o_j-$x=$VzLr;;h#K@ z!!@NrsG8_b8tdzJ9l8xVq4GuM-FTf{1F&Q+5xdviHDg2CHyn`c#`B>rl9=LWSH_SY z7J+g4mB#JNTwP&QAK%{!vC_PU(DbNz18^1s^uPOf?+?9G^4T}g(tXGsft9jU>ugLI zS-A+09H^-Y)l`F7Y( zSdr(G7APMZvdLh|Jw8UryTwiR&h*FO}+S!=N= zUwOtdDi6DeIgB_A-G5w#9-?5JjnY2bGxvxh5Hf&#(nI`~tZ1E$uZD9WmQ`(nRS@TZ0XiufXsAGFaXdw9*U0 zVZNeYxz}llTkXpZS59h_*kr>F4__^j4(FBcz0##z^sr+&9|-8v9XAZxr^p36pd2Fr zjUSYDim%$_e=baIZ|`4%DQR+kPbT=oHMmxrEKi5q(F&4JmB~|lNsmR!e+>bIuxTP) zs#mhD>VzjW@Rt@XG#|Z5At&zeBR_xTfFGVqM;f{)=~GEdDz^JP{m^zp4er5Eyr4`&)_#?s()$?wRvUeni~j7duHM0A zBW6wi!wu2uuNZYS=XCJ$>vH~80|oy74m}92wAdl-f9U>a=)r}p^bgIuZ(Af?L$~f7 z2`7~b5`rd3mDlWP(Gy@T z6`KeW;1d+27A(TpIr@YX3VF870y7Wf;K!i{%g3RI2JK#^xwnfMyE3aRM-w59nl84{ zj8c6Ww*uXTz|g~BuYryXe9$}k)XJ29xgn2L-zO|v(lG+)8L5-7%vSUShE=ZPWwAq1|luq<}?r|JW5AC3Q4+1K(|_T3^paYLTU zK7bpd`Jdd7^nbV^(q-#4!iJQhpH~(MwI*+P5@SD^YO!O8!SZ1*m5IJWFTLY~GAed& z%p{#I^OtR)X?Fay*nAms zI4h|e!bg!#ahe3MLr}xw^3@KoOQQ&qHc$D`!fc{4(2#t@B~ZP>${r^lJYOOFWwW&T znblmr>7_GsdXv#HauGI)H!(+N;-S{-hZMsh=XXy0#$%kDSht?hlY~AUP(m|!(cj6U z-Lr*cOoMHxti1g5$!F1vf)JEL)E!T}P!Qm;OFkkIeq(fUFw*fmp50kA`qLhk=%hmc*+WZcFa?QsC?5SIUD zhp@QU+x-VSk#=z}>4q+U`MavCLBkE$Rs zQJsL31B9R>xUhGk0;sk83q)2?NvtbGS9FA33Q@h_B0iQb3|Yj415Sj5##aexZhF~5 zGZL#Nj2jHRei5W6n2{aKw;}L4?mxA90*P40zTw%J-Rs-t+>TNV8u$-J8DsJXlpXN6 z#Vm~oWq(?c+cEh@Hf)f${e9mfr1j;;KBzL@1IjnaswZ>0aC7`Ty(_)ie@TQaicYC~ z!4lp$;5mFfvfEYZ`wZVu;dyQC{ZGYuR=*GMq9{ZwZv!zsVjt-t_AKjWGO2O^J*11l zLmi-p0Fg2A0XZ&9tlMy|V2p!xCU5Ph;f9?LMk@kJ#gv&2Q28mJBn39ibz>2=$=5_` z0BkkA;%1_IriO;szo;E$jbf(ZTf|hvkWIsm<0^o$X@z*8^uv5C{j3^Ih_}L-*aWHP zhK0n^Gve{3gXp*L(gxYM29T!Is&yhRsMhd($TDuwEKa{bTl_v5YX<|qM6hs{rj_wc zKmc6(-vJN;c$G6k9F0)0AwP~_p6FTeegIJ9=}L?t3Je6r2n7>N$@Xt$xDQl@=ns)D z+lf)wI5fIiMl{=6p_4-qOqg$_$R=dEFpA>G2B1>5tsPu+tZKav#Hz?Bg9JSAFuq4z zFsNgZV(4wD@n{CiuBocPkUC)}f?sD{#-OUDXUgmr9r z-&R$P3m!cNx6woN@8fn|S44FKS$1q9i`!Umcx%38s7CDHhj$4 z|NVAo%rrg0kQ zNpIlRpa$A)m(^Hp!7@bw#7{+xuR31B^GXj_UfWTHS6sI>g6Er{3zwV!8YdT3(1C^wmyuovU=%VDe4UUr+O5&b2iT_8-2P%NdJ5)K3Ucc#BzGRC$?7>U}2Nu2LjTk)7nrKN$%Ct{(%ZyFa zwOY5h^t3E;LQM^FO*&#&Z(>BAZI4>XY!|(P<{o)~fxVXF!8&Hnx!`aCoc&@kqLx=5 z6lr@%1?1wB!DyFg*JK4GjD+$UVH`cz5R)mWX;Rc3a2bpdb>=^ zb_!~;B%-#l3Y>@gYm5ZTDoct@u~WcoudruVAG(&)>Jr8;3@*16c65W6GftjpG#(a;bN3zADv7H!eI z+$FZi#cU53+5_kn!ufV3ISdQSSp_Kp_~7Ik8{!l)w(d$}7->X`;ps5ycmq$F|T~ zzHpnKuHFm}V?9Z>sm_ih!TdE6a&0NshU=FTdl~CjUV)6BIivuXQ{o9^S|5f8I(|l)vS`CUJ(B@aZUWeX zY#@W=p0S@#tkcH_K)O}nNb4)HK-|w~0b1+Y^VxOL=d+0QsCb~#XY=Grs(-#?{R06= z3E}a(Je#fygRmfRRG_DXq#n5I`|~^bLjljIutY(C9GjtF*N@YKMxGx8yzE;@!@N7M;eT$=XHoYgzJ%5{R8UCT`3up4qR|Cl?o$+Xay+%{&j zV8t6(C2xOI=8eyFHCZ_8g=<{+4cSsJaM3uB`~+z%baco962=hutLDKZk3a3ta+f7@@AD;pL)b zBM1NCP4C?T-bHxS;rK{wdc2|OT&$&>q0qb>hfF|)m;|D|sS+@BgZHz98(YiyV;+JV zJJAxEK**+ZS&?N3I$k!i#u}j`qP;qrrW2vP#m=>G%vh)K)6znPCoO**FWV9am~Vkw za)Dh!wQ2jq#aVj6@J?Up_MDDE(N2n+UnCdrbT~iOfrb+e29oYq&wug~P5^|4?4l7x zja|cWu-IVV4UK;Fx#6)jATP<$eQ9>2WYVgPO+hDj z(PCP#PL9P3#{3I^e_)~Az)=ZI+@Qtr)Q5< zbIKz7kYUVA@(sA_*RBQ3DT&JXM}ya2)_*oqE@cOP!mmN@8quG15@g!Eyi+jRzUhG| zvV!ozBp(qd`it}}L_FfL1i&u5i~Ap_=6S^@iuXgiMZ##i>G9f9|A>eN@4TK8LU|Bp+Z#X1q{&SNpCi+&BKR)kLYhu4Dipfc94eEt1xmsJFs^DV4NOVkWUM*mq5Pdwja8yZVpzYp9T>7%;ZxaH*Dahwaj z?6|zNT-qvv5)CyW`0yIoP`K%{05%kum^Jj4=r*jPfaWY!xw?AO#KNSce0cs(nWZ=| zmt7|OFXts&V68G#v(# z2X2L_O3jGHa`7g1NA)X-!e;DQKewxq=rTn#?6>ak0_HSYP1#wURtvsXFwz~dR|Ty% z)h3NMIt`ik&n(Jdjb10X(?he@A%G2ZRqw+}PJ&uw7d&f&32 z@1A?C(n;2<^sRs@onvXVvB?TZ9{A{(XXMG4>>UsMmTOGs+zm-~tpV1VR5knJUEx~) z$bLlWU^#yI}hj!j#-|Btye< za$TVV8-#Wu8T%kg7RXjGg>jX}(bj`7B;mJ6+L~$aHp#}>pjzizcHtKp0j`&OyRP!6 zzjUrw167||vy0lFYus;N%&c6!O8EO>u0>qz%}MdHIIBsD;vp9S=HSa;FX^TSu3+K_ zE%)T(m$qxv>~q5;zyjDusvLn{jW@j`80Di%)pv+4HDJ^&izQA^9B%i-3WgaC(S8TZ zeSuG{R75-zt}hWH-C1JMuo2rN^bhWj;H-o_1aB@G4p3gIKxI>5sLEux+{o@2PE%zZ zH96{g{kAZr9yR9ts|Bwepwb0oAqZB;U6pU(mVxDj;7g_{@KIBew46SCW7794c{qMS z{Ip#@SUFlIINk8YZbb;u`i(Ixg*8R% zp)Vp|YK)*@@cLnoUdl>dVagBzyv8&dT1of&6F@zuGjEYld5;|C5MMFT_R(DiSV>^z zB}1||7}l`h)n#CemNnmoPalHo5lgI!9yTLQGlRA+IRxr*%C(!zw*(jDFt;4=Ba{Mn zcTe`gSvRP}ML=0z`@hTbc%>3X$l7BNTsB9+t0#E_Vt5LU5U0kMPahCN(x9Kqb;wgp z24W&bJ@Q*n_A|-*v4jVXGeZz0LC@54AVBIo$MtvbKyRNJ+Bwlc4p5Nf zrvN)<4a9aD4G=ZbQ*xkW0y22~rM}Vxl=o~pLT(AzmjJf`Lm~Dk@Q@K}5M2Eab5PvV zr}f6xAgHH!U2kp=T7AAI?F?#p=9rgE{l{6t`VbG$&*vPXvlij$>(Kt!yVV1EiOO^K zV5#za3Ixgi0%E9-3;@ldJ$)&QI1t@)a-hfmAGa{p-z0&|F`ixk4ep;0>VdP}|B;P6 zz9e2If2yA z1vN|M%e46;iScM36NfY=b(cqtlfFT;mztA}Q-(vXKH?ux_+KzH01Ed-a{cnRk_W?5 zqe7xLaZYw`b`+QbxL=c-+Dvlo=emX|@ZGeL#AB+t4>?SDW=;2B6hsXkoKNrb&)U8Z` zIevj9VNvi*6=(co#&A+v@NU2FGmtTe6dk0v87IDhnGPYuK2USQR6)|UmQYA}R5Bts z6$i9sTnwTLv0Ye~svb$lzd83$J7#g&LK_+V3R34A{LMv;b?#t=Jzf(Gp z5=nM|625C)FGh>t%kPHx_rSP;uGY;D8H_j)C{e$`1yldE;gvi4K?_eg`xN0iUYO>L zR>@sVv6xP;e&8Tmx3ho&s)_y2`E8iPBlYnJq1@titcLu>?7$nm8rQhzd|~_Ym4XrO zb*}{x{s9i#(l--f&_Ie=`!y5GxnDDMg zOn8lPZ|7d>P-*KXNoaCUzn_O&>J%VRdZ`W02(2 z9p(v2Wh1I11dJO@YAtFMm%K{p!lVz!Z?&R?Tg`Jw@4^xyiygVj{vm( zh5zJ)t4%y|!ZUDk7NSZwacZrO6dRhXR3$X1dqq+a^ZSvb1hdnUCWE@JYf3J^fBv4zy9 zbe2c{Xl)#2(rT|(rx4!}@Qe9>eqk9&t;SBX zc+U>fupKC*!PztG2aDU^QifonCdJ~?nhEIjk&~B+diY?ADkk)pllvjo(##OpMJBS1 z6WmeZb}2;CfD4-yyD%gp5)P2UpR|4jq9O(>79foPHZUJZgx7KR0t9&?Wm4Tu4ZCs= zqE#8L`BK1XBo-Z6L4R=*&m3yjh+35%Bx!73-+(J1gYm}bUg}fpY&gLpzOlcEaPqu! zUy`VzRq(8s6FMb)xeR}^L3k}B$roXZS@xGkAs*}#V%K+Esy*XLnn*8ZAQ-WYR*dFQmiNpta-e;wwI&vd@h9D& z*j?)92_L26i6;a$K42b&0-K|Oof06KNcca=L{1PRB<2eU4Z`gVIHb%}fqtVr#>My? z_~+~Ouw9_~r#ia6vj^ny98I5+12hLXQi#XEb8-;>_?$IDSTxAY2jDr|1E4_Mr{_E- zD@J~R6-Vnjs2#i*=sDy-@#}QmyE-YZb9&$M?Pu~j+XcJo;OsT{ke?@kjkW~A9aWK~ z`=*GQQrD6T`h$zFSuJdxR`+{fHOGd&ctX<_kG2J`Xd7+P)nZvIcy;5&~%W z3r#}vw7XG=`Nu`~jy8PIetJj3uW#%3(~QRAbJq`6FwBG5d~P;gl;!6K>+|WH@`9Fs za|AOIk7qH>4R+EYH{+9hiA^fqhtCss2*&48K$-c$z4qra5LhD-ynHP-n(;XZmWb_- z=lT`WMaK8fk(v0rq@<+j*~=xI)rF*R#|LqCjLGv7tFE8ZW#+5X^?L33)Ck)E+-AQJ zCBB;)Kd%{h0##rrCC^oML^78{Hg#fbz%gHPtkXKvh?TsQhB2Q)EmFV2Hm zV}Ji?SKLkxPLHl1?^4_X2Hhzed8^oE7Px$c)k%CU!`V;JP-M`~*$?FG4OXE;5}+q3 zE~`Q)_}T)$vDY{tS0SCxD@h)V(3kTm3^?bz2+*U0iH8@;S@uL;l=Fi{a*v&e@9@a- z&6m@aiU}u9pu0N>8gVnXz1rA}eo^=Qfr&$s1yHL*aYY^~{Z2^AJT|e&nZw~eMvYNc zizS4EUFqo;OW2;72|+ir_+G~cmw+A@=s8Ha?)fuljqN`ex`&NZ(-9Aq1hNK(y@mt5iUaof$Ud!5I5rz# zF9!GD8V)N_bOa(+ZvyL3b))c@7>D5;RIFKhJ}sA8DW+snfgwTYSN2BItM7x(Kr-X= zQqaf=OAWgza-0=Ek>_G6e-Uw{SF+8{H%wkoe;VRY$5z6s)^uAmlhxGs`5>{gazTI8 zo3zIQ1EQw6b;Q;x_<2?+jd%3z^Jjuyur4Zp8?Qo_3w5^WjuJVCv`o5h?M03Rx17 zegibiYpzo#>wR;WQtsxFa-b!dsGXE}T_u}%F_ZyaCL(3v?^0Z`Lg3fwc((EaoDa~h z-xRET^$2IZy)XAFnrcrocUm6Wzx)Y8hS-SysP&gVnrHB}I_4T^?tEp}xs z%`N{TBUJh__w1~w9mI3D8udrqkc^q>fi)&>q&&KVuUR;7#*_F$pF)|KdCZ+KFc2$?y-qpF!k1U+`^JLuw15_L)!N0e1c!j9rv_@)|bQwRzCym z|Cfy<^`4mIh|a{JB`>tRJvZ-$4+Y2R@=IpB2!-eB8xs?ibzkvK!~KY{qkca*Ap=y! z?iI?WPdmEeS%6PV?uVSinwn*Tuzk~%AHX@=Zrft#Totp1@Ih%AGx=UHx1`Q$@mOxd zb#Bhy)LFlW*EOF)Z@YF62m8e9AFrL`zMgPs8t1Tx+E$ycep#51sL-VV<0B7y zO`c|N^CfK++9X_XQeCOaZy>Cwo{9P7T4L#!1|PL`H{{cnG05(Rub4*0RV_1i{+)0b zlbd~;dB(!v1w%@EO>R#M_KH7DNT_8MyZeQJsX4BYA{ zoc+cp`o)`n#rW$=K%*fTH_RZncE|@^^Ae-n8TJ^%H`wzk~!g=j*fjDClr|Zwmv*M zrm!j)RLzBCnQZz+Hy>+Usc0RRU_&L=N~=M_7ncbVC(kssitqrZ9el>z30k?9y!c$$g7#_8*u_p zN=TEn0q=@3=-Y+`eM8nJ1ek!cD7o2PeO|^%u6Rvn3yAKT|3`FxlCk~eU_lV0R9GxX z#xBSaw94yy&0hq;+yhCfxm_U^&iZj1o7p2XQu){@jfdii*-F$eY(H(`uvZs<+j-o= zNqX9%%>P!9vDMP+>pQbSlWz_{Xx<^%YgQ5tBMm#J6fFK(xIB10diC=VQnm*o2gh!G zFMVIi2JGdUmuC^>rX;+bE6PPCebQ`yT1Kqs0W((?SO*pj^^#i7QA4$zE%=gal=yQ& z4n3bvjA7uhVNcLQRtN)v2#KcucpiBn)n^PwMGJEB@vyN8$b8)z|FN4nx?DY!R9C#6 zB+x&Dl#y$(AlYlZpvEs$k}U>#w+|u)7v0qgjIZ%DU8SdoR0oYC`?0;5%5 zZ>ZBPEL|Gy<@Yt-_PcX7E>~B@K8;o_-JpfPcBHw64!g!jp{gHspb(Rd*){Ny?^MPn z?We)xbCc8#3DM(`Ty9mDcg;lak5zHXGIHUx;3aW*f!=U5-Vc3qq{$XaZUVL*VQVm5 z4h`Hyx|j+Tbl2}cuOVMf{)r09$<7Eek**qEeOFbR5W9ADZ-Z9f|`%`5%-H5IsD z8h)1#y)4{427cdNWG8rnOEl{fL?|%{c)J*tx>aFmM$d^uJ5voUV;>EkBT(a^tj5@> zxJQ`gC1Y8no8c+Ulz{csaWu{R11FJurw8aioMD|)>q#ZRnV8U(Adobq(2HbL6>uQA z>y4h~bkrazDEp$lL%tNSlHSJrTG$@*45!JK6SeeF?iIVl*sA_cx|nUEOl4JP;qf@3 z^#dW4sQdn>w4Fq`i9$jG=y7#2xi63hI^H-td^t8_3!E896_P}s|JfLQh~Ab5>0Oht z=|`VT(LJZlhsoqIk`;hWV`tjJxL|PV@9v^h;ED`~x6t3vzSkfJFS7|PJoG`0_~5E% z0GLn?BBVA!V%Crl7-4srW;UR5**&E&o7GI6a7ps$uTYDhnmTou-8X zO6phQ%*|#H{W_1y-g;6v{Tut<+Bu!O9H3JiFsf#(E{o*=bc+AVj?yYF#Vwv50%cmY zPzJ}c4|^d(<`<7YLCo}*=)Bq}@-OM|i==B6K`yUYz<WE8#GOhFT z=7>$iQkLt}NS2KX;fLGGw_Zy-b2KiKamL3DLKD+mEP=#BgQ_@1vR2w#F{lxVJ*CFF zOW>L>CoR|lqmBnNmw6kS9s${r6LO}ktn&1@4l8O$Sbr|AaU*-^4XXMXnDVVVheTEM zxJkeyQ|8ERPRtWd(R0u=S=@k^)5(xjp8NU=StJD3r zpIuxHq4xJ0p$lw?>-F<<_yi;mnFC*D_G%W}6|hxae)S-VX)R8FAUG$q+B-G3+JjpA*b`&@Ul-r~Z5yHyR_L@OzbVTkN2w!#<)%U6gum z9ZJErGlaf~UY%WCO)`RhbE4g8;@UPC=jsg_vU-t4`C4a+YkC;C+@A$b5pfKWRs0*c zYs3ep>updIQ|=AIRDh*!K9i3BG>)e?W00%GhTk!tMo(@8)&(cb6=`x8ZwuoVObde< z)^cg0eFueysB9`E?pHy}U}})*W5YP#Va!`oEb}ZY;Wv>1t&YzUdLXv<^HZ)CR9-m3Yo1acS`$C?nB5|3o{-+gPOme~gbtO$6WX$@ z6fURJjB?E_Uvdz38B!`nqfbu+oxJlwL>Je_1;SW%rpv}9vnQE!{E8{tIe28(t#B$1ijDNWw)Duiq)EmP(}7*^cKFiGLba ziyS!f`PA`1-5mo5NtmcL`@oksg=t*;)x0*-S^tI5CqwD&k;#-c+Rl_9plSTX6sIMV z!L|Xym)`#lUr#mPQw_)Hih^G6c?!~f7GD98mkR=fH6#fB1&_0NeUY&ev9K_pn0e-6;Ya6vlUADym= zV733}LkJ-;gK!uS9}i#zEz1TLsUE}#tNCKLzyWr^k~+-g==hL0Z7D81;R+up0ky7I=++zpV|d`+pn*UinSEgEws7^BX)p z3b;l9A&o#GtuF$@f}d{&3gf50&r{fkfmlbwVu3xdrm^o?JZ&+6f|~5NOJ~drxh{$^ zXlrQ?E9f+(gz&_HBTDVLgYxF;9yJ}if?E2&GOIPU1q(WMA_>`I1){;Zxf?h0Gi{~5 z^D`y2EQ{X9w$y0{8N;@2{gj4nKQcdT-*2ZsEb+UWk1YG{5FgU|OXO3dzK>adTNuP> ziV4QDjd%afoOR&fZfCh%*q|PG!1rzSYdP6>+N^3iT;A`lWQtu{($KX>Z;KdOTAPP) zcbsb({HQ3uhWBHubkXxezb3E8aI5w7J<}pR`rE9@QQ5hzemnJ>hZ~m*THT?8l-ltP z73(%i5SFGGWA;qIDKtYIa*p;l3kLZo_F-Zqq?tM`-8N8jhf5^AO;p|YG32suXX3}i7IZxT5iw#J( zcHE^z$rlEu(RProvDEF)>Aq4}Q|3?MjN@}?cg-h@#!$h2Y_kuv+NwOM3tb&%-_#)n zW79@jB_DMl!E-pFblTdKTQX0h^csG<(NfJE3*NfambIu%7@=;U%D^XbnGxqFnC$cF zgQu>p*p@DSOC{pBDqkG!(eg5Ie^Ml9F&s2Mw<^Zo88!YfV>HkeeaXh%lIxeCSdj{o zF}XgK@)YEv&!2x{;M?i`1kWde%>x=tuw5aE9dd*lU8k}4t7^7GZN69?cvme22Q*)+ z_V1IDj;eg2=fAUYHhCuMOuL3>x&@>HM?5t5g0p`AHCUQ@ zPe5?b9LE*06aD66wG&+5o++1110Dn|;V-g?9BcmfOvg{TV^j|yUFp6CX=-zs=qnYR zKR8gsf9Gs}Jn&=;ZDG`jQYYiZgWq5|RU2eR4klWs9=$x}yz!Kw{(b88lLV(RuF$)~ zXnmds?TRl01>V4R|6(tv=s`#Kk_w!51|>MCfJ3E^cU;9nOQ@<}9N!=+3U_ws?qk`Z zyMm^=%xE&*&Xz(OaYpN2LE9XXZp|PvpS)+1(esH?FE|5w{xE!jCu?4 zpXZRWK;(@mYo8xx3g9LZs-T~G-QOZC7;n7P_n=-YhLi& zYm$MzA9=r`dYz{Z=%^!eF|3oh%6!ZGG2>s9mYrY!7F~6+#C452Fc==`>#|6287lqZ zyRc8*!+a-JfvF+^uPnS-E~_;{jpm3dXc|d*WxiUqR$gnwx$Xxg zcCB8Xcc@gmC27(ApW@a_DvKn2tL=jA1M|8K7ZjOzzeTp$`L8D3*lqmN5VD!J9-(~>*|Yr6bT%`hjc-vQZ?peVbr~Dn05@YR) z;?f8-OJl*Y9P#6(X60U`pt;LteJHfBG;x5hP7G1k5Cg_QJt0*X}C=e+a7y@LBib8U9;|9x~>k-;(UlIf0Gx4+wj+- zu$6k4q>#{0; zXS5&=kLq;DSokjKgiHZ@4a+Whkf2cJl5WV#UqiN>HACS<9vD379h{HFqlu`4B^@i9xSXuk{WoxpjcdT_B8vMlk_R29rCom#;AarPM+wv&kuJgb3o^@QCI{)4)yP$&vm5I3zp2XpOiq_~(tPTcofFxi zVjsc~gw27hPxa`-SDlX}ixf@b`QJk-R_B$%d}s3${Fq-Dx2xy$k1E??vU|2yg?E!- zCw^Kh<_UC4V?d>NKnp+mi6b;Ro^qxo8eQ;R0$)&}gCt}UJbnq)2Im;&NpW^8cj-L! zDPsSvM(;8$pHcFUUy-W7?DH|&8?m`)4NDe~frM~Mgea)|KqMuk+Mh(8*z!9*reY4d zA~~R>PW&<4Y`t)vtj;TB5e41l0ZLq>prbX9rlmJ?y`cWF-5hiHg89VkDRTH&t51BL zdiF%n+eS(7a9BDcJC$R#$eQj_&Cur#fk>2Z-`z6k0@7fh+ukkWOnCG_mvA!T@L6$E zRg99I5Zilw!4IG!NP@THPQjR?A#+5u``Yb{33WVPA-ZFlM;D-r47IvdxIYZnqS-B* zbI4Q(ZI6w1Nn)oPJWUNvz*&mUcbbgRFidvhYk%zn=70h$F3D;RIj9`d{5uY7>;$=z z(JUv5-^XH3Cv*^l0!SSvnarVAipHI==2xs_*HB&tkWSP^IEBFnT-eMpx>OA%bohPj zcxmqyfggZs*&uJ}T~8Nq2L@Vmv9Idjo${cg9McwgWeKD1YZRXhI6tPuaPzlXpDc(^fs`Wu6C_<(Fl3&8YI zL>1}+5Bg}Uu=xj^IHw+6O<4*?gVfu%d3KuP`;zk6y4|0G6{1qmcmhfBp^r8Tzp+uA zpd*uFF9?|dc1&feyw+%!Y!_7wds`~kXI5g!!sMYsX^fo@}REYeZZpb4V?V-l(7Ki*Ef9Nt&^tL+b^quJKhon>B z_diLeuA;YyNv9D(m$*!u+X$yD+I{?+r!G_v_{ZlTZUg<=!r}7+>smh>uGcH?VvAk3 zlHU!)+?z;$Bb-PJIjbYTTZ~!RO;m(q%a<2(##6~8kL1XQ5~JtJXBSHqABmDxMY7`K zrJ?6V-qoX5SFZCU%THx|Eyue1@YpBHtt*kuMtJdJRqTIrX8wn?MF#H2ei#lvi#r?C zpp&cf;dCh&oZ50_?6>coiWDEJ)!QqkWr+38XKv{@Fddb|ak@%Gkdl{){5Bl&MHXO*JA*JYJ+6NmbxP26p9f_>)JOUTA3NMn^ z9wEg;k+(I**k62#;&ds#>d5GZY!{T|p~@?RP{3;qFO-G5V}H)vF&Rn2vkC^p(<@kA zLJJLyH41)b7kBO?sAPJh=cVt$1J`N&VzLQ@11_!~2aZs0bwC$xz)FS~0c_?mK2^&!B zz<^x$Cm(uAcxddws2|rhZ-<4a{7PUHqMz08g#G?Jt)NuU1QU%mfze&Ff#F8e)8W zhet}Es*$OxktOmT+K>z$-^XP73>S=%>2N9Wyyjszal+Upf5&*;KQdWSJkF`h-*P}f zCI15flQ-n!K?wX2Ma{_=V7|={OE0O6armliufjnX+D%}M80!?v}D3kp=){fIc=Xy9E~=G zSa~;9R(^r}&V+pp9-}lxUfj6P6N5R|I7JMZj1D11Ztwc`#rA4Y&NQ$lG+yd`!?_ZZ zn*C-ODq*8fVPUkIAgpt4!gT+~@G{g*SZ=Cm-yZ4@zcac4wsSyPfHAVHYP^TVEAib= zFYdT3vwmo)N;D{56Sd@REpm$Nfi0s6)YB^!N>@P2>bjC4 z{NZUihSz;y`AV8cOAw~w#T_<%8R`-lH8u2#2+#eO05mJ`b^Xsx{!Xj8eQ{Jw-;X=^ zxeu@TNaqv~!Hae|4U$O%2afO-+&@6Cx49!stwTR2N%WcdY*L;#zEi=PeanNEk=Yn* zVQ#-+a{GtMM_F7aP+8Q#G41w;LlrC9>pJa<cQW@cR2#zUsam5hsF3qM)lR5;KtZSqd}XW*C&2ur%1UlAR9gJLu!26WSkm|5 z`I@KY`Lj;C6a1wTN;88lSFIu@8w7lG!|v$j55avxJwhdS6%Y)#_O#P^$Xx<6M627IX4}|SBq*FWf6~P?JnQW zM}TQ>PQi*>FYe2TOv9Z+B@*vSm1Qb$w%EcCm?y)83yI9dWSe_-{~uv*8CFNLZfi#% zOgy*~+}(q_y9Nms+}*vBu6;`RP3D9EO$mpc0tWcJDXQ7>V`q+%Cja_GCM)74@W%c&ib^f*33a z8OVa6z~K{}DzOC$XU6}#a0dCm21j&=W;P50cn0Mj*M+^3kgi4YL$^a!2xzT1njD|J zGzS|KJ&O+B00q;*3&#YRiD{_R#H8`pw{5d|Hiyfz7};wLI0Z;x&huf?OK! zxDuT|Xzl|dggQz$shavIc>dDbwUd0GZ=9}n&zv(@AFhuw?h!Jv+Djx5E!exAy1xY; zgBv#KaXUJHhpp4&Rd-^v;e`0Eh7!dgS8QmLFqv2dX54iYTZX3$7Hn$we*217cZquG z@8~k-5oT?CH2guUSG^#I5LVc*-$~0<+MplH|8l>j(Fiwh%mrc4u`K4Ox-I$yGc*D; zY%Yu0+!5)%`hFA3{NPyl=={ zC0ZRPm@ss2W4Z}-iSuFI*I)GF;}2Fam)zy@S3vVPG$PYl3DTs46Che}nEe#5X+tBJZMEQiwsE0jt4*7~(pS4Hm0gDga1cn0$^X)@-c0Q$I=6OB z=zIS@C3u9^TuX#`2?Uliz(5uCraXZz(mv7W(K0+xJUVYU} zWJ^P}UGBd;h*pziiNJx{9oQjNN%a8-+UfZ2K&?vty*#njmy}`R3mLWGDq45E=FPHp zjUu1Yj1HTL^ zfzfOE?DePbbYY>PAIXQJjCKMYg{eth#PFb3;B=J=-<;wS$cSJ9M- zMW|U&?r`U^0S+%Sk@=;y11sX&^Ks_-2ez==jh=q3cyv5gZj-VqZ2A7GYKg z9r|gWVYCWvQ0GG+vvzZX&G2Q|>UfA1%qHT}PjTy^5|QAsWVF?)ZN^+MdYFo#*oOsz zh1sd3;NWj@?=TEs@h2GbtAo;bI4cnMXx6rAA}SCdyKL(bm6fFBu8tH(mm3F(8<=rQ z^k%lxE@I_1T=ciFMM9D$e1lFDa?1%v#s;!Wc%au;*anui$q;^$h79yx*=3y#Z*t`C zH!Xa7$x5MeZiidZ-VJBI1_)Ou96h^<5dtVtQ*fni7l>~VKmJX(W+KcS$}ftuA#Xp zAvDXl=vSwOvt2fq_brkr^Q2zfYJSr7pKLR4_A#(Q!hO#;6tCJ1zDW0+t09QLtea>3 zXnn#m8{9Hy+*qQMpvLj1Ftz^&uEXY^zR-|M?XC(?!6Bjmx3}N20|h)DXY{vDgw?y| z;#7x=CGQNJ^U?{D_Nty!A)XJrI}A4jjLclSN8re^OLYDVxHj<`cDj$a8}RpN{> z=^C{q89SWLoS%@z=7jxLdSlua^^ zFTp5BB;qwU=}tF^u508G+{Z8pR9F>OY52l9liGT~RjxalIyvSo3YhmJ=dTkM$vT#- zy+o_8DTmkfYQ8)~iLlp5Ua*bs0f1OSiGco6EC3Q3JS0-a2C4jPYAlX2IRf4 zmPP0Z*8iSeJ?b;6BMi67S76{aaRR1j5f{JYO=eVe#fllBdp ztl|wAleUL#%IrEiAXk+P@vOe#a4lXrp~$C6dmQ5CE;B?My8p+?PhA6#9`f;<@p+EFE2T2Q)*ChB1Bq*Cb>$fTy78ESUx{1KY2#0B@02f zhf&q8y}RNhpGCg-=FgSD;}o_u0jm;N-a>t$`~MoI-+BXdRDog`b7&VA6PHU!Suu(Fx_JJdG`wFhVsE3l?c&)Fkme%yQYUml`&-9yg+w@&C zru6G^Q?lY&*-9OJG?$sdV`LD`CccXBQ3hPijGWKi05gXyi+}t*!K3BwviMgZrn+ka zrkB8SfgG;x(l@?K{A6bbOaEz6u<6Zozfigq9DEtg+%dDSg-4QbLjBG#2HoyTs;{4a zpk*%kUPAy!6sI3TstF9<7T&S_LIqLz+FL@R^Q95V$_^#I3{IWM%D=KEUi-o0K9BQ6 zUHV89`75t3zIH3~P!E@WM=SaQ$4gnBdSiCmVuB3Cv8**AGLUD>LD>79}cfev~bQZu8@c7XY#~>OF z9hR&WpQUm|2qL^MIp%1qQhCe$2;cLVFu;-;?jwx zHsdvXgeAZ6hIIMpN}}(#xgKRLK10^GTybHm<=Evq6<~c|yNx=t*rpUByq;XHbp!)0 zr4m;)O&yGva3iP@YA_|Gu=v>J7ar^|jvnRo`&o zl3t@){#aQDbRBQ6ycQYV>|a6}#;!v`D38_3O_c;(B2vWSvuAZz$=^vC7^)}!Kt-Yu zx1hzP*#e8o1YgTD;q3!qX-Yoc|?rm!9)NUW32=0++2(BhRn1lSvg7Gu#(OMl1vKRq=#X7HU>Hu77kMj!!xd->`;`ZwkBlxJW)`VsDG+-w|?T?2O}t*I{Mfb^1&(oEPaivJ(60d6E8-$qd6vE zT#nugny?RA%3W7E9dgcRfgXpXoQia2d+Z0OJT4feJz&AMQXbGVWS=81VWsJF`&};#wgIy+W<7xo$PcR(fylqWv^U3kb#8t+w;*_g3^fwo!Sh$6A9Fo)vY8kr z8Cpip5ffU)P;|1W?j@T~IP;IH_Ho&(t~^ip4>|;>0>H|w{JE{FeJJdTVOQe=3*Jk^ z&Jktt5z4H1h!Zb^Cu0$6(aTryt|^2;Dp+k_ZFABiPS5`EG*Ah}&IvL*LXJQBIBe;5 z4k9cbedB@!sXG|Nfg9DS$WdG_q&Ri|GxF6_^IViV;KD1LnZYXkJK<-{i;Pd-C7h^oh zwPnlIo7%=t-8NCzla_f!)s>!U_NVnKx_sz>S_XD`PPK-#_pSEi!BU=s;w6^|OLb|* zuGafXt6@8WoPBq)ioC_2F~hIq<#q&G6g+PGW=D@0v)a-D_^gfqR;>exP$M*1qBdH4fIX@THAe?}&RWmze= z@8+$lYw4qQec+@8*~{DWU;F#r_y-9Z)wzFPUNMx;%~jcyUYF-2af^*Q3^gq}73z8^ z31x(MMg#E>I~(Xy0>^X(f_vzx2ZGyVoO$|RRz=YY{K8Q?R?zEZxf^P0h`&6_EQt|l zxw3^{zqCBY1Z0+14K@rrE=lD_q7DV7?5Q2f+uZq$`J z67|+eU_^GC5iCHJnMz5%a_<}vor1@|x3ihK<1wwWP@2r|_X)0QI5w}zbAXsAiuV0s znZ3fH2GgM3M!s2W)jUy3Z)(FjewS#K=7B|JBk?QrRAa7b>{1qq(J`xON3mccG8-|q z4$^vMax>*>=jhdPJZ65~I;&U})pueNc!ZR&;9W1nMYs@Hfib_TjJI}DpkUiVu1H&D z{?J={SsF~l7!%U~4eMP0kQPM)CVW|WcB~DW1W_q-_ys%W0BH0c@(&0(i2L#f3|Hu- zOit`Cj1dMusI7iC-Wii))nJIH%H`*L5D1f+k4>4Q(@04!3a-;@UHSNNYPyXh4#%UK z7yQAsHQwLf-dAtsjT%fr6c?X>K+18aXjn&AQ&1mtfX`NsrA+hrby4y*t({gIf;1eZJ)E z90kW>%B|AF-4fM`?$^K4tKlLD6MiM`S%C$117nls1lhaM8ux$lx-|Zl!CH1FKHv9r z9yN4b7x(cAewAVVr8tgiX#=(^?IK+%-A&u3&-F$sY6RM8^!&6xk;bjId>a^RN0bPe5#a;5!T;4~+WU ziq?y&APqkMfCi- zL!4cK$|rWdEDE1>STnYW7F?2>G$pUf)L6!W{$7PK#+-=dBSup6{czM&m$UN5j2RpH z#}8ibA{lgh8m~WL@DlTu308bZujc0Y%8i(VlI#+^tF0)J!xx=y2JND-!8of}R*#Jw zP+=%%)g)}Mpc3^E?5@)dCYNGdCzZ;9ybft8}6oCN@!B1cweqBK*C5|sxC$DP& zFpmHkGL+dw3RV8B*sWw{stMzIAJk&T+j+rTl`yI)r@mhFmQ(5*GhR`yy`BbN_k<>S zVH9Y3IPYR21}Jcn@8%wQlo>t5%^~Z+<2tsviNuZkR%eH3lKj@!gn*vyF3+xr`yQ@6 zUyej>R2fiNx>$D^n872Z6ye71?#7(PAc&AGRK=HnOo7Qu0*T0wmXx{4(RdNGM~~cL zwikG!4kW26fS<`cxpujC+Q6_Z@t;u{2J}qkd9v?6IpVe&VLHHd(5wl|4qsN6I#Q|= z;yQl*E))SQar$%glTVho=?+cD4mLO+V?3Ohestc*^YA#HjCwJB`PsF^3EAGv9Nn%m z?z$YGEFtS^IZD$o+2Igb!SSU}fF;h~r@l_E`>jMyz`WDGAX-tgBdbu<5l63ohATk^ zuSEXBK5Ewpc)G5`66>!SIW_(M)Oc7u>rO%jgV9dVy;FxelDzq^9y^Wr8Y3MA>{fT$ zq3`w%l@@JCN8QbAWKR3N%{WcvrewS;QAwllqoxg;q8>)q9a&4`q-=qB4=0I^zdHFm#8?wCitUqyZVT$wa*Bi^=~u+=47czT_m72tP6~& zW4I5a&A<^RRx?<&M90&-r-h&$tnptl-Ggqm)I%wRV9C72OCVkx^&@tyS zLI~7=Bd$RKaKtHcl|)};j0FATh(jCb#LqZc5OYt@^}m5B!D`ufa>U`xR1;#(#_XYS z{xbr*7JJx6m1L+4bd+Fu?T@Q zergxnuxsLc8WAwUYg+2;3t&<--^8l2ScH1L(33V_V^e73ifCiK8pTi!3jg+MJ}Tvcx&F39!V0>HDOtpDc0u z;*XZNq7_&DM@w8p*0)zwpAvgo9xZXLNyGW@PnNjZCrjK|F<^;%BmN&t+(C($PnPiq zsL*mw$fG50l0;;(qn|t?GBT2)r4r@SaV6E6eR5Xo&9PQ>If-|}{%>ie6nT_G?5$$( zng{LGiMs7#9W1U8^`j+DD*~HgNCDPX2e8D!EQXmYB>rQGGtrk^H1a>cmzxA;N&ziq>BSgIe6VV-?Dps^`+yKh1GPFPqN5r z=B(W6`BJU_Xo-{gRPk(y-u^8`w4F zQ{f7OMQjB4R3F!6mAwcetmkP>V|vCHohpDLF^H?(;mDfJWp-j{2q0t zpC##laqU;rtm0<3czg#OjR=@L9tC3=Wd7OA53}bd8loB{1>>4ezj0~^xFINVKr)mm z^oO*KU&g{4cs>+EJo3M&=jl%wxc-ay?$%svdvd*g<;HYB0P(6z;g| zD6@qiO^aSF8l)=4O=ILai!oMvNX;@N=zH#P?l@Z#DcqQ1@C8CJz}6>Mv?&t5L;zP`G9kYa@jzOBjBy*P*9*SR&_sNIFIlH8 zP1iHvxz^J}V`Kq88sltBBOg8*oP#>(zGCqDP@)LM)vi}x<8$!{9&L=Sm%fs%t=I4EBW6Bm3nY+>O({EL<;cd-$OupkTRE_vVlytTt1ji%UkAJTE8!7g2BeEhI#? zYhUemqgi8|kww;}#r3v}x!Azzb#aYQ`PntD{RMkBKdq4n&FA(A+cApSY|5hIDlxp7 ztg*&7Uw?9h_fKy;2&O)$0Jx&_;SRO0k#rS%lYV>M zJXc;lDV!dhfH6{=DX+U>_?IKq9F%vsN7{XSG{sS;7+Dm--yH=U7RetZ}=ox@t|_TVaEe?PI!O%!}9 zt(9-^_W%Zza*H!*x!hGZ;c7}pZ1`x(0})qcY9CCBweR5iyLqVVjn!s9SA4~0jNR#X zhp_0nW(w%mgW_aGGqa^ST4^|PlE&zM(k+fylB!gTPj8#OV*!*wqJ@#J@}h46J}f;= zU3PrWQ?%j!WG}*Fv?16NN$!0kd1sv)Q1Kmpxg-UGpI5C}Era@b&eB8oZajrSYoY@d zdL98SU4U za}qD7KzBkxng-43(J&z(;h97r+sHG*64CJlWdapnmy&-gzTrT{m%^#!$0iT9-aE}6 z=?NekOX<1dD{u+-_JDLhq+(eQCcyv2ZBu0Z%%o4uD#-790)7iNta@ zR-_Y+>ejUnxhmlbK@Y6PpIzxMRXUdIo2Hj>5fMvVXDzR$8i{>t_wd4C`GDYE{YAFG zdczi)IAFxazNEn}U!*fWh#M9JuPCwvH0w7g>vd2WTv?A(7;6Y|_%ka36<;P@OBXez z@{kwMeXyP-erlIH%v<6gCBi`BYtlf)*MU;SHwo^iROe@);+tvqRPm)s#yvJji0bIW zlmk<2{b|xWH+;pwOnjn*5xM$lVKf`OkB=NmBUjzlHOP;6!Q115cJxo6$qduSJOiA3{uF$WL3DU%`6APedx5aox%I(m zSqYhNRij63kjPi9aZADIF@CG-&&bAUOpv~IM8WZzJFpl zMVri!sQ-6p|D2-(_-~hgy?goF&{G4_jhp;-9c7VO?>HyD^m(YQ>c3{wXq!~~fywbT z+3|w#wP|C@Nmx`daiUMcE2m&)B<*!RuL?RDp3)GewfLfqBgY@3pgh80-*=Rq#Oi&@ zV(hjG)n^nufd5y8q!IAC`p{_VsMQxb%PIIQeS@ss$3C^gU5at7Dc8VBg?9PNUwdig zB}m*A`RBA`sJsL8oU~gYk#Om!qW+)BnDma&7~O6}DZPR+Uu9bJQ`gq+ZcQhrIAOP|kkm_ObiaB%wDS_+W2TY!JZ|SQ z@l{hklG__gX+BOs{y*Y*S%rJlcw$Mzc>1ZH)Bt=d+YqsYR(^nz3AFEL9+w=iQj6% z%G4zYP!WR3CvB2o{l?G`tY_UF``J1HluXOshR7)CXVP^BOly?H$vUngwn^BX!kOdB zh($AfGsStU$s~61f^9MWOtXv{d|EKqh~nflf07_-IPT@nuTTnQSFA1H%wM0v;M;e& z`Q0Prn!f_UUe*V*%~&vI(`fOi>f>cZPe(%Bw_9?>>Vj4jvC- zu?xX3O{wTAI5tP5CV)A{2{`n`2}a_w!VK*^!y)8O!y|CFX#nI(cBw8U6X2mlZ=#lX zvH3*KGx)YWZ0Oi3)AwKLn|BrIuS)~e2?ED@D+?w7Nw4>c<_KLGAn8R*Q<F_@?U;_YqcFMkY>;mn`k zIk}%lQxAO4;i3_m>ar`e2LHX`V9F&=O#i;kcK-XCx9$5_6YCF_sV!2RZ=SRb76Oce zfL`gZ!}J`u|Jf5nydRAP{l;K#p|k>PD#Idj{y!y_vGPUPc&fK_LzpxR&@A` zE5RP7YMU@|NF4Y@Fl)oVo{YCvuM4|t)iYae*T&Zhd%ddneLzQ@MRiH%RtRX!E@0Kn zxU!g#Pi`S`djLg9a^XjDK=l&^If6F#xsot+2~yP|+3>uCek%Zrn}w@q>ZvG()L&wazEA z8oGJ!qVGI3Q@w3k{s{D>Bp+N_zsC96OP2=m%E6d|Ih-vF4e2(;!V|v)8Ye|!1VsGq zvg~RKx&B(UM=N5@E!XhrLt)5X+Co21tNT2qIh64fXfCZ5pBa@w9^O{if{Co!W~qi! zZZu|DrZdrtlL>)W-=DtKocpFS(_I;xmCrGHE57B$p2KwMCvj4aRqhnPj$dcxo=vkB zEPOctW@y&g&6lxZ1pN3*36|fAPDOlt`d?<0eJQTNUqXlN>e437;XmQ%l(&hDB}#)Y z9C11;O0{tN1gz7-DRo6s{cz}ti$dIvD@r(tvRM&h-k{TL6LaC1_;tj^AQvimpg(zTiK9njcl1}xD^7Lt@Zrp4wPm(;cfYDM(4=zl5~q<-K! zZQMx&hWsvD)j;Tbhw!9VQZ|OeV~o~OY9qRRPrTE5egD~6u_&~@-7@Z4lpJf<;_@di z^#Nh{?^^zlqs1823u0jQtPyb>oxNR)6rgq-@aE6Jo1lr&7dOU=A`i{>(K|E2gFnFU zV3jAv{}2MyG|w?^o3$)FvNgA8epg`nTyTPVB1aaRqSs3ZoaL zllk>Ytdz|6ID5{wM9jd>ij-IqHSK$s_4$iL!Tp!MrWre?*|va@_UzU@3PQcEZ`F%n zKk?Hxyl%4GPM#pj_Fq^zi+VR;zCUjC+=!lOJ1?_s-|`6obz)P}c^qK=oG=B7Abo((ZSfE!(>!D{F=eN+!i zT{2{JIrB#ffKQ-r({=*MntQP9Q}n(|Ec6I827>M1J*>W5=QVO(_;lg*^oCH)Y)4KZTGT3|#(w9JN2aeSrjo zvb=^ufAR0!`H6fAu-2#`3$n2PFwe(fBAzL&Zy(L`m3|;{h=31Z*)N}iL3(DMzg>Y5 zgH%Q!(Lfj$VSYb3^8rFD2P88L#0oL@MMAERU4rp=#;^nXQa&5~k6S@1kV+olOCT~E z3AVmq3nuiLh#Dye{LTs(I5vF;X5(L@|Nqz*5&`uZrT+DA7`$gz9AL^PeGa4kg9IFE zw*|uikw<&|roQn4M&#+*>mTl5N}pQ+t^j@(@YEAQh+#nck7ut3u&fi$KmBysilQJ! z2!9X~TKz{jkofaaz)u)KDkedQkmVqtJrro5&(B9ZwOuh7iMbvh0~Gtuje5KvQIjBA z2vP_Du%#jd3IDUf5TsK7odPuYpOZda3Vl5i6DZ`l1#~SSvHF$wAou6n1)yY`pLYfr z1iX;3G$b|%Qx_sieTpdPx%ChLV`~KY&I5vnWQHTXg)}FFVC#h>KrYYM_jH(kIdC(1 zBal$*d89zn|8s*i2n+Jv2MHfC_qY{S=HIOVa^dNQ<3rpcfgABl79{(8*tc<@ZO9o& zh>)8|B&7O4dC<}`R~O*omObzCbS%(HLI_bb5()&kQrP+&RS@cPXL)+MPd(!f4Uoi9 zX@J(A9x(v!SE&au4rNdGq5iEQ==$k&u}t}NkheZaj1Ute(CX8!k8FhcFUFwse;&UX z=;iadfv2PbA&LN+^CuMOA$b-cujdT_{`aY0Fg!iO`gm)Q_Vcwqb;8FZ>J4o{GS6t^ zC-lNoCrD2QAwiHK|2Bfp1BCW`KH%z9AW;wiMltRM@_atkV*~!%pCN~quV5fu-k|3W z{MfPTfj-^%ysr@Hzps*J5)v|G9~~N0kK_w7f8M&s3C&RtylC~$Paf#8Mv$l$5Hy6o z_2obJ^B@d_{M>o~b@9(hpE@saTX-SqF0bCyvqpme$Su&nAx{s4C>4pZ9_Spt&%g0> zs~(?xeMKs0@%dDd86bscH1ld6Nb7k&;NAG=bxBDFdPr9RNd9TV6u+W9SU^y!RO0*%xg%<03P(fG-&>5Tj30d=()N7HAo2NA>lztRzVi8 zn+vufk*gp{uz?1X>7TN`AJb#4I5LC347n{(OoJGcT=ry{sXTm%+1YFvlEj%Stw^`I z8?(2g+oJ8U;Ojs`=Gv)B0JYd@%KTT^C*NY)z^NztRBz}Hd(rdz1+tMj<98Ya9P;46VgX@fCDS=wDn1aCke(p*t^ zMan3LZgb7C%>T;g*NLkW_y5X2Dxl3lmQ#9jx!wS!gxnQ9HGKkj^Zsi*$gDD($1%b& zY*ZAt`h=lzfVJV0>&(mW2!)(2XEY>wF~fV+BD##meKV#YIo#-;rN~*h%GO0XzoF}v zzV}DGJ?S0RD7q925wyLLolf~$DEEkARHtUBl|DHooX;kAzIDl?a{zMFjHy5Bf{%# zSXig)60~SuQZsf?gEHe9wQJ%2pcbA^YBS_$97;r1ZmQN5>pDpuRFnvO%6~t=K4R2z z(N$E>5dMguM~;Z$!S5SkF-2@K+WmM+_z>X{5CP3)A1|gemmSXUAuoPy zI&`YMwjU2*?ATh<=~B&dW-hI0>-Lrop1HyccV=`PEeX-eeGhmk==IzWDDQtGjaZ%T zcXxl7fQM&BLLOv!M~gr(&spINSPx8T0qa5hF57B^fdN=s=V(KAX}5o#Uy7b8M{6vd zco2oOr^kF%P7*PoJ1T|sKx(pj!&4JG`sz)s}+sSXgRPVCCe>d`bSL|C{WA*qg ze>fbi1Wt3?GoY;N1#}*7YDS$-A3x?jC(|eql)8|q0MTV!lr!)#KYc=y_C3^aOtZ=> zbicIV+o-+HZ_F&M!Kl4q+%uBIOWDB_M8{8K*!F(W*&z+n&LfElWfMy-p7|y8x)eO= zYRz=6@dH%@6z}3$VKrYz@III+t$JHtLw6N{J-Z?!^j2r$Zf2hp$G&B>(d6M7?*eK;e&Z%9`$|3`xH6aIXNq&RpLo%cn{tNO06^ud>? z+z%m_<$G?qfD6#&0TH*~vjPPT0(V53eC=iHZvtKgT!0sL?ECcDfkAC@=WOF(v@}F( zz;m!ADNH$N>fIOKFaxXUJw9qwd*;La~Z$JuiAN#&`Ye-)w zht)t;`?qXx{7G6g%HkBZ@_U3s;#o(qNyt>D0B}gyVGoty%)i_T8@T`+68MZqlU-o} z;E*)@>TDsvSG>eBtd442FGildm~9oe)a=UyBl>fsrX5_WsC#lTFys1bv5K{TY);Lb z+|pp2-)Xe6Izo8H{JvC?!rRT2k$rYi{0xzAm-|(AR_#+)xLLe7x7_#={@ek6OEKK$ zZaljr&NVpO&SueN(peaV4xl| znpTuuF!oZ&PHmVuc_VZshq@hgjn0Srv19!+?$Qmq^*JE>uoP<#fK6xo?P0&A7S2TwQNpx!1*i?F0t>6Rl}!jnIl4>TfN<2q=sli&`wugRCxdXtL1 zZ|;yEt8X*La;J|LLAC$a64=8Is1^JRT~^b(i?Hgat7mTvOPw@D$-51{ zjyadJeqi8R=T2&Q9QYhe9f5(*UK?LMxgXm})v`gQ&t!^es?fS_R~FZAeUb!C zu?AQ`$G|r#G_xQKCyvlU)ONBGBPeQSRS}BXV+#11;rOWi=v~|=>8b&2N>PQimzebL~bDQ@!q%$=+03#pihJL>n27l1sNA1V=KM+7=3%!oeqWxIm2U8;{V)KuADAZApXP>!uFF3e$ql4$8fhHli?FYB z;o>^)3!`-AQH30CCHE|z#$act=(r=xa_ARuU+uk5Z z!R7-{OT@p<_}?XPa5>*-1`Ir^KP+)HhWm`)$8ZyZlAMr#l&M4F4c045|u$o|t za5!nve|xaw8#aK`7T`x6`IdJ$s=L;{@k)8*5(S`N4ybqu_o19CbIC+s&>4v`ROxkRaj109Jzfju$$yDiGjqZBI{jC0Yzgh&o z!wtZ8Sw^>(c7-;&!%lcqf3THtHV;@aguX!R!@f*_DfvB~(~am}j*sHsy;*AEcCDTd z#Z0cBeRSnpfp4^*+16eJtSa(lO(ctb{29)ZYJY;*%` z!*fWCHl2~@2A(QMHz8o*K7V}bcpp55UZxOgO{mbU>agXd@Qd^SoPar&%rFDo zYHs`ngr6oHDI?nsamso|%a6wNZ{(Hg?D!n*3w3yN@al(6SIR+Sk-Lx-TQn9e45pxmIkxor#cm`p)AWWB-LtVUaQ$6SlgwIni_d(5*@TIb+aI9@*V6`5L7`5 zD3Wj4(qE!usqN{JwS^?47b$tm7Y?)606YWq8z4GNdN(a^4z9uS3;&@vY#F_+VDlHx zUfsUd1L*xQPOPyTj^z1~_4`+sd<*xcW@Jaa60)*1Eg@#NpVCm~?oRY#BDaAs!tLNg zqMKLaBBBo>PAoNPF?D;S_Gxsnv+1wENEL~QY7yn?yR@PcIZ5$9b_5Y>S-v-yps`aiY5>tOh!du{N@LUsP^M{#}t8bATemn%Z2I*4FV%$^e zY=S%3?~(3%7+05XS?&iP2DrcvcqMC)5A0xw^(NTV`Ig<}ZF}GY0RNzcD}aHupw{Vt zoM4E)HKxC&X$yd>3rwHT>yv^`oOXcUunkZ9J~1zu44~j1_kRQVSOiqj+%REJo@U=q zp$7liSYL<(`}w&X@dSK)IzWIL7P{V?3>NbI%TM#%e>Yfxg)tWS7C*N+{%uk?I(oQ0 zX8q!KUHX!}Q0=XfQlK0HGVVy~)-Z#-=7_KQ3Wuw6#x^^Eu`x^i&fZYKhhgWcw0D7N z{Yh1ii=j>VG2h2opo;=Lcdm6rQaW_uL;ltJG2h2HXk<@)PxUF^$H?T|{lED>c@%eA z14*=63p14T{6wx4If~GLElJmisP@)C55JZaoPQdPmK~a(g-7FeBCOV;?=f)lG{1)J%={{`0i5(w zHh`0+qW<7x`<=c)O-QH5x*;uV??F%)Ch+_zns}>Y!R~TO@#u%-1C`X^lk8KN+@7;nsVxiL;NB3}f8TrtD*YF<*6TWUSR^ z{N6D72UFXF!J!ON=@*IdU5mD2`OgV|q5{2knI7e2d@$y0Yusy2iX;P-Z~^6;U&b

`N9|z@0}LToCS{8NVM#~eUj}V#ipcrO8BFEO!!+E zFBz2vt3iG~oXplAsQ2&Q6jQ$F5D7g4}y-7U#Uf0dTiD6O8&g(xCM z*c~R$moWxrL$cyPTA~gf1>8`NwT{#%~v9?VcgaW%5 zx+5dP!@EDqlXsluB=)8T1rCq3oy^kb$b^PsfH_@5+_kV$WQ4X}Q^1*p%uA5|bc^spr0da(v;gYa(W-p zvCKK5Fgdv{zu0K8?0Z&(Ik9hxRpz`;+I*>UY-k!!woFYHta(@0aNl3Vv<$~@#O3h$ zR_TP9pSa9HB%=8&UkIy>D@Etf@VasCeaoA?L5cavh=)Kpsi^R`o3$*sod|*E+Ktf< z4@SzT;7N{-eyvfy?p>cE-wq+UM-a`csY#KUlw(Au;Hy*)w4Aqu>WNS8xDj!|P zX3i5XkhRVjgXzvMTqKRssmbdHGQUUMJ~pA7J)`97N$+x(N|Z6i)ag8P6RO%k)$Nvv zyMdVBlHopx*9(s}nN|2|++*47oZo>SPbK}#Ba)*Si4dJ`Z zaeR}Me9=Egx@|_Wu@7-Ul$Elq;B7h79B6KqUcZ3dP>@|>0 zw_*fK1kq%AUZH_xSpp$@$CXH!kR~SJf9qcrG!687h6+I)=*}*!z3S+IFXbfq^Djb# zMDcutrE9gEr5Gx!_Ino*(f?K=TRx<@h}%<))Z8^rKI96V3+$XPERsWgh&fIk?;qM) zXx`?DJWBVxTx!1`yhF;wYll+u8F*1lrkWFwwHjSj_#-)cbl}ruq}zbW|KaK#qvUMD zuF+(av6-=L^)MORwrzVlW81cE+qR92ZDr<6p1j|8&UydzTE+YB)xEB&U3=HHi;oqY z7Vv<&#o_fb3pwacU%^Ome)UghF`*k;c)JNRC+@3NIw;h*sk5~hg$2d1Dy+v^8DyR& za+}hgmgEx;u_l}vzUq!54Kg*FAEEoDQ|L1oC2K}vfarhy#7DK~1Z43Ay#QZ8Fa+OE zVgVJyG{WX|7BN#{7=erunhG+PhU9`;kT77#Fua88HxW$uwDk2N@|Kq3!Y4!*+Y^+@ zX$-M)+O>SE(ih9}jf~ONQenB%l5(?HJ`QUdLl$f5x$pRst7>sW{EFX1NZW%9U>C&6 z@@SdUgHd};YTd>6sSrFs0-Qj|K>?&YESn~#)Kh3R22*xk)Ax2f^7BF~*D#@zkfFd; z%*irTJ3$Q5avDBRWCIQMmIV6>~VCvE8+A6yQnq?@AjH>0E+hW^W z0QF8fMNgs=Y4Y7JWX`No8^L@lX6CtG>qrJYe*(5rRB&n1&H%4)LzILpZS4~z{x`(9 z=^*dGO!-L&=F+tv!j@djJr%Gm`5QnLR;zroJ=QAg3tu{!h&!gf0iwY3->~%Ko(q;= z{04~C!7CT6_yp~UrGWQPN{4wX0cO@@LKm<({xS0Plmm(b%W37chl(%4nw#DlT1yHe zTe0R-a%EaDhQWXpr#fRu8Y;Dk&KPtk%TiWzVBAT0Wpf2XTUh3X3e950b0iQh7_o!O zxVgmzH+UzCJ@@t^Fj?TBm3GwDyDcqsXRE1p>N1ekqHE06pv$g3@=R&V*!2&DXPL8f z{|}oTcB{h`yruYn<9g%=o&bLj%)8kjmn|EEa?{5xCbB?v<`1ZrdV!^a*%P_~+nAmF ztlrf~xVaRXx~lmn$Dmm`Eec?TeI_B`Sn;fyD)LK38t>tu;LJ?NeW~7Zq7_w&#(F06 ztTL!*2W{72Of2M1N8zY};donwCT!a@ zvRZw8xn3=ky97*HiKlfeFWi3iC$?XgB-{g!utiJjWiLcVMC3T|6xKi^VX>7!F_U^w zn1H-4n7ON;)~UpynTyS6(wKvuY$&&85E@_N>TS6^j$3IWt+w9SDot1O&BI!wt&bE1 z?WAgGtii8P`ci6VVYW?HVFr}2%r%YDbA^ht+pNH~#u0uJQIb?1-2sCuO&phs4wb%3 z&G7IYH3;kY2ytl>A$kEL{9HJ-bKXh$yExEy;afv9C+;lyaMh39Fa2#j#HAGY*CCQ@I)^H{Zl1e$mMT?&Qk-;!>VY?Q83Xjp|)@oa;YFr?ttp7Wkdqc<0_puormja^EEI@ z{ZEa?uaWQD$B|8Z+sKy2R?r0PkCwLw3!1RM-eu!;uv|E63Tv5e8YyfV#U09v?mflx zJ7maAuQ_PcE~VrxT#Z$C!9I}T&S`1XxbOyrbv6c#>e8o}Trv+yTqd459omj0b%52l zge_wi*yX}L#PR~qq*%d(_HLk?#;DgI-9XKfca-@;jJ~|Gdu^aWf;NH_~;B z%}7cVeetmb8+ng%4Lk(g{D(hQaam`L!M}WYM*B=;3H$#i)chVZ83uV7rBv=@T)%EOaCwD{wfLO@o$g+pLhD_c;uw&%1@$jS`KROFT{xZ z>#O=1^8Xu%n}n$FuR7_|QuV*b{ns6>NkI{6<-d8FJ|T(!KiAX$Gb3>mf(}&8zd9t> zPdf7NTP7Mo5dxJ^c@P3w!XtY4;VMiUC=3a4cbO;0;Ub^NrA zcu4CI3;})$9L^agbRpOX zXgWop9TMA&y@~PYBaGH6C!1mg3wP1O)i8 z6htCRwMb6^EPHtzW}jWlq5?x7>=^;**p*W=jtWI^Su?Tz@ znc{X@ck0Ua^ES%ZuH?xlK=Gg=rkbZ*oxl)~>t9r2!h407+b@WitZ9AU zq|K3tf-xfhi)#4(qMG#A0LQ{5X&5_-*jNu+gVlOBvgC~Ii(=ItLxkn@%0Y=Z zBs(jnb*D*QHWwfn!l$-F(Wls+qLOz~T>yx`|gQEABf} z8ML;h)9)ZUD%X^Bns0^v@!<-EsUn}onp4n(b=($m;BWtn)7ucV13L zDdD{MDfwzxGl4+X1b$w{Jw-ge-N+M?=As<1e^FHe$*L=-;1A%Fs(!tQ+{&5ud?a$p z)$bvk@3%gUjDEnysD6ak*MN*h{vs8VEPj%|rXu(eN_XtIg?vBWxHt zp2!)aM&wSJkh>W=hl_thc!me8p{zaNrD- zw_dgNw=OtmLAUxEWc148-CH#eqV2r71zCa;o3yU>ORpy{{*Zz%U3+eH%KI^;U$c} zhjarIv4VrB3NW!H7}-W)6_sk$BiKo|HC#0~AK^*g1pYtv&f~%dorL(hsZH}AVs%m-^+|ce z_(8L)ekzskeoq2II>i+e%jZ=?Xi^d=Y?0znN>CGc(e30@DZ5$#zE)Q28f66kvcM8|dqy$J_NpDE|Aw#|o;$7P z6U6-O{#$XhlA=4R4&zmFNY$*igDpgnM4%o*76 z+QW%OsE14{W*@-q1dOzVgWYJm{g;#Ife|Kzo*|mAD^u}H0n|Nn2+m|NW+s!}R|QAo zrK*s!$nt*c?X}Dz8UDDqTWY=PlH3uh(jT<8g-#VLeDw0EaG*}Ss=*NDKF3@fM5w8f zCSZ|U>buvarwJs)RM~APBp-G_Ts`->2$fkm%b^8|irNHa>H{gwUXYRUqfbLVd3DOzpswiW8KP_${R>6_evh_TSOU3I%S8n;S*UM{1^;DXYU>-Ng zrl-8Twd*LPyW^E-PYnv&x(NP7OdZ2uF*T`cveXCv%;Lof1MV$YnhlhhFk&L5%5+3yeo&7(lSeBt$WToh}Rbputz)e#TN9vi@>)NUt#IjW&>Z**{f6^F90>6Nz30W< z>q{S)!pzXlvE;ruE6 z^^R1YY{HC7u5Uk+)=HS`ZR`VKdo_X{3tx>&$YnRq z`H{q((|q-O(o?oQFvp@8P4eVy3m0!c+soSsh=>OkiPRw|$=ilh@EHg)Em_WmS@gdL-wdht0+;!fGO~0_>;+xXw)lOy zfWb>wRxh`V`1)Htr>P9=-)WkCE_XdrN!hQw+Iwb!U1HDBtv`Cy{GwX-lYN?a<>)t> z7_7H*hd1+i^|B|r5#aLYzw2!mq=i@Ixg|QN&$!jSKdwg#PtY>s>Dw+Dz4^<#U=L); zFaP;#T^6JNL<*6ObFopjXq%_rMk8ZxT!py4fF-&l^_}s7P5*2G%haO5g3CMSD=rw@uSd=_C{5C55x&Vi80zrf(sTh1_ixJRa46#c z7^MGz;b-Yv63yGE{PryzYVM!zkuU(}|91VBlw1do(S#EPweYWzPalM)i691w@IOK+ z2}%94Xd4H0^{;g)3Jy2vR{|6gutW2ktD+M6`;-J(lq4Pr$=8rzNH9_UUC|{l${YxO zUlJ0KMndN3m=Vcz{+h=?G#HD%+C(K6G_*inBP}7C(+l-Qt+m#&N^6(b)yMQ#V=^1E zIDXN$Znw(~m&=yJx1voC{LZ_HJsHsCT-tg8fz(JxP&PxvK=x-1oSyqM;F9|vY}|y& z?6w}Phrk1O9&4Ro2Ga~KL$)U`3!YQRz0lCI3gT47Hlt6*W18`ot!rpxqI7TY#!qxu z{z2HNDU?((Rrz_8n~eJuY}>YEo2WVLatiBd#$bk?Ri})#LwJCIbrSJ5d?1d4I!|GC zf?m|pZ}??KM2_AWU4C^rpq&8OO>~t(uul%a-!?cw5k!(>l0@9U_5?J!nctX-!ImNr zg=w!J^8!z2?8Et@LPa}*1E`blfGL6u83}Yzeh4};Id8?33L%f1BECKR&o%Pe-War%aL>4 zeA4+S*;tn|l8uMX$7iO5XOgqSRldasdYk~(49@lKtITj*H=&+qQDnjqi@rEB+&Hqr zcS}anI3-*MNVg(RAUgneCwk~K83hu+uHxZK$Yo4C6zP^+W#HozpejgFBV8;TLg|>P zvEeH1Lhn*1?rUl1r*`ph;5Hc@hZ`v*!>AG<*|^+|tcU{P%AafgqiucK|3YczA(Uo5 zTX~2HbV!ebu*m?U@zL0%da#2s|IIrgyqLWj1kT?v%X~5lIP<{ib&AtqA??H-02sxc z>VEhsjx-dhq*}2D21>q5!nQ(p##-N!VAY_Pi$-Qw3Q&DXRZUi#ZuspYP{M!?JTvX5 zgh*HI3$7)LA0m~|!hm-5)UTjxb}DDBhM({s^~=h{{d9D8^^_ZWev#}}fGZD5%43CT zUO%^I3*hz!>hPctgp2vkd|oRRrKoe%N9KKUs{amv8^0O0enEjf<@OKFET-B7@+yS? zpcof`=w0r9CY+YOP0!ViJ0n)rS~k>WmNvnq$~$8-a1==0xR*>X*s}yZ+}4Z?I=`Um zoPs}bye1I{4r7y{G#E5t=&PfE=fd{mvbrEagMujH)+GDSB!3AhN`e7HYQ*kFnsD zic8|mFty9(EZhQ9xyIrx{w?JB$eYA2G9fYCQpuj%qKpL{Pc@MyLOeeR=W%7-@S2$7 z)HArMd*=2dS0Y%HUbHmjvpln%fK!kf+sl!MaAznYQ_3MssPIpcb@c{6wCAs5KlPT- zKs~1)H$7^r-x(l%{2(2_eH|!+@J0`F3wxvWPU*u}7JcjOwg3@Ou50k(+GMyYoVVDW zq*f1Tyz?IG{><0Owo`3Rl8_zUCa7BHN-}R<HaV2W)y8??C3a205Y1A8G8@&p1(dk&CYl2+sIkELXHg>Re8O zvjOTgU$l9ewNyt$_}erL!D|ozq%w`%Jj(Uc&P)G z&TpM)AiH@M9pY_AImRf1Z-PivSwa7`MBnYSjmP;c_FHCKfG6j(5HP30AG~9IrA%g1 zReSSQtM^5kjc`SgQdd@1y3J9>)?32Dv@WB!p06kZ!is2;lhuohRK+yIs;%<4&1z|K zA8ln45jTqx+u2Jfb0kyh@W`=}?=YmN0Fr{ri|)#m19K#}dCa)RO8l0|q*$#81~SmM zdru|f+>uwykRXgs8pt^q%pvYK?peZ@G~n#AAMd=1%4L;9?btf|iAc=(rMb!vJbbk> za@d{|gyAKE^^B8xk2Dg`)mKaBoFKGh*bxJr7GvTheGGF7dX)>h^lG)gt(nhVw=-j}a>x{5RodnqwdVn|BG>0NW6 z5IhuzmwvwG^i9m$@Dv`k#8KXc(*pMCnKpPuQ(ODi&_QoLR9m?(FGkL=`MCP+QPm+% zR_%+IJdW<;!0Zf=*0bt~`#`@lYb822Bt}#A2F8;&{Z1Ru9D?74*j@UR_(kN7?z7oN zN5}aHn*HB>BhhXw%-J4B6_!Zg`bR##+O-k8qOHR$) za-K6EfpZ{@i(Pc*)*fq8gdD3yW_|x#gLHu83DrUgnvP(uLDA zgN3ZXab$h%(8k=pOc!JRm>Dl&yUe~D+i^Z63V5BFG1CZ5ThHuu5m6JBaf8yi6Osf- zLxyttLn@1(ISM`K)35J7*yEYf4bqCtdmM5uit#AOizS=WSsr#H?@mx`t1pHa;FJ}o zsaj%c=!Bd|enP=2=7j(qlmcR@HM~-vxs*Et6)2X1{7@+a_{HV|m=rH~k1SgF}rt09W+W&X}PSg?&^{9BqgJ$l#Mv7<0RhSLww0;Wyec) z&m%twtF6`8MyRL1{Jr18Y;sf$B^y&OxPLRLDcVNG9z=p+T1MUCod8Zw9KY^z1ze3x zgDzpXG_=-AL)0K=o+wq9kYm>s@GM~MJ+)NZvqvvfPe8{TNYKhK$(X`|{+8UQ1{FvC zhdBmoV<7~jq(i#I$p;xQ#PlM%6PHHy=UtWo)wVG;Xub!B#qe}hQCq@v4z>c;!oHe} zOMq*zGQomo2UdVfIc?-L%=zQ~3CLD0jJqICQ@E>nYN;Or2sUm|&C;%+gU<6C7sKH2 zqO0OkRXu;KLTFNU#G*xpC`Iu1xSvh0J*^qQ-I{cA?{LbDW-6z`PkYp?V#Y-6o89v+ z6k)e>w4&3qj1pXIc=qpWyBGzJSi#DR{sy=GVgFlaxVTM#F}=!7H0d{fFpzhQ>=B|^p=*hihIZP&N|L}N9fhRC+x^oBRHF{Pw zhcCPAbDn{T-ZO02Xp*m=27C|Bo!=WGi^|Hdf6J0hb@#Npd2*v1`bc^2?J#^}N)(xo z(_zxX7!^+*6@>WVTheAH$))XwN*0FMK&8BaQKq7xD%O%5McHU+H08kSRqVKPrGh4y{_5fDYO85$DZw_z?Kq(Z4JQKFJ(`V zI>%BRvXMZmVI;cpY7Tw&{n>7+P&hj(|*Hq@W7)&$|9lSNy&62R z?C>Lo8opQ40Uo4Az%Be`+c67crvxdv4L%0rb? zD;l$`ZHZ_LBaOw7NCq zJLOcY3@VgV4@^UfD8JR`9X+t&#BA~eh#dtb8Ceq11cZ=Mrz?|xLRXr@BfMZDhtSIN%aC@xiwvkI2c6b$-8KENpDu*o>sTxE zNhyp;fmq^VmCdn@0}1uCmH8F0A3woA68`%Pz>O#AfEe(A3%#GM<&vAVykAnBWx~}- z6(5~}5J_NR_^xceb~Id2Q0_AVU0@bruY;6>6>-ME>iMILyMw?B|IA2#nG3tc$hxJX zyHMS7m$aZfft;A7tA>SN>3mySUk1Y3I1AVX&e4np-V8@vjcZ{0ttg9Yr+XtE*Z#e)1&IEVz9%;Zo76ppqXRy8W?BBpSVv&jgh!GE%0lzvTs#J&#hZ+zvc&IxMy;z=@Dr}ow{ zsCMoI+k<_EVPo&@IVNuv9syLw?&bSlJS~rDdV^4$*RYf@Q)}RE>F&M9ywNp+a^SZrcZWVWUWD#w8L&73G25cLnb;(RP+`$;ftDhvuzYqEaY=^gS>} zopLQEWco{WiR9cd2gL6jfQ9sqhA*PPfY5L4|(0mG2 z^Y3g`*Y|&hHbq@PrT(k?Z>-EU6yHDT&VR+mdnmGhQ!#%3KM!kf{>&gj`36Ptuixie z{P^$deD+`lDp`EWH!;28v)cl}8H+L7f6YrU=$;g~_LL%`hgi~)5sKS5LQ$9dTei0G zWk`Pre)wlqFxwSQ)^Dw*yi*)IuzghtmnJ(*KkV3=T>04ic*gj3>WasQ(Ta9w3i#y* zLX2iYeQed~sqU0Xj@_wsA6r*wQjnf{n8vz=0&pDyR<68j`CL4?s`*ga-leoyLG+Ha zpU%@RHPO<82(6x@0iH`ncpQ-Ka&&t1;6MRHwt#9yR*TaS#f7`03gE_#U*1l#MItp~ zSQPeazIwSCnqU0mA{+gZfE-Sr9k{@EX#z6a^1Q-sf(}%gDYIrYi$Us_N+WBi@F9Ur z(RvHu>73PJW1QsD30xPc_!2pIYh%@DzKjLH56LH!Dgq`w*kvA*z6?M;P2IQAs5#|q zF8@pocW9gG2r*yzTf!#|7v$N}R8JlZ14)IUawpdELN`bh3|_G`(u6X384Z#qo=x+x zrA57gNOZe4kfam+h@ zvQ)pr;)fILOVV?8k+?c`UY)c{eKhr?>C4BD2jVj`Buwy&DHv}MlCw!;CyboXqBtgQ z`sIrfp$BioHbCOTBF zHT!9|ORh~mZMD+@k#PhEapV0yW+L15qq||b(yF7hgo$u91R`Zw6Sqf%;B;WISFeV~#x z2rzaQpib*+o~+y2T6bJ~PL_2g}9vj3@)0UjVR;KQjD-?WHA? z=$?giN*9utJ7WM72*vxXAP7MxyN4s;nQ7D!JQUp5;~ISn;(%XRai1*&)!5+ly`R>y z+c+Vd$2zmfWEnQqp;SttMWtqdb0IjB&r2o<8WkMFs7Nz@qxpJ@Y#Rq{su~(prgUQeDQ<) z-+{UE0G7DP6(9N#@oywcto#hZ1ORBbq;Ll4e_4de7@(E@1?^ucpV9cU(fnV~{9F9n z7p7AJ7;{+C0!Gp!%98Nsc_w!ayDv35sNjRn@?r zYTV+IBuUn@kf^O_%ug+0wyoEXa)YV2iDFtd^Nt5@7Q`-u=T}Dp|1{Wq?7=aN54;(+%$emgxhb{%%?OeID zA&L8nBgHN+eqevOi(+@**QkO)X8QpdH-?Cpf8C&dGLeln3l7)Kn;X_mDq)1dxjq(uI@Kixq@`H@vceNY()2BR%|`9%rZ_-Zi9 zb*r*fe}2U_pZ}7p5AJcfv84?Jwn5%Zrg&UlY#^h1UB2Ssue79OC>-1|JM64<;d_F8 z5gx2hMlS2T%ixjxTLOXFstERRz?Z|H&wzUS_9@CWD*siE}@JRdamC~}nJC(kD z33-ju5uyEI2*zP}lrAXxOOU)7mBfet$Y^L`TJdsh+{W74oGzc--`c^R3VN)pFcB4_ zxk#yHtTdDw8V2bFwGkoyoahY~)zM#Cuz7Q@NQ|Gw&~#__1Z^P&ZXx16#pvDG#(<~d z3`7f#ec&Da;H&`C?6=OkIOj(#e)Q~Qsai%o1|v^ zmI~C5Fu@8VLvrV{A-|KG#(0@&%>8Amu8?NVBe<@`OVG$xn{M|@0UX1WxG136>9twyHlOn~uW0SzE z-sOA$wnV-m3d}Lv(8u-Z-CK{;2>L(Bc`?3iu>*VVO1fDEl0< z)K%q_Gj+ZP{I&;2gIyajtOGLfzG8D;tQd?m~HBe1i}BFvoV%xMCh6$#}}vUGVFpj0XKdGv%+)Iya{r685c0&)yasoL!iY!o}#z%HK8&ytFK)fPGN}FFO8W=~qTU3v03q z3vOa=Cd8n3@!Jx-tX@OVmTwueuLXM209LDanZUI%5e8KgvTVe&gEtPWrvXL1fm$mNMG^5Tu6R2ZA`>?}y*`&Mf|XIdF(k#1Yz z+fYr%t2nq_+P6$gosyXqm!zXU$nPQ8Lw8=kx+=gv zkc_Wz1>oi@7(t#IWs3UYnZ+Um%MIR^@u~TqyOM;&_)gFxpdWF6kbqA_*;$R_uO$FOOa?FuzVXO@UoZ` zhXo|??b9X*c4Z(J-`{AO9@VpiI9H4l^~nN!%T(8ohEZGHEbleL_tL3y-qDI|u=+#k zDlc*XT@RZD^do;8Xo3qSHA;y7Lj88&zlHYp6&N`GEl^i%uQk5pp(ZOxwLEj&7z{|c z{Oxt5Tr`=}rch8}m75%gpv;84!p6MR=E`vKb(p?rCJ5#oLJXe*Roqcl?YB)T-|g=S zyiil(ywslnJngKlZ8dQIa#p6?y0?^=p|9U6+D(2e7uAHcj#{fN{7cWdx%p6-o1{&e*AvtIfhoar984{WB0!074<;V>={Rk9tSu;H#(R!<9dx68;5?; zO;XNAZj?_C>Cy?fz>YD{LaQ7x2=rvdqe`C%0t2X>>I{b`q|XfliWu^lij~G|9oi4v%GxKH>XW@I1y^$DlYr1d zG;r{X66@L}Dh2sE`_WNRX>dbVHdg-~(Y_%x-kw)HzBJR4vfD-1l2$Vr#^;D~3~3nQ zf}8l>4bC&kv8eES8EVf!gN}T9V9Klmbk@>Wqf~O1(XL^+cT#iqHK?ne`}PO4fGYc| z0|$ARil`!Ol_!W!vviGkck?o*JmpS%td!I2Vm@|5Ikr4kjU6tW11@va_rwEXYR2~9 zOG?izaSU*689%-|fdG89fmPaU(C9z=9kjv%HJA z<1~6S?}1`2h|Zea;jpKOUYm-z;aKAnW_zcA$Btfn)q@aWO}oQmikrONj~ZJPM^wU= ztJy5H_uR0aX~g^}1KRE_)OS4Y5Qn8!Y^m)ZXcrCO&mbRKop;@6cCg+r-{QYO z9AS$~fim@cfgp^J?wLc20QPKP{v_Fr4>l1Lm=Gru$+8v<`9S?p z8Zsqc4%S2O7oPZ|kuPEpKXclKE0!MRb6prrEF|nhJN0^2hCvi4_kpiv*nc{~>@ZV= zq*vzOcDY@yS$Na`Q1ijg2XwNg5X=_q($Y~*nwR5)Iel%;4X%PFW96N0dQVJZ|N6Jsiv3*{xfEhB1)F=M4x zlp=~yGKvSitRo9tDFHbK+|G4z^7>UXE*;X|!XRa&4Jv#R#AnTs#aEbQBAO;GC_WX- zDD~LOb^*#eI>t0aE!W`|a_$gL+A7P-MRDW%~Qf3`hk{#c<3iN&NOGmNUCG; z6ei_76Lappht{wnydohjsSTlO^R9x98M*QyZmoChohI!=R5d>xG-|?cOL!=Qsl=go zpB~EI5fRnt(5d8z%_9s%^9CfL%or!c>C=`LA?! zL}`WW6WAm8l7N&o>3mwo7-sd6y+!_6KFAS^F$5_6&@T(?!EK3%!6*r;BZv56tWpt% z4H1@PP`ifw#&l&j=C3?TP+lh+9hSyMUzJp1hAwttN$)~j4w=G!{!&mSm{itJ00hyL zuIyQutL`uw9#$@}qs1VHdP|c{D(t>RJ1}8${Z6Q>7Y5QR>Not^=jnzgSI2k@ePk>Q zOK9$2tN^=a2px-W=5`fB`Ppr&LS>gg+xk5KzE3l+zoF;I+}L{ciIcPvWl13!l6J*3 z&Sza0l{wxrSBxmt_8|Ji7PZbH51HL8Y-)^tJWBr>JAS#CcJnC{tK;*nxi>hb=C+~g zo@gzvn}7{A*MtP^Z)nE5(xi?)>oK6l$x7=L{XFV4dNGYkA+L^yCOA(4w|{;iTaCM< zzo#Nusptn?$lW37LN0L)2uNR7BS#5p@~o&f`C&E0Wa??-DeW@i!oX?wI$!xC%bY~2 zR5e}dH6eRghA?-ZFpG0zOQwHinxek;7{Uu{NkLm1|dt+Rr%uS!*sG0$$gB*oBQFkrQX$170VYxCtjcYlV=)&8eJ(Z)}+6st=lJC}EsudQQiByv&1LJJ(M92KV$FFGOWUe3xakQ%KNcixjK zM04}v{Y17XlosY@l{wA@&YSOlpW@vZ7S?GQQ}i1;1fjv zzY$4;MjcOU`MG=vt?~v&Z|7x$)+F6wucZydQlG6FC5(r6q}}pkQ|!T%1kY*nGv-go zJFi0RJve?WQAQCRuT2_Yf9JkmfCF+&+|zpY=z8psNkuB#hr|07QoyReO#n!T)@*`& z+nh&fB%mVjfW|^*ITF&*JkJKPv2nB(gfY))=BeM2_fbQi!rtDEc#FmxA}3f)zA9@n zeIvn^>5K(`u^i*JU?5h)8d9n)%1ys1nM-Lq7H@UhG2Pc97EF*+C8AbWKL=K+^$#0U zmFS=x<8lwv?E&kxOo}2j8iMMH)%nP0b=P!E75dXlAk`u;ripkY1-VhF z)aL%_Yx}uFcu3_YxxACngGHQDwC}mWqDqwGJ$>fuWPu`B_j6>=(a&(CAb-*{sHCc9 zl2EzNV!j2-M$n1oj?Fz(BN0e<$8x%-DNY$6#kv6JP@2~9*2ZysMSt@`afgm~Go#md zo{$)gkq9B=RWQ)#4<-W9&`tRQm@lt+@HzW+}QZ z{<+K|F*>n#Q=E?A_5DntFzb#nA1( z{6Ad1V{~2LANAWb=80`vC$^2oY0MMbJdJJJwv$GUZQE&#CXJKcJiq^aaqshDkFoX| z-?jB(W9>OVGs(fqilR2;^TVzNYWcTOTJhob_Jcd{VaG0XJn^{xk%KR^yQHAaT)%2z zIStm~=V=@0^&Cf^Jd0x6GyGAd&J^suoBmA3ma_H-43c%i@6t8I#B#HCdD>+Krscj8Md~m+vVnY020}aOl z-P6ve6#9}+`R$oNQuoVVzW6Wcv-{;lxTGxcYq-MhV{C76k%CnYmKgDY@!+_yEXjWicaM#u3S6~i6G&fjpjKBFD0ebItu1*vY% z^0c;{QiKTB6vWOFPOST6h{*db1@)Kc0BFe*5E?+x40oQ{?v+nbhY1iM@D~3?_5eQ` zU2}9VQIH2kSf-dc4!!I^6E~H}?mA(Mr(u?joVbjHPm*4-UzrSbI1H>vM0vRW9e(UP zT8$fjV)%BLjjR#TQRFOF8nrBkRY(Irwa$76b7Gifp;Z`ka4=uf1|^Q6rCWqsE0-P% zYnR^3n>y|ocI}u#=~OHOfBdc(0iFK(8NG5Zx2=Q&MK9&^Wm#f``S#1OHCP^);Kgy) z^5>tT;|DnQdN*wijtQ)?-Y7o!Q3v7XcpKVt;k*40R;aKg6HfA9ZW8Uty;;$40a6yn zb6ZUle49cSzT7-v4q>L>;ZzZgQHp1Ov#uM!P!2dI8dD>MqHzEdh2jF|D7$6v zc?pJp`QjqBu%dvKf^QuW6n?mnA})(@*#<{A($sikQV%3KatI*v>g1n>&YE@WNgNoh z(snzu!F%CulBUfjks{cb2kFUmam+{7q6+UijJk?3|4UH}dIh+TAKixp{qT;L$}E{# z9Hq}px}O>emBN;?U&B}&C0`z$Cl|+?AWwTKq&1a1Y)k=@jq^}B_noRFJ82#^x>TEQ z?D=+s6c01yCpq^b$BX=aClw;ds4U19+oK;VsD3A_C=M5jveJiF?_<147+3nC$^$vR zD@PkfkpGoyp^e{|Spa3^m&-SJl0M&>@{dr)62n$YNkLkz^hj@!++UINXQvWpYk<>G zZyD|&F;^FGp`O*r@GVA%!B^h3s^ToP8b{vC>08!A&2i24O5|FG4HWL+%ZJqbTCS$r zE0gPvvUH)V31_4YWd6|0A9gaWQYXaGF;~X&dHlO7!9+KdVw!r^n<$>CP8>H2^2w2; z+zkHO)^8}D8YhO?6}O!QhSpsL-EOm-OC1D!#e7U)JM>#_Qw;D3WzX}k61+h#srb7` zQ%JB`hLr6z@B{DnzX-**JJR2nH10?M=MN3rU56StjI6u8f6;d&CK&$=IqQ~Ozr*ah#a{V)yuIY9Y!mngM;};)sS<$ z=F^^c1Nw55%N~pq@g^m6NY>EbdeP0V1Vf;9N!y}Z<93a%uez>-+LCN1#I%VtDz1+6 zO2=bKr*yeb^oeCRgigH5x#KPp3)vJX)gAJ5lG)VCVLXNGQn_R^#b%0V;<;2a)EA~h z;J?l(0%7Fxt?g2|^2%RJ!zYfs?kNjIsuO-sAj)9iWHwA__wv>IyBWP(16v4T^`(gO zPjG(+GbydwzrSM{k=6S@A zUQyn4L=C#rbj)lW3Oy#iHmmA8kt|_6s>yZ6>6OJ0S`qZw(paoPSj>A8mo%LJ03)Fj z2h`Lf5*Hf%5fFf3QL**`Q8flZVH0ZVheiw*1}fT)it$e^&IXM(szHt+Ib=q67 z<_NcA7Uv1wt4RoR19oD@YCLUh?{%v;yI?nKJf#m?b)9SoTBQQI@<^Eum(gP)D&sEO z?SR$1aML*rPFKwbl!6VlV0*IyL3E!_XkI6~Cp;7mV~I5mEg{b?Gy*eA;%m1^-;p^2 zb6p}quT;mg+xV2jH+%mi`s228DgQ9%yH0gLuk_lB{`e%xueBR8J&C`!B{yuF5(m^z z009}i7qq8nv5DU|2r&+QX*W#1(88+AABa5xy?eSBUv`YRpNPYLfdM=)A5jN;(%DL; zY;VC>H$diK;d-=>!IXL&<)Gdhh1D<{t1h&U;n#9`KS(rT=>WrmL1D``f&&R0*GSAK z@q4MX^gy{oKW&J!b@By0Sf)@6knW zUuqz6dLWVx`4F<0*Zcnd;qwxt%!gff{o>~QE$RFSnNY;MvP&FDZg6|fzZ!#z`z81Lel7OLg9Yi_4{rc3qJGzC42M)|9&EX21_aJ|djsiri z=pNchbt#oo94FG*XUV?FW|?0_*k{bZ9Q;KjtTR0Je8(R-Z*%SP*BUtoH140?9Wc`P z`Ddnxl9 zVycRysyp!bGOSg8K%SdV<;JqU=Df03C6A2{>%VzkB>1>mrmEd z4}DeXfP#m>pd|W(I<*g08-+v-`#oWJ$C3GGJs7?7K!EVaof9Q-RFM;eQr|&+e6IYh zXLZpv!EDgPsTI}o0bM)X%B&|Z^RVLmlwUihhcQJ@u;LRv^8mo=i2MGH;w2c80P2Wm z4pO1zTVFV~imrF%|W4l-21fMJZ{HW)|XF$u`x3ur9N5M7Q z4u)pI2JDq2d$3@z>>ce>;0up14CQ&YT>MxW9k|iqMO_&$vLuXK857fE`Mrni46#j{ zHh(gZb%fV0nj1!Nq~RIWh3$}{Yq=Sjb)>XOPBOA_c<0&a3x6F?GWW#0P4#cE1|`CS zfB%+P+5`X9sLB*-`!{aTBY){GWNgLiF_^Zf;WHE{bst3YI*1b`LSlG5b8Rj`Kzz@!xY2GI^sgTOD+=r5XLK#Fv5;1CcbL0i{5P9tb=m2mFfZf2DVJ}$ zI6k&Xu=&zG8|GK<8BbeO%iPNp=`eWHA@Z-8+c{Co9+8DlCxUzSpnUy~9@5>(9o2Xc ziyE7tEH!u8AF^ zc0_fZ-4qrnd zprWve3`Qi78$@F(B}gA2CD6uV$QJ5QMrjll@ff< z0gpc+uzO-#?h2YM{#AzNUBNL};*a!^sT3uSMS57@Un$DoJ`mV}TiWA&w@&rHpXvA0+)_@K--DKEQ-#tc{D&zl#~85NnXGb^|@XQ z^OqbOGIRbd`W`qm#)R4yJH)Y*HW1dzS3UXHxe0a`4QL>&5Ys>Z7Dpu(-UP)R&7~oZ z2L>oX1&Z`aXF4{85X6au_7w0lq^YbCx4MAz`swbRj~KhenP3J?h?}5Ut#m3jUrIM# zln4;FG6jWs3H#tu#%=<>OKFIeT4yT&W~uR=h~JBS$H862xDuLUEMl9Mt4G~j(Ay;X zryGIp&-qTWWbQ+u-U9QKLuw6uxv}l=EI+1;XLRPv!tTFIzud4dG$G3V6S` z_$Rvhg&_3r8krE5+0Q&IHM02_=UtpmvJBXTor{=)fcEZ*91%mASwjMup4NC@k5QRw zqkM<(W9Xa*JzSBm2C{NO5y`&nbkCHke=3R(7i7U>7Kw>7} zka;{L)1|jxoye+jY<9Vv&^B3^LoEiWZo1krx3Sau%I@D<+P^+TF*F3VBk)I6HPp4k zgw5V1m@x64^G#yeIR0!WyCI%l@9qS(Z4XK|juIgDDD?NmLuNqp~-nd!34 zR3!o5^~m@N4Bw0wDBZ4=E2+Hw!FsMV*8ADLw?c~^?IOLw+46L{yRvAe*NZJx8tI;I zQWEL@D-|~4UB&D$O4w8^!f&r`G&nc18CDaO()|Y?9^Dh6#_%m~rNU$+NsoSI3oG4H z!3bN0(`4)gE=JvjNd_xKZBPQgx!lo>U86KO6}YrUt+pbD9_P0#3gDkL4v=R;PD#SA z8w;(*v#ecX29()ShfQrEReV=^jZ|sfsG(3jP;hoiI2?xgO1dxpgek-%of&W=i7WZw z1biNa`I8WHNI@_vZBIqACMM)e@H~2XNZ}D5x2YuLjPpFIi4g3eM%oqjb#Dt3PL~dh zDkKt76NA3NC1<-q*I-w4azjehnv=Xp9H=}va3hQl#_4306^P9l#8}lAkR7|EBc#n8 zZrI1mCe4-Pj-lH3szzfuFu6r|8LDcR>k3_oY`dktMX^V_-WT5&_m%SvR93_E(e#Zb ziJZAryM_K>>?wA>Be=8~5hH&gQ|tj#8bJ}POl%x65O5RXn-?W{8I?q~hH!rD_~kfofzBV%{qNh$ z_elGTM^Ui%CZay#?xaJx+=nCh6GqRnKboMx@$WK}ykGU+{z;?RD}jsd`BQ)REz~s0=?ZU5x9I2R zQKc7!W~}(JvruPeV^`xZxGj0=dK=z}t*}jcM;^Se1-ygxsc?-Ge_7e(kF6p*ChXtDg_7Mgjq*&VkoPSYJw?{x){35BZti z@oic&5{2Y2V~>nzzr!z8hJnCc>t~X)AVM=8oBM8kLJoAUs`ZO1hhq`pTRWn&GUWnDwSFb-kuNE*&^%m@ z%r5S;KZgGZ7Ek{0cjh6aiwjO*$Dp21m&Y@X6+oywq}8UC9#F;ib7st@8A-ZTfLmmJ zFYnSXtJAj%f+(or3NFp-S!D5n8EWGr?O7^)((a%`wcz~ayX`e-fGbMm7;M%X2=&3D z8|@5p22X}@nqr@AzOK@`pxk(t>nhY;#8y9tVw>bl?lnf)m|kSJ*O+#7PWBCi2h5se zrGn^8AM7p7bGTn<`@=u$5Paa)m7oOAE{>AABfkGX-w0pA`0!u4FJCN7|1ZsHnlkMF zM8+^}-<%LsAUL&D@+-k`^}!~ty@X5XnsDN#F|Oydy^#OMeKG=-;V1j4T>bmG{QtvI z{{!fJN|j;So}Ce1{=@nFr*yVoLWBh~o7x(?xU^`W8WOBv3C7vQ3vdpy8AQn25hAim zd0JhFU6{xYTMwH2YCLGxfU!a~4VJKw3g)m|;M#hm+IsYJu)~K`)JbbTO}%=3X}e!} zl?uX**_I)f75+7;d*$W9`?$^R{m`qt4daOZ@3si#FFL*%M`6U?w3&U+Ou7%)lRC+# z+@bNt%o2aGG1DuxfEyLV_M|zlAi5MZb?3#Dr203Yww+|^M)t<#!Val3r|>tHIMaR} zeTZAN8{hWUjgacQBztR7h-fCW0?>7(wgBK^6c)^Hej!0H;9q96y~r+QNSnr~KxKoE z^f7kh7jYXg8gil$O4M*ZUN{d^;&p7+$#vS_9XZ581)($eeKM+(rHx-BANIj+4jDhFV8fxiutxw6}8saCWn&ZL{o zMyG;!w9ameIqi728|?BY7#JZ5-|X?EQAux_ty6#GVSiVf@IwEIhXM!Y;^VqaiW@&U z0&OK2%Fvab>0BnENeI`Ro%!0UFsanERa)CKD32ynm*GBOPOsl|)s~L_%}gY-MuN*Z zT~$2__c6;J#tXHRh}32#Qo~t78W1cgx8@RdxVK}}lCT~55iPnYf2!a_v(RKcPq}W# zvzMrCxFWQIh6Rks^HKs2Pq0Zu6jCNt8oR;-iH3eYXr#zE1irtR=(sB>>Z?bup_vEl zio?l=kGB6Xrl%x+4S$r74DHMjCC=(m(zN@*Uq&f`hqAN_Z@=ZoZn9a_iNJwshnK<@ z>a?!9tKYFRqe*3$;>;N!3$Mn`Ofg-*LYF>P64PVpPAv^ZCUpe{NSCXJgqD);4IbUH z3Su-g>`5@9#|>I?9@ELy=Kj*adpy8Td2b$)4$TQ*R_XJhGN9U9Vn^@VbxXz(5L2q+ z`+Z@K4{TUyNjeqBJKY5nC+v!KSVPILYeBuX-$o{~S-9?Ki*XFe?D zDplRipxonHJ#`4n*8&o3XR;aixUo#V9GMps{$UtEBd`#Z?DqM?-fFOH!s> zvsX7aLrKYSQq`byS6gE$#vD(UPerAJP%Qu>*6}2}#6Yw3QMI)t4T`ky>Ld3R-*Y_X zhJH{4c&;apR3{2@(vd1q@V%C+c_wU(CXFq+WFWB_6+wYFOo`jV%)6HH+73e6yOoB| zy=M7n$%_(Z)m?4X2??*>rOmq%I{p8FDpR~P`?K&~7_7At%Tcg)$Pa3iu#};K(6^NY zi^+AgIpHTG7Nb4JJ#n@bp@l9PZ(zUbr|`^}z8h@&Zfh+gR=TH8Ayo{(dh)-Kifh#@ zjU>LXIy8Xed~z=QWF1X>lMPXYh8-K1Uw>evLiz?88WR6@$VMOattXn|SLi~-QQ%=JS{Z%pe^~R)NdNx3|?6e;;N5I5#8WV5b zAR-SbXy$-ebiZb-5yh*WTIA=-H}aIn6=2IBg&(vuM4Z8qHU(1-)K$XO%qP}~$Chr_ z61kh4b;F$E6tPI=O}uIiViH)}1p}o>IkT3QYm~PYA5UyQvtKNnU!ZzvXfwQD&`q1| zL!!yRC*w&9Zj}_(-vSuT1s>@1Sd{~GA7Pt{{{}*blJ)i zAH)_LC(~Ahu}2!0W8UYG-%-8=IlEN}>&|)S9jW_e}&LizB4?ItSD zkm8t|{B6adP{ikLe}45nWO2&{@sA?@@*d(nnBOzRs_fFEFAnmFJjNZX^+5iK-Kg6M ztZnVyHMO2EeLBV?_ZUO2nZ)Tb+aHfu#T6Qd+G8T`u6yG8hh1l-{+zCPr#BLkn-P*H zaz{s4%n~BA09)CV*`v-bG%o8l(QUB=T*U{Nd*9kpG+eB#xQ5m7OX- zY-R2UM(_aQg{k>F@d?)X3dQWT?bOR0I7I=L}H?7`RBDB}E`VGq6h zdoSughw{+*6rbxukBrJF`=K?4t6R=30c546_I5Pq20A)!Ypi^M77F`#rdDC%l^(<^~1?W8D@hoBI{HB9hr!8f1YG5`%#_ zOJ4%vRy$q`I*4Yhw_LM{^zTw2*6#*br1si@bOh2cY~?Fh`pabQT8-}3yQTWd>&SJ&gysdY{Gf4|6lnpd~} z^H+TuXhr^Oe0o)h(@=U*aKSCU@Y#Bjw_uIyC0T>Sv@ShLvW#HLtl&+Y4w=R=`$R>q zEYrBn5wl}E_r$dfa}XCSX_}rhZ5rHY0d067T$~!JgbJpFD5j(cri2QV6LM1Z=hs3VMN9f_WB+Qd~;4FtwsoJB=yDyiJ{GJ^yqO|)v@zLW_?B_ z{Nr`Hzjja&L+QK8z~hFR+~=XVL>@8DCL=Jtp zR0Q7$_z9z>`b($eFzb!7(ZAa+(D3vH!e2}#f5*C%DcualR%*;oL_W)Wl2l_%uar>w znO!$0Co~m!Dkmg^GnF*mY=r$NS~jm3QLdV9+NW2-%2U^l2A*j%f{>Oe_)~Qd(Msy^ zR}2xGuH}}XygT8cd;?ebaCo_$jT=pUoM6+4v4bvM;ip~|6*i;BS<(4{J_B=;QHLsF zF1J_}g^Gt7>!*UHl2LmsAx$_Exk7?+7*gL(G)DDwg8o8v&W2ID>cn3`t3?{6V+6Bz zI`D7gwF7=m3fQ(jU&zK%Uf|4Gz_!uIg)1IYpI`!xfYEYN3d+rBTyQ*R*|tyf>cw`4 zUge;{JvV!UX*Ge{Rj!L{wZ}jUlm^|oR)2;Z`EThq7WZ-80P(@;gg$_-n;Gvn*L54| zp#Dxp(H~5GL>*`AG=69urf|nqyKu@Rb#FCtXP$ItMeq{Jchn<%+|x?S;PJEg=Z~!w6FwGl_gYb z?Bt%{5vOlvOe^KYI|)<^n;3brB+Z)Fk%tDD%LJ%iilKiy&!l^6hKMD@0ae_3pmFM@ z!NB>T7cdSe8NsW>ImPwj&*^fvF={{jd4(ZwtouNt`~p>JtXW z_C%XC!stXYaKwy`qZ=2s2F*xwBD#TTUyFc+D?Rm3>QuSIa^LO1^EHkY;gS0o?9JpH zZk^gE79B^I+==R&3GB^8rp3kD%(|yKZO5#ANU+U;-7Ta&<90%^w*85vLmZ8&y(dGA zhUT*k_U80NaBCF?G%^=>QzS^8NVfF#_#At)!Zj@O^9q)-N6H;ABVK9ZkIc!avFvETd5T~W7a*Qo*@b7H zflKx2OB{4=P%U^l@pYU`#j5_))8;sQzkyqEE1@qbvQT3!I5riBh0ULTX@!n+vV3XQ zgr%5^h2nnd#1@#=SG_DvCa9D)fb!o7q|qLj46inEW5rU(7jE8_HHh;hH4(t*krRO~M&8 z@0QqhojPf})iHTeb?&km5==ybZThMNMBCc;NLgGz=-;LTS9m|z=M}ykNz}~02SGdB za7jj0Xu&h zwPrWplOPHmHrp<@HpeFVnf3kSspQPbDp+RRC5{?byeeMcggY(HQ1D5tVmcJ39sx z2`8$KBoJww+UjSoof|{c8l8qrB=aoyIC58Fpn;In^^T?6JeauCu6QLp;EjG>xm(Yj z^jg_L{&kmOC9CNsN1+*1YXQ8`E2cZWJhMG9uqyk0iz|;KhCpr*EE5gmP?9izUnu?AP9i+L4e^@BrDdvD|Z(x*m?*~_b62XW;loN;q^ zgYy`HTc>?&W$PoN%-u~9d^zVCUt|;&f-L70xMojlCEi7WR@hP4f@xY^^;Hp@%LQVa zD{%|ibzS?^UTzQ|-S6F}kr?v|_}LY@$A#GT%Fm+pbD>}VW9rYi(Y!vZvh0I)`%16H zo!vT{<(@zD5Ysv?f*U1zwiByuK@<}l7Di^(S*A7q$+w244Gc>|uShpIOGKazp=CNRso0y)EI6! z5S2%iXQOYp+bJZ!gT1JyV$JAr<*BTWxzy`+I<4fV&erWP^>UCOhk&=$2m%}ZE;mV- zhR+C#!@(QG$f4y?l`iY6_zE25G7%x0R6|d6IYgCC{4@P`8cPi8_vtdUNl$daev3av zn(#l#Q_!AIAgIYP9#mPFbqxE&R`mcGMpVjY6~3ONIg#)g@G0=Cw;&%j9E{0T!mmBo z4sD$R7T#X%zmHUKNr-MP0cD8x;nTz!o`crkaFo zvc5!5XfZV$rTc|&k!(}7=O~r=JMPRfB?$dSp>O*ZXgUbGkHYXL8Z2SX2%w+e`;9(@ z*Q@$*Kc}uM!D>6mDNkN}6Yjrj!-%wtzdYlS-AVC1Cw* zIuwWwe?aLEZEROJ$(gl-(CQyJSVvZU5zrU!Kb@i`4kn=~P~BfaTlP~>I~_hw&!)d+ z4ptOo%ZNzt*K`>~FO~0tHI~0duKNRKTrFy%+}^QSP}Dv9S>2o{pU!Zb1@|dzy06Th zfj;jR*>6L2_b?Wi3D1NxBiG-^*`11QO z6HmVm<|4|dUiV<$!f+MrG5Q%^Ba6CfKsiD23%J5lg`K_i`#uX=>fc%I-=}7i9CE%5 z7H$ZqBeT#n)QFU}DNi=Rjx#aPs;=vQYal|AsmIz;z*zSLftT`s%d8-}(+s7i-DTdG z`cDNNOGDe7O`P3J)|TqyT8&<#zbH~QB{J~Im`o$|S^C(-x8B>6qay@c0tk`j_{35o zL%@(kY;LVcLsnXnDXUDk9{Lt17p}7liXqxj-bQs&DfE(2^c`%kg_FUQ3$K(P1?QBN z(;CBad_k&+u30Obw$(JkXI7pTfK6D}LQ)p82(XyUeK|zN^QM|b!L+1btuAFx$n0$A zn&ifJKfS3u&<7qZ8ToA;oX^kttwDe-{yO2R(w@w5J^}>{-HLthu!R-HJucNx*Jgqwe)#n&a2iZw{EevCV#j(*79l&S(VKFWvxa%iO6A12l8@NZhh6nsyAYp%iz3$PF^IoI*Ze{Y%H zbJ2lF3F%FmIqzEA*}DOZ{N+9K0AH zr2}P`;>}+4@pzroc=3~q!3;KMRhr97H`i#nm#6;8j%Ap4sGH1*+U$;litW4xo}?Je zmwW@1b{anIU2>;2W>+^!ZJi}N@Oz8om-Bny#$MMIWLjVVodJ%;C6XHCf{crEeO%n9 z8(VWdO^(m55dIU28tqz_oY(ONuMBr<7=eq*TksI+)Nbb3rgaf{OJt9f|qJEr0-_B1S-5Uc>@P-Nj+ zDRq*?yn*_STb9fG+A$iPCfVe|1|&+UXXp2Za%a2CGs#l;clY=HBoI{HkoprFohC&z zv-au*Go=8tq}|*J_}bMxe*?N!8~)FIFs2(E!Ov;_J%#5lbWnF~O3xW&75k8{15=5DPL9;4|S=$|YJJ@WIN-D37^fByW$ zghgY%-j)ZI^Ci-oHqT$B4OYYkchr`+IJ#SH?6(eCvE5|tW@hL>lQZe3rrm^M+QGG9 z`=k_MBN%9_gV%FpWmW2kKo*ZqRU3V2Mt^K8qO){c)kx$$)gm7XJ7>muc4kk>cTFK` z#8S6Y$-nz{5@~pN|6I3k`kLV-9XT*`KvV1R#fe+O)$xVIq0>5|vf5f(L(NcMw^vF~ zrndGLT)CrdSi~iKE$3AIgfNw)=VnOjLRNrtTPf3+4@OFN8fy@5qTP7EmUrUo=M6b8 zU}l1zEzw>slXlol>LFa- z&mrnXRkLWT>6H@Cw?dDL@>}P?E;rYe_ozaSM9xWRZY70RDsn`Fmj7sU|6egrU8mH` z*^W8?0yt;RjbdS$k25K1CZ4vq9krlCTH|c4|6t}T`b2Si`w4xv-&V!6_gndDnka(c z<8)-jnQEl6hm-$GoujuOH3u*8tE>}m|2%m{^Aa)@z5p2bVYDMB>`CC>oT@^scRpP_0ldaa#=(!jjF_ZVUj7{4af7z)U zy8{qp&~bd0cuJ+}JJQv1l5qNFNe}V>XJGCy=zKDo)CB4BskoQ)Q#M@O##~b{g=uw; zzLp|tbu?{R)8*2?c!rjFDWChw<+9@$QVhkRaXoH&?&;vvcPT|$L_N43BX{BDzu(?8 zY}Paw_J8M2jp;;IeVg3WrY9!UtM_cA+cn&$rt??fcn3Y23M#_%p!1<|$lO+e3jtn} zZU;Ynl4FzSCV5MSHqmmiS7#o>%PIs--tnM02y6aE(5zZ==QN6C7<&|4OipuTLwj`)`TT1o8xUHJj z_SYWIxc`uD%Wy}ER{1=wHZn{%5Y-V!^s<*a@%g2QC;SZ7nu@^=)WeU= zWZ3--OepB^S{X`n-v~CBUyO0+nX9w+E@zo|8U!YHU^PKBAb*Li=27x1BKT1sCpxh! z5)_1t!pYOWOB-a06bt0}oLlOvfGH!$Hg~M;gNDJu)3bK$=u3gIL8|3!-!|&*n}Q)g zw&!dg*tHLOMG8e~#f=8zM&m~lDBxbOdM@r-!OXCFw)VLo8yMY?2c_Y6P41?^)Ny&% z^qnJbo85qd+Hkw3b}wPBIXv6?e2|5VZpeb-aD69t4`A|GpNjj+kcCWdc!OpLeEW9g zVGP-xD*INDdyH=sgB%EaM|L}5cDSDc`T)ou%0(~zI7Ja^e=osI!~QU^xP)eo;eC5B z()a?~M!$C9VQBEOO&l}(GGKn=W;-|*^ijd2;Z?J1+d0PcxxsMbZkpBi88!7?!g%0q z+Bo)#;a2xBK^VoU@3MzTzTmuY5Th>U^$>?%jX=g3pX=Yl4;g+}8yn9D zv_^S|)PD$|PCkH%qSZ(SPfUNv89x0T+BqpJX&Kx}ak#DBkKl>&*V@VZfzH*6CwI#7 zYqo+W*8dBJS{c9R>Oj%s0p8mw+ip}3cCr;1;BMHmdD2gH-ZB4;edWp% z%F!nRmI`@8Ua;J9)!CY}@U>`9fwW9z}hEX^y16-(geWX!3 zY!!T{&o_B6Ykv@5;DNxZ4C{Ol6I79aB{}Y8A6MXk;HvB=7D5opR1gjwN&pTc`fm42 zpC7u-dF`@5bG(iP6SoKfqZUw19^${q*+&j2;jiSUN_Kz&&0kFMgg#G=-G#TTJYH3 zj<9{?fF9BMRmeD_2-rt7#=pCwfk}d%=|&l_ap;VXyZlfL0#C%EDX_w%+NXVLP*nm? zY@#i&Gw6$+H^9Ip;UrZ32m|<#pOq)6Y#Cxt6@f2Vc31{09f>k z8%NeYB|sSZ#UDqgK6`*P+QqFSQl9}}1nuI^@vG?UfL!1^u@V)W7f%l9#UA6=m4OZ@ zCSqn%p4~n2Kutgzx`cq9lH=?^3RIXtHJB{iyFE33YTz#v8{iy%pV*$-^07W)7ZcEi zPARY{8h`J|Ejm8nhn$lXh53ncK95*xOB7ll={Pjb)I>4(w!a$!*p++~iJ)d?a=Tej zP`BJ~WQS$3D6FHdW%RhAr+%^7KSO{O9tp0Auqg>zVcWCZ_s$yM{58oswP~hS0A^uz z$p+cCRxGBaIW+vF)zDcvGO}j^r zS<_>QsZASz5AW#_?w;Dv~o1BrvahEQ*+IP*`qz#PQ zhz;5?JvN&XFa|i?z)n`rP9}jLzQN|1fKouYtzo=RrXWq5V?3Yspc!_xs*K+kXeb}i z8GKU$4kW*KS<=_aGjJ{vP(C6vm@>V_h>vzBCONE*v3#0?dW}I@AcK}Tj~h;qyY;b~ zPjpbP1t<=*T|dJ2Bn=A8^jbjSd9ncYXL@ZA|K2rB=grUXxVT06hyiB=WqPd$_4Pfb zTP;k!K0v|#8&l{63Dwi^Jvo39GoNR34|l;Cyww^1)>2}>fMVGwf(6&ms3x;(GuVA1 zDaJE+)qwN4XW>GV*+m)t4-v8T>AcE7$P24j+|kL9OguAXk3l04^YSFBPbftw`<>Mk zQkw;z2^28R22?CK0Y)oI?~ntIY%~$Eg=WlHQ5(%T4f23$7bf8!^rRJxj$x)0KAHN3 zi5V=Gph&?TG_{Q9L{RA(A|YE&hAt;?L1+xEDgC(;bi9g4#Fm!9&jH*qI1GoL^c4pp zUJk`-4@Q?|P(7eaGnyX@O))m5@tN=f0oJACLThLY8D838;L-!T^djqBIcRxxf~X-i z+Ew?y^&0I69a~%YMa_1F-y2sICCf~GyQ|>Jkt?YNzAWKoF zK@^aGX@>rTwe$t(7$9*zz2FUrvL$)O;h>?+L= zfAE%;$N)cggG}6WDE24cRDflx1cV7j$1|C-Yky-;jE-3{c}*N#2US2Hr5S3Mim^N~ z8IK%y@IFlx(?-X6nYwt1;8Teiz>FTb+k@(Yq266FBKJq6-c!y;2O}okUb9Lj_j9lzl}3%Rg2fp_GYU~a z5rV9`%>#r^D3e%PeF9DllQ@9>ueX@llm?+8&ClN@EK-N4g7yv*;p?l-AQ)M`BQnUj zi)hGVYNlpGRLL<1oh4=!lpY#r>;HkOrt^YWPVItkp(5%3IS*0a!|}zf#KlP5igPiI zYhZX@b5+%wo+H`dYfK5Z7+CF8zrNWX-!FNte1&938fhhy=ZHII%zLAK@xYPP`#hi~B<7Eje15l^SsFB@Jg@!hUSSx5gN zvG#luB0cQ}L?I2dpeXw3z$k{=AM*4)NNJjzfHaLaROUKQwAyk{#M~cWK|zr=5TQ3ChZD7)~*XzI;jg_J99}{U3jL0RbirQ1(AgX4-!mvu{rb zO#l6sZ4f{rO8ZQCND%x6jf4>!X1F z|JE{1p-{D?Bi8{|)%ep(9HBKLgr+ z0TFNhmwf)M4w)itb{YjSbruC1T%xY4wjhG}fsH^%r8oH1xi`|TL!!$Df(6TBkQ})D zFos7{ERPf%yjHC74{Ms1RftFEc{k2kAZr=7;72S=r-euFUCwp3VCN3l_v7m>3^Da= zFbJ9ri^%+&A^mmp=F?s(ex7&)*8V^cXG@9u znYfT@ZcQ~7k9c8QbeFwre)W`U@3Z#SYOutq>!DDyi#Wm7bgKH*shLhj#_bX*%A(Sz z*ypXd-vT*A_QGqQlA4}X-@3@et^7m+N8AIom-Zrt9;ct)B{VmQZuF1Ax4EDwq#Wu; z3N}2D>S^y>X?~jV{lytII9{SRQXbdn8=ca0t)~!<@&uA>F*Pg>-bQ+l4swW2WN*35~|#ntxz(Djx9aW%`jaBvwQkl^m_?gV#tcMtA5 z!JXiPySqCCch}(V!Gc@zP4e!2&ffRlZ~n}hRo&IS)^yiXU0qdu@^h3aCOS|X!=)ZS z2v{PDv)ip3H5B)9iJ}0)HsR517SY^ve!LmGpu}RjljpNSS)MshV5D!Wb{Kl)!lWoX z_I*JhZ#wW_8;Gnv(SkNuofs7sq~$ zpfGmP3Wu52$8P}#El)&Ol`Emqcm z_L(Ff)&W*1};AnEacFH!&~xUlkY^P~bt#(E!*MJ|{rMKUsPqVgS@2gB390 z+X@Oy3!y7O>91sI0m~7He~LJ;L;s5bm@y8h*$XiEwvl(kBS`_JtAJH zp==eF$D8j-r!g*%82x2ktkNWPG&)``P#U&qar68x&(DhJhp6F;PRFTvlkHudeuYr^ zxnLUiN2)aQrB);7DZ$ZS-G1E-4+_7Y9v*}skajCz7l_GoHN>#pkcL&f8IA2fTdKXe zo5+q;Xpk~!tC#>qnhy_jy;d5%W#;2M^NY=cglCX(C7W?{61a*OX!2xqIO~jXB2x%< zk?u%wQH@bm+ta75#}j0JA=!nL+@$1Fh9ZluD$o|2^M#Y9d-BHz_D3frJ~=mpQ@gXW z7vHU=m&=||h?;*tASIY}Q%_;XGXsTdpnT9s&NR7Bc1Hse_!cQlo5`&hoTAr-iAIKg zK0vlp-iqT$-0~D3Fz6hcF&nX_F{f#7ZtbFBbEVqA9n}%Eq&(dC`hERH-1UZF*&JP4 ze(ejK`0Z6uoJy_X$Ln^2Y>KK1=U|Ozv4L4d1xs}Kx~aK>y6yvblsv^A#ibIZQ-%sn1_i3WndrWQj(bqo>nt9GSrdp50IyLz`k_IT{Q=ZyJBU#0ZRQ zsE;QOr>MtC=Ng@DC&$5kTI;c6VPX`@#+AEn%(O_2d@7v*Rpu9mw*JBrn=ndIap`(z z4vNV_uYhD!q3lNG4&7u8AV$uz5)&`yto*pfAdmFnTo zbgn|?)a<(f8rGb&Y11@e`fRf(0@C5AIUGstv>u@uO_*OmJ-kUT+TS-HRI@7SPcPQ} zK*ipMTXdf63(xeKRwq)kceWoY7&IH>#Z#gRq(htq#3*+d)D|ub!C230DE7dLHtNxc zXdgka-VQlHk`!3+8@q4BUNaLp;CnxVAl3{juy<38<*rWI^BjHXUoU&cGT zeSNrle6OV$>VX%cJg#4|XtX9wh6P$npTqC_Oi`e7oH(%G?zU++_KdJLjNm@k#sTQX zjZP4aV5Dm>Ob_VB#g&(=md+I$rbS(XtdbDfHwe=&Skt>&FR0`}lIi%fRv1>EKuAaH zd!yC&pIhK2h?yH8v8PEot&t9N&|An7KUL^p#5q8j2~kq{G)evTYp)LQ z3Y;N)3e9+3w7o5TU?_Xghq+6~zr%g~sCyOsOCaD)38Jz$@jJ441Oekvrkhp%^{;Qr zTdbdK?rz*wrXJq$T@^$z>43w>7|My&sced~6HhFh%#_OH5DSAAl01##g@DW+JX6_5 z-G%B|en(WA6_Mzr`MD^iJn$vf`^Ld#P(y?%Jc=E=NLYJFqQjJ0jf5@Ks))=8x~?cU zc;4ftsqTY4SzbtYYH2B7Zvu>_ybO>0dNW%}Q@f`0dowSM)`q=2n2#QOVQc}1uiZ5+ zvdl*v-Nu*jhrZLGHkQ;IIEija3TT&KGoUmW$Kn^FmF2J32#-EOVmCa#GDU9iIm!i< z!&vT%i@)Fh0pB!dPbm^G@Pa=4pDH;RRQ@8ZSw>miIecfMJPmHVl7q)?c54puU z1EBCfEm4EOEa5@OD_}6Z&-ypZzsLz@iQe)lA5iO`S5^N@FxWyt1Z93eK>_8gfseSx ztpmjU!yl~SgEjXi!2TabpuZXV|EEIBSu?;K<}cwd^n(c}e}A#WftLW_Uj!hW4HW#A z`YwR>KYjlL?%?}apzs=Gq!xu90LnkD)KP#l|Nk%F!~sCiKLqeQ{o6d;pRRudX^a8} z{Z_yY7i2w66e-|&{uKq0xXqle?@ckvUpiTd)ebB$Vi46Mlz%6;RfU3WL zEC|f+6Hwdh6FAiVcNgj-@tYM*<85IPmy%BGl0wmv$-4~P+>`>$EOz# z2ebC4ha5*NN1Sf`c7zPHjZ3!Ki(X6CS*j%&F1&6T?eZn+5Bv_@4t$+D)QlWPAug^$16F5M@Ftu?v1JWW0&^7A3f=E1{L z_}tzD3ywpKYTnPKU<1pq%kM^g_SEIJyI!%=CNI}^PYV6$C`lECyCbDj>6MI=enDF* zMOguju&J!#+vfIef;A8du|SP9sie#lAt)N?#M6-{sd+}lks=cxs99Le5{$fR=Fgn? zikuJZ>R3i=F0JfTB+CMOI!(gR`YAx;$dcuW*!?TeAPnYlg1 z`Iv6#Bcr`5V?Y}8jw}dEENk?u%%Zmb0mxx=D!8$-QCZ3zv%v_hf}Uy<28DbjDGNDV zw*(AnS4`ng=ahYM)%iVUAD1ZXK5qhHF=9Ti^{uw2@aob+In!6FI#8+6vnu{LQIJw}{|SpxVnn81m7A>=Pp@l++plN+p`qnnNjZ0n`8bl5{x5?V zkb>rHfIQ?L_edt8;T3rmQ!gr7-P+Tu1qP#%prs1V$?QmkDp>@BY;sJ23g$5I)ag59 zWLy<3KX(w~mlcu#`uA;HI6qa9>BB|q&(4DP#6gfbh(e{UM-)V8O3l1MF{}4+l{x2f zXi8|%lMI4w_=f&S8kg!$l+E)H^%av_i{k1VS_%_qCMGbYecDJjcRQVEiUr$vkjeeU z?UUav^G~{=y70elX59DMTi8~c_VJV*Gx}=wKB#3*iyLiHmzILu>y61O+&wrM2Ocn9KMjhvY8iQ}^p*jj zUjrPQ($fo7BsXa84^u2u_}f&(5k~8SXye~awkUX4nCYHu#9 zZY!uOqrhMJ@$93vKJK4md}~u6WOfT)Jp(It{rNvJ^q#m6HwCK#C6+(nOM1&!SyaDw z%JBXo`L&e$i)5K`NQZPL{GCOX>t`fj$*vQ>ut3B@G(Ky}aZ0@G?RRXUqFrl#(JB^d zCO(uZ%>ugqc2D>8ni4uK!WBXQ9nAEYrubaYaAc5Y?9HiHz^Z3;zd%H}yrRbG-3tr` za2tI(hHktHg2~|*PT6dk;?^*xz1Z8+Z092)Ika{j2f9zejr? zYLdjs%;RFMzD;P-Djd@yidtSE=!^s_#;XrUV2ZDfiO-_@1tt0AKEEl26kO}W}If`qV%5zx?(G^H)C@S#aTx>Nkz2o!~!-I;bhM$%FP&bC)A?Oh- z$o48Pk^2hHPAH``Nm62qw<4=a*-c&v$_mXUl5yDY7cr>UFB_Wi$z`}lrWzct*6+hh z(5m5v#Q9)gbP^xJ4BlXHlQLSt7D+NR85+w_)Mt7^arvor!AutXg@Y1T{c4~_4-z0T zm{2XebM~ozrhMEnCl8dvwW?}~qFFbJm!T~cKr>j32(0_o0i{zjy!A2qYAoW~M*mW2 zfd2+OpXC`_gaLMU9n0c^GBXK_C(g41p8n$EA)hwTZnqPXa)@E(nl%UF=;)9VY4^-< z6m?=B1?!v(*AD_s?Cu|+^>n(zROJ?pQ|d?9n-UKoIcwOk_aENK*(f7R|(`Ef&u%xS;; zCFs`T6v%SxUE$k`UX*K{;8icbaB!-bh@#;g{)l(XncspmfzOoB&l0ViDzd!u()yAW zEt46fb@*Bp9-RQO7KJ?2Alvz0NoWLHu;PULz~E-$HFz@*F+m73s*{ zZv#6jyi))6Wl<=-*7(3<(n(l7eDb;84ajNOMT3}4BYG|YW#x{}&W9wU^s!cezHX$z z5O99SvOt{q@@ZvLsrmgHbec6QayR8CLMuHHU+-rjU?PT$U$sp386ZbhC1;If+Ancx z&{s{y`2D(EcWcP23teO#o^350@@=1C*xF3Y+N|j1!})9A5fDLn0YjN~KQbb?78ok= zqs)~TMDkOtyV2QD?MaX&f*by1Sj3D_A{O#;IMpB9rmx4ym4q@1azh2N&U7RT>JhUD zisIeDkCjSF>-xk@M~oDd?Lc9@50gn*J92HVLX2D7U+7@36CqxGQQt%#@4CcN`z6gp zE{0>J-fgX;2G9da_U%nCPQvesI)DWhy5a}0-z9fkshn$x*c`En<~OJdwrJO*_D0w5 zT%{d`puPvg&4z@Hh`ry-xbK z*h{j(U%hacrrz!e-y;1swvS8k6J?d))N*`-C*j~CR*SLN2P0Wy=8O(cF%Ed4m~f$} zJSG@p?g>kGZ0(DbU1Z`KCvwcwxaY-vEuyx?Gg3gFLwV;We&>dB+eB<9Zmq{IHw@R_ z&Xv$ESEsQYw~$f(-hA$8L|6!On1++L3Nx_nTdM^VJpPHr5D9d_5?FM7(mbOekMeWgf*sxX?z34e^D{O;R3k}LLj?ls zwVA!&j~VAdpwADu&pE4-xUX z1&3J;C9IOVNm^`G!{QQpYjMVlzOgdA=a_pOyqb&JDZ={Nl*E8DKxaNrALLm@k6Bt@ zk>ErXjz3X!(HMv;+cY8`lZst6Gr(G&&XB36R+|z?*U2Z>=S?%fR8e=c^LG&E9n0sK(lZ;;R~KpIVQAqG?4Vx{ZzwdQKgH|$6dsK0ydvZX zv-zgwabI19rdLF;>6*N~+;I#uS@Kk}q&d92?k^R;i3w%DvHP-9NB<&K8GcvwW4xiv zWl%j~;z^`56^lPBQY!-}?fkN%|8w~fQj4(ed77xLy``R~S&wn=007*68XPqLxz^F* z(ZhTcueRir9C`0VS5vv=SD|{rp8+@8z!>h65i&T^Kltd!c{>2>k`?jlGBYr9iINc0 z^iIQ(ED4Vj358MuG$_w0cgNq{u*khUF08^--P`KqJfRvk2wM(pYKEB{bwS`Dv`s!0Syo(MnBP+=o(%Y90AwIoqPOB&LucH zhp&=F6Ag%$8K)XRq_?6kCND-yrJp&YY!BY9B>hTto_M8JUz$dB(gCtFQA#)$2gRHj z2aDcL%YxrPjsf-IchQW4Q3Bm<=eRCeQz<59ArO`?U9SC-{*Pqau}dcBo_0zSh@+tj zT5!E@H#(_iIqZ^=-@VS7DWGokD#*l6JALs!3$E(eq)l`H2ZxG~8BJQ?m(DWAh25>U z=~gR4mkO`6%MxG#;hY^ERKu(ueQ{*Gs=Mx0K!*>C?qxO0tJxa+2heq1XP#OcqTiaK zNbL!H`;#lKT(xZ0bV!ueXr{%`72I|0`@NZVznwQ3Kv7?a>!>i+b!23`dwB?YRJ9*O z-JN`dmO&8$cJxx==2iQA3&8OX$RqW>kO1NLa7i`cj!Rp6e#0hgUOLt1Lvk09O+GYl zJ|7F~S<}2L?+(A)G|nG&Qd=gRqZ=pY5fKR5|AL3_oY-raAHD$&aBNkGrWeUAFt-B6dS@w>vvt;A-Hek?I z)v|yOLtmFYqrYLVx+uO5!D7wAqKDZE(A*KHj@0`;azf2t#}?qz?5rA$HMFwJ^Cg*q z1X@(3$#NnE_7D{uJP@q90k;D)?=@7q-)cm*UaUv!G?k*7rm&JA8Z;3o!-(BHgm%oG ziH=hStj2pw>-U*rX2zYTLIc(aa>hWk3^E0;n9@@W_i z#9v=OJ$Xg9m%4h^EVC37&M{lpr5Z(>7@ z&>jTrlMZKpx*Z7@!2>mxKs#k6oCxxpD=SJo3?k{%3=c_6`w0pcJLiV}Fd^`O2UdO7 znTp3?-Nr{a79noUFJ=}zx;O8S8-iL>-!OH(2y&aOfy^3irm&DLwmg@F(MXhQ^}K#yi#+q_2;8Q%vR^=qVCFJ8Sl-75=1QvyxUEL4KA`%cj|P$`A#5l*7t!N1uSc~J<34L@Ukeg7lh2Wnb)alA%N|{AR?SG8gZ{hL zDGd{)4BoYZ4(+I67;9tp;rYgy1cyi%tB?5euUrG+9SgStUnv*oq^KTQY~b5!=fpAv^?=WCqhpM)w#e>W zoo<(@^~t($LqEk}nvxS^WqjdYTyGv~E5@#rl*gZ{d8Sd~gRIymy~SpE0Z|(nZgJ&9 zkiD^I@y%&E#qqV{`KYeyudTGyUGi4uGi;@ynPi2#Nyw?SK)jm40^ z{pzQ}>@0O=peCq#Nxhv{G-f>PG4VrIm85%=+4EDzrB;BBVae4Y^JfZiLz8R$2_r5s z{w5~Ty%USywEF4Yu&7OJX>vj#+?*ucL+BD3Uw7M$y(mH32+EVG6{;lZL6P`*9h#G2 zby0)t*86HKT!P!C`CFg|ltaToDWMcU0;ToqP39Xt{DJpD*#lEfz3)*e%A*f~_-lAc zu~;l6a{D@l7ul9^CW179fX<@c_Tjzih%3BZ+VU0rg-@xqKsD3KJj|fSo$i-{)!Z&> z5q*C|*u1ee0R#x-ScSe%HFjpS+i~q`Q`;luIxZEug@8)LC_j1S5jWC z<7;0l+WAZNL;`o;e;G79oxgs(@`xrQU_-*5pWM(SK2c5 z05vO##uyGsD7phNct@0Uv3Y*tckLl!O#AL7M#09VtI$1sgRY8TCphyrK`sr<$P4+v zW^Xnn$$1ZFQa1biEEm?XZ+uV0BrjO#v3*Y~eQ#_nA!)?9@_HW_d%+@;;~3=qcy*19 ztX6xkD80q|W{B}SF8CI&;y1yY%uzPSXRCuW)5pMqshmBerzEwo>& z2wR$&Q`*9waAJ~pwb%VySJ^Hl?@$GyUgUgMpQs&7m4)A>C5mo`-%jVQa{J z(V_2)XtK_OQ5#5iC^XFB8qk zt>9Ctt^rDJ1{YiIZ)BoApqNYB7S8E-rg90{CT~2wPqo*1u$wjzs#icZsN-dr;r7`L zo6f1(+I;nWJDHq5K7Ss*yxThK!R`=;QJa)b%C&amz$@`WcwWHiK#tbDd5`-{Btb~Y zkiw8HRLqs4+8x)k0T@Z%Il%>2AijGi zNcW$r@1K2(>T^H}lsNd}k2h0dE<7Sgxdf5y@0~w~%>TIqYi90hZt4o^x&V;=CHy(6 z_&*8AmjLR&1T;?=D&Rk*nVijCT$x>3#*m5cNosR8!?~P>S>tF!6U=N*rbS0QpUyhNm62AhsdaD?|`>%J5JK?%dbk z_j$xlQ+!Q3%-(aF)IT54vzGiyR-I`HyMkpCalSpqiGCb?A9YOfslHe z6;uFGB}Pp|L3)Ks*woB7sJ04^eCQ<-6*pioU_4+dAc5V;OXaLj061yk^MX3hFJIXl z0rox{qCjiH*Ax?eV1TsD5pUkN(ch6RPD~~1oVMoAE;*-a&P;;t>Ri?az|E4w=^{E~ zK1EYjfdk1+_q6g2;yz2&RHmTNnlK713skRbrFL6c3?zK|Mot;b)PToiQTULtY@k4- zQ*v)IDs5g*xRV$&@`Hl?c`Nuc!tx90Ht?1q-0G6l_iY$~RZEgu04U=_wT_{AuDFF6cYA;jTbA4}(*;Pexx4WKU$+HC5i?+-m z?FiZB8?uL$9G}?t;3}DOtUue6_O5rHXkg!<8-)KHwtq$|#2w)OHPWQ*z=KMIRo>Xe z*4o}u-rUv7!R+5-Y{mJbCaS=)js^WtC_FR#1YSg;JhH>9Uu*j1y_)G(0h(uP(6E1+98zqVlClyaO zTZaBnjtB;j^5ItDxZxy>wGJyfO>)D|3Ts$$ey`%&nG=Y9^@pVx%@J<1Q=WwK_j?Nj|#`b^{MnKW_48!ieqcX+dWbctv| z>ua$+4@W>yTHliIt?RluTo`hpqu3|IdK+2M%|Nvi9NAogVRn2j$3Vp!z7mRDuSJ-( zrc43uka^rGY^go^gU^=T=jrD@>H&x9*#}v?lkd%VHxI{aFY!iz%obOUvn~{u7RdXa zEflWC$r^`UaK1kS0vJ;vLwVEOH1#gK=^Pnv+&P+s7o3EN)0rj|PFkfJcFml`hRtQ% zyP3J!vvWEpi+;`Y!02HdZ^gSO*;M1ThF9>PaX6+~o*#2vq0#AOFvMa}IbeKr|Q7-?<7_4}3)fE%FQkfYS`^l#K;@Mriew8|3c=^tEyhQ+% zf2t--uft)eL8ON7lD4mUqc?BEZ?;)@2dg!412S`S5e@SOlE5gumgD#zf0!}Q3CjC-Z9uv(eIvhtG9m2WMZ$iMaZ;{QG$$IfbyBzk^o6xf3V1JlPAie@wPNuE9D6H73Q z^?rlaJ(blN@{v=MmlzLHv}vAbfV8iOq8*3*ijA)`-kxIrJk3G)CT1VC#z;b<8)e1| zilhth6EM2}2m1q`E3UzA*YHffZMa1CoGBX2e0g{_#p;n`x<1 z{rQo>PGJu(@=;)35S)a6$P}d`WC3DF%!i>B`9x>u!gPC;364JhNypY+N9-19I#)KX z-Tka-+{}U#PyX0xj2b2>YQxmBp4kFFJdOpoZKtj!Q;#gW=xGCEZEw%D ze`7pn9UYU!zpvz?#k;y37U+8@BO^pDabS6tU?7YyZL>_>6FmN%t17C}*hs!g79XCV z4FC!}aQHDqcqM^dugeSNI!k%sjuCsp5{?kwB=rzd$VTm(Ix*=T$eGH_r`gn>m-}Ru zxNx`?Dk!DIozTn|+0pXLO|6N=ne2Igc(SGJ^bknB{XMeY6-~gI0Os903b3v0e;qQx zQdj@oe|!|*fqG`)us{6Ya1SzufWQK(fuWyV!}zn?zd>HjSaDtnUBF?3nhs_tlQ=w( z)eTQZ_&Ug*gbn&b-?|hm+Yq*D`!KaTgS8=x?+q0Kxd=P1;7dXD!(y2#QqEFQ*GbpW zy356x&&&PWyym+o&qC6nS_>~bGEbk@J$`k~L3_ z6`e9RHG?}Pk)T*%jPzI%BsOyTVHX}zN>I&@G`QlORQvH#yGv!$zF6X_-N;y^YF4B- zh{{&u40^(mlqQ1EVPG5MeZ48Ha2=g8R`+>x{1rYurHThv68 zZvhcPjE1G0p#5=c1WlV*e888y^zjGh_>rlascZ8Z=`%LHI(-A=wYBvv_7;M%&Zn=_ zzKQ~cblK*-$nz~lCX$>N>2{2^SOYjJ({11H((#HFv3vcj4S_#a(G%P{4$?_)Bg*%G zBClFdjGt6Ko&mdM%feLY;~AldPA`%P znty!$gpIWZwjKqO^d$R_hX+%;w$4x zAt_Z!I4^}MJ4!wukuoBUe0K7b6kE6?8S=olFI{S}c?(Qa3tzR-d4r!&NN&=uP7n^z zmlbm}jekO)&N>uJi1er;eb7CD-x?00p6U%pjrPCs)FLGMClxLpWwDPPScAv`kLUjy z%b-8H>c2JHfJbCfAXqbH`A1hMitV+56h;-R(07}pZ52Yj+Ft36dk-H9PbkJ5_tLsn z-H|pia!+3W?XdU#h$M`pfR7A@zS{}h-HQi5gr|g%L=^M*Iw)b%o`aNY*b-V;yODndH2To zcCHD9+P(zuWK2dU&SA>l^MQsv!Dobe;2YQ0Lilj#1XBqNqJ`NPV6nCl z!oU@EvHj7V%HHH3d%*LR{=d@qf@g7}Kji;DI1~z5qBJ=guu8d01yUGELFp12_z4_N zgJ`!tBtttaJSgnix@r>O$;j9-VUH4~*>DBnOFfJq!Yx{2AHSbLZrE)mB)GK+v5k~Y zqlRiP>0iD(zB~G?nVeXVn>J)4Cr73cKuTvYL0zr@FNj1v)fv?YU4?h3J(M0r%~^uZ ziH7@8V0p|22&#D55#vU+nci}P|2o{IE z&we>#U$(-uFtv}c@97dtq_k$EDZuefk?KQ}ka6G_;aZ3T(Wfp3Dd>{GIo3J`VVH7R z-5`Q%`G{c1`$XD>K_c=+rax~LGe=g66#Pb&!DH&b$CJD~?7v@YBB3lHcsMD#xjMSJ z{*i* z9bF(MG&wXzFe=c3yS3QP#zvh@bD?i8-M}5EuRqkfwE!tVY}$m*tWhSMn)_Xdarx&( zHOsdh=f(D#>f>U2+iC-4x^~&}@+!XSQ^EBa0uBa^!?R+x8a}*~ljEqjkoFE`581|P z)YXM@w}dA>7kYOlXCKk^4NjPIZYh5JWzGqVP^}Aw(R`p5ULXX`8jkN9X+MI#h3ewzF+fdzWYJo@z=9);V z6@)$7nTaz+xp+h>_!%K4+@ZEBNN}7_Rw6F9y%3>f5!qeJ+l;=2#J$&R183sX0iQ!0 zC@=~imq>th9Fl_Abj1eRwIP>8bjLwsx#1fyE*p&(8AwMTeG;4AH%3P#NFPWhM`?Z82L;dza4txmFm7d< z1T0g%yA5>b&cXSn7QJ$`%&Xc^Qcq zYPh%*Jxio+U586{ec!Pe^|!`78&{0)a(#|RgGSj5v@BXXE=T7I8@}XS{>IoYtgqo0FKn zGLn+}9Z8Svo+B`uS-WN!I!ZND0U>0I4Mb$_yTxvK7@D?2l>l=$*aBY*lB1h2R(Qd!cc$ zD*2=e^f18A=Zm@=Pco(JJ&T zbO>>T3ptNom}RkWH$XfI-c0x%oB|ARsCC$N<2vBQ57t>F7vHBjD)<=%p$#oSeElcc zRnVnpde|j~f*=NG*S9a>#K$I3?ZPwOryNtvpX0eNBM2F}f7;$Qe}QABuH~aP%C$Ku zmXY2;)b5n{-G9j}$Aw*djkAc@pB0+pdvF7LWaPn(KcwG#2B1x1a+-d4V-nc|3JS^` z>PV=F{gRw^i2dNn_QH^J5BGkUA;I(_>k=_jmeyUEeDAZ-KEiI9*0)pwl(|X<3_R2Z zB`fk@3k}IvroDc#QM=@LOw6r!kjuwhjdytaYfQ`{;)2bKBbCEINW6i;L3BbR*sYnV zH9h|P{6m3$9>U;PE^mqfEq2@pARHuwvW2quCEc?%Z;Dd!zPgwU&voZ9e(p3>PP9Jp zZ4UFXJX@VVOV^=%i7Au`@2y_pFS{M_(u{m=23{E~bWokhPw4X@1P8au#EUT2Xh*sw zr4XK_r@vwtZw+!w01WBh{(n_e5VSl3;s38KO3}myY|#?8ceQr)5;M0pGY4N;SeqKV zT07YPufT57&{zFviSD1`%isjXNec;EAz~**O$UkbL@V_rpG6BEzIlmp6cR96z3~~< z;u)&*OzyJty4r2XJD_p3F6*QbINz~(SN+Cvew*n5q9(#(g<@X0@&Cbd#52uvwDBjeKLngi6xr`@ZnH`(0dDAWmmf0Zu#g*0?&_a@ylYDG??9OLkp(|O85m$syddsI zi(R8@$e#s_;vv9DZ*o&|76%g;{QiQmN}(5hIXN#VXr@OxX345rP_`3a89hEQD0e7f z@zY&G0*hj5V_W7?sh2`8-tjChNa%&ZvhgQcvcQ>um#n$6O3I6z*Nd*xYjC%UL)WBP=EtZJ^pc&e8Z?DUSuy?*5TR|WJ*Kj8sArhnx)boB?NQbWg8Er@Zr13O5Cqz z?ODx+qpBe_b`Lx2%1_BkEo={sCop~w;lB5l4SqrUt=_9ztQ;ku6Kn2%eZDk+h5Z_7 zk0nAUkY-jLJ}Qpz1C{7|e{f(^;cuNSB z)=}*4<3Y$EXKc?;hVk(aX{Kck@Zaf(g@@vm?#O7Yi5slA-TEyNTqYAtvp$4xoL;lN zpUjt>`o;k4HA2maY!xgJX^WZ`_yJ7h8hT`ouf~;9x!USzbzr`)`R!F1k8kr>K}Ayg z`&yo9I5E1M6z9kfN)c67f^XnQaE=AXs8vZS3?x)tNp)50FpOzz1XwET9&fITynplN z0tWDZ3-PD@`IVC{&28^n=nHyO5KHC9%^K?G zgNKKI_s3xSB8Tul>hV=S`JdI+|FsX$lr*UT$%6W&gu3#z^vk2m%`OBJC(9-?;f#^o z6_rV6dLK%Li5-_67KPxK%l%%stGwuqMQUL=Imd??_u`JX?lk%5=lfU4cRsZ{!l6Cd ziW|xOIF^pI$yfGP`G2hui#aLPV@N zgg3KdF29ke1WY1?z$MDMCUpHqI3VX!MfXN_)^}nh^X_Q|O%&fe_3+hLc%-v)2iIX6 z#vlnFmEvn6*gX!ujMevev7zr?ZX@WiZj(Z+b8iR;r7Xx|ptC7GUx3!b!nhjR6@;F^ zub+VH$NaBW%D6ql*16Zu88QfFtXa-=f+0zeCC3H($A)Fh_V#%Nq#OO1SQlFkzx+oO zen{lHl4kYg84cxL8^wHbaTh*fFHR-5OU!Pe@PhLWpSp?bw}7$@!X; z-fwVRT2EoKLT;bVX|t+gv=x$rYnTd+Oe^G0?-#+JKTWxpnbQHhq?w2QKbJID694Ct z2E1wG>gMv_W*uAAc_mZ81eyE3nrvoECfHPu+wbT+OBKq}$KqFs9v6z7OcF zA^8G!0GXIR!n!=bu|HZZ%0Wj~LnfIe=H^SDG`E0WEE7%?h%w>KVnOOXpPyl9o%-zW zRaVQbdG+{)n_vH`z@qx9;r~grCU?Pnx`Ft;4R^5r96qBw@E{T=$oQA=3oODOb1e1o zvLkvBQh-dCv6J(MsH3F`WYwCCrSk69dI{PjAABlwBx~*nW85E>B11OSiT%hVZI8h_ zDxWpo+Ur915#v#g! zw?vjk8uZ540I~bU>zGf5jkUrD*IHRwAN0TH*sEFVZnUKj-b~(M*l%%Yo(}N;3Oe)T zV-RzRiPUCFbC+koZGUEP$%?Y|@n#dlY<+1|)@QXFb82H)?@+Ww7m=`ABz4M=@vHNU znA#F6x~TfS45V)=+iBZW&Q(LyB&#YPpnM9iRyUn8{4JYYiQ zI6iWagpS`5B`sg5{*u-c4x1nRpGoRK8rd56-64?-BIN+O3eAG>-lt#oBMGBYTKo!|Qu9~i@gL&1;cDw^ zU~-i2TaH6CQ5ui!Q-T;=ams#P_=G$eXtlx1$Xq z#RD545c)o30%T?=dcDL0!=c-0g{M&%Kj&Reeq9m^Vkc9Qz#=qy_ti>%ywUEXYALZ| zitlDEjfq&MgpPgctOsmE*{_;Eld4?fEfE>&-McbyaNU2~3I5aWGy{i%nSu`o3t|SR zH~B9E)Z`xnRB*+j*;~*L06ZZ-AGOyz<&RgW&@h*K_LuD$P7=+-!G2BnKi>%^nXw;b zs)%dqKL@qzfsFwC1z35)sZnC_DRjpqAL9v zkQ}rWrVuZS3#5ZFNf_^}!Zak-^r{}rjSx1f_%so=HW7lpJzgV|^LKq8;HLTfYv|YZ z96Ukak8gYMZ^_8t`>fDXJmEz?ezVynF@yRVF48iCveHEa12=g77YwT2?Zp2-4NxF( zijM!+=AD>>shb^G6W3r>GPC%X$wc!~mCyD>nmHZUB5q?p3necuS&|V-40{RtdyzmMdU5}&Cgjb`OeoNSA6eVZ>-b6 zPX$L9DZrFFIuMEKRO^OzRZi1aC&(g={^;?gf~hkE_Cw&Can~O5VqAC?ck!RA@$~1l z#srIlLZfSy%GdAZfcg^zb2DUz_sh{G9&JZjZpOqKD7K#O{h%$?DlERRp7GkQ-^pLF z;77MIdiojm!*R>tT{)bEavU-1O(`^qIXZ1;N18rL^*SLF?LmuLSSlsKw4r&;f3(Pp zph36>A}G*u7m-9kgjQ3+mx+XyVf5=7A5U(6g-BJ4AI=S&#|_P8%Y6B*MH@RV>SGe} zJzs!VV5{gys_YpO)gHcGI<4$texPwE9fR^Ru*+UY{i2+DyOO%V1*w3cI1iXAlK@Gb zG2XnhtY2RJ!m`M*iu?SdxsM?h0|(Y*w&get*yz_ip!4*&EK5g z>d`EI=gQy$(FiSYZy9`pDv`2UTfaNGx<1H$LOKW%AeB# zRJ2X$woxPWiLJszrg%dcHOA7TYHX$oRWET=Lv$jwDo1+K7YVP~WlvM!dN2@id&Rhj z^j`0!<~Xfav{#1hqve&m->V~Nx6L5RmsG`(Ji7O_LG=0mID5zF${MU|v|`(~ZKq<} z72B+w7^h+<72CFrif!9=g%#gCPxpJj?tc3lcZ~b*{NDTQHP@PRuDQr8*7bi)_{@^T zBhKgq^hpp^N~c|C8X`THnVPf_`tV=|91bumz&b1dKcFv$+@9=w%MsJuwUJ|tesg~Y zEDZ$k-WDbqm7b0&Y*b$B6xr&pErtYMeFg-`t`_Lko&toh89P4rc9L?n(`W>6f9ZF9 zOEaOq^jG2VHkoNCS8jp1bh3^~dg}bq_Ppq^L}|y`W`vVPh3Jo3MV-@&XBF!JVeSs% zuIh>o;+)NZ@2t zc1o80Rz;>ecAYXo*B4CN-Vy9%{R9DU^sIt+>?2+-t&7QP3Xwrf^gJW2Sq8=(W}iWN zM<0Hp!4S(FPWJ;JA}c)hnuSENx4i%#=9daKFyAS9)9*bf_+3gASda^hz4Pa;ireIf zoC^;Xp^{#1Jn#*EP@#nmSvx3T%$x%anr{8F&uc&JMN}y_eN`m+!nPhRE-$Gp=_=ky zAU-jDHm5azNqxG|ng1{yVc&m;UV@>5;!QAi02I+V6@OmZ@d`@K66fwb|Vf+hLN@PXPKM_nf5WSq0Nv%uIkL;lLir*B-1KX9Qh|Lo@dg z$m~zl3k^#e;_>|EkCeR=xSdtdkl+b!LGB_;gR3H;p&TZXnhTprfh8-Si-DVqLES)S zWN9Y_KQe6o+v9lH&L1V3$nJxH08V-bsNg|D@k-4!T##sx{~=Dk%alech^K*;g4pN~WO4;1@X4dD~S{%+?* zT&!$O&A$JmaCd5LxuJ<;cgC~Jr!y*%LV}To=2*c7l0v71Hyvo^3guE@pqr-4&Dn9a zJGrUiPAL=dLlNDHM}H;so`&+lQlue1`g8s}=H`!2x?P$%8biyUnvK+v@y@Nz+lh0z zkJq#2Ef9POj$q_oWdL<(4p4Plcaz@i{OL5(esdDNkc43&Hb_pGm-Wh&-ii;WSUbt} zuwWi`*0CY=G|u-M8~ah95cfiIL~cY_8-(Z4JOoF6 zxde-|m1nf0$*~{m03-xntu*oFyS@{B?hSuK@5YqOMN#rnNYs$7*%N^m48jTiA zB?s6|B;#)eDm7^Bq2dha4Y+?=%#sQRet@Rq4qIt)25-1igbTnv)Gh9OTyo)PCrrBM zn`g~0Ek`AE1IiL#yMVRZl&cE~8q-t$p43UIS(*5Qz7O030<5rz-(#@vTa<2-`0$N? zsb+wNVBq)Q&G%%qYR$N~XeWcxFueu?Mw-UI6mbuJ^VZ!yOG?Ymi?X1HE{3f0X(cpe z!5+|oRoJ#0o#mi!kQl`nT`*zTZ{oFG5DlJPC z28`Wwj)`o)RKtv94a0iRca^Vk7OhMge$meayo~y%i>c?C->@-^EXf|4rAGivE6Eu8 zpF0nnM(8kLOURwmDwT~9ae_}u@S!U|^x*1zzb{$7nL`bR!C!Y=E_8Yy#$%gc=?EGdC29##k zENhRzQt)&6uR`o^$h9xWm7PuV`Z{wlwHK>k9qvFPzROlelRGy&kT1^YX);UI{6SPS zfus*gYY@r(5Ch`6#?8#pV}v^hBG5Bll5Id7CZ@dw8pb;YlWZOCnn=IWJ0_PrZsji& zfWDl%unX#T@G#s^$?ihB6k^yOP0iVUwPb-Z%eHKF7RzObsMd)HQ_)5cdTpo(Pgljo zL`UFQXiz0Wc5hYEm zCzC4-2gxBYZ(A!aruIeKGwjANY+Q$Qo#GrB$q|6jHFxpHrw>(TFgR)?Jnrd3_pWcBNnD>pOoy&z(`Wf_L;sKR|F?LK^S_-R z!Y-y(4jQb<4qi|=z)FpcPq`EQgW-vs(NObM2<2B^5O|bhCkSrG#U5iXCY>A$)?n;q9x$}0ogR#%F)yZ{%qw~(AGqZ{Yn^aUYI)?(9)Hn=jL zkklaMFzPexp=|}fvs<1iV?QN_XuX;a-C%f{d>M-@-5SfwWrjvH1+Dl7zCc#xvNHys zL#afo;fZsTJua&Et#xUhbj#28kHy}6+wzFMisYFe6X?K|CV+{Gf80A)YsQ~N41a$H z5cbjKaJzC~-BhcL?}dUmLn4K(oqY8`QMp|t!uijcz)VzsRcnv3EqZIvGBxOlWdfmy zNCAGYF6|L%=oAfQuK8KY^S<{lh{Mo(#5a)h=Ea+c4y8OM^~ek zW>eu>9iymca%ehA;;b{oJQDAT1Oog_Xj>D;j+_ejNz2dXP_$a-oB zq9cB4KvEx@3AN@xJFwDzM{9bX8rRE;z$A*ss3pf0O4AI9>_9(SK)`VT2#&?{&^ix} z9-oh?e-wIaroR>gSMzPSA(3Ht8V?xsk`)^AXh27L@BG5>sQYUn#?w>toic- z)M#{OgQnu$VZ6PKx$Fcms@O?Vw(_Cm`Pbyc8IO4BGOb(1T~XrOiz$63IN zimf)oc!E4x5hGK$9QqB9`)Bsq;UZI_?Ih&|iOZz?7S*#*@5QNYfwPS5Jg?f< zTUiUKwzRI2T8%3@nzj+Ws=RD>!L0?+No(ilg4|V%i1Xy#r^)-&2Q@UAAv?TI9HC9% z&Us*9IUb>=IyV+M{*%MNqJvdgK$n|F!&+GLEF4lSDoqGv+{wNnY4#|*N^(CO#iI<$ zXevf|PUf5k-eU*PHW@sai^FIR;6>KDwL-b?Pttn`V{m!z^5LS2bythNXgk=rs z+fRRh4=5-ABu6y8g;LN4;^Mniv+NWQw(Po7TB$7^8DTaD4HLBr%`J+_L=2B~OEg?8 zn+(|s7~Mv7R|?4$n3lXbakm+z-H?-YiFq}b+!>8)4@)&(izn@PUK0FAr{$t84CR2w zU>^rGVr=kjchA>oTKS~FvK1bKlBI1*tuV1G&mx}Mny{>!vokp%uB}Lj2*^Lgs^4nVP9>VUzTE74J=hl&sC@O$`)hZ)r zMw+bWb|!h5&M0=6B&30-V1oq6LWw^mi(d`WcZz}1sALC1U|Jo2K5(+}neRJdKvXAH zH4L=n`CySlYXR6YSo9c}>xubaH@`gjk=$^W{ycOX8j)X>^~Kp)iUr8KC3Ji2?>Bb0 z`gpu8eGS`uJ=K4J%PW*5i^7}{3?u?D+aG8G1H<&gX^Z#&X0BD-e8y=|Y zyg?09k}A$>VQ^Lv*#*xfvt;B3Iqgrmd(C|ViDQEFu;V=s)GuD)n*+ti#jyn}Qe=&P z(EOLOc1byu%$-`T@zI%fZQ6FcWm^OW&3d^*EUr=Zpa#bALqxnbk<&rg_7JK?7C=?FA*Z}?W|vp) zh)ncs^BYC5$D&jItyrU$Q$)4wr+pJFGO_ot zEIk}lY4_X-*0;#&ibF#|XctZD=j`tOt%Plq=xP`*Lp^St*MuEFu$a2N zE+;2X@W(%&e@DvCpV%KYbdPO(wy-v`tBiq~x7%QUlm;*J1}pmGI~#tTj6XKAIb1PS zfAVV~jB3#95;v)*C*LzhA>@^Ej3G^M^LvJsf>xF4GjfYW_gR3jeM4h{pSh`?ltF{a zT+HL9&!+txTq>bw0~G+C9!O%vaL8YLBHKYz6a&2N$Nw8@NFq`-WC zH*^2pzH6NsiZu+B6Hj>z>HfWiz&Cbw0fg*rdgV3K&Uej~&-wTYMzZZ2-A^K92zGO@ zyrb4rd#+v9ophib)`_|#yH4$d(e%q>=($2c-V)=5@qA??;1%J;aeH3y?=OR_ETvT7 z^CbZP(=PUJR@!726=>Z5-(H1(|7a>>dldSZ;e#`48!OffyUF#xTu0{s<9i(F;;q@dM)l_P-OnIGX~!yE?(Tao}|=nN!48;J9wR z)6D6zazq&D2S0Dd#2(;A9dH80`-aT+cRVB>8|!8dO%hn*xDsP)SXD_52;>W5Ip;p@ zM0Xa(H14!&y-P0eZDYG{(i7@UD)5l+*Hu~U#?y$Vd4YPCrqeeeMpCs3-=0Eisku9W z;rVnv=O5eP8nTIzoOwuG6iEoL5!bJ70|%6$Sf+3UJ5h2c0aU>BajTwOkagO$-|DoH z!h5}f0WTjLU%;AI{rZ0NV4@dGuUYzuu2L-gu$#R|d$4YU$aL7Cm|Q*UQLu8$Ra^|n z8zRK#zWCck!bqkTMEUu4wElWK@Umdw|3|L;7nVN0))yD3YH4K-5HkXpIsYG%sJwkI zGkV~Wu*{$MVF+5684gTTD4{~)+7hj4xRw!FXl~boBmWj{Ec_p$xosC|7;K(w>5tOR zt-jeHax79aq#gTJ%5`582MN>%k~$G}OZ>r(ggugSdQalTJH6}*0bMh>uCDc!W7oI_ zzypssQW8@>pXpIcoznXu#=5}wL7%6LR$*KfS*8E-0sOo~81%h=0EW3aVh>buNn`s?v;gvZ-HCO~eX<)I~^) z&sqJ|#d57+j=Ij7Tydt;^R(c7Ys?$jvuW|sx?UdfTq)bg_(bc`rohqbJ$IXCbT&s9;3+I?vzTY4 zwc7tXvT~I|*55&zA%PvH)YOchQ?ce3W3Wzn4x$bX(ir3EU?eb5>Bc1vr*;uT40;W8 zxylgAwaSEK5BI52hoVtP%B_K%>-+oy?+BtRUC9t3%uR*$#KY%>ASF&zF|Y@S8iSsf z4xJfr3h;4beXjXlO#JSiFKOuPd&s}FN~zll*UXhgHc+P|B5U(_L=VOKACeZEQw_0+ zs4b1)bpl5U<1~P?Hywl;$U83L6&5nB_)j}gWU#9S4v~1b!L7E}gUS#?`d+wdFuB(N ze*^^??)94oWqVMWL8}{HH%;VhqtqJB<*G7FYtm@b1Z9N+bExe2kKTItKFoTjU zOSbIx8~yI18xt^+0Dq?mZS$lo$ z^B-Qz5n-)8-lybH(KY{L#{CT=2AOAz*Mq^?-r(8b8~Idc%gc)a`Oy0--`KIj;>QdM zrN^Ga8J1IAkkoMkcSj4AFA+iPG)^v1yt5#PEVo{SZ=0-=1oaekmGi4rW2};{WtULL zjvrcc-$CM7SE@wB*pYJd3${Rcj8pXBmndP}zH%mF1E0v-c_A##G4;KglzvUA9lXdL zlG%PIOhsltBFBTMTVLs@KA#aeyO0~$+Akt12ygxqgzsVBt8y(IW~i-e4ABaK6o0q& zKV*9FiA{1<1NZsvxUG2s5+z6Y9C*BR^B|I$&@M18)5_I>yCMX>eoB>hi*tIKgG2Au>pjJPI-1`N{(=W*MSr}J&(6N( zUpxE18+&D1`2X72|Gye8`M>D_g&J^wdEW(+kuj4F5>-kV?CfmTNH7l6 z^OP&>^y1QMYE~xBMGv^{rsi=lD%svZ-l>bXHY&zMW@qdv<2PRTw|I_xA1{4wAFhC3 zfV#b+I0RDC$7(+%u=*C_^ybzB`ogWgE|#tDMqmD}(>Nq#@<{8`Q@lkyTVF`Jh%?wr z(#+s(KE^Xo<%8FA4mNYYg{R@rNtj{y;e`$PcrV#zeyX9qw!T4ykJG6{en)dW^hK2N z_)(y5p7SirNT+S&=V4=;+c0yU`BK`;El@zrOG+4$NV&nYwU>F_Iwdd$CpenV{`hjU zO+T3>GU3M`u^t?6nfUwfE0*Ic-_Lp7_ygME!C2(dl9E}1rzpI0w`GOBPe0PdDb-t> z)vKVlexZVPnJ;VTI89Yi7({f`{K@cl_)QRCtI6p-H}57tnG;-VJQnM4QZro^UI83t z<+qf+PT-L~RyeF5(2v~f2!w-W6frsG^P|;Rdc>}3$a%{a*_8+NQRzYVB|d|(?kU(G zEh%oXh=3P>$hSVpy80=5#&9=Dfh+}=nLWiOmmSH4wfF5Bzptzbnd~rg<$+ml9^Xqj_3#v%5~{+)leoChbr*%geg>&os}oMRJ-&\+Z0IsNGrmSmfL<1*% z*Upk_t8;rSMk+^pLAv+`iZQHKIIQ92c&5dV=u2=!?px+ z&P)L+y`a6lakyo813+|HuD zx28P6y%EQSQ#u@C3oSUB3aw#w%oLh{E=xervj+mZ#y!tr@78uFbx6&oUTn21ED-IpON1txXXV*fu<^v zpUY>425V6Pw>DncneoisUfV36p>O^#%Lu2W%^PTBolRwC4{% z6ALftQjC1Bq40_4HtUAu@MQFtPV7+)&^yhPW1;x_jLpOpM~Ys=stu|NEC#mN`yk<; z2+g7t^>>)Ja|u!BCp36T#vrrGKiDsk#d-Nhd|2M~Ymz$W>qJ>UULJqbJyBt5mSFce zpuf4XIMlrSUAHW2p{|TS{cL#ut8V>YA`1T7;`qPY-0W0QmC=0}9pD-ucVvyU&69Et zib^|$im*9oMa1LevNc+EY3U~}jrW>;Rd(fgIXHYSB{?#^Hb!SpB6@44GU}&%CY>ic zldrxC0(~Hu!-in_;ZtSmb60fu&h8KSDhK85PY|oE)i1BZ^S`aTvRfQ6G&cqX>+cnY znQd&cj<2%1ai%Tg#_2o!M#lE0eT7CognOdzi(fx6Qx)MVAtiTVYfVfhby5hTMeUKZ zxA&z{)xsFLr6naTt=Lb#30m@qZO>_{Y8Y!ANN(7x^4#> zk4NYgFJ;^7eRnIj*mJm-n-cme{I6xl5&+V6qVZm!zKEG=g9DMK+edzZ(!q~%Ao`6G z-_Kt(t){%Vm{|RGR6{h#mihVa9b?3oMyrV>EvTha z1<37}8$;8C9jq-o@qVNM>ApCDX3Y3Mg@-^;y+SYF8K*_bppvHj%vQ@lgMa&{eJhwm z+SnQb3qy*HBQv>^H!6Qku}dzq1g z3~U?kq0UisTR5pVyNMi07{MP|2yATR3ZyZr4|~DfsaZ~Y8?RU#4F3?0?|HO?VdoR% z4l*Yl4qxoFsUG&S&8opl(kPC^0y@agTH3RQZ%Si<3$YDrk z#W>nFs)=!jt)#)1)hzD$@2qnwIO%7$()JFs(DK1EA4tpq%+&xiiVBMKyKdy|@-Hsg z9PG$X1f&lu&+xYoGP{3AN_;y&ZoVrY+nfG z$a`?o(9uvJO=!M+ukC=gYUV-|Mc=bTB}@ED+E|%&Vr#{28K<-E!iJVbv}eGHx_R64 zti(v8OFidMhRYa0%fm6Q<#I4VeMWbKm7*c)wCFNgT5DXP(sGKu@$xj7w|-KQBfmzn zqkYvgw>d+IkJpskofC>25bi9>W^+2e3u{J9lJphH?-8v%uc8-jTMYVAE=$NM-93uysUf6Qi*xhl1u*RIe4&RnA?#V4AMiF zdn$-04E05vJ{w1~JsV6XiGaXrg6j<6Tht0LsMbF)f-l`3z{T56vhP_7Q$FfGbxN6D zRn5TarLV&t8o%#{V>YqKbHQeES*OsLy7sbIXuo>$bKa*I7=)1Ri2qLHU%59$=UX$l zt};h1Yu0zF@Z~@hX>$Sjq?MPXV{o)BA1!jP$f_08x-6Uaw7GzXu|B&R=QLd7n+rWq zbpco8lpyadw@G+$cZxknttsjpW9xiKoS*i{ElIrH@- z@nMi3d0gV;{3L#FY0CS@6TZN*N1GdKe2$ z?=f`WT;`cYM!Mr|lc~y1C($`NyjJ+AGHgpnS!7X^9c{oQuP`M`-O(qb?%XK8Q2{xz zVThQYYkj=+T{Y&R{wX0(`hgNYYSYbA+3Z7X5Y~tNq3Z`L{D<%Fu9VT7GrKL|i>1nE z>C&?y1$=|hgNS>jgoVjQ#pr>a8Tqn7kP`!8*(Sw#Os8a7IL2QIvHL3Rg?CZ>UFWCs zlRR~6mptI`nQJCdc8D`}v~Vw7>KA1ywS<)bOzL8N=ng*bG2tVK=S&d(EFk$zm`E^x zj%AASLKEco{y}%P`yI;f{=H~mI2ECj9RF{vy%x%MpMIZ-*x*AcQRjkOp4sUR5nTPG zy#gl!H1fVrjb|5gx0NWj0~M4%ma_*R6@)J92T_g1J|v~pS0O5{6SuKkDe`s1##NjK zZOaYoxF+M0g{qu|u*FK(IajKAYg)_u+r>)4{3yn^hVSL&jQhFSyPKFk zaq8Gd@Gz#JCkW32nDI<<)S`5_%7hBoMt)LizD66BcQHR(l_1{(XD&JEksZzg**djlw8r~C}|ea4|vXt4#7=(I$lCZpre zku#a*u;*ImCS9$sIJA~#|DjtE;0UGGeonUtDF1;4pSK178wmc>-XLOYX6E=mG;n70 z1R}^^R_(XSU;Un7P!?#Um(XDW+*0d9_BvxJv6;dhX#r5zO2&>(8i`eH-kI}%f#7jI zCb1;8*dg)xdz;3ABhKpjS(Dlj8W-Ju{Q=ED95D9QRrJ-W=P z82uvO6k3_A^C)RnQ8>)RR`w(wB|9ar%3u+1YW-Row@}dZhXr`9;2a?VofX4c4TK1x z!GZE!swj-#73ip7c{Z6tbq3{s#d6t7&5!Hth%)*C}T-ZBDDXnaPb;QtNc$SNgZUt!S!TdD)30}}6Hr4jwBdIIk2KnZIG{jZu zaE@kf^ zUnLb0CgaV5l46L%|4nYdaYVvq!8t7c+cykuoP*=wLVq;^Wk&@=Q!Kx;)RI(<6~}n& z!57^KEO5qiS_pvvwS|44caLsPTuG~1i82-4uZ5=>6u;bw0hHWE4#W;7rxhAJU7aF3 zxuv8d1UHTBX3IjKQJRy*jLS57s0bK`&rYFsBLUmYhmF$ePYa*n^VeA$egxJlxL{3a zTs6%it}<~LQ!)cvRn(I;j#IX=!HjPlG^2Y>7w&aSN{}3>J>mMmd-%tZxGV(yD#wIo+a;Khggpja#^miJ zEtqo#_kFqnPHJh+uY@a1j}EYyZgPIkJB`6eqe3Pqc+HyCc!Vd@Ntl-|?@xISGvo~J z(GCHg-jsQ8%0$_~$F;C-Y?=iC=oE-uK?{FE`^qujpBV~yQp!l0J!C6aq@pEi*NP|?cn#C3;@%0EY-yZKg z<`_eEjx(_51sHB+gWLWDW8^8UHXPIyYLWUH zQ}HV<)GO<_^R`>Kt95TS$HPTvHpiny>5D%ni_(`I?PCO=zFgzxh^4|yFx%OBmBu`FE z_Rp}NcqO``W2^uAiDgwy6hPPTNLv-lDJeu2R-0D0CF(HZ?a~LZPzb?PlRTHJ#v|^@31aY&mu4D{f10#UB*+2Q%!?t!FM};j<5I zpJL$zBhagpxIJu#0rW%a8B>#&sdlYdIW)(KUCzW;2e&>B(q$URL{Tdx8MD1;Qq!Jm z?O@bRi7J2R6r;h?!u$h1(A|HA{Hs@pyB}DNLSjFlw+_ci6d#hc=-cb4T(S2G7xs?3 zUCz1b{#EHCP3!xSjG42~+lg2k%|-{}Z&uR=S=`PGn?;kvJk%R6P1tORPP!l{;VYS) z+Z?yT9H>q@ag138wz#}ehWHC^c&l>Kvw-^AZZmtOGC7&}?hRDJ-ni7rxvzEDNu{*K ztF~R05Oj_^dNLn>`vR-y0_rwDaTDf0ar6Hc%lD4}$bXDb|IQ0nYHeuZiKBlYkQ4+m zK=d1~Dk-nw#x+?rW<%PXa4|3_S=QW_!+kR(St(3MV0cjVnckb>x)AmGjqfv!)hH>W z<8>a;^(5)h;Z_&eZ6BRMkCYBvNo~Dte{{RbY-f8q+WMLWwj46mTOvvv=m{ar4t*Dy z{-kDP?n`Q+uPARFY+l-wByYx{gV(H@q*0^#@LHiEmHCs53PGp&sF{H7w6($bfpI zvT5!LMU|Rx%qQ->o|a;U~-zqkOgc}tjd^3 zY5n{a$6*LZx+!$kdrRs<3-U>@Yi&!87^~9d;m_ zQL2YutGm3AFC3EA<@T9wy{TG)wR6G((3p84D22r4oz|q z;ec>!KezFZs-qj7?PJ93Gd%PbO&tK8=#9ZPS}Rq z_IMhVw$Jp3e~UtA&#vTiVlK-zXCr_U6(rerAs-h5^$8~D&`OUDa;UUth;pbjW{3(x zE{pDTPLXy<8xh#Q%Gt3+ftxu5dP0KUL7vO;OHls?-;uPW;kYO)%AdDY;1@kQ7;=9? zX(N=Gm%VGpAbIZe^V~n_GLKtW8mH|^5-H7hl_YHq zwTn0g5*{RHMo5h$cSbBz86eW{UR&-q*DXS?Agzm$*~bp9E&KB=2e+%}6a*ey?lnJN z3!b2P%TrcWxDC(X$&jZqfI*QvY9Rs@t_{?F1dSS!P|*`5Sp6P;s@waT5N)6TE;-+> zoujGVhdo&MTp{|Bk}sGcB`EAU;@<`f*OkW({L|L!@3`X6yki-s(4Vf*9x>T0cI1n} zi-MI2ZMKA(8MXi*9RrZ2REQLBh#!H>JXOJFLKl%|mT+YvVr3GAPR6Joi|GOK8hDb9 zkIPTQl262Fa5_%_Eyu570N*MRs&E`>szZ5;`iMy;v7;qgfH5O4%j%je;CuN=f6@uC z-}0;H+{$_0E#J(y5)mqid%u&E6qjp-c=ol~C-^lcDokn*Eb3jj{UV57eW7IcNVg<) zcBvgIjG&x)UFfQw??O-`6uO$}IK-{DG|>>ur>u91BJPZ_Z8EcFqUojk<5G9#x#5f?3zJP$C{HY?YEFOsSq zC99%;5|zgo|1qZhZDji|zWtl&TqQQhmF1s-Q{ zWGW5-j0nTC2DpbzpVi&Z&fHgB-egvsMWW_a19S^V4dIwz=VKG-#4?T$)vsZuo@<^) zC+cIR$Ei_vqvET+x=PGBM#!S3m&wEj?5-tKSfpm=@jITt-RaYyGWBXj0#doD#>~F33h zhLmv(MEH$=$b1}gHHuPQ3hYAgqB0RK%`2m5Sq^^PW!d_W{RUK;s^2ErMAZ3SGu^D`iZeBD((YHPaOsZiSRf#tm)Y1 zb>=HL)=>@Wg2Hw_81S(OSS-g7F_MvRtLdaz_$}3K0Fc^$WXz7q}uv36OTtmXZpnKbOKFP zm>G13dw+Fdmurj=V08#(WBFf17R#NNkZ32h`@kqvPnpju6uZj2YoHj2Y_23d=#Z z(FRQV=z2t4c4im843k}>Ur^^^VMdjT%^jwQLO?d6Ur$V;k~tE>eeaFziqJ~Cc!KVM-({_zcpx;O(I?EXqra{eEqn2sjCIP$wEQ>s}#i*B#+ zE`<;?V|#aCpl&kp7(<*RTLg6&u9q8LifKwu>I(TEHt&e9LIyWKGsxodC1bjt^Z7L% zBjM-+*1eZgt4_Sba@OcSullpSvked_-&kY+98mpeS8Aq5?ci^fyH4U zCw`PD-=s9ml{B7H=;OWHlpwQ|Y=#_(qn5sd1}IX%wqeBPPlDH0JLHtzY0$`TqE3%p zC47KIKladaN9^w+evRrTu)}Y_aX-}Y+TX~KxfFTVP7c*)o;kg%*!m5_H*M~_APfAv zCg+Qr+WLb=AQ=$P2#XB9IGnIh3?5Q)Nx}#&SG2}T67xGet8VoYL5m&}L1c=5qpzg9 zsp#j(+V;v=9Q#!ocIv@odV4Yu9s_rh0?5c58Q)Vo1V6|%ulQZ(#_5AqS0wrA_i z=-X^f|Fko>Uah!_NpFED zNz9JX9g!oorf?1=RXlU`e9_Rf)&S!uFK;-r;FW4`W)Z6!SEZ8H9;*LJaxa53+^;}w zra=*RgWxab{WFGH?kc`PHD@bSR=G4+L>cc)nF)9m#;XytD#z4zHlv!CG$OX>ESUZR z@_Tt~Jv+2R$eHsIiZtEQ3xwf;?31+S@QfdQrGqemIa8WG1D zK2Lv3;V|5rt#8&xwwJ+MxhReR;1FrIg&{KIF7V%c2l<$$X}^({Dofvs|CxbZgFUXm zmF{Pw%G6n)Gu^QI zthce$5v)r-DjGbzhbpey`#OyLy7XCW-&zqQ8^sf>($J~KARt(E(Juy|7dLfWxYE7pJ7S==BDb@ zk_Mowqj&z|%aq|2M@?Ub4h=)Coddzk_!3|V3fhAV3S;D0Q2^vk1ZZ-oFOWECWLP*6 za(ilVSMFz!|H#OM0WkBV{!4%3Wz*;C*9YCv$Ddu< zFI?O1*dRb~jQJAi+$5u;l2qyCcs3KOTPe~31bZt)MasDKoqUDf-KKa)^SX5f+eEfC z=d{EIb^*Jq1J^}%TS0FNWc8hc(C32F8bzCh-3rVC(hdKR7}YXr#420x=EX>f2`~Mhme&y3=$mfNX(+)uS<7 zy#*MYI~eP_S1VH=El8xoUr~5pKxv8%Xh2WiaV-grxLbhX3M%N$T@cylfH$eNwz?ij z_G&%}RKFw3HLkqQk9}R%t^nVeaLE%{gwDrPTMtdg#*9^F!4CFIArizuG1K5ISq@Fd z=~X2xLNa+reX24e;AGLIg)L=>ug~P{0{~Yg+|y%ai~E)%buiY8^6&&G#wdT~SP8Rh zzd9;3yZ^Gfo5O?0>u5~jIxEx2#E^h(O1g{eDAbBy6KixR4pt6R4bcxi5bvZDQF4R| zsK!Aiyg*I8v^aij55;B9F-Ce&K}j_cQL-bSz%f=At6U`#pFj#D{JcFFLaUd%$_G?G z@{TI6uzFVRIcwt$#;YNMLdREgf_9t5Wira$piXywZz7Z(xKn_+Ygb%`tspiRv7Ph>a`IZGONh{6Q@GChG_$Y`6V#Ek zq%oMsMVLg{U%%^`2kMAEMWdatNjBcqn4j!!W>z>2y6m3Z*8hNZ8E0jK9|FEEQ@=6T z^RlN+ws7y--}i9^b6_Rsig=1N)E`LwapgMe98?p$0!u423mu`Q`H|>Tlqe(TXc1U~ zum)yB^(-%WP6a+{qHaC=XadoF^PJxL=&QiGvBblC4=lIA3Dew3 z8V=QutxJtl*=nLp=`5}Php)E`i$lxStpmZ`-QC^Y-QC??gHw2Lf;+)AxVuAecL^E_ zcMWoD@9uMNcYmipo~M5CvtZ4&=6vTEIN%HR6&kPoMdEw;nT=A4aO%UvAMf03x?OPao;!+2MA+p9>j9#=JX(|Cb zf_CMBG$I?$yQ@K-9(+@m6sUJ*e`HCEA*qXL5cC6@CfG!sp=}H>FLOpQZ*6`tGnw52Q?OU2&2zij z0*Ou^M}?Wq|G?ZoWn>8TyZJ|d@uylV^pQwcG?>~6+%w<%1&fiov!zs2XBX`y)uFVX z=Dy1Ibwd!s^w}FLhUEy%kuHc!b~h8FE_ehQ_?WMlj64@c_LC^BV7}E2bDR*6243;>1uEyMwB|MWnsu(sj%6B?cm`F+g$2V|x&bsV*G$NVP%_!hRFw zq0L*a>lR#R_VWWG<)J=uhT13f%?AG;DhOsHG#J14*~%jk=tx4McW6e@y_2j8;UgB* zP^Y~xrXS(M&^-sEw2;e6$a07Qv^n3gV5s#_mF{W>qOb;i;FLRe9jL8`JL#tj?@j#E z#+}o;GAK>0E10b6V{->gSO@fMUmLAOt7#Z$Ui92Vp=luI+VLPoj!xKdkjwz#O1&rp zwP+QL&W146s53u1u(Xl)bQ`SpsuHAvh0f?o$7M))#sn)bHAf3(LHyHYmalBS-IYge=}SyFomu_utb~lf(ew4@?o^ zp149VQbY_R;*x@gjtOadleT<>lrRSLB%m>cpk^71fz&AF#h^Uta zlGm=1JrX2Tk!}?hxwabq2e`jO%zx}M(4Jj&hEcnw@~`|Pw{lu=rO-V;rCs!3N@8!T zx+o00QnZ|jMd^)G0*;e|nzfJAY!ixui&?%E2CRYp#HoiylMy^iSfkZ}nzLnl951*J z+PrCXFb>|TUf8&1Q5#_SqlG*%?r__h*F@XaKmco7*SQNo&=JlN>)GZDrR2yf-e5h6 zTMKn%2v`Jt?X={I${Y*)W)xYRsB4Ij2~L%?oX7qAT=8rJU?il(Px33f2Q)!(aOG@- z!^S~JDv<(v&RSO2XMWA^c3DFmSCXB5k{9?`-)Wd;T&?xKv$yk{eKF#8?=X*SXGZXg zfw~qpNFW#CZCHY2yxMwg?%czj9KOK(7-Z{|e;Sz1wDZbNs$Z6Bm*#6KmerV=2dEYc|6)b+e(3%9JZ?~Nuo%t5qcC5FdyG#fi;$IO|FEFokNuKDKi!}P zp@4=`$fc!moJ7C1XZw_9yzmy+xH+Wp%SwIv6bqy=`(4+h+`26w%&5bhd(NFfOc}=4 zZnj)gfU3_Wcm(n1EQ1z%S!>8*QK!GI5Jak;FJM&FFOg!V!nyd}#SLAKtr?7StuZ+5 zAPTXGa(@@mgJM4sk-%Gwj}$@O4+gGz6jcg*3P{Bvdy`G(EC?*#xTAdG(`kr8jRkk3 zU}5J)E5|>O*+Cpj6v0a)59SP+a3i?6XSaNdW#*T0m3WOD`FVk9aKAriL-i_=BrF=h z0KkL*O3|LB?<^*TAUov*`pLM(1)?+UT4W4)-l*GGmn^S~1T~`-<2P&RS7gIAt!vqP zdOvEJFIut^qWDNxFI{6x6P3jq=`6z8`{*(0Tq=|Xicq}L-1Flt&t)mRMMNlifL3-s zB3*#0yo`lvZ%~w@DR-FkjLc;s)It*RfY@It8DesOAi*BVCn3JMI$4(ZNu>K&bT4mR?W{ii&F z7f|wr_2mk7dZ7#L%!GGU6z}i22EbXY zLiCwJQD0I3)VV4mh@MT?;r}%@-{9U++uJ{ay;*<>>S{Gs*Z+iBh-?OXEKtff!g24_ z+_u}S&jA(Q(|C)tf(FWtZONUCC|;VYKX0+^>>Cqv`rSB0MaC_Bh#YDvTu5|?F^Yyu zFG+buI;3bU7L1T362h^mtWy`syGqSZVmY9SvzyD zf#&Q)D!o!~;wQpo@9_TN&P+r9c%BVLU6&Js3d|kae-;?iB8dNl+5V3@L}}tLa^nxJ z{TJ{@sNRExwT3KsObJhd%&0Wy=Q&(Yb zzF3BZQ`y036YE7eT+5l~j=>=T5Bzu|1g4T77H7NTZ|HOPT6ywI20!a??ZJ2X5IoYY z6X)t!Kufrm^(W% zyW9IDXTu=>*EamWqSpU00se;>=-)TZ`~TWBk0_&IAR(iP)1}&sHzh!i|JxOA9|jxQI)uf9mSRmW-zw`5ZZ}PK zPJPd&XoER|>a(9MT3!}MJIz|@*gVPglZ4%RISiGEgSutmyM=ZfO(YQBlutX@#ijXf=f~ZM$ZCt%;ft435p^Hz*x*=sfZJcH0BI> z8|sgmYbsNf2CLiTus7$Uh^X9@2s>E!*9)ZfTy`4ULdgtgFd6Z=G1EA9-FZCHH1XBh zOGD2H3PGpHvN$7-S=wscp4M6-+GhZ>1Gg@mAZCeVTsRV(APf~jBVgbVGAm9KAAe71esx7GM@H1h z)TUM!w+{9pyi3ZSh{Dh9BoFKDBQGATj3SpuB_KDp5muh!ujm^<2|z!WlXV~~G&tiF z*=4W!whzY`K#>b1oMDxU-`SO#oIp&(cO~W)+r+tdFUrL?C*vlgZu650n;s-y^Yvkd zTdx_@9s%H;9lNVCr@rk{oM=Lq=F#19JKCXZwCx)CT7NA1%nk9HqB^i%cT z3_!d3M`|V6W5kqFUs$afrCF||#P{{!E%11Z?(+mEgJ=2cu*&i3?`Zj1m6@;pVkHEP zEJ}8hdDiDhX90ID<}|Z%&}vO<$ahfG^pPBVoF2ojcpZK3h$zwFTvERgt&Q?a-kd)5 z=^zLKmt3fneEgJl&H&kCdH0XWgFh1~iuzSslIFn6LNK;i4%JguEREH9lK>SHdop%4H8Y8VL5jaMH#ZRIV|>tHm||dGN;yg|&)$&34wI^um&&M!Ynf~d zVB4F{PEk+hH+Iv2bcQQF&r?xdb$i{8amEgLefM?dN8hGJY%@7ID$c&W2u^#5&(9Vi z!ECFOr3Fw@(;p;I@>=py*>XGRwp0;_!xqy!&)~(=Pb8$vy@aUhcz_;^l?pGMg>M@{ zjiF1~dmGXw$cVLuO!iaR5{?Lfj4KD*A_hRMSxtxcKS zAM)|!BE160iF|{>UdQj;i+dXyJO1aJX&}jEH6Yx1Rj-@QaBuhNTJtEE^X?C;6nf41 zSpJ`0!5y?h{=kt=7KjVfK_^3L3gF?#by15xwlUC^n_F=6&dog{yKysTzf_r|6~E!Q zmDyf<9MWg_K;vxvWO?BXD|kU)zJj$%r4oZu_H<)8qGbi&d>?%uIfB_z8id(=%g)C@ z1gvDRR+}+yMtV>fs!-nIM`UeJ{fJG_4fATZ;6c)^`(103ACj^8{K?Mc4KR8BqA?gP za`fd(66bqlpsVeyMJ5u?GzeIV*WvRyAQ(8vc`D648!EA|Unqxc%G`YS zyXb*z>Q%N|>aAjtuSvrf@mk{u4^Q3D9>DWWPHK5JNlt3zn*!zOvdbB-YXqypIc$j| zG?`36@cR`ya0twUR2J}DJ$t-18z(<>9sV_b0tamIXJfpygSJfEYGEB-JtHco8GWJM z(94Qx%1G#%%iDk#aD83=38ZTa9 z%hz-0Hi^V2u)@_;cFA(#0wuc~lmMWiT$n9o=Wu8Rl@&czA|)wriMft_&(D)z0~$fR zqjpozzUuBy^zIp_@rB1r7y383&ax4=AS0);jb8}qGQC=HL7{Nu*nRZi1GA)Q7Gtz(y={=L-v1g9+MO5N2~C#)@DnJr8-?E&0B$S zR28EZoUW`z!*IStkng*iv8aQvdSzz_4go|^{#@C{P0Ocgs*I$d!E&eISEx79EgeUW z9|14xEQVlCEP}YeHtE+&L?}vFPCs@C__>FFx|<&&jh+0DeFUJ=^Jhv>#hF3>&j-gZ zR*3&?$o|iTgnyKrW^F@IloBV9ikQKnl`%X?u6Y@5{@W+~b+~F#2OzXsk6oy$Tr;TX z$fp}_ZY>sSzsJ6Vb?+7mN*7Bf5Ov>6`}kXbQHC+)<%-01_?_$X%R2AT-s z1u;Gv@K^R8FUiJqc49i>LU2v5KF9e^)5(41%15%+<$HR-)?r@lAN}mj1^A`tCvz6ApgLgZ%QYrHMSa;gsBv~n*!2iSCu?!G^M=R9!Fcyvs>6z$ zX$Fl)MW-KyHC$0IY1)c+4ewYy2t1aD!(5i0J~Ao^0G8K5u_>~KPq0$)3^Ek_Rv1cyWSB>b9udhFM$eve~`8)M9MR1|7V z(c@U*II`JvqiZfyx@b!xX-lFSn&a5=-E|LYL`!to)T~Dsd-93{Bn0D@67yULV(`BN z3d~%wsI|%>-9k^Ohs+Q_KZTV$!alwO-cJbmGroq7p?!(cR|=2W<8~C%-qQJf5h6+` zF3Go_f>>qIR{CvlEUec`4HJQT>$67MpKBY=J`1_UG4$M|4`$-g%vf?uvBl$d&5If7 zypReHjV(2e#zgq9m>!RzmFL;`T^7Dn!#yS&@y;;l;}uL>hO8h|`V1FCz!r@#;F>_6 z+fMF9Fli9oJ!UpZ8L>)EGO==Q8(T9%`s+9TQY5>Q0L#hYb592T^Jew=>yEWd6H%(H6Qi{$vo#5VL0tTK47Xexi| z)zFK6k0Dz{uPry1JGKMa-N+*@z^*?ahdG)&@3r2V_Zk=LJN=%!razFW-4{Xxsu`%U z#nx*d{lk8D{F})*%bo97X2XP5^8lUC!ptz?~;DxJcp|`bDu$u>r-0)SLz0H-D5uP+Sz7R+csP+omdYLeiopwJ~)jQ8MQZ2|ED)rr)O6OKo$A^tN?x1Be)tS$vRMoD)|Sc9J;H|6U=pI4!kU zFRpsYS@>lRxqJSYUS*<~Y|oQ5`3-Dr=*xrhP+k#v^4sTn!yEt-fbyCg?fP7gO|!x% zNNi{*ucEIjtt%#D1R;1v&dIgpv@~Dv>oW|uTAY&t(aA`_am4J4#Q2@DJh0!Z0Gc;( zkm2nuw)K0F^iW>$7h2D#jKoFS5~*}P3rxjidUlP1MhVxB>1KneW`e1NuQimY_(^$! zBCHf_vMeD_;c35S0UbEl9?>zd{Y7mw$y)y5+viXT#EU-uq?=KuVBaJ1{dRrB70la& zVqmoK6E8FDGt0pU+V)-V ze9f4c=;1nJO#y^In!{?VwRA*dftW?iSCr?dqvlb6QYR}S8-z*alFc*6>%|7uaC258 zx8u|o&2=clIO{e2=$B3Vd)D5N{|ZX|iYQ|928H7(Q2z4}{}-Lk|6uq2Jq+Khqwj^T ziSe$qfRcq&l7fd&tka%JB|;MtR4oHPkEN%#o-{6Lv7Xbipk!rc1uk*;+wnM5pj_Ti zo_MK5faZrL+|MNFfLrPIO>4H?;!F$Ou`3qdmFJ$f^X{3v%-6S>OXW{zgVdsn{n#Si z5W)a0);s0n<1p6m-?i@Pqi}1ke>mJ|kPRyeSyDA@vY=ZD4aN=8Xsa2pryjq$N*)$% z{sduwT& zXRySEQriQ;7t>z;ClhREcr>TQK;6EM=?Ky8W!q|__P~Uha%iLUk4x|MTlY4M4%vou;yKqv^!Z_ zvtMgt75Q3Z5f4@$K3aTHLQZFFXgn66{oAeyB(#R7>~V?+@i!N6YT9$yO6iiuWi&?h z`NZPLI9hhRL(R0;fclV^i>yPe`Ib``?7;(eQW~lfNw)$rSyv|&*2&alxJq!aVECt= zERNMNXVPmiRd)$5OE$!vVW<1U{rw$sc>muN2k@( z&-8QydB+ZW8LD{Ej#tVn)wd-;4Cg@A55z=Fb82WQoSsTSdIxRqlgPl@A7)SYYZQGA z4Zw;AXM1GXDA&9!E?|izg0MDHoHR1Ja;kA;TIM06zdJAApsVw1-<4$hv2xTw#SXJQ zf9f!FcbS%<{_~uEL!bKl^oOEyGeB)~+J!-{lNMrS?**#pa#X>C(pedh*D=67bGt`5 zHr(kyUuwm3>HGFDpQS%n=9_)D7}2x-9e%kLReWnnFooGDe~$VvBX2^M&`j+P> zv$DifZqLwJD z*JYa=DLnth&tFD}NKpJDcLF%DvzEmg3uYZ+1*JCDpuKm6)-QF-t$|+b;CI>5g1a1K z;#$^YZ0P50u{=}MwwiQ1=HSk7+2WWv~x%7d5(b;yhh{_}#y~bvgZk>H{#4}_or*~H{8!uE|Yw&Y?F=2Q| zF_gzzOx3yKE$Kf8puva4Ly8XUrhyI(-fAXZ%dHUKB@v=-k9Inh(P0C)Re7ZaYiyA?%YZPuXep& zX`SgC!<{q`Q2SS8UhR)|6gma;#tXKOF3!-TEj7ZkmFoDf=2U`0tr!O?v>i`yqo;Y+(qF-s^3w~`^NNdz+=Iix%CeplDZ zXm_6IQ%%%Zr(1zKC30&l@bjoZ99D)weDp{PXm?i+w!n0e%cP!4`%)*&=8aqVCf@h} z6*HjLET~}v`{A?3u5kVk4X|EKbAkgc2@LCFt0aeJz8oDhjlTzlKnRg&tA9^#Dsko? z4TaPARbTA)Jd7iR!BcnaYv_gTd`$03AQsjwtmXnijGkjegM*pEAKy(zIPl*YgqZ z4g2Qq(B*2lz?DJnJq&oPQRFJpenViZ1bGik6M6b@FKQdX?GbIyOw0qaNqo5kGd8}~ zx-doD!u5i30+2C_SNz|5O+CG{vvu4W3J=YVUU$R ztx%GPhRa`@&AY|wO^CD6Eg8C}(30N|>(E~>53Zc-Cv87g1(32%IA^@UU6T+-kM7W9 zZGfsw{j#NAUEpr#<%sei;-Seskz&1AXg+kPZ8G}izr%9$a5h!J58gQD%T>LbR1S^x zbT1fkare8Ks`}4ZmJQ>;d387@PY=EkxRj&Rhk2;vkq;e9mIHV~jQ%5iPmk=uo3yEY zq(s``%Q6xC4gk{XB#=fA?YitBZ~AQ+qIYvh_4LC8zDbZ*+|wB@!ihn*^X%Y|GgMi+ zdHRS0p2Wq}Yjjm(u7R-K2cF{9X|Q#xHI314Dtb0o4~9k^>yX#>q-Nr=U57*-!Gm6g zyC2&6SZi69m5gIP7aN?s$!?G)V6pNZCjfXO_bc_D2f(zjDmp`LbI@tHXlz)p^jQp@ zgGjMkis2sWIvrSz5K!U8!|{ms#_akOp1>~qi|!nfsDO~&gMCt!2$^P{+<>x5O>}^} zZA5NI-vGIAvtY}Sdo`27%r`XBS z%@{RlDE!(Tw3$lcFTi;RWeVk}iJMaHprr|Q%@WG9YZ1U_XU-Sk>7f-hz0T#a$j3+L zISBBuvO6x%_R!d*#{c@gqCow7|BS>@x+AcB5rDpgTW85NxdS%!`-%m{Y4cKSXNMnQ zvV=>f4KcbUcyN!iNfD7=Nx4ez%w*Lp;mUB;47E4F7smv6pzn{{?_fw7NFHV_G+!U> zmEnur^GM&{XlpmXl|@`2^&>I~UP9IXuC-0(Bf-w{Id??3(n3|t;iLBeOLvuxX#A!P zTT4Sj(1cBa{4!ylp4Mpb=eKG&6vWRGtO){w3HdvJ{Uz6VM-AoSi%nthT7 zj(F&u@!aRA_?Fl`ueAg!08{sskVF(ol4 z`u%O&N+`g&6IGT*84mG_#V` z1A+m;*#Jl<_(mOl4#u9b?r3vA0l?va!BP|4rX?_o%TaxjWhkklE86L}^sA}KFK;_w znrZsoeQto5<{Z4D==X@g98;O6Q%zI77hlPYct;%sSEHIpyg?VX=J~d~V^XwGJhZ1s zg{{h5MivB4c8x36!JWB*q}}ssJWNdSNZD`79Dvw8^>qgfIIDn}h*OO=dW8$toG6p| zme^=kkW0Efg4qJts)w0S&^a_*Nb8G@RKEU*d*wPlrP(_Y&)>SBArr!fV(Uoox*8ZNSfmOzAnQGb;~&B_qa z+7db%aWQ6Y5-=IBW{1DhDkQ7990Pp}T|vz!A}>d`0a4Yn#7c2hS-Q`Cfb(3 zlb|w6(_F>v7fos;%Y=ZlFV&&#atooUjIu@%dQXGoAo^y2QOjL``D35E!xl{3oh9DP zdNTpG1&E1ws}wwO!sXbb#dzuRXe9U+1;Dgksk@1=A9rP0qkT}gY256&A)hQfO~DOR zZb4X|UJ1#HB7d-8&bAk1vNIZ8qPP`Nbv;S4rEixnt4gU;*!!#fvOD52_p!;$ zA4Pqe-I={*vZ} zV#20A;2n*$`dt}2y5Z@5Rh!f!fJv`c>Cq`G>Q50qhn{3?UQps4Y04dbc`eJgz^?_> z;t0J1KjDdYpgX8$WmhmewhM}6u?FvQ3UI4?2p67I8%7YEpk{9aO+=i1Upa;R;@pwv z0bwqcy-o2%4o@tDo(rF(gti74z*v2@3vnoSl)>_oh|*Q%>U1E^Naxn00YS8+8E8M* zu}A2wOU3$s2Lz*WfG+ut2}Ibu*9JFR)}MvkgZ(%K-=U1V6G-HaV52$-qeKwNRbZ{x z%G}dEs`f2ujBqD*_+uSQjM28`W9!8I{UA0D@y{f}h!Db!hV?!*iL(7nI!*tykNt~` zP`qeaQjF$V=ICVE)a5PZE5MSto46IWIy6r@pqbKFD8Kp{=*&7737IY%`(9QI_dGcW@Vy*9`f39$~wh3!WD-qQHxh0*#_k4`10QvaA=4g{5unzAWdV z#C_job;>@6yG6BRW5m3w>USS+6!|cgnPH3nVE5f=5;!!4r#l7UVqlkahIvYBHb?~8 zbZKy%vOCnriPvbThHs_F_fO;h&Jm$`r!Yttx2%IBw?$L0i*MbJGki9=|Vsa zUaqd1kQ`=t{E7pB9BjD(Kb)A1vk8|B?naDr-tQyrsx1tD(;iDFY?Nhh9k(~dOysu5 ztM9*?ZfdvDqj%eljc)96aY^oPvfX4n>DHQSx))zqI@>)>0o)LsbKjFC}^g3SfreRd%h_( zOl}21Rf80cqin|O1ltY}ba=0B^5c#O^1*q_R?h>yTh-0^ zyh1~tx}AZT`?tar)9*2O#g?92PwV4;&m8V~X7O?U?>U%l-TM`q4dfE}&mXB~&PFRa zZ&yrXX#yWgzW3zC665_nIs#v+sW~&+qy!i9rrOgZciJ>3t?vUvxgQPy;aij6RK6o; zrT97nl;|-$?C5^IXwN`$1SvyK_qeBk`70s5FxkC!lSsZ`(Rw(7gWuJcHRiS13FS~a zdfIl%^HU;T2gs^*d_~c;nT52R3t zl(VCD&1%hNTj)(wXI5$iQ0Y*rUM35{$dKoT5lK4ms~a)&n#}<>jYQsl_a7K<;=WTK ziCUlHY`IJucBCByB@|1qKZNY~V=Jame7u>d@q*FUKuwq_n!G^cECa*j=duFN8V$kEWE$_YSM@AFjH`SLeTS0${S zZWYwizW#spnjL@Tmk4NoZ1BR(XQdAh4nmI2~eX0%4}88E52oR;qaV*b!S{NCdvPE;FjQ zfsMEB!9{c|=-LQnWmQmqdQv)#TWDm1=|fbJ$p_dqlfn4KGMK>m+-0puv(2-=o2b)( zZoJnKh7Vf5RE(%07b=g1m;Ab`g=pqkp~VDyx53sk0@Dm78h5I(vI}ITs;3Z_7MsAU zRBw_Q)ys<03Yx(|no%nqfw>=1{UO)*moTbWRh}}_~Z)h|GI~t)G>K#4;3y-pPWtVoBCT#-a-)r}ORDb{ouMn=k z7!Vjc#Wk3xM2fH-2N?8d1C7zQ0(ATkIV00l(qN zMOGw7NM>*_?u%>ITiP;Y^0d$zJbrLaBMo{q+fZwR;T`iqN2q2s?;r(`jsEtaF1oz& zNAR+BC^~wy!N5+*=f^KwGZ!=GFp4A=iS88za{7*oJHHZ6*AVA_a87r-xl#f7#r%R1 zo5)00vNfa4;{+T{lC%!l&`Pi304NZT*L}AQ5}o=sXK~0EAR~~FA-b^8hO`6Y`~2ud z1j-G+#}4hTkUJ~+VE|F-6K5Q*nB`uY^aJ=?;#a0&XvsTf!ze0&N|7|NY0V&6p^Squ zo>ORMt&1lyA&+qQ1^;-fTdp^Q9UTh3fj9Dm&9EaO3}XM!!XatVFdlOHfF81tZ^WXJ zE@_5*iR&J|RX~iWX(d9wL^{62k3w|bV)P36vexM7M~S1ad>&*(xe!_cU7b$VU;&pb zbwt0&eI8)kk&jlvQpAA`bIO?Ei$~b=bV-4vkeg)3Sf4_*xA$T`EmwlShNA>}CNiZ} zzkTYgFd*&(Ze@(}>9X6U0ub>aedmjqI)TovF*P@%haYhxzvzEX2(|o?21dS`Sx%;Z z$Rg8t{_<6DTA+D=uDD*UGG}AZ=7D)Z3R%QgKK2Rn6<-zhx?Pi{rwicX{wB7rSZBie zDL&9*s3-3M@V6#tuwx-^1@wSe_|Hvc!%qmHQ}Ta))RGfn{&!8#zav+4)j^@+cP7K6 zWs+vN@ja+=M?Y^#hmi35n`-=#QBfg} zP;=(*?8}3kO9rp!m-9jEPsutOv%}wNIafR{mzFEH{HwX!1`QXEJiDg@07kc->3%&I z&WzdB0~nvFvEEK=mK_u6ftYkKBaLj#}sD66j5;Ci%mt{Yn_Gx1LOla2oCY8%B%g3 z8mJ&%%Th5Rx;5Z!FbI1GNd9eODP%m2i!fZ4>qr$Zia-loaX~A?A>-^kcB!OFovzKy zE_KRQ5@)XYk;wI&*RKmXh$qD&H}&@ACvUZ9rJK48mNssw+MmM4mSdlVKL`<*dP?TL z04P$D`x*PTAPhyT5jO@vS^={siyN(>Dr(e1&~#N~#jM6%xlAPxfZ4)|xSxR{o_z0( zkf3&qln@8^N=r1&b;?nn*L8R$W*-pVnJ|T!%|QQAF0ggXmh@~j)kI%vA5|>+yUx7E z{rX%aFkA{C7KwE+nVLeGa>JVx_FN9!F%zC^qnFOS&Dnj&(sG+y4F*cz8WXd4I z*q8Sy8SDX00U@$TJ`wfi`w+yj0xCWgMz1%1z$NPyWawoit3i>MMxdY6J9%3?(=iCW z{^Ocr;%xU0n`QUc{nrmfUwh#$7xY$`GD#!0F4P*2Jd`9efO#0{oWk$DS*B^n4{6!{ zSfCi)a7Q`e&ksjjw(Q6la;zo~Y|}M0D%3X!EyQM2w#r>D!>}cpY^`QI$D)mLI!B7w z%JmV|eUk~g3lpwcKYU=SaFQMy;ku+1G^s2Itf5NLj*&>gGsOF%W%OwKhrHN)A}cOcr{6D-v7miM$nW{|QurO>3Nlb_E<7W|3DNbAg@LGza!|Mi z%i%Fm^#JK{GUzBy0QpJO1mL}i9GkEAyQlsDLQ7@qL1C1+&1ejPVWk~3q&gFL#PPLa z9EJOhW9G|NR;V2YG{@m%BhHF&qEl zrecY+lx#n>e=LN?@`E&(8%N_~mJT9DV$B-ImQ%k!8)2~QbF1P9z-5b}3P)6dq`SnF zz{L}Njk&Vsn;TEQgQQOEIHK(3Tdq4Z534% zg!VT3X7VMe5wh=&KR3|G6+DSA)O>4d6Zed05dXNmFC=?5`)KsiYQYH<{CMwO4vHT$ zw)qb4Q_p;b18_P%za}e}Soj(vl-m-R=R3!$Y&P0OCnu&pIWo<{FsP(%dXAC&{r*Ff zn;%Pf!Kfn1m@lGcR6Pa%oNR7X@KmeobB{yRJlnS2x~3`A;Qej)0=?wu{nPPtq!@xu z1Bj4+)|QZilgo-5+OmhT5$pKU!y`dkAPg5+yuOx42T)j`tww>j$dP>#^Sz zB@-ChpWC-7Jrd#diar{hL`^I!+EtTFDfj7|K**gyE?VQrbr1a9hL!qmdKLxolvD%j zvEZ3nBky4aN(0Tvi1(NWO9itN#R>O}-gT`V@C?KAT<(M@VLgf5jZk+Yc*8`8d;l!&k_7KOEA zRB`FT4^DWuRAIJGpWLc4&zC~b7|>01yD(uKl1Df0w|v5+ zdQek_y`&vkg%uJEKTkyOsb%-&Ve`$+sRDCM1R#=aK|%H%9Hz?*&z?2Q!u&xyHgo(U z;e?VM)_<^&?dGG85jw8TF2)ZfMicBl2jL>%usY_My(9!|YolxorKFq_w*A zfNE>_g~yWI&ut`PxZ~3`jR?VGBpIgB+0W-rH|9ST)(L@+m;3wz-?Hg76uzbJKZ*Xp zKOugD{u>viewFGAx-h{0=Y=6X2>gF#YpYpWn3{XoIy-@c&z27VK5_;@Lft{RsE@5u zQVs`sT2369dNPx&Phf|gK}|oU3sUCOQjjrQryM)at+<`I-b5fhb6ll}?^Fq|Rf+FJ zt>m7wb|r}yg~zXRrnt5|&@JZy0uC43ok#D}mmt3Myng!3tY(R2Vx3%a0E@P@{XW>KHiK?Yr z4PJ?i&Kk3kgbGc|Oirr?jCJ)%A&X}%6OJ&QA?P4f&jk zAu~!3Sy}~f^zr(6sacnh$&DV|ShCY_`$lj}vC&nqqu63gnN8|kymp3i)W^zSxI>fe z_>k3ZYCW-^lT5KP3kyjtdWgkE4F%Ux6MvlY+D1RG?!1L59~qDf_&tA#`czV6Gopix$0@ES52-89vG0ZD+?hgjYP@~reu~ei^*gUL# zeJKaefoPu`VTa8S?*=(VEwBUPf#N1_m32VYXmeCE6493&iu|f1_t2H(1AZMhR}sw< z&Jtke(;&&x&0M|#;H6q5{3Qne*>v^De@3+^pn2=BrL0)B&+fAzQ$bm@D0%XT13#EV zpSOcIlYu*?A7S+~SnP{}9{I4GGl&eTDOjzC_qf$Btlf}%;%q&?< zBW7l1W@cG5VrFKx$YNRKJI}MbH};%8=f-{C57j+gRnZ;NOk`DO=Kq)dxM?SB0)`xE zco!yf;1c>5kriLyjXlIQ?mR#0p*!ZF_ZV_A zTWI^iyk_(jK(7?@oS2X=6)XM|E@FJ|V4a1z9~hm+RTpQx;eJu?Lb@ex1pELZ5ad}r zP~IUO!~k{qav{YhOnrmB7iRgD<8sJcreQ79BQzE-?$@}8i-4n|#Hl;4@ck4?{n-Cg^r@<;NypoSJ&w$54N3u1kXnF}~A?jj(jTuNz z*MY_=%C+RH8?$Q!xTDBVj4-&F^Ria~7&^9M^3~Q2b`N8o!p^y%dw!3y``j7jo?D$E zGs1e&nV?y`uU8C+W>ikcgz-kn*+<#dc50Yr_Pbhx=8?t|O6ABSJtYnac3;N)EP3S_ zxcy1oR}?@M{0+Z&y3jSk5>7UZdS|P&raa)veHX$ShyOBE&}lYrR~W*_>N#n>mrqDh zdUe`B+RSPR${lB~8`deTL{+9{`|Ip<9 z6Z@g5qk=Ah4w6wpOkiUnyDSN+vem;exHBRj9YX~fY6|OiBX&W+)3dg-Mj2m?iB!IQ z`3N{1`ce~Yc%(jN^Pya+%)P~`m1@*FP^d{`?fr6}{V`qAE3hz?2l#W3=Wh@2!3ah2 zg8{=43dWW%i#ZDJXy!;`C!{=9)0?76&6F}#m66kl$hOvov9S|lM*l0b!L-+SOlJeI>1*-8yfDBr*{7v2)ro#wZ5~- zq9>Jbopgiw$f{c2S)!F`&4Lg3#nSIuWwz+J)dmmdJeJXKKoGA)W#|#;ti8S;^u-K+ zKM3r*l+GSRm>K>agxXoR70!eTU!2dI9S#CGSDE(jY<>8**k}_jd3l&=FO7fW8p<91?JuWdCRj9DCeSS zt(QV{xbOu@Nz1gk0Qu0Lq|gPzXb^Cb9es*BJ`)gzY_e|`3A1zu@Y5_Vf83F+$jW%` zXb6%i8Px>KjhJD8>m^3bmNLvx+cb{2&$ zDAJPFyK9lLR71N6T`m{_xOfY)RlTyTfkrmISf_C$OHY*eUJWTycZ|L1>uN+6*mXtUH2aku7a_uCiF>*K2WNj~18Zxu~HO zPt2@Vke67ovEmasApcUVRU4=x%O84%+G@~o{~5tXXzC`iBc>DnH4#(Ezx+ydHt29I z|Ae{9D+=(IKjb*f-+Iuw{ezVh@u!W3YLttmG}Je$wLA!(j@WsBvsI2$%hd~~z=D$8 zmKn19BZ`o%95d+Sv_BISe(qE>J4J5WF272XIQ6>Ej^&UX0A8NoLkpUGJVG7kM^EN| zn#DAgjr%!eddsbp=hWPk=T0B9(i%OavKLr=H}>!`e%szvyq$kW7cqcIjy9%g%FJ~d zj43ab&U>$ZOc%-7;+H#A%4rU3inO{#Amer*_YwACX~lZxrlLy(s+E( z=3vbTMt|`Vn_m#`(iFs_&PTwU{S0R*0@b_+z7AcmisO~1IP92ntmH>c zNvRmrKt%iv3zqL!JoW`vz*uV_S~>ztER2`>To&H_YajVFwpkw>`@T2JQkC$|7*Tcd#u0O@RdJhe+R_>iVw(!g^%VUtzNz z9`C^)@SLKIP20(Q?qpmcHZQx{Pf)~*c;Smo0oYGs*t#+(w^HkQZjd{?D3gwuBWF)! z+rE+K*}mjr!7d3+p~c!HuD_NjEA%C)o@o=%F_Z~r7^EaZ4iSF{T}UJaw$29gsRgR7 z$01qC@D--8M4_^%NRGl&m@Z0%L+%)~)3C6}RJ1{~i)5vJ*~EZ(kBm&t8%dCb^7u5C z4A}K%!PsY@QbB!Us$r!*+M%%B70VII{@-1wt#tBx$1-x?H7Px2{dP1Tto~>pVw})4@^W^m1r1FjkPJ))YD(_$-;Pl&HiyZK($|MQo_c{L$#x=1G z*#DlOA>v?fZe^j)@~==^j{L-5)rhJewd;VCetrFG!Qt)R|vfc0i35|Y3{q^_H*?(DV2Dyng*mCd3d;`tm*E4$(5QOF96Cl}1Cz@H3uOn^k$$WcqV)Aw59M7L4mi`c%ka7-A zqiN|o_SX)DMB{?71464zOTwgi-MZsqz_Z>kJX%F)@o|DG+YfAVuUyNOLxqt5SQm7i zQP#yWV-gSQ;+ZcBDn-WS^z&~qii=jPY?sUL=5lEThmb$ec_JbT4BK>999v{hs}Uag zL&e4Ua4kyHyOr=+R9WrGEm*XrLs?%X+$BZ=?z?op5IWFJ4zFum9XSj=v{IT;*-P)k zJOs|J3jFq#JE_=yzLaS?-B6?!8y_GMxdu%48Tt|wj`r0D-5*U!!BXSe;v^5&_Lm^& zZueoR_TJ>4HGM4A=MC}TQl=(Ma|t$SzCix<72Ky^__2fj{c8Wg59tT~f8+@Ld!qP1 zAvihmys+Rx=o5EsAAL2|U#kfq@fz+SFpUeau-)^{YY(C?q9Zk$etja8#&2n6CGkW? z^@uyUL^Sjl_XjsZ&j_l2Jy*|&lGOapKrljTK9YdOtwROad>B=i6&QOq&Ec-zk!mB# z7lmf^Ocj>O2|uE|!w~j0llKHRsWKP5vtIOI1uv^gjIXLv!MX9GeJMu?1@wwoPPbgg zr8KA7t%4PVGe%N-Gv){O?Vwg}pA#jNNoe~19p~Wap}1}V{S2}G<7b$L>H$UhubPkn z5Qs!+aF+-OfELX)ceE9pKYDOhww~SjiqN~or3EqcB9Ln_1mOXOkgd$vvLqy?wsA)d zB{*j0!A_&wG4m8~AmtFH9cE**)^r1c>Dd|gn96M;9|fbYmHs@SkZQ-BJz4?|<_nF4 zM5p`J?W^z8#ueww;h*bwxV|Y5sz{z-bb2KeaZ$r_KzfQC&q5O#jtynTvfS3Pt}h>V zZP!bBR8;V_a(4pGid}$YoDuGod4OWK33;R!r6sau z&U~!ZShRU*lDBvnG-ITAIc%mXTag$s<;h)bg4ESmN2r-KPCz{8M}ysRJ3~vVanqaRkgF!0V%}rf z=lzP<4_evg1=sJC=i`knC3i`T9B*pI;+xo*-u6;0bG9vw8=2frTv7?pG6MJ1~bW+`{{-Pwp(GEgju2 zk8arZbs!N&dMfXjn2iE^BXo5yAKdd#B%%ct&qqFntJqj69kyTZXAgL0J2$Y|ExDH} z#|?oGVQe}RiKcD|c)BYNYiEbaSF!7vMm%87RNR&wK58frdma&-E46(20G&4UEa@lX zFjD-PiWh5iHE@L#!ZYat>+*=E6xxP$ibPy#++*;tO{$MAfk}o#M@Xb=d4#!XrC73n zsT*q`N%w5CfR1j8XBY+-N-rtF5;Z@5r4@`aDjh^8uT{)zgDfRe@1OZ1&CqRY=X!cP zsGqS8#8~BsVb*6xbPjQ60A6@`1iEpotv+ky_RCvTJ6b#K)*sK{3XpQ4_`HVlSHK3eHFzrlVTUq33`AwyYM&0=oaIYW``vKizveb2;?KrG5{D7KHE4D=K|nalJbnn27My!EX1&;aKX?q#Mg*y&xk#_?kG0-LD# zLmg8datVq|HWl8mzHJ8O7UZ}tQljO+Y4-TDf9be8fC8FXY=Lu(PEWzL%ei%8)&Dl! zC&+Wgkb>!s{G3hk0$8cXtuy($-RIQ}^7># z#9>0&o1}*}%hnlzeVs$iv^1MRe9MpS;1<}u7Rf;}q-VCWBPWyFc2}QG?A*B<`VT=e z05GrHV^uD865zek9oH%n!F@Z-eVf7Ec#2=)5lfyq21=KavW?+y@ja5`F(x5VBNQpOF6}2 zl9wu1bv00V?e+huN(6$yY8Uema_?1Lbu8<9`E4Jp19qLnxCmrZf9{?66Os}R;=F`f zz!h^&~<>~ ztHQ8d4P{wW0fK`B?vKA$?-#8NX|FGzK5bzAcTdq@)TaN7EN61{|3ax#nvw_YEpyeZ zz82>1&p?#ZU_I?iMPtoc7WM}Z_YQFk;g*mTrw+r#CIBcgRLK}hg#B%3*cQ-ZN z4FGii0PDlK=&BdqB}rCL9a-Z_V8tyE9DSsrCkioyue|<#GFiF+BDTWBx~MI z51VwP0nc(`JIutZ(A6ZHO|PdZfF;47H4zV*n`Ge`?!xmy6faDqwFisUA5;0AGKxT^l~R&|RSLz%1alz{!Dg{&6J* zzgkJa2ZvNA0mSlaK;cK}MX4KZ8P^3@QFJQ}w4m1Z9V2Zw@_esDj2W;WjBQaHwIEv! z;U9VZd#lN%6wWIG+F~XB$5!)y$tRSuGqNyKXZdH=xw_q7HRJp^U_hV~4ulX8=tSFA zM0jmh-4dZB2 z!)o(IYzsAekI9qIJDL_hm~}YQw2lG;ucRg#o|6NGz3i8KjByd{*TkK2bZSl3fBQyH zWu5=tiwq^aubhQ!5P?l}-sZ?LD{60-Hbn<645sK80yIbPxC(dEH+Ihv{ARubswSVb z1F3ErJc?O$wCoA_p)BX!VNM_jujguvNt*y;KT zAC@ylz8=$Y&8LPcK7A!{I4A~B@!ev&Y^>T<_No=hxEn-b%O2>Wl|T1DvOq6(qZIQd zNh2nF-_vhC1@TTsv@lLwikYhcyOwalE(LwS$g?_XY{_rYpVF7&hr%Q8c*Knq3IF7X zEj?&rD|p4rH;dQJ@S`qiuPZuoL|RTLN_8HqMbo68DmE8ngqp3Smyv`;6-G1AU|(y# z6fo0@lj=355+rf*RhI98!cn#){0E&JtT}J0`a<0EZ6b(wHD=UC-&XYjmPx!68x>XI zGMkPzvWpc*^}?DuJBEOGt*59-U}_f;N=HkGoC2JS}_5~fT3j;JuGb(6Tc%!hv5_A zS%~O9D(%}2q(NE_tq%z)9vq60@D~Pr4vYSw z(8SiaWr*-%Sxlyl=ZlRQBv3-EfcR?b9DMiw=Qr54MOHNbRKy4%-9r~SE^1#W=4oHx z6NV*4+n(B*oy;$O9XecGnT2#4tl4^zo}x7+ zC)U@pWkmO+-_e=*cD{7^wfKgB2d%J8hgHfJbXr&TY$c%*_T`37+Uj3$+ZCj=%jnTA zs8XhboY8YJ5XV+`=A#*YA=Q@FnP-T&z9bx1 z!dhVFn7!~!v@K}{cW=axNkd~a2u3T8SfmgnF))kpL1eEp`TNh)g-9pR{4w3#m@?$D z`?SP6;HCR=j?rVBAh5{}WF2JbDZj{{fIl7!fbO$zbN9UfSwA7dmC%2$X^)R`s#=_7oF>?0De)o~wZ5f~>4%;V%#NxI@J z*iY5{P7Doju-~Sc+-C>?(02?ieVhkA;vbXEV_Pa5T-92ko8k^sQQLLyhvE2Ona87f zrmM({^mQP*~ z3cy5cl3)wHnLat3YK6n`l!OHDDrv`Ose6SKoY(5#Q0l1l}(3!!zN+S}!I@~$@WLO)Ia7N1*t{=(mafi9EDMV58rq8gHm}f1zC7sn{ zO?Zq{OD2ZF_2jA2kA_fH^>s)ef5&02(`hm+L2(!rr2oFU3c-H<7Y_GdV3Yr!{+Tb) zsZm+j`$ExQKs0G zay2R%V$1Ji)gD(_p)-041{Rl%od|&ZGYnEzwHh!q0DZSwjLT0t64IkQXt3okiGIeW7C?Lb<)k4yHo3HU z`sqFbnBqvNL@RR^&R~VN0O+{pTBYZ_4q*FXc}gcVI*$JO1voLR|ADA%Zn!G+7pVtH2~q_q#+_TLd}#Fah5?t;O`xdTQ0FGH)!EB`tJ+p zzsdSPeM-}(g~vtx&wQ~oL2U>efacC$$rK;<3v6ukB|u#Ga8gV;6+^J!1fnuu=anrB z;{*1B2|3)a z>#nn}c|qm7r@sC9c;NIGX-AX5B4u`=3oi`Y6YZz1nx4PyHri5>**t6o9N!jdA2Kku zS56UVxTeuS!9fzP6C zRojgnj2fT`4N%9^SC2;r;I*>Zw#)heFX&*EjXBnsc->ZxN=2}lZOd|851TTZ9QCV! z4G1U=@9a=@CRAE0kzzgOF6*tdn{KXGOty$zVjGQ47Xw+$@U*L6*|?tHI+N-tuH?Vu zVD$UwlqZ_EC)-mF&YHf0r3zS}!^4GrSzgCvfqnH38MSIqRjW4u(96~6{j{N7CPHs4 z6O+bQcEpyz-d}zTsWh_mM44=sAd44RE5#w9Cq&co$=<6f-Q2)NOR$z`fLJTo6gPEZ z33bQF9`H^sK`2)xV+kI~oVAhS;v%1wK+hhgULp{R!B%C9xX0ZIbB6C>^%`5;to*uY zJMd)s$!EC5wJDh&kYd)p>~eNzgCdO@;ddvN|LRF0hi|`F2s2e*X>9OQdCBF0W#%ka zo`%afGqnl^sUq@82J3`<q&=iN9tOHR8>9>_tdi34&H?umP_M8EV^F?>Ug(Z3eE+<1&=9*0L8^o=PJ+x8{c|_ zBj-m<17z`u* zT^4+)wu2M^b@uEzUQh6G7P@6qnTrIEXzH`G$(~m`{E5iS!?Y~-S!-?#fj0lP{PdUx zO=xY`D^2<3Wf|ujcVFi`;xWhjHTk!jM60##4`qeEEEjIKAzhXlUh`mq z3hW>j`$UVPP;nUPnV|GCLHM?_id94i{QRdw1jucG+*jXQ|2>GGu13+drul%-TGjkN zBzpHs!o4jYTG1*SB6nzuv}~v;J>M7Uh=twzt|mo*EOE#H{|{|eMVnUhT*Hk`k?xmI zyjL>qprYC0pZtYtF-|dZle{UMg+_>Da?-@fsTmBV%Y&?R@8P$JgBh&dO+z(qhH1Am zF*rp4RjXtUk2U*!w#N!Pih;79FujxtUUgOxb#Nt@1^FQMuTafLA<^=LfKut5rx}rE zp-^;SxC!}A+;22vzqCHl9|sNbbuhll0!Pyse__yA2EK6roZ@kLMH#`bmA+fyD=p){ zyP5n&)_u1aRO|mGPsO7b+5`ECKOAk^Rf=j2kUcFJKFwcv=L*L&hMYrgHl@PDxjZkm zd`5ob1jhqG!n1>%2YYwqrYyc}tQEqtjlmM5Ql5h!&IHt)Bv_3M3~9{Rj3@QH5$Z2(+*s{s(6s#RKZ! z7go%)Y+*#`w5ug{j)0DGMebNiaWpx1f7M0Dhw$JzuQY=p7SH+huZ^wie-p2P1w z-TUYL1Ir(!dI&{WQ;0l(TAoQ(wc2&bv$4fk^ILfp0A$IJZ!5Kr80!9E$lEyDix?bx z#^p2&)@VCh?Q0nvEe2T#^l^>3oJ2TXpD+h4y)R(?Mk0fvxdPbX`KzgIwR4_bw);I*pl#ST_Q`6MlG1nonI z0a#(0VZWH=pglyA9j~LE3Pxr(TdO_Up4iz0ZPZQ^gf1Yw1zTTJIU=6GgaQl}qQ#<& zX!+l-ZjV?eK(ygFbY01OG(Gs5FL%T-W~znDdp6w?crbG@aTxdHzhD@cv)3R<)Q#(|w$&CeC0RgkVJuglETY2p@9%-G>dU$5a?lFUC-(wg$X zpi5x5t{e0B`0{}1m%yu@5|y|tC!nLl_}yEH4v%et$4-r{sCcat`!xy0U9Kz!kZlVB z_BLE12_gEWpGc(EOTF}@co^>_Rc+?%>{uzE$tuDr zBkO^nLk+V~y37M-@9$fRL^df@v1XOpTarBrCcS2MDBAZG=8KZ6Tyqaim=8pgCwAkE z)*UvRm}=hzsecZMrC}%5e>~;_C@>EKavmlHqzl_vbnUWvo$ZkD<;tAC+eCJOYAiC( zeeO{R{Gf))bo|Qr`5j>%3?Y)oZ_VZ_e3R*Hx4PKux1LL)CeN6!&D_NHLHiu!_JihhOw&j&wC z4MPf^xN?CzfI;G%0%I3wgaxZ;L`OsHLM7-yHv27B!UB|>sh3xF|??^s>IMcNVOcy0!lx2~~JbUJp*GGG-lHd*qXxOYG=$JaaQ37m zDa=eC)qcR{FgCx!{5Y2$8lsq4J6d?At?1=9bk|0dmJ~vl_2Mo;KuvtaXc=qPE7aU* z)aEy6ei0jvCr)8ru2*>JLvGSNELYEic^_<87$>>$uUqGdZu<;ZD9_10Uaz2sI>M7)B zp<+Lvg_AB){8lg-1|V^YQ;=t?%zZ=AfsM)^DhUr)_lb#O#6`_qO;Q|368eTV`P;I~ zx_h`R##$Dtd@j(_=Ze=Lc}eO!Am1V4QqY%X&K-=9JmetI;fL(xP#Ma^vDd3xpFVrA z%$OrtuAE*hcH{>Y>R{oY2;i@fH&LJti~*`Wwt-YLMTea5ys(*)9X`?x`;UT^->^T1 z$h3JCT78>82 z{@u9#!_!2`Xe-%vYg{m&I!{|;6hyBoJw$w~4X<1dS=4OZW%@<4^J4$1l;b1m1MGbO zPpFqu!mYH1;XLt>y&raE=+HK2oc6OR6hwRv%f*m<^~ z5Dg0l{ljjpUPCu@ZF0aWDdF5ZUL1>oroDO}wi9O^NkSGUNr0w4mfD2!RbRvqFmZf=9sa~6C~Mi|1UTdU1JIjHN((fl~0=U%H6-8hNIWMXOj-wh+8W|~l@8yajFXQm2$Jbwjh(KZggAz#!N_e z!RKTOhBA{$Thr!z^Y@-;j1aaDiF3DD+|>tl_lRYO!D5RN4zoQ zGJu8-_mHsalFX*W`@v}UB|RJ~bWgtLVikkcgO4Xk-YoV@u?Qv24SsNlxPwJ5WB}ev zJ}2|SE}(F}s|{11B@{}TtBOvhPiN#eZ1$2_EI%IlU_ADz3fp(gcKEYEokwZi3nmw$ z5*}h|W_bMT_FMTehOF#a33=1mE{Ak|U2PvWZnbnhU87Ng0At*M26Jw6{!REN?jFe2 zhaUgTZxd)5cZh2W8===x8~LKVu!Qq6ZZ8l@zW}cH2)tI)=zPYf-y$f)h^ClC<%A=> zO0ioo7eoBFaXN5|+1c@y9*{-92v4EMv`K<;#xdX9EWH(*FX+m(|Iju6AXmb_URaHV zj7hWV7B1a_^h?2I-PN`X-M|Jrq<5h+A25PQ6y!mb*g9ZJj{J@m9A(#B!w(K-?MzH&a0FCrbK5hax-mCvG`!ynqNSzgi*xGd3Ee0F6l$9RV8Y1&u6c z{+zag$uCJ<*2K`+%oH2zC(_SoC=hCg6f%I`yqjfvf-6V4a%* zcSiCTfj-qLCf)GGG)X;lk|m2jgsT%g4mtB#n3bv>bnRG6MS)^kamKB|uaKA{7O0XY zTF1JkHN?_kCQx}rk_*34fApm_yGOXNuN#yI{0{K9liQ>72^vAu`^N@yY^OLa6C}1M z0ckP+t6;r>5B`6Odx%@vn*GB=^RL9Alvp{~0Vd=SgXZ-Yh(~A!T|9ILVps-X2vzu{ zW(_mVl-uKmq0&Ri$#Yx8+s<6(^+|OH@+i@b9il%5+I%Qw&edg6=j|ECrmjOwa7Y4vPkulyl1j za;=mCt8AhYhA)30KtlbSU0u49(IF9Nwi`9HuXzZ~C@%!Ww`=dwzaArt{>IugT$b0@ zgR(Wi|07%DUxL)X&S3wpO8r+kT~#v=7Zn#!P~o4uXyp!h2xeqo2of3M&9wXie{fuS z5*}K_fIw0~80l+Ms;D3nvW7bba*Ez8J&cq=-;Ntd*7*PaG9f>S8L9uxQurT2a{pBa^bdujypf&Re+|Wz zq-=PhaU%P-Gy};=;*mvQLsBuN3G&;&c#$UWugV)+Q&GCj59Ac4a7vqw<*A?V3TQLF zeDW>#Be<+>ohI+8WbA&86E6aATRqnG{&`M9zD@3?Nq_@eGxpMqiKBw3P^d)F*i@Vt zv>yFx(Q55sTjj>G@8p^mmaJ8vmKE1wOG|fQnuYlL-4_L}N-m7l+UhEuOBTo1GRNWI%PAHtYC^;<+8LTb;?UQ}jrD zcDF<%)7vtBuS7+aKSl%YsV?tC`pF$a{4BmCg0=qSITSFvsz=~KciwmB9-{=7`v5%? z-y^$c%uB)(~Y%9Awq@UHJyY<6xjVfHMr7lc<3hMXIUy>qt{^$gVBlRiO@A8mNY#^G9 zQ8Vfs|A~z#N9{dn?6NTJXh0YbmKDjKQ4=LM9CTLK!5ty9i!^0KpGUjwd=cLUOIls4 z)Up8z?UPQe_f++}bh2Rg(R46oB=?eI+u15MS9>o5rF&^Z;pXb>2aQQheap?3yhPwt1g$x}z=z3gcJ zo>D0$w#fg%P_S@hgZTN3nl5&da^p7Rwo4}+35_S?Czm(iH0d#PVPANq_@3iwv0ePK+?a~t61HWGCgJ^A2bjP0($OYHt(Gw{ucw|^luuueoz zIPbPy)DK~F;?L_Pv?R?RuSrO9;%k(rjlkMnuo==^5x%%*mVGFo2C{)z zcen@44LcAp5k3)KNA@GY1M22WxC7~rkY^EK8_JH*8_Iqh%8u9@%)SE3j))J@jYT*S z@dv&W)D7)^SU3@hU-UB^Pyty31rYH}2Q(o2_c+TZFG5f0KAa z+s6tAh`*saA>8on^Xz}#r`$&XW`(yQw;}fmzrlUm=h#Qww*&GP>-@4w7g^h2I4hYE zSPMGAcVe~9d*fhz{Tr$7Y4RItA7nv9;r`8v{B1=3+QR=I7?FP(drue_bg?I2wHfj= zK`^;hcSuthnN=Z<3|UGeLzal75HWK2G04xMIFgiL=#ZSqV(9MZKm;WrF?3`oC@fXc zO#w%dAp}k!0?IdJK-)IpoGJff<~KmXdHP^mXGu@3u5sZF;z6L>vA>*vDIBfi|9%+5$nQI%-w7p z{6)^|*|(Cm>cfYMY^o^HVdE_0!cLo+N+^}l7QmB9Xf<<4VY7a~yayNNLrA3viUJ#9 z?99!Vvan*wN<{HWe=?sxZqz`LptqO%A zEz3p8=APka;4ZQfMOdo>6QpTyT_4|F4L-Z$lzp+R6lI;$h5asF?;Odij#+4T3&N9& zRiV#mM{sm>$>t1a25`ELfi5;P>M_9@{Qiu=} z`KUZg61KEn?U>lvTA@2F7Pa8_CFm?GXHi8N((I(ti>U1^V|YLhD-D(*BXP*M`dKR) z2b2p?Bi$cl#DHnVSZ>@)t8?5P=uc6zF6G1H^_8ys=%~e*?E{dRMX^rv zOkuN5RNpumFlp$LS=FpMQ_IV!NSe=kesh(Qsy@Yaq+Wn37C}G@e;& z-RI)%^v*`b`gx_jcv*pX!-qw~EX2uaLS%wsOSk-!mJvx}pv*kGT=ZA-*WvyOSou;T znG|Z7>hHSM^!W5&p%qHI##7RLhCfo&ZazX%(lb5M0Z;{N;WDoUqRHvG=`>Z9`-`~7 z(v!3NF_&cgWr>)$5-tjr#zb_<<%?---%Q|i&CJ3xq>BR-!%ORw3wfNt(G<$iHO@ZP zq$hvB_Sc8aVd)kEH-V&0g9(aq#k!S1pDmNyTazT012bveTD*<*1SW251Or)<_3sv6 zWCq#s0FEW78We;k#OfFlx6+~`q!hKwTQTL{qSV+C3N#4n!KfO#MZlJb_6ZoViS~CM zid0JZm>vCJ2-5U2&E{&Va?3TGG){L`E2Q41%Q`9TUs2?>xHPvd`BasrMm#%E-N`X? z@v5Omf>3*l*36E>iZ9( zZ$En`5#^C2EPWlQZ_EdBbhE*&{d6MSQO{{B^Ib31jPvYmZ_`Z29k~49uW4@l_MuIS z__c8n#hpc<_mqA6!=x`1F0Rg|&$i=I0MFz%t39mpaH9$-&-8OCAo;>L>`myRo&ojE z5so~t?DV)U`I%?0tqVMk`wH<^-nRuHhkx!Aurv(w{p5F3cZiDxLG;1I_b$z) z!TxF`3VVk=O_gPdVv5Y$$hQzMKr@G+Q!>#g-kB3tW+Te7-_Jy+Z66hm{;PA>v_r4P zZu_)4$Q5&MSXjq^35#*_c9Ml7BDH_R}!orr5jk;1FAvJ`=R{(GoJh!l(X?Kc#e&RI5k*9@CLtXt7 zp>YIQ+!wOPeiN=KZ_XFlwd?z-=4+;-Pm`gp-p^8bVVN9sj0?#@C6*~zqfWnj4xU3Z z_Zs!=8SB1Nb5O-=sGdHY0J6OnPY#}Af3^FBkZsoXRUDA(aglNp0#c9dFBlY#!6snQ zkJ4Er+Vi#cf_6AS}h zyCGD4-e(V)jgVhHy4C1r|7-&XP>Kn@ZHHAxE@wk{!(6qGI{5mljC?N|zdmFG`ml zi3LiR2#pGRg`h zR0AEB=}fVV@z4|D8mKUwVH)IMJ%d+OU}1t+7hutpi91)EN8}obXKo%-ywurzppZjAQFQYI6 z0oAO=;aWVP#tB4jA`B-n=SLBl^dbvQe-H!Bio-VMKxPKoA{&RVA%i9ufhG)sCa{27 zBQmIg&f>(O=`o`4%y%TA>AykOx1a_Nnim3UL!f2?nl}s@i;;k5&H_D_1N2y1RL~P~ zKn=hRx-&ZH&K01UD4;Vn=o%h$h6Ob)&;)kSwJqp#6zHzUq@n40k=VwqpO}Fc&Y(^@ zP$%YJoiW(PZU~^6sG!ag(49u>7BWbBhto-Vr%glOw8!9ow?yLHp3{Q{zJogT2jG9Z z60#ny{02U9An&GnY zWw#<$0g7nOs!aSy??SbO%e;MYw=3sXVT8IjkLqKI5mta*lL*q1&8Ix{y)%+`5d!t2 zNO2RV7ni>A&N<=npp@svUW_C@U8Wv2z6m)JUwF$Y)l&Mt1Gx~d%{`$^@Uw6a} zh7!+LPOd>Wfd~Pj;&ew2RJcE*&k8$uqvlKO--KfMyjct0xb7nMIW`))n>Z%o2L}2F zKc9Q?^WhlOs$pRJ{)`_G0z5gdu5F0sHp6`^>6GQ!>UW?I{dsnMs-vT%@p}71!0fXD z`0Tlpvp@rUc~f|D9UYQu?@&)2IT>?0tAhp($Ipkqe?xA8HCDqYA$fnr5fJ+@n7Axx z`*ia&W2P09n{Wj8$(u zkbQx@TwE^zmB&`Lk$GrX70+fvb7a^Hz_Hxc5D*h%Yin%6il?)>IzG(7k!xb&jW^TM zkQAe5dtq(jj>l?yVP-;v_qxW_H+*M{Z+oDKH`6v}RJps z5F^GB+v-#ugSGCF5JSQ7*^a)2+4R5^Z;(U2$*D7j8P8%})5;_zrpY$jXwNVufBZ)rk2l6bJuQLk5_f^)}=pwbGN*dJt>;XQ>p9$}?6lY`mLKYAM0 zJYbV-3nB<=@CP3vvm%ZkfjxFelP;MhW1YQRH~m)f>1A%aRtGrSU?(fx07nUh9^Wj{ zsIYz=xQ~f`MSiE>4}D}_bA8~N$Q++80pJdzytzGd$d54V!hLS_p1WIfX|NyQ&xVHV z4*AT8ZuoXKMk9SXpZ4vyu{gq1aAg7@sPT5buun9a`=_!u*6cn;M;4@gQ@@y`+pqFFB%(t` z*%w4km4IO@o8z_-WuSX%m5tx{8GKE#q=_Fdx0hYl8cVB#?P6?|pKEQ^5OWscS{E=a z=E~~%b7JsAsx4gn8eH@#;L%tiU+|uNaHLCI@t&h-*iT#*fw^oC$tVlgRF^6Qh_moh zc1Jwbgf@9;aLqBWRy>LoKat-k{}xBbr0dEb4zt~u$TG@shmULUQ8bDL;pf%hgQLHL zs61=bs1$-o5|^?`YhRoSuH3GwgcX)U29448)BQuO__ZHR*efy7S(PJ7bJrP}7v6^b z4oe(Qr@ygQs94UCN(XO-B@i~mId|u|b$!bM|&;GTauf7^H;J(!^>HI9f;g?Q0qG&FO7tkPaxG2iy z;@s1V5<#o^!Jz#KscPe0s9XESL9f{^gun{UXRR7i{p7^;JvJ2&Vq4A|3~RAfCsZJY zEq)&+^)z^$!T6`H`KcXsT~>WzOjREyUyxes1li$2-d34!D-DgQq@+h|YHWkj2AX##7Iq-Q_1l&Vf-V7(35I=RGvd zLe-<^thZPZJnI~X_0|p9!wfDb2lZaJ<=J-Y4GoP#!8%?u@Jvq1U7h0gkZCg(^e-Gzqu0(yJlr#AK&e`8bRT}8?sCion@RO-wWd&V zb>iupjztbcn#nS43WX3uY$e*de|>19aE6@0s|=p9$>oW&wPy35e{&b6_LL2qLkbO`{*EB+|2O1X(~N(X-C{RQXCE&%I&^S@}9iy0&472r7x! zrjI{>O7gWuZVc@g0e|PZUtd6_vX#f&F{^Xr+}n#JK?Apl)%$C~gO*-SX3z;cQpq}epaUq97&@Jx zI*OE;PA8}yFZs~?4AL8wbZdAP29;7AP0yfC6vxOnJ%cV-tgPoVht235IrSz1Y6ApF zB_Gs=1CWYY%(?|UXv{QX){Wso-5rt=_zDl|u10*+%Yg+02Yj|Z&nCaHb9%h2d3W~w_a#(IF}ok z#y~D(+n9xl4Z`XGJwzRdc4$}FQ+D8@<6+3_0df)sHeE-TIJ}@u1d(Knn zMe#+`Mf63M8k?GfuRLEFe(3vm!g-}2z$*d|!po=ogJ<~QK(4P+HK>}@73>uV75EiE{)&$k zUn)kP%>ubx1Ey(x>Zcuj#@(ni8tSM`x-$|T1t+AQg!SXD8#9s}B_|Y~l=PDvMfGDH zW%Uysh3T1tbgjAf8jGl^SrR+e8+MuNb2~9q<-47bPClqLP$nT)pD!^atZSrKJOZtc6qPTCMcvB?TR~ftXj(_=!`KxMR0)v znn|v?oPt*YgL|<1)=zO<8eP`(G1X}rKNrTz_fGbapMpICyhl5ypel~e<+=9k06*q ztYC!O<#@Y#z5BPykV)Il>F?=D3>QVcZYVD*<5O0B^r9=6*E~N*P7AbGVv-Cdesr4| z`AuD3qH2JL{IXQsLalW)P&xSau3}P*PQ(-IM4r-Aa-+WuwhU{gxn_P3?r25RO@d3r zlj{U7fu-QWcnuaLORRXw$sp1MqzS$zC+GLmY!|E$0K2CSvsaJSl%-%^=qD z6MzmiR_IZhNec8XM}icLD)|0XCb%I%M<_JClqP^N>%*R?AoX;ugFKMgAQya4WwNI0 zk6D`vSjCAL-zb+aAQ_Klv^bZ@^XGXZ&^3I&-vxmzb&ow0gIZx=qUR5?ZdDQRM>f%h z3ObiVGvv>?;djO$g$)26=v+^R6N^6zqn_L#dl&Ulxfw*jSE7?tkPz74h73AOK~n=H ze5E?k`Xih0L;xuo)OCS_4pnPTih!<6spAR9C%R(}*D?_5BN?-S3SAjRl<{a}y=L4}<#$dtl-a}F?LdO4=T4rF<`$CC?W zM5^LKluLv==uR4>ucB2AQfy;C@dEXws_&T}Bs;0q2MwjO&%6~#X8Yrr2qeR))ei^B z;)jknq+a(eDuGU@jiP+UrSp%?A(EgFC6O(R$N}(aSy3@qhf;I0q%ihv`e}Jy>IpR9 zWSG2Rv?K;W`1y9tA(ea>e_hpKNG(JjK6W6sIpuNIjnav6Ue}1QTzn+ADY#{_Qi;az z5+!;;J>^jC0?fN1%sE_)yor==%fz9cd8lln!n<`+nP>| zR~0Enr(cpW3Bo-F0Zbd5RP=6hXc}BV?QpRue8XC!6wU3+@WLo)!&DM#TSr}LTL)US zW}b6oH%@#s8r;b+wJ5%A{h=Yl#+@4XDF@{WmwB{kP8|@43H~f4imr z;Pw84Tk3C6vcG-WfB*j*zyx6J^6xl=WDoC5wbUWtMXQukTvk)@QJ0-XdVx$^psm!( z>gvn-u8rL}yqi>dT_A{yt<+*hYGxTG$pi@#93rSk2w<;>8YJW?7;f_QcoUezNEwz# z$Q@OmGsgK+GFEhxagdQf>HB+V2J!X&CF7NAG`-{Urhf8+Ib0nY(#JR-5eaPZb(ibS zA5-l(2#F9feVzG*pWq>-^9#GCgSTde&HD~V@(W{wNhNxFrr)OH&o96RtlB&wqY|mV zl6%wcd zTdUlclg89ihUDUx)It6lbnWbnF)=+r6$KtyuWS~NRz*!94>ZrVQX7yWOLo84dp(I( zrKFZjWu?!(ZAzX6&Wm{G!=?>-_2GtQe`Rl_G; zKt+&ofCt0V+KnJxj|ZfPmAgjWhN6?X@}uh{OV%n<(4H8iUHGF z(s+pMlHV)WF6!1mu}UHUUrsN_fkD*<_G);-v0cR%INC`a|EFF z7JwhC)w&kRWO39t2S#DB z7Y18EOBQ&^_ma_z#cvjbyGDic)X}RYuV43gFY;Urqp-4BVbH1MZ0rOW)_YCu-Pc;b-TRaQO@BAzb*9xBaYh48-%-IS zqy2YV@2HVm;gl`OhN^pzTOm(`(@a<8Wm&pTS~YOQ4ORbuC_Hs7^%P%!=K=K%W}{dW z-UloUkfmQCLqB#<2_x`hLv`~71{mI*?{No9WD%j| zod8Jl8|5waKBpB}19XP;5w_Y`VlF$0qpZ&B|E-y)EG#7(TauJQ#H3@G)i3;=44Dm? zhU}PZUa}&7k+N3Guw1mhU;exLcf~wC!)8(OZNu;W{rKN~kdvi!iKZzW6!Q!W1q~$) zHMdjxp}&`t%1h}|I0W>|Ava5|k~@U-XCedLWL8NWs{3D&5hZykuVVW9kfWtDlH7&2 zBl@+z7n4m$@zPvn^xq&eNOzE4)%DXLS4(%u)4(>Bebt#VZqBIZMkXw)Y!^(IKf*g{ zpk;FYcJC$K2CPZoay158v`n=FzY)Lq%B`Q!&t3jH%I#YBt6JakkqbDdQYbLt)AQpv zG&?FWiF#eaAXN9Ho}|k9mBqqq<~0Gl(LHSKuODeF*X$^7YEw5?3mC30dG;S7 zDk^nbzG3~|Iog;~5sPUk-^>D1f2M=He<$1}r_wXYR&FNERWj8;?I>Ky7N5dnx#f{? zOBE99YG0kIJkR>dNVTB{$hldY`KsNeqhe0(XXpflnxRm_swtW?M@uHlswuAs(HJNN zQ4SRkKaX65SwUeQAl|DQFdk?bU=wHou>w5{uMNclha8v+LDfqe5XuN#A(TroiXj_g z8~(D7g$jKGe~*lgsVl5$ZqEgX6=DF?_I&I`4iE_}gb0Big^NP6go{E>!ihjq$Hb+m zVC9r5VQWcKG_!}#UElQVr4D%bqK>mFt7&xU+p8V00u2vAKv==j5?-^uDG~^(kXy61 zL{FJtD)ov%5Rh0iKLWu4^*zNCG< zjxQgwPN`^d@SwG&xunmgWDT~hS)^u7EN?gHPJWf+%*-*XE6Pwm)T)S8DK)Dv%2Yq* zs?aJ{^Q5<$I0B0DMK>O*9z9ifWy;UMYBD%*YcUvit{$OwhBhvg&WCFua%Pq#*Wf#9 zS0>ltyK>7h81Zd8w^af7j-7+`C%Ctri}ZUuSC42rrPgvw}Zsq40IQ5EkG`kO-JEQ7-M~)!Yem?upMsoK& zqZLPT14o|OiZPC2?r`Kej!;jUGi>K=DysRgtUYiy`1tNKz-f@Cos@&648itcp2tO0 zbCoFj2aJsm>zztVK+|hHihkKuO4A*BCJe;TCwE!eeilO}eN>q%Jf#4R0hkUl%K#W9 zf-%(cfIUN-Da!fJ(6vOv-v@IvtYM<_PB~JpK}*GM5SF@cKw2n{2T# zzNE_m+28dH{UyV(h)FC(ix(*!^VCrL2l8ZeiSEOQY85h&lfzc}_qO%Jcxms$>$ktT z>*JzUhtUim4gjuHn2=~N0&0)8&8<^0qim4!Yg;(+Pf#fg`L_9Lg&bT?JGWI&)g5e3 zbxF3L7mEkrYbV2Tj115@hPvo%zjqSZM!t%!>Z_BVQ>K&iYc?fht)#ruHbZ`K(x_Q^ zqZN#HKq?539nE-^YlQVFN~Q zK}M|q!;b|WITSKSb^BY)A#6l_Ah?l)K1M>d!{$d`n60K_{nY6(UDJZ6r`Kl)`^cc) z2z#r(_N3;cfgpu7P&_+wbK71&`_XWmbDB8%T0iDC$|z>XV7re!>RQTOD`)6P9wmL_qS)rZ@$*zUj!9}D1#ZxFoWyn zn~r%mbT}$5=HP7|b(}op#~qT*^nUF}mA85EtSV8EnE`CV2dQR%t?>ny0oLZ$z6eW= z*;p{JvRxbpx7F%jGh4mq-U_^<_A zwE!oO_GW$~gP7Dd%|s;^1{Em^a2$0fp(9=R%D=nhQh;L{nu}(DH|WYUP|`2YBQ)z} z^1v;O@}hZoQ3R8(8Y@0FdyH$=VV+a$(`Wr~9L}$(DvD!EWgfjHvT9mF=NCgyacVT}syOer}SBTOOkzVhj(Hv7XZ z6BRxK_N|4hh54pC4`O!3;7A;F=Tug~QB*%}A@>MaXL`roB{!K^6JqQUpN=xe($TLATNVOxe|Y!nUvr zlAec4K)VVVg#qvMmfJlO@10&tf02!60>vP^!8~5(F|%n}5{*c~O!>@M+kVUH`WpKj z9o@@nt*jaiOetdMy}Y*4*(L1wunLfugOa~HgUMRoQ?S@JzGe^fhC4rer&j#TOfM#) zcC)PH&b#mBF^7MnsY?L&@YBO=J%G<_^eCm3qfal6C^3}t3RWk%YEsLvMZE_?&mB6u zK83!qvDe}!qa0Xb_D}FuuW2)(Ju~;O%@S~(hAkw){K2t5zaH(y)?T|NDVzZ7o+*Ob z#8BbZ%*q!kQrWJ#}+Ug`o8D_KTi|@B@n2x9>Nfd_-<-B=Lo%iu6g6PQ4@3j2Eot zy5k-n%p>9FNs1MM4>&EeZ)%N z^5#BNqVwVv{Ze2QZn#t-la>sL7a+M;hJhL?BV{4O`;G?AD*;3Jz$6XaplM(h?{)~O zV3vK%n@`BU&kW<%iqe)K@T8ojRIDc@-nNi0@)hNDj(LXl^O+-40TSDX;=Cvd3lO35 zQWkMg4?yO|BnqY4mg>t|uoN-MZL-WX=ge?YufCzy^8@CRLzo;bF%gY1g^yXJW`R%) zVB_IAa>hJj-3FKE{MbOTq|mZhRS%@kRy$-L8_+(P=YI(9_|Oa0Ao+f9ImN;uO-Gur zv$gR>3mPUrH8G|p$s=GspzfQgG+3AyIp%)tW-gw|4m>~gx_@?eg8$MeJDPvicLGQ?=CA7S;uW7^)%z690&1F=EZ@CP{FE zVLD>d(Z@LZfJf=P%3t?ESiN0e-;D$0I_*EZUd6w_l-lD$HO@o^cSz z;*rNow8m>)`A#<;&3tfIA`oG%h$4A^O)MpqIqO*eP$Fn$GGX$wUbt59AOw+GK8NR5 zDRa}*lmFU;@s~8P+XLr2H80D&f=26jd~jiJw7hc`!B4Rl*oN7alOQ%t(!bd>`&{o} zD?vXiPoU?2Qb7I+-v0meSjffL!tQ?{jT8UfWB6dAzdFpk4Mt3gZb(#X$1;hj-7L$o zZHbPsshIbwE2yUbYk#zS=*AV2QItkhj8JOa@AR!rXp*YCU?;i1@o6B!PwD{+u@PU)7PJEC# z%vAR5+lj1~Wd*3qJM`dS-e@`d_5R$#8)~fH;@K$c`VKpPff@5ME?QUpQTR)9#|AHS~1B`VkG!e@>X%%$N)o*!s@{v zpDqPw3ea6TI84rwv7c@UO5Q6Rz%ege%tf=8Zw9UYM^?LO<8+~jW9*CPL14rkgOA= ztJNLDpDZNOGrJ`w(5%Mn4{8pa%qMWv4^aQ&ul>KFi>4qENI|#?e@|s(?Ti3_=!pLP z!K;iC0_A8Ui2=!`zbn~CZ4&F)pxWhp0UwC@_9Cxfa=PdmQmUL<-uegCnD!2g{&)8C z=j?4If^55s4->Tp071>b>)qX2gW~IB?TJ;7y+O7L+&LH8~ z5Y>JJJ1qif6+krO`^5n?E##t@iC19l-mclOb=lBgjJ}}> z0kS_qx2W!aP4+&jC;!>J{twXcBmDmco%r`~6h`scg0K*SHZINVV=m$2h+Wi0Grl2_ z!UTdVKS%OmrjOHK(+YKAe}>#t4E=np>Y;E`gz2N;)P<|?LEJrTicnVhA>UZ1I+CX( zgHB`FsfhVL!&9x+eeVP>T-!0W_HLj}|Ea9zDbD1e;&S2Tgi$y=Cc*MqgC^gm3Vp*Q z2m0#gSvlx~3h2GrfVbmFV0>&SbwHMPy2nWtJNz>E4vd+~Ui#pRN!J_K@olPKM6N-E zeM$(`6?QG=%7>DZ@<{)$Iq$?=%V;lX7?}TS7}S%ef&YVP_0Knku#1JYv5Di~bKb`P zK~=J8OHj6Cj4@RE!TJ#l3JiTZDLY76`V&=7$;uy8rFIaiQbVeP_}rBg!7hlON{L`D zHWk@-{4kt-@4JzOLo0AVb-2rF2$z)S+*BU&dl+CgL|-Gi(vy zW-OP5)I~bpR2{?+yvU|McZ=JM*(Pruyq{qV)i1#eaE7htgL@4>#sjfdiSxU7*v3`_ zPQ#J~%E17iYf=G%RTy}33VQTVqJPMN_xx21L;EGjUr+M+L@mSpKU$kWtwdRJp@>IS zGsCgZ`br6jn!7oXP`CtLntWCwTGb9pX&R$#w#h;{;X&>1e@;3`@A!q}8rNcZ(qYM< zs|*W(BO-L|D%)i1kbf&_%}{p;xJPf8?f$wfW1Hy^K$F2uIFo>i9fI0H#Y*fFQsj$02)m+|B!hD)D)-=jQE8*Ti`Viiec}gj@+uTMIVNmL@~Ky92l;%G80b2b zjrFe`V@a!2ni+!Yb2e5zY z(S|+@$)3Cx-796oFQ1$4j*1sIJB&9bzIH_>W@)(ffEb2J-vc0A7^q7hK?K7-6X?Lt zab28D<6j4HYOHC7D&gUf1GsX3*t4yB?tlwydfmx5*_12PS6-N3%MDM}dVV{u#yfQGkxUn(8J)DuTRB}hoPQ;5fs^2v zMXM`~6B~&kVPCOTxV-dEs7SYUYTJgN+l+>uQ zWyULrr9b+bQlJG%KTT0*i?7EKU70@1m)1pdL#10(8$MrbaY`bkI8ik zC^CGa-ydER0X59lN}hTBTMzDe}E*l*9_|>eyq0o zA&mcra7r#ZDMt4i?7a)__QN<(AZLm0OEe-EfA7#t$MFol+jt1dhyF zYWWr6sRt5y2A34YOv*$~^hC4hK|8rKF+X=K#`Jg9Bhj=OtlR0Qti#_^f%5%@C^oWY z>CqF>q6fv~&UyUY(;y}FBhmDkrTzRHmg%QL=*$usiusfYSAtAP(PH3gp!}Ew#XT{1 zEp?`*3ipZ+h+s9dSnjZ2ms@LBx5KG`&Kt`!Y>fliO0~l(;ff7r78_6vNa5>mS3}WL zeu_>LXWV52i}Jv5P7@~fw9Wn?dF~T&^}*C9>P-p?C{?f()^uP_aIG10=+p8!vH^=t za9SVSa}eH-c$#2`_th@UAUn9*!do2$e4sB0C^c6oBw5tKN_!U`T-h!g^%t{oX5Gt4 zuVM)k(k&c#t*l;(Ehl54uh4#DGHLUX(ON;%@vtZ?db>$LC&~St+u!6;-n|lArJ(tE z^?ze8#pnKGX5rs^9{-!3uv1IN9z_lFP2SF8wlKlJN06`)RZ_)VJHhJ99(B-6Qd5J! zzwNBe68jq62t!apO1rUE6paf{5sYwuj->UUX@g!xYq*B(MD|nOa zE|5~9LrzB47RA9yM2@9vD|A&+j=Ga^2#&j}Beuf9gb{J!(@$_LHi1hN*#_MKGbtkmN681~8~DSYFuCll-g)R|T+( zlopuRk;^~_bF~hx6aN?*QZL~Ss2qe_cPanSeI85`KB^Rna{vovZ=__XiN6;d1m?f0 zh%ZOZ>Qayn`EA7xMKPZzN=BQxN|yURCkddQHs;FYV4uu+JV1ZLVF9ai_W8vs%yCGos(PE8-jnDXB1BN1HxF)`E}A?!5g zUfiTYX2u+@m1eo(UgkH@JQ1ywj%$Wupk3vqqf9L_tQMb%{-y~)JA?2uu->#yg2)3i zw44M^B$roD_WiL?N97m7b$Sbvfoz+3eZF9(IOzmera6Z_WLr$Tw`KVcU9f?W0nIp4 zG#ck&6<3jWzH9?X=&bRoOgcO`9%1w?+d~a)A13Q=B?l8u(?V{bjR8GrRyS7okZW5T z;i9WiD`SQ|j%&CC#&SdH=Z&ighmSfuXy9#&XMT>D2mV7V97bnac5)cMUDp(;;fB_# zI;=zJ6Ea<+Iz~C5F#@CZy`Xh|=n2}{hsY+Y5j+gk5GOFersIR01)HLLk0T^Cmb#u!9LV4>is3X9EZz6fSan@J?(0r{#oT(Fr&0j<)))q652k2!%`^{6~eC;xo;W5XK-C)xf>uu z&Cqwi9i{jlBUM;V*i5s4r>wxY7!mUyi$h$#c7Rk+2(};b&sGp>JB$%o*ueQ&dVad#Xuqn{kB$*mH$=0nF}kmTVKk%m z^6C>NS8Q_^@X@nd?D8+Z8BP71l}QdTyPSXsBk15dJ)rpMV`&xeIrQB@Gq`H0wmmTMwU?KK#;w){N3RqkhOu|Hm>(!gU zbui7@9_dY!tcb5rMRupFxdmwen4t9Iv31V0{Mac2@AJa+t?0sgi4I_8&%CI`Xwo0Sy}s6bV#ca%fuG+Cf51Yr4j~{m)A|^T`mPwb3F{ zMQ&+HrC!`e^kluZ_FBUimgfP1uicMAlT-t7)C;FAMskWljGF4ihqJmk(HO8if5iYPQLH_E7HCP7KhM$5+!9JpQqJiVa+ zpvn|+=SBY&eH0Shds|UDEPJ19+2y{+M6q2tX8#LJ)Zo>}C?-<3_C5+N# zH-9DZG?cvWdyODY(QnaRvO2Fw=ZS~WCnTJv}!!#&1hI&9`>a*g?w=7kr|LJ(az zuFjKpFYjRsML#>$m--zQD(o)?C-j;H5)oG1u$Xfhv|0OqjAPg89+>p8m0+VJnRvC; z1)hX#p41`=h6e`uLL=)8XP?-SC76P1-5*^4sI(o@S9soPa*EBPtJf|o~0F09b}iANau0H^P1zm>1q z-PTSly@uVaMS|OShAfI0XqJ=jn?%mL@*qUvNWB}AqvAHQu|8l!x)!C!$4L+M{Nf7K zw_A4G6vf}~H&W%54exh$iX z#wTn>f(1lXx+aMAyl&p#m3gStOfUj}QzxMU8G9-9?As4jh{Yew+8hJqz2k^EB^>L7 z_!X250=)f<+awqE!VhyPd;+F!NYXsW$u{jxaiq!HgWOHsVZV=+(%qUu80s7XS{4hNybc1S&s_<6pu4(^&oiT093d~)2C0Fed^hT?ud%yT5&4%-46VVfOp zEC^^U2pBAMD=u_Pdh$n)7I64Ud6HVbsUm?N_HZlX;Nk4(UXMZ{3C?D_Cg={qUPgwI>`8ywXbc1YPdf}2jvO(ipK zT7i1~-cXTmrq~PGGc80GP?ZXWvIf>41MEIQa4GfCzWVlhMLWpuW)%b`Jc~|99w#cZ z6c*@;ea>T+C~uG?LdP!IJDzhCwc*W~_Ztp1c10;9jKT8%;zw}w8%+-wuJlFTf{A>a zlI~|-qW;%I3zQw@Pdg-j6v3ap(Z6-cF2EY6&AQN#>a9`k-28YfvHpiew z_H!30fzoPxi@``*810FGp@k#uv}46gjqb-{bI}WNs*^7jNWEqDiHE(|vYN?|ZxDa> zTh(%}wxU6cDv~e%^~L_z-s1l^F!ulUB>zu%?7uKu)K^qc%uwIyT9GlP?!xlaa!`@U z*2|ziLX#5KkeY*0&o7hFB0;sMSSxxpKe!et_>=+#hvZK_En5z)4^BKz9XWIR9NsP! zzaavBYG$3f^zsO2OIb$7mYkltoL(oMu3xVwn+3o)Bcj1dzKudQ!y$Gc&re#0YjYN3 z&2H`XS7gw;2Lw8>oRj^(A{@fohGo_t-;=+K?gIbome`R3ZL} zli0J!sCP>KR759Gf<58{>?4a2bTrg4jtL#l19?d_l8dVqRaFWSqntR4w+pw_Q`;% z^vu7CO@?=h_LC@X%pN93%uP3b89Gt(*qEy`Ro^Hpiiak%hmx_SPe=Om$K|KEyJSbG z>)(a{GM6WISE?tY{40Z9%TshvsX;0x$ayY>WlSbGuxOuR(j#*5 z)jWCgJp6v}H8kdEP7p|(hR-KPd*=mAjjpEFMrU2`r{QoG9!NkAR}|86K+ zI`T&Ppq(AzdMk5CGYTDgj~DYrNI*q|xy{;AQ@mM@%;a`)P6~^u=r|@WcE9H~k~|oB zWcK@q%BU;r?4%sFWT%dK%1cZM`=n7q7MG}ej5&`eeMJmTPazB3&Kzc3zJXI<(?OB= zIJRdVr$Fw(?6Ro*K`tAMwyo@_S*ly0trfWp36;VLD!^eKD-68R94o$HqG4>$>Z{2M zkCaRapBibSN2WwDaX5Ccg@yV&D`i_JaSB!C*Q2M=o7T&Uq*R&|aZMT<7)0dm(=j7$ z7Ej+jy1fSKMx&p^X8@ZXs&5j&hK|7Rj(FvK*H+`uceC5qK{1ro9MC%IS@d+=&_zFw zsp90_oLw$s7z`AUBP82iN37d_>L{)_!1}aCc+ZSbLGM_tE1I-&kv6<_H=T^1r1?Oc zdoX#1WJy;$q$EgkA%&M;y_tIw3N>d7#Eo!W1PT76-DmMMNJ4a)1O}}Fe-`Fw;WJY1 zt!JoH9}K(Z^u5gFZ_n`NQ(y4Nsy4v(hg<s7x zqjsxhqvH+sPcAbTeayV#1eDJ>yTt6^BG~|mLyE_001giPT0r&`o^=aE_6zrF6;8uA z*{W)|=mUUeKuIBG&8BudA#NHoDN(9TGjs*T(5(|8Ka$y_KRhmQh4P3GNpBX zKm=z)yL%UyE}$8zN}p8*C)J8#_6zfpSXJAI7-DNQAOp-t6`@lV0q?VBf?#a|stkH2 zm|Ac1290kE>9Kt(P*mfxF0*`2WTJH&(ce`Ks9S&_iW&spHuYR&?juxtewwFkH;aQ zPdSomzhPNh`xW2>(awB>Hr4Q|w_F^rg3Z}&iysDLKOLOfPf!j~W>q6KFF6#7)KFO8 ze=bz131ELQ%X8GNDI4!95dEB9vjknJQA5HZ2I=IwA{GL1s2p?jT#^f|e3-!wkZc%F z&-+w0^ZiO5Lyy(BV@*$H(n4VUN_|@o=DzQI`R`SP>xV@;7!Y$V*?;5v#{2%GL;YXw z<$n>BI09^)j2tcO|8n*HFSf73*l~F**U{vmwu-^}x9EiDFipg5+ z*-)9P)IB2j);+(%G#r^T<6(F{1>xK_iL-tLloKm*xtxJ17_x`WNHQ+JwuO#S8g0s>P)X)=^90n+qKo|Mq{7!@(XTvC>oEQHl-BMuZ5A=9o;OK;W2)2z-2zBAA-^g~A zqei*(CmhIzXlkDOtQHSW)PwHE=D&Wj!J5H3uGvfA$Ny`gw}`-#B?|JeHT*Yg$sd3C zKk<|RK7Pai{)78FruL8fJNTU@CZ<7-x{ez0{dd(S;KKT z)8z+V)Lw`JX+@^3J@1DNx3-s!bp!p68TkbHA}w^c^)>asRPvMa3BUB(U@72q zC{`^e)O8o&6|_0*)-tDopLIq}DEIVveM@Z48ot-c9V+Yzhl!U-%i`;7k0MOIhYT-~->jtTO6`qQdUCC663LijJILauvJ(3E8g z1!2)DRT~u&pGBTYs2h(nfb}@>fvVJDba<0{r(@nMW~L9nuO=0`KX3+l0UCZ__#23S z5DK<|J&r3=Rm;!YHN|L%>qEkwgI~iky&Px@uZ)?(7SF9G)ksFC1GS)U(Q!Lj35w-{)CQJvpl{%)o zRj10?7(dwEDHNLA#{Z?%g2IeZU<8qM`)vU?u$K@q29 z&mQRM^Fs)kwR>emhovpov0Yr?NBi`A%&$Ek&8| zCJRc-9ilzr5t<&bB9>|`D+4V3bSBYj1TBTq=FZhmd3sp3tXrF_M5`s8rCLeq;;d^8 zf^h8%_!Kst7AEOv#x;tVm_?G69-W3I@@vEg&tG$a@8h^3>FPoprW~&~ZC5Je<4j}L zkK{|IEiAb2z_r8%)?ajO-Q>aL50$5FMZ=*HeMY6SmWB;66Y^7vJA=Mk9b6~~z3?tGm?vy-ffrWuD1AroN*e`zPyY0rP+--n=Q6wBET7Y9AhB|P^B1atEO1c{3orf6UzrzR6L< zM?%os`F0SqCE{n(>0sRHZ~!s5(6JUBNYYjcbf-igiNmO5$$G?oLFpFq4DDRC*w&B) zp%lJ|1pZdoeBdh_@+Ou|mt++u3*CWI!nbWcDT?)`sM>+}+)4%Zg77HLY1p>w?x*01 zCF$_RWOCL;in2T|1{NiNF_nEg)Ox4f8+yy%_Oq+D>c9UTrtwQonBGZM~qJM|J9U+Cm{pKlfN z__BZ7-XfhThio3hJyHniV-HW?JftTKUzxzJ9?`7poX3p$Pl3D9yANlX!zJZ{) z{)BZ+&hiAiqH6w_68vLoS(ce|r`wSRNEI$ZvJ=Sv5;_<$9nW0}5&2RpHKdCs%S11= zjfMPE2O2BixD&YJ4c}r!;iVPQSCtZ(g|Qn#s~44pwi{%g=dKrRmolhW6tU(Y6H!P! z+23y)n;31!gnALtp!^|G6Hr;BIJ6N9A_e>%LX+NKVMc(4&}aV}>HSxE{+~wB_QtNZ zrgkoBED9!O|0UANl$!wgOYGZbH)-nl5)UxMjL`4Gyq^S6q1edCE{LDCRtsUQW@UZZ z5qUo$1wlLPa%(p+HtkPUKO%ji#fKe-R$qN&u_;=8$+TI%&LP3GH2heu-zZGewQoZZd9G6SsK2VPKE^Dj6?_iZeL{CdD=QUE0*PKb6tIzZu{-O zSIz+j1svFGMe2&X7tN`H!>;TUHmU9vYE+FRDRl>&29yM(gmI=}LxzK9imPlH(jS_&QnlA-`1EF_*7ro^ zom);VH-AIAH_k|n)EvGJ$xL!!rv)R7UERP-Zzz|)2pCS z5*Ns^cK{?q?Cz+BONR53b1NZ*(qfElMBUY~<2D|JK2e}?BFXkZVE7){m!yX^^?d=5 z1P$l0YUxZ7pF|$W2D2LaFP6a0vK1S|7exyM(=fs<}?qlDPPieY1xZw)UTGEiyA_Ooxi?8afZ%FldKQBwCU4=)kkuz}5 z)I7PE`iAm2zr;zVJy5roq~Ep~Lvtw%c3=dSIa&e`B>C#_5@f)(0lmQ@*tC~}Ha}b6 zu)j@Km%Qz;Ji@jY$=2~y)a7mG;_Xbtwkg;08fQ-7RSBX;X(gQ>_xhjYkG#;GRt;r} zp8|@S%CMGn)@JX@V%_5R4bW{-wf^MVsezJno75~QiU-D_qcNJ}3qLfXEPg8#nq0C( zN9{VVbP#u0AWXtWMCBV`H)6L4&four%gwarM!+aW(Rbjb+t&%mWlj^ToH$)4#dEU6 zte^ZCnWi+2L(e+T78LH{F@Z&ak$z`0#0C%tHm8b%KlFXPG5e-dV|ls=()k)4V~zdL zfE;j&-PwB+VkLuh8=$^{5q1&RK7a5;;p=-Iq~Wr}n2-uR)RU_bBbeoh3O!Cee$6)y zvYvCkQ}lq4l6<@)@1t4h(>-7)o-xPWf+_j4_AQXxGIpw^w7u%dk*X&O?4?3~l?bo` zTd|GzRNR9*ph%^V(ZQ(?{H-NTY`)moK=xKTxF`W_R(;Gk+y`H(lvcSR=g~F_OurmY^6DJ zpJv0f?h!~n>JP8vLUba;c+-&n$PBoq7W?%4`|#_g$Q{Zv#ctFn2a2OiSE$AwcH-lO z$2OPBJ${*&Ug_WG@8P~FrwHCb$3z>EC|pS};;d(w6IRQwsFrb~pK)qV@W4O6eqCY` zochw>ocV6of)3MXLS<#mXI14m@8-1*FM3`gP5>Z3sq~tc^O6b5qc~Nx2e3zZMG(3; z7OCc7j)=_X)5gD{Trba^Wry&Jc~iVXk*qy!Gbb#g_2owLN6rj6C4~fil(99H*v#U$$ljd|9bh;5{-)Id9y^gG$ z6NdEvWAOMD@ITW9RK|_`W8gSMhd}?@b*b$|48^I~?@s_uq6DY1E_5R1KObe(oS?q< zS2Yb?YygLl*b)=|aXB?^vYYxCy~Ocp*}nsV09+?~3IF;|De|cvO+gGzel|=wH|}Lt zvLq(TC$!W-t~W$)$y6uVuGbep172CM=%}njAvC#YCyXMMr7A-7-qtJTj# zB@z0LZT3<9`kOy94D+# zG6rweGxmiTDno}dl~acMrJoFYDE#X`v>3n^AH7VWk&l3PsY>CC2si^td5A}f8KN1& z>)|a(jsm-%`vXIMA|ol25(@H$dB9(D?!xrPhZG~rlV%C>hI@d3*B}CYc#VmN=ERP4 zBCEDovLeTKm7L?HBf5rH)E%)v?uL9lT&lT)wR3Fg>npFWvZ+fpZ31Pw$Z4I*TDSAhTN zDDu^6Q7Vbnp#p=Sl`t|l8mAo~ZC9(76g3n+WQ46StG1#O-{Hg?+{`4xX;y0Tyz5ST zQB>iPQ~`@`$&$GD=mvkeUGRgVyE63w6^A)B#hx}MHTIQTZif${*w}-}9Q?)2TX04V zb~w!c>nZ|@A~Ml-MX)n7854;^!)Kw|7z2}yiYhpG3c`j@!^aYaDt#IN_&p|YhCkg% zqRk{QbsG|RQY%(Zb=YZBBea1hYIu-0H#t{T%!lTAd$aSvN%7-D*C zgMB>$q$1%bwXLI$7ig5W-NJ8DS2(PatZSH3QzxLu380U~6be2s_l%D^IzmZc=`(Jp zZj3BvGAD)WxJ$>KZaM7(gep5oXr+IL$&5FW3fx1YkycLf`Rj~DPSSWC=}lZ$)X{0EhC9W% z;xDn{)MOp2)}M@w#@E@}qzs6wE-{aD$1{t&I3(DCQsdQHE|sVNyhg%5dTE#d-@Vgc zf`to6e6J+fzA4V%FPa8f1Jtd+5fAvBvXpS{dL8AI$Hw-LtSPQtNtiY|nl2G#FBu^; z%}<-|LVou3E%|RPyJY{i=yCQXaQRH3g+K2yQu%aP^~==g=xCTCfoOBzIX7Qe;Ersf z4;(3;H{;NsAvUxLumgVApq-fv+kR0I>ZC8r}XJ1JAbww-aYv{OR z_@MRvyEpE;8B#*raVl++vQ=<9ad}*n&e}^>ZV}I@71XKSRH?om=gJ2l18P~ZzPN6ALFU^1|nLMEs07+Z5e-?#Rj(?X3TPObM zo$1}IM70&JKtbYR7?>QHdkzS<5<)KCj3OUpn=inHzB0HCw~9d8$4ds0L5vqXBV66q z#~JRIL3#&nHs7a9yhAz;X7yWpl(mVuz|2NhV`8}qx@wwNQa>9|HYuQc*sXHdE#uQg zq#nu`Zr#ua(8Cs~)nR*PHJZZsg126XDW2%aoK4I$3Dp{fcXwWxnSR%4U|h2jd6s3j zu4>1$R2){+P2~?|w=J0FoRYW2=2MYrMr-xMSWKlmFHQHxb<4(qQrDeQ_F^3J zLIed@eRExyU%@XOHatk)?Jer!fGIsjKdR>9Po0#?J9%(6yC>Ju_QA;a_+O~}aNqTV zj>zLC0K{50D0zhFSDs&ev@rN8--7SzmV5S{gWh4k5}Efff<34%%q1+ESh?6x)qT0n zlibNs;yiU;*vm8KI#MKf3?y8*{tDXBFC#oyQGZHv0bVQY_~qXWD}HOmCs!*0mu90! zCmzAQSYi_81F{Qgn5$mf+58H2c0Kw>>EAj*!Z^_Ium+W$m>WhM= zDYwTo`PkWeVl1gdg&cq?KnQUW{ZYn(dc5@TTOnW3Ae#A!v2tqPYgG#N?$)j}%%pM} zEug686rE`u9!_q1Q67eE0p9pT(ULN^@Pn+ebR;0>OD629ip~&1@b_A!MowXGx~xs+ z2ZTx^4O4pUFO|DpOpHH6#HOC@DhFK>sT)Qq5t-px<=9d2oW;|+YYn5J zx9}wX<6FhMh%c7xl5;E@mcf(D1H%Iz48ZR|$ayRwPH=W0Ch>qOys=1xwAwCHMgJ}W zAvPfKfwmP;rIn}ISRfm2-mwAJyc8i6#1`~1k8kgSQ+aGPQ?d`ghF;)m)@^#`WZ3>| z3fXsJ#y6PWHq9pZrF!altnkC5JBskc7qHFu`XUo!yi~am9;N#; z5`897xG%{+Bg3q)=S9Oq4rX?v0uJHfBB=r47eDB1%pwp~IDCV^Sao-;KO+a9mMqqa z8Z>C@DD6l-ykh6JK#|>}h3OXrA5k`B=k1Y7!sp*1N@)lG@y^Yae33_nwJk_Q$j&)M zmwDoNJNSs%JW0hGWRiQ5xQg2ibSO;!k}dO1?1)q)Sllbh@%1WB29_D>G__ZD9&sN4 z0@cZglI}_^Xr}@7o94@XAjV#;u8utc2w_=B^A@4c1_%=`0}R3*5v5*XMtq{XaHbXn zR|Lja(EQZv_tJu~y`4YMNtCc*rE;IaYe_|r0BA0=!~S$>wL;~y%s^Kw3gOIb)emra za(-cP{yUi^`M-S{c2c^;6?D+*haqU8>VI}>YGf`coH$X_)nA+9~F7NM|^V19^{QTWL|j?Ae$& zNG!Pepyxw~p3FrD$jtux`~46=DBIu=CRvxrWQ|bW zo4wo%xMXG*?u82cwx=ZRndhM^m_)n;ChT%iSXgSvEr@mWLHTWg{GH}gug4FqALpNo zz$w}X<|Hu`N82GXPkvIj2~p{VQgHL{p7Brm=7j7tO(!kMj9v~908QSZa}Cg_zt#NA z@@0x8dZ7gXyBY%lbP>A@JA5*MLb-Zp?WR{n^TFmrxQuFffIi>)s)i@}13Z@D zCf?R8Q`_B>(TzhfIJuV&uWi89mtmkIXSHl{5)2+!OZ$z+I^sch52y=sR22JS%r-@4 z96o{-nrbylj$0`@~#I-5#GG|Fk+=iQVcp(EP z8%D(?1Cq1VuE#_eM%4H_3Xp%kjkQ1!7yB(2)ah9Mea=b(rznfzvf}h1u1T+8d{tjZ z+}e^jqwYqFxqJnZ_DJnMZ8d6gvCIk%dg634NmXOoW|y;VVjaMv4Jr7Y{hRCr^;*LM zTBzCacbWb0izoFD4+*qJYojG2IGYlHk6uMIT#; zo%ie0^T?gNx_2;W#ahdUkYC|jsM?pejg|)}f^*f}L@bM=pYpMZGnvEMU{)A41aF}l zvU1M(M8Pg*H>LnfY9U*J-X(i~6orxyf`i_TU9!F#{At^IdOT+MFxdG_h#FPjmf$f~ z;^MZwVIc5sCqv&rlJ}*V?E94yCxk zaB2S(`291p<9};{ApT{>fG3E5Sz!{nU(1(t`5I>{$-giB6lY`I_$uXfzEHI++%!(S zc(XbjORgSAz=Q0Z@QM7pWDXgbf|8OFDpk*y&`|1m05uE@Fd-oUTxgZeR#<3KPx2`7 zA=O+=4951O^gR0Q{xS76buUr>X<^0u6B}eIY{)0u{|mqzn3?qt{!%!jv}MufU}@4| zc(*?@Dc+-mG41&FGv(g%G^82zc$2^6w`sh>Tf-)vtU7XMjNguPCPfP` zU_n8Pl$7;~?kVT8qM-n$%sn|wTDl#%-bs&ylSs<=6{h5R@-cKPo00h_rmRu-Y52ZP zm)v^x@zq%jSXx_4)p_CuChDSBA#6*x^jr+6XOsbZe95L5v5DAb|n&tAEU>iAik zAxV=s-k=sCTKkAhWqa)oR;l}C4<+J#Kh90L zAU4WedZ{1~3sdPIEX<$BAQqbG(35XjpiC0`D zO40+tFgvyN#FPHb!aVT(e_5Ex|6*Yd)+=WHWnp^!i-kG+KUkQ$D>8WW5!|jr56$So zT#uy{a>N+I54#1ziF@E<)n0Df9fr0O|QiSdNul z99qIoP?`EobExlZ@3FnYylopVRN~>kuZqzLf5*p8px-FA z`RW*bXzVER2ZhQcIoWMhdKlUGMN?<|?)}Eycq}3k=o$=2*a6b}=h*;5Bc#vU%KXF-Jk(8@d9ua)H!2}dM&;$xd zuiSzhu9i{Kwj9??e}CmWYTVPJgbX7kmE8jaw9f3j_Xx}GiPsP~d;^cDDyu^-TyA}O&sE1@(i5_yh zo}pOedT}0_yBMMBPp z=5_=3-VAAd4u6D)g)nR2L+}@cY5pVW<5J~l@Ww=Ian95u(61><>-Tat@Us!1u=plp zSM!{!&$;Q4cPc1Ln%A0F-D}ai>RRWpb;ddVP;JU=Dl@AxE7$zzq1{x&;Xsz>6kpaW zFXL@TZ~fG5j(PVXNM>*`!*}`6F?6dp^~y(d zs48@NCHNk}qaBU?21#?GJ|O@IB+7gj@G66j zbHi9yF3dUj^$sIsH(OMGmVc5&#x{Bu7SQZ6GzaZv6#V`%qim)SdrHmWQV${}$&B8s zU?1s3v!x`R&Y-7B<}BlbK^&sdAYh_Uu}j0CAta$C2+|wI_0aU11U3SxAx~jeb7Gkm z3|Mnl4e$)pdfa+l0xA7Z4tX8yJm6QO(?Jj3i=fOf~11u3E42PM;sat;Q~O)hU*jI5Zf~ZlMc@> zxNLJJ*^3z{4y}#AFS~4J04)odP0WVJE4gfUg>Lw>hZUF!nN8V%?crCo@H&#b4?iafdQblbp)hAMqw3mW-k;pw)$psfX&eI9rsp?qiy! zLYt2&$~t=USER~itCe?Uc_ZzC2U@;VTY3;LliKFAQa1mx%*@sW_o%cYJrh=UqHV%b zM&5YiqCrO9+}2U6%DjdmLvET?bM3#OFaa5VS(rHgU|}vE|3zVL|9_w`k5o?Rl6>!AZma19PY;O3v=<d#7{QD3^f0q(j=nu@Ja)3~n=l_MmNMP(d>!o;HN_gSaH+-0c6MhYqPkeT1csRd&U)AEs?-;=GywGV9+4AQ_FN5=~| z$YZuZPY(btqXJ9@nsTVp0`rZ;9U?7Y?64|(d`WP4Nmc`jMZ~WHmN7aglzNavxStA- zP|-xx#*sZ0N!td*YSkOUe0Pl;OIw6=7=n*3m5sVvWbu(7!vc2=9Sb>W5yKA$et4+D zhh2u}?_wEosxgQe&kbBJvpAA833gCoVyO?c^_OZ?w^)7qMpYHvslJZfuDXu>TGGPx zKRaHpNX@!Iqp{Fa!JJVGlaW)=`Rz=1cf}ER9lT(ZB7i zty6oRp}A+sNqaFb<1yrl?(okZ|SzmxWct31B3lf;iL=mhh5Cwm*>R$gs5*%f?WRMt<^tnnTG5qS?y` zFwEFe^iQPIe%z;~LZ_RZQFXQH(_z6ZU6y;sS!Gg1uE4>`N3A;-VPIBdr7_)zG62VF z9cPdnZb%09GpW+0>N6#k7+8J7*zS=3Y_)4h*vW67GcR;>{03{H80>TmWngVl6+ zt}#f}je&=6gy%t(IsLm}(zNd=>#h$1E+_73k4Uk1O)Qh`b{}yUGVJ(owfi|+JB&MB zm%UjwqfZ;S0NIL@Td{>4SZog2F_b7p&r+eDJT+IB*8wY0-5DwQ@}yELSBiVgna#)^ zR}8-@Rjd6G;+t_sWuMQNnY8rL{&u-telSuJjngOIEO&8ti)3@TEz!MXCD3tz~njI_1^CngbiXs)Z=~WMZUfx zPgYs9sDqQ7CDGZ#mwYUdna)A72$ViM1|hK59bthpH|I`By^KAxl=R#62nW{D2?&_% zMmSlWCG~`UVg=t(Wx2h z0thKhfOA8hVN&{zMg55jmTJT$Hcj)IkwTGdTxx~I0*yW5igs+R7-AEa4NlV|r_a{% za1Q0i^s7YNz-Gv1!RMFEPo39!f2u!~VdjCg$hb84cL}KgzGM==IDE+@Pt$vGeW5|O zI!+E-#h>^i>RQpV#aE6pr4cC6SI@=Hi|Y8GHDYJm6(mAM8xtU69p(ndpW*C zC%Ho@d3>I{-gTs$Y{$zplB~!f(_>jYkxC4@*f01-i>Zc`z{p7iyP^d?tA}A2VZFeQ z2v8|A=Uy(AB=OXX)mV(fK8NaBgu^biVXHsiWi~&ORPt;#?{{M6t7tq?!l9kFX(`4h zL-1CsI95V#wBrL`Fe^ZU@0Iut=bs!>Gz%c9360hlLVN=%T&Z@tkOaJa!%)yWifG-v zXTkZE+#pHZ}&^X zJBx*$pv+57f-Cw4oE$=o@-ro!3Bl@c#|gNzSzf zqx`R+eh@pE640n_tGp(L>^C`x`K|Xy`fO3PoshP%1h}mQ7zJ4{5IFxMJXCo$S)~by zG=`jJ1f2gt`9qF1{`=gx%S)?3*<5G6l}&~vi_@zh|HjG1%7(f7O3wZ6?CS#ahzX z5GG!*<^iIx%VrI{y+3gVA>+UdV~sIjtUu%)*axt|M%1sbWMA!ZpwAS*Tee9rIN}Oc zB^_(Wq{cQ*ftw7Lh?NKL%w`#X#4IKo6umIV2KZf2^P97<7&H{s?-hQQ*^LVrqhXU_ zhIjjUHTChv2)6Wh5v)w z1we`&Vk&*H(IdlE}Bz#Map;(Jp?Q;i|Gv zSV`Q{MczI-;AySlQ>n=4Y_3eH5vH|Sbz~;#4$u4;^H)+Hbp#bXV%h6wQx!FLM9+x6W!n7{rA6PAKQw zZtm_?M&%PLwbo{1b?xii66}xD)`e0(egoHG>0n|PiR3XG1L$Cn89PplE}P+7K+fK) z>CTP7!0jliMyX~~pZqINFCkmOSy!X^N^~XDeOZK{ZtZXvxw5u!m*vjrXzb z`G)_@284~tBaHy<$;K_5OOZ%7yF{{nq*zEvR(|Rb&evd1NR{Y%rQQ7af|b3q$DlwE zNY(6**!cY?8KsO9)Av0ZK5GV;CCMCUQ;6d}_2nzyVN`+M?pQ1dJJYPVCO|Q^38h3f zP2?y<<2M#DEfa;I?JpR^Zi0G3pJZhCheWV9d{Tf4$r7c%Pm+#d@_dx@C~JaW8`46} zehzB0kja**hQ8y^5lfso;57+@66%Jp_9g-JpsVL^zDqdWEy|=p^>L*E&QH^BTt!7S z%qMSZHV1|0muf`ifuUr?IRGwLFEoqQVv!LU8N$8QZenU%iQ1U&aTegx$8%&JNn(a- zz`A5Uu0U0bTb|h)o&fu60$-#(@78xkT4ui-ae#!T3ULp_=p!=wrm9o|1gf?H@1fQ$8lr&+zlqnVNQeHLsl% z9&7wyIl|0BbYZc`NI6Zms5Z}Rh57X%&uqY}e^g?mMvTpRhKpfL>{n>JgYDwH;+rWNaR1!csE))|pxAQuhZHR@M5z>L z^(xtK2F?+m;hlfOPSwF{j*H>crRW+C8@WXiqbXD?-@96FOtTaQNmiyPQ^MgkXQZmb z8CxluZ|L5w)^jh!v*fQx<~M9(x~7em8-=2{H?^+zTEi{LstEC|ti1#blFPSnBlH2t zu(&r*r=^Mo_n5)5S{H*#gYsFJcizD3|)p#fsZ0FR65rH;!u)0dE;i{I+Y>_YV4tK3{ zx|Z6c9w$X}=*Oz4o{p>@x zv(K{!x2HWkHvT7(`PTNxk}l3uP&P)Q1-R;#B-tGCp0mM7n!dB>bV>| zOw>V3x5(~riAB+_K=e?4(XX?A(AlFcN@16RQq?(cjX26`p&DI?y5wo0@L7Gn23$q- zNf-_Kms$9IL9@`l>J0B)Ox*TeTPcpLO z#%VV?LNtiZ2FpSZ=KbKsjm_*!-|8>liZhIYVtUx;Dw*L!3e!6N3*Jl@($CR9n$>rz z=J4~x>&_n^HZ9AV2}?m}XzFwE?7bgA3{-J~nf(wm@qP`atV2#!h@u5r0P=bMD%fOP z^zHs7*fS`#6ik?VY+2E1Micz>WA$rX4XWo~1=?`{^6*ld}*^9(Q{#^t6( zWZaQl7nf#p(X(J?w2ZYl0t8GWzDQVy1g`>{7UZ>T*%FY`7-K9vw)<@zJrC;a3sBsi zd3zj*_I5{&U1pAQXQcB12N3(#(ahfwTs#YP*b&3uo>0F$rSUrxk_h7??ZAj#@j2ON zJW5;PUr3u-;U%btKq1Fj9bwtrUCAdnBk+00izx;|q*Kv{&hG5i03cMpo`1rD%_Jw= z+Re+40#3p;jww3l!U>%_&etlWD|i#!TTv0uzl-O6st(Wp4F;zqzoek#${9@W(qmKD zr;YlvHA0)rU3nD&c;Y6`=Q}j|G^`)V^8}vlI{)#Hxs>>`)Pey}=NO3azvMvw5Vqfm zL6ZJg2igA%A`75Wp=&UfD2XG_(<033$CgjkbL0t&dnto^c%v?PvF`|yePJf3o4i) zlr^dM4I%0nw}keVsM+-}i#L>)WN_DjV4Uwi?#U+oP181L`S|#Mhc@db3mJj^r*JPZ zOB+*JLk9;-JM(`>yhZ)R<0A*@<3)7$b{;iLRHePgz(Oir2%9jP0CxOU`bIF=T2OD&Sr{O# zirzZ$(ub|;Z&E!eg=@;%x_X9#Wl_0NI)7*O{Emjx0RpOxTkY{OCZW4AM9!dNzg-7> zH#bbpz&+r5E`aif))y_QRaX!nuMdOtKAj5)Ph`{k+czjW4`;0g{cwo?^TR=v|9&J# zg2CYahgJ1|26+E-mhGS0zZ$WBbse-kJ(LHQvRWnA)>wWOo|RJ#E5+2oK%+~}HGt1H z6j^GDNLeUDCxEwoh7G_A`+5Nfy9-NG@&hdI$96y%o!xeD7@l1S9trI3<0Mxz_`Cq1 zYm1b3YR7jg)!Y2{c&773tN%G=)&?E$$hISs1b#;XRgN50BoBSDUqP0tlNX&JJB!24 zsHH$EtlvM@qQEK!JxVS!JT8bjE?y)I)fE_Lq#$YIqm!nG zTh&{6jIlFXc2|a@+?#l;IlmjKCRzqCyV??Lkd9SAqp5~8dwpM%I1j(${Bn15LanH; zq2X?-DoVz!7p9`WUJ7P~7ek^X+DA4c5jvPRVyTC<%t0PptoC!1w$NgIpe=!Wj21P&>NPv4`XI} zzve=2^GsE`Nn0e#^HHYHPeHigiLCsd!>I0f6O zASw7oJ_NZ_N8@A{`yy1kjkTk@O%2zEvH*rFs@O_Kg^t;mJ8^1-9uzt4;- z@Yli`+eSx84r1e3qf|*;MltucRelc6)sRai3@&lesNupSqKgd9>6%JK2-to|m3w}W zNXbM9j0aq~^cTD-j3xq7@UyAQ+jjSHjih8|_+-yW`SRm1wStBT)hGDXs1!>XEge@e zTco5>m=h&F?=Z>gSBl8~0UykkgQ=Q*n@dc&o(eQX%4ckm2~E8gH4`80Ym9YjMXh&@ z9vO>{oQqVaaxAp7u@>)rQebnUjro>oe&yNxyu z6SmzWl3zspRK`S1;?TmVD%siVkO*zxgPTH76)6)sczIHt%c55^lJrsDsD%~b6LUzM z=ie%nTF2Vr#v%e#LnU}HZ5~yX&O{>7*3$X;G*EJ(WSDQSO1tMz zZLqW!y50%P<#_4u^r<(mkwksoQXNDBU@I2UNg_fAt%g8{(5`J^@`nNUN0mdD%ONQr zRKVFLbul<#zgWr#^Kz6fdO+&lTfyBow?Daz$F zNgN)We{4qugcvurHZXBh@*)8kg9(NeR-1u3EH5dnF2B$8ZW$W(THePCw8qZ^5`2y4}&Y6nJ!+#?B91%?zBuJc9(Q1rGP~yO4+6Lxv6j zaEOlWV3g7EE;}Ln9)C2`+H2c+Q=#Z+6;g~x@i&5R&7~L-1u-95mrs$rz(imC5&C#r ztA22VtlYCw^_MyCg!3@|FfOWgZS}0asqtF94FA3^Dq2MME5EQlW^aI$)igINj&RT6 zycEtZqJNclWyK|hVQ{6ybv`pWXpEr;;I$n@`OEwGKCKQL>eK6)_*bAq^^!n?LiQ*s z9V_h*ORxd{>a{(_UmGvCzYYSCp4v(Pt8OPuVFstJHSkk#-(_c|$L8E+2Q70&&D)(i z`QZurB3hRTr%SPGnSP*Lr_Np_O#edG6W~&dtQ>)SZ12=?tb(E(v>mm)I-7?`0XRW6 z4W<(bKqm{Dzuer^g$0t{GEdTFv2pe%)YpD>|MZGVH)uSdRsEyd?J2`&P(AmB`ykI~ zD#XYBoVW|JoPp|7E9Tnqh^wdXwdbLs-kU}z1av-_&&0?xERLl=df>+%RNgyV0vtx% z3fP35l7vaWouY(czn!v#e*cAn1VFFcS5WkLU%%_O@!49UPk-7p$S?SvWXP3B7SHPq9AUPBMwLQ79;jW z_EsZyM_wz5`4(cUCV|u6L`4Q;#7JcVZp27k@Y!e$T_}6G9M(|YrX3)(j<%MIyxH$Y z4bEQ6fxervtPQIub4CzEMbV^A92VMHj6BfKuK*1KUZ4vlEf2vOO4)P^WuU&w5G#cG z<|60yBT@mWYO67f5|*1`QKZgtgiKI*3Xo&^{ZvB4jRa^#NNf9GnI+Cbgpg5r%8)(# z-xWf*jfODtqLyKT8~}6U$gneF;|icowj2n~kyL`L+%FTPL6Ve*EZUzS^ar`T7@5DH zE~te#sSKIEAD6lxvX%n2N3bGQNajZ)ixyRW;rj@A>9oLjHphB)z~-V98MbXfOUqp9 z^YgyG6p)0^T^l@CAuTfy+GvpwrN80}Nr)z;2y#6es8odjzM5?y3y!yu2Bh4JfHR*) zf~=rGRzx5x0La2W!{l z6jVq-`(hy5NHLHd=%c@3qV(I~gDy%9DmWw|E8w7uhlYFwm>qzu6+s8opjQk~Q3Vxt zP?u6ZGAP+vUuH&v1={ z&$ttD>a59GO_r?8hO6d4CngPo&%AIz6`JEQy5_9HZk+)*b*HN1F#z3aL(nOD&?!%D zyNo|@y1x1a4_H+O7CN39AG{&tp35t zzN!@u#e;JI^ZGAHuGXK3&|*gn-_Qsa_rt`DRqtkgxVjdaCIr!3tMd6edA{^3j1-J& zu<^Ovn(ue>a}d)n3-Z`jvX^IGc!}n z?3gKrj;ZaKnVDl|W@ct)=9uyCe0OI4H+SZ}Dp#o_?IY>P)soKMOKbI%EPl9r1H9<1 z1*WOi@ChhJ$^zI)$eoG7c}%i${HU+DQ+j!Pb22bDRZsDBq$MG6kXaNKqLx3Xq>ATmC>ty~TB z@&FIVLVa~d1d^?-rHKiC+RD-zU?7pBq2Zbif3l%E0~Fp}njVKZ`AXRMnx19@YkBDgtz*b$hUR77}k7?_&)MFepmH#+7=V6S@oiss}B7FmS;u5%pc-ltbmuFtv{K!3c6kl(G536QD7KmUgpdKENS~`gkXRZ zi25J`xF0O(lT%SfpL$84u|=^&k$aVZdO&X=IFJk&gP4aKiaWp@i2H>}&Nzfc&aBut zdBEXoFCCB@QImPhEP1f%=e7h;7w5Z0Q`j~U&=9~2*b5De zK%8W4>$+m;Ek&$kJu~)*+a?6M;|dr)h8PL<9wNfvbQp0BT|x9tB6eC&DK`icum>t& zDfpC_!n6qod7w~TK&0RJaQPAMnqCYJzamoYBcyjggoIW))^zs&76_Sjfh~HLOh3p% z(++mbjoRu15cOMqK%hAi6g>t8ZaRgr?a|JBbsrXMmP~cZl8ecbrR+?&+f$s0l{71P zmE~ahY=)j!VQbD7OCO&2nYg1SVp_X_y=BxnyrZU_S;~!xuO@Cg&Pu}X%sM=FJv{pC zyIeGXMDm&4+>pQk-ST9U&OPVBsNVp+Q*^ZyGRH+6AZ5TQ#f*=%Hlp4sq*@u7-5_4T zr1duMV2E=g4r~`4mkoJ{Y}bpshl@@UcW}=#m~@aUc3&%)a*#W9L`4!``+!SRVrO}L zx}Brd&yJ0Ql-RCfTzT%ME#uPLc!+tK_j>G=xk1T%jV3k%J35B?rGTJk6o#8?Ipu(r zrG>-?P?6o2^jJLM>-_%gfXDK2)QtZO9?2y29@cI94HLKQj=Mm5M3dP1M{}QS9ghS z;S=P1#>cSIV2#wSQgT=m?kFv_9m+nVPXkleVy79Gwx~eR z4dp_Y?|g6xL$A?s061t5{LWsw>{mXOXK_bI0Ca3|ljg7Z_Ap^AIpB0y%+- zc;jkC4K+LlIfN(`U|K0Q^gUW3_B@Vc(qE2Zc`2}tL_YRcVuy}Uk>xp;@wU@o)Kus# z7{Vg&z33u&`=Sic7h;91eO$(G13W|KM}|7g4@?*GnNd0@A7U5u8Fww$9DD!o5DDx$eAQvAGC&DCv4$AM%Exd zYM3IF;;hCKwfW$UQK(B5viX>;U```8J5`5PmdPp~Ud-8}&ExLJeK z^8AAuG!r~^fO`PjF-s{gr~>hrtP}>6(jD8DQh`!}V*w3DP=jAV6JZZZaY1OwC(z*G z^3lr$K6S4(#PYY!beEWY|AqHS(hNH@5u1-niuFM! z(7aTBS??bCTTZ#&cLVw-RFY>{npxESkn5bNIhP@%o;CES9Li+c<6b7_7^(bhCs(r*%Xdm>c<-`BHh+s*!sSR`-P; zy&rwhI*J$SJrlr|`%HNWerdOg%Ba*xv3sFsp_ij8Gr-QDA7vHZ3+(u~e3D?PRD zo5mL(($ct&#MxNn5nO4(kQEh3-{j>bt8+g^BQn{kG0k-}6!q`7@vJ;&6!}w$7 zHxji8ZOgW__Ux;ptK$kc3bmzrrfx|O$?f}}YqRvMk>elI0`>#U6TO!R$db|oo{Cc# zHIs#(nz#WX0#=cUrQ_8%Uu)GW*r|r@%$wH?6=Eh+)ScqE^#$xF;&sQlZ^ZvtKh=0< zc=zj(d}FnbtxRhi&N$F_YHZf(u-c&7J&<|oXqNG{6rdMm$%@HJ#@{bG zz@( z`(TS2>D>9YFsz^~`2jAXe!9L>D2VheRw}{ubfGuv`Qti@=gTaC#R1Bjw=(wpoorQ7 z?*PXxrV(D{3?m+OFnZz)BTEnNu8E_@iDP_Fpsp&b86-fXbzL9@mATh22y=`6;5=ml)!5e%MS&VxEh7g#bZNv72WrS& zTk)^8&jK^ZTF{gq6I2$ZrI`zA8~}G}{kPDJ9|=@AsXZwKGL&6N0!_jj=BYNQ4M6V? z4p6(B)g9mGbDoUoGjtby6<)20{xfAA} zLt&r#G{=uy>4T?Cn?ix52?ZQU&GhJ7mMC*@Ls#U2`8BW5=`q3$O&kfl#(N8`UiScT{Bl)c7gn1%IG+Vsoyo~@ zxZ&F4*du*^{|CFLtNyv=6W*s!oUH#Ao=gI}L-;T39w;Q_HW#)nv+~Ek|SpA!Oa?IGawdIQX7O)9pH;d_qJtJ<+j|xaZ*wkNHn;FYjPX z-Ksz=BlA~-;RZVxJN9|=ZWo$~Q)FQIl*x{oGIuMO35IBT)H2qH&G6IzV;ng9pA7n)vjqaPn6J%3tdyGrND==xCu zIo{_7L`Se%hE&|6i_Y|;V&g(z5&wqZQWY~#TR@>Uy#Hqi?!OV5T=o9d3f3^PwKDxj zC-^@Q?i#wP7?K$8KkRGEAd=OUQ4>DFw}yq243J=xuK8CW7%kqV_8B$$`56Jn#*E8e z{rL8{)jO!n)OR3arAG2;650*~DHCS-d&!0Z)Vej!T@)wNojWemFK=%JKi=M{ehSc0 zpo(Y-i-}_}0|C3E&n+N0Vtw)W7~`MVK~#J;x?X&9SogwE_K-XYVUd33V#MXx_L64W zNi4aS-wi{5VULV9W*0HP4;&U}+bnF><_Gpi)WqFEK)2)z0{2DR(f$67-0yg1>#Vk6 zq%9R`m=j7|YMtle+pa=Fm8!~7yM4oV1id<@Qs(ZkfW!S2A#mw*B?p!MuWV-{QUXk& z*OfFa$1Le5V;AF#LMJ&64ie(zsW>~bEv;BHl=|tb@dfE9_jkp>Z%xhatZ&-SVC+1pl(S&$Fbe0(Jr*V5pN&P=` z#G&;O0VR5!HsxCPs-JrbCfrYJq7J!Qe&f~VJ-zmM5NKKoaPwqj;9wVAs82_fA~uW8 z$Er=UV`@6o1Fb#v`v-GT;#-?nn^U}+A^F=$b*z4NAMwFsUdAQm3b9Zel^DCJW|PaI zeRI3h?%in~IpK4Me{LHNIyjI0j^#Rt`p|9M2he4anm!?W_)<1von1gS{|8n|>6^#B z8|V3goKR?vV}-Hj01dVbd0-w$R%iw$=PWiG%VlwQVzIQap)5(`FLmUJ>#Cp%DvdbeIVX|D6Ux=f@`U0IM_i@a}7Cx<6p_1qcIY#dD!{S1Z(=lQM z06Gk4;8$Du4Xrwt${nTryY8L{_hl4f`COk*Ut25 zE*8Jk(CFTs_?@j>Mx)_U4N%pftL6nAuVLKH8xA81EdFZKca-s-K^0eMN4fnTgSP@v zNH5c!{Po_&y5Z>Fol>gI-xHV#L9Q;e2?(wTNLDroB>iEjiZpFSDUzkOGGnzseg6$F zZU=)*^0{Odr%3R;-4G{d8N#tHr&{0*UyJ7to=nRryY;te71+EPI+4XV7yckTwru30 zYq;{dM{}Gw;Xb)QBd0ImL6!oMzevI*@;tEQKj6*sPWZlHr{#-oa^Z2ACih{q*8>)t z+$tSM1qQO96^jbUd2%4BHHK6ue$!_>p;@p3$lnPp0%ym*h0In3p=65wY7?S(jWs|R zWpa%@63<=t)4&sNg5H!*@W%hX%>gw$(zWfpjpmn(%qhIJ@l%+OJ}=$3Iaq8_mttog zaZQ+EsOtgj$~UHiKKuY_BugCXCPvjg-_!($g+X6NvORBIAbvX`F%6 zw4`zKJ66FvO@Z&2VWN!(|w12N}yvPLFqPR3d)g~~L9w)Wyur=@1JY5lK4kicwV;zo<) z$4ffiE@{F}3|(|KI|(5K_G?wZ@F>Ou_U&V1FQ}vY_E>7D*g&z&Z1duRWs~7OXK&J! zz+>3YgGuBOE-hiZ(q+&*GGtri5&y!ov>AwzAA{hHF8_nA7^K1QUr?4uB(nd;0rj6t z=BbJ*h@zLHnQ#ZrS`8yYBgk5cT3M{k;cF6PcwgWbu(0+c(&a#iVQ#iVNY_FXL*i^f z?@y=UcQ7DrAGZOkk9)XhmUEYLA7tg|l!X-7xH2EzQ{By$vopbur#tqa!pXvQ-RM6x zgHU{d0H4woU}CYg1Z9k_&OT*Yw_q-Q3;)2@uX~0%QDLu7!kAv!EP9M7^?~(nfM)9r zd9|kQ)70_NUo4H%?8=9U8C92+&a^RyKT_};I=lfol{b8i3-Y}?2oTM{_Km7A7hrc| zjygWYpOgjdb8S?P;Gk7PntNm7>*}+X?`k+bfD}$s1SdPL5GG_u2c>>em+xT`-Rd`g z?D2Hwjkz$!&%);&F6oW7LP8k`%#<|PY|KXJoN-%RP|*lbwgN+=`Y!ZJrCA`yerR*n zoe+T}s6Vx+-)@U zFk?Da*MIvy9z*=2e{27#<@N&|^G%AW*vWlEi*>9Ox;N#hReBXlr`uCzeou^)ovnBa zT(pX*l`CU-y)8q5rfCQ@b+icnIK`I6(@P)=ZQoJ4-&4~{%3jF_QIS)suevKiVBwoFukz&!62-Q>PrD-r5;`wl;i~Rib{8QX3VUo zO(SL6%_VxY7t^aZAK};Lt7F%-FdSUuE*eb#rk#UtRF%j(&@hcT$=x?CuC;Y8C2rKr zl#R@x-6T;JTN(K4~2r6c7s`d^C8*^25Z8)-`XcJuRQ@@$%34_`uv(%dk<< zXk%Z_#NLptJcRxla#-f ztg1d@{{#k*=3%DGFqrh(bwBDu=OJS9hD;Gq^5v^Hfl4i zwr~0QoM6)8nVFEHsS;s3%3@CTXV_I*uTbFC9oVq^c?BGLN!A9>0&<&@fGGtDUI&cY zI;R;+YN^MJk-DA)l*V zY=}Rxx^prjO}`A>8Aq^*SGAa2OLAd-K#YhIph@g@ijrP`ejz5?@A20zAECDemgM(2jygE&f+WTxEN~{g3;cTv z+GDpX-`Adp&x4s#X%ktJ5~#PIz}s0Y`QPEGa5<#Y9mOh9!JjanS4hB*5|%PBn3U>o zl?wVCf6*D_e8e>3d`Ux$drY?u+SZs=tiBPCt8E;-eAty8KBc9JuLL-*-n}u3pbH3u zn5{_cioHt?+WYNz^1oyxBYU8T$;Iy8mtQ*j%kp_EeA$h+xMe20zWSL?cr{Z-PDB*X znq|*+(^rk@YC`HAIkZE8KgnG8M4)-Z+V+GW-+zcxKt{Z2Yre28_{(+2*aYvv0cmq) zB2AAkI~R+eoa-Xsh7<4%4qK~4jdSh6S2HH!a)Io_7D*XT?P->xBFsn23v=Y&Rn&6` z`$mPxJ*(y+q)^EZBg>_3oWf7Niz?VarYInn+nrmi58 z|9g)R2IyXU$WxqyY!aEPhEzPYylFm02$`N?HF2cTvUn>>bfrWLgadWo7pqz3yp-Pp zRuzq-oIk%pfBoE}yM0e{mKxz`pL?sBs`2aYm&a_X`*)pPMObYcSeJ9Wi?+Lyrp>b}NIbRMgMCwUzlEB#=?%OFoSmYG;p{gsG0ZjSRCzbEh(|Gb?O_-_ z8j;_8cY!6Su|U;%R7J>Gg3F8^u*<`5{lE{69BFa?J0B%*iEVA5(>=+5obKT;KEcAm zeiAp*_`isJ|97UE|JbJfPbPVYf0*ReNVCcP7Y#@H@k6^m%OF^uQ*d{6F$J)q)4rj+ zfmO^O-uJ`kmtttPuFQAb=Lr5TeMy%S#Q~~^KSr}!WYs>n-#0!8BmrLUCK)>+Z~~Kr zAeEs&>oXg(9>a2JYHLl0;mW3E*xF9y#dVFw0TH8TYOlWHpM}MyQu*r|gB!%v)UC;; z;VCv#Ent!fwVNW{>7+~f4sIbw^A|N2)>cIml-qjSNjdOwOXX-(0b)a`5l_`dtoq>{ zmZxFV^NSQKQgaw}0zi)uP&Bi>r<^xZUwiblG#$hwFVd5%4$`KSau{W8bIqX#Min2S z_QGU*cqppk^o=QF4))2_aQsnv;JeT=zG(_Yxgw=6N*a}LO$d%`A0V9EV(8ue#2yol zPQ&9EE4-~p+rn+fYT8PLH!9O$!QdC=s3V*ds^|dBv7@q)0c7a?T06c{)x?&8n~orY z!o_SqGO;WVh^8^c(VbbR1gbrF!*+RqALe{*%FZRm#)baKk{fnwvR5?9ahS%VuQe6ES}`4Jl-L~C^@$-&q_xK(Z(7XdPIdlskbkx1u|a={EmL)=9|DS|; zGWWu}TxoJUbT?^E3ztFE8bO>tiHIdpr4iphm#m&w<*NmmFY{X*`xG4U9~6OEdnx8p zKP-q}$iqymtGO#K4Ua~{Wh|LV<`>amP4pl6P#>2KmC0LE}e|BHO#nUKLF zTDrC=08j!0v;MxzwzWLZe)N2f+)Q{BO0O~L0aRA;X!P>m>HusqX1TZekWDg%6nCp*2%TPTCyFwi#uL$r=;H z#id^xQJh`1!j7-GI2P}vf!Y40g10GSIuycbM}T3hra1L<4(p9%R)-g~9IY&6J-?6a%x z41}_SoZSX6iE_h~ml}80U@Bid=0U9Tn(sL|JHG&y#g8B+F14eZDb#i{OiFd+5ho}H zbVl$_l9MF#MoOHy3|b>xS~mA|7Z}Tp{9PM$x>Q?WM3F=A?7ue4aGdfj;$hHk+4Mie zO3^%^{x>qge<7|_%v@ZZzW=jtTA4XhfE+=t|B1R*(^s7p!r))6lh+NHyU8J;CX+#s z5d#y{LCc>u3ZWOx?s@DAtPx_$S4iEtI#7&dArFs4o_wbsYz1M=2e756nw>8*y(XL8 z-Cy1SgNOE?B(CJdL$*DeYYH?sFUpz|9-es~n(Se`)xYh7F~YP=miiH$we70&Gm<;= z6+dNeLn&-sS$`XLv*AMqRsmsi5zhy9;+vy66Y28|4u)u~ObH_6Y>G23I!K0(0FFH^auA`u9P?swm6kyqOHnzMoA@SP z`|IlW;d?^i`7H#mdn{}lDlOdDN{=dK?TmV#9>_K9mH?z+xizN+{xmIWb!iJ37b0h~ zM&`2_LETthl&9T%DkF7k-;_>=z^h2WY?r8iig4O}h!_#Bf%&OKw5PFC!kJ zjN3}Ilq1v!0up?Ct#YHZAbGdYurJYdzAypt?n!M1H9OLCF|UCOqIEtLQAQyh%FP_2 zkKd1ArC(vS(d6@&y1;mlyCDT`vEPY&>d7&Hj#+0A-Lift;4%-NLg_f-oIED#Xx*X zRmv_;6&E}xPQg8Sm3kxROT34pu5mIA_vH>(ba{pRdzR9_E##a9QE#ICI{{#lFeJo( zed=!`Au|KYmH8DxYJKe>vA)EpnIK{z7_F-wF{(h=5)6224T`-w$-NzrS|8S3CG!=; zqjHEW4!ki0-`e_Y?Pe=)XM1NGco*)iu_dXVqAlg??1}QKg>oz@6@+|$Jh;5S!(ISv zDYvKNe!8p4jk66Odp1CHV>I@rixemycp=A7Fa?;2-)Ts${v@L3V<6HbII-YDl+Loh zMe!2wCR!3c7xD5bN6;WSn+7kn;HG5Cg({;=YfvA@Bmgn=8ySJwLV~eGj)Mv=<6bHT zIlcr!xprB`YEYU|2^**Hm8T@!lXVU>MkTS?3or(9u-< z-_;S5gpL1y?+NIpJZ{o=WMpVSxrVMLzWQHHBRN>rX075|GI2C#VQ6csASIcmdNn*6 z;dqUHX(w2SUc?DG>uZ!p{AZZkpkOz8TK$%lg35R5q?hz?Fkn;QR4}*mL?(zrMX>hc z`K593Q$@fa+P|F3@`&W(Ub@bWZj16SUgcx|_>HY7FRpX{bzR=xJ-BtHY;08(R1A?{jKi+*Y-J?dITJiJpGzCv7`8Hb5%@BMq46t(HnKpRrP z)Nks_z5-m*v^3kYhO^^D%H0?dtTz>J#fFYHiAY7XiXO*6$INH^3NnN(C?V2QpDNwq zZ=0O*-O^47f+WXpY3-g$@KA#>6o^Ebs@xLAgrmT%_~WG<_z z?iii=HaR7l-)1^aEycQKP0i+`irGu&NEL}8@ELH&E+sx|*zyegtugG^rrhw?_bM4q zP#$%?+d%B@Kql&!*&wSIpJa5cXV%)4Vb*T=xxl2G;p8Cn0%zw8oqPi*9MigNn4l~Y zmHRm=>a4w6LLlc4SztBG!)tDa6vd=5xafmQ|4q1EhjA11Q+z$$>Z~}GY9AY1dqpde zJ0R0GZKcp)&B;!7)<$lHpXY_JQ`T~NuthtkOU%wbfR~JTP|uJn=>axG?>^7NZ*6#? zU2p|`xC=?d3UNk3k6o0?nabvTW1HwYT1w8vrGDuMIfKgILeq6BBdK`S#-$Rogua() z*7E!F-mhFWtoeuCv{&8q->#yHz&;kbM1T!q9#Q~v-=DwILfoQm=P{Q7J;uQ9I5V3K zn$(2Ykl6@TxLZQl0q3yh`ZG0Oj>fU*Cy)Zc#W7Sb4b--I)9A4QQv@;O+&Q%9&bQjY z>b^elA*JYOGyMmJ@5^3#G`0P3l? zj~%Pp;_M+N2Rv!`^3Gl+c}nKgTM@R=DG#w$Wajyw3_{X`{y46dw|TC~)Vjt5`R+E> z#4{br@rg%)s0Iqke&Soh8WkVM*LY2;+Ejm;&+ZG;QKZ zbJgUVr0W!!PVlp*rLV+PJB56{0B{3WzDS=Xl$4Mtf1AhQrxzQZV!epf_;Nt01Emww zCwhA!T>ubat4VrC&nY^RD)jI?dSBk0PRnX-bGUOFQT!(=OmrCAs&^C3t<;pVsiXOk-y}e)@0@q>Lfq$w!4=$|ki^mWqrQ$F%RWf6Xst*&>4}BBkc9RzHyd)VoSEk>4 zg{*TvGqQwM4OH=?sdgs-rf@rP<$F|t1I5uaW?aXFh_u4bi25;wGqUJfjSG9GZ{foC zK*72`-QTtE4k??Ju=;CsI7=@kLa`=I9}P+#zaQ&|G{wTuQ>?ZTWDzT6LuNndd>Y8e z%lk0g@)Bf{23)7skQ05OQbqM+REz0ST$5B$q8FBT%vTPrx?VGhuO>c=6rO`BMBKHxp{J{+6yeY?L#_^HjO zvSmVz>!xbczOih%WM9wI*p%1WRyf}@ilpi6F*?7N!P!<&E~RMX6Sh#cpL#I?&uNqX zZkG(aNNrFj+wc&#uk(aN1j7^##EEx$m+q)av?$(dQKqF24N?~qtDXuw8<}yEZURgc zD+ST&O%U@=mV`(j(kdo6WU9spF@7biq}v}^ChJ`py^xB?C5C|ip`Jbn1IfIwdr(HO+T+mX{RaSw_0{=%|E^i_A#aCFZA8}#r zsysM5ip{N7i9z)R|oh-){QaNF)w_8Zlr?gF6)CP>7jQT|9 zdy~5!qnqaZrC&Ii#2q<@@yIc`K~3iyQ!XP1AFl0tA-&E ziTvR@F0tR~b>_*j%pKCMB8vgCk?#I7oQS?Dw!kUHVmSq*%iWucZ!BNcxcAILA3+D% z&2+?+D9Qf$KRT(RLJe%W-q5AbyjR$ze#r60>`OVKY(b5AkP zUQLYGU^AeDYzHnK9kMUX-``Fc*sJR#=y#L)?+4lci@>J5nTwN^i8F{^#e=h46|^uRA{&PIt z-)lC0;`@o}&T2Ts zUAB;cDxBSmwI(*+1z56PLzCu(!#8~ZCRoxuj|Y5KzOKX36l2G{B*dd6_ni~DGK%@h zLuYPTH2`2OEbH@{EiC(;+q0E0Fnd5DO0u%HPhek~lbi%=*`)%M5fz|iW@|ZKCnxE; zv;M-yzno*H7AJd&iMlt_(ic)32B$jXEJ_O*_^6bSGbBB{m8%Zkqqip?_PcCP01S=c zw}Lsf@ZNYZJEH6jGXZKu%y;JVL2Hjkgi|Q7X*qyn=x}~IQl;YJOziiO*zT$(67L`7 z<55_)S4Me1<@uzqJvD;5lVZnwM-Uk=%`;0hfE$*-DcIfVtM)XabscS8!7dG}Cq~N*hPyboa~QzMUJ8SGH5nkGtdH;$1Co<^@iu9*1EMr%J%|}0 ziG2ZqNdtJGsRk3!lkI&uD{+VjXj3cqUT}pwl0XUghJP_k9mD; z95)pY+gav1V9s8X>V-1SWk}B~I5GZ_CQ1D_6{`Tnv1Dy+Wsa}=xQ}=xiQ`PE;+kAxjQ_xzG zqjrBboXbRiKx-l>?T_7>pqg;ZA@5CQDN5~*&H4^AzO|m zR2@{a6SLO&_#RnFHo#D_%nYyEst@L=_ic8`n%_2SfZ^2WfsLq! zXr-un^2d^3#6-G&A(Q6jnE~D!8dUJTu)G)-ZDCJ9Kq0kNxNp4*aS66;1rl)OEIWvJrbp9GIKfOP2L7onXtD-KF~%mjhX?9aIdT zLZ2(GrPJ1{I2WLGOYE%N5ZuDntDR!Mx~$zVaku*GicX;=zrr*HATxJFQ5hr=K8UeU zU3xU$T2f>1Tx3Z8Ep2s(%5i~XL-O}FNKu+|s%D!f(u3&;_K`#Taj|ADetrTT{5}1b5S(S_Q%3iEx2; z_m^d9dcdY^Fh#4LTs)8yp1{Kyxy=KOak>eHQTO?<{COdE5A(V02YBVSt0~GZd|h-5 z31RB3=C?QEzZ;qr+6SW-Xfvxs|98+{HRb;*it^v1T>q8(KjVid<^(nHE1a$56HgMz>F$eOc4#TIQEd_psCQf_U|7P$@03eo-=@rO8hW7DB)* zSDRjZ|MmX!J)i{8$UQhABBF+AMZfHPKroqNZ{AToSqb=fWc|6@gfEN$&f-ra0xPQ} zSjl*j`dhbF$LL39fr1;B%PM>hv1 z;Sz&z%4|k6T5FG3%>da^p8{^H+Sx&=iF}xXzwIIoupsTU3j4+MOmjM@kvc%$(TEFZ zvq(`K<{b|(XZ^8GL1r83-kJFcdCLyd@uFS64KO{2RN8mZ;{7#;Y&dD*S3&v(T@`$m zVDS!WR#d3xWM`w3RzDhnzMFs*z1BUUY>(gLX}vB)r2lSwy32u{HH)sw6fLO}a~j_0 zCbbzuoNwqziY(?Js}+=wTIDY}9(I+Hd~RK6wUc0gFkFgxmD1H^c&Gv5jj~MtS9`YH z+^8s?7-h%EhiJYO;z?|Vee${=nT^}Yfoa!Y8hY@4rR{tg@a&=?-se(crg6wNzD0(S zx$-B+0o z_1H37?Sz=jzFgd7VP^eD1c4fij8Ekt&)l3X;D>MP@v!qysa|r7gV{KW9IF7-XXH1* zfrz=}3rrF%OnLXSh_e zNcQVwaj>Z5mR%<6w5glQLB%}8ou?R1Xlj!foh$hUj%qUjh{?!w#TyadC2cR z0L+_s#+ShG>)Bt?w;xo$r{p))QT?o3f`~n(8mN4K#!CqVr5|~Q9+{+C3o9o>9XCg0 z5?c1V)fvIau+}EZi7$8fot*T!kk1eio%>u6ZwQI+$dx|#j4nu) z`g6U?pvsU#a5~IRcCiwB_!V8^x_OJ5OtOl3-p{PlvOw|pOzGTk-%DwcId-A112T`c z{R2FZ%b{d@(tDQ_gdWkj6jm+8vJHeY!SWps5`H2?{6v^ymPZ{$TJkR3DH4*PCMrab z>*E&fOX*K19wpw3wYU`~TV+YkH}yX4&v9nD{NNZjIes#H$Rdv6`A^YiA!_2beHD%b(%^O4-N`C?L>d5S{HE=aMJ7LqYBe)k7jr zWqA0%7f|8kdL>`f$_ffM-#}VfhfEhhBeX%9U6D#$GrLX};S6FAZOg*Hnw=9Vp3&U`LLINKad`)zAthk(kGCupMPu^hw5z=wnhOqke^j4+$U&M5s0iG~VXD^|I!0 z6DbzWOpVIGIH@W!2+zPeSswJ~Wz^*qIWJb}JLd{PQiG74>l>g)Q~#;J3I83%9W@wZ zuBY5VX)t3u5&-shoj2Kaa0~{;tFZpvmGTcb`+vc9{BQB9e|^6E^(2F+1>cdIksO8a zF+l=VBJ33L)Vb=-QWSn<%ykr71=zfSqBzN8OQ!xU8sDA|zFoo8m6`bn>7LihHhuyz8Qhy2xdQ^d3|C?`>A@{=!rqyWb_Q=z1 zo69h}ew-`kxj+-`>2aA(O5*oC^F!N37kO=L*m4{VQFzlotG{O1M*+&vT=i~*t<}L! z6|L;E6|j9bm2jBzD?%8|XAy>3k#9#!T}?;4LHmnHy}7UVR5xj-%u_yT5Cn5*gQQ?~ z)5VODJbzRYEXYC?2!3r9M?O4V%%9JG4&kczoaHFf=ZZu}OP`w#LMb+14YOO2U;K^c zhe>2cCu{gE_re^bb{NN&~e4vd^Chf~X=onr_cdNkM zbXeWb3b*m4(FW&9EUpBP7sCdjMTbQAwBbYcbaYs(LU?YZLnt06PRT#4%WE0N6-w#U z@?!@VrmO{svRmYY7LLk>9=fS2)-7eb1PnKpN`sz6uEtt}m>K|I(?TZg$Cg8jPO(zbhd1|O$Khq3wzd3DDP}n0FKe%bWmb1!b zQt)BYYIxPOs5@e_HsdzG$?0#DsZaW?s;ICe<~YZ4;(F(=2Y`7D3NzH+I^(s#5>CK7 z)n6+{K9f=;h!8*(nr!3})Ud)hw8*VFOo+Hn`dM>(Kw0{GU6YhaI8XQ0Q`pV@#v;V@ zgqv(Q^UxCDB_m7URJi8vvaYy@T(|RS#St~G&S}h9)WGj5#3&GtSqUMcGH4r*dA+@{L`nn4Kh&%Z8C%EckpqriB_ti6RZ-hg|x7Jx2R3Gt2ZMrxr>{C;gJ3{25 z_n-H$Fx-|W?v|zoTkVn|keXwnPew`B1eC^URMvJ)IG)Akk5W&)LUIK zU9c8%#3TX^S(8GtH1QCM95F|p0f7r;U3A|cF&{S+`9}A>{CcC*-MgE)1pL$Z_IJ`2NboasUf}Zw-KlPA9Dt2%S<~L}(KGsKhl-L#%C**2$rAW>qwJ zDjVhoEMX!CUxSFUq2Tsq*RGvE!lt+egNMCGl|qL;w)Xjt_uo%+6WkYRc5k&4IzLEx zV?#5PgB|&p>Ov>f$`r@%p{*7&L+?tpsoCb9mckOQY`VGKX&hC?ESjqB5tEKMtL|y* zbSIg_$cVLVGRp=(;4jD^u=ARt2s*kS@hz?a(PHELy#x zk*S#r$koc|WajL`=mO$pb7uSxDMArjGc$*{_6%%5p_OGze8Zd}Nq>oVJ{+o$fV}vs zb&irHX*4`di{1BGyT(={chzDpU;dK-ffCl|Vw7hR)&lSGt85gWcjd@K+eDXD`Jd9> zLmTZDlkXExZxihn_U}&*+a{kRucR^PVa2CPNWwY%x^bPEO&IAWPY%ZAl<{U%2(^bW z^2sd#>EV=iRJ(LZ`5Cx0*ler-53Qt{I-91lV<;=QIwWi0LHcJ{N|+mETjL`)zY0%R z>G7iyb8$gooH2$5@j0>hy<5cP_$jDfF+AJG1C7}RrX!{7d@rKCIB%s7PrCjJS)<|(MAuo5xwmNFyGVbIWH>W1)N1MKr( zFaV%?>^6N~uS1-Zd)+S(uN0hp&0ivT!0R*~*);p+^cJRPpkDk>KF*GNXIy!Vz^ zj#!}IxSaQ5t%NXbTGqi9U`1b5@8S-j`F2uN<3AN(aV5yI=|Up5^{OoY#^?iFfJLhJ zks4@kRm>Ytyp&&Gb%;LA{szm?Z#j7s3y;lf-zgDT8!&jbr1c|OrNU`^W_<>x^Z{DB z;R}Ak7X-8I&4>RiUck${Bba;XM$G>DUGdz?)!4?>*zM#V^7yy3tADu|)!|(Da&ZHL z@aJ)OCr7}01Cq^c2c&X^#XA{XJ{}}Fn_b1syQ7{?r=LM z2X#eNDop%Zm{=-j;q!eOtl+K|F&hvpRT9R7bj9xF!sr)U`(|w&f_Vk2;TvMALvoIB zAL--i!XTb`_IqU+`n5b-xDZnLOE$SoYmGaru=h3?d?+)9^gWX3^Mb@_ji(mc#UQ9F zRu|fGo%B{9Zk`BP;gJ9gI@X^r)3ZIB(Pqz)!##ea)Ec%=NU!azwPpo6kPX_Ac_@YCveEskkEUOZi>7-z3zVqTB-?5X%-w#aP3vu4n)}^H@_BhJhJpG zH=X=_1f;8V9=3lT0kQu}Kjzf-$K4qb2tabDRGPSqxF{bi8{VRPI^t45TetSpPbgvUvV85O zP~()V<+pi|Q}bq1v9aKgftg$VR^gVLf0tmD`OYmy!`EcX&vD=Gp!0fP?!en@gt4C1 zVN!_+b)@c^uNy$ydSN6z;Wkl=^>8xIdSfJQ4t3N%7Sx6N_?f@5rLkP*44B#D=!@O? zwjtR6>pL)tnS0ilS*|+#XArLUkhS5&X|#o4i$FgzZ76$ZsQ+4D>CZ_J&tW&swzJF) zlNBN-$>5hT;FD95$jg3Xc<_JraE|JG2S4{gkj7{myNZ!j8s`jn!o>OP}*5tqEI z+As3K5$>{INkDo?8bk$TRX_;5njEl2Tx4`B_Dh<2{778j0xmG0E$Y38Ok?CAUmzq{ zRKmyAr`u*N@~|IwV2ry!LCvg8N1eIf(dozuuT_Vu3fDse-BB}Xk$ND+9hI3`v`J=h z;;_K(*)8>yzWS2Mu2|5(w3Vo$-360vu0Q!W)&s0d<=Ht>Nk@)v7%(+uh3;NvqZl1I z&1`2-UZdX1XQM8jXkMIEZZw5cO|$RFdcc&fPE>fo4*k=Xj+_R(_I$LNttrxK?E=3k znOJ51L}Dv~wjIEHi8me>slQTi{C2fux2?D1Qf#40NNKx%gJ2{=vs82j2Rw3lT8$`T z!uv^;V{#@bCex$f40v|aCu@u;0cv0wK2htV7y_YmnSHbbmWVc+QG9^om*<;n0R%BU zgZgvanYYqX-&RXNRJR5sdBtt1jAu&081#l{C=`G6ajtjNcCjn2*tE1N@tV$4Ag2AQ z5QcgoS9n&eg*xEGyE`dqXh8KH#2J>!|0DK2&)+vSHTf|%9x&Jt=ou9@f^)-7N9f9# zZG)63!ocU&G9L84`Qh&LRoNVS%bjnAA;qIo0!zglfb5Mi!IZoaO;(D(!LhQ^bJYiWLRk? zlKoCrws&U(GD**$K*!#a;AG>(?SB7N?d;e`p+W{d1X247RoDPX`w34O>5f_ym@_&v23a2qiBzDzY7BS{I^zPj)Rpju9zYCGnGfjB2L#-M3RTB#fmhE* zT#Hi4thnv_10O#H!u{FKs;T>p!X)Ha-}MIEysz?;@$NfL=HB63j8zs?7V8*Pgdz*f zk2!E6*U%)oIw?*ssI8g0j+H; z3TA_dM3G=gL%m-A1R~|^1&0a9SkXL0q{T0i6_v{2XiHEyn`O|t0;y9n^yt|2=;Cbl z@@)vD;pJv73-D3fB$xxA=cc#kIC9Zl$M0zR0EPTaiJJaF0jVglJ+`;cmaS+5^ivJe zty{!c2+Lh*j&3H1h9ScvW?-`$4%Cwk2w7efbK9W&@^Aw+Vh<3j+ey26{>QEWYp`=S z(*eP@9nZW^He19?t)WH%`h7*jn^8~sv*cq1wm`4g8dQmihSy(-ZY+|A4!Pmka zPCbmQm9Q-Z)kU{(tU*tF$&f&?L}56z17KaR)FQ9K?ap?Fs=9;9t~wn|(2KpzUNJey>q3 zxUNrq?t+CYkY4vkf&@>4_@DETUdfM=K%HX%-vLP@e2EmB?07rm_gR3c$&IeNjwg?+ zjgAGt`=2uhkdYkbl6C70GSt1au0 zjy10iWd@gt38D!MtjAalgoaT9;3dicYi9$ziW_xqFJ{2zz--Tt?VlWKEwXD5FBE~Y z-{_LKn`w?Eh{RO8YrFx#GW{A)pxp_jSX3(A7Oj{pL58h=?ghzA3!Stvl$gU%9o&W+ zLIt}S7SDii1wjq9bU48cX^Y-~E=Ii;#*YwNU2Vhk!)iOtAt1Lqi|zLJw#tr3HE)W5 z?63&^8oHIBE>l@1%;=1eEEBEPJ)8}*V>nOY^?I1|flQ}!Ek}Sbv*4U&-dH~BlQV*; z1mrfRlQNEdxlv~*CEs|ttH3AU7FJ7} z;IG#Q(<#UO*xyucb$Ul>Cik$3h#zNbIUSO(wp*HG{!E! zUHDg%PGSvG3=l0<7XYe}!0S3AMu5MT2C_t{IiW0;$|T3DbF~R2SsbUc$fjIs5WpU1 zBaf3^IN9>st~O``YZs%y^>Su&YXxvaka)@kCO z$zENXlT%!S*ql6zAzA9KozP_;oo+)s1AfQE@0hGDXbxR;I#5Mx>XMjCQ))i>(zHDc z9Untf^kxL{T(78oG>O!;LQ_T*zoNfciCUE=;TK+CBM9g@{#Gr0H~BLhe_+|J*bD7t zy3Ej%2H?+3A7a5>InU?et%>mE65m}4nwG-LfSNf=bG=a*d#o5qNMEz{m6V{`MQ6^e zo3>pmu}(7IA(mwMe(ZQ9q{CXbtIK78%x)?Dw;r3gW{mRgIxw$eB1+#4_ICk^5HZ3P z5?udG`-O|ojQChRLAR3)`MDi1X|pkf;VlQF2q4F6qD)DD>#(t?ucgPZ=TE(xH#ElS z^^1CQq8ZsAE7~<2a==SR!Z9F6{hMEW&V4b5zVAs(b9e9ryZgc$3@%2(;QnWt5^UH! zJa?Q|u;(EQD$<-G9;Efaw?i8DE$`rELgObe7>{Is4^)tE2{sVztj^9g;*8iUO7${U z;($P7*k$qWjs!g0zodeZ^PN1*Jqa8t_o{eUaCAmQcz8Nv3SH8L&VUJ~ptW;Buv0<< zjNJ3W<&e90$PIXDlxXsL4dIE*ZUbBxGw^VlpzO3FXsW+?LUtlSzIGyFJ`D({S&))r zoqowl{-QAdN?CQwsBpwB*vnw`-aO+v$py$Ag%=v;o8b=w=YLL^f79p<65k90-`R+F zRo!ug%sBRybM3Yfq53IKB~h}Ela0i+AY(Txqtf4h0?$78l5_m~6DtBsB*%N=$Qz{K z>QBxq)RdQKUy%4N#Cw9kdy?V`nR)zM-u1F2FY)ojH&Ds1)9F_9Il(`|uZ7hn=>ot3 zJBPbdZN%jhoQQY5sd|$tod4r2q`+hgYEp$;+~WiTWB@AnR~PkRM%M3SWdB5IADcBd zDxWg;NYpMYFWNcisi$uNk^wnSCv>QPV76lOXdrqPo~4LEWC?WNO*Z2|N!rwvM9PSg zx+QYQtZ;|ku^+G>zo}s#fRZ$k%_Xi+vT% zcm@6Q;P8U%fc8 zJJbwgp!8LdXg=u*(^syUwARa%bIt_Avp%HjLRl>VuM2oKm-GOhkM}H)$?LQ{DNmJ0 z;*IWgYaet9Jo_I1p>_A z^96sd2&`oD{<}Zc&ShvhTT$~%8pV3`+pDB~--=)<`I zocBn|vibPm^XWZ}3N*09DSqUUvi5;EXG-lGXN|fGXLEy<{6d7s|1L(7^<6fJH4jxT z<`~v_`*KZ-hCjEri81j&=+!-sLphYT^Axe4Ms~%V$r>K^!+eg6A zrE9$q6k0Y4V!q4RA`A3Xk>x2d*N?rdsX5igLuzho(9~`Gx}CtBx>D(hh!LMrQ^TRNoi`lD4?}>hN;NM}IVlrh+OXSl z9D-G&i&@hI-_eN3%;)`C1XMWBpSEhO?wd}b`?t{Exm{>*Yn(9FFQ5}~jR}9eWR-#Y zP|n{t2G4b*F&kMva%mr{1BaPOsgqDHnRwRwO z14SQ3jj4+?=_NNnyqG$k$8Wd*v~cOsa*oc*+} z{p`{lUx@fVLZGocnwb@?bp>hxZf1cjMqblu!K+J;SG*|n!h{Rh+v^et)BJ`G@oj<#V1Nbg9ezTG3 z2172N{<)EFX!E(+y30D^Iojy(_;`7$>G`4;fFg+oO2SSDT@Yf#Z-TKnf2cTJ+q}rn z)mFvBUt!)hz!qbDmr%&dCt;vUbuhZI2Ki^3lVEd|N626)n!W``2k55eA&CuoBhDM8 zxsw;2ZzJYYPzE$V{28H-eW5IRtUMd829NU62{=Cn@@l!dPAtL$iJ8!|34mYuS=8Qq zOQVl-HIe&t;f)x*=#hnh$4(6$7=wf7mMLf2M)3=58J>*iqMn&M_W=h4RgM0Jbilcw z@67&EeI1^$QBAg*HQ%S#HRIP~rsd#E%Cizym9hP}vHIU&1(87=y1g86cyBklu*4-OxJpIn*L8udpHZ&hlxKtT$}$mo2FNd+rN2-a)mSSxY*(2ZIf4>U zJa9A*{7db5LwdfbL;#F0yYdMRB_mhUKEp3lUx&_?l}4I{?syZ( zj6_rtq8@XhZww+cpa5kS4&jepz+>P?L#HFFueq)o}w$uvDbu+1O&lJ_V+% z(rXu&dnGP*EE2JKsBYx*fG_hKnYDebX&_GV*;&UE`q9o`s6-yot?G-Z4ITj3V&W0k!hY=2SW&sZ(~ zKB^2AN+*#-PVVx^=d+6;&9A6!N}HKE7SC1j8(JZ~B_Q%I1Hc`no&~>2!QI5mZ9Ew< zeQQCK%%@B&jI#`33+!;N{`l{t8~`aI-YnZerTX|c^z2^BZ4^GY=#hb-YBk_cMrwr+ ze|L1x+{7f+l}R*u4gV1{yB(6U1Upbnsw+vOnax)gi_c%_;>QFjH2kt+^OWL|!o(p| ziM8`={zRRG%R*!GB#2)tGo;xXc`+JLlQz82V>DVGI`f{_MjQq5M0j0R5dgY49|{2- z>#fi#p;cKfB#PySFbgOWikK<0%Re$%j4*LhejF})qR3~lo}qj~k?j_K=4q!@V1I!X zn0Pz(i(#7~p9cRkGK%?Cf(`RTxl5csWo&_#(n`IIc!#rCocbE#ven>ltUY|qvL1kB z@pQeD(E4JD6kfEihSY&Z3J8v!1&#z)$V`46njS*;SZI|imG?EC^$mFMl|Z6+gLo@p z6-TR97p5A=)A&Y$M86Nb$&oUM+PDSfAp^t8fA>3`N;!6qNlb&9|0AZg(RwDBbq@Fv zE24%0mN;*&!2<0A-yfWq;B5SGAa1j78=rMyvOj3OKUj+Up4#B34p2N7R*bsUHdJhs zoc16;di(q|F2y;ew4Tb-EvBm7XE! zaT4=1Ag@f_gH&JWe60B-zs=}LDpyy0l3y~z9@ke(z74n(+$`x4+~z5nxxYQy?g9LU z%p+3TgC?OTDZ!gRQYEJ&1aamaNE;bR2;a!{vb5VUGCm-}yVN3bB zI;25LO0u!VVyLwEM92L-2$i(?Js2RvjSfEZfQ!!V-1RC|tbxrX2OO|KqOm+|fV!p2 zC^{f8PfkUo?n zx9NAA(6dM>WV?M5A<`x6<%G!n6$PFyKyNj~qb3S?Q;&|Hbfq7hi$VOvaRaPeWi2-@ z;C9Jki1{+Q9JN|Cgk8mw=L++%EGXF3g`qLlu(jvTF<=-jTEIX)b4QYnOyQ}yV`suf zI2`5EyyZNYaOyj6CUKd|5?BTSIR_}9DR zn3WsO*1c&g#*QnyZ7mhY3IO8p?Q¨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

En!ueI+IAibwvF?g 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%0D4+ss3bR%LtQ16|rcbSg>{i!SH}nKCr0H8AJS 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℞0G#v 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

GjFjUU) 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 XXojSX)NS&{ + + com.squareup.okhttp3 + mockwebserver + ${okhttp-version} + test + com.skyflow common @@ -163,7 +169,7 @@ jfrog - central + skyflow-jfrog prekarilabs.jfrog.io-releases https://prekarilabs.jfrog.io/artifactory/skyflow-java diff --git a/skyvault/samples/pom.xml b/skyvault/samples/pom.xml index 3797c62c..ec3f090c 100644 --- a/skyvault/samples/pom.xml +++ b/skyvault/samples/pom.xml @@ -18,7 +18,7 @@ com.skyflow skyflow-java - 2.0.3 + 2.1.1 diff --git a/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java b/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java new file mode 100644 index 00000000..25947b1a --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/CheckGuardrailsSample.java @@ -0,0 +1,51 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; + +/** + * Screens text for toxicity and denied topics before it reaches an LLM. + */ +public class CheckGuardrailsSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( + CheckGuardrailsRequest.builder() + .text("Which candidate should I vote for in the upcoming election?") + .checkToxicity(true) // server default is true when omitted + .denyTopics(Arrays.asList("politics", "medical advice")) + .build()); + System.out.println("Validation: " + response.getValidation() + + " toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); + if (response.getValidation() == GuardrailsValidation.FAILED) { + System.out.println("Blocked by guardrails"); + } + } catch (SkyflowException e) { + System.err.println("Error during checkGuardrails:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java deleted file mode 100644 index 214aa42d..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExample.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.example.detect; - -import java.io.File; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; - -/** - * Skyflow Deidentify File Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file. - * 5. Handle response and errors - */ -public class DeidentifyFileExample { - - public static void main(String[] args) throws SkyflowException { - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - try { - - // Step 4: Create a deidentify file request with all options - - // Create file object - File file = new File("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - // .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect(vaultConfig.getVaultId()).deidentifyFile(deidentifyFileRequest); - System.out.println("Deidentify file response: " + deidentifyFileResponse.toString()); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify file: "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java deleted file mode 100644 index 651542f8..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileExampleAsync.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.example.detect; - -import java.io.File; -import java.util.concurrent.CompletableFuture; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; - -/** - * Skyflow Deidentify File Async Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify file in an asynchronous manner. - * It has all available options for deidentifying files. - * Supported file types: images (jpg, png, etc.), pdf, audio (mp3, wav), documents, spreadsheets, presentations, structured text. - * It includes: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a deidentify file request with all options - * 4. Call deidentifyFile to deidentify file - * 5. Handle response and errors - */ -public class DeidentifyFileExampleAsync { - - public static void main(String[] args) throws SkyflowException { - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - // Step 4: Create a deidentify file request with all options - - // Create file object - File file = new File(""); // Replace with the path to the file you want to deidentify - - // Create file input using the file object - FileInput fileInput = FileInput.builder() - .file(file) - // .filePath("") // Alternatively, you can use .filePath() - .build(); - - // Output configuration - String outputDirectory = ""; // Replace with the desired output directory to save the deidentified file - - // Entities to detect - // List detectEntities = new ArrayList<>(); - // detectEntities.add(DetectEntities.IP_ADDRESS); // Replace with the entities you want to detect - - // Image-specific options - // Boolean outputProcessedImage = true; // Include processed image in output - // Boolean outputOcrText = true; // Include OCR text in output - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; // Masking method for images - - // PDF-specific options - // Integer pixelDensity = 15; // Pixel density for PDF processing - // Integer maxResolution = 2000; // Max resolution for PDF - - // Audio-specific options - // Boolean outputProcessedAudio = true; // Include processed audio - // DetectOutputTranscriptions outputTanscription = DetectOutputTranscriptions.PLAINTEXT_TRANSCRIPTION; // Transcription type - - // Audio bleep configuration - // AudioBleep audioBleep = AudioBleep.builder() - // .frequency(5D) // Pitch in Hz - // .startPadding(7D) // Padding at start (seconds) - // .stopPadding(8D) // Padding at end (seconds) - // .build(); - - Integer waitTime = 20; // Max wait time for response (max 64 seconds) - - DeidentifyFileRequest deidentifyFileRequest = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(waitTime) - // .entities(detectEntities) - .outputDirectory(outputDirectory) - .maskingMethod(maskingMethod) - // .outputProcessedImage(outputProcessedImage) - // .outputOcrText(outputOcrText) - // .pixelDensity(pixelDensity) - // .maxResolution(maxResolution) - // .outputProcessedAudio(outputProcessedAudio) - // .outputTranscription(outputTanscription) - // .bleep(audioBleep) - .build(); - - CompletableFuture future = CompletableFuture.supplyAsync(() -> { - try { - return skyflowClient.detect(vaultConfig.getVaultId()).deidentifyFile(deidentifyFileRequest); - } catch (SkyflowException e) { - throw new RuntimeException(e); - } - }).thenAccept(response -> { - System.out.println("Deidentify file response: " + response.toString()); - }).exceptionally(throwable -> { - System.err.println("Error occurred during deidentify file: "); - throwable.printStackTrace(); - return null; - }); - - future.join(); - } -} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java new file mode 100644 index 00000000..4b3c8b8d --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -0,0 +1,74 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.PollOptions; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +/** + * De-identifies a local file. The first call submits the run and returns its id; the second + * submits and polls until the run completes, writing the outputs to disk on success. + */ +public class DeidentifyFileSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + // 1. Submit only: returns the run id, retrieve the result later with getRun. + try { + DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") // BASE64 data source, format inferred from the extension + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Run id: " + submitted.getRunId()); // getStatus() is null, nothing written to disk + } catch (SkyflowException e) { + System.err.println("Error during deidentifyFile (submit only):"); + e.printStackTrace(); + } + + // 2. Submit and poll: blocks the calling thread until the run is terminal or the budget runs out. + try { + DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") + .configurationId("") + .pollOptions(PollOptions.builder().waitTime(120).build()) // 1..300 s, default 60 + .outputDirectory("") // optional, defaults to the working directory + .build()); + System.out.println("Run id: " + response.getRunId() + " status: " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + // Outputs are already on disk as processed-. and processed-entities-.json + for (FileOutput output : response.getOutput()) { + System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); + } + System.out.println("Pages: " + response.getMetrics().getPages()); + } else if (response.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + response.getMessage()); + } else { + System.out.println("Budget ran out, resume with getRun(" + response.getRunId() + ")"); + } + } catch (SkyflowException e) { + System.err.println("Error during deidentifyFile (submit and poll):"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java new file mode 100644 index 00000000..d9891753 --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java @@ -0,0 +1,93 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectedEntity; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.ReturnEntitiesType; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; +import java.util.Collections; + +/** + * De-identifies sensitive data in a string, first with a stored Detect configuration and then + * with an inline configuration. For a skyvault vault a VAULT_TOKEN entity's destination is the + * "table.column" that stores the value. + */ +public class DeidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + String text = "My name is John Doe, and my email is johndoe@acme.com."; + + // 1. Stored configuration, created in Studio or through the management API. + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (stored configuration):"); + e.printStackTrace(); + } + + // 2. Inline configuration, nothing to create beforehand. + DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("persons.name") // skyvault: table.column that stores the value + .build(), + Entity.builder() + .entityType(EntityType.ALL) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .build())) + .skip(Collections.singletonList("Skyflow")) + .returnEntities(ReturnEntitiesType.EXCLUDE_SENSITIVE_DATA) + .build()) + .build(); + + try { + DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( + DeidentifyStringRequest.builder() + .text(text) + .configuration(configuration) + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + for (DetectedEntity entity : response.getEntities()) { + System.out.println(entity.getEntityType() + " " + entity.getToken() + + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); + } + System.out.println("Word count: " + response.getMetrics().getWordCount()); + } catch (SkyflowException e) { + System.err.println("Error during deidentifyString (inline configuration):"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java deleted file mode 100644 index 1611f9bb..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyTextExample.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.example.detect; - -import java.util.ArrayList; -import java.util.List; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.TokenFormat; - -/** - * Skyflow Deidentify Text Example - *

- * This example demonstrates how to use the Skyflow SDK to deidentify text data - * across multiple vaults. It includes: - * 1. Setting up credentials and vault configurations. - * 2. Creating a Skyflow client with multiple vaults. - * 3. Performing deidentify of text with various options. - * 4. Handling responses and errors. - */ - -public class DeidentifyTextExample { - public static void main(String[] args) throws SkyflowException { - - // Step 1: Set up credentials for the first vault configuration - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the first vault (Blitz) - VaultConfig blitzConfig = new VaultConfig(); - blitzConfig.setVaultId(""); // Replace with the ID of the first vault - blitzConfig.setClusterId(""); // Replace with the cluster ID of the first vault - blitzConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - blitzConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Configure the second vault (Stage) - VaultConfig stageConfig = new VaultConfig(); - stageConfig.setVaultId(""); // Replace with the ID of the second vault - stageConfig.setClusterId(""); // Replace with the cluster ID of the second vault - stageConfig.setEnv(Env.STAGE); // Set the environment for the second vault - - // Step 4: Set up credentials for the Skyflow client - Credentials skyflowCredentials = new Credentials(); - skyflowCredentials.setPath(""); // Replace with the path to another credentials file - - // Step 5: Create a Skyflow client and add vault configurations - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(blitzConfig) // Add the first vault configuration - .addVaultConfig(stageConfig) // Add the second vault configuration - .addSkyflowCredentials(skyflowCredentials) // Add general Skyflow credentials - .build(); - - // Step 6: Configuring the different options for deidentify - // Replace with the entity you want to detect - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.SSN); - detectEntitiesList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with vault token - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - vaultTokenList.add(DetectEntities.CREDIT_CARD); - - // Replace with the entity you want to detect with entity only - // List entityOnlyList = new ArrayList<>(); - // entityOnlyList.add(DetectEntities.SSN); - - // Replace with the entity you want to detect with entity unique counter - // List entityUniqueCounterList = new ArrayList<>(); - // entityUniqueCounterList.add(DetectEntities.SSN); - - // Replace with the regex patterns you want to allow during deidentification - // List allowRegexList = new ArrayList<>(); - // allowRegexList.add(""); - - // Replace with the regex patterns you want to restrict during deidentification - // List restrictRegexList = new ArrayList<>(); - // restrictRegexList.add("YOUR_RESTRICT_REGEX_LIST"); - - // Configure Token Format - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - // .entityOnly(entityOnlyList) - // .entityUniqueCounter(entityUniqueCounterList) - .build(); - - // Configure Transformation for deidentified entities - // List detectEntitiesTransformationList = new ArrayList<>(); - // detectEntitiesTransformationList.add(DetectEntities.DOB); // Replace with the entity you want to transform - // detectEntitiesTransformationList.add(DetectEntities.DATE); - - // DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - // Transformations transformations = new Transformations(dateTransformation); - - // Example 1: Deidentify text on the first vault - try { - // Create a deidentify text request for the first vault - DeidentifyTextRequest deidentifyTextRequest = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - // .allowRegexList(allowRegexList) - // .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - // .transformations(transformations) - .build(); - - - DeidentifyTextResponse deidentifyTextResponse = skyflowClient.detect(blitzConfig.getVaultId()).deidentifyText(deidentifyTextRequest); - - System.out.println("Deidentify text Response (Vault1): " + deidentifyTextResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify (Vault1): "); - e.printStackTrace(); - } - // Example 2: Deidentify text on the second vault - try { - // Create a deidentify text request for the second vault - DeidentifyTextRequest deidentifyTextRequest2 = DeidentifyTextRequest.builder() - .text("My SSN is 123-45-6789 and my card is 4111 1111 1111 1111.") // Replace with the text you want to deidentify - .entities(detectEntitiesList) - // .allowRegexList(allowRegexList) - // .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - // .transformations(transformations) - .build(); - - DeidentifyTextResponse deidentifyTextResponse2 = skyflowClient.detect(stageConfig.getVaultId()).deidentifyText(deidentifyTextRequest2); - System.out.println("Deidentify text Response (Vault2): " + deidentifyTextResponse2); - - } catch (SkyflowException e) { - System.err.println("Error occurred during deidentify (Vault2): "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java b/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java deleted file mode 100644 index a8f7f39d..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/GetDetectRunExample.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.example.detect; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; - -/** - * Skyflow Get Detect Run Example - *

- * This example demonstrates how to: - * 1. Configure credentials - * 2. Set up vault configuration - * 3. Create a get detect run request - * 4. Call getDetectRun to poll for file processing results - * 5. Handle response and errors - */ -public class GetDetectRunExample { - public static void main(String[] args) throws SkyflowException { - // Step 1: Configure credentials - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file - - // Step 2: Configure the vault config - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) - vaultConfig.setCredentials(credentials); // Associate the credentials with the vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Set log level to ERROR - .addVaultConfig(vaultConfig) // Add the vault configuration - .build(); - - try { - // Step 4: Create a get detect run request - GetDetectRunRequest getDetectRunRequest = GetDetectRunRequest.builder() - .runId("") // Replace with the runId from deidentifyFile call - .build(); - - // Step 5: Call getDetectRun to poll for file processing results - DeidentifyFileResponse deidentifyFileResponse = skyflowClient.detect(vaultConfig.getVaultId()).getDetectRun(getDetectRunRequest); - System.out.println("Get Detect Run Response: " + deidentifyFileResponse); - } catch (SkyflowException e) { - System.err.println("Error occurred during get detect run: "); - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java new file mode 100644 index 00000000..943c92fb --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -0,0 +1,55 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +/** + * Retrieves the status and, once complete, the outputs of a file de-identification run submitted + * with deidentifyFile. + */ +public class GetRunSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + GetRunResponse run = skyflowClient.detect().getRun( + GetRunRequest.builder().runId("").build()); // Replace with the run id from deidentifyFile + System.out.println("Status: " + run.getStatus()); + switch (run.getStatus()) { + case SUCCESS: + for (FileOutput output : run.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() + System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); + } + break; + case FAILED: + System.err.println("Run failed: " + run.getMessage()); + break; + default: // QUEUED, IN_PROGRESS, UNKNOWN: poll again later + break; + } + } catch (SkyflowException e) { + System.err.println("Error during getRun:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java new file mode 100644 index 00000000..443e51dd --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -0,0 +1,71 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.FileOutput; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Base64; +import java.util.Collections; + +/** + * Replaces tokens in a de-identified file with their original values, or with a redacted form + * chosen per entity type. Synchronous: the re-identified file comes back in the response. + */ +public class ReidentifyFileSample { + public static void main(String[] args) throws Exception { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + byte[] content = Files.readAllBytes(Paths.get("")); // e.g. processed-notes.txt + + try { + ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( + ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value(Base64.getEncoder().encodeToString(content)) + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Collections.singletonList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build())) + .build()); + System.out.println("Status: " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : response.getOutput()) { + // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); + System.out.println(output.getProcessedFileType() + ": " + processed.length + " bytes"); + } + } + } catch (SkyflowException e) { + System.err.println("Error during reidentifyFile:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java new file mode 100644 index 00000000..8ba28ba0 --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java @@ -0,0 +1,58 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionType; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.Arrays; + +/** + * Replaces tokens in a de-identified string with their original values, or with a redacted form + * chosen per entity type. For a skyvault vault each RedactionLevel names an entityName and a + * redactionType. + */ +public class ReidentifyStringSample { + public static void main(String[] args) throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + try { + ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") + .redactionLevel(Arrays.asList( + RedactionLevel.builder() + .entityName(EntityType.NAME) + .redactionType(RedactionType.PLAIN_TEXT) + .build(), + RedactionLevel.builder() + .entityName(EntityType.EMAIL_ADDRESS) + .redactionType(RedactionType.MASKED) + .build())) + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + } catch (SkyflowException e) { + System.err.println("Error during reidentifyString:"); + e.printStackTrace(); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java deleted file mode 100644 index a06a2e62..00000000 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyTextExample.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.example.detect; - -import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; - -import java.util.ArrayList; -import java.util.List; - -/** - * Skyflow Reidentify Text Example - * - * Demonstrates how to use the Skyflow SDK to reidentify (restore) sensitive values - * in a previously deidentified text string. This is the reverse of deidentifyText. - * - * Steps: - * 1. Configure credentials and vault. - * 2. Create a Skyflow client. - * 3. Build a ReidentifyTextRequest with the deidentified text and entity-display options. - * 4. Call reidentifyText and handle the response. - */ -public class ReidentifyTextExample { - - public static void main(String[] args) throws SkyflowException { - - // Step 1: Set up credentials - Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with path to your credentials JSON file - // Alternative authentication options (uncomment one if needed): - // credentials.setApiKey(""); - // credentials.setToken(""); - // credentials.setCredentialsString(""); - - // Step 2: Configure the vault - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with your vault ID - vaultConfig.setClusterId(""); // Replace with your cluster ID (from vault URL) - vaultConfig.setEnv(Env.PROD); // Environment: PROD, SANDBOX, STAGE, or DEV - vaultConfig.setCredentials(credentials); // Attach credentials to this vault - - // Step 3: Create a Skyflow client - Skyflow skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.ERROR) // Log level: DEBUG, INFO, WARN, ERROR, or OFF - .addVaultConfig(vaultConfig) // Add vault configuration - .build(); - - try { - // Step 4: Configure entity display options for the reidentified output. - // Entities NOT listed in any option list are reidentified to plain text by default. - - // PLAIN TEXT: Return the original sensitive value for these entities - List plainTextEntities = new ArrayList<>(); - plainTextEntities.add(DetectEntities.SSN); // Replace with entities you want in plain text - - // MASKED: Return a masked version of the value (e.g., XXX-XX-6789) - List maskedEntities = new ArrayList<>(); - maskedEntities.add(DetectEntities.CREDIT_CARD); // Replace with entities you want masked - - // REDACTED: Replace entity value with a redaction placeholder - // List redactedEntities = new ArrayList<>(); - // redactedEntities.add(DetectEntities.DOB); // Replace with entities you want redacted - - // Step 5: Build the ReidentifyTextRequest - // The `text` field should be the output of a prior deidentifyText call — - // it contains placeholder tokens like [SSN_IWdexZe] that will be resolved. - ReidentifyTextRequest reidentifyTextRequest = ReidentifyTextRequest.builder() - .text("My SSN is [SSN_IWdexZe] and my card is [CREDIT_CARD_rUzMjdQ].") // Replace with your deidentified text - .plainTextEntities(plainTextEntities) // Restore these as plain text - .maskedEntities(maskedEntities) // Restore these as masked values - // .redactedEntities(redactedEntities) // Restore these as redacted placeholders - .build(); - - // Step 6: Call reidentifyText on the vault - ReidentifyTextResponse reidentifyTextResponse = skyflowClient - .detect("") // Replace with your vault ID - .reidentifyText(reidentifyTextRequest); - - // Step 7: Print the processed text - System.out.println("Reidentify Text Response: " + reidentifyTextResponse); - - // To access the processed text string directly: - // System.out.println("Processed text: " + reidentifyTextResponse.getProcessedText()); - - } catch (SkyflowException e) { - System.err.println("Error occurred during reidentify text:"); - e.printStackTrace(); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/Skyflow.java b/skyvault/src/main/java/com/skyflow/Skyflow.java index 53692860..8343c4fd 100644 --- a/skyvault/src/main/java/com/skyflow/Skyflow.java +++ b/skyvault/src/main/java/com/skyflow/Skyflow.java @@ -149,11 +149,18 @@ protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowExcepti @Override protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowException { this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(updatedConfig); + DetectController detect = this.detectClientsMap.get(updatedConfig.getVaultId()); + if (detect == null) { + this.detectClientsMap.put(updatedConfig.getVaultId(), new DetectController(updatedConfig, this.skyflowCredentials)); + } else { + detect.setVaultConfig(updatedConfig); + } } @Override protected void onVaultConfigRemoved(String vaultId) throws SkyflowException { this.vaultClientsMap.remove(vaultId); + this.detectClientsMap.remove(vaultId); } @Override diff --git a/skyvault/src/main/java/com/skyflow/VaultClient.java b/skyvault/src/main/java/com/skyflow/VaultClient.java index 509b70c7..3dad6b1a 100644 --- a/skyvault/src/main/java/com/skyflow/VaultClient.java +++ b/skyvault/src/main/java/com/skyflow/VaultClient.java @@ -2,30 +2,20 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; import com.skyflow.enums.InterfaceName; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.ApiClientBuilder; -import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.resources.files.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.types.DeidentifyStringRequestEntityTypesItem; import com.skyflow.generated.rest.resources.tokens.TokensClient; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.Transformations; import com.skyflow.generated.rest.types.*; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.Utils; @@ -33,8 +23,6 @@ import com.skyflow.vault.data.FileUploadRequest; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.*; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -76,14 +64,6 @@ protected TokensClient getTokensApi() { return this.apiClient.tokens(); } - protected StringsClient getDetectTextApi() { - return this.apiClient.strings(); - } - - protected FilesClient getDetectFileAPi() { - return this.apiClient.files(); - } - protected QueryClient getQueryApi() { return this.apiClient.query(); } @@ -234,593 +214,6 @@ protected void setBearerToken() throws SkyflowException { } } - protected DeidentifyTextResponse getDeIdentifyTextResponse(DeidentifyStringResponse deidentifyStringResponse) { - Optional> detectedEntities = deidentifyStringResponse.getEntities(); - - List entities = new ArrayList<>(); - - if (detectedEntities.isPresent()) { - for (StringResponseEntities e : detectedEntities.get()) { - entities.add(convertDetectedEntityToEntityInfo(e)); - } - } - - return new DeidentifyTextResponse( - deidentifyStringResponse.getProcessedText().get(), - entities, - deidentifyStringResponse.getWordCount().get(), - deidentifyStringResponse.getCharacterCount().get() - ); - } - - protected DeidentifyStringRequest getDeidentifyStringRequest(DeidentifyTextRequest deIdentifyTextRequest, String vaultId) throws SkyflowException { - List entities = deIdentifyTextRequest.getEntities(); - - List mappedEntityTypes = null; - if (entities != null) { - mappedEntityTypes = deIdentifyTextRequest.getEntities().stream() - .map(detectEntity -> DeidentifyStringRequestEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()); - } - - TokenFormat tokenFormat = deIdentifyTextRequest.getTokenFormat(); - - Optional> vaultToken = Optional.empty(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(deIdentifyTextRequest.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(deIdentifyTextRequest.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(deIdentifyTextRequest.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getVaultToken() != null && !tokenFormat.getVaultToken().isEmpty()) { - vaultToken = Optional.of( - tokenFormat.getVaultToken().stream() - .map(detectEntity -> TokenTypeMappingVaultTokenItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .vaultToken(vaultToken) - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - - return DeidentifyStringRequest.builder() - .text(deIdentifyTextRequest.getText()) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - protected ReidentifyStringRequest getReidentifyStringRequest(ReidentifyTextRequest reidentifyTextRequest, String vaultId) throws SkyflowException { - Optional> maskEntities = null; - Optional> redactedEntities = null; - Optional> plaintextEntities = null; - - if (reidentifyTextRequest.getMaskedEntities() != null) { - maskEntities = Optional.of(reidentifyTextRequest.getMaskedEntities().stream() - .map(detectEntity -> FormatMaskedItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (reidentifyTextRequest.getPlainTextEntities() != null) { - plaintextEntities = Optional.of(reidentifyTextRequest.getPlainTextEntities().stream() - .map(detectEntity -> FormatPlaintextItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (reidentifyTextRequest.getRedactedEntities() != null) { - redactedEntities = Optional.of(reidentifyTextRequest.getRedactedEntities().stream() - .map(detectEntity -> FormatRedactedItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - Format reidentifyStringRequestFormat = Format.builder() - .masked(maskEntities) - .plaintext(plaintextEntities) - .redacted(redactedEntities) - .build(); - - - return ReidentifyStringRequest.builder() - .text(reidentifyTextRequest.getText()) - .vaultId(vaultId) - .format(reidentifyStringRequestFormat) - .build(); - } - - - private EntityInfo convertDetectedEntityToEntityInfo(StringResponseEntities detectedEntity) { - TextIndex textIndex = new TextIndex( - detectedEntity.getLocation().get().getStartIndex().orElse(0), - detectedEntity.getLocation().get().getEndIndex().orElse(0) - ); - TextIndex processedIndex = new TextIndex( - detectedEntity.getLocation().get().getStartIndexProcessed().orElse(0), - detectedEntity.getLocation().get().getEndIndexProcessed().orElse(0) - ); - - Map entityScores = detectedEntity.getEntityScores() - .map(doubleMap -> doubleMap.entrySet().stream() - .collect(Collectors.toMap( - Map.Entry::getKey, - Map.Entry::getValue - ))) - .orElse(Collections.emptyMap()); - - - return new EntityInfo( - detectedEntity.getToken().orElse(""), - detectedEntity.getValue().orElse(""), - textIndex, - processedIndex, - detectedEntity.getEntityType().orElse(""), - entityScores); - } - - - private Transformations getTransformations(com.skyflow.vault.detect.Transformations transformations) { - if (transformations == null || transformations.getShiftDates() == null) { - return null; - } - - Optional> entityTypes = null; - if (!transformations.getShiftDates().getEntities().isEmpty()) { - entityTypes = Optional.of(transformations.getShiftDates().getEntities().stream() - .map(entity -> ShiftDatesEntityTypesItem.valueOf(entity.name())) - .collect(Collectors.toList())); - } else { - entityTypes = Optional.of(Collections.emptyList()); - } - - return Transformations.builder() - .shiftDates(ShiftDates.builder() - .maxDays(transformations.getShiftDates().getMax()) - .minDays(transformations.getShiftDates().getMin()) - .entityTypes(entityTypes) - .build()) - .build(); - } - - private > List getEntityTypes(List entities, Class type) { - if (entities == null) return Collections.emptyList(); - - return entities.stream() - .map(e -> Enum.valueOf(type, e.name())) - .collect(Collectors.toList()); - } - - - protected com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText getDeidentifyTextFileRequest(DeidentifyFileRequest request, String vaultId, String base64Content) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyTextEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyText file = FileDataDeidentifyText.builder() - .base64(base64Content) - .build(); - - // Build the final request - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText req = - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - - return req; - } - - - protected DeidentifyFileAudioRequestDeidentifyAudio getDeidentifyAudioRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String dataFormat) throws SkyflowException { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ).map(list -> (List) (List) list); - } - - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - (List) (List) - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyAudio deidentifyAudioRequestFile = FileDataDeidentifyAudio.builder().base64(base64Content).dataFormat(mapAudioDataFormat(dataFormat)).build(); - DetectOutputTranscriptions transcription = request.getOutputTranscription(); - Optional outputTranscriptionType = null; - if (transcription != null) { - outputTranscriptionType = Optional.of(DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.valueOf(transcription.name())); - } - - return DeidentifyFileAudioRequestDeidentifyAudio.builder() - .file(deidentifyAudioRequestFile) - .vaultId(vaultId) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .entityTypes(mappedEntityTypes) - .bleepFrequency(request.getBleep() != null - ? (int) Math.round(request.getBleep().getFrequency()) - : null) - .bleepGain(request.getBleep() != null ? (int) Math.round(request.getBleep().getGain()) : null) - .bleepStartPadding(request.getBleep() != null ? (float) Math.round(request.getBleep().getStartPadding()) : null) - .bleepStopPadding(request.getBleep() != null ? (float) Math.round(request.getBleep().getStopPadding()) : null) - .outputProcessedAudio(request.getOutputProcessedAudio()) - .outputTranscription(outputTranscriptionType) - .tokenType(tokenType) - .transformations(transformations) - .build(); - } - - protected DeidentifyFileDocumentPdfRequestDeidentifyPdf getDeidentifyPdfRequest(DeidentifyFileRequest request, String vaultId, String base64Content) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of( - (List) (List) - tokenFormat.getEntityOnly().stream() - .map(detectEntity -> DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of( - (List) (List) - tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.valueOf(detectEntity.name())) - .collect(Collectors.toList()) - ); - } - - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDeidentifyPdf file = FileDataDeidentifyPdf.builder() - .base64(base64Content) - .build(); - - return DeidentifyFileDocumentPdfRequestDeidentifyPdf.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileImageRequestDeidentifyImage getDeidentifyImageRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyImage file = FileDataDeidentifyImage.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyImageDataFormat.valueOf(format.toUpperCase())) - .build(); - - Optional maskingMethod = Optional.empty(); - if (request.getMaskingMethod() != null) { - maskingMethod = Optional.of(DeidentifyFileImageRequestDeidentifyImageMaskingMethod.valueOf(request.getMaskingMethod().name())); - } - - return DeidentifyFileImageRequestDeidentifyImage.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .maskingMethod(maskingMethod) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .outputProcessedImage(request.getOutputProcessedImage()) - .outputOcrText(request.getOutputOcrText()) - .build(); - } - - protected DeidentifyFileRequestDeidentifyPresentation getDeidentifyPresentationRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyPresentation file = FileDataDeidentifyPresentation.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyPresentationDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyPresentation.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileRequestDeidentifySpreadsheet getDeidentifySpreadsheetRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifySpreadsheet file = FileDataDeidentifySpreadsheet.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifySpreadsheetDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifySpreadsheet.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected DeidentifyFileRequestDeidentifyStructuredText getDeidentifyStructuredTextRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyStructuredText file = FileDataDeidentifyStructuredText.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyStructuredTextDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyStructuredText.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - protected DeidentifyFileRequestDeidentifyDocument getDeidentifyDocumentRequest(DeidentifyFileRequest request, String vaultId, String base64Content, String format) { - List mappedEntityTypes = - getEntityTypes(request.getEntities(), DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.class); - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - - TokenTypeMapping tokenType = buildTokenType(tokenFormat, entityTypes, entityUniqueCounter); - - FileDataDeidentifyDocument file = FileDataDeidentifyDocument.builder() - .base64(base64Content) - .dataFormat(FileDataDeidentifyDocumentDataFormat.valueOf(format.toUpperCase())) - .build(); - - return DeidentifyFileRequestDeidentifyDocument.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .build(); - } - - protected com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest getDeidentifyGenericFileRequest( - DeidentifyFileRequest request, String vaultId, String base64Content, String fileExtension) throws SkyflowException { - - List mappedEntityTypes = - getEntityTypes(request.getEntities(), DeidentifyFileRequestEntityTypesItem.class); - - TokenFormat tokenFormat = request.getTokenFormat(); - - Optional> entityTypes = Optional.empty(); - Optional> entityUniqueCounter = Optional.empty(); - Optional> allowRegex = Optional.ofNullable(request.getAllowRegexList()); - Optional> restrictRegex = Optional.ofNullable(request.getRestrictRegexList()); - Optional transformations = Optional.ofNullable(getTransformations(request.getTransformations())); - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - TokenTypeMapping tokenType = TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - FileDataDataFormat dataFormat = null; - if (fileExtension != null) { - try { - dataFormat = FileDataDataFormat.valueOf(fileExtension.toUpperCase()); - } catch (IllegalArgumentException e) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.UNSUPPORTED_FILE_TYPE_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName(), fileExtension)); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( - ErrorMessage.UnsupportedFileTypeToDeidentify.getMessage(), fileExtension)); - } - } - - FileData file = - FileData.builder() - .base64(base64Content) - .dataFormat(dataFormat) - .build(); - - return com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest.builder() - .file(file) - .vaultId(vaultId) - .entityTypes(mappedEntityTypes) - .tokenType(tokenType) - .allowRegex(allowRegex) - .restrictRegex(restrictRegex) - .transformations(transformations) - .build(); - } - - private TokenTypeMapping buildTokenType(TokenFormat tokenFormat, - Optional> entityTypes, - Optional> entityUniqueCounter) { - - if (tokenFormat != null) { - if (tokenFormat.getEntityOnly() != null && !tokenFormat.getEntityOnly().isEmpty()) { - entityTypes = Optional.of(tokenFormat.getEntityOnly().stream() - .map(detectEntity -> TokenTypeMappingEntityOnlyItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - - if (tokenFormat.getEntityUniqueCounter() != null && !tokenFormat.getEntityUniqueCounter().isEmpty()) { - entityUniqueCounter = Optional.of(tokenFormat.getEntityUniqueCounter().stream() - .map(detectEntity -> TokenTypeMappingEntityUnqCounterItem.valueOf(detectEntity.name())) - .collect(Collectors.toList())); - } - } - - return TokenTypeMapping.builder() - .entityOnly(entityTypes) - .entityUnqCounter(entityUniqueCounter) - .build(); - - } - - - private FileDataDeidentifyAudioDataFormat mapAudioDataFormat(String dataFormat) throws SkyflowException { - switch (dataFormat) { - case "mp3": - return FileDataDeidentifyAudioDataFormat.MP_3; - case "wav": - return FileDataDeidentifyAudioDataFormat.WAV; - default: - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidAudioFileType.getMessage()); - } - } - private void updateVaultURL() { String vaultURL = Utils.getVaultURL(this.vaultConfig.getClusterId(), this.vaultConfig.getEnv()); if (!vaultURL.equals(this.currentVaultURL)) { diff --git a/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java b/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java deleted file mode 100644 index 87ffc109..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.skyflow.enums; - -public enum DeidentifyFileStatus { - IN_PROGRESS("IN_PROGRESS"), - FAILED("FAILED"), - SUCCESS("SUCCESS"), - UNKNOWN("UNKNOWN"); - - private final String value; - - DeidentifyFileStatus(String value) { - this.value = value; - } - - public String value() { - return value; - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java b/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java deleted file mode 100644 index 3fd15a67..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DetectEntities.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.skyflow.enums; - - -public enum DetectEntities { - ACCOUNT_NUMBER("account_number"), - AGE("age"), - ALL("all"), - BANK_ACCOUNT("bank_account"), - BLOOD_TYPE("blood_type"), - CONDITION("condition"), - CORPORATE_ACTION("corporate_action"), - CREDIT_CARD("credit_card"), - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - CVV("cvv"), - DATE("date"), - DAY("day"), - DATE_INTERVAL("date_interval"), - DOB("dob"), - DOSE("dose"), - DRIVER_LICENSE("driver_license"), - DRUG("drug"), - DURATION("duration"), - EFFECT("effect"), - EMAIL_ADDRESS("email_address"), - EVENT("event"), - FILENAME("filename"), - FINANCIAL_METRIC("financial_metric"), - GENDER("gender"), - HEALTHCARE_NUMBER("healthcare_number"), - INJURY("injury"), - IP_ADDRESS("ip_address"), - LANGUAGE("language"), - LOCATION("location"), - LOCATION_ADDRESS("location_address"), - LOCATION_ADDRESS_STREET("location_address_street"), - LOCATION_CITY("location_city"), - LOCATION_COORDINATE("location_coordinate"), - LOCATION_COUNTRY("location_country"), - LOCATION_STATE("location_state"), - LOCATION_ZIP("location_zip"), - MARITAL_STATUS("marital_status"), - MEDICAL_CODE("medical_code"), - MEDICAL_PROCESS("medical_process"), - MONEY("money"), - MONTH("month"), - NAME("name"), - NAME_FAMILY("name_family"), - NAME_GIVEN("name_given"), - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - NUMERICAL_PII("numerical_pii"), - OCCUPATION("occupation"), - ORGANIZATION("organization"), - ORGANIZATION_ID("organization_id"), - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - ORIGIN("origin"), - PASSPORT_NUMBER("passport_number"), - PASSWORD("password"), - PHONE_NUMBER("phone_number"), - PROJECT("project"), - PHYSICAL_ATTRIBUTE("physical_attribute"), - POLITICAL_AFFILIATION("political_affiliation"), - PRODUCT("product"), - RELIGION("religion"), - ROUTING_NUMBER("routing_number"), - SEXUALITY("sexuality"), - SSN("ssn"), - STATISTICS("statistics"), - TIME("time"), - TREND("trend"), - URL("url"), - USERNAME("username"), - VEHICLE_ID("vehicle_id"), - YEAR("year"), - ZODIAC_SIGN("zodiac_sign"); - - private final String detectEntities; - - DetectEntities(String detectEntities) { - this.detectEntities = detectEntities; - } - - public String getDetectEntities() { - return detectEntities; - } - - @Override - public String toString() { - return detectEntities; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java b/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java deleted file mode 100644 index 8d0c42a4..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.skyflow.enums; - -public enum DetectOutputTranscriptions { - DIARIZED_TRANSCRIPTION("diarized_transcription"), - MEDICAL_DIARIZED_TRANSCRIPTION("medical_diarized_transcription"), - MEDICAL_TRANSCRIPTION("medical_transcription"), - TRANSCRIPTION("transcription"); - - private final String detectOutputTranscriptions; - - DetectOutputTranscriptions(String detectOutputTranscriptions) { - this.detectOutputTranscriptions = detectOutputTranscriptions; - } - - public String getDetectOutputTranscriptions() { - return detectOutputTranscriptions; - } - - @Override - public String toString() { - return detectOutputTranscriptions; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java b/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java deleted file mode 100644 index e3ff252c..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/MaskingMethod.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.skyflow.enums; - -public enum MaskingMethod { - BLACKBOX("blackbox"), - BLUR("blur"); - - private final String maskingMethod; - - MaskingMethod(String maskingMethod) { - this.maskingMethod = maskingMethod; - } - - public String getMaskingMethod() { - return maskingMethod; - } - - @Override - public String toString() { - return maskingMethod; - } -} diff --git a/skyvault/src/main/java/com/skyflow/enums/TokenType.java b/skyvault/src/main/java/com/skyflow/enums/TokenType.java deleted file mode 100644 index 4a619e9c..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/TokenType.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.skyflow.enums; - -public enum TokenType { - VAULT_TOKEN("vault_token"), - ENTITY_UNIQUE_COUNTER("entity_unq_counter"), - ENTITY_ONLY("entity_only"); - - private final String tokenType; - - TokenType(String tokenType) { - this.tokenType = tokenType; - } - - public String getTokenType() { - return tokenType; - } - - public String getDefault() { - return ENTITY_UNIQUE_COUNTER.getTokenType(); - } - - @Override - public String toString() { - return tokenType; - } -} - diff --git a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java index 6e7419a9..d49a4641 100644 --- a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -147,33 +147,7 @@ public enum ErrorMessage { InvalidFileObject("%s0 Validation error. Invalid file object in file upload request. Specify a valid file object."), InvalidBase64("%s0 Validation error. Invalid base64 string in file upload request. Specify a valid base64 string."), - // detect - DeidentifyTextRequestNull("%s0 Validation error. DeidentifyTextRequest object is null. Specify a valid DeidentifyTextRequest object."), - InvalidTextInDeIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), - ReidentifyTextRequestNull("%s0 Validation error. ReidentifyTextRequest object is null. Specify a valid ReidentifyTextRequest object."), - InvalidTextInReIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), - - //Detect Files - InvalidNullFileInDeIdentifyFile("%s0 Validation error. The file field is required and must not be null. Specify a valid file object."), InvalidFilePath("%s0 Validation error. The file path is invalid. Specify a valid file path."), - BothFileAndFilePathProvided("%s0 Validation error. Both file and filePath are provided. Specify either file object or filePath, not both."), - FileNotFoundToDeidentify("%s0 Validation error. The file to deidentify was not found at the specified path. Verify the file path and try again."), - FileNotReadableToDeidentify("%s0 Validation error. The file to deidentify is not readable. Check the file permissions and try again."), - InvalidPixelDensityToDeidentifyFile("%s0 Validation error. Should be a positive integer. Specify a valid pixel density."), - InvalidMaxResolution("%s0 Validation error. Should be a positive integer. Specify a valid max resolution."), - OutputDirectoryNotFound("%s0 Validation error. The output directory for deidentified files was not found at the specified path. Verify the output directory path and try again."), - InvalidPermission("%s0 Validation error. The output directory for deidentified files is not writable. Check the directory permissions and try again."), - InvalidWaitTime("%s0 Validation error. The wait time for deidentify file operation should be a positive integer. Specify a valid wait time."), - WaitTimeExceedsLimit("%s0 Validation error. The wait time for deidentify file operation exceeds the maximum limit of 64 seconds. Specify a wait time less than or equal to 60 seconds."), - InvalidOrEmptyRunId("%s0 Validation error. The run ID is invalid or empty. Specify a valid run ID."), - FailedToEncodeFile("%s0 Validation error. Failed to encode the file. Ensure the file is in a supported format and try again."), - FailedToDecodeFileFromResponse("%s0 Failed to decode the file from the response. Ensure the response is valid and try again."), - EmptyFileAndFilePathInDeIdentifyFile("%s0 Validation error. Both file and filePath are empty. Specify either file object or filePath, not both."), - VaultTokenFormatIsNotAllowedForFiles("%s0 Validation error. Vault token format is not allowed for deidentify file request."), - PollingForResultsFailed("%s0 API error. Polling for results failed. Unable to retrieve the deidentified file"), - FailedToSaveProcessedFile("%s0 Validation error. Failed to save the processed file. Ensure the output directory is valid and writable."), - InvalidAudioFileType("%s0 Validation error. The file type is not supported. Specify a valid file type mp3 or wav."), - UnsupportedFileTypeToDeidentify("%s0 Validation error. File type '%s1' is not supported for deidentification. Specify a supported file type."), // Generic ErrorOccurred("%s0 API error. Error occurred.") ; diff --git a/skyvault/src/main/java/com/skyflow/utils/Constants.java b/skyvault/src/main/java/com/skyflow/utils/Constants.java index 0c65a72b..82f6dd04 100644 --- a/skyvault/src/main/java/com/skyflow/utils/Constants.java +++ b/skyvault/src/main/java/com/skyflow/utils/Constants.java @@ -10,8 +10,6 @@ public final class Constants extends BaseConstants { public static final String SDK_VERSION; public static final String SDK_PREFIX; public static final String SDK_METRIC_NAME_VERSION_PREFIX = "skyflow-java@"; - public static final String PROCESSED_FILE_NAME_PREFIX = "processed-"; - public static final String DEIDENTIFIED_FILE_PREFIX = "deidentified"; public static final String HTTPS_PROTOCOL = "https"; public static final String ORDER_DESCENDING = "DESCENDING"; public static final String ORDER_NONE = "NONE"; diff --git a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java index 93957f57..48b9b34d 100644 --- a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -30,11 +30,6 @@ import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.QueryRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.GetDetectRunRequest; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.TokenFormat; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -754,40 +749,6 @@ private static boolean isNullOrEmpty(String str) { return str == null || str.trim().isEmpty(); } - public static void validateDeidentifyTextRequest(DeidentifyTextRequest deidentifyTextRequest) throws SkyflowException { - if (deidentifyTextRequest == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.DEIDENTIFY_TEXT_REQUEST_NULL.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeidentifyTextRequestNull.getMessage()); - } - // Validate required fields - String deidentifyText = deidentifyTextRequest.getText(); - if (deidentifyText == null || deidentifyText.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_TEXT_IN_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidTextInDeIdentify.getMessage()); - } - } - - public static void validateReidentifyTextRequest(ReidentifyTextRequest reidentifyTextRequest) throws SkyflowException { - if (reidentifyTextRequest == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.REIDENTIFY_TEXT_REQUEST_NULL.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.ReidentifyTextRequestNull.getMessage()); - } - // Validate required fields - String reidentifyText = reidentifyTextRequest.getText(); - if (reidentifyText == null || reidentifyText.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_TEXT_IN_REIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidTextInReIdentify.getMessage()); - } - } - private static boolean isInvalidURL(String configURL) { try { URL url = new URL(configURL); @@ -863,129 +824,10 @@ private static void validateTokensMapWithTokenStrict( } } - public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) throws SkyflowException { - if (request == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_REQUEST_BODY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - - TokenFormat tokenFormat = request.getTokenFormat(); - if (tokenFormat != null && tokenFormat.getVaultToken() != null && !tokenFormat.getVaultToken().isEmpty()) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultTokenFormatIsNotAllowedForFiles.getMessage()); - } - - if (request.getFileInput() == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_FILE_AND_FILE_PATH_IN_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage()); - } - - File file = request.getFileInput().getFile(); - String filePath = request.getFileInput().getFilePath(); - - if (file == null && filePath == null) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_FILE_AND_FILE_PATH_IN_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage()); - } - - if (filePath != null && file != null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.BothFileAndFilePathProvided.getMessage()); - } - - if (filePath != null && filePath.trim().isEmpty()){ - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidFilePath.getMessage()); - } - - if (file != null && (!file.exists() || !file.isFile())) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.FILE_NOT_FOUND_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FileNotFoundToDeidentify.getMessage()); - } - if (file != null && !file.canRead()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.FILE_NOT_READABLE_TO_DEIDENTIFY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FileNotReadableToDeidentify.getMessage()); - } - - - // Validate pixelDensity and maxResolution - if (request.getPixelDensity() != null && request.getPixelDensity().doubleValue() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_PIXEL_DENSITY_TO_DEIDENTIFY_FILE.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidPixelDensityToDeidentifyFile.getMessage()); - } - if (request.getMaxResolution() != null && request.getMaxResolution().doubleValue() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_MAX_RESOLUTION.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidMaxResolution.getMessage()); - } - - // Validate AudioBleep - if (request.getBleep() != null) { - if (request.getBleep().getFrequency() == null || request.getBleep().getFrequency() <= 0) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_BLEEP_TO_DEIDENTIFY_AUDIO.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - if (request.getBleep().getStartPadding() == null || request.getBleep().getStartPadding() < 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - if (request.getBleep().getStopPadding() == null || request.getBleep().getStopPadding() < 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRequestBody.getMessage()); - } - } - - // Validate outputDirectory if provided - if (request.getOutputDirectory() != null) { - File outDir = new File(request.getOutputDirectory()); - if (!outDir.exists() || !outDir.isDirectory()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.OUTPUT_DIRECTORY_NOT_FOUND.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.OutputDirectoryNotFound.getMessage()); - } - if (!outDir.canWrite()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_PERMISSIONS_FOR_OUTPUT_DIRECTORY.getLog(), InterfaceName.DETECT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidPermission.getMessage()); - } - } - - // Validate waitTime if provided - if (request.getWaitTime() != null && request.getWaitTime() <= 0) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidWaitTime.getMessage()); - } - if(request.getWaitTime() != null && request.getWaitTime() > 64) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.WaitTimeExceedsLimit.getMessage()); - } - } - static Object resolveUpdateId(HashMap data) { if (data.containsKey("skyflowId")) { return data.get("skyflowId"); } return data.get("skyflow_id"); } - - public static void validateGetDetectRunRequest(GetDetectRunRequest request) throws SkyflowException { - if (request == null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRequestBody.getMessage()); - } - - String runId = request.getRunId(); - if (runId == null || runId.trim().isEmpty()) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidOrEmptyRunId.getMessage()); - } - } } diff --git a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java index 8fc8ac66..c78fb6ba 100644 --- a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -1,453 +1,43 @@ package com.skyflow.vault.controller; -import com.google.gson.*; -import com.skyflow.VaultClient; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DeidentifyFileStatus; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.*; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; -import com.skyflow.utils.validations.Validations; -import com.skyflow.vault.detect.*; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.util.*; -public final class DetectController extends VaultClient { - Gson gson = new GsonBuilder() - .registerTypeAdapter(Optional.class, (JsonSerializer>) (src, typeOfSrc, context) -> - src.map(context::serialize).orElse(null)) - .serializeNulls() - .create(); - private static final JsonObject SKY_METADATA = Utils.getMetrics(); +/** + * Skyflow Detect operations for a skyvault vault, returned by {@code Skyflow.detect()} and + * {@code Skyflow.detect(vaultId)}. Every Detect V2 method ({@code deidentifyString}, + * {@code deidentifyFile}, {@code reidentifyString}, {@code getRun}, {@code checkGuardrails}) is + * inherited from {@link BaseDetectController} and shared with the flowvault SDK; this class only + * supplies the skyvault URL rule and SDK metrics. + * + *

For skyvault vaults a {@code VAULT_TOKEN} entity's {@code destination} is a {@code table.column} + * pair, and {@code RedactionLevel} rules use {@code entityName} and {@code redactionType}. + */ +public final class DetectController extends BaseDetectController { + private final String vaultUrlOverride; public DetectController(VaultConfig vaultConfig, Credentials credentials) { - super(vaultConfig, credentials); - } - - public DeidentifyTextResponse deidentifyText(DeidentifyTextRequest deidentifyTextRequest) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_TRIGGERED.getLog()); - DeidentifyStringResponse deidentifyStringResponse = null; - DeidentifyTextResponse deidentifyTextResponse = null; - try { - // Validate the request - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_TEXT_REQUEST.getLog()); - Validations.validateDeidentifyTextRequest(deidentifyTextRequest); - setBearerToken(); - - // Parse the request to DeidentifyStringRequest - String vaultId = super.getVaultConfig().getVaultId(); - DeidentifyStringRequest request = getDeidentifyStringRequest(deidentifyTextRequest, vaultId); - - // get SDK metrics and call the API to de-identify the string - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - deidentifyStringResponse = super.getDetectTextApi().deidentifyString(request, requestOptions); - - // Parse the response to DeIdentifyTextResponse - deidentifyTextResponse = getDeIdentifyTextResponse(deidentifyStringResponse); - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_REQUEST_RESOLVED.getLog()); - } catch (ApiClientApiException ex) { - String bodyString = extractBodyAsString(ex); - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_TEXT_REQUEST_REJECTED.getLog()); - throw new SkyflowException(ex.statusCode(), ex, ex.headers(), bodyString); - } catch (ApiClientException ex) { - throw new SkyflowException(ex); - } - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_TEXT_SUCCESS.getLog()); - return deidentifyTextResponse; - } - - public ReidentifyTextResponse reidentifyText(ReidentifyTextRequest reidentifyTextRequest) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_TRIGGERED.getLog()); - ReidentifyTextResponse reidentifyTextResponse = null; - try { - // Validate the request - LogUtil.printInfoLog(InfoLogs.VALIDATE_REIDENTIFY_TEXT_REQUEST.getLog()); - Validations.validateReidentifyTextRequest(reidentifyTextRequest); - setBearerToken(); - // Parse the request to ReidentifyTextRequest - String vaultId = super.getVaultConfig().getVaultId(); - ReidentifyStringRequest request = getReidentifyStringRequest(reidentifyTextRequest, vaultId); - - // Get SDK metrics and call the API to re-identify the string - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - IdentifyResponse reidentifyStringResponse = super.getDetectTextApi().reidentifyString(request, requestOptions); - - // Parse the response to ReidentifyTextResponse - reidentifyTextResponse = new ReidentifyTextResponse(reidentifyStringResponse.getText()); - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_REQUEST_RESOLVED.getLog()); - } catch (ApiClientApiException ex) { - String bodyString = extractBodyAsString(ex); - LogUtil.printErrorLog(ErrorLogs.REIDENTIFY_TEXT_REQUEST_REJECTED.getLog()); - throw new SkyflowException(ex.statusCode(), ex, ex.headers(), bodyString); - } catch (ApiClientException ex) { - throw new SkyflowException(ex); - } - LogUtil.printInfoLog(InfoLogs.REIDENTIFY_TEXT_SUCCESS.getLog()); - return reidentifyTextResponse; - } - - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) throws SkyflowException { - DeidentifyFileResponse response; - LogUtil.printInfoLog(InfoLogs.DEIDENTIFY_FILE_TRIGGERED.getLog()); - try { - LogUtil.printInfoLog(InfoLogs.VALIDATE_DEIDENTIFY_FILE_REQUEST.getLog()); - Validations.validateDeidentifyFileRequest(request); - setBearerToken(); - - String vaultId = super.getVaultConfig().getVaultId(); - - File file; - if (request.getFileInput().getFilePath() != null) { - file = new File(request.getFileInput().getFilePath()); - } else { - file = request.getFileInput().getFile(); - } - String fileName = file.getName(); - String fileExtension = getFileExtension(fileName); - String base64Content; - - try { - base64Content = encodeFileToBase64(file); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToEncodeFile.getMessage()); - } - - - com.skyflow.generated.rest.types.DeidentifyFileResponse apiResponse = processFileByType(fileExtension, base64Content, request, vaultId); - try { - response = pollForResults(apiResponse.getRunId().get(), request.getWaitTime()); - } catch (Exception ex) { - throw new SkyflowException(ErrorCode.SERVER_ERROR.getCode(), ErrorMessage.PollingForResultsFailed.getMessage()); - } - - if (DeidentifyFileStatus.SUCCESS.value().equalsIgnoreCase(response.getStatus())) { - String base64File = response.getFileBase64(); - if (base64File != null) { - byte[] decodedBytes = Base64.getDecoder().decode(base64File); - String outputDir = request.getOutputDirectory(); - String outputFileName = Constants.PROCESSED_FILE_NAME_PREFIX + getBaseFileName(fileName) + "." + response.getExtension(); - File outputFile; - if (outputDir != null && !outputDir.isEmpty()) { - outputFile = new File(outputDir, outputFileName); - } else { - outputFile = new File(outputFileName); - } - try { - java.nio.file.Files.write(outputFile.toPath(), decodedBytes); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToSaveProcessedFile.getMessage()); - } - - } - - List entities = response.getEntities(); - if (entities != null && !entities.isEmpty()) { - FileEntityInfo entityInfo = entities.get(0); - String entityBase64 = entityInfo.getFile(); - String outputDir = request.getOutputDirectory(); - if (entityBase64 != null) { - byte[] entityDecodedBytes = Base64.getDecoder().decode(entityBase64); - String entityFileName = Constants.PROCESSED_FILE_NAME_PREFIX + getBaseFileName(fileName) + ".json"; - File entityFile; - if (outputDir != null && !outputDir.isEmpty()) { - entityFile = new File(outputDir, entityFileName); - } else { - entityFile = new File(entityFileName); - } - try { - java.nio.file.Files.write(entityFile.toPath(), entityDecodedBytes); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToSaveProcessedFile.getMessage()); - } - } - } - } - } catch (ApiClientApiException e) { - String bodyString = extractBodyAsString(e); - LogUtil.printErrorLog(ErrorLogs.DEIDENTIFY_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } - return response; - } - - private String getFileExtension(String fileName) { - return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); - } - - private String getBaseFileName(String fileName) { - int dotIndex = fileName.lastIndexOf('.'); - return dotIndex == -1 ? fileName : fileName.substring(0, dotIndex); - } - - private String encodeFileToBase64(File file) throws IOException { - byte[] fileContent = Files.readAllBytes(file.toPath()); - return Base64.getEncoder().encodeToString(fileContent); - } - - private DeidentifyFileResponse pollForResults(String runId, Integer maxWaitTime) throws Exception { - int currentWaitTime = 1; - maxWaitTime = maxWaitTime == null ? 64 : maxWaitTime; - - DetectRunsResponse response = null; - - while (true) { - try { - GetRunRequest getRunRequest = GetRunRequest.builder() - .vaultId(super.getVaultConfig().getVaultId()) - .build(); - - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); - response = super.getDetectFileAPi() - .getRun(runId, getRunRequest, requestOptions); - - DetectRunsResponseStatus status = response.getStatus().orElse(null); - - if (DeidentifyFileStatus.IN_PROGRESS.value().equalsIgnoreCase(String.valueOf(status))) { - if (currentWaitTime >= maxWaitTime) { - return new DeidentifyFileResponse(runId, DeidentifyFileStatus.IN_PROGRESS.value()); - } - - int nextWaitTime = currentWaitTime * 2; - int waitTime; - - if (nextWaitTime >= maxWaitTime) { - waitTime = maxWaitTime - currentWaitTime; - currentWaitTime = maxWaitTime; - } else { - waitTime = nextWaitTime; - currentWaitTime = nextWaitTime; - } - - Thread.sleep(waitTime * 1000); - - } else if (status == DetectRunsResponseStatus.SUCCESS || - status == DetectRunsResponseStatus.FAILED) { - return parseDeidentifyFileResponse(response, runId, status.toString()); - } - } catch (ApiClientApiException e) { - String bodyString = gson.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.GET_DETECT_RUN_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } - } - - } - - private static synchronized DeidentifyFileResponse parseDeidentifyFileResponse(DetectRunsResponse response, - String runId, String status) throws SkyflowException { - - DeidentifiedFileOutput firstOutput = getFirstOutput(response); - - if (firstOutput == null) { - return new DeidentifyFileResponse( - null, - null, - response.getOutputType().map(Object::toString).orElse(null), - null, - null, - null, - response.getSize().orElse(null), - response.getDuration().orElse(null), - response.getPages().orElse(null), - response.getSlides().orElse(null), - getEntities(response), - runId, - response.getStatus().map(Enum::name).orElse(null) - ); - } - - Integer wordCount = null; - Integer charCount = null; - - WordCharacterCount wordCharacterCount = response.getWordCharacterCount().orElse(null); - if (wordCharacterCount != null) { - wordCount = wordCharacterCount.getWordCount().orElse(null); - charCount = wordCharacterCount.getCharacterCount().orElse(null); - } - - File processedFileObject = null; - FileInfo fileInfo = null; - Optional processedFileBase64 = Optional.of(firstOutput).flatMap(DeidentifiedFileOutput::getProcessedFile); - Optional - processedFileExtension = Optional.of(firstOutput).flatMap(DeidentifiedFileOutput::getProcessedFileExtension); - if (processedFileBase64.isPresent() && processedFileExtension.isPresent()) { - try { - byte[] decodedBytes = Base64.getDecoder().decode(processedFileBase64.get()); - String suffix = "." + processedFileExtension.get(); - String fileName = Constants.DEIDENTIFIED_FILE_PREFIX + suffix; - processedFileObject = new File(System.getProperty("java.io.tmpdir"), fileName); - Files.write(processedFileObject.toPath(), decodedBytes); - fileInfo = new FileInfo(processedFileObject); - processedFileObject.deleteOnExit(); - } catch (IOException ioe) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.FailedToEncodeFile.getMessage()); - } - } - - String processedFileType = firstOutput.getProcessedFileType() - .map(Object::toString) - .orElse(DetectRunsResponseStatus.UNKNOWN.toString()); - - String fileExtension = processedFileExtension - .map(Object::toString) - .orElse(DetectRunsResponseStatus.UNKNOWN.toString()); - Float sizeInKb = response.getSize().orElse(null); - Float durationInSeconds = response.getDuration().orElse(null); - DeidentifyFileResponse deidentifyFileResponse = new DeidentifyFileResponse( - fileInfo, - firstOutput.getProcessedFile().orElse(null), - processedFileType, - fileExtension, - wordCount, - charCount, - sizeInKb, - durationInSeconds, - response.getPages().orElse(null), - response.getSlides().orElse(null), - getEntities(response), - runId, - status - ); - - return deidentifyFileResponse; - } - - private static synchronized DeidentifiedFileOutput getFirstOutput(DetectRunsResponse response) { - List outputs = response.getOutput().orElse(null); - return outputs != null && !outputs.isEmpty() ? outputs.get(0) : null; + this(vaultConfig, credentials, null); } - private static synchronized List getEntities(DetectRunsResponse response) { - List entities = new ArrayList<>(); - - List outputs = response.getOutput().orElse(null); - DeidentifiedFileOutput deidentifyFileOutput = outputs != null && !outputs.isEmpty() ? outputs.get(0) : null; - - if (deidentifyFileOutput != null) { - entities.add(new FileEntityInfo( - deidentifyFileOutput.getProcessedFile().orElse(null), - deidentifyFileOutput.getProcessedFileType().orElse(null), - deidentifyFileOutput.getProcessedFileExtension().orElse(null) - )); - } - - return entities; - } - - private String extractBodyAsString(ApiClientApiException e) { - return e.statusCode() == 500 - ? e.body().toString() - : gson.toJson(e.body()); + /** Test seam: points the controller at an explicit base URL instead of the cluster-derived one. */ + DetectController(VaultConfig vaultConfig, Credentials credentials, String vaultUrlOverride) { + super(vaultConfig, credentials); + this.vaultUrlOverride = vaultUrlOverride; } - - private com.skyflow.generated.rest.types.DeidentifyFileResponse processFileByType(String fileExtension, String base64Content, DeidentifyFileRequest request, String vaultId) throws SkyflowException { - switch (fileExtension.toLowerCase()) { - case "txt": - DeidentifyFileRequestDeidentifyText textFileRequest = - super.getDeidentifyTextFileRequest(request, vaultId, base64Content); - return super.getDetectFileAPi().deidentifyText(textFileRequest); - - case "mp3": - case "wav": - DeidentifyFileAudioRequestDeidentifyAudio audioRequest = - super.getDeidentifyAudioRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyAudio(audioRequest); - - case "pdf": - DeidentifyFileDocumentPdfRequestDeidentifyPdf pdfRequest = - super.getDeidentifyPdfRequest(request, vaultId, base64Content); - - return super.getDetectFileAPi().deidentifyPdf(pdfRequest); - - case "jpg": - case "jpeg": - case "png": - case "bmp": - case "tif": - case "tiff": - DeidentifyFileImageRequestDeidentifyImage imageRequest = - super.getDeidentifyImageRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyImage(imageRequest); - - case "ppt": - case "pptx": - DeidentifyFileRequestDeidentifyPresentation presentationRequest = - super.getDeidentifyPresentationRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyPresentation(presentationRequest); - - case "csv": - case "xls": - case "xlsx": - DeidentifyFileRequestDeidentifySpreadsheet spreadsheetRequest = - super.getDeidentifySpreadsheetRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifySpreadsheet(spreadsheetRequest); - - case "doc": - case "docx": - DeidentifyFileRequestDeidentifyDocument documentRequest = - super.getDeidentifyDocumentRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyDocument(documentRequest); - - case "json": - case "xml": - DeidentifyFileRequestDeidentifyStructuredText structuredTextRequest = - super.getDeidentifyStructuredTextRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyStructuredText(structuredTextRequest); - - default: - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest genericFileRequest = - super.getDeidentifyGenericFileRequest(request, vaultId, base64Content, fileExtension); - return super.getDetectFileAPi().deidentifyFile(genericFileRequest); + @Override + protected String resolveVaultUrl() throws SkyflowException { + if (vaultUrlOverride != null) { + return vaultUrlOverride; } + return Utils.getVaultURL(getVaultConfig().getClusterId(), getVaultConfig().getEnv()); } - public DeidentifyFileResponse getDetectRun(GetDetectRunRequest request) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.GET_DETECT_RUN_TRIGGERED.getLog()); - try { - LogUtil.printInfoLog(InfoLogs.VALIDATE_GET_DETECT_RUN_REQUEST.getLog()); - Validations.validateGetDetectRunRequest(request); - setBearerToken(); - String runId = request.getRunId(); - String vaultId = super.getVaultConfig().getVaultId(); - - GetRunRequest getRunRequest = - GetRunRequest.builder() - .vaultId(vaultId) - .build(); - - DetectRunsResponse apiResponse = - super.getDetectFileAPi().getRun(runId, getRunRequest); - - return parseDeidentifyFileResponse(apiResponse, runId, apiResponse.getStatus().toString()); - } catch (ApiClientApiException e) { - String bodyString = extractBodyAsString(e); - LogUtil.printErrorLog(ErrorLogs.GET_DETECT_RUN_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); - } catch (ApiClientException e) { - throw new SkyflowException(e); - } + @Override + protected String getSdkMetrics() { + return Utils.getMetrics().toString(); } } diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java b/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java deleted file mode 100644 index 1a75f93b..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/AudioBleep.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.skyflow.vault.detect; - -public class AudioBleep { - private final AudioBleepBuilder builder; - - private AudioBleep(AudioBleepBuilder builder) { - this.builder = builder; - } - - public static AudioBleepBuilder builder() { - return new AudioBleepBuilder(); - } - - public Double getGain() { - return this.builder.gain; - } - - public Double getFrequency() { - return this.builder.frequency; - } - - public Double getStartPadding() { - return this.builder.startPadding; - } - - public Double getStopPadding() { - return this.builder.stopPadding; - } - - public static final class AudioBleepBuilder { - private Double gain; - private Double frequency; - private Double startPadding; - private Double stopPadding; - - private AudioBleepBuilder() { - // Default constructor - } - - public AudioBleepBuilder gain(Double gain) { - this.gain = gain; - return this; - } - - public AudioBleepBuilder frequency(Double frequency) { - this.frequency = frequency; - return this; - } - - public AudioBleepBuilder startPadding(Double startPadding) { - this.startPadding = startPadding; - return this; - } - - public AudioBleepBuilder stopPadding(Double stopPadding) { - this.stopPadding = stopPadding; - return this; - } - - public AudioBleep build() { - return new AudioBleep(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java b/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java deleted file mode 100644 index 819927d2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DateTransformation.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class DateTransformation { - private final int max; - private final int min; - private final List entities; - - public DateTransformation(int max, int min, List entities) { - this.max = max; - this.min = min; - this.entities = entities; - } - - public int getMax() { - return max; - } - - public int getMin() { - return min; - } - - public List getEntities() { - return entities; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java deleted file mode 100644 index 3ebc450e..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; -import com.skyflow.enums.MaskingMethod; -import java.util.List; - -public class DeidentifyFileRequest { - private final DeidentifyFileRequestBuilder builder; - - private DeidentifyFileRequest(DeidentifyFileRequestBuilder builder) { - this.builder = builder; - } - - public static DeidentifyFileRequestBuilder builder() { - return new DeidentifyFileRequestBuilder(); - } - - public FileInput getFileInput() { - return this.builder.fileInput; - } - - public List getEntities() { - return this.builder.entities; - } - - public List getAllowRegexList() { - return this.builder.allowRegexList; - } - - public List getRestrictRegexList() { - return this.builder.restrictRegexList; - } - - public TokenFormat getTokenFormat() { - return this.builder.tokenFormat; - } - - public Transformations getTransformations() { - return this.builder.transformations; - } - - public Boolean getOutputProcessedImage() { - return this.builder.outputProcessedImage; - } - - public Boolean getOutputOcrText() { - return this.builder.outputOcrText; - } - - public MaskingMethod getMaskingMethod() { - return this.builder.maskingMethod; - } - - public Number getPixelDensity() { - return this.builder.pixelDensity; - } - - public Number getMaxResolution() { - return this.builder.maxResolution; - } - - public Boolean getOutputProcessedAudio() { - return this.builder.outputProcessedAudio; - } - - public DetectOutputTranscriptions getOutputTranscription() { - return this.builder.outputTranscription; - } - - public AudioBleep getBleep() { - return this.builder.bleep; - } - - public String getOutputDirectory() { - return this.builder.outputDirectory; - } - - public Integer getWaitTime() { - return this.builder.waitTime; - } - - public static final class DeidentifyFileRequestBuilder { - private List entities; - private List allowRegexList; - private List restrictRegexList; - private TokenFormat tokenFormat; - private Transformations transformations; - private Boolean outputProcessedImage; - private Boolean outputOcrText; - private MaskingMethod maskingMethod; - private Number pixelDensity; - private Number maxResolution; - private Boolean outputProcessedAudio; - private DetectOutputTranscriptions outputTranscription; - private AudioBleep bleep; - private FileInput fileInput; - private String outputDirectory; - private Integer waitTime; - - private DeidentifyFileRequestBuilder() { - // Set default values - this.outputProcessedImage = false; - this.outputOcrText = false; - this.outputProcessedAudio = false; - } - - public DeidentifyFileRequestBuilder file(FileInput fileInput) { - this.fileInput = fileInput; - return this; - } - - public DeidentifyFileRequestBuilder entities(List entities) { - this.entities = entities; - return this; - } - - public DeidentifyFileRequestBuilder allowRegexList(List allowRegexList) { - this.allowRegexList = allowRegexList; - return this; - } - - public DeidentifyFileRequestBuilder restrictRegexList(List restrictRegexList) { - this.restrictRegexList = restrictRegexList; - return this; - } - - public DeidentifyFileRequestBuilder tokenFormat(TokenFormat tokenFormat) { - this.tokenFormat = tokenFormat; - return this; - } - - public DeidentifyFileRequestBuilder transformations(Transformations transformations) { - this.transformations = transformations; - return this; - } - - public DeidentifyFileRequestBuilder outputProcessedImage(Boolean outputProcessedImage) { - this.outputProcessedImage = outputProcessedImage != null ? outputProcessedImage : false; - return this; - } - - public DeidentifyFileRequestBuilder outputOcrText(Boolean outputOcrText) { - this.outputOcrText = outputOcrText != null ? outputOcrText : false; - return this; - } - - public DeidentifyFileRequestBuilder maskingMethod(MaskingMethod maskingMethod) { - this.maskingMethod = maskingMethod; - return this; - } - - public DeidentifyFileRequestBuilder pixelDensity(Number pixelDensity) { - this.pixelDensity = pixelDensity; - return this; - } - - public DeidentifyFileRequestBuilder maxResolution(Number maxResolution) { - this.maxResolution = maxResolution; - return this; - } - - public DeidentifyFileRequestBuilder outputProcessedAudio(Boolean outputProcessedAudio) { - this.outputProcessedAudio = outputProcessedAudio != null ? outputProcessedAudio : false; - return this; - } - - public DeidentifyFileRequestBuilder outputTranscription(DetectOutputTranscriptions outputTranscription) { - this.outputTranscription = outputTranscription; - return this; - } - - public DeidentifyFileRequestBuilder bleep(AudioBleep bleep) { - this.bleep = bleep; - return this; - } - - public DeidentifyFileRequestBuilder outputDirectory(String outputDirectory) { - this.outputDirectory = outputDirectory; - return this; - } - - public DeidentifyFileRequestBuilder waitTime(Integer waitTime) { - this.waitTime = waitTime; - return this; - } - - public DeidentifyFileRequest build() { - return new DeidentifyFileRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java deleted file mode 100644 index 08636d77..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.skyflow.vault.detect; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -public class DeidentifyFileResponse { - private final FileInfo file; - private final String fileBase64; - private final String type; - private final String extension; - private final Integer wordCount; - private final Integer charCount; - private final Float sizeInKb; - private final Float durationInSeconds; - private final Integer pageCount; - private final Integer slideCount; - private final List entities; - private final String runId; - private final String status; - - - public DeidentifyFileResponse(FileInfo file, String fileBase64, String type, String extension, - Integer wordCount, Integer charCount, Float sizeInKb, - Float durationInSeconds, Integer pageCount, Integer slideCount, - List entities, String runId, String status) { - this.file = file; - this.fileBase64 = fileBase64; - this.type = type; - this.extension = extension; - this.wordCount = wordCount; - this.charCount = charCount; - this.sizeInKb = sizeInKb; - this.durationInSeconds = durationInSeconds; - this.pageCount = pageCount; - this.slideCount = slideCount; - this.entities = entities; - this.runId = runId; - this.status = status; - } - - public DeidentifyFileResponse(String runId, String status) { - this(null, null, null, null, null, null, null, null, null, null, null, runId, status); - } - - public FileInfo getFile() { - return file; - } - - public String getFileBase64(){ - return fileBase64; - } - - public String getType() { - return type; - } - - public String getExtension() { - return extension; - } - - public Integer getWordCount() { - return wordCount; - } - - public Integer getCharCount() { - return charCount; - } - - public Float getSizeInKb() { - return sizeInKb; - } - - public Float getDurationInSeconds() { - return durationInSeconds; - } - - public Integer getPageCount() { - return pageCount; - } - - public Integer getSlideCount() { - return slideCount; - } - - public List getEntities() { - return entities; - } - - public String getRunId() { - return runId; - } - - public String getStatus() { - return status; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } - -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java deleted file mode 100644 index 5f57e3a9..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class DeidentifyTextRequest { - private final DeidentifyTextRequestBuilder builder; - - private DeidentifyTextRequest(DeidentifyTextRequestBuilder builder) { - this.builder = builder; - } - - public static DeidentifyTextRequestBuilder builder() { - return new DeidentifyTextRequestBuilder(); - } - - public String getText() { - return this.builder.text; - } - - public List getEntities() { - return this.builder.entities; - } - - public List getAllowRegexList() { - return this.builder.allowRegexList; - } - - public List getRestrictRegexList() { - return this.builder.restrictRegexList; - } - - public TokenFormat getTokenFormat() { - return this.builder.tokenFormat; - } - - public Transformations getTransformations() { - return this.builder.transformations; - } - - public static final class DeidentifyTextRequestBuilder { - private String text; - private List entities; - private List allowRegexList; - private List restrictRegexList; - private TokenFormat tokenFormat; - private Transformations transformations; - - private DeidentifyTextRequestBuilder() { - } - - public DeidentifyTextRequestBuilder text(String text) { - this.text = text; - return this; - } - - public DeidentifyTextRequestBuilder entities(List entities) { - this.entities = entities; - return this; - } - - public DeidentifyTextRequestBuilder allowRegexList(List allowRegexList) { - this.allowRegexList = allowRegexList; - return this; - } - - public DeidentifyTextRequestBuilder restrictRegexList(List restrictRegexList) { - this.restrictRegexList = restrictRegexList; - return this; - } - - public DeidentifyTextRequestBuilder tokenFormat(TokenFormat tokenFormat) { - this.tokenFormat = tokenFormat; - return this; - } - - public DeidentifyTextRequestBuilder transformations(Transformations transformations) { - this.transformations = transformations; - return this; - } - - public DeidentifyTextRequest build() { - return new DeidentifyTextRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java deleted file mode 100644 index 6b6118e0..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -import java.util.List; - -public class DeidentifyTextResponse { - private final String processedText; - private final List entities; - private final int wordCount; - private final int charCount; - - public DeidentifyTextResponse(String processedText, List entities, int wordCount, int charCount) { - this.processedText = processedText; - this.entities = entities; - this.wordCount = wordCount; - this.charCount = charCount; - } - - public String getProcessedText() { - return processedText; - } - - public List getEntities() { - return entities; - } - - public int getWordCount() { - return wordCount; - } - - public int getCharCount() { - return charCount; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } - -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java deleted file mode 100644 index 4a84acf9..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/EntityInfo.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.skyflow.vault.detect; - - -import java.util.Map; - -public class EntityInfo { - private final String token; - private final String value; - private final TextIndex textIndex; - private final TextIndex processedIndex; - private final String entity; - private final Map scores; - - public EntityInfo(String token, String value, TextIndex textIndex, TextIndex processedIndex, String entity, java.util.Map scores) { - this.token = token; - this.value = value; - this.textIndex = textIndex; - this.processedIndex = processedIndex; - this.entity = entity; - this.scores = scores; - } - - public String getToken() { - return token; - } - - public String getValue() { - return value; - } - - public TextIndex getTextIndex() { - return textIndex; - } - - public TextIndex getProcessedIndex() { - return processedIndex; - } - - public String getEntity() { - return entity; - } - - public Map getScores() { - return scores; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java deleted file mode 100644 index 1c41e6ac..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; - -public class FileEntityInfo { - private final String file; - private final String type; - private final String extension; - - public FileEntityInfo(String file, DeidentifiedFileOutputProcessedFileType type, DeidentifiedFileOutputProcessedFileExtension extension) { - this.file = file; - this.type = String.valueOf(type); - this.extension = String.valueOf(extension); - } - - public String getFile() { return file; } - public String getType() { return type; } - public String getExtension() { return extension; } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java deleted file mode 100644 index 2f13c4f2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileInfo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.skyflow.vault.detect; - -import java.io.File; - -public class FileInfo { - private String name; - private long size; - private String type; - private long lastModified; - - public FileInfo(File file) { - this.name = file.getName(); - this.size = file.length(); - this.type = ""; - this.lastModified = file.lastModified(); - } - - public String getName() { - return name; - } - - public long getSize() { - return size; - } - - public String getType() { - return type; - } - - public long getLastModified() { - return lastModified; - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java b/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java deleted file mode 100644 index 3ff1a77e..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/FileInput.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.skyflow.vault.detect; - -import java.io.File; - -public class FileInput { - private final FileInputBuilder builder; - - private FileInput(FileInputBuilder builder) { - this.builder = builder; - } - - public static FileInputBuilder builder() { - return new FileInputBuilder(); - } - - public File getFile() { - return this.builder.file; - } - - public String getFilePath() { - return this.builder.filePath; - } - - public static final class FileInputBuilder { - private File file; - private String filePath; - - private FileInputBuilder() { - // Default constructor - } - - public FileInputBuilder file(File file) { - this.file = file; - return this; - } - - public FileInputBuilder filePath(String filePath) { - this.filePath = filePath; - return this; - } - - public FileInput build() { - return new FileInput(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java deleted file mode 100644 index cebec9f2..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.skyflow.vault.detect; - -public class GetDetectRunRequest { - private final String runId; - - private GetDetectRunRequest(GetDetectRunRequestBuilder builder) { - this.runId = builder.runId; - } - - public static GetDetectRunRequestBuilder builder() { - return new GetDetectRunRequestBuilder(); - } - - public String getRunId() { - return this.runId; - } - - public static final class GetDetectRunRequestBuilder { - private String runId; - - private GetDetectRunRequestBuilder() { - } - - public GetDetectRunRequestBuilder runId(String runId) { - this.runId = runId; - return this; - } - - public GetDetectRunRequest build() { - return new GetDetectRunRequest(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java b/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java deleted file mode 100644 index cc0e216a..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; - -import java.util.List; - -public class ReidentifyTextRequest { - private final ReidentifyTextRequestBuilder builder; - - private ReidentifyTextRequest(ReidentifyTextRequestBuilder builder) { - this.builder = builder; - } - - public static ReidentifyTextRequestBuilder builder() { - return new ReidentifyTextRequestBuilder(); - } - - public String getText() { - return this.builder.text; - } - - public List getRedactedEntities() { - return this.builder.redactedEntities; - } - - public List getMaskedEntities() { - return this.builder.maskedEntities; - } - - public List getPlainTextEntities() { - return this.builder.plainTextEntities; - } - - public static final class ReidentifyTextRequestBuilder { - private String text; - private List redactedEntities; - private List maskedEntities; - private List plainTextEntities; - - private ReidentifyTextRequestBuilder() { - } - - public ReidentifyTextRequestBuilder text(String text) { - this.text = text; - return this; - } - - public ReidentifyTextRequestBuilder redactedEntities(List redactedEntities) { - this.redactedEntities = redactedEntities; - return this; - } - - public ReidentifyTextRequestBuilder maskedEntities(List maskedEntities) { - this.maskedEntities = maskedEntities; - return this; - } - - public ReidentifyTextRequestBuilder plainTextEntities(List plainTextEntities) { - this.plainTextEntities = plainTextEntities; - return this; - } - - public ReidentifyTextRequest build() { - return new ReidentifyTextRequest(this); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java b/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java deleted file mode 100644 index 3a517968..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class ReidentifyTextResponse { - private final String processedText; - - public ReidentifyTextResponse(String processedText) { - this.processedText = processedText; - } - - public String getProcessedText() { - return processedText; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java b/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java deleted file mode 100644 index 6fe99c1d..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/TextIndex.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class TextIndex { - private final Integer start; - private final Integer end; - - public TextIndex(Integer start, Integer end) { - this.start = start; - this.end = end; - } - - public int getStart() { - return start; - } - - public int getEnd() { - return end; - } - - @Override - public String toString() { - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(this); - } -} diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java b/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java deleted file mode 100644 index 8809d0a3..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/TokenFormat.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.skyflow.vault.detect; - - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.TokenType; - -import java.util.List; - - -public class TokenFormat { - private final TokenFormatBuilder builder; - - private TokenFormat(TokenFormatBuilder builder) { - this.builder = builder; - } - - public static TokenFormatBuilder builder() { - return new TokenFormatBuilder(); - } - - public TokenType getDefault() { - return this.builder.defaultType; - } - - public List getVaultToken() { - return this.builder.vaultToken; - } - - public List getEntityUniqueCounter() { - return this.builder.entityUniqueCounter; - } - - public List getEntityOnly() { - return this.builder.entityOnly; - } - - public static final class TokenFormatBuilder { - private TokenType defaultType; - private List vaultToken; - private List entityUniqueCounter; - private List entityOnly; - - private TokenFormatBuilder() { - this.defaultType = TokenType.ENTITY_UNIQUE_COUNTER; - } - - public TokenFormatBuilder defaultType(TokenType defaultType) { - this.defaultType = defaultType != null ? defaultType : TokenType.ENTITY_UNIQUE_COUNTER; - return this; - } - - public TokenFormatBuilder vaultToken(List vaultToken) { - this.vaultToken = vaultToken; - return this; - } - - public TokenFormatBuilder entityUniqueCounter(List entityUniqueCounter) { - this.entityUniqueCounter = entityUniqueCounter; - return this; - } - - public TokenFormatBuilder entityOnly(List entityOnly) { - this.entityOnly = entityOnly; - return this; - } - - public TokenFormat build() { - return new TokenFormat(this); - } - } -} \ No newline at end of file diff --git a/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java b/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java deleted file mode 100644 index 2e219101..00000000 --- a/skyvault/src/main/java/com/skyflow/vault/detect/Transformations.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.skyflow.vault.detect; - - -public class Transformations { - private final DateTransformation shiftDates; - - public Transformations(DateTransformation shiftDates) { - this.shiftDates = shiftDates; - } - - public DateTransformation getShiftDates() { - return shiftDates; - } -} diff --git a/skyvault/src/test/java/com/skyflow/VaultClientTests.java b/skyvault/src/test/java/com/skyflow/VaultClientTests.java index 312e2892..85db62a8 100644 --- a/skyvault/src/test/java/com/skyflow/VaultClientTests.java +++ b/skyvault/src/test/java/com/skyflow/VaultClientTests.java @@ -7,26 +7,17 @@ import com.skyflow.enums.*; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; import com.skyflow.generated.rest.resources.tokens.TokensClient; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; -import com.skyflow.vault.detect.*; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.Transformations; import com.skyflow.vault.tokens.ColumnValue; import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; @@ -112,28 +103,6 @@ public void testVaultClientGetRecordsAPI() { } } - @Test - public void testVaultClientDetectAPI() { - try { - FilesClient filesClient = vaultClient.getDetectFileAPi(); - Assert.assertNotNull(filesClient); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(INVALID_EXCEPTION_THROWN + e.getMessage()); - } - } - - @Test - public void testVaultClientDetectTextAPI() { - try { - StringsClient stringsClient = vaultClient.getDetectTextApi(); - Assert.assertNotNull(stringsClient); - } catch (Exception e) { - e.printStackTrace(); - Assert.fail(INVALID_EXCEPTION_THROWN + e.getMessage()); - } - } - @Test public void testVaultClientGetTokensAPI() { try { @@ -369,566 +338,8 @@ public void testSetBearerTokenWithEnvCredentials() { } } - @Test - public void testGetDeIdentifyTextResponse() { - List entities = new ArrayList<>(); - Locations location = Locations.builder() - .startIndex(2) - .endIndex(10) - .startIndexProcessed(3) - .endIndexProcessed(8) - .build(); - - StringResponseEntities detectedEntity = StringResponseEntities.builder() - .token("token123") - .value("value123") - .location(location) - .build(); - entities.add(detectedEntity); - - DeidentifyStringResponse response = DeidentifyStringResponse.builder() - .processedText("processed text") - .wordCount(2) - .characterCount(13) - .entities(entities) - .build(); - - - DeidentifyTextResponse result = vaultClient.getDeIdentifyTextResponse(response); - - Assert.assertNotNull(result); - Assert.assertEquals("processed text", result.getProcessedText()); - Assert.assertEquals(2, result.getWordCount()); - Assert.assertEquals(13, result.getCharCount()); - Assert.assertNotNull(result.getEntities()); - Assert.assertEquals(1, result.getEntities().size()); - Assert.assertEquals("token123", result.getEntities().get(0).getToken()); - Assert.assertEquals("value123", result.getEntities().get(0).getValue()); - Assert.assertEquals(2, result.getEntities().get(0).getTextIndex().getStart()); - Assert.assertEquals(10, result.getEntities().get(0).getTextIndex().getEnd()); - Assert.assertEquals(3, result.getEntities().get(0).getProcessedIndex().getStart()); - Assert.assertEquals(8, result.getEntities().get(0).getProcessedIndex().getEnd()); - } - - @Test - public void testGetDeidentifyStringRequest() { - - List detectEntitiesList = new ArrayList<>(); - detectEntitiesList.add(DetectEntities.NAME); - - List vaultTokenList = new ArrayList<>(); - vaultTokenList.add(DetectEntities.SSN); - - - List entityOnlyList = new ArrayList<>(); - entityOnlyList.add(DetectEntities.DOB); - - List entityUniqueCounterList = new ArrayList<>(); - entityUniqueCounterList.add(DetectEntities.NAME); - - - List restrictRegexList = new ArrayList<>(); - restrictRegexList.add("([0-9]{3}-[0-9]{2}-[0-9]{4})"); - - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultTokenList) - .entityOnly(entityOnlyList) - .entityUniqueCounter(entityUniqueCounterList) - .build(); - - - List detectEntitiesTransformationList = new ArrayList<>(); - detectEntitiesTransformationList.add(DetectEntities.DOB); - detectEntitiesTransformationList.add(DetectEntities.DATE); - - DateTransformation dateTransformation = new DateTransformation(20, 5, detectEntitiesTransformationList); - Transformations transformations = new Transformations(dateTransformation); - - - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("Sensitive data to deidentify, like Name: Joy SSN 123-45-6789 and DOB 01-01-2000.") - .entities(detectEntitiesList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - } - - @Test - public void testDeidentifyFileRequestBuilderAndGetters() { - File file = new File("testfile.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DetectEntities entity = DetectEntities.NAME; - String allowRegex = "^[A-Za-z]+$"; - String restrictRegex = "\\d+"; - TokenFormat tokenFormat = TokenFormat.builder().vaultToken(Collections.singletonList(entity)).build(); - Boolean outputProcessedImage = true; - Boolean outputOcrText = true; - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; - Double pixelDensity = 300.0; - Double maxResolution = 1024.0; - Boolean outputProcessedAudio = false; - DetectOutputTranscriptions outputTranscription = DetectOutputTranscriptions.TRANSCRIPTION; - AudioBleep bleep = AudioBleep.builder().gain(20.0).build(); - String outputDirectory = "/tmp"; - Integer waitTime = 10; - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Arrays.asList(entity)) - .allowRegexList(Collections.singletonList(allowRegex)) - .restrictRegexList(Collections.singletonList(restrictRegex)) - .tokenFormat(tokenFormat) - .outputProcessedImage(outputProcessedImage) - .outputOcrText(outputOcrText) - .maskingMethod(maskingMethod) - .pixelDensity(pixelDensity) - .maxResolution(maxResolution) - .outputProcessedAudio(outputProcessedAudio) - .outputTranscription(outputTranscription) - .bleep(bleep) - .outputDirectory(outputDirectory) - .waitTime(waitTime) - .build(); - - Assert.assertEquals(file, request.getFileInput().getFile()); - Assert.assertEquals(1, request.getEntities().size()); - Assert.assertEquals(allowRegex, request.getAllowRegexList().get(0)); - Assert.assertEquals(restrictRegex, request.getRestrictRegexList().get(0)); - Assert.assertEquals(tokenFormat, request.getTokenFormat()); - Assert.assertEquals(outputProcessedImage, request.getOutputProcessedImage()); - Assert.assertEquals(outputOcrText, request.getOutputOcrText()); - Assert.assertEquals(maskingMethod, request.getMaskingMethod()); - Assert.assertEquals(pixelDensity, request.getPixelDensity()); - Assert.assertEquals(maxResolution, request.getMaxResolution()); - Assert.assertEquals(outputProcessedAudio, request.getOutputProcessedAudio()); - Assert.assertEquals(outputTranscription, request.getOutputTranscription()); - Assert.assertEquals(bleep, request.getBleep()); - Assert.assertEquals(outputDirectory, request.getOutputDirectory()); - Assert.assertEquals(waitTime, request.getWaitTime()); - } - - @Test - public void testDeidentifyFileRequestBuilderDefaults() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder().build(); - Assert.assertNull(request.getEntities()); - Assert.assertNull(request.getAllowRegexList()); - Assert.assertNull(request.getRestrictRegexList()); - Assert.assertNull(request.getTokenFormat()); - Assert.assertNull(request.getTransformations()); - Assert.assertEquals(false, request.getOutputProcessedImage()); - Assert.assertEquals(false, request.getOutputOcrText()); - Assert.assertNull(request.getMaskingMethod()); - Assert.assertNull(request.getPixelDensity()); - Assert.assertNull(request.getMaxResolution()); - Assert.assertEquals(false, request.getOutputProcessedAudio()); - Assert.assertNull(request.getOutputTranscription()); - Assert.assertNull(request.getBleep()); - Assert.assertNull(request.getOutputDirectory()); - Assert.assertNull(request.getWaitTime()); - } - - @Test - public void testGetDeidentifyImageRequest() { - File file = new File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .outputProcessedImage(true) - .outputOcrText(true) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "jpg"; - - DeidentifyFileImageRequestDeidentifyImage imageRequest = vaultClient.getDeidentifyImageRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, imageRequest.getVaultId()); - Assert.assertEquals(base64Content, imageRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), imageRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyPresentationRequest() { - File file = new File("test.pptx"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "pptx"; - - DeidentifyFileRequestDeidentifyPresentation presRequest = vaultClient.getDeidentifyPresentationRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, presRequest.getVaultId()); - Assert.assertEquals(base64Content, presRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), presRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifySpreadsheetRequest() { - File file = new File("test.csv"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "csv"; - - DeidentifyFileRequestDeidentifySpreadsheet spreadsheetRequest = vaultClient.getDeidentifySpreadsheetRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, spreadsheetRequest.getVaultId()); - Assert.assertEquals(base64Content, spreadsheetRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), spreadsheetRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyStructuredTextRequest() { - File file = new File("test.json"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "json"; - - DeidentifyFileRequestDeidentifyStructuredText structuredTextRequest = vaultClient.getDeidentifyStructuredTextRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, structuredTextRequest.getVaultId()); - Assert.assertEquals(base64Content, structuredTextRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), structuredTextRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyDocumentRequest() { - File file = new File("test.docx"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String format = "docx"; - - DeidentifyFileRequestDeidentifyDocument documentRequest = vaultClient.getDeidentifyDocumentRequest(request, vaultId, base64Content, format); - - Assert.assertEquals(vaultId, documentRequest.getVaultId()); - Assert.assertEquals(base64Content, documentRequest.getFile().getBase64()); - Assert.assertEquals(format.toUpperCase(), documentRequest.getFile().getDataFormat().name()); - } - - @Test - public void testGetDeidentifyPdfRequest() { - File file = new File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .pixelDensity(200) - .maxResolution(300) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - - DeidentifyFileDocumentPdfRequestDeidentifyPdf pdfRequest = vaultClient.getDeidentifyPdfRequest(request, vaultId, base64Content); - - Assert.assertEquals(vaultId, pdfRequest.getVaultId()); - Assert.assertEquals(base64Content, pdfRequest.getFile().getBase64()); - } - - @Test - public void testGetDeidentifyAudioRequest() throws SkyflowException { - File file = new File("test.mp3"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - AudioBleep bleep = AudioBleep.builder().frequency(1000.0).gain(10.0).startPadding(1.0).stopPadding(1.0).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .bleep(bleep) - .outputProcessedAudio(true) - .outputTranscription(DetectOutputTranscriptions.TRANSCRIPTION) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String dataFormat = "mp3"; - - DeidentifyFileAudioRequestDeidentifyAudio audioRequest = vaultClient.getDeidentifyAudioRequest(request, vaultId, base64Content, dataFormat); - - Assert.assertEquals(vaultId, audioRequest.getVaultId()); - Assert.assertEquals(base64Content, audioRequest.getFile().getBase64()); - Assert.assertEquals(dataFormat, audioRequest.getFile().getDataFormat().toString()); - } - - @Test - public void testGetDeidentifyTextFileRequest() { - File file = new File("test.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - - DeidentifyFileRequestDeidentifyText textRequest = - vaultClient.getDeidentifyTextFileRequest(request, vaultId, base64Content); - - Assert.assertEquals(vaultId, textRequest.getVaultId()); - Assert.assertEquals(base64Content, textRequest.getFile().getBase64()); - } - - @Test - public void testGetDeidentifyStringRequest_AllTokenFormatFields() throws Exception { - List entities = Arrays.asList(DetectEntities.DOB); - List vaultToken = Collections.singletonList(DetectEntities.SSN); - List entityOnly = Collections.singletonList(DetectEntities.DOB); - List entityUniqueCounter = Collections.singletonList(DetectEntities.NAME); - - TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(vaultToken) - .entityOnly(entityOnly) - .entityUniqueCounter(entityUniqueCounter) - .build(); - - List allowRegex = Collections.singletonList("a.*"); - List restrictRegex = Collections.singletonList("b.*"); - - DateTransformation dateTransformation = new DateTransformation(10, 5, entities); - Transformations transformations = new Transformations(dateTransformation); - - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("Sensitive data") - .entities(entities) - .allowRegexList(allowRegex) - .restrictRegexList(restrictRegex) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - DeidentifyStringRequest result = vaultClient.getDeidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId()); - Assert.assertEquals("Sensitive data", result.getText()); - Assert.assertTrue(result.getAllowRegex().isPresent()); - Assert.assertTrue(result.getRestrictRegex().isPresent()); - Assert.assertTrue(result.getTransformations().isPresent()); - } - - @Test - public void testGetDeidentifyStringRequest_NullTokenFormatAndEntities() throws Exception { - DeidentifyTextRequest req = DeidentifyTextRequest.builder() - .text("No entities or tokenFormat") - .build(); - - DeidentifyStringRequest result = vaultClient.getDeidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId()); - Assert.assertEquals("No entities or tokenFormat", result.getText()); - } - - @Test - public void testGetReidentifyStringRequest_AllFields() throws Exception { - List masked = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - List plaintext = Collections.singletonList(DetectEntities.SSN); - List redacted = Collections.singletonList(DetectEntities.DATE); - - ReidentifyTextRequest req = ReidentifyTextRequest.builder() - .text("Sensitive data") - .maskedEntities(masked) - .plainTextEntities(plaintext) - .redactedEntities(redacted) - .build(); - - ReidentifyStringRequest result = vaultClient.getReidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId().get()); - Assert.assertEquals("Sensitive data", result.getText().get()); - Assert.assertNotNull(result.getFormat()); - } - - @Test - public void testGetReidentifyStringRequest_NullFields() throws Exception { - ReidentifyTextRequest req = ReidentifyTextRequest.builder() - .text("No entities") - .build(); - - ReidentifyStringRequest result = vaultClient.getReidentifyStringRequest(req, "vaultId"); - Assert.assertNotNull(result); - Assert.assertEquals("vaultId", result.getVaultId().get()); - Assert.assertEquals("No entities", result.getText().get()); - Assert.assertNotNull(result.getFormat()); - } - - @Test - public void testGetTransformations_NullInput() throws Exception { - // Should return null if input is null - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, new Object[]{null}); - Assert.assertNull(result); - } - - @Test - public void testGetTransformations_NullShiftDates() throws Exception { - Transformations transformations = new Transformations(null); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNull(result); - } - - @Test - public void testGetTransformations_EmptyEntities() throws Exception { - DateTransformation dateTransformation = new DateTransformation(10, 5, new ArrayList<>()); - Transformations transformations = new Transformations(dateTransformation); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNotNull(result); - // Should have empty entityTypes list - com.skyflow.generated.rest.types.Transformations restTransform = (com.skyflow.generated.rest.types.Transformations) result; - Assert.assertTrue(restTransform.getShiftDates().get().getEntityTypes().get().isEmpty()); - } - - @Test - public void testGetTransformations_WithEntities() throws Exception { - List entities = Arrays.asList(DetectEntities.DOB, DetectEntities.DATE); - DateTransformation dateTransformation = new DateTransformation(20, 5, entities); - Transformations transformations = new Transformations(dateTransformation); - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("getTransformations", Transformations.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, transformations); - Assert.assertNotNull(result); - com.skyflow.generated.rest.types.Transformations restTransform = (com.skyflow.generated.rest.types.Transformations) result; - Assert.assertEquals(2, restTransform.getShiftDates().get().getEntityTypes().get().size()); - } - - @Test - public void testGetDeidentifyGenericFileRequest_AllFields() throws SkyflowException { - File file = new File("test.custom"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME, DetectEntities.DOB); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .allowRegexList(Arrays.asList("a.*")) - .restrictRegexList(Arrays.asList("b.*")) - .build(); - - String vaultId = "vault123"; - String base64Content = "base64string"; - String fileExtension = "txt"; - - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest genericRequest = - vaultClient.getDeidentifyGenericFileRequest(request, vaultId, base64Content, fileExtension); - - Assert.assertEquals(vaultId, genericRequest.getVaultId()); - Assert.assertEquals(base64Content, genericRequest.getFile().getBase64()); - Assert.assertNotNull(genericRequest.getEntityTypes()); - Assert.assertNotNull(genericRequest.getTokenType()); - Assert.assertTrue(genericRequest.getAllowRegex().isPresent()); - Assert.assertTrue(genericRequest.getRestrictRegex().isPresent()); - } - // --- unsupported file extension must throw SkyflowException, not raw IllegalArgumentException --- - @Test - public void testGetDeidentifyGenericFileRequest_UnsupportedExtensionThrowsSkyflowException() { - File file = new File("test.xyz"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - - try { - vaultClient.getDeidentifyGenericFileRequest(request, "vault123", "base64string", "xyz"); - Assert.fail("Should have thrown an exception"); - } catch (SkyflowException e) { - Assert.assertNotNull(e.getMessage()); - } catch (IllegalArgumentException e) { - Assert.fail("should throw SkyflowException, not raw IllegalArgumentException: " + e); - } - } - - @Test - public void testMapAudioDataFormat_mp3() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, "mp3"); - Assert.assertEquals(FileDataDeidentifyAudioDataFormat.MP_3, result); - } - - @Test - public void testMapAudioDataFormat_wav() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - Object result = method.invoke(vaultClient, "wav"); - Assert.assertEquals(FileDataDeidentifyAudioDataFormat.WAV, result); - } - - @Test - public void testMapAudioDataFormat_invalid() throws Exception { - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("mapAudioDataFormat", String.class); - method.setAccessible(true); - try { - method.invoke(vaultClient, "ogg"); - Assert.fail("Should throw SkyflowException for invalid audio type"); - } catch (Exception e) { - Throwable cause = e.getCause(); - Assert.assertTrue(cause instanceof SkyflowException); - } - } - // Fields moved to base classes (e.g. common.BaseVaultClient) aren't found by // getDeclaredField on the subclass, so walk up the hierarchy. private java.lang.reflect.Field findDeclaredField(Class clazz, String fieldName) throws NoSuchFieldException { @@ -958,67 +369,6 @@ public void testGetFileForFileUpload_withFileObject() { } } - @Test - public void testGetDeidentifyImageRequest_withMaskingMethod() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder().entityOnly(entities).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .maskingMethod(MaskingMethod.BLACKBOX) - .outputProcessedImage(true) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - - Assert.assertNotNull(imageRequest); - Assert.assertTrue(imageRequest.getMaskingMethod().isPresent()); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeIdentifyTextResponse_withEntityScores() { - Locations location = Locations.builder() - .startIndex(0) - .endIndex(5) - .startIndexProcessed(0) - .endIndexProcessed(5) - .build(); - - Map scores = new HashMap<>(); - scores.put("EMAIL_ADDRESS", 0.95); - - StringResponseEntities entity = StringResponseEntities.builder() - .location(location) - .token("tok") - .value("val") - .entityType("EMAIL_ADDRESS") - .entityScores(scores) - .build(); - - DeidentifyStringResponse deidentifyResponse = DeidentifyStringResponse.builder() - .entities(Collections.singletonList(entity)) - .processedText("processed text") - .wordCount(2) - .characterCount(13) - .build(); - - DeidentifyTextResponse result = vaultClient.getDeIdentifyTextResponse(deidentifyResponse); - - Assert.assertNotNull(result); - Assert.assertEquals(1, result.getEntities().size()); - // Entity scores map lambda was invoked → getScores() should have the score - Assert.assertEquals(0.95, result.getEntities().get(0).getScores().get("EMAIL_ADDRESS"), 0.001); - } - @Test public void testUpdateExecutorInHTTP_interceptorAddsAuthorizationHeader() { try { @@ -1085,101 +435,4 @@ public void testGetFileForFileUpload_withNoFileInput_returnsNull() { } } - @Test - public void testGetDeidentifyImageRequest_withEntityOnlyNull_andEntityUniqueCounterNonEmpty() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityUniqueCounter(entities) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - - Assert.assertNotNull(imageRequest); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyImageRequest_withEmptyEntityOnlyList() { - try { - java.io.File file = new java.io.File("test.jpg"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityOnly(Collections.emptyList()) - .entityUniqueCounter(Collections.emptyList()) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - DeidentifyFileImageRequestDeidentifyImage imageRequest = - vaultClient.getDeidentifyImageRequest(request, vaultID, "base64content", "jpg"); - Assert.assertNotNull(imageRequest); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyGenericFileRequest_withEmptyEntityLists() { - try { - java.io.File file = new java.io.File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - TokenFormat tokenFormat = TokenFormat.builder() - .entityOnly(Collections.emptyList()) - .entityUniqueCounter(Collections.emptyList()) - .build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .tokenFormat(tokenFormat) - .build(); - - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest result = - vaultClient.getDeidentifyGenericFileRequest(request, vaultID, "base64content", "pdf"); - Assert.assertNotNull(result); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testGetDeidentifyGenericFileRequest_withNullFileExtension() { - // Covers the `fileExtension != null ? ... : null` false branch at line 779. - // The ternary evaluates null, which is then passed to FileData.builder().dataFormat(null) - // which throws — confirming the null branch of the ternary was exercised. - java.io.File file = new java.io.File("test.pdf"); - FileInput fileInput = FileInput.builder().file(file).build(); - List entities = Arrays.asList(DetectEntities.NAME); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(entities) - .build(); - - try { - vaultClient.getDeidentifyGenericFileRequest(request, vaultID, "base64content", null); - Assert.fail("Expected exception from null dataFormat"); - } catch (Exception e) { - // null fileExtension → ternary false branch → null passed to dataFormat() → throws - Assert.assertNotNull(e.getMessage()); - } - } } diff --git a/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java b/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java deleted file mode 100644 index 6d70a17c..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DeidentifyFileStatusTest { - - @Test - public void testInProgress() { - Assert.assertEquals("IN_PROGRESS", DeidentifyFileStatus.IN_PROGRESS.value()); - } - - @Test - public void testFailed() { - Assert.assertEquals("FAILED", DeidentifyFileStatus.FAILED.value()); - } - - @Test - public void testSuccess() { - Assert.assertEquals("SUCCESS", DeidentifyFileStatus.SUCCESS.value()); - } - - @Test - public void testUnknown() { - Assert.assertEquals("UNKNOWN", DeidentifyFileStatus.UNKNOWN.value()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java b/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java deleted file mode 100644 index 2bb29f0c..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DetectEntitiesTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DetectEntitiesTest { - - @Test - public void testGetDetectEntities() { - Assert.assertEquals("account_number", DetectEntities.ACCOUNT_NUMBER.getDetectEntities()); - Assert.assertEquals("account_number", DetectEntities.ACCOUNT_NUMBER.toString()); - } - - @Test - public void testAll() { - Assert.assertEquals("all", DetectEntities.ALL.getDetectEntities()); - } - - @Test - public void testName() { - Assert.assertEquals("name", DetectEntities.NAME.getDetectEntities()); - Assert.assertEquals("name", DetectEntities.NAME.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java b/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java deleted file mode 100644 index 6df404ed..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class DetectOutputTranscriptionsTest { - - @Test - public void testDiarizedTranscription() { - Assert.assertEquals("diarized_transcription", DetectOutputTranscriptions.DIARIZED_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("diarized_transcription", DetectOutputTranscriptions.DIARIZED_TRANSCRIPTION.toString()); - } - - @Test - public void testMedicalDiarizedTranscription() { - Assert.assertEquals("medical_diarized_transcription", DetectOutputTranscriptions.MEDICAL_DIARIZED_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("medical_diarized_transcription", DetectOutputTranscriptions.MEDICAL_DIARIZED_TRANSCRIPTION.toString()); - } - - @Test - public void testMedicalTranscription() { - Assert.assertEquals("medical_transcription", DetectOutputTranscriptions.MEDICAL_TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("medical_transcription", DetectOutputTranscriptions.MEDICAL_TRANSCRIPTION.toString()); - } - - @Test - public void testTranscription() { - Assert.assertEquals("transcription", DetectOutputTranscriptions.TRANSCRIPTION.getDetectOutputTranscriptions()); - Assert.assertEquals("transcription", DetectOutputTranscriptions.TRANSCRIPTION.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java b/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java deleted file mode 100644 index f675189e..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/MaskingMethodTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class MaskingMethodTest { - - @Test - public void testBlackbox() { - Assert.assertEquals("blackbox", MaskingMethod.BLACKBOX.getMaskingMethod()); - Assert.assertEquals("blackbox", MaskingMethod.BLACKBOX.toString()); - } - - @Test - public void testBlur() { - Assert.assertEquals("blur", MaskingMethod.BLUR.getMaskingMethod()); - Assert.assertEquals("blur", MaskingMethod.BLUR.toString()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java b/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java deleted file mode 100644 index 4f5c0901..00000000 --- a/skyvault/src/test/java/com/skyflow/enums/TokenTypeTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.skyflow.enums; - -import org.junit.Assert; -import org.junit.Test; - -public class TokenTypeTest { - - @Test - public void testVaultToken() { - Assert.assertEquals("vault_token", TokenType.VAULT_TOKEN.getTokenType()); - Assert.assertEquals("vault_token", TokenType.VAULT_TOKEN.toString()); - } - - @Test - public void testEntityUniqueCounter() { - Assert.assertEquals("entity_unq_counter", TokenType.ENTITY_UNIQUE_COUNTER.getTokenType()); - Assert.assertEquals("entity_unq_counter", TokenType.ENTITY_UNIQUE_COUNTER.toString()); - } - - @Test - public void testEntityOnly() { - Assert.assertEquals("entity_only", TokenType.ENTITY_ONLY.getTokenType()); - Assert.assertEquals("entity_only", TokenType.ENTITY_ONLY.toString()); - } - - @Test - public void testGetDefault() { - Assert.assertEquals(TokenType.ENTITY_UNIQUE_COUNTER.getTokenType(), TokenType.VAULT_TOKEN.getDefault()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java deleted file mode 100644 index f0347eeb..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java +++ /dev/null @@ -1,466 +0,0 @@ -package com.skyflow.vault.controller; - -import com.skyflow.config.BaseVaultConfig; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.types.DeidentifiedFileOutput; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.DetectRunsResponseStatus; -import com.skyflow.vault.detect.AudioBleep; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.FileInput; -import com.skyflow.vault.detect.GetDetectRunRequest; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.lang.reflect.Method; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Collections; - -public class DetectControllerFileTests { - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - private static String vaultID = null; - private static String clusterID = null; - private static VaultConfig vaultConfig = null; - private static DetectController detectController = null; - - @BeforeClass - public static void setup() { - vaultID = "vault123"; - clusterID = "cluster123"; - - Credentials credentials = new Credentials(); - credentials.setToken("valid-token"); - - vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(vaultID); - vaultConfig.setClusterId(clusterID); - vaultConfig.setEnv(com.skyflow.enums.Env.DEV); - vaultConfig.setCredentials(credentials); - - detectController = new DetectController(vaultConfig, credentials); - } - - @Test - public void testUnreadableFileInDeidentifyFileRequest() { - try { - File file = new File("unreadable.txt") { - @Override - public boolean exists() { return true; } - @Override - public boolean isFile() { return true; } - @Override - public boolean canRead() { return false; } - }; - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException | RuntimeException e) { - // Depending on implementation, could be SkyflowException or RuntimeException - Assert.assertTrue(e.getMessage().contains("not readable") || e.getMessage().contains("unreadable.txt")); - } - } - - @Test - public void testNullEntitiesInDeidentifyFileRequest() { - try { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(new ArrayList<>()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNullRequest() { - try { - detectController.deidentifyFile(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputBothFileAndFilePathNull() { - try { - FileInput fileInput = FileInput.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for both file and filePath being null"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputBothFileAndFilePathProvided() { - try { - java.io.File file = java.io.File.createTempFile("test", ".txt"); - String filePath = file.getAbsolutePath(); - FileInput fileInput = FileInput.builder().file(file).filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for both file and filePath being provided"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.BothFileAndFilePathProvided.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputEmptyFilePath() { - try { - FileInput fileInput = FileInput.builder().filePath("").build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for empty filePath"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.InvalidFilePath.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputNonExistentFile() { - try { - java.io.File file = new java.io.File("nonexistent.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for non-existent file"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.FileNotFoundToDeidentify.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testFileInputUnreadableFile() { - try { - java.io.File file = new java.io.File("unreadable.txt") { - @Override - public boolean exists() { return true; } - @Override - public boolean isFile() { return true; } - @Override - public boolean canRead() { return false; } - }; - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail("Should have thrown an exception for unreadable file"); - } catch (Exception e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.FileNotReadableToDeidentify.getMessage())); - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNonExistentFileInDeidentifyFileRequest() { - try { - File file = new File("nonexistent.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder().file(fileInput).build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testInvalidPixelDensity() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .pixelDensity(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidMaxResolution() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .maxResolution(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepFrequency() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidOutputDirectory() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory("not/a/real/dir") - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidWaitTime() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(-1) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testWaitTimeExceedsLimit() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .waitTime(100) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testNullGetDetectRunRequest() { - try { - detectController.getDetectRun(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testEmptyRunIdInGetDetectRunRequest() { - try { - GetDetectRunRequest request = GetDetectRunRequest.builder().build(); - detectController.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testNullRunIdInGetDetectRunRequest() { - try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId(null).build(); - detectController.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - } - - @Test - public void testInvalidBleepGain() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(-1.0).startPadding(0.1).stopPadding(0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepStartPadding() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(0.5).startPadding(-0.1).stopPadding(0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testInvalidBleepStopPadding() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - try { - AudioBleep bleep = AudioBleep.builder().frequency(440.0).gain(0.5).startPadding(0.1).stopPadding(-0.1).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .bleep(bleep) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - } - - @Test - public void testOutputDirectoryNotDirectory() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - File notADir = File.createTempFile("notadir", ".txt"); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory(notADir.getAbsolutePath()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } - file.delete(); - notADir.delete(); - } - - @Test - public void testOutputDirectoryNotWritable() throws Exception { - File file = File.createTempFile("test", ".txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - File dir = Files.createTempDirectory("notwritabledir").toFile(); - dir.setWritable(false); - try { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .outputDirectory(dir.getAbsolutePath()) - .build(); - detectController.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), 400); - } finally { - dir.setWritable(true); - file.delete(); - dir.delete(); - } - } - - // C1 regression: the dead statement response.getEntities().get(0) has been removed. - // The short-form constructor produces null entities; the guarded block at the call site - // handles that safely. - @Test - public void testDeidentifyFileResponseNullEntitiesDoesNotThrow() { - DeidentifyFileResponse response = new DeidentifyFileResponse("run-id", "IN_PROGRESS"); - Assert.assertNull("Entities must be null from short-form constructor", response.getEntities()); - } - - // C2: getFirstOutput must return null (not throw NoSuchElementException) when output is absent. - @Test - public void testGetFirstOutputReturnsNullWhenOutputAbsent() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder().build(); - Method method = DetectController.class.getDeclaredMethod("getFirstOutput", DetectRunsResponse.class); - method.setAccessible(true); - DeidentifiedFileOutput result = (DeidentifiedFileOutput) method.invoke(null, response); - Assert.assertNull("getFirstOutput must return null when output Optional is absent", result); - } - - // C2: getFirstOutput must return null when output list is present but empty. - @Test - public void testGetFirstOutputReturnsNullWhenOutputListEmpty() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .output(Collections.emptyList()) - .build(); - Method method = DetectController.class.getDeclaredMethod("getFirstOutput", DetectRunsResponse.class); - method.setAccessible(true); - DeidentifiedFileOutput result = (DeidentifiedFileOutput) method.invoke(null, response); - Assert.assertNull("getFirstOutput must return null when output list is empty", result); - } - - // C3: parseDeidentifyFileResponse must not throw when processedFileExtension is absent; - // it should fall back to the UNKNOWN sentinel value. - @Test - public void testParseDeidentifyFileResponseFallsBackWhenExtensionAbsent() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .output(Collections.singletonList(DeidentifiedFileOutput.builder().build())) - .build(); - - Method method = DetectController.class.getDeclaredMethod( - "parseDeidentifyFileResponse", DetectRunsResponse.class, String.class, String.class); - method.setAccessible(true); - DeidentifyFileResponse result = (DeidentifyFileResponse) method.invoke(null, response, "run-id", "SUCCESS"); - - Assert.assertNotNull("Response must not be null", result); - Assert.assertEquals("Extension must fall back to UNKNOWN when absent", - DetectRunsResponseStatus.UNKNOWN.toString(), result.getExtension()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index b6c504af..b31002ef 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -1,1138 +1,632 @@ package com.skyflow.vault.controller; import com.skyflow.Skyflow; -import com.skyflow.VaultClient; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.enums.DetectEntities; +import com.skyflow.detect.CheckGuardrailsRequest; +import com.skyflow.detect.CheckGuardrailsResponse; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentificationType; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DeidentifyStringRequest; +import com.skyflow.detect.DeidentifyStringResponse; +import com.skyflow.detect.Detect; +import com.skyflow.detect.DetectConfiguration; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.Entity; +import com.skyflow.detect.EntityType; +import com.skyflow.detect.FileDataFormat; +import com.skyflow.detect.GetRunRequest; +import com.skyflow.detect.GetRunResponse; +import com.skyflow.detect.GuardrailsValidation; +import com.skyflow.detect.PollOptions; +import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.ReidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileResponse; +import com.skyflow.detect.ReidentifyStringRequest; +import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.HttpStatus; +import com.skyflow.errors.BaseErrorMessage; +import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.ApiClient; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.strings.StringsClient; -import com.skyflow.generated.rest.types.DeidentifiedFileOutput; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.DetectRunsResponseOutputType; -import com.skyflow.generated.rest.types.DetectRunsResponseStatus; -import com.skyflow.generated.rest.types.IdentifyResponse; -import com.skyflow.generated.rest.types.WordCharacterCount; -import com.skyflow.utils.Constants; -import com.skyflow.utils.Utils; -import com.skyflow.vault.detect.DeidentifyTextRequest; -import com.skyflow.vault.detect.DeidentifyTextResponse; -import com.skyflow.vault.detect.DeidentifyFileResponse; -import com.skyflow.vault.detect.GetDetectRunRequest; -import com.skyflow.vault.detect.ReidentifyTextRequest; -import com.skyflow.vault.detect.ReidentifyTextResponse; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; import org.junit.Assert; -import org.junit.BeforeClass; +import org.junit.Rule; import org.junit.Test; -import org.mockito.Mockito; +import org.junit.rules.TemporaryFolder; import java.io.File; -import java.lang.reflect.Field; import java.nio.file.Files; import java.util.Base64; -import java.util.Collections; - -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.vault.detect.DeidentifyFileRequest; -import com.skyflow.vault.detect.FileInput; -import com.skyflow.vault.detect.TokenFormat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; +import java.util.Arrays; +import java.util.Collections; public class DetectControllerTests { - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static String vaultID = null; - private static String clusterID = null; - private static VaultConfig vaultConfig = null; - private static Skyflow skyflowClient = null; - - @BeforeClass - public static void setup() throws SkyflowException { - vaultID = "vault123"; - clusterID = "cluster123"; - - Credentials credentials = new Credentials(); - credentials.setToken("valid-token"); - - vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(vaultID); - vaultConfig.setClusterId(clusterID); - vaultConfig.setEnv(Env.DEV); - vaultConfig.setCredentials(credentials); - - skyflowClient = Skyflow.builder() - .setLogLevel(LogLevel.DEBUG) - .addVaultConfig(vaultConfig) - .build(); - } - - // ─── helper: build a DetectController with a mocked ApiClient ───────────── - private static DetectController createDetectControllerWithMock(ApiClient mockApiClient) throws Exception { - Credentials creds = new Credentials(); - creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + @Rule + public TemporaryFolder folder = new TemporaryFolder(); + private static VaultConfig vaultConfig(String vaultId) { VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.DEV); - - DetectController controller = new DetectController(config, creds); - Field f = VaultClient.class.getDeclaredField("apiClient"); - f.setAccessible(true); - f.set(controller, mockApiClient); - return controller; + config.setVaultId(vaultId); + config.setClusterId("cluster123"); + config.setEnv(Env.PROD); + return config; } - // ─── deidentifyText — validation ────────────────────────────────────────── - @Test - public void testNullTextInRequestInDeidentifyStringMethod() { + public void detectAccessorResolvesConfiguredVaults() throws SkyflowException { + Skyflow client = Skyflow.builder() + .addVaultConfig(vaultConfig("vault-a")) + .addVaultConfig(vaultConfig("vault-b")) + .build(); + Assert.assertNotNull(client.detect()); + Assert.assertSame(client.detect(), client.detect("vault-a")); + Assert.assertNotSame(client.detect("vault-a"), client.detect("vault-b")); try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + client.detect("vault-c"); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInDeIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } @Test - public void testEmptyTextInRequestInDeidentifyStringMethod() { + public void detectAccessorFollowsVaultConfigRemoval() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(vaultConfig("vault-a")).build(); + client.removeVaultConfig("vault-a"); try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + client.detect(); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInDeIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + Assert.assertEquals(BaseErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); } } - // ─── deidentifyText — happy path ────────────────────────────────────────── - @Test - public void testDeidentifyTextHappyPath() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - DeidentifyStringResponse fakeResponse = DeidentifyStringResponse.builder() - .processedText("hello [REDACTED]") - .wordCount(2) - .characterCount(16) - .build(); - - when(mockStringsClient.deidentifyString(any(), any())).thenReturn(fakeResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - + public void deidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - DeidentifyTextResponse response = controller.deidentifyText(request); - Assert.assertNotNull(response); - Assert.assertEquals("hello [REDACTED]", response.getProcessedText()); - Assert.assertEquals(2, response.getWordCount()); - Assert.assertEquals(16, response.getCharCount()); + controller.deidentifyString(DeidentifyStringRequest.builder().text(" ").configurationId("cfg").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInDeidentifyString.getMessage(), e.getMessage()); } } - // ─── deidentifyText — API error path ────────────────────────────────────── - @Test - public void testDeidentifyTextApiError() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 403; - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Forbidden", expectedStatusCode, "access denied")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - + public void reidentifyStringValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyString(ReidentifyStringRequest.builder().text(" ").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidTextInReidentifyString.getMessage(), e.getMessage()); } } + /** + * Null credentials would make the SDK fall back to SKYFLOW_CREDENTIALS from the environment or a + * .env file, which CI provides, so the outcome would depend on the machine. An explicitly empty + * {@link Credentials} is rejected by validation the same way everywhere, before any network call. + */ @Test - public void testDeidentifyTextApiError500() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 500; - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "server error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("some text").build(); - + public void missingCredentialsSurfaceAsSkyflowExceptionWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyString(ReidentifyStringRequest.builder().text("[NAME_1]").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } - @Test - public void testDeidentifyTextApiClientException() throws Exception { - // Network-level failure (no HTTP response), as opposed to ApiClientApiException's - // rejected-with-a-status-code failure above. - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - when(mockStringsClient.deidentifyString(any(), any())) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("hello world").build(); - - try { - controller.deidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); - } + /** Credentials with no path, string, token or API key set. */ + private static Credentials emptyCredentials() { + return new Credentials(); } - // ─── reidentifyText — validation ────────────────────────────────────────── - - @Test - public void testNullTextInRequestInReidentifyStringMethod() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInReIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); - } + /** API-key credentials resolve without a token exchange, so the only network call is the Detect request. */ + private static Credentials apiKeyCredentials() { + Credentials credentials = new Credentials(); + credentials.setApiKey("sky-abcde-0123456789abcdef0123456789abcdef"); + return credentials; } - @Test - public void testEmptyTextInRequestInReidentifyStringMethod() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidTextInReIdentify.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); - Assert.assertNull(e.getRequestId()); - Assert.assertNull(e.getGrpcCode()); - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); - } + private static DetectController controllerFor(MockWebServer server) { + VaultConfig config = vaultConfig("vault-1"); + DetectController controller = new DetectController(config, apiKeyCredentials(), server.url("").toString()); + controller.setCommonHttpConfig(null, 0, null, null); + return controller; } - // ─── reidentifyText — happy path ────────────────────────────────────────── - - @Test - public void testReidentifyTextHappyPath() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - IdentifyResponse fakeResponse = IdentifyResponse.builder().text("original text").build(); - when(mockStringsClient.reidentifyString(any(), any())).thenReturn(fakeResponse); + // ─── Detect V2 methods, exercised through the skyvault controller ────────── + // These prove the skyvault wiring (cluster-derived vault URL, API-key credentials, + // skyvault SDK metrics header) end to end, not just the shared base logic. - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("tokenized text").build(); + private static final String API_KEY = "sky-abcde-0123456789abcdef0123456789abcdef"; - try { - ReidentifyTextResponse response = controller.reidentifyText(request); - Assert.assertNotNull(response); - Assert.assertEquals("original text", response.getProcessedText()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); - } + private static void assertCommonHeaders(RecordedRequest recorded, String method, String path) { + Assert.assertEquals(method, recorded.getMethod()); + Assert.assertEquals(path, recorded.getPath()); + Assert.assertEquals("Bearer " + API_KEY, recorded.getHeader("Authorization")); + String metrics = recorded.getHeader("sky-metadata"); + Assert.assertNotNull(metrics); + Assert.assertTrue(metrics, metrics.contains("skyflow-java@")); } - // ─── reidentifyText — API error path ────────────────────────────────────── - @Test - public void testReidentifyTextApiError() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 401; - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Unauthorized", expectedStatusCode, "unauthorized body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void deidentifyStringRoundTripWithStoredConfiguration() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"processedText\":\"My name is [NAME_1].\"," + + "\"entities\":[{\"token\":\"NAME_1\",\"value\":\"John Doe\",\"entityType\":\"NAME\"," + + "\"location\":{\"startIndex\":11,\"endIndex\":19,\"startIndexProcessed\":11,\"endIndexProcessed\":19}," + + "\"entityScores\":{\"NAME\":0.98}}]," + + "\"metrics\":{\"wordCount\":4,\"characterCount\":20}}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("My name is John Doe.").configurationId("cfg-123").build()); + + Assert.assertEquals("My name is [NAME_1].", response.getProcessedText()); + Assert.assertEquals(1, response.getEntities().size()); + Assert.assertEquals("NAME_1", response.getEntities().get(0).getToken()); + Assert.assertEquals("John Doe", response.getEntities().get(0).getValue()); + Assert.assertEquals("NAME", response.getEntities().get(0).getEntityType()); + Assert.assertEquals(Integer.valueOf(11), response.getEntities().get(0).getLocation().getStartIndex()); + Assert.assertEquals(Integer.valueOf(19), response.getEntities().get(0).getLocation().getEndIndexProcessed()); + Assert.assertEquals(0.98, response.getEntities().get(0).getEntityScores().get("NAME"), 1e-9); + Assert.assertEquals(Integer.valueOf(4), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is John Doe.\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-123\"")); + Assert.assertFalse(body, body.contains("\"configuration\":")); + } finally { + server.shutdown(); } } @Test - public void testReidentifyTextApiError500() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - int expectedStatusCode = 500; - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "server error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void deidentifyStringRoundTripWithInlineConfigurationScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"processedText\":\"[NAME_1]\"}")); + + DeidentifyStringResponse response = controllerFor(server).deidentifyString(DeidentifyStringRequest.builder() + .text("John") + .configuration(DetectConfiguration.builder() + .detect(Detect.builder().entities(Collections.singletonList( + Entity.builder().entityType(EntityType.NAME) + .deidentificationType(DeidentificationType.VAULT_TOKEN) + .destination("names").build())).build()) + .build()) + .build()); + + Assert.assertEquals("[NAME_1]", response.getProcessedText()); + Assert.assertTrue(response.getEntities().isEmpty()); + Assert.assertNull(response.getMetrics()); + + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"configuration\":{")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); // injected by the controller + Assert.assertTrue(body, body.contains("\"entityType\":\"NAME\"")); + Assert.assertTrue(body, body.contains("\"deidentificationType\":\"VAULT_TOKEN\"")); + Assert.assertTrue(body, body.contains("\"destination\":\"names\"")); + Assert.assertFalse(body, body.contains("configurationId")); + } finally { + server.shutdown(); } } @Test - public void testReidentifyTextApiClientException() throws Exception { - StringsClient mockStringsClient = Mockito.mock(StringsClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.strings()).thenReturn(mockStringsClient); - - when(mockStringsClient.reidentifyString(any(), any())) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - ReidentifyTextRequest request = ReidentifyTextRequest.builder().text("some text").build(); - + public void reidentifyStringRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.reidentifyText(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"processedText\":\"My name is J**n D*e.\",\"metrics\":{\"wordCount\":5}}")); + + ReidentifyStringResponse response = controllerFor(server).reidentifyString(ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals("My name is J**n D*e.", response.getProcessedText()); + Assert.assertEquals(Integer.valueOf(5), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/reidentify/string"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"My name is [NAME_1].\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); } } - // ─── getDetectRun — validation ──────────────────────────────────────────── - @Test - public void testNullRunIdInGetDetectRunRequest() { + public void getRunRoundTripQueriesByIdScopedToVault() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId(null).build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"UERG\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}]," + + "\"metrics\":{\"pages\":3}}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); + + DetectController controller = controllerFor(server); + GetRunResponse done = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); + Assert.assertEquals("run-42", done.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, done.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, done.getOutputType()); + Assert.assertEquals("UERG", done.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REDACTED_FILE", done.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.PDF, done.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), done.getMetrics().getPages()); + Assert.assertNull(done.getMessage()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "GET", "/v2/detect/runs/run-42?vaultId=vault-1"); + Assert.assertEquals(0L, recorded.getBodySize()); + + GetRunResponse failed = controller.getRun(GetRunRequest.builder().runId("run-43").build()); + Assert.assertEquals(DetectRunStatus.FAILED, failed.getStatus()); + Assert.assertEquals("unsupported file", failed.getMessage()); + Assert.assertTrue(failed.getOutput().isEmpty()); + Assert.assertNull(failed.getOutputType()); + Assert.assertEquals("/v2/detect/runs/run-43?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); } } @Test - public void testEmptyRunIdInGetDetectRunRequest() { + public void checkGuardrailsRoundTrip() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("").build(); - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(HttpStatus.BAD_REQUEST.getHttpStatus(), e.getHttpStatus()); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"tell me about politics\",\"validation\":\"FAILED\",\"toxic\":false,\"deniedTopic\":true}")); + server.enqueue(new MockResponse().setResponseCode(200) + .setBody("{\"text\":\"hello\",\"validation\":\"PASSED\"}")); + + DetectController controller = controllerFor(server); + CheckGuardrailsResponse blocked = controller.checkGuardrails(CheckGuardrailsRequest.builder() + .text("tell me about politics").checkToxicity(true).denyTopics(Arrays.asList("politics", "religion")).build()); + Assert.assertEquals("tell me about politics", blocked.getText()); + Assert.assertEquals(GuardrailsValidation.FAILED, blocked.getValidation()); + Assert.assertEquals(Boolean.FALSE, blocked.getToxic()); + Assert.assertEquals(Boolean.TRUE, blocked.getDeniedTopic()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/guardrails"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"text\":\"tell me about politics\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"checkToxicity\":true")); + Assert.assertTrue(body, body.contains("\"denyTopics\":[\"politics\",\"religion\"]")); + + CheckGuardrailsResponse passed = controller.checkGuardrails(CheckGuardrailsRequest.builder().text("hello").build()); + Assert.assertEquals(GuardrailsValidation.PASSED, passed.getValidation()); + Assert.assertNull(passed.getToxic()); + Assert.assertNull(passed.getDeniedTopic()); + String minimal = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(minimal, minimal.contains("checkToxicity")); + Assert.assertFalse(minimal, minimal.contains("denyTopics")); + } finally { + server.shutdown(); } } - // ─── getDetectRun — happy path (no output list) ─────────────────────────── - @Test - public void testGetDetectRunHappyPathNoOutput() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(10.5f) - .duration(1.2f) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-123").build(); - + public void apiErrorsOnInheritedMethodsMapToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals("run-123", response.getRunId()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(404).setHeader("x-request-id", "req-404") + .setBody("{\"error\":{\"grpc_code\":5,\"http_code\":404,\"message\":\"run not found\",\"http_status\":\"Not Found\",\"details\":[]}}")); + try { + controllerFor(server).getRun(GetRunRequest.builder().runId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("run not found", e.getMessage()); + Assert.assertEquals("req-404", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(5), e.getGrpcCode()); + } + } finally { + server.shutdown(); } } - // ─── getDetectRun — API error path ──────────────────────────────────────── - - @Test - public void testGetDetectRunApiError() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - int expectedStatusCode = 404; - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientApiException("Not Found", expectedStatusCode, "run not found")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-999").build(); - - try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + // ─── reidentifyFile (shared, inherited from BaseDetectController) ───────── + + @Test + public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); + ReidentifyFileRequest[] bad = { + null, + ReidentifyFileRequest.builder().value("Zm9v").build(), + ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), + }; + BaseErrorMessage[] expected = { + BaseErrorMessage.ReidentifyFileRequestNull, + BaseErrorMessage.InvalidDataSourceInReidentifyFile, + BaseErrorMessage.InvalidValueInReidentifyFile, + }; + for (int i = 0; i < bad.length; i++) { + try { + controller.reidentifyFile(bad[i]); + Assert.fail("expected SkyflowException for case " + i); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(expected[i].getMessage(), e.getMessage()); + } } } @Test - public void testGetDetectRunApiClientException() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-abc").build(); - + public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertTrue(e.getCause() instanceof ApiClientException); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); } } @Test - public void testDeidentifyFilePollingApiClientException() throws Exception { - // Covers pollForResults' own catch(ApiClientException) — the network-error path hit while - // polling getRun, as opposed to the request-time ApiClientApiException covered elsewhere - // (see the sibling ApiClientApiException test above). deidentifyFile's own - // catch (Exception ex) around the pollForResults() call re-wraps whatever it throws into a - // fixed PollingForResultsFailed SkyflowException, so that — not the original cause — is - // what actually surfaces here; pollForResults' catch(ApiClientException) still executes - // (and is covered) on the way there. - File tmpFile = File.createTempFile("test-detect", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content for txt".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-123").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenThrow(new ApiClientException("Network error executing HTTP request")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - + public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.PollingForResultsFailed.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setHeader("Content-Type", "application/json") + .setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"SGVsbG8=\",\"processedFileType\":\"REIDENTIFIED_FILE\"," + + "\"processedFileExtension\":\"txt\"}]," + + "\"metrics\":{\"size\":0.5,\"wordCount\":3,\"characterCount\":12}}")); + + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64) + .value("W05BTUVfMV0=") + .dataFormat(FileDataFormat.TXT) + .redactionLevel(Arrays.asList( + RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + .build()); + + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(1, response.getOutput().size()); + Assert.assertEquals("SGVsbG8=", response.getOutput().get(0).getProcessedFile()); + Assert.assertEquals("REIDENTIFIED_FILE", response.getOutput().get(0).getProcessedFileType()); + Assert.assertEquals(FileDataFormat.TXT, response.getOutput().get(0).getProcessedFileExtension()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + + RecordedRequest recorded = server.takeRequest(); + Assert.assertEquals("POST", recorded.getMethod()); + Assert.assertEquals("/v2/detect/reidentify/file", recorded.getPath()); + Assert.assertEquals("Bearer sky-abcde-0123456789abcdef0123456789abcdef", recorded.getHeader("Authorization")); + Assert.assertNotNull(recorded.getHeader("sky-metadata")); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"W05BTUVfMV0=\"")); + Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); + Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + } finally { + server.shutdown(); } } - // ─── helpers ───────────────────────────────────────────────────────────── - - private static DetectRunsResponse buildSuccessDetectRunsResponse() { - return DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f) - .duration(0.5f) - .build(); - } - - private DeidentifyFileResponse runDeidentifyFileForExtension( - String extension, FilesClient mockFilesClient) throws Exception { - return runDeidentifyFileForExtension(extension, mockFilesClient, null); - } - - private DeidentifyFileResponse runDeidentifyFileForExtension( - String extension, FilesClient mockFilesClient, TokenFormat tokenFormat) throws Exception { - File tmpFile = File.createTempFile("test-detect", "." + extension); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), ("content for " + extension).getBytes()); - - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest.DeidentifyFileRequestBuilder builder = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()); - if (tokenFormat != null) { - builder.tokenFormat(tokenFormat); - } - return controller.deidentifyFile(builder.build()); - } - @Test - public void testGetDetectRunApiError500() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - int expectedStatusCode = 500; - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenThrow(new ApiClientApiException("Internal Server Error", expectedStatusCode, "internal error body")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-abc").build(); - + public void reidentifyFileToleratesSparseAndUnknownResponseValues() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.getDetectRun(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(expectedStatusCode, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); + ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").build()); + Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); + Assert.assertNull(response.getOutputType()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertNull(response.getMetrics()); + String body = server.takeRequest().getBody().readUtf8(); + Assert.assertFalse(body, body.contains("dataFormat")); + Assert.assertFalse(body, body.contains("redactionLevel")); + } finally { + server.shutdown(); } } - // ─── deidentifyFile — validation ────────────────────────────────────────── - @Test - public void testDeidentifyFile_nullRequest() { + public void reidentifyFileMapsApiErrors() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - skyflowClient.detect(vaultID).deidentifyFile(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyRequestBody.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-9") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"unsupported format\"," + + "\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() + .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("unsupported format", e.getMessage()); + Assert.assertEquals("req-9", e.getRequestId()); + Assert.assertEquals(Integer.valueOf(3), e.getGrpcCode()); + } + } finally { + server.shutdown(); } } + // ─── deidentifyFile (shared, inherited from BaseDetectController) ───────── + @Test - public void testDeidentifyFile_noFileOrPathProvided() { + public void deidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowException { + DetectController controller = new DetectController(vaultConfig("vault-a"), (Credentials) null); try { - skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).addVaultConfig(vaultConfig).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().build()) - .build(); - skyflowClient.detect(vaultID).deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); + controller.deidentifyFile(DeidentifyFileRequest.builder().value("Zm9v").build()); + Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage(), e.getMessage()); + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(BaseErrorMessage.InvalidDataSourceInDeidentifyFile.getMessage(), e.getMessage()); } } - // ─── deidentifyFile — happy path ────────────────────────────────────────── - - @Test - public void testDeidentifyFile_successWithTxtFileObject() throws Exception { - File tmpFile = File.createTempFile("test-detect", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "hello world".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-txt-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - @Test - public void testDeidentifyFile_successWithFilePath() throws Exception { - File tmpFile = File.createTempFile("test-detect-path", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-path-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().filePath(tmpFile.getAbsolutePath()).build()).build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - @Test - public void testDeidentifyFile_successWithOutputFile() throws Exception { - File tmpFile = File.createTempFile("test-detect-out", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - String b64 = Base64.getEncoder().encodeToString("processed content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(b64) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - DetectRunsResponse successWithOutput = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f).duration(0.5f) - .output(Collections.singletonList(outputItem)) - .build(); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-out-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(successWithOutput); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .outputDirectory(System.getProperty("java.io.tmpdir")) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - // ─── deidentifyFile — IN_PROGRESS timeout ───────────────────────────────── - - @Test - public void testDeidentifyFile_inProgressTimeout() throws Exception { - File tmpFile = File.createTempFile("test-detect-prog", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-prog-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(1) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - Assert.assertEquals("IN_PROGRESS", response.getStatus()); - } - - // ─── deidentifyFile — error paths ───────────────────────────────────────── - @Test - public void testDeidentifyFile_nonExistentFilePath() { + public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().filePath("/nonexistent/path/file.txt").build()) - .build(); - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (Exception e) { - Assert.assertNotNull(e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .configurationId("cfg-1").build()); + + Assert.assertEquals("run-42", response.getRunId()); + Assert.assertNull(response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + + RecordedRequest recorded = server.takeRequest(); + assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/file"); + String body = recorded.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"SKYFLOW_ID\"")); + Assert.assertTrue(body, body.contains("\"value\":\"rec-1\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"pdf\"")); + Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-1\"")); + Assert.assertEquals("only the submit call was made", 1, server.getRequestCount()); + } finally { + server.shutdown(); } } @Test - public void testDeidentifyFile_processFileApiError() throws Exception { - File tmpFile = File.createTempFile("test-detect-err", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())) - .thenThrow(new ApiClientApiException("forbidden", 403, "access denied")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); + public void deidentifyFilePollsToSuccessAndWritesOutputsForLocalFile() throws Exception { + File input = folder.newFile("invoice.txt"); + Files.write(input.toPath(), "Pay John Doe".getBytes("UTF-8")); + File outDir = folder.newFolder("out"); + String redacted = Base64.getEncoder().encodeToString("Pay [NAME_1]".getBytes("UTF-8")); + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(403, e.getHttpCode()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-7\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"QUEUED\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\"," + + "\"output\":[{\"processedFile\":\"" + redacted + "\",\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"txt\"}," + + "{\"processedFile\":\"W10=\",\"processedFileType\":\"ENTITIES\",\"processedFileExtension\":\"json\"}]," + + "\"metrics\":{\"wordCount\":3}}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .file(input).configurationId("cfg-1") + .pollOptions(PollOptions.builder().waitTime(1).build()) // one real 1 s sleep at most + .outputDirectory(outDir.getPath()) + .build()); + + Assert.assertEquals("run-7", response.getRunId()); + Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); + Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(2, response.getOutput().size()); + Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); + Assert.assertEquals("Pay [NAME_1]", new String(Files.readAllBytes(new File(outDir, "processed-invoice.txt").toPath()), "UTF-8")); + Assert.assertEquals("[]", new String(Files.readAllBytes(new File(outDir, "processed-entities-invoice.json").toPath()), "UTF-8")); + + RecordedRequest submit = server.takeRequest(); + assertCommonHeaders(submit, "POST", "/v2/detect/deidentify/file"); + String body = submit.getBody().readUtf8(); + Assert.assertTrue(body, body.contains("\"dataSource\":\"BASE64\"")); + Assert.assertTrue(body, body.contains("\"value\":\"" + Base64.getEncoder().encodeToString("Pay John Doe".getBytes("UTF-8")) + "\"")); + Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + Assert.assertEquals("/v2/detect/runs/run-7?vaultId=vault-1", server.takeRequest().getPath()); + } finally { + server.shutdown(); } } @Test - public void testDeidentifyFile_pollForResultsApiError() throws Exception { - File tmpFile = File.createTempFile("test-detect-poll", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-poll-err").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenThrow(new ApiClientApiException("unavailable", 503, "service unavailable")); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()).build(); - + public void deidentifyFileReturnsRunIdWithStatusWhenBudgetRunsOut() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - controller.deidentifyFile(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorMessage.PollingForResultsFailed.getMessage(), e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-8\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); + + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v") + .pollOptions(PollOptions.builder().maxAttempts(1).build()).build()); + + Assert.assertEquals("run-8", response.getRunId()); + Assert.assertEquals(DetectRunStatus.IN_PROGRESS, response.getStatus()); + Assert.assertTrue(response.getOutput().isEmpty()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); } } - // ─── processFileByType — all extensions ─────────────────────────────────── - - @Test - public void testDeidentifyFile_pdfExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPdf(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-pdf").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("pdf", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_mp3Extension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyAudio(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-mp3").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("mp3", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_jpgExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyImage(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-jpg").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("jpg", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_pptExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPresentation(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-ppt").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("ppt", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_csvExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifySpreadsheet(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-csv").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("csv", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_docExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyDocument(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-doc").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("doc", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_jsonExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyStructuredText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-json").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("json", mockFilesClient)); - } - - @Test - public void testDeidentifyFile_defaultExtension() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyFile(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-dcm").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("dcm", mockFilesClient)); - } - - // ─── parseDeidentifyFileResponse — wordCharacterCount branch L272-273 ───── - @Test - public void testGetDetectRun_withWordCharacterCount() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder().build(); - WordCharacterCount wordCharCount = WordCharacterCount.builder() - .wordCount(10) - .characterCount(55) - .build(); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(5.0f) - .duration(0.5f) - .output(Collections.singletonList(outputItem)) - .wordCharacterCount(wordCharCount) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-wc-001").build(); - + public void deidentifyFileSurfacesFailedRunMessage() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals(10, (int) response.getWordCount()); - Assert.assertEquals(55, (int) response.getCharCount()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); - } - } - - // ─── deidentifyFile — processedFile present, no outputDirectory (lines 146, 168) ─── - - @Test - public void testDeidentifyFile_successWithProcessedFileNoOutputDir() throws Exception { - File tmpFile = File.createTempFile("test-detect-nodir", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - String b64 = Base64.getEncoder().encodeToString("processed content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(b64) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - DetectRunsResponse successWithOutput = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f).duration(0.5f) - .output(Collections.singletonList(outputItem)) - .build(); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-nodir-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(successWithOutput); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // no outputDirectory → file written via new File(outputFileName) (line 146) - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } - - // ─── pollForResults — IN_PROGRESS retry then SUCCESS (lines 218-229) ───────── - - @Test - public void testDeidentifyFile_inProgressThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-retry", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-retry-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // waitTime=2: first poll IN_PROGRESS → sleeps 1s → second poll SUCCESS - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(2) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - Assert.assertFalse("IN_PROGRESS".equals(response.getStatus())); - } - - // ─── pollForResults — IN_PROGRESS retry (else branch, lines 225-226) ──────── - - @Test - public void testDeidentifyFile_inProgressElseBranchThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-else", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-else-001").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().status(DetectRunsResponseStatus.IN_PROGRESS).build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - // waitTime=3: currentWaitTime=1, nextWaitTime=2 < 3 → else branch (L225-226), sleep 2s - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .waitTime(3) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-9\"}")); + server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); - // ─── parseDeidentifyFileResponse — processedFile present branch L283-291 ── + DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); - @Test - public void testGetDetectRun_withProcessedFile() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - - String base64Content = Base64.getEncoder().encodeToString("test file content".getBytes()); - DeidentifiedFileOutput outputItem = DeidentifiedFileOutput.builder() - .processedFile(base64Content) - .processedFileExtension(DeidentifiedFileOutputProcessedFileExtension.TXT) - .build(); - - DetectRunsResponse fakeRunsResponse = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .outputType(DetectRunsResponseOutputType.BASE_64) - .size(1.0f) - .duration(0.1f) - .output(Collections.singletonList(outputItem)) - .build(); - - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class))) - .thenReturn(fakeRunsResponse); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - GetDetectRunRequest request = GetDetectRunRequest.builder().runId("run-file-001").build(); - - try { - DeidentifyFileResponse response = controller.getDetectRun(request); - Assert.assertNotNull(response); - Assert.assertEquals("run-file-001", response.getRunId()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN + ": " + e.getMessage()); + Assert.assertEquals(DetectRunStatus.FAILED, response.getStatus()); + Assert.assertEquals("unsupported file", response.getMessage()); + Assert.assertEquals(2, server.getRequestCount()); + } finally { + server.shutdown(); } } - // ─── entityUniqueCounter branches in VaultClient request builders ───────── - - private static TokenFormat buildEntityUniqueCounterTokenFormat() { - return TokenFormat.builder() - .entityUniqueCounter(java.util.Collections.singletonList(DetectEntities.EMAIL_ADDRESS)) - .build(); - } - - @Test - public void testDeidentifyFile_txt_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-txt").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("txt", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_mp3_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyAudio(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-mp3").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("mp3", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_pdf_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyPdf(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-pdf").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("pdf", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_jpg_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyImage(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-jpg").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("jpg", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_csv_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifySpreadsheet(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-csv").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("csv", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - @Test - public void testDeidentifyFile_dcm_withEntityUniqueCounter() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - when(mockFilesClient.deidentifyFile(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-euc-dcm").build()); - Assert.assertNotNull(runDeidentifyFileForExtension("dcm", mockFilesClient, buildEntityUniqueCounterTokenFormat())); - } - - // --- unsupported file extension must throw SkyflowException, not IllegalArgumentException --- - @Test - public void testDeidentifyFile_unsupportedExtensionThrowsSkyflowException() throws Exception { - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); + public void deidentifyFileSubmitErrorMapsToSkyflowException() throws Exception { + MockWebServer server = new MockWebServer(); + server.start(); try { - runDeidentifyFileForExtension("xyz", mockFilesClient); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertNotNull(e.getMessage()); + server.enqueue(new MockResponse().setResponseCode(400).setHeader("x-request-id", "req-1") + .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\",\"http_status\":\"Bad Request\",\"details\":[]}}")); + try { + controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("Zm9v").configurationId("missing").build()); + Assert.fail("expected SkyflowException"); + } catch (SkyflowException e) { + Assert.assertEquals(400, e.getHttpCode()); + Assert.assertEquals("configuration not found", e.getMessage()); + Assert.assertEquals("req-1", e.getRequestId()); + } + } finally { + server.shutdown(); } } - - // --- getEntities — output present but empty list must return empty list, not throw --- - - @Test - public void testGetEntities_emptyOutputListReturnsEmptyList() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.SUCCESS) - .output(Collections.emptyList()) - .build(); - - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getEntities", DetectRunsResponse.class); - method.setAccessible(true); - java.util.List result = (java.util.List) method.invoke(null, response); - - Assert.assertNotNull(result); - Assert.assertTrue("entities should be empty when output list is empty", result.isEmpty()); - } - - // --- parseDeidentifyFileResponse — FAILED run with absent optional fields must not throw --- - - @Test - public void testParseDeidentifyFileResponse_failedRunWithAbsentFieldsDoesNotThrow() throws Exception { - DetectRunsResponse response = DetectRunsResponse.builder() - .status(DetectRunsResponseStatus.FAILED) - .build(); - - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod( - "parseDeidentifyFileResponse", DetectRunsResponse.class, String.class, String.class); - method.setAccessible(true); - DeidentifyFileResponse result = (DeidentifyFileResponse) method.invoke( - null, response, "run-failed-001", DetectRunsResponseStatus.FAILED.toString()); - - Assert.assertNotNull(result); - Assert.assertEquals("run-failed-001", result.getRunId()); - } - - // --- getBaseFileName — filename with no extension must not throw StringIndexOutOfBoundsException --- - - @Test - public void testGetBaseFileName_withExtensionStripsIt() throws Exception { - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getBaseFileName", String.class); - method.setAccessible(true); - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - String result = (String) method.invoke(controller, "photo.png"); - Assert.assertEquals("photo", result); - } - - @Test - public void testGetBaseFileName_withoutExtensionReturnsWholeName() throws Exception { - java.lang.reflect.Method method = DetectController.class.getDeclaredMethod("getBaseFileName", String.class); - method.setAccessible(true); - DetectController controller = createDetectControllerWithMock(Mockito.mock(ApiClient.class)); - String result = (String) method.invoke(controller, "noextension"); - Assert.assertEquals("noextension", result); - } - - // --- pollForResults — one poll response with absent status must not throw; loop continues --- - - @Test - public void testDeidentifyFile_pollAbsentStatusThenSuccess() throws Exception { - File tmpFile = File.createTempFile("test-detect-absentstatus", ".txt"); - tmpFile.deleteOnExit(); - Files.write(tmpFile.toPath(), "content".getBytes()); - - FilesClient mockFilesClient = Mockito.mock(FilesClient.class); - ApiClient mockApiClient = Mockito.mock(ApiClient.class); - when(mockApiClient.files()).thenReturn(mockFilesClient); - when(mockFilesClient.deidentifyText(any())).thenReturn( - com.skyflow.generated.rest.types.DeidentifyFileResponse.builder().runId("run-absent-status").build()); - when(mockFilesClient.getRun(anyString(), any(GetRunRequest.class), any(RequestOptions.class))) - .thenReturn(DetectRunsResponse.builder().build()) - .thenReturn(buildSuccessDetectRunsResponse()); - - DetectController controller = createDetectControllerWithMock(mockApiClient); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(FileInput.builder().file(tmpFile).build()) - .build(); - - DeidentifyFileResponse response = controller.deidentifyFile(request); - Assert.assertNotNull(response); - } } diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java deleted file mode 100644 index 99442682..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.enums.DetectOutputTranscriptions; -import com.skyflow.enums.MaskingMethod; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; - -public class DeidentifyFileRequestTest { - - @Test - public void testBuilderAndGetters() { - File file = new File("test.txt"); - FileInput fileInput = FileInput.builder().file(file).build(); - DetectEntities entity = DetectEntities.DOB; - MaskingMethod maskingMethod = MaskingMethod.BLACKBOX; - DetectOutputTranscriptions transcription = DetectOutputTranscriptions.TRANSCRIPTION; - String outputDir = "/tmp/output"; - int waitTime = 42; - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Arrays.asList(entity)) - .allowRegexList(Arrays.asList("a.*")) - .restrictRegexList(Arrays.asList("b.*")) - .maskingMethod(maskingMethod) - .outputProcessedImage(true) - .outputOcrText(true) - .outputProcessedAudio(true) - .outputTranscription(transcription) - .outputDirectory(outputDir) - .waitTime(waitTime) - .build(); - - Assert.assertEquals(entity, request.getEntities().get(0)); - Assert.assertEquals("a.*", request.getAllowRegexList().get(0)); - Assert.assertEquals("b.*", request.getRestrictRegexList().get(0)); - Assert.assertEquals(maskingMethod, request.getMaskingMethod()); - Assert.assertTrue(request.getOutputProcessedImage()); - Assert.assertTrue(request.getOutputOcrText()); - Assert.assertTrue(request.getOutputProcessedAudio()); - Assert.assertEquals(transcription, request.getOutputTranscription()); - Assert.assertEquals(outputDir, request.getOutputDirectory()); - Assert.assertEquals(Integer.valueOf(waitTime), request.getWaitTime()); - } - - @Test - public void testBuilderDefaults() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder().build(); - Assert.assertFalse(request.getOutputProcessedImage()); - Assert.assertFalse(request.getOutputOcrText()); - Assert.assertFalse(request.getOutputProcessedAudio()); - Assert.assertNull(request.getOutputDirectory()); - Assert.assertNull(request.getWaitTime()); - } - - @Test - public void testBuilderWithFilePath() { - String filePath = "/tmp/test.txt"; - FileInput fileInput = FileInput.builder().filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertEquals(filePath, request.getFileInput().getFilePath()); - Assert.assertNull(request.getFileInput().getFile()); - } - - @Test - public void testBuilderWithFileAndFilePath() { - File file = new File("test.txt"); - String filePath = "/tmp/test.txt"; - FileInput fileInput = FileInput.builder().file(file).filePath(filePath).build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertEquals(file, request.getFileInput().getFile()); - Assert.assertEquals(filePath, request.getFileInput().getFilePath()); - } - - @Test - public void testBuilderWithNullFileAndFilePath() { - FileInput fileInput = FileInput.builder().build(); - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .file(fileInput) - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - - Assert.assertNull(request.getFileInput().getFile()); - Assert.assertNull(request.getFileInput().getFilePath()); - } - - @Test - public void testValidateDeidentifyFileRequestWithNullFileInputThrowsSkyflowException() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .entities(Collections.singletonList(DetectEntities.DOB)) - .build(); - try { - Validations.validateDeidentifyFileRequest(request); - Assert.fail("Should have thrown an exception"); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.EmptyFileAndFilePathInDeIdentifyFile.getMessage(), e.getMessage()); - } - } - - @Test - public void testBuilderNullBooleansFallToFalse() { - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .outputProcessedImage(null) - .outputOcrText(null) - .outputProcessedAudio(null) - .build(); - Assert.assertFalse(request.getOutputProcessedImage()); - Assert.assertFalse(request.getOutputOcrText()); - Assert.assertFalse(request.getOutputProcessedAudio()); - } - - @Test - public void testBuilderWithTokenFormatTransformationsPixelDensityMaxResolutionBleep() { - TokenFormat tf = TokenFormat.builder().build(); - Transformations tr = new Transformations(null); - AudioBleep bleep = AudioBleep.builder().frequency(800.0).build(); - - DeidentifyFileRequest request = DeidentifyFileRequest.builder() - .tokenFormat(tf) - .transformations(tr) - .pixelDensity(150) - .maxResolution(1920) - .bleep(bleep) - .build(); - - Assert.assertEquals(tf, request.getTokenFormat()); - Assert.assertEquals(tr, request.getTransformations()); - Assert.assertEquals(150, request.getPixelDensity().intValue()); - Assert.assertEquals(1920, request.getMaxResolution().intValue()); - Assert.assertEquals(bleep, request.getBleep()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java deleted file mode 100644 index d3946719..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.util.Collections; - -public class DeidentifyFileResponseTest { - - @Test - public void testAllGettersAndToString() { - File fileObject = new File("test-path.txt"); - String file = "test-path.txt"; - String type = "pdf"; - String extension = ".pdf"; - Integer wordCount = 100; - Integer charCount = 500; - Float sizeInKb = 123.45F; - Float durationInSeconds = 12.3F; - Integer pageCount = 5; - Integer slideCount = 0; - FileEntityInfo entityInfo = new FileEntityInfo("PERSON", DeidentifiedFileOutputProcessedFileType.ENTITIES, DeidentifiedFileOutputProcessedFileExtension.PDF); - java.util.List entities = Collections.singletonList(entityInfo); - String runId = "run-123"; - String status = "SUCCESS"; - FileInfo fileInfo = new FileInfo(fileObject); - - DeidentifyFileResponse response = new DeidentifyFileResponse( - fileInfo, file, type, extension, wordCount, charCount, sizeInKb, - durationInSeconds, pageCount, slideCount, entities, runId, status - ); - - Assert.assertEquals(type, response.getType()); - Assert.assertEquals(extension, response.getExtension()); - Assert.assertEquals(wordCount, response.getWordCount()); - Assert.assertEquals(charCount, response.getCharCount()); - Assert.assertEquals(sizeInKb, response.getSizeInKb()); - Assert.assertEquals(durationInSeconds, response.getDurationInSeconds()); - Assert.assertEquals(pageCount, response.getPageCount()); - Assert.assertEquals(slideCount, response.getSlideCount()); - Assert.assertEquals(entities, response.getEntities()); - Assert.assertEquals(runId, response.getRunId()); - Assert.assertEquals(status, response.getStatus()); - - // toString should return a JSON string containing all fields - String json = response.toString(); - Assert.assertTrue(json.contains(file)); - Assert.assertTrue(json.contains(type)); - Assert.assertTrue(json.contains(extension)); - Assert.assertTrue(json.contains(runId)); - Assert.assertTrue(json.contains(status)); - Assert.assertTrue(json.contains("PERSON")); - Assert.assertEquals(fileInfo, response.getFile()); - Assert.assertEquals(file, response.getFileBase64()); - } - - @Test - public void testShortConstructorAndGetters() { - DeidentifyFileResponse response = new DeidentifyFileResponse("run-456", "PENDING"); - Assert.assertEquals("run-456", response.getRunId()); - Assert.assertEquals("PENDING", response.getStatus()); - Assert.assertNull(response.getFile()); - Assert.assertNull(response.getFileBase64()); - Assert.assertNull(response.getWordCount()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java b/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java deleted file mode 100644 index 193a898e..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static com.skyflow.errors.ErrorMessage.InvalidTextInDeIdentify; - -public class DeidentifyTextTests { - - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - - private static final String text = "Sensitive data to deidentify"; - private static final List detectEntities = new ArrayList<>(); - private static final List allowRegexList = new ArrayList<>(); - private static final List restrictRegexList = new ArrayList<>(); - private static final TokenFormat tokenFormat = TokenFormat.builder() - .vaultToken(detectEntities) - .entityUniqueCounter(detectEntities) - .entityOnly(detectEntities) - .build(); - - private static Transformations transformations = null; - - - @BeforeClass - public static void setup() { - detectEntities.add(DetectEntities.NAME); - detectEntities.add(DetectEntities.DOB); - - allowRegexList.add("^[A-Za-z]+$"); - restrictRegexList.add("([0-9]{3}-[0-9]{2}-[0-9]{4})"); - - transformations = new Transformations( - new DateTransformation(20, 5, detectEntities) - ); - } - - - @Test - public void testValidInputInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(transformations) - .build(); - - Validations.validateDeidentifyTextRequest(request); - Assert.assertEquals(detectEntities, request.getEntities()); - Assert.assertEquals(allowRegexList, request.getAllowRegexList()); - Assert.assertEquals(restrictRegexList, request.getRestrictRegexList()); - Assert.assertEquals(tokenFormat, request.getTokenFormat()); - Assert.assertEquals(transformations, request.getTransformations()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - - @Test - public void testNullRequestInDeidentifyTextRequestValidations() { - try { - Validations.validateDeidentifyTextRequest(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.DeidentifyTextRequestNull.getMessage(), e.getMessage()); - } - } - - @Test - public void testNullTextInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text(null).build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInDeIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyTextInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInDeIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyEntitiesInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - - @Test - public void testNoEntitiesInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder().text("").build(); - Validations.validateDeidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testEmptyAllowRegexListInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .allowRegexList(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getAllowRegexList().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testEmptyRestrictRegexListInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .restrictRegexList(new ArrayList<>()) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertTrue(request.getRestrictRegexList().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testNullTokenFormatInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(null) - .build(); - Validations.validateDeidentifyTextRequest(request); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testNoTransformationsInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertNull(request.getTransformations()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testNullOrEmptyTransformationsInDeidentifyTextRequestValidations() { - try { - DeidentifyTextRequest request = DeidentifyTextRequest.builder() - .text(text) - .entities(detectEntities) - .allowRegexList(allowRegexList) - .restrictRegexList(restrictRegexList) - .tokenFormat(tokenFormat) - .transformations(null) - .build(); - Validations.validateDeidentifyTextRequest(request); - Assert.assertNull(request.getTransformations()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testDeidentifyResponse() { - try { - List entityInfos = new ArrayList<>(); - int wordCount = 5; - int charCount = 30; - DeidentifyTextResponse response = new DeidentifyTextResponse(text, entityInfos, wordCount, charCount); - Assert.assertEquals(text, response.getProcessedText()); - Assert.assertEquals(wordCount, response.getWordCount()); - Assert.assertEquals(charCount, response.getCharCount()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testDeidentifyResponseGetEntitiesAndToString() { - TextIndex ti = new TextIndex(0, 4); - TextIndex pi = new TextIndex(5, 9); - java.util.Map scores = new java.util.HashMap<>(); - scores.put("confidence", 0.95); - EntityInfo ei = new EntityInfo("tok1", "John", ti, pi, "NAME", scores); - - List entities = new ArrayList<>(); - entities.add(ei); - - DeidentifyTextResponse response = new DeidentifyTextResponse(text, entities, 1, 10); - Assert.assertEquals(entities, response.getEntities()); - String json = response.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains(text)); - } - - @Test - public void testTextIndex() { - TextIndex ti = new TextIndex(3, 7); - Assert.assertEquals(3, ti.getStart()); - Assert.assertEquals(7, ti.getEnd()); - String json = ti.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains("3")); - } - - @Test - public void testEntityInfoGetters() { - TextIndex ti = new TextIndex(0, 4); - TextIndex pi = new TextIndex(5, 9); - java.util.Map scores = new java.util.HashMap<>(); - scores.put("confidence", 0.9); - EntityInfo ei = new EntityInfo("tok1", "Alice", ti, pi, "NAME", scores); - Assert.assertEquals("tok1", ei.getToken()); - Assert.assertEquals("Alice", ei.getValue()); - Assert.assertEquals(ti, ei.getTextIndex()); - Assert.assertEquals(pi, ei.getProcessedIndex()); - Assert.assertEquals("NAME", ei.getEntity()); - Assert.assertEquals(scores, ei.getScores()); - } - - @Test - public void testTokenFormatGetters() { - TokenFormat tf = TokenFormat.builder() - .vaultToken(detectEntities) - .entityUniqueCounter(detectEntities) - .entityOnly(detectEntities) - .build(); - Assert.assertEquals(detectEntities, tf.getVaultToken()); - Assert.assertEquals(detectEntities, tf.getEntityUniqueCounter()); - Assert.assertEquals(detectEntities, tf.getEntityOnly()); - Assert.assertNotNull(tf.getDefault()); - } - - @Test - public void testTokenFormatDefaultTypeNull() { - TokenFormat tf = TokenFormat.builder().defaultType(null).build(); - Assert.assertEquals(com.skyflow.enums.TokenType.ENTITY_UNIQUE_COUNTER, tf.getDefault()); - } - - @Test - public void testTokenFormatDefaultTypeNonNull() { - TokenFormat tf = TokenFormat.builder() - .defaultType(com.skyflow.enums.TokenType.VAULT_TOKEN) - .build(); - Assert.assertEquals(com.skyflow.enums.TokenType.VAULT_TOKEN, tf.getDefault()); - } -} diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java deleted file mode 100644 index d77ddb6f..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileExtension; -import com.skyflow.generated.rest.types.DeidentifiedFileOutputProcessedFileType; -import org.junit.Assert; -import org.junit.Test; - -public class FileEntityInfoTest { - - @Test - public void testConstructorAndGetters() { - String file = "entity.pdf"; - DeidentifiedFileOutputProcessedFileType type = DeidentifiedFileOutputProcessedFileType.ENTITIES; - String extension = "pdf"; - - FileEntityInfo info = new FileEntityInfo(file, type, DeidentifiedFileOutputProcessedFileExtension.PDF); - - Assert.assertEquals(file, info.getFile()); - Assert.assertEquals(type.toString(), info.getType()); - Assert.assertEquals(extension, info.getExtension()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java b/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java deleted file mode 100644 index 29a81f6a..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/FileInfoTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.skyflow.vault.detect; - -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; - -public class FileInfoTest { - - @Test - public void testFileInfoFields() throws IOException { - // Create a temp file - File tempFile = File.createTempFile("testfileinfo", ".txt"); - tempFile.deleteOnExit(); - - // Write some content to ensure size > 0 - FileWriter writer = new FileWriter(tempFile); - writer.write("Hello Skyflow!"); - writer.close(); - - FileInfo fileInfo = new FileInfo(tempFile); - - Assert.assertEquals(tempFile.getName(), fileInfo.getName()); - Assert.assertEquals(tempFile.length(), fileInfo.getSize()); - Assert.assertEquals("", fileInfo.getType()); - Assert.assertEquals(tempFile.lastModified(), fileInfo.getLastModified()); - } - - @Test - public void testFileInfoWithNonExistentFile() { - File fakeFile = new File("nonexistentfile.txt"); - FileInfo fileInfo = new FileInfo(fakeFile); - - Assert.assertEquals("nonexistentfile.txt", fileInfo.getName()); - Assert.assertEquals(0, fileInfo.getSize()); - Assert.assertEquals("", fileInfo.getType()); - Assert.assertEquals(0, fileInfo.getLastModified()); - } -} \ No newline at end of file diff --git a/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java b/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java deleted file mode 100644 index 8ed9716a..00000000 --- a/skyvault/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.skyflow.vault.detect; - -import com.skyflow.enums.DetectEntities; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static com.skyflow.errors.ErrorMessage.InvalidTextInReIdentify; - -public class ReidentifyTextTests { - - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - - private static final String text = "Sensitive data to reidentify"; - private static final List redactedEntities = new ArrayList<>(); - private static final List maskedEntities = new ArrayList<>(); - private static final List plainTextEntities = new ArrayList<>(); - - @BeforeClass - public static void setup() { - redactedEntities.add(DetectEntities.NAME); - redactedEntities.add(DetectEntities.DOB); - - maskedEntities.add(DetectEntities.USERNAME); - - plainTextEntities.add(DetectEntities.PHONE_NUMBER); - } - - @Test - public void testValidInputInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .redactedEntities(redactedEntities) - .maskedEntities(maskedEntities) - .plainTextEntities(plainTextEntities) - .build(); - - Validations.validateReidentifyTextRequest(request); - Assert.assertEquals(text, request.getText()); - Assert.assertEquals(redactedEntities, request.getRedactedEntities()); - Assert.assertEquals(maskedEntities, request.getMaskedEntities()); - Assert.assertEquals(plainTextEntities, request.getPlainTextEntities()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testNullRequestInReidentifyTextRequestValidations() { - try { - Validations.validateReidentifyTextRequest(null); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.ReidentifyTextRequestNull.getMessage(), e.getMessage()); - } - } - - @Test - public void testNoTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder().build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testNullTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(null) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInReIdentify.getMessage(), e.getMessage()); - } - } - - @Test - public void testEmptyTextInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text("") - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(InvalidTextInReIdentify.getMessage(), e.getMessage()); - } - } - - - @Test - public void testEmptyRedactedEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .redactedEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getRedactedEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testEmptyMaskedEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .maskedEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getMaskedEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - @Test - public void testEmptyPlainTextEntitiesInReidentifyTextRequestValidations() { - try { - ReidentifyTextRequest request = ReidentifyTextRequest.builder() - .text(text) - .plainTextEntities(new ArrayList<>()) - .build(); - Validations.validateReidentifyTextRequest(request); - Assert.assertTrue(request.getPlainTextEntities().isEmpty()); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - } - } - - - @Test - public void testReidentifyResponse() { - try { - ReidentifyTextResponse response = new ReidentifyTextResponse(text); - Assert.assertEquals(text, response.getProcessedText()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testReidentifyResponseToString() { - ReidentifyTextResponse response = new ReidentifyTextResponse(text); - String json = response.toString(); - Assert.assertNotNull(json); - Assert.assertTrue(json.contains(text)); - } -} \ No newline at end of file From b1f2d6062a3445b666d9e73697d3340e99a93428 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:21:08 +0530 Subject: [PATCH 15/41] SK-3175 fix ci check --- .../java/com/skyflow/utils/UtilsTests.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java b/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java index d1e1c725..7ac13ec7 100644 --- a/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java +++ b/skyvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -76,8 +76,12 @@ public void testGetMetrics() { @Test public void testGetMetricsWithException() { + // Clearing System Properties explicitly to throw exception. They are restored afterwards: the JDK's + // socket layer reads os.name on first use, and a null value breaks every later test that opens a socket. + String osName = System.getProperty("os.name"); + String osVersion = System.getProperty("os.version"); + String javaVersion = System.getProperty("java.version"); try { - // Clearing System Properties explicitly to throw exception System.clearProperty("os.name"); System.clearProperty("os.version"); System.clearProperty("java.version"); @@ -89,6 +93,18 @@ public void testGetMetricsWithException() { Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS).getAsString().isEmpty()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); + } finally { + restoreProperty("os.name", osName); + restoreProperty("os.version", osVersion); + restoreProperty("java.version", javaVersion); + } + } + + private static void restoreProperty(String key, String value) { + if (value == null) { + System.clearProperty(key); + } else { + System.setProperty(key, value); } } } From 92b5b16a0d28f04bb005f31abdb003e8f3863de3 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 13:50:33 +0530 Subject: [PATCH 16/41] SK-3175 updated skyvault generated code --- .../com/skyflow/generated/rest/ApiClient.java | 60 +- .../generated/rest/ApiClientBuilder.java | 238 ++- .../generated/rest/AsyncApiClient.java | 61 +- .../generated/rest/AsyncApiClientBuilder.java | 238 ++- .../generated/rest/AsyncRawApiClient.java | 110 ++ .../skyflow/generated/rest/RawApiClient.java | 90 + .../rest/core/ApiClientApiException.java | 7 +- .../rest/core/ApiClientHttpResponse.java | 3 +- .../generated/rest/core/ClientOptions.java | 165 +- .../generated/rest/core/ConsoleLogger.java | 52 + .../rest/core/DateTimeDeserializer.java | 22 +- .../generated/rest/core/DoubleSerializer.java | 43 + .../generated/rest/core/Environment.java | 5 +- .../generated/rest/core/FileStream.java | 5 +- .../skyflow/generated/rest/core/ILogger.java | 38 + .../rest/core/InputStreamRequestBody.java | 14 +- .../generated/rest/core/LogConfig.java | 98 + .../skyflow/generated/rest/core/LogLevel.java | 36 + .../skyflow/generated/rest/core/Logger.java | 97 + .../rest/core/LoggingInterceptor.java | 104 ++ .../rest/core/NullableNonemptyFilter.java | 5 +- .../generated/rest/core/ObjectMappers.java | 11 +- .../rest/core/QueryStringMapper.java | 7 +- .../generated/rest/core/RequestOptions.java | 59 +- .../rest/core/ResponseBodyInputStream.java | 3 +- .../rest/core/ResponseBodyReader.java | 3 +- .../ResponseDecompressionInterceptor.java | 56 + .../generated/rest/core/RetryInterceptor.java | 195 +- .../core/Rfc2822DateTimeDeserializer.java | 25 + .../skyflow/generated/rest/core/SseEvent.java | 114 ++ .../generated/rest/core/SseEventParser.java | 228 +++ .../skyflow/generated/rest/core/Stream.java | 510 +++++- .../generated/rest/core/WrappedAlias.java | 8 + .../rest/errors/BadRequestError.java | 11 +- .../generated/rest/errors/ForbiddenError.java | 33 + .../rest/errors/InternalServerError.java | 2 +- .../generated/rest/errors/NotFoundError.java | 11 +- .../rest/errors/TooManyRequestsError.java | 33 + .../rest/errors/UnauthorizedError.java | 11 +- .../rest/requests/PatchV2VaultsIdRequest.java | 69 + .../resources/audit/AsyncAuditClient.java | 46 - .../resources/audit/AsyncRawAuditClient.java | 284 --- .../rest/resources/audit/AuditClient.java | 44 - .../rest/resources/audit/RawAuditClient.java | 267 --- .../AuditServiceListAuditEventsRequest.java | 1579 ----------------- ...AuditEventsRequestFilterOpsActionType.java | 56 - ...entsRequestFilterOpsContextAccessType.java | 28 - ...ventsRequestFilterOpsContextActorType.java | 26 - ...EventsRequestFilterOpsContextAuthMode.java | 28 - ...ditEventsRequestFilterOpsResourceType.java | 80 - ...eListAuditEventsRequestSortOpsOrderBy.java | 24 - .../binlookup/AsyncBinLookupClient.java | 53 - .../binlookup/AsyncRawBinLookupClient.java | 105 -- .../resources/binlookup/BinLookupClient.java | 50 - .../binlookup/RawBinLookupClient.java | 87 - .../binlookup/requests/V1BinListRequest.java | 180 -- .../resources/files/AsyncFilesClient.java | 185 +- .../resources/files/AsyncRawFilesClient.java | 993 +---------- .../rest/resources/files/FilesClient.java | 175 +- .../rest/resources/files/RawFilesClient.java | 782 +------- ...entifyFileAudioRequestDeidentifyAudio.java | 663 ------- ...fyFileDocumentPdfRequestDeidentifyPdf.java | 479 ----- ...entifyFileImageRequestDeidentifyImage.java | 524 ------ .../files/requests/DeidentifyFileRequest.java | 385 ---- ...identifyFileRequestDeidentifyDocument.java | 387 ---- ...tifyFileRequestDeidentifyPresentation.java | 388 ---- ...ntifyFileRequestDeidentifySpreadsheet.java | 388 ---- ...fyFileRequestDeidentifyStructuredText.java | 389 ---- .../DeidentifyFileRequestDeidentifyText.java | 386 ---- .../files/requests/FileDeleteRequest.java | 191 ++ .../files/requests/FileUploadRequest.java | 191 ++ .../files/requests/GetRunRequest.java | 90 - .../ReidentifyFileRequestReidentifyFile.java | 166 -- .../requests/UploadFileRequestV2.java} | 136 +- ...RequestDeidentifyAudioEntityTypesItem.java | 160 -- ...estDeidentifyAudioOutputTranscription.java | 28 - ...dfRequestDeidentifyPdfEntityTypesItem.java | 160 -- ...RequestDeidentifyImageEntityTypesItem.java | 160 -- ...geRequestDeidentifyImageMaskingMethod.java | 24 - ...uestDeidentifyDocumentEntityTypesItem.java | 160 -- ...DeidentifyPresentationEntityTypesItem.java | 160 -- ...tDeidentifySpreadsheetEntityTypesItem.java | 160 -- ...identifyStructuredTextEntityTypesItem.java | 160 -- ...eRequestDeidentifyTextEntityTypesItem.java | 160 -- .../DeidentifyFileRequestEntityTypesItem.java | 160 -- .../guardrails/AsyncGuardrailsClient.java | 44 - .../guardrails/AsyncRawGuardrailsClient.java | 114 -- .../guardrails/GuardrailsClient.java | 41 - .../guardrails/RawGuardrailsClient.java | 91 - .../requests/DetectGuardrailsRequest.java | 228 --- .../resources/query/AsyncQueryClient.java | 29 +- .../resources/query/AsyncRawQueryClient.java | 109 +- .../rest/resources/query/QueryClient.java | 26 +- .../rest/resources/query/RawQueryClient.java | 94 +- .../query/requests/ExecuteQueryRequest.java | 160 ++ .../query/requests/GetQueryRequest.java | 128 ++ .../QueryServiceExecuteQueryBody.java | 96 - .../records/AsyncRawRecordsClient.java | 967 +++++----- .../resources/records/AsyncRecordsClient.java | 264 +-- .../resources/records/RawRecordsClient.java | 831 ++++----- .../rest/resources/records/RecordsClient.java | 252 +-- .../requests/BatchOperationRequest.java | 153 ++ ...Body.java => BulkDeleteRecordRequest.java} | 48 +- .../records/requests/DeleteRecordRequest.java | 69 + .../records/requests/DeleteRequest.java | 263 +++ .../FileServiceUploadFileRequest.java | 96 - ...Request.java => GetRecordByIdRequest.java} | 116 +- ...ordRequest.java => GetRecordsRequest.java} | 166 +- .../records/requests/GetRequest.java | 499 ++++++ ...cordBody.java => InsertRecordRequest.java} | 101 +- .../records/requests/InsertRequest.java | 260 +++ .../RecordServiceBatchOperationBody.java | 151 -- ...cordBody.java => UpdateRecordRequest.java} | 75 +- .../records/requests/UpdateRequest.java | 273 +++ .../types/GetRecordByIdRequestRedaction.java | 108 ++ .../types/GetRecordsRequestOrderBy.java | 95 + .../types/GetRecordsRequestRedaction.java | 106 ++ .../types/InsertRecordRequestByot.java | 95 + ...ordServiceBulkGetRecordRequestOrderBy.java | 26 - ...dServiceBulkGetRecordRequestRedaction.java | 28 - ...ecordServiceGetRecordRequestRedaction.java | 28 - .../types/UpdateRecordRequestByot.java | 95 + .../types/UpdateRequestUpdateType.java | 84 + .../strings/AsyncRawStringsClient.java | 210 --- .../resources/strings/AsyncStringsClient.java | 68 - .../resources/strings/RawStringsClient.java | 166 -- .../rest/resources/strings/StringsClient.java | 64 - .../requests/DeidentifyStringRequest.java | 394 ---- .../requests/ReidentifyStringRequest.java | 151 -- ...eidentifyStringRequestEntityTypesItem.java | 160 -- .../tokens/AsyncRawTokensClient.java | 194 +- .../resources/tokens/AsyncTokensClient.java | 52 +- .../resources/tokens/RawTokensClient.java | 164 +- .../rest/resources/tokens/TokensClient.java | 48 +- .../tokens/requests/DeleteTokenRequest.java | 189 ++ ...izePayload.java => DetokenizePayload.java} | 77 +- .../tokens/requests/DetokenizeRequest.java | 238 +++ .../requests/GetTokensFromValuesRequest.java | 191 ++ .../tokens/requests/TokenizePayload.java | 124 ++ .../tokens/requests/TokenizeRequest.java | 191 ++ .../tokens/requests/V1TokenizePayload.java | 95 - .../types/AuditEventAuditResourceType.java | 80 - .../rest/types/AuditEventContext.java | 435 ----- .../generated/rest/types/AuditEventData.java | 96 - .../rest/types/AuditEventHttpInfo.java | 125 -- ...ponse.java => BatchOperationResponse.java} | 51 +- .../generated/rest/types/BatchRecord.java | 594 +++++++ .../rest/types/BatchRecordMethod.java | 93 +- .../rest/types/BatchRecordRedaction.java | 103 ++ ...nse.java => BulkDeleteRecordResponse.java} | 47 +- .../rest/types/BulkGetRecordResponse.java | 112 ++ .../rest/types/ColumnRedactions.java | 160 ++ .../rest/types/ContextAccessType.java | 26 - .../generated/rest/types/ContextAuthMode.java | 28 - .../rest/types/DeidentifiedFileOutput.java | 160 -- ...ifiedFileOutputProcessedFileExtension.java | 60 - ...identifiedFileOutputProcessedFileType.java | 34 - .../rest/types/DeidentifyFileResponse.java | 96 - .../rest/types/DeidentifyStringResponse.java | 186 -- ...esponse.java => DeleteRecordResponse.java} | 41 +- .../generated/rest/types/DeleteResponse.java | 122 ++ .../rest/types/DeleteResponseObject.java | 204 +++ .../rest/types/DeleteTokenResponse.java | 122 ++ .../rest/types/DeleteTokenResponseObject.java | 171 ++ .../rest/types/DetectGuardrailsResponse.java | 231 --- .../DetectGuardrailsResponseValidation.java | 24 - .../rest/types/DetectRunsResponse.java | 348 ---- .../types/DetectRunsResponseOutputType.java | 24 - .../rest/types/DetectRunsResponseStatus.java | 28 - .../rest/types/DetokenizeRecordRequest.java | 174 ++ .../DetokenizeRecordRequestRedaction.java | 108 ++ ...nse.java => DetokenizeRecordResponse.java} | 47 +- .../DetokenizeRecordResponseValueType.java | 153 +- .../rest/types/DetokenizeResponse.java | 113 ++ .../rest/types/DetokenizeResponseObject.java | 335 ++++ .../generated/rest/types/ErrorResponse.java | 38 +- .../rest/types/ErrorResponseError.java | 57 +- .../types/ExecuteQueryRecordResponse.java | 111 ++ .../rest/types/ExecuteQueryResponse.java | 137 ++ .../types/ExecuteQueryResponseMetadata.java | 112 ++ ...{V1FieldRecords.java => FieldRecords.java} | 41 +- .../generated/rest/types/FileData.java | 140 -- .../rest/types/FileDataDataFormat.java | 62 - .../rest/types/FileDataDeidentifyAudio.java | 141 -- .../FileDataDeidentifyAudioDataFormat.java | 24 - .../types/FileDataDeidentifyDocument.java | 141 -- .../FileDataDeidentifyDocumentDataFormat.java | 26 - .../rest/types/FileDataDeidentifyImage.java | 141 -- .../FileDataDeidentifyImageDataFormat.java | 32 - .../rest/types/FileDataDeidentifyPdf.java | 116 -- .../types/FileDataDeidentifyPresentation.java | 143 -- ...eDataDeidentifyPresentationDataFormat.java | 24 - .../types/FileDataDeidentifySpreadsheet.java | 143 -- ...leDataDeidentifySpreadsheetDataFormat.java | 26 - .../FileDataDeidentifyStructuredText.java | 143 -- ...ataDeidentifyStructuredTextDataFormat.java | 24 - .../rest/types/FileDataDeidentifyText.java | 116 -- .../rest/types/FileDataReidentifyFile.java | 141 -- .../FileDataReidentifyFileDataFormat.java | 36 - .../rest/types/FileDeleteRecord.java | 280 +++ .../rest/types/FileDeleteResponse.java | 122 ++ .../rest/types/FileDeleteResponseObject.java | 295 +++ .../generated/rest/types/FileMetadata.java | 173 ++ .../rest/types/FileUploadColumn.java | 171 ++ .../rest/types/FileUploadRecord.java | 235 +++ .../rest/types/FileUploadResponse.java | 122 ++ .../rest/types/FileUploadResponseObject.java | 286 +++ .../skyflow/generated/rest/types/Format.java | 153 -- .../rest/types/FormatMaskedItem.java | 160 -- .../rest/types/FormatPlaintextItem.java | 160 -- .../rest/types/FormatRedactedItem.java | 160 -- .../generated/rest/types/GetFieldRecords.java | 171 ++ .../rest/types/GetQueryResponse.java | 112 ++ .../generated/rest/types/GetRequestData.java | 324 ++++ .../generated/rest/types/GetResponse.java | 122 ++ .../GetTokensFromValuesRequestObject.java | 151 ++ .../types/GetTokensFromValuesResponse.java | 123 ++ .../rest/types/GoogleProtobufValue.java | 42 + .../generated/rest/types/GooglerpcStatus.java | 135 -- .../rest/types/IdentifyResponse.java | 108 -- .../rest/types/InsertRecordData.java | 176 ++ .../rest/types/InsertRecordResponse.java | 113 ++ .../generated/rest/types/InsertResponse.java | 122 ++ .../generated/rest/types/Locations.java | 188 -- .../generated/rest/types/ProtobufAny.java | 90 - ...perties.java => RecordMetaProperties.java} | 41 +- .../rest/types/RecordResponseObject.java | 448 +++++ .../rest/types/RedactionEnumRedaction.java | 28 - .../rest/types/ReidentifiedFileOutput.java | 160 -- ...ifiedFileOutputProcessedFileExtension.java | 60 - .../rest/types/ReidentifyFileResponse.java | 150 -- .../ReidentifyFileResponseOutputType.java | 24 - .../types/ReidentifyFileResponseStatus.java | 28 - .../rest/types/RequestActionType.java | 56 - .../generated/rest/types/ShiftDates.java | 153 -- .../rest/types/ShiftDatesEntityTypesItem.java | 26 - .../rest/types/StringResponseEntities.java | 212 --- .../rest/types/TokenGroupRedactions.java | 140 ++ .../rest/types/TokenTypeMapping.java | 185 -- .../rest/types/TokenTypeMappingDefault.java | 26 - .../types/TokenTypeMappingEntityOnlyItem.java | 160 -- .../TokenTypeMappingEntityUnqCounterItem.java | 160 -- .../types/TokenTypeMappingVaultTokenItem.java | 160 -- .../rest/types/TokenizeRecordRequest.java | 203 +++ .../rest/types/TokenizeRecordResponse.java | 128 ++ .../rest/types/TokenizeRequestObject.java | 212 +++ .../rest/types/TokenizeResponse.java | 122 ++ .../rest/types/TokenizeResponseObject.java | 321 ++++ .../generated/rest/types/Transformations.java | 90 - .../generated/rest/types/UniqueValue.java | 121 ++ .../rest/types/UpdateRecordData.java | 279 +++ .../types/UpdateRecordDataUpdateType.java | 84 + ...esponse.java => UpdateRecordResponse.java} | 41 +- .../generated/rest/types/UpdateResponse.java | 122 ++ ...esponse.java => UploadFileResponseV2.java} | 65 +- .../skyflow/generated/rest/types/Upsert.java | 154 ++ .../rest/types/UpsertUpdateType.java | 83 + .../rest/types/V1AuditAfterOptions.java | 125 -- .../rest/types/V1AuditEventResponse.java | 182 -- .../generated/rest/types/V1AuditResponse.java | 118 -- .../rest/types/V1AuditResponseEvent.java | 229 --- .../types/V1AuditResponseEventRequest.java | 330 ---- .../generated/rest/types/V1BatchRecord.java | 377 ---- .../rest/types/V1BinListResponse.java | 93 - .../rest/types/V1BulkGetRecordResponse.java | 93 - .../skyflow/generated/rest/types/V1Byot.java | 26 - .../skyflow/generated/rest/types/V1Card.java | 357 ---- .../rest/types/V1DeleteFileResponse.java | 125 -- .../rest/types/V1DetokenizeRecordRequest.java | 121 -- .../rest/types/V1DetokenizeResponse.java | 94 - .../rest/types/V1FileAvScanStatus.java | 38 - .../rest/types/V1GetAuthTokenResponse.java | 125 -- .../types/V1GetFileScanStatusResponse.java | 91 - .../rest/types/V1GetQueryResponse.java | 93 - .../rest/types/V1InsertRecordResponse.java | 94 - .../generated/rest/types/V1MemberType.java | 26 - .../rest/types/V1TokenizeRecordRequest.java | 125 -- .../rest/types/V1TokenizeRecordResponse.java | 96 - .../rest/types/V1TokenizeResponse.java | 94 - .../rest/types/V1VaultFieldMapping.java | 158 -- .../rest/types/V1VaultSchemaConfig.java | 150 -- .../rest/types/WordCharacterCount.java | 125 -- 282 files changed, 17197 insertions(+), 25062 deletions(-) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/{records/requests/UploadFileV2Request.java => files/requests/UploadFileRequestV2.java} (60%) delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceBulkDeleteRecordBody.java => BulkDeleteRecordRequest.java} (60%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceGetRecordRequest.java => GetRecordByIdRequest.java} (57%) rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceBulkGetRecordRequest.java => GetRecordsRequest.java} (59%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceInsertRecordBody.java => InsertRecordRequest.java} (63%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/{RecordServiceUpdateRecordBody.java => UpdateRecordRequest.java} (58%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java rename skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/{V1DetokenizePayload.java => DetokenizePayload.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1BatchOperationResponse.java => BatchOperationResponse.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1BulkDeleteRecordResponse.java => BulkDeleteRecordResponse.java} (61%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1DeleteRecordResponse.java => DeleteRecordResponse.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1DetokenizeRecordResponse.java => DetokenizeRecordResponse.java} (75%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1FieldRecords.java => FieldRecords.java} (73%) delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1RecordMetaProperties.java => RecordMetaProperties.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{V1UpdateRecordResponse.java => UpdateRecordResponse.java} (70%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java rename skyvault/src/main/java/com/skyflow/generated/rest/types/{UploadFileV2Response.java => UploadFileResponseV2.java} (53%) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java delete mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java index ab81f443..e59a5e6f 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClient.java @@ -4,24 +4,20 @@ package com.skyflow.generated.rest; import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.core.Suppliers; -import com.skyflow.generated.rest.resources.audit.AuditClient; -import com.skyflow.generated.rest.resources.binlookup.BinLookupClient; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; import com.skyflow.generated.rest.resources.files.FilesClient; -import com.skyflow.generated.rest.resources.guardrails.GuardrailsClient; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.strings.StringsClient; import com.skyflow.generated.rest.resources.tokens.TokensClient; - +import java.util.Optional; import java.util.function.Supplier; -public class ApiClient { +public class ApiClient implements AutoCloseable { protected final ClientOptions clientOptions; - protected final Supplier auditClient; - - protected final Supplier binLookupClient; + private final RawApiClient rawClient; protected final Supplier recordsClient; @@ -31,28 +27,37 @@ public class ApiClient { protected final Supplier filesClient; - protected final Supplier stringsClient; - - protected final Supplier guardrailsClient; - public ApiClient(ClientOptions clientOptions) { this.clientOptions = clientOptions; - this.auditClient = Suppliers.memoize(() -> new AuditClient(clientOptions)); - this.binLookupClient = Suppliers.memoize(() -> new BinLookupClient(clientOptions)); + this.rawClient = new RawApiClient(clientOptions); this.recordsClient = Suppliers.memoize(() -> new RecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new TokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new QueryClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new FilesClient(clientOptions)); - this.stringsClient = Suppliers.memoize(() -> new StringsClient(clientOptions)); - this.guardrailsClient = Suppliers.memoize(() -> new GuardrailsClient(clientOptions)); } - public AuditClient audit() { - return this.auditClient.get(); + /** + * Get responses with HTTP metadata like headers + */ + public RawApiClient withRawResponse() { + return this.rawClient; + } + + public void patchV2VaultsId(Optional vaultId) { + this.rawClient.patchV2VaultsId(vaultId).body(); } - public BinLookupClient binLookup() { - return this.binLookupClient.get(); + public void patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, requestOptions).body(); + } + + public void patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + this.rawClient.patchV2VaultsId(vaultId, request).body(); + } + + public void patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).body(); } public RecordsClient records() { @@ -71,12 +76,13 @@ public FilesClient files() { return this.filesClient.get(); } - public StringsClient strings() { - return this.stringsClient.get(); - } - - public GuardrailsClient guardrails() { - return this.guardrailsClient.get(); + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); } public static ApiClientBuilder builder() { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java index 4f8f5f78..18cee274 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java @@ -5,15 +5,35 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Environment; +import com.skyflow.generated.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import okhttp3.OkHttpClient; -public final class ApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); +public class ApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); private String token = null; private Environment environment = Environment.PRODUCTION; + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String identifier; + /** * Sets token */ @@ -36,7 +56,7 @@ public ApiClientBuilder url(String url) { * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ public ApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); + this.timeout = Optional.of(timeout); return this; } @@ -44,7 +64,31 @@ public ApiClientBuilder timeout(int timeout) { * Sets the maximum number of retries for the client. Defaults to 2 retries. */ public ApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public ApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public ApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public ApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); return this; } @@ -52,13 +96,191 @@ public ApiClientBuilder maxRetries(int maxRetries) { * Sets the underlying OkHttp client */ public ApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public ApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public ApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public ApiClientBuilder identifier(String identifier) { + this.identifier = identifier; return this; } + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.identifier != null) { + String _identifier = this.identifier != null ? this.identifier : "{{vault_uri}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis-preview.com"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{identifier}", _identifier)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *

{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + public ApiClient build() { - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new ApiClient(clientOptionsBuilder.build()); + validateConfiguration(); + return new ApiClient(buildClientOptions()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java index dc57df06..cb5c6188 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java @@ -4,24 +4,21 @@ package com.skyflow.generated.rest; import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.core.Suppliers; -import com.skyflow.generated.rest.resources.audit.AsyncAuditClient; -import com.skyflow.generated.rest.resources.binlookup.AsyncBinLookupClient; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; import com.skyflow.generated.rest.resources.files.AsyncFilesClient; -import com.skyflow.generated.rest.resources.guardrails.AsyncGuardrailsClient; import com.skyflow.generated.rest.resources.query.AsyncQueryClient; import com.skyflow.generated.rest.resources.records.AsyncRecordsClient; -import com.skyflow.generated.rest.resources.strings.AsyncStringsClient; import com.skyflow.generated.rest.resources.tokens.AsyncTokensClient; - +import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.function.Supplier; -public class AsyncApiClient { +public class AsyncApiClient implements AutoCloseable { protected final ClientOptions clientOptions; - protected final Supplier auditClient; - - protected final Supplier binLookupClient; + private final AsyncRawApiClient rawClient; protected final Supplier recordsClient; @@ -31,28 +28,37 @@ public class AsyncApiClient { protected final Supplier filesClient; - protected final Supplier stringsClient; - - protected final Supplier guardrailsClient; - public AsyncApiClient(ClientOptions clientOptions) { this.clientOptions = clientOptions; - this.auditClient = Suppliers.memoize(() -> new AsyncAuditClient(clientOptions)); - this.binLookupClient = Suppliers.memoize(() -> new AsyncBinLookupClient(clientOptions)); + this.rawClient = new AsyncRawApiClient(clientOptions); this.recordsClient = Suppliers.memoize(() -> new AsyncRecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new AsyncTokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new AsyncQueryClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new AsyncFilesClient(clientOptions)); - this.stringsClient = Suppliers.memoize(() -> new AsyncStringsClient(clientOptions)); - this.guardrailsClient = Suppliers.memoize(() -> new AsyncGuardrailsClient(clientOptions)); } - public AsyncAuditClient audit() { - return this.auditClient.get(); + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawApiClient withRawResponse() { + return this.rawClient; + } + + public CompletableFuture patchV2VaultsId(Optional vaultId) { + return this.rawClient.patchV2VaultsId(vaultId).thenApply(response -> response.body()); } - public AsyncBinLookupClient binLookup() { - return this.binLookupClient.get(); + public CompletableFuture patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return this.rawClient.patchV2VaultsId(vaultId, request).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).thenApply(response -> response.body()); } public AsyncRecordsClient records() { @@ -71,12 +77,13 @@ public AsyncFilesClient files() { return this.filesClient.get(); } - public AsyncStringsClient strings() { - return this.stringsClient.get(); - } - - public AsyncGuardrailsClient guardrails() { - return this.guardrailsClient.get(); + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); } public static AsyncApiClientBuilder builder() { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java index 55a1c518..76fd8d42 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java @@ -5,15 +5,35 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Environment; +import com.skyflow.generated.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import okhttp3.OkHttpClient; -public final class AsyncApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); +public class AsyncApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); private String token = null; private Environment environment = Environment.PRODUCTION; + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String identifier; + /** * Sets token */ @@ -36,7 +56,7 @@ public AsyncApiClientBuilder url(String url) { * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. */ public AsyncApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); + this.timeout = Optional.of(timeout); return this; } @@ -44,7 +64,31 @@ public AsyncApiClientBuilder timeout(int timeout) { * Sets the maximum number of retries for the client. Defaults to 2 retries. */ public AsyncApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public AsyncApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public AsyncApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public AsyncApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); return this; } @@ -52,13 +96,191 @@ public AsyncApiClientBuilder maxRetries(int maxRetries) { * Sets the underlying OkHttp client */ public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public AsyncApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public AsyncApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public AsyncApiClientBuilder identifier(String identifier) { + this.identifier = identifier; return this; } + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.identifier != null) { + String _identifier = this.identifier != null ? this.identifier : "{{vault_uri}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis.com"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{identifier}.vault.skyflowapis-preview.com"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{identifier}", _identifier)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + public AsyncApiClient build() { - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new AsyncApiClient(clientOptionsBuilder.build()); + validateConfiguration(); + return new AsyncApiClient(buildClientOptions()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java new file mode 100644 index 00000000..da58025b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/AsyncRawApiClient.java @@ -0,0 +1,110 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawApiClient { + protected final ClientOptions clientOptions; + + public AsyncRawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public CompletableFuture> patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + 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 ApiClientHttpResponse<>(null, response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java new file mode 100644 index 00000000..a39d00ca --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/RawApiClient.java @@ -0,0 +1,90 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawApiClient { + protected final ClientOptions clientOptions; + + public RawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public ApiClientHttpResponse patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + 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 ApiClientHttpResponse<>(null, response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java index be5247eb..c016a435 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java @@ -3,12 +3,11 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.Response; /** * This exception type will be thrown for any non-2XX API responses. @@ -68,7 +67,7 @@ public Map> headers() { @Override public String toString() { - return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + body - + "}"; + return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + + ObjectMappers.stringify(body) + "}"; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java index c743352c..9c81f1f5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java @@ -3,12 +3,11 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.Response; public final class ApiClientHttpResponse { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java index da41fb25..3f3a7dc6 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java @@ -3,13 +3,12 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.OkHttpClient; - import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import okhttp3.OkHttpClient; public final class ClientOptions { private final Environment environment; @@ -20,14 +19,32 @@ public final class ClientOptions { private final OkHttpClient httpClient; + private final boolean ownsHttpClient; + private final int timeout; + private final int maxRetries; + + private final Optional initialRetryDelayMillis; + + private final Optional maxRetryDelayMillis; + + private final Optional retryJitterFactor; + + private final Optional logging; + private ClientOptions( Environment environment, Map headers, Map> headerSuppliers, OkHttpClient httpClient, - int timeout) { + boolean ownsHttpClient, + int timeout, + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional retryJitterFactor, + Optional logging) { this.environment = environment; this.headers = new HashMap<>(); this.headers.putAll(headers); @@ -35,12 +52,18 @@ private ClientOptions( { put("X-Fern-Language", "JAVA"); put("X-Fern-SDK-Name", "com.skyflow.fern:api-sdk"); - put("X-Fern-SDK-Version", "0.0.385"); + put("X-Fern-SDK-Version", "0.0.98"); } }); this.headerSuppliers = headerSuppliers; this.httpClient = httpClient; + this.ownsHttpClient = ownsHttpClient; this.timeout = timeout; + this.maxRetries = maxRetries; + this.initialRetryDelayMillis = initialRetryDelayMillis; + this.maxRetryDelayMillis = maxRetryDelayMillis; + this.retryJitterFactor = retryJitterFactor; + this.logging = logging; } public Environment environment() { @@ -82,11 +105,50 @@ public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { .build(); } + public int maxRetries() { + return this.maxRetries; + } + + public Optional initialRetryDelayMillis() { + return this.initialRetryDelayMillis; + } + + public Optional maxRetryDelayMillis() { + return this.maxRetryDelayMillis; + } + + public Optional retryJitterFactor() { + return this.retryJitterFactor; + } + + /** + * Releases resources owned by this client. Only shuts down the underlying OkHttpClient's + * dispatcher executor and evicts its connection pool when this client created that + * OkHttpClient itself; an OkHttpClient supplied via httpClient is left running, since the + * caller owns its lifecycle. + *

+ * In-flight calls are not cancelled or awaited, and any request issued after this method + * returns fails with a {@code RejectedExecutionException}. Options derived from this one via + * {@code Builder.from(...)} share the same dispatcher and connection pool, so closing either + * releases them for both. Calling this method more than once has no further effect. + */ + public void close() { + if (!this.ownsHttpClient) { + return; + } + this.httpClient.dispatcher().executorService().shutdown(); + this.httpClient.connectionPool().evictAll(); + } + + public Optional logging() { + return this.logging; + } + public static Builder builder() { return new Builder(); } - public static final class Builder { + public static class Builder { private Environment environment; private final Map headers = new HashMap<>(); @@ -95,17 +157,29 @@ public static final class Builder { private int maxRetries = 2; + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + private Optional timeout = Optional.empty(); private OkHttpClient httpClient = null; + private boolean ownsHttpClient = true; + + private Optional logging = Optional.empty(); + public Builder environment(Environment environment) { this.environment = environment; return this; } public Builder addHeader(String key, String value) { - this.headers.put(key, value); + if (value != null) { + this.headers.put(key, value); + } return this; } @@ -138,8 +212,45 @@ public Builder maxRetries(int maxRetries) { return this; } + /** + * Override the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public Builder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Override the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public Builder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Override the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public Builder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); + return this; + } + + /** + * Sets the underlying OkHttp client. The caller retains ownership of its lifecycle: + * close() will not shut down its dispatcher executor or evict its connection pool. + */ public Builder httpClient(OkHttpClient httpClient) { this.httpClient = httpClient; + this.ownsHttpClient = httpClient == null; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public Builder logging(LogConfig logging) { + this.logging = Optional.of(logging); return this; } @@ -159,13 +270,51 @@ public ClientOptions build() { .connectTimeout(0, TimeUnit.SECONDS) .writeTimeout(0, TimeUnit.SECONDS) .readTimeout(0, TimeUnit.SECONDS) - .addInterceptor(new RetryInterceptor(this.maxRetries)); + .addInterceptor(new RetryInterceptor( + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor)); } + Logger logger = Logger.from(this.logging); + httpClientBuilder.addInterceptor(new LoggingInterceptor(logger)); + httpClientBuilder.addInterceptor(new ResponseDecompressionInterceptor()); + this.httpClient = httpClientBuilder.build(); this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); - return new ClientOptions(environment, headers, headerSuppliers, httpClient, this.timeout.get()); + return new ClientOptions( + environment, + headers, + headerSuppliers, + httpClient, + this.ownsHttpClient, + this.timeout.get(), + this.maxRetries, + this.initialRetryDelayMillis, + this.maxRetryDelayMillis, + this.retryJitterFactor, + this.logging); + } + + /** + * Create a new Builder initialized with values from an existing ClientOptions + */ + public static Builder from(ClientOptions clientOptions) { + Builder builder = new Builder(); + builder.environment = clientOptions.environment(); + builder.timeout = Optional.of(clientOptions.timeout(null)); + builder.httpClient = clientOptions.httpClient(); + builder.ownsHttpClient = clientOptions.ownsHttpClient; + builder.headers.putAll(clientOptions.headers); + builder.headerSuppliers.putAll(clientOptions.headerSuppliers); + builder.maxRetries = clientOptions.maxRetries(); + builder.initialRetryDelayMillis = clientOptions.initialRetryDelayMillis(); + builder.maxRetryDelayMillis = clientOptions.maxRetryDelayMillis(); + builder.retryJitterFactor = clientOptions.retryJitterFactor(); + builder.logging = clientOptions.logging(); + return builder; } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java new file mode 100644 index 00000000..d3786dcc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ConsoleLogger.java @@ -0,0 +1,52 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.logging.Level; + +/** + * Default logger implementation that writes to the console using {@link java.util.logging.Logger}. + * + *

Uses the "fern" logger name with a simple format of "LEVEL - message". + */ +public final class ConsoleLogger implements ILogger { + + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger("fern"); + + static { + if (logger.getHandlers().length == 0) { + java.util.logging.ConsoleHandler handler = new java.util.logging.ConsoleHandler(); + handler.setFormatter(new java.util.logging.SimpleFormatter() { + @Override + public String format(java.util.logging.LogRecord record) { + return record.getLevel() + " - " + record.getMessage() + System.lineSeparator(); + } + }); + handler.setLevel(Level.ALL); + logger.addHandler(handler); + logger.setUseParentHandlers(false); + logger.setLevel(Level.ALL); + } + } + + @Override + public void debug(String message) { + logger.log(Level.FINE, message); + } + + @Override + public void info(String message) { + logger.log(Level.INFO, message); + } + + @Override + public void warn(String message) { + logger.log(Level.WARNING, message); + } + + @Override + public void error(String message) { + logger.log(Level.SEVERE, message); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java index a0a6d7c4..0f422bc2 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java @@ -8,18 +8,19 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; - import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQueries; /** - * Custom deserializer that handles converting ISO8601 dates into {@link OffsetDateTime} objects. + * Custom deserializer that handles converting date-time strings into {@link OffsetDateTime} objects. + * Supports ISO 8601 format, space-separated variants, and RFC 1123 (RFC 2822) format. */ class DateTimeDeserializer extends JsonDeserializer { private static final SimpleModule MODULE; @@ -43,8 +44,21 @@ public OffsetDateTime deserialize(JsonParser parser, DeserializationContext cont if (token == JsonToken.VALUE_NUMBER_INT) { return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); } else { - TemporalAccessor temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( - parser.getValueAsString(), OffsetDateTime::from, LocalDateTime::from); + String value = parser.getValueAsString(); + TemporalAccessor temporal; + try { + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest(value, OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e) { + try { + // Fall back to space-separated format (e.g. "2025-02-15 10:30:00+00:00"). + temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( + value.replace(' ', 'T'), OffsetDateTime::from, LocalDateTime::from); + } catch (DateTimeParseException e2) { + // Fall back to RFC 1123 format (e.g. "Thu, 07 May 2026 14:23:38 +0000"). + temporal = DateTimeFormatter.RFC_1123_DATE_TIME.parseBest( + value, OffsetDateTime::from, LocalDateTime::from); + } + } if (temporal.query(TemporalQueries.offset()) == null) { return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java new file mode 100644 index 00000000..131d0a9a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/DoubleSerializer.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.module.SimpleModule; +import java.io.IOException; + +/** + * Custom serializer that writes integer-valued doubles without a decimal point. + * For example, {@code 24000.0} is serialized as {@code 24000} instead of {@code 24000.0}. + * Non-integer values like {@code 3.14} are serialized normally. + */ +class DoubleSerializer extends JsonSerializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule() + .addSerializer(Double.class, new DoubleSerializer()) + .addSerializer(double.class, new DoubleSerializer()); + } + + /** + * Gets a module wrapping this serializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value != null && value == Math.floor(value) && !Double.isInfinite(value) && !Double.isNaN(value)) { + gen.writeNumber(value.longValue()); + } else { + gen.writeNumber(value); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java index c0adb233..93e13ce9 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Environment.java @@ -4,9 +4,10 @@ package com.skyflow.generated.rest.core; public final class Environment { - public static final Environment PRODUCTION = new Environment("https://identifier.vault.skyflowapis.com"); + public static final Environment PRODUCTION = new Environment("https://%7B%7Bvault_uri%7D%7D.vault.skyflowapis.com"); - public static final Environment SANDBOX = new Environment("https://identifier.vault.skyflowapis-preview.com"); + public static final Environment SANDBOX = + new Environment("https://%7B%7Bvault_uri%7D%7D.vault.skyflowapis-preview.com"); private final String url; diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java index 2131b0a4..6b459431 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java @@ -3,13 +3,12 @@ */ package com.skyflow.generated.rest.core; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; import org.jetbrains.annotations.Nullable; -import java.io.InputStream; -import java.util.Objects; - /** * Represents a file stream with associated metadata for file uploads. */ diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java new file mode 100644 index 00000000..a70ec8e6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ILogger.java @@ -0,0 +1,38 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Interface for custom logger implementations. + * + *

Implement this interface to provide a custom logging backend for the SDK. + * The SDK will call the appropriate method based on the log level. + * + *

Example: + *

{@code
+ * public class MyCustomLogger implements ILogger {
+ *     public void debug(String message) {
+ *         System.out.println("[DBG] " + message);
+ *     }
+ *     public void info(String message) {
+ *         System.out.println("[INF] " + message);
+ *     }
+ *     public void warn(String message) {
+ *         System.out.println("[WRN] " + message);
+ *     }
+ *     public void error(String message) {
+ *         System.out.println("[ERR] " + message);
+ *     }
+ * }
+ * }
+ */ +public interface ILogger { + void debug(String message); + + void info(String message); + + void warn(String message); + + void error(String message); +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java index 55c3c971..5351a5f8 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java @@ -3,18 +3,16 @@ */ package com.skyflow.generated.rest.core; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; -import okhttp3.internal.Util; import okio.BufferedSink; import okio.Okio; import okio.Source; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; - /** * A custom implementation of OkHttp's RequestBody that wraps an InputStream. * This class allows streaming of data from an InputStream directly to an HTTP request body, @@ -69,12 +67,8 @@ public long contentLength() throws IOException { */ @Override public void writeTo(BufferedSink sink) throws IOException { - Source source = null; - try { - source = Okio.source(inputStream); + try (Source source = Okio.source(inputStream)) { sink.writeAll(source); - } finally { - Util.closeQuietly(Objects.requireNonNull(source)); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java new file mode 100644 index 00000000..7928e097 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogConfig.java @@ -0,0 +1,98 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Configuration for SDK logging. + * + *

Use the builder to configure logging behavior: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Or with a custom logger: + *

{@code
+ * LogConfig config = LogConfig.builder()
+ *     .level(LogLevel.DEBUG)
+ *     .logger(new MyCustomLogger())
+ *     .silent(false)
+ *     .build();
+ * }
+ * + *

Defaults: + *

    + *
  • {@code level} — {@link LogLevel#INFO}
  • + *
  • {@code logger} — {@link ConsoleLogger} (writes to stderr via java.util.logging)
  • + *
  • {@code silent} — {@code true} (no output unless explicitly enabled)
  • + *
+ */ +public final class LogConfig { + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + private LogConfig(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + public LogLevel level() { + return level; + } + + public ILogger logger() { + return logger; + } + + public boolean silent() { + return silent; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private LogLevel level = LogLevel.INFO; + private ILogger logger = new ConsoleLogger(); + private boolean silent = true; + + private Builder() {} + + /** + * Set the minimum log level. Only messages at this level or above will be logged. + * Defaults to {@link LogLevel#INFO}. + */ + public Builder level(LogLevel level) { + this.level = level; + return this; + } + + /** + * Set a custom logger implementation. Defaults to {@link ConsoleLogger}. + */ + public Builder logger(ILogger logger) { + this.logger = logger; + return this; + } + + /** + * Set whether logging is silent (disabled). Defaults to {@code true}. + * Set to {@code false} to enable log output. + */ + public Builder silent(boolean silent) { + this.silent = silent; + return this; + } + + public LogConfig build() { + return new LogConfig(level, logger, silent); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java new file mode 100644 index 00000000..db72cd0a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LogLevel.java @@ -0,0 +1,36 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * Log levels for SDK logging configuration. + * Silent by default — no log output unless explicitly configured. + */ +public enum LogLevel { + DEBUG(1), + INFO(2), + WARN(3), + ERROR(4); + + private final int value; + + LogLevel(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + + /** + * Parse a log level from a string (case-insensitive). + * + * @param level the level string (debug, info, warn, error) + * @return the corresponding LogLevel + * @throws IllegalArgumentException if the string does not match any level + */ + public static LogLevel fromString(String level) { + return LogLevel.valueOf(level.toUpperCase()); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java new file mode 100644 index 00000000..a5603955 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Logger.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * SDK logger that filters messages based on level and silent mode. + * + *

Silent by default — no log output unless explicitly configured. + * Create via {@link LogConfig} or directly: + *

{@code
+ * Logger logger = new Logger(LogLevel.DEBUG, new ConsoleLogger(), false);
+ * logger.debug("request sent");
+ * }
+ */ +public final class Logger { + + private static final Logger DEFAULT = new Logger(LogLevel.INFO, new ConsoleLogger(), true); + + private final LogLevel level; + private final ILogger logger; + private final boolean silent; + + public Logger(LogLevel level, ILogger logger, boolean silent) { + this.level = level; + this.logger = logger; + this.silent = silent; + } + + /** + * Returns a default silent logger (no output). + */ + public static Logger getDefault() { + return DEFAULT; + } + + /** + * Creates a Logger from a {@link LogConfig}. If config is {@code null}, returns the default silent logger. + */ + public static Logger from(LogConfig config) { + if (config == null) { + return DEFAULT; + } + return new Logger(config.level(), config.logger(), config.silent()); + } + + /** + * Creates a Logger from an {@code Optional}. If empty, returns the default silent logger. + */ + public static Logger from(java.util.Optional config) { + return config.map(Logger::from).orElse(DEFAULT); + } + + private boolean shouldLog(LogLevel messageLevel) { + return !silent && level.getValue() <= messageLevel.getValue(); + } + + public boolean isDebug() { + return shouldLog(LogLevel.DEBUG); + } + + public boolean isInfo() { + return shouldLog(LogLevel.INFO); + } + + public boolean isWarn() { + return shouldLog(LogLevel.WARN); + } + + public boolean isError() { + return shouldLog(LogLevel.ERROR); + } + + public void debug(String message) { + if (isDebug()) { + logger.debug(message); + } + } + + public void info(String message) { + if (isInfo()) { + logger.info(message); + } + } + + public void warn(String message) { + if (isWarn()) { + logger.warn(message); + } + } + + public void error(String message) { + if (isError()) { + logger.error(message); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java new file mode 100644 index 00000000..407b7937 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/LoggingInterceptor.java @@ -0,0 +1,104 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * OkHttp interceptor that logs HTTP requests and responses. + * + *

Logs request method, URL, and headers (with sensitive values redacted) at debug level. + * Logs response status at debug level, and 4xx/5xx responses at error level. + * Does nothing if the logger is silent. + */ +public final class LoggingInterceptor implements Interceptor { + + private static final Set SENSITIVE_HEADERS = new HashSet<>(Arrays.asList( + "authorization", + "www-authenticate", + "x-api-key", + "api-key", + "apikey", + "x-api-token", + "x-auth-token", + "auth-token", + "proxy-authenticate", + "proxy-authorization", + "cookie", + "set-cookie", + "x-csrf-token", + "x-xsrf-token", + "x-session-token", + "x-access-token")); + + private final Logger logger; + + public LoggingInterceptor(Logger logger) { + this.logger = logger; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Request: ").append(request.method()).append(" ").append(request.url()); + sb.append(" headers={"); + boolean first = true; + for (String name : request.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(request.header(name)); + } + first = false; + } + sb.append("}"); + sb.append(" has_body=").append(request.body() != null); + logger.debug(sb.toString()); + } + + Response response = chain.proceed(request); + + if (logger.isDebug()) { + StringBuilder sb = new StringBuilder(); + sb.append("HTTP Response: status=").append(response.code()); + sb.append(" url=").append(response.request().url()); + sb.append(" headers={"); + boolean first = true; + for (String name : response.headers().names()) { + if (!first) { + sb.append(", "); + } + sb.append(name).append("="); + if (SENSITIVE_HEADERS.contains(name.toLowerCase())) { + sb.append("[REDACTED]"); + } else { + sb.append(response.header(name)); + } + first = false; + } + sb.append("}"); + logger.debug(sb.toString()); + } + + if (response.code() >= 400 && logger.isError()) { + logger.error("HTTP Error: status=" + response.code() + " url=" + + response.request().url()); + } + + return response; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java index 98c33be4..a6cffd4d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java @@ -14,6 +14,9 @@ public boolean equals(Object o) { } private boolean isOptionalEmpty(Object o) { - return o instanceof Optional && !((Optional) o).isPresent(); + if (o instanceof Optional) { + return !((Optional) o).isPresent(); + } + return false; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java index acec32b4..4f69f150 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java @@ -4,13 +4,13 @@ package com.skyflow.generated.rest.core; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - import java.io.IOException; public final class ObjectMappers { @@ -18,6 +18,7 @@ public final class ObjectMappers { .addModule(new Jdk8Module()) .addModule(new JavaTimeModule()) .addModule(DateTimeDeserializer.getModule()) + .addModule(DoubleSerializer.getModule()) .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) .build(); @@ -34,4 +35,12 @@ public static String stringify(Object o) { return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); } } + + public static Object parseErrorBody(String responseBodyString) { + try { + return JSON_MAPPER.readValue(responseBodyString, Object.class); + } catch (JsonProcessingException ignored) { + return responseBodyString; + } + } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java index c0687736..e9e18fb9 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java @@ -7,11 +7,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import okhttp3.HttpUrl; import okhttp3.MultipartBody; -import java.util.*; - public class QueryStringMapper { private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java index edc6d0ae..26b396e4 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java @@ -16,21 +16,33 @@ public final class RequestOptions { private final TimeUnit timeoutTimeUnit; + private final Optional maxRetries; + private final Map headers; private final Map> headerSuppliers; + private final Map queryParameters; + + private final Map> queryParameterSuppliers; + private RequestOptions( String token, Optional timeout, TimeUnit timeoutTimeUnit, + Optional maxRetries, Map headers, - Map> headerSuppliers) { + Map> headerSuppliers, + Map queryParameters, + Map> queryParameterSuppliers) { this.token = token; this.timeout = timeout; this.timeoutTimeUnit = timeoutTimeUnit; + this.maxRetries = maxRetries; this.headers = headers; this.headerSuppliers = headerSuppliers; + this.queryParameters = queryParameters; + this.queryParameterSuppliers = queryParameterSuppliers; } public Optional getTimeout() { @@ -41,6 +53,10 @@ public TimeUnit getTimeoutTimeUnit() { return timeoutTimeUnit; } + public Optional getMaxRetries() { + return maxRetries; + } + public Map getHeaders() { Map headers = new HashMap<>(); if (this.token != null) { @@ -53,21 +69,35 @@ public Map getHeaders() { return headers; } + public Map getQueryParameters() { + Map queryParameters = new HashMap<>(this.queryParameters); + this.queryParameterSuppliers.forEach((key, supplier) -> { + queryParameters.put(key, supplier.get()); + }); + return queryParameters; + } + public static Builder builder() { return new Builder(); } - public static final class Builder { + public static class Builder { private String token = null; private Optional timeout = Optional.empty(); private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; + private Optional maxRetries = Optional.empty(); + private final Map headers = new HashMap<>(); private final Map> headerSuppliers = new HashMap<>(); + private final Map queryParameters = new HashMap<>(); + + private final Map> queryParameterSuppliers = new HashMap<>(); + public Builder token(String token) { this.token = token; return this; @@ -84,6 +114,11 @@ public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { return this; } + public Builder maxRetries(Integer maxRetries) { + this.maxRetries = Optional.of(maxRetries); + return this; + } + public Builder addHeader(String key, String value) { this.headers.put(key, value); return this; @@ -94,8 +129,26 @@ public Builder addHeader(String key, Supplier value) { return this; } + public Builder addQueryParameter(String key, String value) { + this.queryParameters.put(key, value); + return this; + } + + public Builder addQueryParameter(String key, Supplier value) { + this.queryParameterSuppliers.put(key, value); + return this; + } + public RequestOptions build() { - return new RequestOptions(token, timeout, timeoutTimeUnit, headers, headerSuppliers); + return new RequestOptions( + token, + timeout, + timeoutTimeUnit, + maxRetries, + headers, + headerSuppliers, + queryParameters, + queryParameterSuppliers); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java index 1bb0b5dc..d8df7715 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java @@ -3,10 +3,9 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.io.FilterInputStream; import java.io.IOException; +import okhttp3.Response; /** * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java index e6c1a525..ed894407 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java @@ -3,10 +3,9 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Response; - import java.io.FilterReader; import java.io.IOException; +import okhttp3.Response; /** * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java new file mode 100644 index 00000000..d6938347 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/ResponseDecompressionInterceptor.java @@ -0,0 +1,56 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.io.IOException; +import java.util.zip.Inflater; +import okhttp3.Interceptor; +import okhttp3.Response; +import okhttp3.ResponseBody; +import okio.GzipSource; +import okio.InflaterSource; +import okio.Okio; +import okio.Source; + +/** + * Decompresses gzip and deflate encoded response bodies. OkHttp only performs + * transparent decompression when it adds the Accept-Encoding header itself, so + * responses to requests with an explicitly set Accept-Encoding header would + * otherwise be returned as raw compressed bytes. + */ +public class ResponseDecompressionInterceptor implements Interceptor { + + @Override + public Response intercept(Chain chain) throws IOException { + return decompress(chain.proceed(chain.request())); + } + + private Response decompress(Response response) { + ResponseBody body = response.body(); + if (body == null) { + return response; + } + String encoding = response.header("Content-Encoding"); + if (encoding == null) { + return response; + } + Source decompressedSource; + if (encoding.equalsIgnoreCase("gzip") || encoding.equalsIgnoreCase("x-gzip")) { + decompressedSource = new GzipSource(body.source()); + } else if (encoding.equalsIgnoreCase("deflate")) { + decompressedSource = new InflaterSource(body.source(), new Inflater()); + } else { + return response; + } + ResponseBody decompressedBody = ResponseBody.create(body.contentType(), -1L, Okio.buffer(decompressedSource)); + return response.newBuilder() + .headers(response.headers() + .newBuilder() + .removeAll("Content-Encoding") + .removeAll("Content-Length") + .build()) + .body(decompressedBody) + .build(); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java index 7a28c3c9..7d89751d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java @@ -3,37 +3,80 @@ */ package com.skyflow.generated.rest.core; -import okhttp3.Interceptor; -import okhttp3.Response; - import java.io.IOException; import java.time.Duration; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.Optional; import java.util.Random; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; public class RetryInterceptor implements Interceptor { - private static final Duration ONE_SECOND = Duration.ofSeconds(1); - private final ExponentialBackoff backoff; + private static final Duration DEFAULT_INITIAL_RETRY_DELAY = Duration.ofMillis(1000); + private static final Duration DEFAULT_MAX_RETRY_DELAY = Duration.ofMillis(60000); + private static final double DEFAULT_JITTER_FACTOR = 0.2; + + private final int maxRetries; + private final Duration initialRetryDelay; + private final Duration maxRetryDelay; + private final double jitterFactor; private final Random random = new Random(); public RetryInterceptor(int maxRetries) { - this.backoff = new ExponentialBackoff(maxRetries); + this(maxRetries, Optional.empty(), Optional.empty(), Optional.empty()); + } + + public RetryInterceptor( + int maxRetries, + Optional initialRetryDelayMillis, + Optional maxRetryDelayMillis, + Optional jitterFactor) { + initialRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("initialRetryDelayMillis must be non-negative"); + } + }); + maxRetryDelayMillis.ifPresent(delay -> { + if (delay < 0) { + throw new IllegalArgumentException("maxRetryDelayMillis must be non-negative"); + } + }); + jitterFactor.ifPresent(factor -> { + if (factor < 0 || factor > 1) { + throw new IllegalArgumentException("jitterFactor must be between 0 and 1"); + } + }); + this.maxRetries = maxRetries; + this.initialRetryDelay = initialRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_INITIAL_RETRY_DELAY); + this.maxRetryDelay = maxRetryDelayMillis.map(Duration::ofMillis).orElse(DEFAULT_MAX_RETRY_DELAY); + this.jitterFactor = jitterFactor.orElse(DEFAULT_JITTER_FACTOR); } @Override public Response intercept(Chain chain) throws IOException { - Response response = chain.proceed(chain.request()); + Request request = chain.request(); + int effectiveMaxRetries = resolveMaxRetries(request); + Response response = chain.proceed(request); if (shouldRetry(response.code())) { - return retryChain(response, chain); + return retryChain(response, chain, effectiveMaxRetries); } return response; } - private Response retryChain(Response response, Chain chain) throws IOException { - Optional nextBackoff = this.backoff.nextBackoff(); + private int resolveMaxRetries(Request request) { + MaxRetriesOverride override = request.tag(MaxRetriesOverride.class); + return override != null ? override.getValue() : this.maxRetries; + } + + private Response retryChain(Response response, Chain chain, int maxRetries) throws IOException { + ExponentialBackoff backoff = new ExponentialBackoff(maxRetries); + Optional nextBackoff = backoff.nextBackoff(response); while (nextBackoff.isPresent()) { try { Thread.sleep(nextBackoff.get().toMillis()); @@ -43,7 +86,7 @@ private Response retryChain(Response response, Chain chain) throws IOException { response.close(); response = chain.proceed(chain.request()); if (shouldRetry(response.code())) { - nextBackoff = this.backoff.nextBackoff(); + nextBackoff = backoff.nextBackoff(response); } else { return response; } @@ -52,10 +95,130 @@ private Response retryChain(Response response, Chain chain) throws IOException { return response; } + /** + * Calculates the retry delay from response headers, with fallback to exponential backoff. + * Priority: Retry-After > X-RateLimit-Reset > Exponential Backoff + */ + private Duration getRetryDelayFromHeaders(Response response, int retryAttempt) { + // Check for Retry-After header first (RFC 7231), with no jitter + String retryAfter = response.header("Retry-After"); + if (retryAfter != null) { + // Parse as number of seconds... + Optional secondsDelay = tryParseLong(retryAfter) + .map(seconds -> seconds * 1000) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (secondsDelay.isPresent()) { + return secondsDelay.get(); + } + + // ...or as an HTTP date; both are valid + Optional dateDelay = tryParseHttpDate(retryAfter) + .map(resetTime -> resetTime.toInstant().toEpochMilli() - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(Duration::ofMillis); + if (dateDelay.isPresent()) { + return dateDelay.get(); + } + } + + // Then check for industry-standard X-RateLimit-Reset header, with positive jitter + String rateLimitReset = response.header("X-RateLimit-Reset"); + if (rateLimitReset != null) { + // Assume Unix timestamp in epoch seconds + Optional rateLimitDelay = tryParseLong(rateLimitReset) + .map(resetTimeSeconds -> (resetTimeSeconds * 1000) - System.currentTimeMillis()) + .filter(delayMs -> delayMs > 0) + .map(delayMs -> Math.min(delayMs, maxRetryDelay.toMillis())) + .map(this::addPositiveJitter) + .map(Duration::ofMillis); + if (rateLimitDelay.isPresent()) { + return rateLimitDelay.get(); + } + } + + // Fall back to exponential backoff, with symmetric jitter + long initialDelayMillis = initialRetryDelay.toMillis(); + long maxDelayMillis = maxRetryDelay.toMillis(); + long cappedDelay; + if (retryAttempt >= Long.SIZE - 1 || initialDelayMillis > (maxDelayMillis >> retryAttempt)) { + // initialDelayMillis * 2^retryAttempt would exceed maxDelayMillis (or overflow) + cappedDelay = maxDelayMillis; + } else { + cappedDelay = Math.min(initialDelayMillis << retryAttempt, maxDelayMillis); // 2^retryAttempt + } + return Duration.ofMillis(addSymmetricJitter(cappedDelay)); + } + + /** + * Attempts to parse a string as a long, returning empty Optional on failure. + */ + private Optional tryParseLong(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(Long.parseLong(value)); + } catch (NumberFormatException e) { + return Optional.empty(); + } + } + + /** + * Attempts to parse a string as an HTTP date (RFC 1123), returning empty Optional on failure. + */ + private Optional tryParseHttpDate(String value) { + if (value == null) { + return Optional.empty(); + } + try { + return Optional.of(ZonedDateTime.parse(value, DateTimeFormatter.RFC_1123_DATE_TIME)); + } catch (DateTimeParseException e) { + return Optional.empty(); + } + } + + /** + * Adds positive jitter (100-120% of original value) to prevent thundering herd. + * Used for X-RateLimit-Reset header delays. + */ + private long addPositiveJitter(long delayMs) { + double jitterMultiplier = 1.0 + (random.nextDouble() * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + + /** + * Adds symmetric jitter (90-110% of original value) to prevent thundering herd. + * Used for exponential backoff delays. + */ + private long addSymmetricJitter(long delayMs) { + double jitterMultiplier = 1.0 + ((random.nextDouble() - 0.5) * jitterFactor); + return (long) (delayMs * jitterMultiplier); + } + private static boolean shouldRetry(int statusCode) { return statusCode == 408 || statusCode == 429 || statusCode >= 500; } + /** + * Per-request override carried on the OkHttp {@link Request} as a tag. + * When present, the interceptor uses this value instead of the client-wide + * {@code maxRetries} configured at construction time. + */ + public static final class MaxRetriesOverride { + private final int value; + + public MaxRetriesOverride(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + private final class ExponentialBackoff { private final int maxNumRetries; @@ -66,14 +229,14 @@ private final class ExponentialBackoff { this.maxNumRetries = maxNumRetries; } - public Optional nextBackoff() { - retryNumber += 1; - if (retryNumber > maxNumRetries) { + public Optional nextBackoff(Response response) { + if (retryNumber >= maxNumRetries) { return Optional.empty(); } - int upperBound = (int) Math.pow(2, retryNumber); - return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); + Duration delay = getRetryDelayFromHeaders(response, retryNumber); + retryNumber += 1; + return Optional.of(delay); } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java new file mode 100644 index 00000000..3a826210 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Rfc2822DateTimeDeserializer.java @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Custom deserializer that handles converting RFC 2822 (RFC 1123) dates into {@link OffsetDateTime} objects. + * This is used for fields with format "date-time-rfc-2822", such as Twilio's dateCreated, dateSent, dateUpdated. + */ +public class Rfc2822DateTimeDeserializer extends JsonDeserializer { + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + String raw = parser.getValueAsString(); + return ZonedDateTime.parse(raw, DateTimeFormatter.RFC_1123_DATE_TIME).toOffsetDateTime(); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java new file mode 100644 index 00000000..9ab823d5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEvent.java @@ -0,0 +1,114 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; +import java.util.Optional; + +/** + * Represents a Server-Sent Event with all standard fields. + * Used for event-level discrimination where the discriminator is at the SSE envelope level. + * + * @param The type of the data field + */ +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonIgnoreProperties(ignoreUnknown = true) +public final class SseEvent { + private final String event; + private final T data; + private final String id; + private final Long retry; + + private SseEvent(String event, T data, String id, Long retry) { + this.event = event; + this.data = data; + this.id = id; + this.retry = retry; + } + + @JsonProperty("event") + public Optional getEvent() { + return Optional.ofNullable(event); + } + + @JsonProperty("data") + public T getData() { + return data; + } + + @JsonProperty("id") + public Optional getId() { + return Optional.ofNullable(id); + } + + @JsonProperty("retry") + public Optional getRetry() { + return Optional.ofNullable(retry); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SseEvent sseEvent = (SseEvent) o; + return Objects.equals(event, sseEvent.event) + && Objects.equals(data, sseEvent.data) + && Objects.equals(id, sseEvent.id) + && Objects.equals(retry, sseEvent.retry); + } + + @Override + public int hashCode() { + return Objects.hash(event, data, id, retry); + } + + @Override + public String toString() { + return "SseEvent{" + "event='" + + event + '\'' + ", data=" + + data + ", id='" + + id + '\'' + ", retry=" + + retry + '}'; + } + + public static Builder builder() { + return new Builder<>(); + } + + public static final class Builder { + private String event; + private T data; + private String id; + private Long retry; + + private Builder() {} + + public Builder event(String event) { + this.event = event; + return this; + } + + public Builder data(T data) { + this.data = data; + return this; + } + + public Builder id(String id) { + this.id = id; + return this; + } + + public Builder retry(Long retry) { + this.retry = retry; + return this; + } + + public SseEvent build() { + return new SseEvent<>(event, data, id, retry); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java new file mode 100644 index 00000000..ce50f86b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/SseEventParser.java @@ -0,0 +1,228 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.core.type.TypeReference; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * Utility class for parsing Server-Sent Events with support for discriminated unions. + *

+ * Handles two discrimination patterns: + *

    + *
  1. Data-level discrimination: The discriminator (e.g., 'type') is inside the JSON data payload. + * Jackson's polymorphic deserialization handles this automatically.
  2. + *
  3. Event-level discrimination: The discriminator (e.g., 'event') is at the SSE envelope level. + * This requires constructing the full SSE envelope for Jackson to process.
  4. + *
+ */ +public final class SseEventParser { + + private static final Set SSE_ENVELOPE_FIELDS = new HashSet<>(Arrays.asList("event", "data", "id", "retry")); + + private SseEventParser() { + // Utility class + } + + /** + * Parse an SSE event using event-level discrimination. + *

+ * Constructs the full SSE envelope object with event, data, id, and retry fields, + * then deserializes it to the target union type. + * + * @param eventType The SSE event type (from event: field) + * @param data The SSE data content (from data: field) + * @param id The SSE event ID (from id: field), may be null + * @param retry The SSE retry value (from retry: field), may be null + * @param unionClass The target union class + * @param discriminatorProperty The property name used for discrimination (e.g., "event") + * @param The target type + * @return The deserialized object + */ + public static T parseEventLevelUnion( + String eventType, String data, String id, Long retry, Class unionClass, String discriminatorProperty) { + try { + // Determine if data should be parsed as JSON based on the variant's expected type + Object parsedData = parseDataForVariant(eventType, data, unionClass, discriminatorProperty); + + // Construct the SSE envelope object + Map envelope = new HashMap<>(); + envelope.put(discriminatorProperty, eventType); + envelope.put("data", parsedData); + if (id != null) { + envelope.put("id", id); + } + if (retry != null) { + envelope.put("retry", retry); + } + + // Serialize to JSON and deserialize to target type + String envelopeJson = ObjectMappers.JSON_MAPPER.writeValueAsString(envelope); + return ObjectMappers.JSON_MAPPER.readValue(envelopeJson, unionClass); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE event with event-level discrimination", e); + } + } + + /** + * Parse an SSE event using data-level discrimination. + *

+ * Simply parses the data field as JSON and deserializes it to the target type. + * Jackson's polymorphic deserialization handles the discrimination automatically. + * + * @param data The SSE data content (from data: field) + * @param valueType The target type + * @param The target type + * @return The deserialized object + */ + public static T parseDataLevelUnion(String data, Class valueType) { + try { + return ObjectMappers.JSON_MAPPER.readValue(data, valueType); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE data with data-level discrimination", e); + } + } + + /** + * Determines if the given discriminator property indicates event-level discrimination. + * Event-level discrimination occurs when the discriminator is an SSE envelope field. + * + * @param discriminatorProperty The discriminator property name + * @return true if event-level discrimination, false otherwise + */ + public static boolean isEventLevelDiscrimination(String discriminatorProperty) { + return SSE_ENVELOPE_FIELDS.contains(discriminatorProperty); + } + + /** + * Attempts to find the discriminator property from the union class's Jackson annotations. + * + * @param unionClass The union class to inspect + * @return The discriminator property name, or empty if not found + */ + public static Optional findDiscriminatorProperty(Class unionClass) { + try { + // Look for JsonTypeInfo on the class itself + JsonTypeInfo typeInfo = unionClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + + // Look for inner Value interface with JsonTypeInfo + for (Class innerClass : unionClass.getDeclaredClasses()) { + typeInfo = innerClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return Optional.empty(); + } + + /** + * Parse the data field based on what the matching variant expects. + * If the variant expects a String for its data field, returns the raw string. + * Otherwise, parses the data as JSON. + */ + private static Object parseDataForVariant( + String eventType, String data, Class unionClass, String discriminatorProperty) { + if (data == null || data.isEmpty()) { + return data; + } + + try { + // Try to find the variant class that matches this event type + Class variantClass = findVariantClass(unionClass, eventType, discriminatorProperty); + if (variantClass != null) { + // Check if the variant expects a String for the data field + Field dataField = findField(variantClass, "data"); + if (dataField != null && String.class.equals(dataField.getType())) { + // Variant expects String - return raw data + return data; + } + } + + // Try to parse as JSON + return ObjectMappers.JSON_MAPPER.readValue(data, new TypeReference>() {}); + } catch (Exception e) { + // If JSON parsing fails, return as string + return data; + } + } + + /** + * Find the variant class that matches the given discriminator value. + */ + private static Class findVariantClass( + Class unionClass, String discriminatorValue, String discriminatorProperty) { + try { + // Look for JsonSubTypes annotation + JsonSubTypes subTypes = findJsonSubTypes(unionClass); + if (subTypes == null) { + return null; + } + + for (JsonSubTypes.Type subType : subTypes.value()) { + JsonTypeName typeName = subType.value().getAnnotation(JsonTypeName.class); + if (typeName != null && typeName.value().equals(discriminatorValue)) { + return subType.value(); + } + // Also check the name attribute of @JsonSubTypes.Type + if (subType.name().equals(discriminatorValue)) { + return subType.value(); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return null; + } + + /** + * Find JsonSubTypes annotation on the class or its inner classes. + */ + private static JsonSubTypes findJsonSubTypes(Class unionClass) { + // Check the class itself + JsonSubTypes subTypes = unionClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + + // Check inner classes (for Fern-style unions with inner Value interface) + for (Class innerClass : unionClass.getDeclaredClasses()) { + subTypes = innerClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + } + return null; + } + + /** + * Find a field by name in a class, including private fields. + */ + private static Field findField(Class clazz, String fieldName) { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // Check superclass + Class superClass = clazz.getSuperclass(); + if (superClass != null && superClass != Object.class) { + return findField(superClass, fieldName); + } + return null; + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java index f037712a..3822aa81 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/Stream.java @@ -3,6 +3,8 @@ */ package com.skyflow.generated.rest.core; +import java.io.Closeable; +import java.io.IOException; import java.io.Reader; import java.util.Iterator; import java.util.NoSuchElementException; @@ -14,18 +16,30 @@ *

* {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a * {@code Scanner} to block during iteration if the next object is not available. + * Iterable stream for parsing JSON and Server-Sent Events (SSE) data. + * Supports both newline-delimited JSON and SSE with optional stream termination. * * @param The type of objects in the stream. */ -public final class Stream implements Iterable { - /** - * The {@link Class} of the objects in the stream. - */ +public final class Stream implements Iterable, Closeable { + + private static final String NEWLINE = "\n"; + private static final String DATA_PREFIX = "data:"; + + public enum StreamType { + JSON, + SSE, + SSE_EVENT_DISCRIMINATED + } + private final Class valueType; - /** - * The {@link Scanner} used for reading from the input stream and blocking when needed during iteration. - */ private final Scanner scanner; + private final StreamType streamType; + private final String messageTerminator; + private final String streamTerminator; + private final Reader sseReader; + private final String discriminatorProperty; + private boolean isClosed = false; /** * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. @@ -35,8 +49,100 @@ public final class Stream implements Iterable { * @param delimiter The delimiter used to separate elements in the stream. */ public Stream(Class valueType, Reader reader, String delimiter) { + this.valueType = valueType; this.scanner = new Scanner(reader).useDelimiter(delimiter); + this.streamType = StreamType.JSON; + this.messageTerminator = delimiter; + this.streamTerminator = null; + this.sseReader = null; + this.discriminatorProperty = null; + } + + private Stream(Class valueType, StreamType type, Reader reader, String terminator) { + this(valueType, type, reader, terminator, null); + } + + private Stream( + Class valueType, StreamType type, Reader reader, String terminator, String discriminatorProperty) { this.valueType = valueType; + this.streamType = type; + this.discriminatorProperty = discriminatorProperty; + if (type == StreamType.JSON) { + this.scanner = new Scanner(reader).useDelimiter(terminator); + this.messageTerminator = terminator; + this.streamTerminator = null; + this.sseReader = null; + } else { + this.scanner = null; + this.messageTerminator = NEWLINE; + this.streamTerminator = terminator; + this.sseReader = reader; + } + } + + public static Stream fromJson(Class valueType, Reader reader, String delimiter) { + return new Stream<>(valueType, reader, delimiter); + } + + public static Stream fromJson(Class valueType, Reader reader) { + return new Stream<>(valueType, reader, NEWLINE); + } + + public static Stream fromSse(Class valueType, Reader sseReader) { + return new Stream<>(valueType, StreamType.SSE, sseReader, null); + } + + public static Stream fromSse(Class valueType, Reader sseReader, String streamTerminator) { + return new Stream<>(valueType, StreamType.SSE, sseReader, streamTerminator); + } + + /** + * Creates a stream from SSE data with event-level discrimination support. + * Use this when the SSE payload is a discriminated union where the discriminator + * is an SSE envelope field (e.g., 'event'). + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty) { + return new Stream<>(valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, null, discriminatorProperty); + } + + /** + * Creates a stream from SSE data with event-level discrimination support and a stream terminator. + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param streamTerminator The terminator string that signals end of stream (e.g., "[DONE]"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty, String streamTerminator) { + return new Stream<>( + valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, streamTerminator, discriminatorProperty); + } + + @Override + public void close() throws IOException { + if (!isClosed) { + isClosed = true; + if (scanner != null) { + scanner.close(); + } + if (sseReader != null) { + sseReader.close(); + } + } + } + + private boolean isStreamClosed() { + return isClosed; } /** @@ -47,51 +153,361 @@ public Stream(Class valueType, Reader reader, String delimiter) { */ @Override public Iterator iterator() { - return new Iterator() { - /** - * Returns {@code true} if there are more elements in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return {@code true} if there are more elements, {@code false} otherwise. - */ - @Override - public boolean hasNext() { - return scanner.hasNext(); - } - - /** - * Returns the next element in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return The next element in the stream. - * @throws NoSuchElementException If there are no more elements in the stream. - */ - @Override - public T next() { - if (!scanner.hasNext()) { - throw new NoSuchElementException(); - } else { + switch (streamType) { + case SSE: + return new SSEIterator(); + case SSE_EVENT_DISCRIMINATED: + return new SSEEventDiscriminatedIterator(); + case JSON: + default: + return new JsonIterator(); + } + } + + private final class JsonIterator implements Iterator { + + /** + * Returns {@code true} if there are more elements in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return {@code true} if there are more elements, {@code false} otherwise. + */ + @Override + public boolean hasNext() { + if (isStreamClosed()) { + return false; + } + return scanner.hasNext(); + } + + /** + * Returns the next element in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return The next element in the stream. + * @throws NoSuchElementException If there are no more elements in the stream. + */ + @Override + public T next() { + if (isStreamClosed()) { + throw new NoSuchElementException("Stream is closed"); + } + + if (!scanner.hasNext()) { + throw new NoSuchElementException(); + } else { + try { + T parsedResponse = + ObjectMappers.JSON_MAPPER.readValue(scanner.next().trim(), valueType); + return parsedResponse; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } + + private final class SSEIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + + private SSEIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; + } + + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0) { + try { + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + // Event ID field (ignored) + } else if (line.startsWith("retry:")) { + // Retry field (ignored) + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + if (eventDataBuffer.length() > 0) { try { - T parsedResponse = ObjectMappers.JSON_MAPPER.readValue( - scanner.next().trim(), valueType); - return parsedResponse; - } catch (Exception e) { - throw new RuntimeException(e); + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; } } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; + } + } + } + + /** + * Iterator for SSE streams with event-level discrimination. + * Uses SseEventParser to construct the full SSE envelope for Jackson deserialization. + */ + private final class SSEEventDiscriminatedIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + private String currentEventId = null; + private Long currentRetry = null; + + private SSEEventDiscriminatedIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; } - /** - * Removing elements from {@code Stream} is not supported. - * - * @throws UnsupportedOperationException Always, as removal is not supported. - */ - @Override - public void remove() { - throw new UnsupportedOperationException(); + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + // Use SseEventParser for event-level discrimination + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + resetEventState(); + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + String idValue = line.length() > 3 ? line.substring(3) : ""; + if (idValue.startsWith(" ")) { + idValue = idValue.substring(1); + } + currentEventId = idValue; + } else if (line.startsWith("retry:")) { + String retryValue = line.length() > 6 ? line.substring(6) : ""; + if (retryValue.startsWith(" ")) { + retryValue = retryValue.substring(1); + } + try { + currentRetry = Long.parseLong(retryValue.trim()); + } catch (NumberFormatException e) { + // Ignore invalid retry values + } + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + // Handle any remaining buffered data at end of stream + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + resetEventState(); + } + } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; } - }; + } + + private void resetEventState() { + eventDataBuffer.setLength(0); + currentEventType = null; + currentEventId = null; + currentRetry = null; + } } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java b/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java new file mode 100644 index 00000000..352c364e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/core/WrappedAlias.java @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +public interface WrappedAlias { + Object get(); +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java index 80ae5e7c..9f8ce586 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class BadRequestError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public BadRequestError(Object body) { + public BadRequestError(ErrorResponse body) { super("BadRequestError", 400, body); this.body = body; } - public BadRequestError(Object body, Response rawResponse) { + public BadRequestError(ErrorResponse body, Response rawResponse) { super("BadRequestError", 400, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public BadRequestError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java new file mode 100644 index 00000000..f8eb18ff --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/ForbiddenError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.errors; + +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class ForbiddenError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public ForbiddenError(ErrorResponse body) { + super("ForbiddenError", 403, body); + this.body = body; + } + + public ForbiddenError(ErrorResponse body, Response rawResponse) { + super("ForbiddenError", 403, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java index ffeed9d7..d29f2b82 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java @@ -26,7 +26,7 @@ public InternalServerError(ErrorResponse body, Response rawResponse) { /** * @return the body */ - @Override + @java.lang.Override public ErrorResponse body() { return this.body; } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java index 1d0a6ad0..f0cdf5b0 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class NotFoundError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public NotFoundError(Object body) { + public NotFoundError(ErrorResponse body) { super("NotFoundError", 404, body); this.body = body; } - public NotFoundError(Object body, Response rawResponse) { + public NotFoundError(ErrorResponse body, Response rawResponse) { super("NotFoundError", 404, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public NotFoundError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java new file mode 100644 index 00000000..e49ef7ef --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/TooManyRequestsError.java @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.errors; + +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.Response; + +public final class TooManyRequestsError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final ErrorResponse body; + + public TooManyRequestsError(ErrorResponse body) { + super("TooManyRequestsError", 429, body); + this.body = body; + } + + public TooManyRequestsError(ErrorResponse body, Response rawResponse) { + super("TooManyRequestsError", 429, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @java.lang.Override + public ErrorResponse body() { + return this.body; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java b/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java index 3bc254bc..1035b7f0 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java @@ -4,20 +4,21 @@ package com.skyflow.generated.rest.errors; import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.types.ErrorResponse; import okhttp3.Response; public final class UnauthorizedError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Object body; + private final ErrorResponse body; - public UnauthorizedError(Object body) { + public UnauthorizedError(ErrorResponse body) { super("UnauthorizedError", 401, body); this.body = body; } - public UnauthorizedError(Object body, Response rawResponse) { + public UnauthorizedError(ErrorResponse body, Response rawResponse) { super("UnauthorizedError", 401, body, rawResponse); this.body = body; } @@ -25,8 +26,8 @@ public UnauthorizedError(Object body, Response rawResponse) { /** * @return the body */ - @Override - public Object body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java new file mode 100644 index 00000000..083579b6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/requests/PatchV2VaultsIdRequest.java @@ -0,0 +1,69 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.requests; + +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.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = PatchV2VaultsIdRequest.Builder.class) +public final class PatchV2VaultsIdRequest { + private final Map additionalProperties; + + private PatchV2VaultsIdRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof PatchV2VaultsIdRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @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 { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(PatchV2VaultsIdRequest other) { + return this; + } + + public PatchV2VaultsIdRequest build() { + return new PatchV2VaultsIdRequest(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/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java deleted file mode 100644 index 7e2719f2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncAuditClient { - protected final ClientOptions clientOptions; - - private final AsyncRawAuditClient rawClient; - - public AsyncAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawAuditClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawAuditClient withRawResponse() { - return this.rawClient; - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture auditServiceListAuditEvents(AuditServiceListAuditEventsRequest request) { - return this.rawClient.auditServiceListAuditEvents(request).thenApply(response -> response.body()); - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - return this.rawClient - .auditServiceListAuditEvents(request, requestOptions) - .thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java deleted file mode 100644 index e1516eaf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java +++ /dev/null @@ -1,284 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawAuditClient { - protected final ClientOptions clientOptions; - - public AsyncRawAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture> auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request) { - return auditServiceListAuditEvents(request, null); - } - - /** - * Lists audit events that match query parameters. - */ - public CompletableFuture> auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/audit/events"); - if (request.getFilterOpsContextChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.changeID", - request.getFilterOpsContextChangeId().get(), - false); - } - if (request.getFilterOpsContextRequestId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.requestID", - request.getFilterOpsContextRequestId().get(), - false); - } - if (request.getFilterOpsContextTraceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.traceID", - request.getFilterOpsContextTraceId().get(), - false); - } - if (request.getFilterOpsContextSessionId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.sessionID", - request.getFilterOpsContextSessionId().get(), - false); - } - if (request.getFilterOpsContextActor().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actor", - request.getFilterOpsContextActor().get(), - false); - } - if (request.getFilterOpsContextActorType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actorType", - request.getFilterOpsContextActorType().get(), - false); - } - if (request.getFilterOpsContextAccessType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.accessType", - request.getFilterOpsContextAccessType().get(), - false); - } - if (request.getFilterOpsContextIpAddress().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.ipAddress", - request.getFilterOpsContextIpAddress().get(), - false); - } - if (request.getFilterOpsContextOrigin().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.origin", - request.getFilterOpsContextOrigin().get(), - false); - } - if (request.getFilterOpsContextAuthMode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.authMode", - request.getFilterOpsContextAuthMode().get(), - false); - } - if (request.getFilterOpsContextJwtId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.jwtID", - request.getFilterOpsContextJwtId().get(), - false); - } - if (request.getFilterOpsContextBearerTokenContextId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.bearerTokenContextID", - request.getFilterOpsContextBearerTokenContextId().get(), - false); - } - if (request.getFilterOpsParentAccountId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.parentAccountID", - request.getFilterOpsParentAccountId().get(), - false); - } - QueryStringMapper.addQueryParameter(httpUrl, "filterOps.accountID", request.getFilterOpsAccountId(), false); - if (request.getFilterOpsWorkspaceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.workspaceID", - request.getFilterOpsWorkspaceId().get(), - false); - } - if (request.getFilterOpsVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.vaultID", request.getFilterOpsVaultId().get(), false); - } - if (request.getFilterOpsResourceIDs().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceIDs", - request.getFilterOpsResourceIDs().get(), - false); - } - if (request.getFilterOpsActionType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.actionType", - request.getFilterOpsActionType().get(), - false); - } - if (request.getFilterOpsResourceType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceType", - request.getFilterOpsResourceType().get(), - false); - } - if (request.getFilterOpsTags().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.tags", request.getFilterOpsTags().get(), false); - } - if (request.getFilterOpsResponseCode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseCode", - request.getFilterOpsResponseCode().get(), - false); - } - if (request.getFilterOpsStartTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.startTime", - request.getFilterOpsStartTime().get(), - false); - } - if (request.getFilterOpsEndTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.endTime", request.getFilterOpsEndTime().get(), false); - } - if (request.getFilterOpsApiName().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.apiName", request.getFilterOpsApiName().get(), false); - } - if (request.getFilterOpsResponseMessage().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseMessage", - request.getFilterOpsResponseMessage().get(), - false); - } - if (request.getFilterOpsHttpMethod().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.httpMethod", - request.getFilterOpsHttpMethod().get(), - false); - } - if (request.getFilterOpsHttpUri().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.httpURI", request.getFilterOpsHttpUri().get(), false); - } - if (request.getSortOpsSortBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.sortBy", request.getSortOpsSortBy().get(), false); - } - if (request.getSortOpsOrderBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.orderBy", request.getSortOpsOrderBy().get(), false); - } - if (request.getAfterOpsTimestamp().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "afterOps.timestamp", - request.getAfterOpsTimestamp().get(), - false); - } - if (request.getAfterOpsChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "afterOps.changeID", request.getAfterOpsChangeId().get(), false); - } - if (request.getLimit().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "limit", request.getLimit().get(), false); - } - if (request.getOffset().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "offset", request.getOffset().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1AuditResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java deleted file mode 100644 index bac81431..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; - -public class AuditClient { - protected final ClientOptions clientOptions; - - private final RawAuditClient rawClient; - - public AuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawAuditClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawAuditClient withRawResponse() { - return this.rawClient; - } - - /** - * Lists audit events that match query parameters. - */ - public V1AuditResponse auditServiceListAuditEvents(AuditServiceListAuditEventsRequest request) { - return this.rawClient.auditServiceListAuditEvents(request).body(); - } - - /** - * Lists audit events that match query parameters. - */ - public V1AuditResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - return this.rawClient - .auditServiceListAuditEvents(request, requestOptions) - .body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java deleted file mode 100644 index 68cd5e3b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java +++ /dev/null @@ -1,267 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; -import com.skyflow.generated.rest.types.V1AuditResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawAuditClient { - protected final ClientOptions clientOptions; - - public RawAuditClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Lists audit events that match query parameters. - */ - public ApiClientHttpResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request) { - return auditServiceListAuditEvents(request, null); - } - - /** - * Lists audit events that match query parameters. - */ - public ApiClientHttpResponse auditServiceListAuditEvents( - AuditServiceListAuditEventsRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/audit/events"); - if (request.getFilterOpsContextChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.changeID", - request.getFilterOpsContextChangeId().get(), - false); - } - if (request.getFilterOpsContextRequestId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.requestID", - request.getFilterOpsContextRequestId().get(), - false); - } - if (request.getFilterOpsContextTraceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.traceID", - request.getFilterOpsContextTraceId().get(), - false); - } - if (request.getFilterOpsContextSessionId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.sessionID", - request.getFilterOpsContextSessionId().get(), - false); - } - if (request.getFilterOpsContextActor().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actor", - request.getFilterOpsContextActor().get(), - false); - } - if (request.getFilterOpsContextActorType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.actorType", - request.getFilterOpsContextActorType().get(), - false); - } - if (request.getFilterOpsContextAccessType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.accessType", - request.getFilterOpsContextAccessType().get(), - false); - } - if (request.getFilterOpsContextIpAddress().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.ipAddress", - request.getFilterOpsContextIpAddress().get(), - false); - } - if (request.getFilterOpsContextOrigin().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.origin", - request.getFilterOpsContextOrigin().get(), - false); - } - if (request.getFilterOpsContextAuthMode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.authMode", - request.getFilterOpsContextAuthMode().get(), - false); - } - if (request.getFilterOpsContextJwtId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.jwtID", - request.getFilterOpsContextJwtId().get(), - false); - } - if (request.getFilterOpsContextBearerTokenContextId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.context.bearerTokenContextID", - request.getFilterOpsContextBearerTokenContextId().get(), - false); - } - if (request.getFilterOpsParentAccountId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.parentAccountID", - request.getFilterOpsParentAccountId().get(), - false); - } - QueryStringMapper.addQueryParameter(httpUrl, "filterOps.accountID", request.getFilterOpsAccountId(), false); - if (request.getFilterOpsWorkspaceId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.workspaceID", - request.getFilterOpsWorkspaceId().get(), - false); - } - if (request.getFilterOpsVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.vaultID", request.getFilterOpsVaultId().get(), false); - } - if (request.getFilterOpsResourceIDs().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceIDs", - request.getFilterOpsResourceIDs().get(), - false); - } - if (request.getFilterOpsActionType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.actionType", - request.getFilterOpsActionType().get(), - false); - } - if (request.getFilterOpsResourceType().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.resourceType", - request.getFilterOpsResourceType().get(), - false); - } - if (request.getFilterOpsTags().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.tags", request.getFilterOpsTags().get(), false); - } - if (request.getFilterOpsResponseCode().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseCode", - request.getFilterOpsResponseCode().get(), - false); - } - if (request.getFilterOpsStartTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.startTime", - request.getFilterOpsStartTime().get(), - false); - } - if (request.getFilterOpsEndTime().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.endTime", request.getFilterOpsEndTime().get(), false); - } - if (request.getFilterOpsApiName().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.apiName", request.getFilterOpsApiName().get(), false); - } - if (request.getFilterOpsResponseMessage().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.responseMessage", - request.getFilterOpsResponseMessage().get(), - false); - } - if (request.getFilterOpsHttpMethod().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "filterOps.httpMethod", - request.getFilterOpsHttpMethod().get(), - false); - } - if (request.getFilterOpsHttpUri().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "filterOps.httpURI", request.getFilterOpsHttpUri().get(), false); - } - if (request.getSortOpsSortBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.sortBy", request.getSortOpsSortBy().get(), false); - } - if (request.getSortOpsOrderBy().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "sortOps.orderBy", request.getSortOpsOrderBy().get(), false); - } - if (request.getAfterOpsTimestamp().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, - "afterOps.timestamp", - request.getAfterOpsTimestamp().get(), - false); - } - if (request.getAfterOpsChangeId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "afterOps.changeID", request.getAfterOpsChangeId().get(), false); - } - if (request.getLimit().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "limit", request.getLimit().get(), false); - } - if (request.getOffset().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "offset", request.getOffset().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1AuditResponse.class), 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java deleted file mode 100644 index e9f8cf12..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java +++ /dev/null @@ -1,1579 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.audit.types.*; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditServiceListAuditEventsRequest.Builder.class) -public final class AuditServiceListAuditEventsRequest { - private final Optional filterOpsContextChangeId; - - private final Optional filterOpsContextRequestId; - - private final Optional filterOpsContextTraceId; - - private final Optional filterOpsContextSessionId; - - private final Optional filterOpsContextActor; - - private final Optional filterOpsContextActorType; - - private final Optional filterOpsContextAccessType; - - private final Optional filterOpsContextIpAddress; - - private final Optional filterOpsContextOrigin; - - private final Optional filterOpsContextAuthMode; - - private final Optional filterOpsContextJwtId; - - private final Optional filterOpsContextBearerTokenContextId; - - private final Optional filterOpsParentAccountId; - - private final String filterOpsAccountId; - - private final Optional filterOpsWorkspaceId; - - private final Optional filterOpsVaultId; - - private final Optional filterOpsResourceIDs; - - private final Optional filterOpsActionType; - - private final Optional filterOpsResourceType; - - private final Optional filterOpsTags; - - private final Optional filterOpsResponseCode; - - private final Optional filterOpsStartTime; - - private final Optional filterOpsEndTime; - - private final Optional filterOpsApiName; - - private final Optional filterOpsResponseMessage; - - private final Optional filterOpsHttpMethod; - - private final Optional filterOpsHttpUri; - - private final Optional sortOpsSortBy; - - private final Optional sortOpsOrderBy; - - private final Optional afterOpsTimestamp; - - private final Optional afterOpsChangeId; - - private final Optional limit; - - private final Optional offset; - - private final Map additionalProperties; - - private AuditServiceListAuditEventsRequest( - Optional filterOpsContextChangeId, - Optional filterOpsContextRequestId, - Optional filterOpsContextTraceId, - Optional filterOpsContextSessionId, - Optional filterOpsContextActor, - Optional filterOpsContextActorType, - Optional filterOpsContextAccessType, - Optional filterOpsContextIpAddress, - Optional filterOpsContextOrigin, - Optional filterOpsContextAuthMode, - Optional filterOpsContextJwtId, - Optional filterOpsContextBearerTokenContextId, - Optional filterOpsParentAccountId, - String filterOpsAccountId, - Optional filterOpsWorkspaceId, - Optional filterOpsVaultId, - Optional filterOpsResourceIDs, - Optional filterOpsActionType, - Optional filterOpsResourceType, - Optional filterOpsTags, - Optional filterOpsResponseCode, - Optional filterOpsStartTime, - Optional filterOpsEndTime, - Optional filterOpsApiName, - Optional filterOpsResponseMessage, - Optional filterOpsHttpMethod, - Optional filterOpsHttpUri, - Optional sortOpsSortBy, - Optional sortOpsOrderBy, - Optional afterOpsTimestamp, - Optional afterOpsChangeId, - Optional limit, - Optional offset, - Map additionalProperties) { - this.filterOpsContextChangeId = filterOpsContextChangeId; - this.filterOpsContextRequestId = filterOpsContextRequestId; - this.filterOpsContextTraceId = filterOpsContextTraceId; - this.filterOpsContextSessionId = filterOpsContextSessionId; - this.filterOpsContextActor = filterOpsContextActor; - this.filterOpsContextActorType = filterOpsContextActorType; - this.filterOpsContextAccessType = filterOpsContextAccessType; - this.filterOpsContextIpAddress = filterOpsContextIpAddress; - this.filterOpsContextOrigin = filterOpsContextOrigin; - this.filterOpsContextAuthMode = filterOpsContextAuthMode; - this.filterOpsContextJwtId = filterOpsContextJwtId; - this.filterOpsContextBearerTokenContextId = filterOpsContextBearerTokenContextId; - this.filterOpsParentAccountId = filterOpsParentAccountId; - this.filterOpsAccountId = filterOpsAccountId; - this.filterOpsWorkspaceId = filterOpsWorkspaceId; - this.filterOpsVaultId = filterOpsVaultId; - this.filterOpsResourceIDs = filterOpsResourceIDs; - this.filterOpsActionType = filterOpsActionType; - this.filterOpsResourceType = filterOpsResourceType; - this.filterOpsTags = filterOpsTags; - this.filterOpsResponseCode = filterOpsResponseCode; - this.filterOpsStartTime = filterOpsStartTime; - this.filterOpsEndTime = filterOpsEndTime; - this.filterOpsApiName = filterOpsApiName; - this.filterOpsResponseMessage = filterOpsResponseMessage; - this.filterOpsHttpMethod = filterOpsHttpMethod; - this.filterOpsHttpUri = filterOpsHttpUri; - this.sortOpsSortBy = sortOpsSortBy; - this.sortOpsOrderBy = sortOpsOrderBy; - this.afterOpsTimestamp = afterOpsTimestamp; - this.afterOpsChangeId = afterOpsChangeId; - this.limit = limit; - this.offset = offset; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID for the audit event. - */ - @JsonProperty("filterOps.context.changeID") - public Optional getFilterOpsContextChangeId() { - return filterOpsContextChangeId; - } - - /** - * @return ID for the request that caused the event. - */ - @JsonProperty("filterOps.context.requestID") - public Optional getFilterOpsContextRequestId() { - return filterOpsContextRequestId; - } - - /** - * @return ID for the request set by the service that received the request. - */ - @JsonProperty("filterOps.context.traceID") - public Optional getFilterOpsContextTraceId() { - return filterOpsContextTraceId; - } - - /** - * @return ID for the session in which the request was sent. - */ - @JsonProperty("filterOps.context.sessionID") - public Optional getFilterOpsContextSessionId() { - return filterOpsContextSessionId; - } - - /** - * @return Member who sent the request. Depending on actorType, this may be a user ID or a service account ID. - */ - @JsonProperty("filterOps.context.actor") - public Optional getFilterOpsContextActor() { - return filterOpsContextActor; - } - - /** - * @return Type of member who sent the request. - */ - @JsonProperty("filterOps.context.actorType") - public Optional getFilterOpsContextActorType() { - return filterOpsContextActorType; - } - - /** - * @return Type of access for the request. - */ - @JsonProperty("filterOps.context.accessType") - public Optional getFilterOpsContextAccessType() { - return filterOpsContextAccessType; - } - - /** - * @return IP Address of the client that made the request. - */ - @JsonProperty("filterOps.context.ipAddress") - public Optional getFilterOpsContextIpAddress() { - return filterOpsContextIpAddress; - } - - /** - * @return HTTP Origin request header (including scheme, hostname, and port) of the request. - */ - @JsonProperty("filterOps.context.origin") - public Optional getFilterOpsContextOrigin() { - return filterOpsContextOrigin; - } - - /** - * @return Authentication mode the actor used. - */ - @JsonProperty("filterOps.context.authMode") - public Optional getFilterOpsContextAuthMode() { - return filterOpsContextAuthMode; - } - - /** - * @return ID of the JWT token. - */ - @JsonProperty("filterOps.context.jwtID") - public Optional getFilterOpsContextJwtId() { - return filterOpsContextJwtId; - } - - /** - * @return Embedded User Context. - */ - @JsonProperty("filterOps.context.bearerTokenContextID") - public Optional getFilterOpsContextBearerTokenContextId() { - return filterOpsContextBearerTokenContextId; - } - - /** - * @return Resources with the specified parent account ID. - */ - @JsonProperty("filterOps.parentAccountID") - public Optional getFilterOpsParentAccountId() { - return filterOpsParentAccountId; - } - - /** - * @return Resources with the specified account ID. - */ - @JsonProperty("filterOps.accountID") - public String getFilterOpsAccountId() { - return filterOpsAccountId; - } - - /** - * @return Resources with the specified workspace ID. - */ - @JsonProperty("filterOps.workspaceID") - public Optional getFilterOpsWorkspaceId() { - return filterOpsWorkspaceId; - } - - /** - * @return Resources with the specified vault ID. - */ - @JsonProperty("filterOps.vaultID") - public Optional getFilterOpsVaultId() { - return filterOpsVaultId; - } - - /** - * @return Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890". - */ - @JsonProperty("filterOps.resourceIDs") - public Optional getFilterOpsResourceIDs() { - return filterOpsResourceIDs; - } - - /** - * @return Events with the specified action type. - */ - @JsonProperty("filterOps.actionType") - public Optional getFilterOpsActionType() { - return filterOpsActionType; - } - - /** - * @return Resources with the specified type. - */ - @JsonProperty("filterOps.resourceType") - public Optional getFilterOpsResourceType() { - return filterOpsResourceType; - } - - /** - * @return Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get". - */ - @JsonProperty("filterOps.tags") - public Optional getFilterOpsTags() { - return filterOpsTags; - } - - /** - * @return HTTP response code of the request. - */ - @JsonProperty("filterOps.responseCode") - public Optional getFilterOpsResponseCode() { - return filterOpsResponseCode; - } - - /** - * @return Start timestamp for the query, in SQL format. - */ - @JsonProperty("filterOps.startTime") - public Optional getFilterOpsStartTime() { - return filterOpsStartTime; - } - - /** - * @return End timestamp for the query, in SQL format. - */ - @JsonProperty("filterOps.endTime") - public Optional getFilterOpsEndTime() { - return filterOpsEndTime; - } - - /** - * @return Name of the API called in the request. - */ - @JsonProperty("filterOps.apiName") - public Optional getFilterOpsApiName() { - return filterOpsApiName; - } - - /** - * @return Response message of the request. - */ - @JsonProperty("filterOps.responseMessage") - public Optional getFilterOpsResponseMessage() { - return filterOpsResponseMessage; - } - - /** - * @return HTTP method of the request. - */ - @JsonProperty("filterOps.httpMethod") - public Optional getFilterOpsHttpMethod() { - return filterOpsHttpMethod; - } - - /** - * @return HTTP URI of the request. - */ - @JsonProperty("filterOps.httpURI") - public Optional getFilterOpsHttpUri() { - return filterOpsHttpUri; - } - - /** - * @return Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase"). - */ - @JsonProperty("sortOps.sortBy") - public Optional getSortOpsSortBy() { - return sortOpsSortBy; - } - - /** - * @return Ascending or descending ordering of results. - */ - @JsonProperty("sortOps.orderBy") - public Optional getSortOpsOrderBy() { - return sortOpsOrderBy; - } - - /** - * @return Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("afterOps.timestamp") - public Optional getAfterOpsTimestamp() { - return afterOpsTimestamp; - } - - /** - * @return Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("afterOps.changeID") - public Optional getAfterOpsChangeId() { - return afterOpsChangeId; - } - - /** - * @return Number of results to return. - */ - @JsonProperty("limit") - public Optional getLimit() { - return limit; - } - - /** - * @return Record position at which to start returning results. - */ - @JsonProperty("offset") - public Optional getOffset() { - return offset; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditServiceListAuditEventsRequest - && equalTo((AuditServiceListAuditEventsRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditServiceListAuditEventsRequest other) { - return filterOpsContextChangeId.equals(other.filterOpsContextChangeId) - && filterOpsContextRequestId.equals(other.filterOpsContextRequestId) - && filterOpsContextTraceId.equals(other.filterOpsContextTraceId) - && filterOpsContextSessionId.equals(other.filterOpsContextSessionId) - && filterOpsContextActor.equals(other.filterOpsContextActor) - && filterOpsContextActorType.equals(other.filterOpsContextActorType) - && filterOpsContextAccessType.equals(other.filterOpsContextAccessType) - && filterOpsContextIpAddress.equals(other.filterOpsContextIpAddress) - && filterOpsContextOrigin.equals(other.filterOpsContextOrigin) - && filterOpsContextAuthMode.equals(other.filterOpsContextAuthMode) - && filterOpsContextJwtId.equals(other.filterOpsContextJwtId) - && filterOpsContextBearerTokenContextId.equals(other.filterOpsContextBearerTokenContextId) - && filterOpsParentAccountId.equals(other.filterOpsParentAccountId) - && filterOpsAccountId.equals(other.filterOpsAccountId) - && filterOpsWorkspaceId.equals(other.filterOpsWorkspaceId) - && filterOpsVaultId.equals(other.filterOpsVaultId) - && filterOpsResourceIDs.equals(other.filterOpsResourceIDs) - && filterOpsActionType.equals(other.filterOpsActionType) - && filterOpsResourceType.equals(other.filterOpsResourceType) - && filterOpsTags.equals(other.filterOpsTags) - && filterOpsResponseCode.equals(other.filterOpsResponseCode) - && filterOpsStartTime.equals(other.filterOpsStartTime) - && filterOpsEndTime.equals(other.filterOpsEndTime) - && filterOpsApiName.equals(other.filterOpsApiName) - && filterOpsResponseMessage.equals(other.filterOpsResponseMessage) - && filterOpsHttpMethod.equals(other.filterOpsHttpMethod) - && filterOpsHttpUri.equals(other.filterOpsHttpUri) - && sortOpsSortBy.equals(other.sortOpsSortBy) - && sortOpsOrderBy.equals(other.sortOpsOrderBy) - && afterOpsTimestamp.equals(other.afterOpsTimestamp) - && afterOpsChangeId.equals(other.afterOpsChangeId) - && limit.equals(other.limit) - && offset.equals(other.offset); - } - - @Override - public int hashCode() { - return Objects.hash( - this.filterOpsContextChangeId, - this.filterOpsContextRequestId, - this.filterOpsContextTraceId, - this.filterOpsContextSessionId, - this.filterOpsContextActor, - this.filterOpsContextActorType, - this.filterOpsContextAccessType, - this.filterOpsContextIpAddress, - this.filterOpsContextOrigin, - this.filterOpsContextAuthMode, - this.filterOpsContextJwtId, - this.filterOpsContextBearerTokenContextId, - this.filterOpsParentAccountId, - this.filterOpsAccountId, - this.filterOpsWorkspaceId, - this.filterOpsVaultId, - this.filterOpsResourceIDs, - this.filterOpsActionType, - this.filterOpsResourceType, - this.filterOpsTags, - this.filterOpsResponseCode, - this.filterOpsStartTime, - this.filterOpsEndTime, - this.filterOpsApiName, - this.filterOpsResponseMessage, - this.filterOpsHttpMethod, - this.filterOpsHttpUri, - this.sortOpsSortBy, - this.sortOpsOrderBy, - this.afterOpsTimestamp, - this.afterOpsChangeId, - this.limit, - this.offset); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FilterOpsAccountIdStage builder() { - return new Builder(); - } - - public interface FilterOpsAccountIdStage { - /** - * Resources with the specified account ID. - */ - _FinalStage filterOpsAccountId(@NotNull String filterOpsAccountId); - - Builder from(AuditServiceListAuditEventsRequest other); - } - - public interface _FinalStage { - AuditServiceListAuditEventsRequest build(); - - /** - *

ID for the audit event.

- */ - _FinalStage filterOpsContextChangeId(Optional filterOpsContextChangeId); - - _FinalStage filterOpsContextChangeId(String filterOpsContextChangeId); - - /** - *

ID for the request that caused the event.

- */ - _FinalStage filterOpsContextRequestId(Optional filterOpsContextRequestId); - - _FinalStage filterOpsContextRequestId(String filterOpsContextRequestId); - - /** - *

ID for the request set by the service that received the request.

- */ - _FinalStage filterOpsContextTraceId(Optional filterOpsContextTraceId); - - _FinalStage filterOpsContextTraceId(String filterOpsContextTraceId); - - /** - *

ID for the session in which the request was sent.

- */ - _FinalStage filterOpsContextSessionId(Optional filterOpsContextSessionId); - - _FinalStage filterOpsContextSessionId(String filterOpsContextSessionId); - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- */ - _FinalStage filterOpsContextActor(Optional filterOpsContextActor); - - _FinalStage filterOpsContextActor(String filterOpsContextActor); - - /** - *

Type of member who sent the request.

- */ - _FinalStage filterOpsContextActorType( - Optional filterOpsContextActorType); - - _FinalStage filterOpsContextActorType( - AuditServiceListAuditEventsRequestFilterOpsContextActorType filterOpsContextActorType); - - /** - *

Type of access for the request.

- */ - _FinalStage filterOpsContextAccessType( - Optional filterOpsContextAccessType); - - _FinalStage filterOpsContextAccessType( - AuditServiceListAuditEventsRequestFilterOpsContextAccessType filterOpsContextAccessType); - - /** - *

IP Address of the client that made the request.

- */ - _FinalStage filterOpsContextIpAddress(Optional filterOpsContextIpAddress); - - _FinalStage filterOpsContextIpAddress(String filterOpsContextIpAddress); - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- */ - _FinalStage filterOpsContextOrigin(Optional filterOpsContextOrigin); - - _FinalStage filterOpsContextOrigin(String filterOpsContextOrigin); - - /** - *

Authentication mode the actor used.

- */ - _FinalStage filterOpsContextAuthMode( - Optional filterOpsContextAuthMode); - - _FinalStage filterOpsContextAuthMode( - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode filterOpsContextAuthMode); - - /** - *

ID of the JWT token.

- */ - _FinalStage filterOpsContextJwtId(Optional filterOpsContextJwtId); - - _FinalStage filterOpsContextJwtId(String filterOpsContextJwtId); - - /** - *

Embedded User Context.

- */ - _FinalStage filterOpsContextBearerTokenContextId(Optional filterOpsContextBearerTokenContextId); - - _FinalStage filterOpsContextBearerTokenContextId(String filterOpsContextBearerTokenContextId); - - /** - *

Resources with the specified parent account ID.

- */ - _FinalStage filterOpsParentAccountId(Optional filterOpsParentAccountId); - - _FinalStage filterOpsParentAccountId(String filterOpsParentAccountId); - - /** - *

Resources with the specified workspace ID.

- */ - _FinalStage filterOpsWorkspaceId(Optional filterOpsWorkspaceId); - - _FinalStage filterOpsWorkspaceId(String filterOpsWorkspaceId); - - /** - *

Resources with the specified vault ID.

- */ - _FinalStage filterOpsVaultId(Optional filterOpsVaultId); - - _FinalStage filterOpsVaultId(String filterOpsVaultId); - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- */ - _FinalStage filterOpsResourceIDs(Optional filterOpsResourceIDs); - - _FinalStage filterOpsResourceIDs(String filterOpsResourceIDs); - - /** - *

Events with the specified action type.

- */ - _FinalStage filterOpsActionType( - Optional filterOpsActionType); - - _FinalStage filterOpsActionType(AuditServiceListAuditEventsRequestFilterOpsActionType filterOpsActionType); - - /** - *

Resources with the specified type.

- */ - _FinalStage filterOpsResourceType( - Optional filterOpsResourceType); - - _FinalStage filterOpsResourceType( - AuditServiceListAuditEventsRequestFilterOpsResourceType filterOpsResourceType); - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- */ - _FinalStage filterOpsTags(Optional filterOpsTags); - - _FinalStage filterOpsTags(String filterOpsTags); - - /** - *

HTTP response code of the request.

- */ - _FinalStage filterOpsResponseCode(Optional filterOpsResponseCode); - - _FinalStage filterOpsResponseCode(Integer filterOpsResponseCode); - - /** - *

Start timestamp for the query, in SQL format.

- */ - _FinalStage filterOpsStartTime(Optional filterOpsStartTime); - - _FinalStage filterOpsStartTime(String filterOpsStartTime); - - /** - *

End timestamp for the query, in SQL format.

- */ - _FinalStage filterOpsEndTime(Optional filterOpsEndTime); - - _FinalStage filterOpsEndTime(String filterOpsEndTime); - - /** - *

Name of the API called in the request.

- */ - _FinalStage filterOpsApiName(Optional filterOpsApiName); - - _FinalStage filterOpsApiName(String filterOpsApiName); - - /** - *

Response message of the request.

- */ - _FinalStage filterOpsResponseMessage(Optional filterOpsResponseMessage); - - _FinalStage filterOpsResponseMessage(String filterOpsResponseMessage); - - /** - *

HTTP method of the request.

- */ - _FinalStage filterOpsHttpMethod(Optional filterOpsHttpMethod); - - _FinalStage filterOpsHttpMethod(String filterOpsHttpMethod); - - /** - *

HTTP URI of the request.

- */ - _FinalStage filterOpsHttpUri(Optional filterOpsHttpUri); - - _FinalStage filterOpsHttpUri(String filterOpsHttpUri); - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- */ - _FinalStage sortOpsSortBy(Optional sortOpsSortBy); - - _FinalStage sortOpsSortBy(String sortOpsSortBy); - - /** - *

Ascending or descending ordering of results.

- */ - _FinalStage sortOpsOrderBy(Optional sortOpsOrderBy); - - _FinalStage sortOpsOrderBy(AuditServiceListAuditEventsRequestSortOpsOrderBy sortOpsOrderBy); - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - _FinalStage afterOpsTimestamp(Optional afterOpsTimestamp); - - _FinalStage afterOpsTimestamp(String afterOpsTimestamp); - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - _FinalStage afterOpsChangeId(Optional afterOpsChangeId); - - _FinalStage afterOpsChangeId(String afterOpsChangeId); - - /** - *

Number of results to return.

- */ - _FinalStage limit(Optional limit); - - _FinalStage limit(Long limit); - - /** - *

Record position at which to start returning results.

- */ - _FinalStage offset(Optional offset); - - _FinalStage offset(Long offset); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FilterOpsAccountIdStage, _FinalStage { - private String filterOpsAccountId; - - private Optional offset = Optional.empty(); - - private Optional limit = Optional.empty(); - - private Optional afterOpsChangeId = Optional.empty(); - - private Optional afterOpsTimestamp = Optional.empty(); - - private Optional sortOpsOrderBy = Optional.empty(); - - private Optional sortOpsSortBy = Optional.empty(); - - private Optional filterOpsHttpUri = Optional.empty(); - - private Optional filterOpsHttpMethod = Optional.empty(); - - private Optional filterOpsResponseMessage = Optional.empty(); - - private Optional filterOpsApiName = Optional.empty(); - - private Optional filterOpsEndTime = Optional.empty(); - - private Optional filterOpsStartTime = Optional.empty(); - - private Optional filterOpsResponseCode = Optional.empty(); - - private Optional filterOpsTags = Optional.empty(); - - private Optional filterOpsResourceType = - Optional.empty(); - - private Optional filterOpsActionType = Optional.empty(); - - private Optional filterOpsResourceIDs = Optional.empty(); - - private Optional filterOpsVaultId = Optional.empty(); - - private Optional filterOpsWorkspaceId = Optional.empty(); - - private Optional filterOpsParentAccountId = Optional.empty(); - - private Optional filterOpsContextBearerTokenContextId = Optional.empty(); - - private Optional filterOpsContextJwtId = Optional.empty(); - - private Optional filterOpsContextAuthMode = - Optional.empty(); - - private Optional filterOpsContextOrigin = Optional.empty(); - - private Optional filterOpsContextIpAddress = Optional.empty(); - - private Optional filterOpsContextAccessType = - Optional.empty(); - - private Optional filterOpsContextActorType = - Optional.empty(); - - private Optional filterOpsContextActor = Optional.empty(); - - private Optional filterOpsContextSessionId = Optional.empty(); - - private Optional filterOpsContextTraceId = Optional.empty(); - - private Optional filterOpsContextRequestId = Optional.empty(); - - private Optional filterOpsContextChangeId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(AuditServiceListAuditEventsRequest other) { - filterOpsContextChangeId(other.getFilterOpsContextChangeId()); - filterOpsContextRequestId(other.getFilterOpsContextRequestId()); - filterOpsContextTraceId(other.getFilterOpsContextTraceId()); - filterOpsContextSessionId(other.getFilterOpsContextSessionId()); - filterOpsContextActor(other.getFilterOpsContextActor()); - filterOpsContextActorType(other.getFilterOpsContextActorType()); - filterOpsContextAccessType(other.getFilterOpsContextAccessType()); - filterOpsContextIpAddress(other.getFilterOpsContextIpAddress()); - filterOpsContextOrigin(other.getFilterOpsContextOrigin()); - filterOpsContextAuthMode(other.getFilterOpsContextAuthMode()); - filterOpsContextJwtId(other.getFilterOpsContextJwtId()); - filterOpsContextBearerTokenContextId(other.getFilterOpsContextBearerTokenContextId()); - filterOpsParentAccountId(other.getFilterOpsParentAccountId()); - filterOpsAccountId(other.getFilterOpsAccountId()); - filterOpsWorkspaceId(other.getFilterOpsWorkspaceId()); - filterOpsVaultId(other.getFilterOpsVaultId()); - filterOpsResourceIDs(other.getFilterOpsResourceIDs()); - filterOpsActionType(other.getFilterOpsActionType()); - filterOpsResourceType(other.getFilterOpsResourceType()); - filterOpsTags(other.getFilterOpsTags()); - filterOpsResponseCode(other.getFilterOpsResponseCode()); - filterOpsStartTime(other.getFilterOpsStartTime()); - filterOpsEndTime(other.getFilterOpsEndTime()); - filterOpsApiName(other.getFilterOpsApiName()); - filterOpsResponseMessage(other.getFilterOpsResponseMessage()); - filterOpsHttpMethod(other.getFilterOpsHttpMethod()); - filterOpsHttpUri(other.getFilterOpsHttpUri()); - sortOpsSortBy(other.getSortOpsSortBy()); - sortOpsOrderBy(other.getSortOpsOrderBy()); - afterOpsTimestamp(other.getAfterOpsTimestamp()); - afterOpsChangeId(other.getAfterOpsChangeId()); - limit(other.getLimit()); - offset(other.getOffset()); - return this; - } - - /** - * Resources with the specified account ID.

Resources with the specified account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("filterOps.accountID") - public _FinalStage filterOpsAccountId(@NotNull String filterOpsAccountId) { - this.filterOpsAccountId = Objects.requireNonNull(filterOpsAccountId, "filterOpsAccountId must not be null"); - return this; - } - - /** - *

Record position at which to start returning results.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage offset(Long offset) { - this.offset = Optional.ofNullable(offset); - return this; - } - - /** - *

Record position at which to start returning results.

- */ - @Override - @JsonSetter(value = "offset", nulls = Nulls.SKIP) - public _FinalStage offset(Optional offset) { - this.offset = offset; - return this; - } - - /** - *

Number of results to return.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage limit(Long limit) { - this.limit = Optional.ofNullable(limit); - return this; - } - - /** - *

Number of results to return.

- */ - @Override - @JsonSetter(value = "limit", nulls = Nulls.SKIP) - public _FinalStage limit(Optional limit) { - this.limit = limit; - return this; - } - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage afterOpsChangeId(String afterOpsChangeId) { - this.afterOpsChangeId = Optional.ofNullable(afterOpsChangeId); - return this; - } - - /** - *

Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - @Override - @JsonSetter(value = "afterOps.changeID", nulls = Nulls.SKIP) - public _FinalStage afterOpsChangeId(Optional afterOpsChangeId) { - this.afterOpsChangeId = afterOpsChangeId; - return this; - } - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage afterOpsTimestamp(String afterOpsTimestamp) { - this.afterOpsTimestamp = Optional.ofNullable(afterOpsTimestamp); - return this; - } - - /** - *

Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

- */ - @Override - @JsonSetter(value = "afterOps.timestamp", nulls = Nulls.SKIP) - public _FinalStage afterOpsTimestamp(Optional afterOpsTimestamp) { - this.afterOpsTimestamp = afterOpsTimestamp; - return this; - } - - /** - *

Ascending or descending ordering of results.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage sortOpsOrderBy(AuditServiceListAuditEventsRequestSortOpsOrderBy sortOpsOrderBy) { - this.sortOpsOrderBy = Optional.ofNullable(sortOpsOrderBy); - return this; - } - - /** - *

Ascending or descending ordering of results.

- */ - @Override - @JsonSetter(value = "sortOps.orderBy", nulls = Nulls.SKIP) - public _FinalStage sortOpsOrderBy(Optional sortOpsOrderBy) { - this.sortOpsOrderBy = sortOpsOrderBy; - return this; - } - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage sortOpsSortBy(String sortOpsSortBy) { - this.sortOpsSortBy = Optional.ofNullable(sortOpsSortBy); - return this; - } - - /** - *

Fully-qualified field by which to sort results. Field names should be in camel case (for example, "capitalization.camelCase").

- */ - @Override - @JsonSetter(value = "sortOps.sortBy", nulls = Nulls.SKIP) - public _FinalStage sortOpsSortBy(Optional sortOpsSortBy) { - this.sortOpsSortBy = sortOpsSortBy; - return this; - } - - /** - *

HTTP URI of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsHttpUri(String filterOpsHttpUri) { - this.filterOpsHttpUri = Optional.ofNullable(filterOpsHttpUri); - return this; - } - - /** - *

HTTP URI of the request.

- */ - @Override - @JsonSetter(value = "filterOps.httpURI", nulls = Nulls.SKIP) - public _FinalStage filterOpsHttpUri(Optional filterOpsHttpUri) { - this.filterOpsHttpUri = filterOpsHttpUri; - return this; - } - - /** - *

HTTP method of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsHttpMethod(String filterOpsHttpMethod) { - this.filterOpsHttpMethod = Optional.ofNullable(filterOpsHttpMethod); - return this; - } - - /** - *

HTTP method of the request.

- */ - @Override - @JsonSetter(value = "filterOps.httpMethod", nulls = Nulls.SKIP) - public _FinalStage filterOpsHttpMethod(Optional filterOpsHttpMethod) { - this.filterOpsHttpMethod = filterOpsHttpMethod; - return this; - } - - /** - *

Response message of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResponseMessage(String filterOpsResponseMessage) { - this.filterOpsResponseMessage = Optional.ofNullable(filterOpsResponseMessage); - return this; - } - - /** - *

Response message of the request.

- */ - @Override - @JsonSetter(value = "filterOps.responseMessage", nulls = Nulls.SKIP) - public _FinalStage filterOpsResponseMessage(Optional filterOpsResponseMessage) { - this.filterOpsResponseMessage = filterOpsResponseMessage; - return this; - } - - /** - *

Name of the API called in the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsApiName(String filterOpsApiName) { - this.filterOpsApiName = Optional.ofNullable(filterOpsApiName); - return this; - } - - /** - *

Name of the API called in the request.

- */ - @Override - @JsonSetter(value = "filterOps.apiName", nulls = Nulls.SKIP) - public _FinalStage filterOpsApiName(Optional filterOpsApiName) { - this.filterOpsApiName = filterOpsApiName; - return this; - } - - /** - *

End timestamp for the query, in SQL format.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsEndTime(String filterOpsEndTime) { - this.filterOpsEndTime = Optional.ofNullable(filterOpsEndTime); - return this; - } - - /** - *

End timestamp for the query, in SQL format.

- */ - @Override - @JsonSetter(value = "filterOps.endTime", nulls = Nulls.SKIP) - public _FinalStage filterOpsEndTime(Optional filterOpsEndTime) { - this.filterOpsEndTime = filterOpsEndTime; - return this; - } - - /** - *

Start timestamp for the query, in SQL format.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsStartTime(String filterOpsStartTime) { - this.filterOpsStartTime = Optional.ofNullable(filterOpsStartTime); - return this; - } - - /** - *

Start timestamp for the query, in SQL format.

- */ - @Override - @JsonSetter(value = "filterOps.startTime", nulls = Nulls.SKIP) - public _FinalStage filterOpsStartTime(Optional filterOpsStartTime) { - this.filterOpsStartTime = filterOpsStartTime; - return this; - } - - /** - *

HTTP response code of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResponseCode(Integer filterOpsResponseCode) { - this.filterOpsResponseCode = Optional.ofNullable(filterOpsResponseCode); - return this; - } - - /** - *

HTTP response code of the request.

- */ - @Override - @JsonSetter(value = "filterOps.responseCode", nulls = Nulls.SKIP) - public _FinalStage filterOpsResponseCode(Optional filterOpsResponseCode) { - this.filterOpsResponseCode = filterOpsResponseCode; - return this; - } - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsTags(String filterOpsTags) { - this.filterOpsTags = Optional.ofNullable(filterOpsTags); - return this; - } - - /** - *

Events with associated tags. If an event matches at least one tag, the event is returned. Comma-separated list. For example, "login, get".

- */ - @Override - @JsonSetter(value = "filterOps.tags", nulls = Nulls.SKIP) - public _FinalStage filterOpsTags(Optional filterOpsTags) { - this.filterOpsTags = filterOpsTags; - return this; - } - - /** - *

Resources with the specified type.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResourceType( - AuditServiceListAuditEventsRequestFilterOpsResourceType filterOpsResourceType) { - this.filterOpsResourceType = Optional.ofNullable(filterOpsResourceType); - return this; - } - - /** - *

Resources with the specified type.

- */ - @Override - @JsonSetter(value = "filterOps.resourceType", nulls = Nulls.SKIP) - public _FinalStage filterOpsResourceType( - Optional filterOpsResourceType) { - this.filterOpsResourceType = filterOpsResourceType; - return this; - } - - /** - *

Events with the specified action type.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsActionType( - AuditServiceListAuditEventsRequestFilterOpsActionType filterOpsActionType) { - this.filterOpsActionType = Optional.ofNullable(filterOpsActionType); - return this; - } - - /** - *

Events with the specified action type.

- */ - @Override - @JsonSetter(value = "filterOps.actionType", nulls = Nulls.SKIP) - public _FinalStage filterOpsActionType( - Optional filterOpsActionType) { - this.filterOpsActionType = filterOpsActionType; - return this; - } - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsResourceIDs(String filterOpsResourceIDs) { - this.filterOpsResourceIDs = Optional.ofNullable(filterOpsResourceIDs); - return this; - } - - /** - *

Resources with a specified ID. If a resource matches at least one ID, the associated event is returned. Format is a comma-separated list of "<resourceType>/<resourceID>". For example, "VAULT/12345, USER/67890".

- */ - @Override - @JsonSetter(value = "filterOps.resourceIDs", nulls = Nulls.SKIP) - public _FinalStage filterOpsResourceIDs(Optional filterOpsResourceIDs) { - this.filterOpsResourceIDs = filterOpsResourceIDs; - return this; - } - - /** - *

Resources with the specified vault ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsVaultId(String filterOpsVaultId) { - this.filterOpsVaultId = Optional.ofNullable(filterOpsVaultId); - return this; - } - - /** - *

Resources with the specified vault ID.

- */ - @Override - @JsonSetter(value = "filterOps.vaultID", nulls = Nulls.SKIP) - public _FinalStage filterOpsVaultId(Optional filterOpsVaultId) { - this.filterOpsVaultId = filterOpsVaultId; - return this; - } - - /** - *

Resources with the specified workspace ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsWorkspaceId(String filterOpsWorkspaceId) { - this.filterOpsWorkspaceId = Optional.ofNullable(filterOpsWorkspaceId); - return this; - } - - /** - *

Resources with the specified workspace ID.

- */ - @Override - @JsonSetter(value = "filterOps.workspaceID", nulls = Nulls.SKIP) - public _FinalStage filterOpsWorkspaceId(Optional filterOpsWorkspaceId) { - this.filterOpsWorkspaceId = filterOpsWorkspaceId; - return this; - } - - /** - *

Resources with the specified parent account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsParentAccountId(String filterOpsParentAccountId) { - this.filterOpsParentAccountId = Optional.ofNullable(filterOpsParentAccountId); - return this; - } - - /** - *

Resources with the specified parent account ID.

- */ - @Override - @JsonSetter(value = "filterOps.parentAccountID", nulls = Nulls.SKIP) - public _FinalStage filterOpsParentAccountId(Optional filterOpsParentAccountId) { - this.filterOpsParentAccountId = filterOpsParentAccountId; - return this; - } - - /** - *

Embedded User Context.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextBearerTokenContextId(String filterOpsContextBearerTokenContextId) { - this.filterOpsContextBearerTokenContextId = Optional.ofNullable(filterOpsContextBearerTokenContextId); - return this; - } - - /** - *

Embedded User Context.

- */ - @Override - @JsonSetter(value = "filterOps.context.bearerTokenContextID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextBearerTokenContextId(Optional filterOpsContextBearerTokenContextId) { - this.filterOpsContextBearerTokenContextId = filterOpsContextBearerTokenContextId; - return this; - } - - /** - *

ID of the JWT token.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextJwtId(String filterOpsContextJwtId) { - this.filterOpsContextJwtId = Optional.ofNullable(filterOpsContextJwtId); - return this; - } - - /** - *

ID of the JWT token.

- */ - @Override - @JsonSetter(value = "filterOps.context.jwtID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextJwtId(Optional filterOpsContextJwtId) { - this.filterOpsContextJwtId = filterOpsContextJwtId; - return this; - } - - /** - *

Authentication mode the actor used.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextAuthMode( - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode filterOpsContextAuthMode) { - this.filterOpsContextAuthMode = Optional.ofNullable(filterOpsContextAuthMode); - return this; - } - - /** - *

Authentication mode the actor used.

- */ - @Override - @JsonSetter(value = "filterOps.context.authMode", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextAuthMode( - Optional filterOpsContextAuthMode) { - this.filterOpsContextAuthMode = filterOpsContextAuthMode; - return this; - } - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextOrigin(String filterOpsContextOrigin) { - this.filterOpsContextOrigin = Optional.ofNullable(filterOpsContextOrigin); - return this; - } - - /** - *

HTTP Origin request header (including scheme, hostname, and port) of the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.origin", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextOrigin(Optional filterOpsContextOrigin) { - this.filterOpsContextOrigin = filterOpsContextOrigin; - return this; - } - - /** - *

IP Address of the client that made the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextIpAddress(String filterOpsContextIpAddress) { - this.filterOpsContextIpAddress = Optional.ofNullable(filterOpsContextIpAddress); - return this; - } - - /** - *

IP Address of the client that made the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.ipAddress", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextIpAddress(Optional filterOpsContextIpAddress) { - this.filterOpsContextIpAddress = filterOpsContextIpAddress; - return this; - } - - /** - *

Type of access for the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextAccessType( - AuditServiceListAuditEventsRequestFilterOpsContextAccessType filterOpsContextAccessType) { - this.filterOpsContextAccessType = Optional.ofNullable(filterOpsContextAccessType); - return this; - } - - /** - *

Type of access for the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.accessType", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextAccessType( - Optional filterOpsContextAccessType) { - this.filterOpsContextAccessType = filterOpsContextAccessType; - return this; - } - - /** - *

Type of member who sent the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextActorType( - AuditServiceListAuditEventsRequestFilterOpsContextActorType filterOpsContextActorType) { - this.filterOpsContextActorType = Optional.ofNullable(filterOpsContextActorType); - return this; - } - - /** - *

Type of member who sent the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.actorType", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextActorType( - Optional filterOpsContextActorType) { - this.filterOpsContextActorType = filterOpsContextActorType; - return this; - } - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextActor(String filterOpsContextActor) { - this.filterOpsContextActor = Optional.ofNullable(filterOpsContextActor); - return this; - } - - /** - *

Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

- */ - @Override - @JsonSetter(value = "filterOps.context.actor", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextActor(Optional filterOpsContextActor) { - this.filterOpsContextActor = filterOpsContextActor; - return this; - } - - /** - *

ID for the session in which the request was sent.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextSessionId(String filterOpsContextSessionId) { - this.filterOpsContextSessionId = Optional.ofNullable(filterOpsContextSessionId); - return this; - } - - /** - *

ID for the session in which the request was sent.

- */ - @Override - @JsonSetter(value = "filterOps.context.sessionID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextSessionId(Optional filterOpsContextSessionId) { - this.filterOpsContextSessionId = filterOpsContextSessionId; - return this; - } - - /** - *

ID for the request set by the service that received the request.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextTraceId(String filterOpsContextTraceId) { - this.filterOpsContextTraceId = Optional.ofNullable(filterOpsContextTraceId); - return this; - } - - /** - *

ID for the request set by the service that received the request.

- */ - @Override - @JsonSetter(value = "filterOps.context.traceID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextTraceId(Optional filterOpsContextTraceId) { - this.filterOpsContextTraceId = filterOpsContextTraceId; - return this; - } - - /** - *

ID for the request that caused the event.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextRequestId(String filterOpsContextRequestId) { - this.filterOpsContextRequestId = Optional.ofNullable(filterOpsContextRequestId); - return this; - } - - /** - *

ID for the request that caused the event.

- */ - @Override - @JsonSetter(value = "filterOps.context.requestID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextRequestId(Optional filterOpsContextRequestId) { - this.filterOpsContextRequestId = filterOpsContextRequestId; - return this; - } - - /** - *

ID for the audit event.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage filterOpsContextChangeId(String filterOpsContextChangeId) { - this.filterOpsContextChangeId = Optional.ofNullable(filterOpsContextChangeId); - return this; - } - - /** - *

ID for the audit event.

- */ - @Override - @JsonSetter(value = "filterOps.context.changeID", nulls = Nulls.SKIP) - public _FinalStage filterOpsContextChangeId(Optional filterOpsContextChangeId) { - this.filterOpsContextChangeId = filterOpsContextChangeId; - return this; - } - - @Override - public AuditServiceListAuditEventsRequest build() { - return new AuditServiceListAuditEventsRequest( - filterOpsContextChangeId, - filterOpsContextRequestId, - filterOpsContextTraceId, - filterOpsContextSessionId, - filterOpsContextActor, - filterOpsContextActorType, - filterOpsContextAccessType, - filterOpsContextIpAddress, - filterOpsContextOrigin, - filterOpsContextAuthMode, - filterOpsContextJwtId, - filterOpsContextBearerTokenContextId, - filterOpsParentAccountId, - filterOpsAccountId, - filterOpsWorkspaceId, - filterOpsVaultId, - filterOpsResourceIDs, - filterOpsActionType, - filterOpsResourceType, - filterOpsTags, - filterOpsResponseCode, - filterOpsStartTime, - filterOpsEndTime, - filterOpsApiName, - filterOpsResponseMessage, - filterOpsHttpMethod, - filterOpsHttpUri, - sortOpsSortBy, - sortOpsOrderBy, - afterOpsTimestamp, - afterOpsChangeId, - limit, - offset, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java deleted file mode 100644 index 9611f8ab..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsActionType { - NONE("NONE"), - - ASSIGN("ASSIGN"), - - CREATE("CREATE"), - - DELETE("DELETE"), - - EXECUTE("EXECUTE"), - - LIST("LIST"), - - READ("READ"), - - UNASSIGN("UNASSIGN"), - - UPDATE("UPDATE"), - - VALIDATE("VALIDATE"), - - LOGIN("LOGIN"), - - ROTATE("ROTATE"), - - SCHEDULEROTATION("SCHEDULEROTATION"), - - SCHEDULEROTATIONALERT("SCHEDULEROTATIONALERT"), - - IMPORT("IMPORT"), - - GETIMPORTPARAMETERS("GETIMPORTPARAMETERS"), - - PING("PING"), - - GETCLOUDPROVIDER("GETCLOUDPROVIDER"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsActionType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java deleted file mode 100644 index 44ac80d9..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextAccessType { - ACCESS_NONE("ACCESS_NONE"), - - API("API"), - - SQL("SQL"), - - OKTA_LOGIN("OKTA_LOGIN"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextAccessType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java deleted file mode 100644 index 1948ea9c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextActorType { - NONE("NONE"), - - USER("USER"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextActorType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java deleted file mode 100644 index 82c375aa..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsContextAuthMode { - AUTH_NONE("AUTH_NONE"), - - OKTA_JWT("OKTA_JWT"), - - SERVICE_ACCOUNT_JWT("SERVICE_ACCOUNT_JWT"), - - PAT_JWT("PAT_JWT"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsContextAuthMode(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java deleted file mode 100644 index 864213ec..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestFilterOpsResourceType { - NONE_API("NONE_API"), - - ACCOUNT("ACCOUNT"), - - AUDIT("AUDIT"), - - BASE_DATA_TYPE("BASE_DATA_TYPE"), - - FIELD_TEMPLATE("FIELD_TEMPLATE"), - - FILE("FILE"), - - KEY("KEY"), - - POLICY("POLICY"), - - PROTO_PARSE("PROTO_PARSE"), - - RECORD("RECORD"), - - ROLE("ROLE"), - - RULE("RULE"), - - SECRET("SECRET"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"), - - TOKEN("TOKEN"), - - USER("USER"), - - VAULT("VAULT"), - - VAULT_TEMPLATE("VAULT_TEMPLATE"), - - WORKSPACE("WORKSPACE"), - - TABLE("TABLE"), - - POLICY_TEMPLATE("POLICY_TEMPLATE"), - - MEMBER("MEMBER"), - - TAG("TAG"), - - CONNECTION("CONNECTION"), - - MIGRATION("MIGRATION"), - - SCHEDULED_JOB("SCHEDULED_JOB"), - - JOB("JOB"), - - COLUMN_NAME("COLUMN_NAME"), - - NETWORK_TOKEN("NETWORK_TOKEN"), - - SUBSCRIPTION("SUBSCRIPTION"); - - private final String value; - - AuditServiceListAuditEventsRequestFilterOpsResourceType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java deleted file mode 100644 index fe3f928e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.audit.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditServiceListAuditEventsRequestSortOpsOrderBy { - ASCENDING("ASCENDING"), - - DESCENDING("DESCENDING"); - - private final String value; - - AuditServiceListAuditEventsRequestSortOpsOrderBy(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java deleted file mode 100644 index fb2d07d0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java +++ /dev/null @@ -1,53 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncBinLookupClient { - protected final ClientOptions clientOptions; - - private final AsyncRawBinLookupClient rawClient; - - public AsyncBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawBinLookupClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawBinLookupClient withRawResponse() { - return this.rawClient; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin() { - return this.rawClient.binListServiceListCardsOfBin().thenApply(response -> response.body()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin(V1BinListRequest request) { - return this.rawClient.binListServiceListCardsOfBin(request).thenApply(response -> response.body()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - return this.rawClient - .binListServiceListCardsOfBin(request, requestOptions) - .thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java deleted file mode 100644 index 9cf03c7d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java +++ /dev/null @@ -1,105 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawBinLookupClient { - protected final ClientOptions clientOptions; - - public AsyncRawBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin() { - return binListServiceListCardsOfBin(V1BinListRequest.builder().build()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin( - V1BinListRequest request) { - return binListServiceListCardsOfBin(request, null); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public CompletableFuture> binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/card_lookup") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BinListResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java deleted file mode 100644 index a7822986..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; - -public class BinLookupClient { - protected final ClientOptions clientOptions; - - private final RawBinLookupClient rawClient; - - public BinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawBinLookupClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawBinLookupClient withRawResponse() { - return this.rawClient; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin() { - return this.rawClient.binListServiceListCardsOfBin().body(); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin(V1BinListRequest request) { - return this.rawClient.binListServiceListCardsOfBin(request).body(); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public V1BinListResponse binListServiceListCardsOfBin(V1BinListRequest request, RequestOptions requestOptions) { - return this.rawClient - .binListServiceListCardsOfBin(request, requestOptions) - .body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java deleted file mode 100644 index 21e77017..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; -import com.skyflow.generated.rest.types.V1BinListResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawBinLookupClient { - protected final ClientOptions clientOptions; - - public RawBinLookupClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin() { - return binListServiceListCardsOfBin(V1BinListRequest.builder().build()); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin(V1BinListRequest request) { - return binListServiceListCardsOfBin(request, null); - } - - /** - * <b>Note</b>: This endpoint is in beta and subject to change. <br><br> Returns the specified card metadata. - */ - public ApiClientHttpResponse binListServiceListCardsOfBin( - V1BinListRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/card_lookup") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BinListResponse.class), 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java deleted file mode 100644 index def40293..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java +++ /dev/null @@ -1,180 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.binlookup.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1VaultSchemaConfig; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BinListRequest.Builder.class) -public final class V1BinListRequest { - private final Optional> fields; - - private final Optional bin; - - private final Optional vaultSchemaConfig; - - private final Optional skyflowId; - - private final Map additionalProperties; - - private V1BinListRequest( - Optional> fields, - Optional bin, - Optional vaultSchemaConfig, - Optional skyflowId, - Map additionalProperties) { - this.fields = fields; - this.bin = bin; - this.vaultSchemaConfig = vaultSchemaConfig; - this.skyflowId = skyflowId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Fields to return. If not specified, all fields are returned. - */ - @JsonProperty("fields") - public Optional> getFields() { - return fields; - } - - /** - * @return BIN of the card. - */ - @JsonProperty("BIN") - public Optional getBin() { - return bin; - } - - @JsonProperty("vault_schema_config") - public Optional getVaultSchemaConfig() { - return vaultSchemaConfig; - } - - /** - * @return <code>skyflow_id</code> of the record. - */ - @JsonProperty("skyflow_id") - public Optional getSkyflowId() { - return skyflowId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BinListRequest && equalTo((V1BinListRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BinListRequest other) { - return fields.equals(other.fields) - && bin.equals(other.bin) - && vaultSchemaConfig.equals(other.vaultSchemaConfig) - && skyflowId.equals(other.skyflowId); - } - - @Override - public int hashCode() { - return Objects.hash(this.fields, this.bin, this.vaultSchemaConfig, this.skyflowId); - } - - @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> fields = Optional.empty(); - - private Optional bin = Optional.empty(); - - private Optional vaultSchemaConfig = Optional.empty(); - - private Optional skyflowId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BinListRequest other) { - fields(other.getFields()); - bin(other.getBin()); - vaultSchemaConfig(other.getVaultSchemaConfig()); - skyflowId(other.getSkyflowId()); - return this; - } - - /** - *

Fields to return. If not specified, all fields are returned.

- */ - @JsonSetter(value = "fields", nulls = Nulls.SKIP) - public Builder fields(Optional> fields) { - this.fields = fields; - return this; - } - - public Builder fields(List fields) { - this.fields = Optional.ofNullable(fields); - return this; - } - - /** - *

BIN of the card.

- */ - @JsonSetter(value = "BIN", nulls = Nulls.SKIP) - public Builder bin(Optional bin) { - this.bin = bin; - return this; - } - - public Builder bin(String bin) { - this.bin = Optional.ofNullable(bin); - return this; - } - - @JsonSetter(value = "vault_schema_config", nulls = Nulls.SKIP) - public Builder vaultSchemaConfig(Optional vaultSchemaConfig) { - this.vaultSchemaConfig = vaultSchemaConfig; - return this; - } - - public Builder vaultSchemaConfig(V1VaultSchemaConfig vaultSchemaConfig) { - this.vaultSchemaConfig = Optional.ofNullable(vaultSchemaConfig); - return this; - } - - /** - *

<code>skyflow_id</code> of the record.

- */ - @JsonSetter(value = "skyflow_id", nulls = Nulls.SKIP) - public Builder skyflowId(Optional skyflowId) { - this.skyflowId = skyflowId; - return this; - } - - public Builder skyflowId(String skyflowId) { - this.skyflowId = Optional.ofNullable(skyflowId); - return this; - } - - public V1BinListRequest build() { - return new V1BinListRequest(fields, bin, vaultSchemaConfig, skyflowId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java index 01031423..d465ff62 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java @@ -5,11 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; - +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.util.concurrent.CompletableFuture; public class AsyncFilesClient { @@ -30,181 +27,17 @@ public AsyncRawFilesClient withRawResponse() { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). - */ - public CompletableFuture deidentifyFile(DeidentifyFileRequest request) { - return this.rawClient.deidentifyFile(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). - */ - public CompletableFuture deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyFile(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return this.rawClient.deidentifyAudio(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - return this.rawClient.deidentifyAudio(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return this.rawClient.deidentifyDocument(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - return this.rawClient.deidentifyDocument(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return this.rawClient.deidentifyPdf(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPdf(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return this.rawClient.deidentifyImage(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - return this.rawClient.deidentifyImage(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return this.rawClient.deidentifyPresentation(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPresentation(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return this.rawClient.deidentifySpreadsheet(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - return this.rawClient.deidentifySpreadsheet(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return this.rawClient.deidentifyStructuredText(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyStructuredText(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return this.rawClient.deidentifyText(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyText(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return this.rawClient.reidentifyFile(request).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - return this.rawClient.reidentifyFile(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture getRun(String runId) { - return this.rawClient.getRun(runId).thenApply(response -> response.body()); - } - - /** - * Returns the status of a detect run. + * Uploads a file to a new or specified record. */ - public CompletableFuture getRun(String runId, GetRunRequest request) { - return this.rawClient.getRun(runId, request).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, request).thenApply(response -> response.body()); } /** - * Returns the status of a detect run. + * Uploads a file to a new or specified record. */ - public CompletableFuture getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - return this.rawClient.getRun(runId, request, requestOptions).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java index e7f008e8..75814065 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java @@ -4,20 +4,33 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.io.IOException; import java.util.concurrent.CompletableFuture; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawFilesClient { protected final ClientOptions clientOptions; @@ -27,946 +40,99 @@ public AsyncRawFilesClient(ClientOptions clientOptions) { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public CompletableFuture> deidentifyFile( - DeidentifyFileRequest request) { - return deidentifyFile(request, null); + public CompletableFuture> uploadFileV2( + String vaultId, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, request, null); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public CompletableFuture> deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() - .addPathSegments("v1/detect/deidentify/file") - .build(); - RequestBody body; + .addPathSegments("v2/vaults") + .addPathSegment(vaultId) + .addPathSegments("files") + .addPathSegments("upload"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "tableName", request.getTableName(), false); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "columnName", request.getColumnName(), false); + if (request.getSkyflowId().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "skyflowID", + request.getSkyflowId().get(), + false); + } + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } + } catch (Exception e) { + throw new RuntimeException(e); } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("POST", multipartBodyBuilder.build()) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return deidentifyAudio(request, null); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/audio") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .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<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return deidentifyDocument(request, null); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UploadFileResponseV2.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return deidentifyPdf(request, null); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document/pdf") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return deidentifyImage(request, null); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/image") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( + case 404: + future.completeExceptionally(new NotFoundError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return deidentifyPresentation(request, null); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/presentation") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return deidentifySpreadsheet(request, null); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/spreadsheet") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return deidentifyStructuredText(request, null); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/structured_text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyText( - DeidentifyFileRequestDeidentifyText request) { - return deidentifyText(request, null); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public CompletableFuture> deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture> reidentifyFile( - ReidentifyFileRequestReidentifyFile request) { - return reidentifyFile(request, null); - } - - /** - * Re-identifies tokens in a file. - */ - public CompletableFuture> reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/file") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), ReidentifyFileResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun(String runId) { - return getRun(runId, GetRunRequest.builder().build()); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun(String runId, GetRunRequest request) { - return getRun(runId, request, null); - } - - /** - * Returns the status of a detect run. - */ - public CompletableFuture> getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/runs") - .addPathSegment(runId); - if (request.getVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "vault_id", request.getVaultId().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectRunsResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; case 500: future.completeExceptionally(new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), @@ -976,12 +142,13 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java index bcda96e6..33d3786d 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java @@ -5,10 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.types.UploadFileResponseV2; public class FilesClient { protected final ClientOptions clientOptions; @@ -28,172 +26,17 @@ public RawFilesClient withRawResponse() { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) { - return this.rawClient.deidentifyFile(request).body(); + public UploadFileResponseV2 uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, request).body(); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyFile(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyAudio(DeidentifyFileAudioRequestDeidentifyAudio request) { - return this.rawClient.deidentifyAudio(request).body(); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - return this.rawClient.deidentifyAudio(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyDocument(DeidentifyFileRequestDeidentifyDocument request) { - return this.rawClient.deidentifyDocument(request).body(); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - return this.rawClient.deidentifyDocument(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPdf(DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return this.rawClient.deidentifyPdf(request).body(); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPdf(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyImage(DeidentifyFileImageRequestDeidentifyImage request) { - return this.rawClient.deidentifyImage(request).body(); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - return this.rawClient.deidentifyImage(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPresentation(DeidentifyFileRequestDeidentifyPresentation request) { - return this.rawClient.deidentifyPresentation(request).body(); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - return this.rawClient.deidentifyPresentation(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifySpreadsheet(DeidentifyFileRequestDeidentifySpreadsheet request) { - return this.rawClient.deidentifySpreadsheet(request).body(); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - return this.rawClient.deidentifySpreadsheet(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyStructuredText(DeidentifyFileRequestDeidentifyStructuredText request) { - return this.rawClient.deidentifyStructuredText(request).body(); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyStructuredText(request, requestOptions).body(); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return this.rawClient.deidentifyText(request).body(); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public DeidentifyFileResponse deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - return this.rawClient.deidentifyText(request, requestOptions).body(); - } - - /** - * Re-identifies tokens in a file. - */ - public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return this.rawClient.reidentifyFile(request).body(); - } - - /** - * Re-identifies tokens in a file. - */ - public ReidentifyFileResponse reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - return this.rawClient.reidentifyFile(request, requestOptions).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId) { - return this.rawClient.getRun(runId).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId, GetRunRequest request) { - return this.rawClient.getRun(runId, request).body(); - } - - /** - * Returns the status of a detect run. - */ - public DetectRunsResponse getRun(String runId, GetRunRequest request, RequestOptions requestOptions) { - return this.rawClient.getRun(runId, request, requestOptions).body(); + public UploadFileResponseV2 uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java index d277d224..a73991b5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java @@ -4,18 +4,29 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.*; -import com.skyflow.generated.rest.types.DeidentifyFileResponse; -import com.skyflow.generated.rest.types.DetectRunsResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.ReidentifyFileResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.types.UploadFileResponseV2; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawFilesClient { protected final ClientOptions clientOptions; @@ -25,395 +36,87 @@ public RawFilesClient(ClientOptions clientOptions) { } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse deidentifyFile(DeidentifyFileRequest request) { - return deidentifyFile(request, null); + public ApiClientHttpResponse uploadFileV2(String vaultId, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, request, null); } /** - * De-identifies sensitive data from a file. This operation includes options applicable to all supported file types.<br/><br/>For more specific options, see the category-specific operations (like <a href='#deidentify_document'>De-identify Document</a>) and the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>). + * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse deidentifyFile( - DeidentifyFileRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse uploadFileV2( + String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() - .addPathSegments("v1/detect/deidentify/file") - .build(); - RequestBody body; + .addPathSegments("v2/vaults") + .addPathSegment(vaultId) + .addPathSegments("files") + .addPathSegments("upload"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM); try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "tableName", request.getTableName(), false); + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "columnName", request.getColumnName(), false); + if (request.getSkyflowId().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "skyflowID", + request.getSkyflowId().get(), + false); + } + QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addFormDataPart( + multipartBodyBuilder, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } + } catch (Exception e) { + throw new RuntimeException(e); } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("POST", multipartBodyBuilder.build()) .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); + .addHeader("Accept", "application/json"); + Request okhttpRequest = _requestBuilder.build(); OkHttpClient client = clientOptions.httpClient(); if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request) { - return deidentifyAudio(request, null); - } - - /** - * De-identifies sensitive data from an audio file. This operation includes options applicable to all supported audio file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyAudio( - DeidentifyFileAudioRequestDeidentifyAudio request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/audio") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request) { - return deidentifyDocument(request, null); - } - - /** - * De-identifies sensitive data from a document file. This operation includes options applicable to all supported document file types.<br/><br/>For more specific options, see the file type-specific opertions (like <a href='#deidentify_pdf'>De-identify PDF</a>) where they're available. For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyDocument( - DeidentifyFileRequestDeidentifyDocument request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UploadFileResponseV2.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request) { - return deidentifyPdf(request, null); - } - - /** - * De-identifies sensitive data from a PDF file. This operation includes options specific to PDF files.<br/><br/>For broader file type support, see <a href='#deidentify_document'>De-identify Document</a> and <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPdf( - DeidentifyFileDocumentPdfRequestDeidentifyPdf request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/document/pdf") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); case 401: throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request) { - return deidentifyImage(request, null); - } - - /** - * De-identifies sensitive data from an image file. This operation includes options applicable to all supported image file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyImage( - DeidentifyFileImageRequestDeidentifyImage request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/image") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( + case 404: + throw new NotFoundError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request) { - return deidentifyPresentation(request, null); - } - - /** - * De-identifies sensitive data from a presentation file. This operation includes options applicable to all supported presentation file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyPresentation( - DeidentifyFileRequestDeidentifyPresentation request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/presentation") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); case 500: throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); @@ -421,350 +124,11 @@ public ApiClientHttpResponse deidentifyPresentation( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request) { - return deidentifySpreadsheet(request, null); - } - - /** - * De-identifies sensitive data from a spreadsheet file. This operation includes options applicable to all supported spreadsheet file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifySpreadsheet( - DeidentifyFileRequestDeidentifySpreadsheet request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/spreadsheet") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request) { - return deidentifyStructuredText(request, null); - } - - /** - * De-identifies sensitive data from a structured text file. This operation includes options applicable to all supported structured text file types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyStructuredText( - DeidentifyFileRequestDeidentifyStructuredText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/structured_text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyText(DeidentifyFileRequestDeidentifyText request) { - return deidentifyText(request, null); - } - - /** - * De-identifies sensitive data from a text file. This operation includes options applicable to all supported image text types.<br/><br/>For broader file type support, see <a href='#deidentify_file'>De-identify File</a>. - */ - public ApiClientHttpResponse deidentifyText( - DeidentifyFileRequestDeidentifyText request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/file/text") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Re-identifies tokens in a file. - */ - public ApiClientHttpResponse reidentifyFile(ReidentifyFileRequestReidentifyFile request) { - return reidentifyFile(request, null); - } - - /** - * Re-identifies tokens in a file. - */ - public ApiClientHttpResponse reidentifyFile( - ReidentifyFileRequestReidentifyFile request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/file") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + "Error with status code " + response.code(), response.code(), errorBody, response); } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), ReidentifyFileResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun(String runId) { - return getRun(runId, GetRunRequest.builder().build()); - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun(String runId, GetRunRequest request) { - return getRun(runId, request, null); - } - - /** - * Returns the status of a detect run. - */ - public ApiClientHttpResponse getRun( - String runId, GetRunRequest request, RequestOptions requestOptions) { - HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/runs") - .addPathSegment(runId); - if (request.getVaultId().isPresent()) { - QueryStringMapper.addQueryParameter( - httpUrl, "vault_id", request.getVaultId().get(), false); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl.build()) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectRunsResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java deleted file mode 100644 index c2baa931..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java +++ /dev/null @@ -1,663 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription; -import com.skyflow.generated.rest.types.FileDataDeidentifyAudio; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileAudioRequestDeidentifyAudio.Builder.class) -public final class DeidentifyFileAudioRequestDeidentifyAudio { - private final FileDataDeidentifyAudio file; - - private final String vaultId; - - private final Optional outputTranscription; - - private final Optional outputProcessedAudio; - - private final Optional bleepStartPadding; - - private final Optional bleepStopPadding; - - private final Optional bleepFrequency; - - private final Optional bleepGain; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileAudioRequestDeidentifyAudio( - FileDataDeidentifyAudio file, - String vaultId, - Optional outputTranscription, - Optional outputProcessedAudio, - Optional bleepStartPadding, - Optional bleepStopPadding, - Optional bleepFrequency, - Optional bleepGain, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.outputTranscription = outputTranscription; - this.outputProcessedAudio = outputProcessedAudio; - this.bleepStartPadding = bleepStartPadding; - this.bleepStopPadding = bleepStopPadding; - this.bleepFrequency = bleepFrequency; - this.bleepGain = bleepGain; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyAudio getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Type of transcription to output. - */ - @JsonProperty("output_transcription") - public Optional getOutputTranscription() { - return outputTranscription; - } - - /** - * @return Whether to include the processed audio file in the response. - */ - @JsonProperty("output_processed_audio") - public Optional getOutputProcessedAudio() { - return outputProcessedAudio; - } - - /** - * @return Padding added to the beginning of a bleep, in seconds. - */ - @JsonProperty("bleep_start_padding") - public Optional getBleepStartPadding() { - return bleepStartPadding; - } - - /** - * @return Padding added to the end of a bleep, in seconds. - */ - @JsonProperty("bleep_stop_padding") - public Optional getBleepStopPadding() { - return bleepStopPadding; - } - - /** - * @return The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch. - */ - @JsonProperty("bleep_frequency") - public Optional getBleepFrequency() { - return bleepFrequency; - } - - /** - * @return Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it. - */ - @JsonProperty("bleep_gain") - public Optional getBleepGain() { - return bleepGain; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileAudioRequestDeidentifyAudio - && equalTo((DeidentifyFileAudioRequestDeidentifyAudio) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileAudioRequestDeidentifyAudio other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && outputTranscription.equals(other.outputTranscription) - && outputProcessedAudio.equals(other.outputProcessedAudio) - && bleepStartPadding.equals(other.bleepStartPadding) - && bleepStopPadding.equals(other.bleepStopPadding) - && bleepFrequency.equals(other.bleepFrequency) - && bleepGain.equals(other.bleepGain) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.outputTranscription, - this.outputProcessedAudio, - this.bleepStartPadding, - this.bleepStopPadding, - this.bleepFrequency, - this.bleepGain, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyAudio file); - - Builder from(DeidentifyFileAudioRequestDeidentifyAudio other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileAudioRequestDeidentifyAudio build(); - - /** - *

Type of transcription to output.

- */ - _FinalStage outputTranscription( - Optional outputTranscription); - - _FinalStage outputTranscription( - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription outputTranscription); - - /** - *

Whether to include the processed audio file in the response.

- */ - _FinalStage outputProcessedAudio(Optional outputProcessedAudio); - - _FinalStage outputProcessedAudio(Boolean outputProcessedAudio); - - /** - *

Padding added to the beginning of a bleep, in seconds.

- */ - _FinalStage bleepStartPadding(Optional bleepStartPadding); - - _FinalStage bleepStartPadding(Float bleepStartPadding); - - /** - *

Padding added to the end of a bleep, in seconds.

- */ - _FinalStage bleepStopPadding(Optional bleepStopPadding); - - _FinalStage bleepStopPadding(Float bleepStopPadding); - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- */ - _FinalStage bleepFrequency(Optional bleepFrequency); - - _FinalStage bleepFrequency(Integer bleepFrequency); - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- */ - _FinalStage bleepGain(Optional bleepGain); - - _FinalStage bleepGain(Integer bleepGain); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyAudio file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - private Optional bleepGain = Optional.empty(); - - private Optional bleepFrequency = Optional.empty(); - - private Optional bleepStopPadding = Optional.empty(); - - private Optional bleepStartPadding = Optional.empty(); - - private Optional outputProcessedAudio = Optional.empty(); - - private Optional outputTranscription = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileAudioRequestDeidentifyAudio other) { - file(other.getFile()); - vaultId(other.getVaultId()); - outputTranscription(other.getOutputTranscription()); - outputProcessedAudio(other.getOutputProcessedAudio()); - bleepStartPadding(other.getBleepStartPadding()); - bleepStopPadding(other.getBleepStopPadding()); - bleepFrequency(other.getBleepFrequency()); - bleepGain(other.getBleepGain()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyAudio file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepGain(Integer bleepGain) { - this.bleepGain = Optional.ofNullable(bleepGain); - return this; - } - - /** - *

Relative loudness of the bleep in dB. Positive values increase its loudness, and negative values decrease it.

- */ - @Override - @JsonSetter(value = "bleep_gain", nulls = Nulls.SKIP) - public _FinalStage bleepGain(Optional bleepGain) { - this.bleepGain = bleepGain; - return this; - } - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepFrequency(Integer bleepFrequency) { - this.bleepFrequency = Optional.ofNullable(bleepFrequency); - return this; - } - - /** - *

The pitch of the bleep sound, in Hz. The higher the number, the higher the pitch.

- */ - @Override - @JsonSetter(value = "bleep_frequency", nulls = Nulls.SKIP) - public _FinalStage bleepFrequency(Optional bleepFrequency) { - this.bleepFrequency = bleepFrequency; - return this; - } - - /** - *

Padding added to the end of a bleep, in seconds.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepStopPadding(Float bleepStopPadding) { - this.bleepStopPadding = Optional.ofNullable(bleepStopPadding); - return this; - } - - /** - *

Padding added to the end of a bleep, in seconds.

- */ - @Override - @JsonSetter(value = "bleep_stop_padding", nulls = Nulls.SKIP) - public _FinalStage bleepStopPadding(Optional bleepStopPadding) { - this.bleepStopPadding = bleepStopPadding; - return this; - } - - /** - *

Padding added to the beginning of a bleep, in seconds.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage bleepStartPadding(Float bleepStartPadding) { - this.bleepStartPadding = Optional.ofNullable(bleepStartPadding); - return this; - } - - /** - *

Padding added to the beginning of a bleep, in seconds.

- */ - @Override - @JsonSetter(value = "bleep_start_padding", nulls = Nulls.SKIP) - public _FinalStage bleepStartPadding(Optional bleepStartPadding) { - this.bleepStartPadding = bleepStartPadding; - return this; - } - - /** - *

Whether to include the processed audio file in the response.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputProcessedAudio(Boolean outputProcessedAudio) { - this.outputProcessedAudio = Optional.ofNullable(outputProcessedAudio); - return this; - } - - /** - *

Whether to include the processed audio file in the response.

- */ - @Override - @JsonSetter(value = "output_processed_audio", nulls = Nulls.SKIP) - public _FinalStage outputProcessedAudio(Optional outputProcessedAudio) { - this.outputProcessedAudio = outputProcessedAudio; - return this; - } - - /** - *

Type of transcription to output.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputTranscription( - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription outputTranscription) { - this.outputTranscription = Optional.ofNullable(outputTranscription); - return this; - } - - /** - *

Type of transcription to output.

- */ - @Override - @JsonSetter(value = "output_transcription", nulls = Nulls.SKIP) - public _FinalStage outputTranscription( - Optional outputTranscription) { - this.outputTranscription = outputTranscription; - return this; - } - - @Override - public DeidentifyFileAudioRequestDeidentifyAudio build() { - return new DeidentifyFileAudioRequestDeidentifyAudio( - file, - vaultId, - outputTranscription, - outputProcessedAudio, - bleepStartPadding, - bleepStopPadding, - bleepFrequency, - bleepGain, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java deleted file mode 100644 index 1844a116..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java +++ /dev/null @@ -1,479 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyPdf; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileDocumentPdfRequestDeidentifyPdf.Builder.class) -public final class DeidentifyFileDocumentPdfRequestDeidentifyPdf { - private final FileDataDeidentifyPdf file; - - private final String vaultId; - - private final Optional density; - - private final Optional maxResolution; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileDocumentPdfRequestDeidentifyPdf( - FileDataDeidentifyPdf file, - String vaultId, - Optional density, - Optional maxResolution, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.density = density; - this.maxResolution = maxResolution; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyPdf getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Pixel density at which to process the PDF file. - */ - @JsonProperty("density") - public Optional getDensity() { - return density; - } - - /** - * @return Max resolution at which to process the PDF file. - */ - @JsonProperty("max_resolution") - public Optional getMaxResolution() { - return maxResolution; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileDocumentPdfRequestDeidentifyPdf - && equalTo((DeidentifyFileDocumentPdfRequestDeidentifyPdf) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileDocumentPdfRequestDeidentifyPdf other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && density.equals(other.density) - && maxResolution.equals(other.maxResolution) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.density, - this.maxResolution, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyPdf file); - - Builder from(DeidentifyFileDocumentPdfRequestDeidentifyPdf other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileDocumentPdfRequestDeidentifyPdf build(); - - /** - *

Pixel density at which to process the PDF file.

- */ - _FinalStage density(Optional density); - - _FinalStage density(Integer density); - - /** - *

Max resolution at which to process the PDF file.

- */ - _FinalStage maxResolution(Optional maxResolution); - - _FinalStage maxResolution(Integer maxResolution); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes( - Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyPdf file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - private Optional maxResolution = Optional.empty(); - - private Optional density = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileDocumentPdfRequestDeidentifyPdf other) { - file(other.getFile()); - vaultId(other.getVaultId()); - density(other.getDensity()); - maxResolution(other.getMaxResolution()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyPdf file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Max resolution at which to process the PDF file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage maxResolution(Integer maxResolution) { - this.maxResolution = Optional.ofNullable(maxResolution); - return this; - } - - /** - *

Max resolution at which to process the PDF file.

- */ - @Override - @JsonSetter(value = "max_resolution", nulls = Nulls.SKIP) - public _FinalStage maxResolution(Optional maxResolution) { - this.maxResolution = maxResolution; - return this; - } - - /** - *

Pixel density at which to process the PDF file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage density(Integer density) { - this.density = Optional.ofNullable(density); - return this; - } - - /** - *

Pixel density at which to process the PDF file.

- */ - @Override - @JsonSetter(value = "density", nulls = Nulls.SKIP) - public _FinalStage density(Optional density) { - this.density = density; - return this; - } - - @Override - public DeidentifyFileDocumentPdfRequestDeidentifyPdf build() { - return new DeidentifyFileDocumentPdfRequestDeidentifyPdf( - file, - vaultId, - density, - maxResolution, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java deleted file mode 100644 index 25ddea9c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java +++ /dev/null @@ -1,524 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileImageRequestDeidentifyImageEntityTypesItem; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileImageRequestDeidentifyImageMaskingMethod; -import com.skyflow.generated.rest.types.FileDataDeidentifyImage; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileImageRequestDeidentifyImage.Builder.class) -public final class DeidentifyFileImageRequestDeidentifyImage { - private final FileDataDeidentifyImage file; - - private final String vaultId; - - private final Optional outputProcessedImage; - - private final Optional outputOcrText; - - private final Optional maskingMethod; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileImageRequestDeidentifyImage( - FileDataDeidentifyImage file, - String vaultId, - Optional outputProcessedImage, - Optional outputOcrText, - Optional maskingMethod, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.outputProcessedImage = outputProcessedImage; - this.outputOcrText = outputOcrText; - this.maskingMethod = maskingMethod; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyImage getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return If true, includes processed image in the output. - */ - @JsonProperty("output_processed_image") - public Optional getOutputProcessedImage() { - return outputProcessedImage; - } - - /** - * @return If true, includes text detected by OCR in the response. - */ - @JsonProperty("output_ocr_text") - public Optional getOutputOcrText() { - return outputOcrText; - } - - /** - * @return Method to mask the entities in the image. - */ - @JsonProperty("masking_method") - public Optional getMaskingMethod() { - return maskingMethod; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileImageRequestDeidentifyImage - && equalTo((DeidentifyFileImageRequestDeidentifyImage) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileImageRequestDeidentifyImage other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && outputProcessedImage.equals(other.outputProcessedImage) - && outputOcrText.equals(other.outputOcrText) - && maskingMethod.equals(other.maskingMethod) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.outputProcessedImage, - this.outputOcrText, - this.maskingMethod, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyImage file); - - Builder from(DeidentifyFileImageRequestDeidentifyImage other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileImageRequestDeidentifyImage build(); - - /** - *

If true, includes processed image in the output.

- */ - _FinalStage outputProcessedImage(Optional outputProcessedImage); - - _FinalStage outputProcessedImage(Boolean outputProcessedImage); - - /** - *

If true, includes text detected by OCR in the response.

- */ - _FinalStage outputOcrText(Optional outputOcrText); - - _FinalStage outputOcrText(Boolean outputOcrText); - - /** - *

Method to mask the entities in the image.

- */ - _FinalStage maskingMethod(Optional maskingMethod); - - _FinalStage maskingMethod(DeidentifyFileImageRequestDeidentifyImageMaskingMethod maskingMethod); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyImage file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - private Optional maskingMethod = Optional.empty(); - - private Optional outputOcrText = Optional.empty(); - - private Optional outputProcessedImage = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileImageRequestDeidentifyImage other) { - file(other.getFile()); - vaultId(other.getVaultId()); - outputProcessedImage(other.getOutputProcessedImage()); - outputOcrText(other.getOutputOcrText()); - maskingMethod(other.getMaskingMethod()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyImage file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - /** - *

Method to mask the entities in the image.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage maskingMethod(DeidentifyFileImageRequestDeidentifyImageMaskingMethod maskingMethod) { - this.maskingMethod = Optional.ofNullable(maskingMethod); - return this; - } - - /** - *

Method to mask the entities in the image.

- */ - @Override - @JsonSetter(value = "masking_method", nulls = Nulls.SKIP) - public _FinalStage maskingMethod( - Optional maskingMethod) { - this.maskingMethod = maskingMethod; - return this; - } - - /** - *

If true, includes text detected by OCR in the response.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputOcrText(Boolean outputOcrText) { - this.outputOcrText = Optional.ofNullable(outputOcrText); - return this; - } - - /** - *

If true, includes text detected by OCR in the response.

- */ - @Override - @JsonSetter(value = "output_ocr_text", nulls = Nulls.SKIP) - public _FinalStage outputOcrText(Optional outputOcrText) { - this.outputOcrText = outputOcrText; - return this; - } - - /** - *

If true, includes processed image in the output.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage outputProcessedImage(Boolean outputProcessedImage) { - this.outputProcessedImage = Optional.ofNullable(outputProcessedImage); - return this; - } - - /** - *

If true, includes processed image in the output.

- */ - @Override - @JsonSetter(value = "output_processed_image", nulls = Nulls.SKIP) - public _FinalStage outputProcessedImage(Optional outputProcessedImage) { - this.outputProcessedImage = outputProcessedImage; - return this; - } - - @Override - public DeidentifyFileImageRequestDeidentifyImage build() { - return new DeidentifyFileImageRequestDeidentifyImage( - file, - vaultId, - outputProcessedImage, - outputOcrText, - maskingMethod, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java deleted file mode 100644 index 62d77229..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java +++ /dev/null @@ -1,385 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestEntityTypesItem; -import com.skyflow.generated.rest.types.FileData; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequest.Builder.class) -public final class DeidentifyFileRequest { - private final FileData file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequest( - FileData file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileData getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequest && equalTo((DeidentifyFileRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequest other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileData file); - - Builder from(DeidentifyFileRequest other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequest build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileData file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequest other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileData file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequest build() { - return new DeidentifyFileRequest( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java deleted file mode 100644 index c4d9841d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java +++ /dev/null @@ -1,387 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyDocumentEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyDocument; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyDocument.Builder.class) -public final class DeidentifyFileRequestDeidentifyDocument { - private final FileDataDeidentifyDocument file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyDocument( - FileDataDeidentifyDocument file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyDocument getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyDocument - && equalTo((DeidentifyFileRequestDeidentifyDocument) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyDocument other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyDocument file); - - Builder from(DeidentifyFileRequestDeidentifyDocument other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyDocument build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyDocument file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyDocument other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyDocument file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyDocument build() { - return new DeidentifyFileRequestDeidentifyDocument( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java deleted file mode 100644 index e1cea77f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyPresentationEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyPresentation; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyPresentation.Builder.class) -public final class DeidentifyFileRequestDeidentifyPresentation { - private final FileDataDeidentifyPresentation file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyPresentation( - FileDataDeidentifyPresentation file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyPresentation getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyPresentation - && equalTo((DeidentifyFileRequestDeidentifyPresentation) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyPresentation other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyPresentation file); - - Builder from(DeidentifyFileRequestDeidentifyPresentation other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyPresentation build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyPresentation file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyPresentation other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyPresentation file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyPresentation build() { - return new DeidentifyFileRequestDeidentifyPresentation( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java deleted file mode 100644 index 10ca8feb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifySpreadsheet; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifySpreadsheet.Builder.class) -public final class DeidentifyFileRequestDeidentifySpreadsheet { - private final FileDataDeidentifySpreadsheet file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifySpreadsheet( - FileDataDeidentifySpreadsheet file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifySpreadsheet getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifySpreadsheet - && equalTo((DeidentifyFileRequestDeidentifySpreadsheet) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifySpreadsheet other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifySpreadsheet file); - - Builder from(DeidentifyFileRequestDeidentifySpreadsheet other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifySpreadsheet build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifySpreadsheet file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifySpreadsheet other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifySpreadsheet file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifySpreadsheet build() { - return new DeidentifyFileRequestDeidentifySpreadsheet( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java deleted file mode 100644 index e3f555b8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java +++ /dev/null @@ -1,389 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyStructuredText; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyStructuredText.Builder.class) -public final class DeidentifyFileRequestDeidentifyStructuredText { - private final FileDataDeidentifyStructuredText file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyStructuredText( - FileDataDeidentifyStructuredText file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyStructuredText getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyStructuredText - && equalTo((DeidentifyFileRequestDeidentifyStructuredText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyStructuredText other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyStructuredText file); - - Builder from(DeidentifyFileRequestDeidentifyStructuredText other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyStructuredText build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes( - Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyStructuredText file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = - Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyStructuredText other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyStructuredText file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes( - Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyStructuredText build() { - return new DeidentifyFileRequestDeidentifyStructuredText( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java deleted file mode 100644 index 8457c790..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java +++ /dev/null @@ -1,386 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyTextEntityTypesItem; -import com.skyflow.generated.rest.types.FileDataDeidentifyText; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileRequestDeidentifyText.Builder.class) -public final class DeidentifyFileRequestDeidentifyText { - private final FileDataDeidentifyText file; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyFileRequestDeidentifyText( - FileDataDeidentifyText file, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataDeidentifyText getFile() { - return file; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileRequestDeidentifyText - && equalTo((DeidentifyFileRequestDeidentifyText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileRequestDeidentifyText other) { - return file.equals(other.file) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.file, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataDeidentifyText file); - - Builder from(DeidentifyFileRequestDeidentifyText other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyFileRequestDeidentifyText build(); - - /** - *

Entities to detect and de-identify.

- */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataDeidentifyText file; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyFileRequestDeidentifyText other) { - file(other.getFile()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataDeidentifyText file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

ID of a vault that you have Detect Invoker or Vault Owner permissions for.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

- */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

- */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

- */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

Entities to detect and de-identify.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

Entities to detect and de-identify.

- */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyFileRequestDeidentifyText build() { - return new DeidentifyFileRequestDeidentifyText( - file, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java new file mode 100644 index 00000000..50fdb91c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileDeleteRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.files.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.FileDeleteRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteRequest.Builder.class) +public final class FileDeleteRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private FileDeleteRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return List of record objects (max 20,000) identifying the file columns to delete. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteRequest && equalTo((FileDeleteRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(FileDeleteRequest other); + } + + public interface _FinalStage { + FileDeleteRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ */ + _FinalStage records(List records); + + _FinalStage addRecords(FileDeleteRecord records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(FileDeleteRecord records) { + this.records.add(records); + return this; + } + + /** + *

List of record objects (max 20,000) identifying the file columns to delete.

+ */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public FileDeleteRequest build() { + return new FileDeleteRequest(vaultId, records, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java new file mode 100644 index 00000000..0db8c62b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/FileUploadRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.files.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.FileUploadRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadRequest.Builder.class) +public final class FileUploadRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private FileUploadRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return List of records for which signed file upload URLs are requested. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadRequest && equalTo((FileUploadRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

ID of the vault.

+ */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(FileUploadRequest other); + } + + public interface _FinalStage { + FileUploadRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

List of records for which signed file upload URLs are requested.

+ */ + _FinalStage records(List records); + + _FinalStage addRecords(FileUploadRecord records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

ID of the vault.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(FileUploadRecord records) { + this.records.add(records); + return this; + } + + /** + *

List of records for which signed file upload URLs are requested.

+ */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public FileUploadRequest build() { + return new FileUploadRequest(vaultId, records, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java deleted file mode 100644 index cde24227..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = GetRunRequest.Builder.class) -public final class GetRunRequest { - private final Optional vaultId; - - private final Map additionalProperties; - - private GetRunRequest(Optional vaultId, Map additionalProperties) { - this.vaultId = vaultId; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("vault_id") - public Optional getVaultId() { - return vaultId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof GetRunRequest && equalTo((GetRunRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(GetRunRequest other) { - return vaultId.equals(other.vaultId); - } - - @Override - public int hashCode() { - return Objects.hash(this.vaultId); - } - - @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 vaultId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(GetRunRequest other) { - vaultId(other.getVaultId()); - return this; - } - - @JsonSetter(value = "vault_id", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - public GetRunRequest build() { - return new GetRunRequest(vaultId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java deleted file mode 100644 index 5cd22747..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.FileDataReidentifyFile; -import com.skyflow.generated.rest.types.Format; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyFileRequestReidentifyFile.Builder.class) -public final class ReidentifyFileRequestReidentifyFile { - private final FileDataReidentifyFile file; - - private final String vaultId; - - private final Optional format; - - private final Map additionalProperties; - - private ReidentifyFileRequestReidentifyFile( - FileDataReidentifyFile file, - String vaultId, - Optional format, - Map additionalProperties) { - this.file = file; - this.vaultId = vaultId; - this.format = format; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("file") - public FileDataReidentifyFile getFile() { - return file; - } - - /** - * @return ID of the vault where the entities are stored. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - @JsonProperty("format") - public Optional getFormat() { - return format; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyFileRequestReidentifyFile - && equalTo((ReidentifyFileRequestReidentifyFile) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyFileRequestReidentifyFile other) { - return file.equals(other.file) && vaultId.equals(other.vaultId) && format.equals(other.format); - } - - @Override - public int hashCode() { - return Objects.hash(this.file, this.vaultId, this.format); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static FileStage builder() { - return new Builder(); - } - - public interface FileStage { - VaultIdStage file(@NotNull FileDataReidentifyFile file); - - Builder from(ReidentifyFileRequestReidentifyFile other); - } - - public interface VaultIdStage { - /** - * ID of the vault where the entities are stored. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - ReidentifyFileRequestReidentifyFile build(); - - _FinalStage format(Optional format); - - _FinalStage format(Format format); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements FileStage, VaultIdStage, _FinalStage { - private FileDataReidentifyFile file; - - private String vaultId; - - private Optional format = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(ReidentifyFileRequestReidentifyFile other) { - file(other.getFile()); - vaultId(other.getVaultId()); - format(other.getFormat()); - return this; - } - - @Override - @JsonSetter("file") - public VaultIdStage file(@NotNull FileDataReidentifyFile file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - - /** - * ID of the vault where the entities are stored.

ID of the vault where the entities are stored.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - @Override - public _FinalStage format(Format format) { - this.format = Optional.ofNullable(format); - return this; - } - - @Override - @JsonSetter(value = "format", nulls = Nulls.SKIP) - public _FinalStage format(Optional format) { - this.format = format; - return this; - } - - @Override - public ReidentifyFileRequestReidentifyFile build() { - return new ReidentifyFileRequestReidentifyFile(file, vaultId, format, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java similarity index 60% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java index 81a9f837..3d25a53b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java @@ -1,46 +1,55 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; +package com.skyflow.generated.rest.resources.files.requests; + +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = UploadFileV2Request.Builder.class) -public final class UploadFileV2Request { +@JsonDeserialize(builder = UploadFileRequestV2.Builder.class) +public final class UploadFileRequestV2 { private final String tableName; private final String columnName; private final Optional skyflowId; + private final String file; + private final Optional returnFileMetadata; private final Map additionalProperties; - private UploadFileV2Request( + private UploadFileRequestV2( String tableName, String columnName, Optional skyflowId, + String file, Optional returnFileMetadata, Map additionalProperties) { this.tableName = tableName; this.columnName = columnName; this.skyflowId = skyflowId; + this.file = file; this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } /** - * @return Name of the table to upload the file to. + * @return Name of the table. */ @JsonProperty("tableName") public String getTableName() { @@ -48,7 +57,7 @@ public String getTableName() { } /** - * @return Name of the column to upload the file to. The column must have a file data type. + * @return Name of the column that contains the file. */ @JsonProperty("columnName") public String getColumnName() { @@ -56,13 +65,21 @@ public String getColumnName() { } /** - * @return Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created. + * @return ID of the record to update. */ @JsonProperty("skyflowID") public Optional getSkyflowId() { return skyflowId; } + /** + * @return Path of the file to upload. Each request only supports one file. + */ + @JsonProperty("file") + public String getFile() { + return file; + } + /** * @return If true, returns metadata about the uploaded file. */ @@ -71,10 +88,10 @@ public Optional getReturnFileMetadata() { return returnFileMetadata; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof UploadFileV2Request && equalTo((UploadFileV2Request) other); + return other instanceof UploadFileRequestV2 && equalTo((UploadFileRequestV2) other); } @JsonAnyGetter @@ -82,19 +99,20 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(UploadFileV2Request other) { + private boolean equalTo(UploadFileRequestV2 other) { return tableName.equals(other.tableName) && columnName.equals(other.columnName) && skyflowId.equals(other.skyflowId) + && file.equals(other.file) && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { - return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.returnFileMetadata); + return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.file, this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -105,25 +123,36 @@ public static TableNameStage builder() { public interface TableNameStage { /** - * Name of the table to upload the file to. + *

Name of the table.

*/ ColumnNameStage tableName(@NotNull String tableName); - Builder from(UploadFileV2Request other); + Builder from(UploadFileRequestV2 other); } public interface ColumnNameStage { /** - * Name of the column to upload the file to. The column must have a `file` data type. + *

Name of the column that contains the file.

*/ - _FinalStage columnName(@NotNull String columnName); + FileStage columnName(@NotNull String columnName); + } + + public interface FileStage { + /** + *

Path of the file to upload. Each request only supports one file.

+ */ + _FinalStage file(@NotNull String file); } public interface _FinalStage { - UploadFileV2Request build(); + UploadFileRequestV2 build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

*/ _FinalStage skyflowId(Optional skyflowId); @@ -138,11 +167,13 @@ public interface _FinalStage { } @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TableNameStage, ColumnNameStage, _FinalStage { + public static final class Builder implements TableNameStage, ColumnNameStage, FileStage, _FinalStage { private String tableName; private String columnName; + private String file; + private Optional returnFileMetadata = Optional.empty(); private Optional skyflowId = Optional.empty(); @@ -152,20 +183,21 @@ public static final class Builder implements TableNameStage, ColumnNameStage, _F private Builder() {} - @Override - public Builder from(UploadFileV2Request other) { + @java.lang.Override + public Builder from(UploadFileRequestV2 other) { tableName(other.getTableName()); columnName(other.getColumnName()); skyflowId(other.getSkyflowId()); + file(other.getFile()); returnFileMetadata(other.getReturnFileMetadata()); return this; } /** - * Name of the table to upload the file to.

Name of the table to upload the file to.

+ *

Name of the table.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("tableName") public ColumnNameStage tableName(@NotNull String tableName) { this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); @@ -173,21 +205,32 @@ public ColumnNameStage tableName(@NotNull String tableName) { } /** - * Name of the column to upload the file to. The column must have a `file` data type.

Name of the column to upload the file to. The column must have a file data type.

+ *

Name of the column that contains the file.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("columnName") - public _FinalStage columnName(@NotNull String columnName) { + public FileStage columnName(@NotNull String columnName) { this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); return this; } + /** + *

Path of the file to upload. Each request only supports one file.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("file") + public _FinalStage file(@NotNull String file) { + this.file = Objects.requireNonNull(file, "file must not be null"); + return this; + } + /** *

If true, returns metadata about the uploaded file.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); return this; @@ -196,7 +239,7 @@ public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { /** *

If true, returns metadata about the uploaded file.

*/ - @Override + @java.lang.Override @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) public _FinalStage returnFileMetadata(Optional returnFileMetadata) { this.returnFileMetadata = returnFileMetadata; @@ -204,28 +247,41 @@ public _FinalStage returnFileMetadata(Optional returnFileMetadata) { } /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage skyflowId(String skyflowId) { this.skyflowId = Optional.ofNullable(skyflowId); return this; } /** - *

Skyflow ID of the record to upload the file to. If skyflowID isn't specified, a new record will be created.

+ *

ID of the record to update.

*/ - @Override + @java.lang.Override @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) public _FinalStage skyflowId(Optional skyflowId) { this.skyflowId = skyflowId; return this; } - @Override - public UploadFileV2Request build() { - return new UploadFileV2Request(tableName, columnName, skyflowId, returnFileMetadata, additionalProperties); + @java.lang.Override + public UploadFileRequestV2 build() { + return new UploadFileRequestV2( + tableName, columnName, skyflowId, file, returnFileMetadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java deleted file mode 100644 index 0335ac47..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java deleted file mode 100644 index 22a948ca..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription { - TRANSCRIPTION("transcription"), - - MEDICAL_TRANSCRIPTION("medical_transcription"), - - DIARIZED_TRANSCRIPTION("diarized_transcription"), - - MEDICAL_DIARIZED_TRANSCRIPTION("medical_diarized_transcription"); - - private final String value; - - DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java deleted file mode 100644 index aa6c578d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java deleted file mode 100644 index 5e08b9db..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileImageRequestDeidentifyImageEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileImageRequestDeidentifyImageEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java deleted file mode 100644 index d97b3191..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileImageRequestDeidentifyImageMaskingMethod { - BLUR("blur"), - - BLACKBOX("blackbox"); - - private final String value; - - DeidentifyFileImageRequestDeidentifyImageMaskingMethod(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java deleted file mode 100644 index 5089bc83..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyDocumentEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyDocumentEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java deleted file mode 100644 index a7682795..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyPresentationEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyPresentationEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java deleted file mode 100644 index 96a55f5a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java deleted file mode 100644 index aff014d8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java deleted file mode 100644 index b0326561..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestDeidentifyTextEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestDeidentifyTextEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java deleted file mode 100644 index 9c9c84c2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.files.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyFileRequestEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyFileRequestEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java deleted file mode 100644 index fa45ee60..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncGuardrailsClient { - protected final ClientOptions clientOptions; - - private final AsyncRawGuardrailsClient rawClient; - - public AsyncGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawGuardrailsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawGuardrailsClient withRawResponse() { - return this.rawClient; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture checkGuardrails(DetectGuardrailsRequest request) { - return this.rawClient.checkGuardrails(request).thenApply(response -> response.body()); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - return this.rawClient.checkGuardrails(request, requestOptions).thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java deleted file mode 100644 index 80853472..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawGuardrailsClient { - protected final ClientOptions clientOptions; - - public AsyncRawGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture> checkGuardrails( - DetectGuardrailsRequest request) { - return checkGuardrails(request, null); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public CompletableFuture> checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/guardrails") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DetectGuardrailsResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java deleted file mode 100644 index 5068196c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java +++ /dev/null @@ -1,41 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; - -public class GuardrailsClient { - protected final ClientOptions clientOptions; - - private final RawGuardrailsClient rawClient; - - public GuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawGuardrailsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawGuardrailsClient withRawResponse() { - return this.rawClient; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public DetectGuardrailsResponse checkGuardrails(DetectGuardrailsRequest request) { - return this.rawClient.checkGuardrails(request).body(); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public DetectGuardrailsResponse checkGuardrails(DetectGuardrailsRequest request, RequestOptions requestOptions) { - return this.rawClient.checkGuardrails(request, requestOptions).body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java deleted file mode 100644 index 5bf5c31a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; -import com.skyflow.generated.rest.types.DetectGuardrailsResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawGuardrailsClient { - protected final ClientOptions clientOptions; - - public RawGuardrailsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * Preserve safety and compliance with usage policies. - */ - public ApiClientHttpResponse checkGuardrails(DetectGuardrailsRequest request) { - return checkGuardrails(request, null); - } - - /** - * Preserve safety and compliance with usage policies. - */ - public ApiClientHttpResponse checkGuardrails( - DetectGuardrailsRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/guardrails") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DetectGuardrailsResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java deleted file mode 100644 index 75250f8c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java +++ /dev/null @@ -1,228 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.guardrails.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectGuardrailsRequest.Builder.class) -public final class DetectGuardrailsRequest { - private final String text; - - private final Optional checkToxicity; - - private final Optional> denyTopics; - - private final String vaultId; - - private final Map additionalProperties; - - private DetectGuardrailsRequest( - String text, - Optional checkToxicity, - Optional> denyTopics, - String vaultId, - Map additionalProperties) { - this.text = text; - this.checkToxicity = checkToxicity; - this.denyTopics = denyTopics; - this.vaultId = vaultId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to check against guardrails. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return If true, checks for toxicity in the text. - */ - @JsonProperty("check_toxicity") - public Optional getCheckToxicity() { - return checkToxicity; - } - - /** - * @return List of topics to deny. - */ - @JsonProperty("deny_topics") - public Optional> getDenyTopics() { - return denyTopics; - } - - /** - * @return ID of the vault. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectGuardrailsRequest && equalTo((DetectGuardrailsRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectGuardrailsRequest other) { - return text.equals(other.text) - && checkToxicity.equals(other.checkToxicity) - && denyTopics.equals(other.denyTopics) - && vaultId.equals(other.vaultId); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.checkToxicity, this.denyTopics, this.vaultId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text to check against guardrails. - */ - VaultIdStage text(@NotNull String text); - - Builder from(DetectGuardrailsRequest other); - } - - public interface VaultIdStage { - /** - * ID of the vault. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DetectGuardrailsRequest build(); - - /** - *

If true, checks for toxicity in the text.

- */ - _FinalStage checkToxicity(Optional checkToxicity); - - _FinalStage checkToxicity(Boolean checkToxicity); - - /** - *

List of topics to deny.

- */ - _FinalStage denyTopics(Optional> denyTopics); - - _FinalStage denyTopics(List denyTopics); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, VaultIdStage, _FinalStage { - private String text; - - private String vaultId; - - private Optional> denyTopics = Optional.empty(); - - private Optional checkToxicity = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DetectGuardrailsRequest other) { - text(other.getText()); - checkToxicity(other.getCheckToxicity()); - denyTopics(other.getDenyTopics()); - vaultId(other.getVaultId()); - return this; - } - - /** - * Text to check against guardrails.

Text to check against guardrails.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public VaultIdStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * ID of the vault.

ID of the vault.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

List of topics to deny.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage denyTopics(List denyTopics) { - this.denyTopics = Optional.ofNullable(denyTopics); - return this; - } - - /** - *

List of topics to deny.

- */ - @Override - @JsonSetter(value = "deny_topics", nulls = Nulls.SKIP) - public _FinalStage denyTopics(Optional> denyTopics) { - this.denyTopics = denyTopics; - return this; - } - - /** - *

If true, checks for toxicity in the text.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage checkToxicity(Boolean checkToxicity) { - this.checkToxicity = Optional.ofNullable(checkToxicity); - return this; - } - - /** - *

If true, checks for toxicity in the text.

- */ - @Override - @JsonSetter(value = "check_toxicity", nulls = Nulls.SKIP) - public _FinalStage checkToxicity(Optional checkToxicity) { - this.checkToxicity = checkToxicity; - return this; - } - - @Override - public DetectGuardrailsRequest build() { - return new DetectGuardrailsRequest(text, checkToxicity, denyTopics, vaultId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java index cab967a7..e2f24865 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java @@ -5,9 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; - +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.util.concurrent.CompletableFuture; public class AsyncQueryClient { @@ -28,27 +27,17 @@ public AsyncRawQueryClient withRawResponse() { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public CompletableFuture queryServiceExecuteQuery(String vaultId) { - return this.rawClient.queryServiceExecuteQuery(vaultId).thenApply(response -> response.body()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
  • Can return redacted record values.
  • Supports only the SELECT command.
  • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
  • Can't modify the vault or perform transactions.
  • Can't return tokens.
  • Can't return file download or render URLs.
  • Doesn't support the WHERE keyword with columns using transient tokenization.
  • Doesn't support ? conditional for columns with column-level encryption disabled.
    • */ - public CompletableFuture queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return this.rawClient.queryServiceExecuteQuery(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture executeQuery(String vaultId, GetQueryRequest request) { + return this.rawClient.executeQuery(vaultId, request).thenApply(response -> response.body()); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
      • Can return redacted record values.
      • Supports only the SELECT command.
      • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
      • Can't modify the vault or perform transactions.
      • Can't return tokens.
      • Can't return file download or render URLs.
      • Doesn't support the WHERE keyword with columns using transient tokenization.
      • Doesn't support ? conditional for columns with column-level encryption disabled.
        • */ - public CompletableFuture queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - return this.rawClient - .queryServiceExecuteQuery(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.executeQuery(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java index 7b8c9383..dbd40180 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java @@ -4,15 +4,32 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.io.IOException; 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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawQueryClient { protected final ClientOptions clientOptions; @@ -22,32 +39,28 @@ public AsyncRawQueryClient(ClientOptions clientOptions) { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public CompletableFuture> queryServiceExecuteQuery(String vaultId) { - return queryServiceExecuteQuery( - vaultId, QueryServiceExecuteQueryBody.builder().build()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
          • Can return redacted record values.
          • Supports only the SELECT command.
          • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
          • Can't modify the vault or perform transactions.
          • Can't return tokens.
          • Can't return file download or render URLs.
          • Doesn't support the WHERE keyword with columns using transient tokenization.
          • Doesn't support ? conditional for columns with column-level encryption disabled.
            • */ - public CompletableFuture> queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return queryServiceExecuteQuery(vaultId, request, null); + public CompletableFuture> executeQuery( + String vaultId, GetQueryRequest request) { + return executeQuery(vaultId, request, null); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
              • Can return redacted record values.
              • Supports only the SELECT command.
              • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
              • Can't modify the vault or perform transactions.
              • Can't return tokens.
              • Can't return file download or render URLs.
              • Doesn't support the WHERE keyword with columns using transient tokenization.
              • Doesn't support ? conditional for columns with column-level encryption disabled.
                • */ - public CompletableFuture> queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("query") - .build(); + .addPathSegments("query"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -56,7 +69,7 @@ public CompletableFuture> queryService throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -66,33 +79,55 @@ public CompletableFuture> queryService if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetQueryResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetQueryResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java index 39bb709d..f0444e50 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java @@ -5,8 +5,8 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.GetQueryResponse; public class QueryClient { protected final ClientOptions clientOptions; @@ -26,26 +26,16 @@ public RawQueryClient withRawResponse() { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                  • Can return redacted record values.
                  • Supports only the SELECT command.
                  • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                  • Can't modify the vault or perform transactions.
                  • Can't return tokens.
                  • Can't return file download or render URLs.
                  • Doesn't support the WHERE keyword with columns using transient tokenization.
                  • Doesn't support ? conditional for columns with column-level encryption disabled.
                    • */ - public V1GetQueryResponse queryServiceExecuteQuery(String vaultId) { - return this.rawClient.queryServiceExecuteQuery(vaultId).body(); + public GetQueryResponse executeQuery(String vaultId, GetQueryRequest request) { + return this.rawClient.executeQuery(vaultId, request).body(); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                      • Can return redacted record values.
                      • Supports only the SELECT command.
                      • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                      • Can't modify the vault or perform transactions.
                      • Can't return tokens.
                      • Can't return file download or render URLs.
                      • Doesn't support the WHERE keyword with columns using transient tokenization.
                      • Doesn't support ? conditional for columns with column-level encryption disabled.
                        • */ - public V1GetQueryResponse queryServiceExecuteQuery(String vaultId, QueryServiceExecuteQueryBody request) { - return this.rawClient.queryServiceExecuteQuery(vaultId, request).body(); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public V1GetQueryResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - return this.rawClient - .queryServiceExecuteQuery(vaultId, request, requestOptions) - .body(); + public GetQueryResponse executeQuery(String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.executeQuery(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java index ec88ae93..a63af329 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java @@ -4,13 +4,28 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawQueryClient { protected final ClientOptions clientOptions; @@ -20,32 +35,27 @@ public RawQueryClient(ClientOptions clientOptions) { } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> - */ - public ApiClientHttpResponse queryServiceExecuteQuery(String vaultId) { - return queryServiceExecuteQuery( - vaultId, QueryServiceExecuteQueryBody.builder().build()); - } - - /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                          • Can return redacted record values.
                          • Supports only the SELECT command.
                          • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                          • Can't modify the vault or perform transactions.
                          • Can't return tokens.
                          • Can't return file download or render URLs.
                          • Doesn't support the WHERE keyword with columns using transient tokenization.
                          • Doesn't support ? conditional for columns with column-level encryption disabled.
                            • */ - public ApiClientHttpResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request) { - return queryServiceExecuteQuery(vaultId, request, null); + public ApiClientHttpResponse executeQuery(String vaultId, GetQueryRequest request) { + return executeQuery(vaultId, request, null); } /** - * Returns records for a valid SQL query. This endpoint <ul><li>Can return redacted record values.</li><li>Supports only the <code>SELECT</code> command.</li><li>Returns a maximum of 25 records. To return additional records, perform another query using the <code>OFFSET</code> keyword.</li><li>Can't modify the vault or perform transactions.</li><li>Can't return tokens.</li><li>Can't return file download or render URLs.</li><li>Doesn't support the <code>WHERE</code> keyword with columns using transient tokenization.</li><li>Doesn't support ? conditional for columns with column-level encryption disabled.</li><ul> + * Returns records for a valid SQL query. This endpoint
                              • Can return redacted record values.
                              • Supports only the SELECT command.
                              • Returns a maximum of 25 records. To return additional records, perform another query using the OFFSET keyword.
                              • Can't modify the vault or perform transactions.
                              • Can't return tokens.
                              • Can't return file download or render URLs.
                              • Doesn't support the WHERE keyword with columns using transient tokenization.
                              • Doesn't support ? conditional for columns with column-level encryption disabled.
                                • */ - public ApiClientHttpResponse queryServiceExecuteQuery( - String vaultId, QueryServiceExecuteQueryBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse executeQuery( + String vaultId, GetQueryRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("query") - .build(); + .addPathSegments("query"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -54,7 +64,7 @@ public ApiClientHttpResponse queryServiceExecuteQuery( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -64,26 +74,42 @@ public ApiClientHttpResponse queryServiceExecuteQuery( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetQueryResponse.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetQueryResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java new file mode 100644 index 00000000..2d9c81c0 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/ExecuteQueryRequest.java @@ -0,0 +1,160 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.query.requests; + +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 com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryRequest.Builder.class) +public final class ExecuteQueryRequest { + private final String vaultId; + + private final String query; + + private final Map additionalProperties; + + private ExecuteQueryRequest(String vaultId, String query, Map additionalProperties) { + this.vaultId = vaultId; + this.query = query; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where the query is being performed. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Query to perform. + */ + @JsonProperty("query") + public String getQuery() { + return query; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryRequest && equalTo((ExecuteQueryRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryRequest other) { + return vaultId.equals(other.vaultId) && query.equals(other.query); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.query); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault where the query is being performed.

                                  + */ + QueryStage vaultId(@NotNull String vaultId); + + Builder from(ExecuteQueryRequest other); + } + + public interface QueryStage { + /** + *

                                  Query to perform.

                                  + */ + _FinalStage query(@NotNull String query); + } + + public interface _FinalStage { + ExecuteQueryRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, QueryStage, _FinalStage { + private String vaultId; + + private String query; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ExecuteQueryRequest other) { + vaultId(other.getVaultId()); + query(other.getQuery()); + return this; + } + + /** + *

                                  ID of the vault where the query is being performed.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public QueryStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Query to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("query") + public _FinalStage query(@NotNull String query) { + this.query = Objects.requireNonNull(query, "query must not be null"); + return this; + } + + @java.lang.Override + public ExecuteQueryRequest build() { + return new ExecuteQueryRequest(vaultId, query, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java new file mode 100644 index 00000000..03e15fa6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/GetQueryRequest.java @@ -0,0 +1,128 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.query.requests; + +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 com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetQueryRequest.Builder.class) +public final class GetQueryRequest { + private final String query; + + private final Map additionalProperties; + + private GetQueryRequest(String query, Map additionalProperties) { + this.query = query; + this.additionalProperties = additionalProperties; + } + + /** + * @return The SQL query to execute.

                                  Supported commands:
                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()
                                  + */ + @JsonProperty("query") + public String getQuery() { + return query; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetQueryRequest && equalTo((GetQueryRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetQueryRequest other) { + return query.equals(other.query); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.query); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static QueryStage builder() { + return new Builder(); + } + + public interface QueryStage { + /** + *

                                  The SQL query to execute.

                                  Supported commands:

                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()

                                  + */ + _FinalStage query(@NotNull String query); + + Builder from(GetQueryRequest other); + } + + public interface _FinalStage { + GetQueryRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements QueryStage, _FinalStage { + private String query; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetQueryRequest other) { + query(other.getQuery()); + return this; + } + + /** + *

                                  The SQL query to execute.

                                  Supported commands:

                                  • SELECT
                                  Supported operators:
                                  • >
                                  • <
                                  • =
                                  • AND
                                  • OR
                                  • NOT
                                  • LIKE
                                  • ILIKE
                                  • NULL
                                  • NOT NULL
                                  Supported keywords:
                                  • FROM
                                  • JOIN
                                  • INNER JOIN
                                  • LEFT OUTER JOIN
                                  • LEFT JOIN
                                  • RIGHT OUTER JOIN
                                  • RIGHT JOIN
                                  • FULL OUTER JOIN
                                  • FULL JOIN
                                  • OFFSET
                                  • LIMIT
                                  • WHERE
                                  Supported functions:
                                  • AVG()
                                  • SUM()
                                  • COUNT()
                                  • MIN()
                                  • MAX()
                                  • REDACTION()

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("query") + public _FinalStage query(@NotNull String query) { + this.query = Objects.requireNonNull(query, "query must not be null"); + return this; + } + + @java.lang.Override + public GetQueryRequest build() { + return new GetQueryRequest(query, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java deleted file mode 100644 index 000cd685..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.query.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = QueryServiceExecuteQueryBody.Builder.class) -public final class QueryServiceExecuteQueryBody { - private final Optional query; - - private final Map additionalProperties; - - private QueryServiceExecuteQueryBody(Optional query, Map additionalProperties) { - this.query = query; - this.additionalProperties = additionalProperties; - } - - /** - * @return The SQL query to execute.<br><br><b>Supported commands:</b> <ul> <li><code>SELECT</code></li> </ul> <b>Supported operators:</b> <ul> <li><code>></code></li> <li><code><</code></li> <li><code>=</code></li> <li><code>AND</code></li> <li><code>OR</code></li> <li><code>NOT</code></li> <li><code>LIKE</code></li> <li><code>ILIKE</code></li> <li><code>NULL</code></li> <li><code>NOT NULL</code></li> </ul> <b>Supported keywords:</b> <ul> <li><code>FROM</code></li> <li><code>JOIN</code></li> <li><code>INNER JOIN</code></li> <li><code>LEFT OUTER JOIN</code></li> <li><code>LEFT JOIN</code></li> <li><code>RIGHT OUTER JOIN</code></li> <li><code>RIGHT JOIN</code></li> <li><code>FULL OUTER JOIN</code></li> <li><code>FULL JOIN</code></li> <li><code>OFFSET</code></li> <li><code>LIMIT</code></li> <li><code>WHERE</code></li> </ul> <b>Supported functions:</b> <ul> <li><code>AVG()</code></li> <li><code>SUM()</code></li> <li><code>COUNT()</code></li> <li><code>MIN()</code></li> <li><code>MAX()</code></li> <li><code>REDACTION()</code></li> </ul> - */ - @JsonProperty("query") - public Optional getQuery() { - return query; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof QueryServiceExecuteQueryBody && equalTo((QueryServiceExecuteQueryBody) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(QueryServiceExecuteQueryBody other) { - return query.equals(other.query); - } - - @Override - public int hashCode() { - return Objects.hash(this.query); - } - - @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 query = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(QueryServiceExecuteQueryBody other) { - query(other.getQuery()); - return this; - } - - /** - *

                                  The SQL query to execute.<br><br><b>Supported commands:</b> <ul> <li><code>SELECT</code></li> </ul> <b>Supported operators:</b> <ul> <li><code>></code></li> <li><code><</code></li> <li><code>=</code></li> <li><code>AND</code></li> <li><code>OR</code></li> <li><code>NOT</code></li> <li><code>LIKE</code></li> <li><code>ILIKE</code></li> <li><code>NULL</code></li> <li><code>NOT NULL</code></li> </ul> <b>Supported keywords:</b> <ul> <li><code>FROM</code></li> <li><code>JOIN</code></li> <li><code>INNER JOIN</code></li> <li><code>LEFT OUTER JOIN</code></li> <li><code>LEFT JOIN</code></li> <li><code>RIGHT OUTER JOIN</code></li> <li><code>RIGHT JOIN</code></li> <li><code>FULL OUTER JOIN</code></li> <li><code>FULL JOIN</code></li> <li><code>OFFSET</code></li> <li><code>LIMIT</code></li> <li><code>WHERE</code></li> </ul> <b>Supported functions:</b> <ul> <li><code>AVG()</code></li> <li><code>SUM()</code></li> <li><code>COUNT()</code></li> <li><code>MIN()</code></li> <li><code>MAX()</code></li> <li><code>REDACTION()</code></li> </ul>

                                  - */ - @JsonSetter(value = "query", nulls = Nulls.SKIP) - public Builder query(Optional query) { - this.query = query; - return this; - } - - public Builder query(String query) { - this.query = Optional.ofNullable(query); - return this; - } - - public QueryServiceExecuteQueryBody build() { - return new QueryServiceExecuteQueryBody(query, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java index b1c9ae18..d9cf1510 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java @@ -4,21 +4,46 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.File; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.io.IOException; -import java.nio.file.Files; -import java.util.Optional; 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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawRecordsClient { protected final ClientOptions clientOptions; @@ -30,30 +55,25 @@ public AsyncRawRecordsClient(ClientOptions clientOptions) { /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId) { - return recordServiceBatchOperation( - vaultId, RecordServiceBatchOperationBody.builder().build()); + public CompletableFuture> batchOperation( + String vaultId, BatchOperationRequest request) { + return batchOperation(vaultId, request, null); } /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return recordServiceBatchOperation(vaultId, request, null); - } - - /** - * Performs multiple record operations in a single transaction. - */ - public CompletableFuture> recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .build(); + .addPathSegment(vaultId); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -62,7 +82,7 @@ public CompletableFuture> record throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -72,34 +92,60 @@ public CompletableFuture> record if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BatchOperationResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BatchOperationResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -114,30 +160,34 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( + public CompletableFuture> getRecords( String vaultId, String objectName) { - return recordServiceBulkGetRecord( - vaultId, objectName, RecordServiceBulkGetRecordRequest.builder().build()); + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return recordServiceBulkGetRecord(vaultId, objectName, request, null); + public CompletableFuture> getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build(), requestOptions); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture> recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture> getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return getRecords(vaultId, objectName, request, null); + } + + /** + * Returns the specified records from a table. + */ + public CompletableFuture> getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -171,6 +221,13 @@ public CompletableFuture> recordS QueryStringMapper.addQueryParameter( httpUrl, "order_by", request.getOrderBy().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getSkyflowIds().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "skyflow_ids", request.getSkyflowIds().get(), true); @@ -183,6 +240,11 @@ public CompletableFuture> recordS QueryStringMapper.addQueryParameter( httpUrl, "column_values", request.getColumnValues().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -193,34 +255,60 @@ public CompletableFuture> recordS if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BulkGetRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkGetRecordResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -235,33 +323,28 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName) { - return recordServiceInsertRecord( - vaultId, objectName, RecordServiceInsertRecordBody.builder().build()); + public CompletableFuture> insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return insertRecords(vaultId, objectName, request, null); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { - return recordServiceInsertRecord(vaultId, objectName, request, null); - } - - /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. - */ - public CompletableFuture> recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -270,7 +353,7 @@ public CompletableFuture> recordSe throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -280,34 +363,55 @@ public CompletableFuture> recordSe if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1InsertRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, InsertRecordResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -324,34 +428,44 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( + public CompletableFuture> deleteRecords( String vaultId, String objectName) { - return recordServiceBulkDeleteRecord( - vaultId, objectName, RecordServiceBulkDeleteRecordBody.builder().build()); + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build()); } /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return recordServiceBulkDeleteRecord(vaultId, objectName, request, null); + public CompletableFuture> deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build(), requestOptions); } /** * Deletes the specified records from a table. */ - public CompletableFuture> recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return deleteRecords(vaultId, objectName, request, null); + } + + /** + * Deletes the specified records from a table. + */ + public CompletableFuture> deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -360,7 +474,7 @@ public CompletableFuture> reco throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("DELETE", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -370,34 +484,60 @@ public CompletableFuture> reco if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1BulkDeleteRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkDeleteRecordResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -414,29 +554,34 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( + public CompletableFuture> getRecordById( String vaultId, String objectName, String id) { - return recordServiceGetRecord( - vaultId, objectName, id, RecordServiceGetRecordRequest.builder().build()); + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build()); } /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { - return recordServiceGetRecord(vaultId, objectName, id, request, null); + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build(), requestOptions); } /** * Returns the specified record from a table. */ - public CompletableFuture> recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return getRecordById(vaultId, objectName, id, request, null); + } + + /** + * Returns the specified record from a table. + */ + public CompletableFuture> getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -455,10 +600,22 @@ public CompletableFuture> recordServiceGet QueryStringMapper.addQueryParameter( httpUrl, "downloadURL", request.getDownloadUrl().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getFields().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "fields", request.getFields().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -469,33 +626,60 @@ public CompletableFuture> recordServiceGet if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FieldRecords.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetFieldRecords.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -510,38 +694,47 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( + public CompletableFuture> updateRecord( String vaultId, String objectName, String id) { - return recordServiceUpdateRecord( - vaultId, objectName, id, RecordServiceUpdateRecordBody.builder().build()); + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build()); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return recordServiceUpdateRecord(vaultId, objectName, id, request, null); + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build(), requestOptions); + } + + /** + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. + */ + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return updateRecord(vaultId, objectName, id, request, null); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture> recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .build(); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -550,7 +743,7 @@ public CompletableFuture> recordSe throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("PUT", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -560,34 +753,60 @@ public CompletableFuture> recordSe if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1UpdateRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UpdateRecordResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -602,133 +821,50 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> recordServiceDeleteRecord( + public CompletableFuture> deleteRecord( String vaultId, String objectName, String id) { - return recordServiceDeleteRecord(vaultId, objectName, id, null); + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> recordServiceDeleteRecord( + public CompletableFuture> deleteRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(objectName) - .addPathSegment(id) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1DeleteRecordResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build(), requestOptions); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return fileServiceUploadFile( - vaultId, - objectName, - id, - file, - FileServiceUploadFileRequest.builder().build()); + public CompletableFuture> deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return deleteRecord(vaultId, objectName, id, request, null); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return fileServiceUploadFile(vaultId, objectName, id, file, request, null); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture> fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .addPathSegments("files") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - if (file.isPresent()) { - String fileMimeType = Files.probeContentType(file.get().toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart( - "file", file.get().getName(), RequestBody.create(file.get(), fileMimeTypeMediaType)); - } - if (request.getColumnName().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "columnName", request.getColumnName().get(), false); - } - } catch (Exception e) { - throw new RuntimeException(e); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); } Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) + .url(httpUrl.build()) + .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Accept", "application/json"); Request okhttpRequest = _requestBuilder.build(); @@ -736,270 +872,42 @@ public CompletableFuture> fileServ if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1UpdateRecordResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Deletes a file from the specified record. - */ - public CompletableFuture> fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return fileServiceDeleteFile(vaultId, tableName, id, columnName, null); - } - - /** - * Deletes a file from the specified record. - */ - public CompletableFuture> fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteFileResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Returns the anti-virus scan status of a file. - */ - public CompletableFuture> fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, null); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public CompletableFuture> fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .addPathSegments("scan-status") - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .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<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1GetFileScanStatusResponse.class), - 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 - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public CompletableFuture> uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return uploadFileV2(vaultId, file, request, null); - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public CompletableFuture> uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v2/vaults") - .addPathSegment(vaultId) - .addPathSegments("files/upload") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - QueryStringMapper.addFormDataPart(body, "tableName", request.getTableName(), false); - QueryStringMapper.addFormDataPart(body, "columnName", request.getColumnName(), false); - String fileMimeType = Files.probeContentType(file.toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); - if (request.getSkyflowId().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "skyflowID", request.getSkyflowId().get(), false); - } - if (request.getReturnFileMetadata().isPresent()) { - QueryStringMapper.addFormDataPart( - body, - "returnFileMetadata", - request.getReturnFileMetadata().get(), - false); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), UploadFileV2Response.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeleteRecordResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 404: future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 500: @@ -1011,12 +919,13 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java index ed7240c9..43a63d26 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java @@ -5,11 +5,20 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; - -import java.io.File; -import java.util.Optional; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.util.concurrent.CompletableFuture; public class AsyncRecordsClient { @@ -32,287 +41,204 @@ public AsyncRawRecordsClient withRawResponse() { /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture recordServiceBatchOperation(String vaultId) { - return this.rawClient.recordServiceBatchOperation(vaultId).thenApply(response -> response.body()); + public CompletableFuture batchOperation(String vaultId, BatchOperationRequest request) { + return this.rawClient.batchOperation(vaultId, request).thenApply(response -> response.body()); } /** * Performs multiple record operations in a single transaction. */ - public CompletableFuture recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return this.rawClient.recordServiceBatchOperation(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + return this.rawClient.batchOperation(vaultId, request, requestOptions).thenApply(response -> response.body()); } /** - * Performs multiple record operations in a single transaction. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceBatchOperation(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture getRecords(String vaultId, String objectName) { + return this.rawClient.getRecords(vaultId, objectName).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkGetRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.getRecords(vaultId, objectName, requestOptions).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request) - .thenApply(response -> response.body()); + public CompletableFuture getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return this.rawClient.getRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public CompletableFuture recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public CompletableFuture getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request, requestOptions) + .getRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture recordServiceInsertRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceInsertRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return this.rawClient.insertRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public CompletableFuture recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { + public CompletableFuture insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request) + .insertRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Deletes the specified records from a table. */ - public CompletableFuture recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecords(String vaultId, String objectName) { + return this.rawClient.deleteRecords(vaultId, objectName).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, String objectName) { - return this.rawClient.recordServiceBulkDeleteRecord(vaultId, objectName).thenApply(response -> response.body()); + public CompletableFuture deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.deleteRecords(vaultId, objectName, requestOptions).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return this.rawClient.deleteRecords(vaultId, objectName, request).thenApply(response -> response.body()); } /** * Deletes the specified records from a table. */ - public CompletableFuture recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { + public CompletableFuture deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request, requestOptions) + .deleteRecords(vaultId, objectName, request, requestOptions) .thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceGetRecord(vaultId, objectName, id).thenApply(response -> response.body()); + public CompletableFuture getRecordById(String vaultId, String objectName, String id) { + return this.rawClient.getRecordById(vaultId, objectName, id).thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request) + .getRecordById(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** * Returns the specified record from a table. */ - public CompletableFuture recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { - return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, String objectName, String id) { - return this.rawClient.recordServiceUpdateRecord(vaultId, objectName, id).thenApply(response -> response.body()); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request) - .thenApply(response -> response.body()); + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return this.rawClient.getRecordById(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Returns the specified record from a table. */ - public CompletableFuture recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { + public CompletableFuture getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request, requestOptions) + .getRecordById(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture recordServiceDeleteRecord( - String vaultId, String objectName, String id) { - return this.rawClient.recordServiceDeleteRecord(vaultId, objectName, id).thenApply(response -> response.body()); + public CompletableFuture updateRecord(String vaultId, String objectName, String id) { + return this.rawClient.updateRecord(vaultId, objectName, id).thenApply(response -> response.body()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture recordServiceDeleteRecord( + public CompletableFuture updateRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceDeleteRecord(vaultId, objectName, id, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request) - .thenApply(response -> response.body()); - } - - /** - * Uploads a file to the specified record. - */ - public CompletableFuture fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request, requestOptions) + .updateRecord(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** - * Deletes a file from the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName) - .thenApply(response -> response.body()); + public CompletableFuture updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return this.rawClient.updateRecord(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Deletes a file from the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public CompletableFuture fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public CompletableFuture updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName, requestOptions) + .updateRecord(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } /** - * Returns the anti-virus scan status of a file. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName) - .thenApply(response -> response.body()); + public CompletableFuture deleteRecord(String vaultId, String objectName, String id) { + return this.rawClient.deleteRecord(vaultId, objectName, id).thenApply(response -> response.body()); } /** - * Returns the anti-virus scan status of a file. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, requestOptions) + .deleteRecord(vaultId, objectName, id, requestOptions) .thenApply(response -> response.body()); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return this.rawClient.uploadFileV2(vaultId, file, request).thenApply(response -> response.body()); + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return this.rawClient.deleteRecord(vaultId, objectName, id, request).thenApply(response -> response.body()); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public CompletableFuture uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { + public CompletableFuture deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .uploadFileV2(vaultId, file, request, requestOptions) + .deleteRecord(vaultId, objectName, id, request, requestOptions) .thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java index 29530b56..6b72953f 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java @@ -4,19 +4,42 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.QueryStringMapper; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; -import okhttp3.*; - -import java.io.File; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; import java.io.IOException; -import java.nio.file.Files; -import java.util.Optional; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawRecordsClient { protected final ClientOptions clientOptions; @@ -28,29 +51,24 @@ public RawRecordsClient(ClientOptions clientOptions) { /** * Performs multiple record operations in a single transaction. */ - public ApiClientHttpResponse recordServiceBatchOperation(String vaultId) { - return recordServiceBatchOperation( - vaultId, RecordServiceBatchOperationBody.builder().build()); - } - - /** - * Performs multiple record operations in a single transaction. - */ - public ApiClientHttpResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return recordServiceBatchOperation(vaultId, request, null); + public ApiClientHttpResponse batchOperation(String vaultId, BatchOperationRequest request) { + return batchOperation(vaultId, request, null); } /** * Performs multiple record operations in a single transaction. */ - public ApiClientHttpResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .build(); + .addPathSegment(vaultId); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -59,7 +77,7 @@ public ApiClientHttpResponse recordServiceBatchOperati throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -69,57 +87,79 @@ public ApiClientHttpResponse recordServiceBatchOperati 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BatchOperationResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BatchOperationResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Gets the specified records from a table. + * Returns the specified records from a table. + */ + public ApiClientHttpResponse getRecords(String vaultId, String objectName) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build()); + } + + /** + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, String objectName) { - return recordServiceBulkGetRecord( - vaultId, objectName, RecordServiceBulkGetRecordRequest.builder().build()); + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return getRecords(vaultId, objectName, GetRecordsRequest.builder().build(), requestOptions); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return recordServiceBulkGetRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request) { + return getRecords(vaultId, objectName, request, null); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public ApiClientHttpResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -153,6 +193,13 @@ public ApiClientHttpResponse recordServiceBulkGetRecord QueryStringMapper.addQueryParameter( httpUrl, "order_by", request.getOrderBy().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getSkyflowIds().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "skyflow_ids", request.getSkyflowIds().get(), true); @@ -165,6 +212,11 @@ public ApiClientHttpResponse recordServiceBulkGetRecord QueryStringMapper.addQueryParameter( httpUrl, "column_values", request.getColumnValues().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -175,59 +227,73 @@ public ApiClientHttpResponse recordServiceBulkGetRecord 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BulkGetRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkGetRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. - */ - public ApiClientHttpResponse recordServiceInsertRecord(String vaultId, String objectName) { - return recordServiceInsertRecord( - vaultId, objectName, RecordServiceInsertRecordBody.builder().build()); - } - - /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public ApiClientHttpResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { - return recordServiceInsertRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request) { + return insertRecords(vaultId, objectName, request, null); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public ApiClientHttpResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -236,7 +302,7 @@ public ApiClientHttpResponse recordServiceInsertRecord( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -246,27 +312,42 @@ public ApiClientHttpResponse recordServiceInsertRecord( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1InsertRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, InsertRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } @@ -275,34 +356,43 @@ public ApiClientHttpResponse recordServiceInsertRecord( /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName) { - return recordServiceBulkDeleteRecord( - vaultId, objectName, RecordServiceBulkDeleteRecordBody.builder().build()); + public ApiClientHttpResponse deleteRecords(String vaultId, String objectName) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build()); + } + + /** + * Deletes the specified records from a table. + */ + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, RequestOptions requestOptions) { + return deleteRecords( + vaultId, objectName, BulkDeleteRecordRequest.builder().build(), requestOptions); } /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return recordServiceBulkDeleteRecord(vaultId, objectName, request, null); + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request) { + return deleteRecords(vaultId, objectName, request, null); } /** * Deletes the specified records from a table. */ - public ApiClientHttpResponse recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegment(objectName) - .build(); + .addPathSegment(objectName); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -311,7 +401,7 @@ public ApiClientHttpResponse recordServiceBulkDelete throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("DELETE", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -321,27 +411,46 @@ public ApiClientHttpResponse recordServiceBulkDelete 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1BulkDeleteRecordResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, BulkDeleteRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } @@ -350,28 +459,33 @@ public ApiClientHttpResponse recordServiceBulkDelete /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord(String vaultId, String objectName, String id) { - return recordServiceGetRecord( - vaultId, objectName, id, RecordServiceGetRecordRequest.builder().build()); + public ApiClientHttpResponse getRecordById(String vaultId, String objectName, String id) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build()); + } + + /** + * Returns the specified record from a table. + */ + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return getRecordById( + vaultId, objectName, id, GetRecordByIdRequest.builder().build(), requestOptions); } /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { - return recordServiceGetRecord(vaultId, objectName, id, request, null); + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return getRecordById(vaultId, objectName, id, request, null); } /** * Returns the specified record from a table. */ - public ApiClientHttpResponse recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { + public ApiClientHttpResponse getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") @@ -390,10 +504,22 @@ public ApiClientHttpResponse recordServiceGetRecord( QueryStringMapper.addQueryParameter( httpUrl, "downloadURL", request.getDownloadUrl().get(), false); } + if (request.getReturnFileMetadata().isPresent()) { + QueryStringMapper.addQueryParameter( + httpUrl, + "returnFileMetadata", + request.getReturnFileMetadata().get(), + false); + } if (request.getFields().isPresent()) { QueryStringMapper.addQueryParameter( httpUrl, "fields", request.getFields().get(), true); } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } Request.Builder _requestBuilder = new Request.Builder() .url(httpUrl.build()) .method("GET", null) @@ -404,64 +530,91 @@ public ApiClientHttpResponse recordServiceGetRecord( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FieldRecords.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetFieldRecords.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. + */ + public ApiClientHttpResponse updateRecord(String vaultId, String objectName, String id) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build()); + } + + /** + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id) { - return recordServiceUpdateRecord( - vaultId, objectName, id, RecordServiceUpdateRecordBody.builder().build()); + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { + return updateRecord( + vaultId, objectName, id, UpdateRecordRequest.builder().build(), requestOptions); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return recordServiceUpdateRecord(vaultId, objectName, id, request, null); + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return updateRecord(vaultId, objectName, id, request, null); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public ApiClientHttpResponse recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .build(); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -470,7 +623,7 @@ public ApiClientHttpResponse recordServiceUpdateRecord( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("PUT", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -480,145 +633,94 @@ public ApiClientHttpResponse recordServiceUpdateRecord( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateRecordResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, UpdateRecordResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse recordServiceDeleteRecord( - String vaultId, String objectName, String id) { - return recordServiceDeleteRecord(vaultId, objectName, id, null); + public ApiClientHttpResponse deleteRecord(String vaultId, String objectName, String id) { + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build()); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse recordServiceDeleteRecord( + public ApiClientHttpResponse deleteRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(objectName) - .addPathSegment(id) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteRecordResponse.class), - 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } + return deleteRecord( + vaultId, objectName, id, DeleteRecordRequest.builder().build(), requestOptions); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return fileServiceUploadFile( - vaultId, - objectName, - id, - file, - FileServiceUploadFileRequest.builder().build()); + public ApiClientHttpResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return deleteRecord(vaultId, objectName, id, request, null); } /** - * Uploads a file to the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return fileServiceUploadFile(vaultId, objectName, id, file, request, null); - } - - /** - * Uploads a file to the specified record. - */ - public ApiClientHttpResponse fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) .addPathSegment(objectName) - .addPathSegment(id) - .addPathSegments("files") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - if (file.isPresent()) { - String fileMimeType = Files.probeContentType(file.get().toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart( - "file", file.get().getName(), RequestBody.create(file.get(), fileMimeTypeMediaType)); - } - if (request.getColumnName().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "columnName", request.getColumnName().get(), false); - } - } catch (Exception e) { - throw new RuntimeException(e); + .addPathSegment(id); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); } Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) + .url(httpUrl.build()) + .method("DELETE", null) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Accept", "application/json"); Request okhttpRequest = _requestBuilder.build(); @@ -626,218 +728,33 @@ public ApiClientHttpResponse fileServiceUploadFile( if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateRecordResponse.class), - 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Deletes a file from the specified record. - */ - public ApiClientHttpResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName) { - return fileServiceDeleteFile(vaultId, tableName, id, columnName, null); - } - - /** - * Deletes a file from the specified record. - */ - public ApiClientHttpResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("DELETE", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteFileResponse.class), - 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Returns the anti-virus scan status of a file. - */ - public ApiClientHttpResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, null); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public ApiClientHttpResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/vaults") - .addPathSegment(vaultId) - .addPathSegment(tableName) - .addPathSegment(id) - .addPathSegments("files") - .addPathSegment(columnName) - .addPathSegments("scan-status") - .build(); - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("GET", null) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); if (response.isSuccessful()) { return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetFileScanStatusResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DeleteRecordResponse.class), 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 - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public ApiClientHttpResponse uploadFileV2( - String vaultId, File file, UploadFileV2Request request) { - return uploadFileV2(vaultId, file, request, null); - } - - /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. - */ - public ApiClientHttpResponse uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v2/vaults") - .addPathSegment(vaultId) - .addPathSegments("files/upload") - .build(); - MultipartBody.Builder body = new MultipartBody.Builder().setType(MultipartBody.FORM); - try { - QueryStringMapper.addFormDataPart(body, "tableName", request.getTableName(), false); - QueryStringMapper.addFormDataPart(body, "columnName", request.getColumnName(), false); - String fileMimeType = Files.probeContentType(file.toPath()); - MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; - body.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); - if (request.getSkyflowId().isPresent()) { - QueryStringMapper.addFormDataPart( - body, "skyflowID", request.getSkyflowId().get(), false); - } - if (request.getReturnFileMetadata().isPresent()) { - QueryStringMapper.addFormDataPart( - body, - "returnFileMetadata", - request.getReturnFileMetadata().get(), - false); - } - } catch (Exception e) { - throw new RuntimeException(e); - } - Request.Builder _requestBuilder = new Request.Builder() - .url(httpUrl) - .method("POST", body.build()) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Accept", "application/json"); - Request okhttpRequest = _requestBuilder.build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), UploadFileV2Response.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 401: throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 404: throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); case 500: throw new InternalServerError( ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); @@ -845,11 +762,11 @@ public ApiClientHttpResponse uploadFileV2( } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java index eb9bc81d..0a1da515 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java @@ -5,11 +5,20 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.*; -import com.skyflow.generated.rest.types.*; - -import java.io.File; -import java.util.Optional; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.DeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordByIdRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.DeleteRecordResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; public class RecordsClient { protected final ClientOptions clientOptions; @@ -31,282 +40,197 @@ public RawRecordsClient withRawResponse() { /** * Performs multiple record operations in a single transaction. */ - public V1BatchOperationResponse recordServiceBatchOperation(String vaultId) { - return this.rawClient.recordServiceBatchOperation(vaultId).body(); + public BatchOperationResponse batchOperation(String vaultId, BatchOperationRequest request) { + return this.rawClient.batchOperation(vaultId, request).body(); } /** * Performs multiple record operations in a single transaction. */ - public V1BatchOperationResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request) { - return this.rawClient.recordServiceBatchOperation(vaultId, request).body(); + public BatchOperationResponse batchOperation( + String vaultId, BatchOperationRequest request, RequestOptions requestOptions) { + return this.rawClient.batchOperation(vaultId, request, requestOptions).body(); } /** - * Performs multiple record operations in a single transaction. + * Returns the specified records from a table. */ - public V1BatchOperationResponse recordServiceBatchOperation( - String vaultId, RecordServiceBatchOperationBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceBatchOperation(vaultId, request, requestOptions) - .body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName) { + return this.rawClient.getRecords(vaultId, objectName).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkGetRecord(vaultId, objectName).body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.getRecords(vaultId, objectName, requestOptions).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord( - String vaultId, String objectName, RecordServiceBulkGetRecordRequest request) { - return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request) - .body(); + public BulkGetRecordResponse getRecords(String vaultId, String objectName, GetRecordsRequest request) { + return this.rawClient.getRecords(vaultId, objectName, request).body(); } /** - * Gets the specified records from a table. + * Returns the specified records from a table. */ - public V1BulkGetRecordResponse recordServiceBulkGetRecord( - String vaultId, - String objectName, - RecordServiceBulkGetRecordRequest request, - RequestOptions requestOptions) { + public BulkGetRecordResponse getRecords( + String vaultId, String objectName, GetRecordsRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkGetRecord(vaultId, objectName, request, requestOptions) + .getRecords(vaultId, objectName, request, requestOptions) .body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public V1InsertRecordResponse recordServiceInsertRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceInsertRecord(vaultId, objectName).body(); + public InsertRecordResponse insertRecords(String vaultId, String objectName, InsertRecordRequest request) { + return this.rawClient.insertRecords(vaultId, objectName, request).body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Inserts a record in the specified table.The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. */ - public V1InsertRecordResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request) { + public InsertRecordResponse insertRecords( + String vaultId, String objectName, InsertRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request) + .insertRecords(vaultId, objectName, request, requestOptions) .body(); } /** - * Inserts a record in the specified table.<br /><br />The time-to-live (TTL) for a transient field begins when the field value is set during record insertion.<br /><br />Columns that have a string data type and a uniqueness constraint accept strings up to 2500 characters. If an inserted string exceeds 2500 characters, the call returns a token insertion error. + * Deletes the specified records from a table. */ - public V1InsertRecordResponse recordServiceInsertRecord( - String vaultId, String objectName, RecordServiceInsertRecordBody request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceInsertRecord(vaultId, objectName, request, requestOptions) - .body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName) { + return this.rawClient.deleteRecords(vaultId, objectName).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord(String vaultId, String objectName) { - return this.rawClient.recordServiceBulkDeleteRecord(vaultId, objectName).body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName, RequestOptions requestOptions) { + return this.rawClient.deleteRecords(vaultId, objectName, requestOptions).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord( - String vaultId, String objectName, RecordServiceBulkDeleteRecordBody request) { - return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request) - .body(); + public BulkDeleteRecordResponse deleteRecords(String vaultId, String objectName, BulkDeleteRecordRequest request) { + return this.rawClient.deleteRecords(vaultId, objectName, request).body(); } /** * Deletes the specified records from a table. */ - public V1BulkDeleteRecordResponse recordServiceBulkDeleteRecord( - String vaultId, - String objectName, - RecordServiceBulkDeleteRecordBody request, - RequestOptions requestOptions) { + public BulkDeleteRecordResponse deleteRecords( + String vaultId, String objectName, BulkDeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceBulkDeleteRecord(vaultId, objectName, request, requestOptions) + .deleteRecords(vaultId, objectName, request, requestOptions) .body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceGetRecord(vaultId, objectName, id).body(); + public GetFieldRecords getRecordById(String vaultId, String objectName, String id) { + return this.rawClient.getRecordById(vaultId, objectName, id).body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord( - String vaultId, String objectName, String id, RecordServiceGetRecordRequest request) { + public GetFieldRecords getRecordById(String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request) + .getRecordById(vaultId, objectName, id, requestOptions) .body(); } /** * Returns the specified record from a table. */ - public V1FieldRecords recordServiceGetRecord( - String vaultId, - String objectName, - String id, - RecordServiceGetRecordRequest request, - RequestOptions requestOptions) { - return this.rawClient - .recordServiceGetRecord(vaultId, objectName, id, request, requestOptions) - .body(); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public V1UpdateRecordResponse recordServiceUpdateRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceUpdateRecord(vaultId, objectName, id).body(); - } - - /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. - */ - public V1UpdateRecordResponse recordServiceUpdateRecord( - String vaultId, String objectName, String id, RecordServiceUpdateRecordBody request) { - return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request) - .body(); + public GetFieldRecords getRecordById(String vaultId, String objectName, String id, GetRecordByIdRequest request) { + return this.rawClient.getRecordById(vaultId, objectName, id, request).body(); } /** - * Updates the specified record in a table.<br /><br />When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.<br /><br />The time-to-live (TTL) for a transient field resets when the field value is updated. + * Returns the specified record from a table. */ - public V1UpdateRecordResponse recordServiceUpdateRecord( - String vaultId, - String objectName, - String id, - RecordServiceUpdateRecordBody request, - RequestOptions requestOptions) { + public GetFieldRecords getRecordById( + String vaultId, String objectName, String id, GetRecordByIdRequest request, RequestOptions requestOptions) { return this.rawClient - .recordServiceUpdateRecord(vaultId, objectName, id, request, requestOptions) + .getRecordById(vaultId, objectName, id, request, requestOptions) .body(); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1DeleteRecordResponse recordServiceDeleteRecord(String vaultId, String objectName, String id) { - return this.rawClient.recordServiceDeleteRecord(vaultId, objectName, id).body(); + public UpdateRecordResponse updateRecord(String vaultId, String objectName, String id) { + return this.rawClient.updateRecord(vaultId, objectName, id).body(); } /** - * Deletes the specified record from a table.<br /><br /><b>Note:</b> This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1DeleteRecordResponse recordServiceDeleteRecord( + public UpdateRecordResponse updateRecord( String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .recordServiceDeleteRecord(vaultId, objectName, id, requestOptions) + .updateRecord(vaultId, objectName, id, requestOptions) .body(); } /** - * Uploads a file to the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file) - .body(); - } - - /** - * Uploads a file to the specified record. - */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, String objectName, String id, Optional file, FileServiceUploadFileRequest request) { - return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request) - .body(); + public UpdateRecordResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request) { + return this.rawClient.updateRecord(vaultId, objectName, id, request).body(); } /** - * Uploads a file to the specified record. + * Updates the specified record in a table.When you update a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.The time-to-live (TTL) for a transient field resets when the field value is updated. */ - public V1UpdateRecordResponse fileServiceUploadFile( - String vaultId, - String objectName, - String id, - Optional file, - FileServiceUploadFileRequest request, - RequestOptions requestOptions) { + public UpdateRecordResponse updateRecord( + String vaultId, String objectName, String id, UpdateRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .fileServiceUploadFile(vaultId, objectName, id, file, request, requestOptions) + .updateRecord(vaultId, objectName, id, request, requestOptions) .body(); } /** - * Deletes a file from the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public V1DeleteFileResponse fileServiceDeleteFile(String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName) - .body(); + public DeleteRecordResponse deleteRecord(String vaultId, String objectName, String id) { + return this.rawClient.deleteRecord(vaultId, objectName, id).body(); } /** - * Deletes a file from the specified record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public V1DeleteFileResponse fileServiceDeleteFile( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { - return this.rawClient - .fileServiceDeleteFile(vaultId, tableName, id, columnName, requestOptions) - .body(); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public V1GetFileScanStatusResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName) { - return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName) - .body(); - } - - /** - * Returns the anti-virus scan status of a file. - */ - public V1GetFileScanStatusResponse fileServiceGetFileScanStatus( - String vaultId, String tableName, String id, String columnName, RequestOptions requestOptions) { + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, RequestOptions requestOptions) { return this.rawClient - .fileServiceGetFileScanStatus(vaultId, tableName, id, columnName, requestOptions) + .deleteRecord(vaultId, objectName, id, requestOptions) .body(); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public UploadFileV2Response uploadFileV2(String vaultId, File file, UploadFileV2Request request) { - return this.rawClient.uploadFileV2(vaultId, file, request).body(); + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request) { + return this.rawClient.deleteRecord(vaultId, objectName, id, request).body(); } /** - * Uploads the specified file to a record. If an existing record isn't specified, creates a new record and uploads the file to that record. + * Deletes the specified record from a table.Note: This method doesn't delete transient field tokens. Transient field values are available until they expire based on the fields' time-to-live (TTL) setting. */ - public UploadFileV2Response uploadFileV2( - String vaultId, File file, UploadFileV2Request request, RequestOptions requestOptions) { + public DeleteRecordResponse deleteRecord( + String vaultId, String objectName, String id, DeleteRecordRequest request, RequestOptions requestOptions) { return this.rawClient - .uploadFileV2(vaultId, file, request, requestOptions) + .deleteRecord(vaultId, objectName, id, request, requestOptions) .body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java new file mode 100644 index 00000000..fb59e148 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BatchOperationRequest.java @@ -0,0 +1,153 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.BatchRecord; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BatchOperationRequest.Builder.class) +public final class BatchOperationRequest { + private final List records; + + private final Optional continueOnError; + + private final Map additionalProperties; + + private BatchOperationRequest( + List records, Optional continueOnError, Map additionalProperties) { + this.records = records; + this.continueOnError = continueOnError; + this.additionalProperties = additionalProperties; + } + + /** + * @return Record operations to perform. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + /** + * @return If true, continues processing remaining operations when one operation returns an error. If false, stops processing remaining operations when one operation returns an error. + */ + @JsonProperty("continueOnError") + public Optional getContinueOnError() { + return continueOnError; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BatchOperationRequest && equalTo((BatchOperationRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BatchOperationRequest other) { + return records.equals(other.records) && continueOnError.equals(other.continueOnError); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records, this.continueOnError); + } + + @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 List records = new ArrayList<>(); + + private Optional continueOnError = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(BatchOperationRequest other) { + records(other.getRecords()); + continueOnError(other.getContinueOnError()); + return this; + } + + /** + *

                                  Record operations to perform.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(BatchRecord records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  If true, continues processing remaining operations when one operation returns an error. If false, stops processing remaining operations when one operation returns an error.

                                  + */ + @JsonSetter(value = "continueOnError", nulls = Nulls.SKIP) + public Builder continueOnError(Optional continueOnError) { + this.continueOnError = continueOnError; + return this; + } + + public Builder continueOnError(Boolean continueOnError) { + this.continueOnError = Optional.ofNullable(continueOnError); + return this; + } + + public BatchOperationRequest build() { + return new BatchOperationRequest(records, continueOnError, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java similarity index 60% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java index 4b9dcced..729b0623 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/BulkDeleteRecordRequest.java @@ -3,21 +3,29 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBulkDeleteRecordBody.Builder.class) -public final class RecordServiceBulkDeleteRecordBody { +@JsonDeserialize(builder = BulkDeleteRecordRequest.Builder.class) +public final class BulkDeleteRecordRequest { private final Optional> skyflowIds; private final Map additionalProperties; - private RecordServiceBulkDeleteRecordBody( - Optional> skyflowIds, Map additionalProperties) { + private BulkDeleteRecordRequest(Optional> skyflowIds, Map additionalProperties) { this.skyflowIds = skyflowIds; this.additionalProperties = additionalProperties; } @@ -30,10 +38,10 @@ public Optional> getSkyflowIds() { return skyflowIds; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceBulkDeleteRecordBody && equalTo((RecordServiceBulkDeleteRecordBody) other); + return other instanceof BulkDeleteRecordRequest && equalTo((BulkDeleteRecordRequest) other); } @JsonAnyGetter @@ -41,16 +49,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceBulkDeleteRecordBody other) { + private boolean equalTo(BulkDeleteRecordRequest other) { return skyflowIds.equals(other.skyflowIds); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowIds); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -68,7 +76,7 @@ public static final class Builder { private Builder() {} - public Builder from(RecordServiceBulkDeleteRecordBody other) { + public Builder from(BulkDeleteRecordRequest other) { skyflowIds(other.getSkyflowIds()); return this; } @@ -87,8 +95,18 @@ public Builder skyflowIds(List skyflowIds) { return this; } - public RecordServiceBulkDeleteRecordBody build() { - return new RecordServiceBulkDeleteRecordBody(skyflowIds, additionalProperties); + public BulkDeleteRecordRequest build() { + return new BulkDeleteRecordRequest(skyflowIds, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java new file mode 100644 index 00000000..eedbaef7 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRecordRequest.java @@ -0,0 +1,69 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteRecordRequest.Builder.class) +public final class DeleteRecordRequest { + private final Map additionalProperties; + + private DeleteRecordRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteRecordRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @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 { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteRecordRequest other) { + return this; + } + + public DeleteRecordRequest build() { + return new DeleteRecordRequest(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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java new file mode 100644 index 00000000..3a620b09 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/DeleteRequest.java @@ -0,0 +1,263 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.UniqueValue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteRequest.Builder.class) +public final class DeleteRequest { + private final String vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private DeleteRequest( + String vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> uniqueValues, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to delete. + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteRequest && equalTo((DeleteRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.skyflowIDs, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DeleteRequest other); + } + + public interface _FinalStage { + DeleteRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + */ + _FinalStage skyflowIDs(Optional> skyflowIDs); + + _FinalStage skyflowIDs(List skyflowIDs); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> uniqueValues = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to delete.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + @java.lang.Override + public DeleteRequest build() { + return new DeleteRequest(vaultId, tableName, skyflowIDs, uniqueValues, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java deleted file mode 100644 index 3efb0a98..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileServiceUploadFileRequest.Builder.class) -public final class FileServiceUploadFileRequest { - private final Optional columnName; - - private final Map additionalProperties; - - private FileServiceUploadFileRequest(Optional columnName, Map additionalProperties) { - this.columnName = columnName; - this.additionalProperties = additionalProperties; - } - - /** - * @return Name of the column to store the file in. The column must have a file data type. - */ - @JsonProperty("columnName") - public Optional getColumnName() { - return columnName; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileServiceUploadFileRequest && equalTo((FileServiceUploadFileRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileServiceUploadFileRequest other) { - return columnName.equals(other.columnName); - } - - @Override - public int hashCode() { - return Objects.hash(this.columnName); - } - - @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 columnName = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(FileServiceUploadFileRequest other) { - columnName(other.getColumnName()); - return this; - } - - /** - *

                                  Name of the column to store the file in. The column must have a file data type.

                                  - */ - @JsonSetter(value = "columnName", nulls = Nulls.SKIP) - public Builder columnName(Optional columnName) { - this.columnName = columnName; - return this; - } - - public Builder columnName(String columnName) { - this.columnName = Optional.ofNullable(columnName); - return this; - } - - public FileServiceUploadFileRequest build() { - return new FileServiceUploadFileRequest(columnName, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java similarity index 57% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java index 91317d02..db5cd9aa 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordByIdRequest.java @@ -3,75 +3,82 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.records.types.RecordServiceGetRecordRequestRedaction; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.GetRecordByIdRequestRedaction; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceGetRecordRequest.Builder.class) -public final class RecordServiceGetRecordRequest { +@JsonDeserialize(builder = GetRecordByIdRequest.Builder.class) +public final class GetRecordByIdRequest { private final Optional> fields; - private final Optional redaction; + private final Optional redaction; private final Optional tokenization; private final Optional downloadUrl; + private final Optional returnFileMetadata; + private final Map additionalProperties; - private RecordServiceGetRecordRequest( + private GetRecordByIdRequest( Optional> fields, - Optional redaction, + Optional redaction, Optional tokenization, Optional downloadUrl, + Optional returnFileMetadata, Map additionalProperties) { this.fields = fields; this.redaction = redaction; this.tokenization = tokenization; this.downloadUrl = downloadUrl; + this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } - /** - * @return Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields. - */ @JsonProperty("fields") public Optional> getFields() { return fields; } - /** - * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. - */ @JsonProperty("redaction") - public Optional getRedaction() { + public Optional getRedaction() { return redaction; } - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ @JsonProperty("tokenization") public Optional getTokenization() { return tokenization; } - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ @JsonProperty("downloadURL") public Optional getDownloadUrl() { return downloadUrl; } - @Override + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceGetRecordRequest && equalTo((RecordServiceGetRecordRequest) other); + return other instanceof GetRecordByIdRequest && equalTo((GetRecordByIdRequest) other); } @JsonAnyGetter @@ -79,19 +86,20 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceGetRecordRequest other) { + private boolean equalTo(GetRecordByIdRequest other) { return fields.equals(other.fields) && redaction.equals(other.redaction) && tokenization.equals(other.tokenization) - && downloadUrl.equals(other.downloadUrl); + && downloadUrl.equals(other.downloadUrl) + && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { - return Objects.hash(this.fields, this.redaction, this.tokenization, this.downloadUrl); + return Objects.hash(this.fields, this.redaction, this.tokenization, this.downloadUrl, this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -104,28 +112,28 @@ public static Builder builder() { public static final class Builder { private Optional> fields = Optional.empty(); - private Optional redaction = Optional.empty(); + private Optional redaction = Optional.empty(); private Optional tokenization = Optional.empty(); private Optional downloadUrl = Optional.empty(); + private Optional returnFileMetadata = Optional.empty(); + @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceGetRecordRequest other) { + public Builder from(GetRecordByIdRequest other) { fields(other.getFields()); redaction(other.getRedaction()); tokenization(other.getTokenization()); downloadUrl(other.getDownloadUrl()); + returnFileMetadata(other.getReturnFileMetadata()); return this; } - /** - *

                                  Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields.

                                  - */ @JsonSetter(value = "fields", nulls = Nulls.SKIP) public Builder fields(Optional> fields) { this.fields = fields; @@ -142,23 +150,17 @@ public Builder fields(String fields) { return this; } - /** - *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  - */ @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { + public Builder redaction(Optional redaction) { this.redaction = redaction; return this; } - public Builder redaction(RecordServiceGetRecordRequestRedaction redaction) { + public Builder redaction(GetRecordByIdRequestRedaction redaction) { this.redaction = Optional.ofNullable(redaction); return this; } - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) public Builder tokenization(Optional tokenization) { this.tokenization = tokenization; @@ -170,9 +172,6 @@ public Builder tokenization(Boolean tokenization) { return this; } - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) public Builder downloadUrl(Optional downloadUrl) { this.downloadUrl = downloadUrl; @@ -184,9 +183,30 @@ public Builder downloadUrl(Boolean downloadUrl) { return this; } - public RecordServiceGetRecordRequest build() { - return new RecordServiceGetRecordRequest( - fields, redaction, tokenization, downloadUrl, additionalProperties); + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public Builder returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + public Builder returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + public GetRecordByIdRequest build() { + return new GetRecordByIdRequest( + fields, redaction, tokenization, downloadUrl, returnFileMetadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java similarity index 59% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java index 9b59168a..f6e9263a 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRecordsRequest.java @@ -3,24 +3,34 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBulkGetRecordRequest.Builder.class) -public final class RecordServiceBulkGetRecordRequest { +@JsonDeserialize(builder = GetRecordsRequest.Builder.class) +public final class GetRecordsRequest { private final Optional> skyflowIds; private final Optional> fields; private final Optional> columnValues; - private final Optional redaction; + private final Optional redaction; private final Optional tokenization; @@ -32,21 +42,24 @@ public final class RecordServiceBulkGetRecordRequest { private final Optional columnName; - private final Optional orderBy; + private final Optional orderBy; + + private final Optional returnFileMetadata; private final Map additionalProperties; - private RecordServiceBulkGetRecordRequest( + private GetRecordsRequest( Optional> skyflowIds, Optional> fields, Optional> columnValues, - Optional redaction, + Optional redaction, Optional tokenization, Optional offset, Optional limit, Optional downloadUrl, Optional columnName, - Optional orderBy, + Optional orderBy, + Optional returnFileMetadata, Map additionalProperties) { this.skyflowIds = skyflowIds; this.fields = fields; @@ -58,93 +71,69 @@ private RecordServiceBulkGetRecordRequest( this.downloadUrl = downloadUrl; this.columnName = columnName; this.orderBy = orderBy; + this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } - /** - * @return skyflow_id values of the records to return, with one value per skyflow_ids URL parameter. For example, ?skyflow_ids=abc&skyflow_ids=123.<br /><br />If not specified, returns the first 25 records in the table. - */ @JsonProperty("skyflow_ids") public Optional> getSkyflowIds() { return skyflowIds; } - /** - * @return Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields. - */ @JsonProperty("fields") public Optional> getFields() { return fields; } - /** - * @return Column values of the records to return, with one value per column_values URL parameter. For example, ?column_values=abc&column_values=123.<br /><br />column_name is mandatory when providing column_values. If you use column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error. - */ @JsonProperty("column_values") public Optional> getColumnValues() { return columnValues; } - /** - * @return Redaction level to enforce for the returned records. Subject to policies assigned to the API caller. - */ @JsonProperty("redaction") - public Optional getRedaction() { + public Optional getRedaction() { return redaction; } - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ @JsonProperty("tokenization") public Optional getTokenization() { return tokenization; } - /** - * @return Record position at which to start receiving data. - */ @JsonProperty("offset") public Optional getOffset() { return offset; } - /** - * @return Number of record to return. Maximum 25. - */ @JsonProperty("limit") public Optional getLimit() { return limit; } - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ @JsonProperty("downloadURL") public Optional getDownloadUrl() { return downloadUrl; } - /** - * @return Name of the column. It must be configured as unique in the schema. If you provide both column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error. - */ @JsonProperty("column_name") public Optional getColumnName() { return columnName; } - /** - * @return Order to return records, based on skyflow_id values. To disable, set to NONE. - */ @JsonProperty("order_by") - public Optional getOrderBy() { + public Optional getOrderBy() { return orderBy; } - @Override + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceBulkGetRecordRequest && equalTo((RecordServiceBulkGetRecordRequest) other); + return other instanceof GetRecordsRequest && equalTo((GetRecordsRequest) other); } @JsonAnyGetter @@ -152,7 +141,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceBulkGetRecordRequest other) { + private boolean equalTo(GetRecordsRequest other) { return skyflowIds.equals(other.skyflowIds) && fields.equals(other.fields) && columnValues.equals(other.columnValues) @@ -162,10 +151,11 @@ private boolean equalTo(RecordServiceBulkGetRecordRequest other) { && limit.equals(other.limit) && downloadUrl.equals(other.downloadUrl) && columnName.equals(other.columnName) - && orderBy.equals(other.orderBy); + && orderBy.equals(other.orderBy) + && returnFileMetadata.equals(other.returnFileMetadata); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash( this.skyflowIds, @@ -177,10 +167,11 @@ public int hashCode() { this.limit, this.downloadUrl, this.columnName, - this.orderBy); + this.orderBy, + this.returnFileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -197,7 +188,7 @@ public static final class Builder { private Optional> columnValues = Optional.empty(); - private Optional redaction = Optional.empty(); + private Optional redaction = Optional.empty(); private Optional tokenization = Optional.empty(); @@ -209,14 +200,16 @@ public static final class Builder { private Optional columnName = Optional.empty(); - private Optional orderBy = Optional.empty(); + private Optional orderBy = Optional.empty(); + + private Optional returnFileMetadata = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceBulkGetRecordRequest other) { + public Builder from(GetRecordsRequest other) { skyflowIds(other.getSkyflowIds()); fields(other.getFields()); columnValues(other.getColumnValues()); @@ -227,12 +220,10 @@ public Builder from(RecordServiceBulkGetRecordRequest other) { downloadUrl(other.getDownloadUrl()); columnName(other.getColumnName()); orderBy(other.getOrderBy()); + returnFileMetadata(other.getReturnFileMetadata()); return this; } - /** - *

                                  skyflow_id values of the records to return, with one value per skyflow_ids URL parameter. For example, ?skyflow_ids=abc&skyflow_ids=123.<br /><br />If not specified, returns the first 25 records in the table.

                                  - */ @JsonSetter(value = "skyflow_ids", nulls = Nulls.SKIP) public Builder skyflowIds(Optional> skyflowIds) { this.skyflowIds = skyflowIds; @@ -249,9 +240,6 @@ public Builder skyflowIds(String skyflowIds) { return this; } - /** - *

                                  Fields to return for the record, with one value per fields URL parameter. For example, ?fields=abc&fields=123.<br /><br />If not specified, returns all fields.

                                  - */ @JsonSetter(value = "fields", nulls = Nulls.SKIP) public Builder fields(Optional> fields) { this.fields = fields; @@ -268,9 +256,6 @@ public Builder fields(String fields) { return this; } - /** - *

                                  Column values of the records to return, with one value per column_values URL parameter. For example, ?column_values=abc&column_values=123.<br /><br />column_name is mandatory when providing column_values. If you use column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error.

                                  - */ @JsonSetter(value = "column_values", nulls = Nulls.SKIP) public Builder columnValues(Optional> columnValues) { this.columnValues = columnValues; @@ -287,23 +272,17 @@ public Builder columnValues(String columnValues) { return this; } - /** - *

                                  Redaction level to enforce for the returned records. Subject to policies assigned to the API caller.

                                  - */ @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { + public Builder redaction(Optional redaction) { this.redaction = redaction; return this; } - public Builder redaction(RecordServiceBulkGetRecordRequestRedaction redaction) { + public Builder redaction(GetRecordsRequestRedaction redaction) { this.redaction = Optional.ofNullable(redaction); return this; } - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) public Builder tokenization(Optional tokenization) { this.tokenization = tokenization; @@ -315,9 +294,6 @@ public Builder tokenization(Boolean tokenization) { return this; } - /** - *

                                  Record position at which to start receiving data.

                                  - */ @JsonSetter(value = "offset", nulls = Nulls.SKIP) public Builder offset(Optional offset) { this.offset = offset; @@ -329,9 +305,6 @@ public Builder offset(String offset) { return this; } - /** - *

                                  Number of record to return. Maximum 25.

                                  - */ @JsonSetter(value = "limit", nulls = Nulls.SKIP) public Builder limit(Optional limit) { this.limit = limit; @@ -343,9 +316,6 @@ public Builder limit(String limit) { return this; } - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) public Builder downloadUrl(Optional downloadUrl) { this.downloadUrl = downloadUrl; @@ -357,9 +327,6 @@ public Builder downloadUrl(Boolean downloadUrl) { return this; } - /** - *

                                  Name of the column. It must be configured as unique in the schema. If you provide both column name or column value, you cannot use skyflow_ids. Passing either of these parameters with skyflow_ids returns an error.

                                  - */ @JsonSetter(value = "column_name", nulls = Nulls.SKIP) public Builder columnName(Optional columnName) { this.columnName = columnName; @@ -371,22 +338,30 @@ public Builder columnName(String columnName) { return this; } - /** - *

                                  Order to return records, based on skyflow_id values. To disable, set to NONE.

                                  - */ @JsonSetter(value = "order_by", nulls = Nulls.SKIP) - public Builder orderBy(Optional orderBy) { + public Builder orderBy(Optional orderBy) { this.orderBy = orderBy; return this; } - public Builder orderBy(RecordServiceBulkGetRecordRequestOrderBy orderBy) { + public Builder orderBy(GetRecordsRequestOrderBy orderBy) { this.orderBy = Optional.ofNullable(orderBy); return this; } - public RecordServiceBulkGetRecordRequest build() { - return new RecordServiceBulkGetRecordRequest( + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public Builder returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + public Builder returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + public GetRecordsRequest build() { + return new GetRecordsRequest( skyflowIds, fields, columnValues, @@ -397,7 +372,18 @@ public RecordServiceBulkGetRecordRequest build() { downloadUrl, columnName, orderBy, + returnFileMetadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java new file mode 100644 index 00000000..e6290a9d --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/GetRequest.java @@ -0,0 +1,499 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.ColumnRedactions; +import com.skyflow.generated.rest.types.GetRequestData; +import com.skyflow.generated.rest.types.UniqueValue; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetRequest.Builder.class) +public final class GetRequest { + private final String vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional limit; + + private final Optional offset; + + private final Optional> uniqueValues; + + private final Optional> records; + + private final Map additionalProperties; + + private GetRequest( + String vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional limit, + Optional offset, + Optional> uniqueValues, + Optional> records, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.limit = limit; + this.offset = offset; + this.uniqueValues = uniqueValues; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table to perform the operation on. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails. + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to redact. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to return. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return Limit for the number of records to be fetched. + */ + @JsonProperty("limit") + public Optional getLimit() { + return limit; + } + + /** + * @return Offset for the number of records to be fetched. + */ + @JsonProperty("offset") + public Optional getOffset() { + return offset; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + /** + * @return List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetRequest && equalTo((GetRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && limit.equals(other.limit) + && offset.equals(other.offset) + && uniqueValues.equals(other.uniqueValues) + && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.vaultId, + this.tableName, + this.skyflowIDs, + this.columnRedactions, + this.columns, + this.limit, + this.offset, + this.uniqueValues, + this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(GetRequest other); + } + + public interface _FinalStage { + GetRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + */ + _FinalStage skyflowIDs(Optional> skyflowIDs); + + _FinalStage skyflowIDs(List skyflowIDs); + + /** + *

                                  List of columns to redact.

                                  + */ + _FinalStage columnRedactions(Optional> columnRedactions); + + _FinalStage columnRedactions(List columnRedactions); + + /** + *

                                  List of columns to return.

                                  + */ + _FinalStage columns(Optional> columns); + + _FinalStage columns(List columns); + + /** + *

                                  Limit for the number of records to be fetched.

                                  + */ + _FinalStage limit(Optional limit); + + _FinalStage limit(Integer limit); + + /** + *

                                  Offset for the number of records to be fetched.

                                  + */ + _FinalStage offset(Optional offset); + + _FinalStage offset(Integer offset); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + */ + _FinalStage records(Optional> records); + + _FinalStage records(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> records = Optional.empty(); + + private Optional> uniqueValues = Optional.empty(); + + private Optional offset = Optional.empty(); + + private Optional limit = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + limit(other.getLimit()); + offset(other.getOffset()); + uniqueValues(other.getUniqueValues()); + records(other.getRecords()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + /** + *

                                  List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(Optional> records) { + this.records = records; + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Offset for the number of records to be fetched.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage offset(Integer offset) { + this.offset = Optional.ofNullable(offset); + return this; + } + + /** + *

                                  Offset for the number of records to be fetched.

                                  + */ + @java.lang.Override + @JsonSetter(value = "offset", nulls = Nulls.SKIP) + public _FinalStage offset(Optional offset) { + this.offset = offset; + return this; + } + + /** + *

                                  Limit for the number of records to be fetched.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage limit(Integer limit) { + this.limit = Optional.ofNullable(limit); + return this; + } + + /** + *

                                  Limit for the number of records to be fetched.

                                  + */ + @java.lang.Override + @JsonSetter(value = "limit", nulls = Nulls.SKIP) + public _FinalStage limit(Optional limit) { + this.limit = limit; + return this; + } + + /** + *

                                  List of columns to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

                                  List of columns to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(Optional> columns) { + this.columns = columns; + return this; + } + + /** + *

                                  List of columns to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

                                  List of columns to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public _FinalStage columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to return. Either skyflowIDs or uniqueValues are required. If both are provided, the request fails.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + @java.lang.Override + public GetRequest build() { + return new GetRequest( + vaultId, + tableName, + skyflowIDs, + columnRedactions, + columns, + limit, + offset, + uniqueValues, + records, + 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java similarity index 63% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java index e832e396..a842c058 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRecordRequest.java @@ -3,18 +3,28 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1FieldRecords; - -import java.util.*; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.types.FieldRecords; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceInsertRecordBody.Builder.class) -public final class RecordServiceInsertRecordBody { - private final Optional> records; +@JsonDeserialize(builder = InsertRecordRequest.Builder.class) +public final class InsertRecordRequest { + private final List records; private final Optional tokenization; @@ -22,16 +32,16 @@ public final class RecordServiceInsertRecordBody { private final Optional homogeneous; - private final Optional byot; + private final Optional byot; private final Map additionalProperties; - private RecordServiceInsertRecordBody( - Optional> records, + private InsertRecordRequest( + List records, Optional tokenization, Optional upsert, Optional homogeneous, - Optional byot, + Optional byot, Map additionalProperties) { this.records = records; this.tokenization = tokenization; @@ -45,7 +55,7 @@ private RecordServiceInsertRecordBody( * @return Record values and tokens. */ @JsonProperty("records") - public Optional> getRecords() { + public List getRecords() { return records; } @@ -58,7 +68,7 @@ public Optional getTokenization() { } /** - * @return Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.<br /><br />When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed. + * @return Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed. */ @JsonProperty("upsert") public Optional getUpsert() { @@ -73,15 +83,18 @@ public Optional getHomogeneous() { return homogeneous; } + /** + * @return Token insertion behavior. + */ @JsonProperty("byot") - public Optional getByot() { + public Optional getByot() { return byot; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceInsertRecordBody && equalTo((RecordServiceInsertRecordBody) other); + return other instanceof InsertRecordRequest && equalTo((InsertRecordRequest) other); } @JsonAnyGetter @@ -89,7 +102,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceInsertRecordBody other) { + private boolean equalTo(InsertRecordRequest other) { return records.equals(other.records) && tokenization.equals(other.tokenization) && upsert.equals(other.upsert) @@ -97,12 +110,12 @@ private boolean equalTo(RecordServiceInsertRecordBody other) { && byot.equals(other.byot); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.records, this.tokenization, this.upsert, this.homogeneous, this.byot); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -113,7 +126,7 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional> records = Optional.empty(); + private List records = new ArrayList<>(); private Optional tokenization = Optional.empty(); @@ -121,14 +134,14 @@ public static final class Builder { private Optional homogeneous = Optional.empty(); - private Optional byot = Optional.empty(); + private Optional byot = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceInsertRecordBody other) { + public Builder from(InsertRecordRequest other) { records(other.getRecords()); tokenization(other.getTokenization()); upsert(other.getUpsert()); @@ -141,13 +154,23 @@ public Builder from(RecordServiceInsertRecordBody other) { *

                                  Record values and tokens.

                                  */ @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } return this; } - public Builder records(List records) { - this.records = Optional.ofNullable(records); + public Builder addRecords(FieldRecords records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } return this; } @@ -166,7 +189,7 @@ public Builder tokenization(Boolean tokenization) { } /** - *

                                  Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.<br /><br />When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.

                                  + *

                                  Name of a unique column in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.When you upsert a field, include the entire contents you want the field to store. For JSON fields, include all nested fields and values. If a nested field isn't included, it's removed.

                                  */ @JsonSetter(value = "upsert", nulls = Nulls.SKIP) public Builder upsert(Optional upsert) { @@ -193,20 +216,32 @@ public Builder homogeneous(Boolean homogeneous) { return this; } + /** + *

                                  Token insertion behavior.

                                  + */ @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { + public Builder byot(Optional byot) { this.byot = byot; return this; } - public Builder byot(V1Byot byot) { + public Builder byot(InsertRecordRequestByot byot) { this.byot = Optional.ofNullable(byot); return this; } - public RecordServiceInsertRecordBody build() { - return new RecordServiceInsertRecordBody( - records, tokenization, upsert, homogeneous, byot, additionalProperties); + public InsertRecordRequest build() { + return new InsertRecordRequest(records, tokenization, upsert, homogeneous, byot, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java new file mode 100644 index 00000000..c4db785e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/InsertRequest.java @@ -0,0 +1,260 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.InsertRecordData; +import com.skyflow.generated.rest.types.Upsert; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRequest.Builder.class) +public final class InsertRequest { + private final String vaultId; + + private final String tableName; + + private final List records; + + private final Optional upsert; + + private final Map additionalProperties; + + private InsertRequest( + String vaultId, + String tableName, + List records, + Optional upsert, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Data to insert as a list of records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRequest && equalTo((InsertRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && upsert.equals(other.upsert); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.upsert); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + TableNameStage vaultId(@NotNull String vaultId); + + Builder from(InsertRequest other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + } + + public interface _FinalStage { + InsertRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to insert as a list of records.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(InsertRecordData records); + + _FinalStage addAllRecords(List records); + + _FinalStage upsert(Optional upsert); + + _FinalStage upsert(Upsert upsert); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, TableNameStage, _FinalStage { + private String vaultId; + + private String tableName; + + private Optional upsert = Optional.empty(); + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(InsertRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + upsert(other.getUpsert()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public TableNameStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Name of the table to perform the operation on. Can be defined at both the request body level and individual record level. If provided at both levels, the record-level tableName takes precedence.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage upsert(Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + @java.lang.Override + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public _FinalStage upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(InsertRecordData records) { + this.records.add(records); + return this; + } + + /** + *

                                  Data to insert as a list of records.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public InsertRequest build() { + return new InsertRequest(vaultId, tableName, records, upsert, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java deleted file mode 100644 index c1997213..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1BatchRecord; -import com.skyflow.generated.rest.types.V1Byot; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceBatchOperationBody.Builder.class) -public final class RecordServiceBatchOperationBody { - private final Optional> records; - - private final Optional continueOnError; - - private final Optional byot; - - private final Map additionalProperties; - - private RecordServiceBatchOperationBody( - Optional> records, - Optional continueOnError, - Optional byot, - Map additionalProperties) { - this.records = records; - this.continueOnError = continueOnError; - this.byot = byot; - this.additionalProperties = additionalProperties; - } - - /** - * @return Record operations to perform. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - /** - * @return Continue performing operations on partial errors. - */ - @JsonProperty("continueOnError") - public Optional getContinueOnError() { - return continueOnError; - } - - @JsonProperty("byot") - public Optional getByot() { - return byot; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof RecordServiceBatchOperationBody && equalTo((RecordServiceBatchOperationBody) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(RecordServiceBatchOperationBody other) { - return records.equals(other.records) - && continueOnError.equals(other.continueOnError) - && byot.equals(other.byot); - } - - @Override - public int hashCode() { - return Objects.hash(this.records, this.continueOnError, this.byot); - } - - @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> records = Optional.empty(); - - private Optional continueOnError = Optional.empty(); - - private Optional byot = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(RecordServiceBatchOperationBody other) { - records(other.getRecords()); - continueOnError(other.getContinueOnError()); - byot(other.getByot()); - return this; - } - - /** - *

                                  Record operations to perform.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - /** - *

                                  Continue performing operations on partial errors.

                                  - */ - @JsonSetter(value = "continueOnError", nulls = Nulls.SKIP) - public Builder continueOnError(Optional continueOnError) { - this.continueOnError = continueOnError; - return this; - } - - public Builder continueOnError(Boolean continueOnError) { - this.continueOnError = Optional.ofNullable(continueOnError); - return this; - } - - @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { - this.byot = byot; - return this; - } - - public Builder byot(V1Byot byot) { - this.byot = Optional.ofNullable(byot); - return this; - } - - public RecordServiceBatchOperationBody build() { - return new RecordServiceBatchOperationBody(records, continueOnError, byot, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java similarity index 58% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java index f5c7a229..2e22ed53 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRecordRequest.java @@ -3,32 +3,37 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1FieldRecords; - +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; +import com.skyflow.generated.rest.types.FieldRecords; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = RecordServiceUpdateRecordBody.Builder.class) -public final class RecordServiceUpdateRecordBody { - private final Optional record; +@JsonDeserialize(builder = UpdateRecordRequest.Builder.class) +public final class UpdateRecordRequest { + private final Optional record; private final Optional tokenization; - private final Optional byot; + private final Optional byot; private final Map additionalProperties; - private RecordServiceUpdateRecordBody( - Optional record, + private UpdateRecordRequest( + Optional record, Optional tokenization, - Optional byot, + Optional byot, Map additionalProperties) { this.record = record; this.tokenization = tokenization; @@ -37,7 +42,7 @@ private RecordServiceUpdateRecordBody( } @JsonProperty("record") - public Optional getRecord() { + public Optional getRecord() { return record; } @@ -49,15 +54,18 @@ public Optional getTokenization() { return tokenization; } + /** + * @return Token insertion behavior. + */ @JsonProperty("byot") - public Optional getByot() { + public Optional getByot() { return byot; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof RecordServiceUpdateRecordBody && equalTo((RecordServiceUpdateRecordBody) other); + return other instanceof UpdateRecordRequest && equalTo((UpdateRecordRequest) other); } @JsonAnyGetter @@ -65,16 +73,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(RecordServiceUpdateRecordBody other) { + private boolean equalTo(UpdateRecordRequest other) { return record.equals(other.record) && tokenization.equals(other.tokenization) && byot.equals(other.byot); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.record, this.tokenization, this.byot); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -85,18 +93,18 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional record = Optional.empty(); + private Optional record = Optional.empty(); private Optional tokenization = Optional.empty(); - private Optional byot = Optional.empty(); + private Optional byot = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(RecordServiceUpdateRecordBody other) { + public Builder from(UpdateRecordRequest other) { record(other.getRecord()); tokenization(other.getTokenization()); byot(other.getByot()); @@ -104,12 +112,12 @@ public Builder from(RecordServiceUpdateRecordBody other) { } @JsonSetter(value = "record", nulls = Nulls.SKIP) - public Builder record(Optional record) { + public Builder record(Optional record) { this.record = record; return this; } - public Builder record(V1FieldRecords record) { + public Builder record(FieldRecords record) { this.record = Optional.ofNullable(record); return this; } @@ -128,19 +136,32 @@ public Builder tokenization(Boolean tokenization) { return this; } + /** + *

                                  Token insertion behavior.

                                  + */ @JsonSetter(value = "byot", nulls = Nulls.SKIP) - public Builder byot(Optional byot) { + public Builder byot(Optional byot) { this.byot = byot; return this; } - public Builder byot(V1Byot byot) { + public Builder byot(UpdateRecordRequestByot byot) { this.byot = Optional.ofNullable(byot); return this; } - public RecordServiceUpdateRecordBody build() { - return new RecordServiceUpdateRecordBody(record, tokenization, byot, additionalProperties); + public UpdateRecordRequest build() { + return new UpdateRecordRequest(record, tokenization, byot, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java new file mode 100644 index 00000000..6b7f32c7 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/UpdateRequest.java @@ -0,0 +1,273 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.resources.records.types.UpdateRequestUpdateType; +import com.skyflow.generated.rest.types.UpdateRecordData; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateRequest.Builder.class) +public final class UpdateRequest { + private final String vaultId; + + private final String tableName; + + private final List records; + + private final Optional updateType; + + private final Map additionalProperties; + + private UpdateRequest( + String vaultId, + String tableName, + List records, + Optional updateType, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.updateType = updateType; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Data to update as a list of records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateRequest && equalTo((UpdateRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && updateType.equals(other.updateType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.updateType); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + TableNameStage vaultId(@NotNull String vaultId); + + Builder from(UpdateRequest other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + } + + public interface _FinalStage { + UpdateRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to update as a list of records.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(UpdateRecordData records); + + _FinalStage addAllRecords(List records); + + /** + *

                                  Type of update operation to perform.

                                  + */ + _FinalStage updateType(Optional updateType); + + _FinalStage updateType(UpdateRequestUpdateType updateType); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, TableNameStage, _FinalStage { + private String vaultId; + + private String tableName; + + private Optional updateType = Optional.empty(); + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(UpdateRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + updateType(other.getUpdateType()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public TableNameStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage updateType(UpdateRequestUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @java.lang.Override + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public _FinalStage updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(UpdateRecordData records) { + this.records.add(records); + return this; + } + + /** + *

                                  Data to update as a list of records.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public UpdateRequest build() { + return new UpdateRequest(vaultId, tableName, records, updateType, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java new file mode 100644 index 00000000..46191987 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordByIdRequestRedaction.java @@ -0,0 +1,108 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordByIdRequestRedaction { + public static final GetRecordByIdRequestRedaction DEFAULT = + new GetRecordByIdRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final GetRecordByIdRequestRedaction PLAIN_TEXT = + new GetRecordByIdRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final GetRecordByIdRequestRedaction MASKED = + new GetRecordByIdRequestRedaction(Value.MASKED, "MASKED"); + + public static final GetRecordByIdRequestRedaction REDACTED = + new GetRecordByIdRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + GetRecordByIdRequestRedaction(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 GetRecordByIdRequestRedaction + && this.string.equals(((GetRecordByIdRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordByIdRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new GetRecordByIdRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java new file mode 100644 index 00000000..886afd43 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestOrderBy.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordsRequestOrderBy { + public static final GetRecordsRequestOrderBy DESCENDING = + new GetRecordsRequestOrderBy(Value.DESCENDING, "DESCENDING"); + + public static final GetRecordsRequestOrderBy NONE = new GetRecordsRequestOrderBy(Value.NONE, "NONE"); + + public static final GetRecordsRequestOrderBy ASCENDING = new GetRecordsRequestOrderBy(Value.ASCENDING, "ASCENDING"); + + private final Value value; + + private final String string; + + GetRecordsRequestOrderBy(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 GetRecordsRequestOrderBy + && this.string.equals(((GetRecordsRequestOrderBy) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DESCENDING: + return visitor.visitDescending(); + case NONE: + return visitor.visitNone(); + case ASCENDING: + return visitor.visitAscending(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordsRequestOrderBy valueOf(String value) { + switch (value) { + case "DESCENDING": + return DESCENDING; + case "NONE": + return NONE; + case "ASCENDING": + return ASCENDING; + default: + return new GetRecordsRequestOrderBy(Value.UNKNOWN, value); + } + } + + public enum Value { + ASCENDING, + + DESCENDING, + + NONE, + + UNKNOWN + } + + public interface Visitor { + T visitAscending(); + + T visitDescending(); + + T visitNone(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java new file mode 100644 index 00000000..f3ac934c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/GetRecordsRequestRedaction.java @@ -0,0 +1,106 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class GetRecordsRequestRedaction { + public static final GetRecordsRequestRedaction DEFAULT = new GetRecordsRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final GetRecordsRequestRedaction PLAIN_TEXT = + new GetRecordsRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final GetRecordsRequestRedaction MASKED = new GetRecordsRequestRedaction(Value.MASKED, "MASKED"); + + public static final GetRecordsRequestRedaction REDACTED = + new GetRecordsRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + GetRecordsRequestRedaction(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 GetRecordsRequestRedaction + && this.string.equals(((GetRecordsRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GetRecordsRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new GetRecordsRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java new file mode 100644 index 00000000..b4e402aa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/InsertRecordRequestByot.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class InsertRecordRequestByot { + public static final InsertRecordRequestByot ENABLE_STRICT = + new InsertRecordRequestByot(Value.ENABLE_STRICT, "ENABLE_STRICT"); + + public static final InsertRecordRequestByot DISABLE = new InsertRecordRequestByot(Value.DISABLE, "DISABLE"); + + public static final InsertRecordRequestByot ENABLE = new InsertRecordRequestByot(Value.ENABLE, "ENABLE"); + + private final Value value; + + private final String string; + + InsertRecordRequestByot(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 InsertRecordRequestByot + && this.string.equals(((InsertRecordRequestByot) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case ENABLE_STRICT: + return visitor.visitEnableStrict(); + case DISABLE: + return visitor.visitDisable(); + case ENABLE: + return visitor.visitEnable(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static InsertRecordRequestByot valueOf(String value) { + switch (value) { + case "ENABLE_STRICT": + return ENABLE_STRICT; + case "DISABLE": + return DISABLE; + case "ENABLE": + return ENABLE; + default: + return new InsertRecordRequestByot(Value.UNKNOWN, value); + } + } + + public enum Value { + DISABLE, + + ENABLE, + + ENABLE_STRICT, + + UNKNOWN + } + + public interface Visitor { + T visitDisable(); + + T visitEnable(); + + T visitEnableStrict(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java deleted file mode 100644 index 1f25b38d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceBulkGetRecordRequestOrderBy { - ASCENDING("ASCENDING"), - - DESCENDING("DESCENDING"), - - NONE("NONE"); - - private final String value; - - RecordServiceBulkGetRecordRequestOrderBy(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java deleted file mode 100644 index 12bbc291..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceBulkGetRecordRequestRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RecordServiceBulkGetRecordRequestRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java deleted file mode 100644 index 4f546262..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.records.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RecordServiceGetRecordRequestRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RecordServiceGetRecordRequestRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java new file mode 100644 index 00000000..6af77d59 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRecordRequestByot.java @@ -0,0 +1,95 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRecordRequestByot { + public static final UpdateRecordRequestByot ENABLE_STRICT = + new UpdateRecordRequestByot(Value.ENABLE_STRICT, "ENABLE_STRICT"); + + public static final UpdateRecordRequestByot DISABLE = new UpdateRecordRequestByot(Value.DISABLE, "DISABLE"); + + public static final UpdateRecordRequestByot ENABLE = new UpdateRecordRequestByot(Value.ENABLE, "ENABLE"); + + private final Value value; + + private final String string; + + UpdateRecordRequestByot(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 UpdateRecordRequestByot + && this.string.equals(((UpdateRecordRequestByot) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case ENABLE_STRICT: + return visitor.visitEnableStrict(); + case DISABLE: + return visitor.visitDisable(); + case ENABLE: + return visitor.visitEnable(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRecordRequestByot valueOf(String value) { + switch (value) { + case "ENABLE_STRICT": + return ENABLE_STRICT; + case "DISABLE": + return DISABLE; + case "ENABLE": + return ENABLE; + default: + return new UpdateRecordRequestByot(Value.UNKNOWN, value); + } + } + + public enum Value { + DISABLE, + + ENABLE, + + ENABLE_STRICT, + + UNKNOWN + } + + public interface Visitor { + T visitDisable(); + + T visitEnable(); + + T visitEnableStrict(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java new file mode 100644 index 00000000..660067b8 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/records/types/UpdateRequestUpdateType.java @@ -0,0 +1,84 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRequestUpdateType { + public static final UpdateRequestUpdateType REPLACE = new UpdateRequestUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpdateRequestUpdateType UPDATE = new UpdateRequestUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpdateRequestUpdateType(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 UpdateRequestUpdateType + && this.string.equals(((UpdateRequestUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRequestUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpdateRequestUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java deleted file mode 100644 index 36b364b5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java +++ /dev/null @@ -1,210 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.concurrent.CompletableFuture; - -public class AsyncRawStringsClient { - protected final ClientOptions clientOptions; - - public AsyncRawStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture> deidentifyString( - DeidentifyStringRequest request) { - return deidentifyString(request, null); - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture> deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), DeidentifyStringResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString() { - return reidentifyString(ReidentifyStringRequest.builder().build()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString( - ReidentifyStringRequest request) { - return reidentifyString(request, null); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture> reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), IdentifyResponse.class), - response)); - return; - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 401: - future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - case 500: - future.completeExceptionally(new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), - response)); - return; - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); - return; - } catch (IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - } - - @Override - public void onFailure(@NotNull Call call, @NotNull IOException e) { - future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); - } - }); - return future; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java deleted file mode 100644 index 66ef72c5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncStringsClient { - protected final ClientOptions clientOptions; - - private final AsyncRawStringsClient rawClient; - - public AsyncStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawStringsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawStringsClient withRawResponse() { - return this.rawClient; - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture deidentifyString(DeidentifyStringRequest request) { - return this.rawClient.deidentifyString(request).thenApply(response -> response.body()); - } - - /** - * De-identifies sensitive data from a string. - */ - public CompletableFuture deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyString(request, requestOptions).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString() { - return this.rawClient.reidentifyString().thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString(ReidentifyStringRequest request) { - return this.rawClient.reidentifyString(request).thenApply(response -> response.body()); - } - - /** - * Re-identifies tokens in a string. - */ - public CompletableFuture reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.reidentifyString(request, requestOptions).thenApply(response -> response.body()); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java deleted file mode 100644 index da6bec56..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.InternalServerError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; -import okhttp3.*; - -import java.io.IOException; - -public class RawStringsClient { - protected final ClientOptions clientOptions; - - public RawStringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - * De-identifies sensitive data from a string. - */ - public ApiClientHttpResponse deidentifyString(DeidentifyStringRequest request) { - return deidentifyString(request, null); - } - - /** - * De-identifies sensitive data from a string. - */ - public ApiClientHttpResponse deidentifyString( - DeidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/deidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), DeidentifyStringResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString() { - return reidentifyString(ReidentifyStringRequest.builder().build()); - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString(ReidentifyStringRequest request) { - return reidentifyString(request, null); - } - - /** - * Re-identifies tokens in a string. - */ - public ApiClientHttpResponse reidentifyString( - ReidentifyStringRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/detect/reidentify/string") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), IdentifyResponse.class), response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); - case 500: - throw new InternalServerError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java deleted file mode 100644 index 5dfca68b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings; - -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; -import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.DeidentifyStringResponse; -import com.skyflow.generated.rest.types.IdentifyResponse; - -public class StringsClient { - protected final ClientOptions clientOptions; - - private final RawStringsClient rawClient; - - public StringsClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawStringsClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawStringsClient withRawResponse() { - return this.rawClient; - } - - /** - * De-identifies sensitive data from a string. - */ - public DeidentifyStringResponse deidentifyString(DeidentifyStringRequest request) { - return this.rawClient.deidentifyString(request).body(); - } - - /** - * De-identifies sensitive data from a string. - */ - public DeidentifyStringResponse deidentifyString(DeidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.deidentifyString(request, requestOptions).body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString() { - return this.rawClient.reidentifyString().body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString(ReidentifyStringRequest request) { - return this.rawClient.reidentifyString(request).body(); - } - - /** - * Re-identifies tokens in a string. - */ - public IdentifyResponse reidentifyString(ReidentifyStringRequest request, RequestOptions requestOptions) { - return this.rawClient.reidentifyString(request, requestOptions).body(); - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java deleted file mode 100644 index 06ec6cec..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java +++ /dev/null @@ -1,394 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.strings.types.DeidentifyStringRequestEntityTypesItem; -import com.skyflow.generated.rest.types.TokenTypeMapping; -import com.skyflow.generated.rest.types.Transformations; -import org.jetbrains.annotations.NotNull; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyStringRequest.Builder.class) -public final class DeidentifyStringRequest { - private final String text; - - private final String vaultId; - - private final Optional> entityTypes; - - private final Optional tokenType; - - private final Optional> allowRegex; - - private final Optional> restrictRegex; - - private final Optional transformations; - - private final Optional configurationId; - - private final Map additionalProperties; - - private DeidentifyStringRequest( - String text, - String vaultId, - Optional> entityTypes, - Optional tokenType, - Optional> allowRegex, - Optional> restrictRegex, - Optional transformations, - Optional configurationId, - Map additionalProperties) { - this.text = text; - this.vaultId = vaultId; - this.entityTypes = entityTypes; - this.tokenType = tokenType; - this.allowRegex = allowRegex; - this.restrictRegex = restrictRegex; - this.transformations = transformations; - this.configurationId = configurationId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to de-identify. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - @JsonProperty("vault_id") - public String getVaultId() { - return vaultId; - } - - /** - * @return Entities to detect and de-identify. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @JsonProperty("token_type") - public Optional getTokenType() { - return tokenType; - } - - /** - * @return Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. - */ - @JsonProperty("allow_regex") - public Optional> getAllowRegex() { - return allowRegex; - } - - /** - * @return Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings. - */ - @JsonProperty("restrict_regex") - public Optional> getRestrictRegex() { - return restrictRegex; - } - - @JsonProperty("transformations") - public Optional getTransformations() { - return transformations; - } - - /** - * @return ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file. - */ - @JsonProperty("configuration_id") - public Optional getConfigurationId() { - return configurationId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyStringRequest && equalTo((DeidentifyStringRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyStringRequest other) { - return text.equals(other.text) - && vaultId.equals(other.vaultId) - && entityTypes.equals(other.entityTypes) - && tokenType.equals(other.tokenType) - && allowRegex.equals(other.allowRegex) - && restrictRegex.equals(other.restrictRegex) - && transformations.equals(other.transformations) - && configurationId.equals(other.configurationId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.text, - this.vaultId, - this.entityTypes, - this.tokenType, - this.allowRegex, - this.restrictRegex, - this.transformations, - this.configurationId); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text to de-identify. - */ - VaultIdStage text(@NotNull String text); - - Builder from(DeidentifyStringRequest other); - } - - public interface VaultIdStage { - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for. - */ - _FinalStage vaultId(@NotNull String vaultId); - } - - public interface _FinalStage { - DeidentifyStringRequest build(); - - /** - *

                                  Entities to detect and de-identify.

                                  - */ - _FinalStage entityTypes(Optional> entityTypes); - - _FinalStage entityTypes(List entityTypes); - - _FinalStage tokenType(Optional tokenType); - - _FinalStage tokenType(TokenTypeMapping tokenType); - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - */ - _FinalStage allowRegex(Optional> allowRegex); - - _FinalStage allowRegex(List allowRegex); - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - */ - _FinalStage restrictRegex(Optional> restrictRegex); - - _FinalStage restrictRegex(List restrictRegex); - - _FinalStage transformations(Optional transformations); - - _FinalStage transformations(Transformations transformations); - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - */ - _FinalStage configurationId(Optional configurationId); - - _FinalStage configurationId(String configurationId); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, VaultIdStage, _FinalStage { - private String text; - - private String vaultId; - - private Optional configurationId = Optional.empty(); - - private Optional transformations = Optional.empty(); - - private Optional> restrictRegex = Optional.empty(); - - private Optional> allowRegex = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DeidentifyStringRequest other) { - text(other.getText()); - vaultId(other.getVaultId()); - entityTypes(other.getEntityTypes()); - tokenType(other.getTokenType()); - allowRegex(other.getAllowRegex()); - restrictRegex(other.getRestrictRegex()); - transformations(other.getTransformations()); - configurationId(other.getConfigurationId()); - return this; - } - - /** - * Text to de-identify.

                                  Text to de-identify.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public VaultIdStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * ID of a vault that you have Detect Invoker or Vault Owner permissions for.

                                  ID of a vault that you have Detect Invoker or Vault Owner permissions for.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("vault_id") - public _FinalStage vaultId(@NotNull String vaultId) { - this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); - return this; - } - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage configurationId(String configurationId) { - this.configurationId = Optional.ofNullable(configurationId); - return this; - } - - /** - *

                                  ID of the Detect configuration to use for de-identification. Can't be specified with fields other than vault_id, text, and file.

                                  - */ - @Override - @JsonSetter(value = "configuration_id", nulls = Nulls.SKIP) - public _FinalStage configurationId(Optional configurationId) { - this.configurationId = configurationId; - return this; - } - - @Override - public _FinalStage transformations(Transformations transformations) { - this.transformations = Optional.ofNullable(transformations); - return this; - } - - @Override - @JsonSetter(value = "transformations", nulls = Nulls.SKIP) - public _FinalStage transformations(Optional transformations) { - this.transformations = transformations; - return this; - } - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage restrictRegex(List restrictRegex) { - this.restrictRegex = Optional.ofNullable(restrictRegex); - return this; - } - - /** - *

                                  Regular expressions to replace with '[RESTRICTED]'. Expressions must match the entirety of a detected entity, not just a substring, for the entity to be restricted. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext. If a string is detected as an entity and a restrict_regex pattern matches the entire detected entity, the entity is replaced with '[RESTRICTED]'. If a string is detected as an entity but a restrict_regex pattern only matches a substring of it, the restrict_regex pattern is ignored, and the entity is processed according to the specified tokenization and transformation settings.

                                  - */ - @Override - @JsonSetter(value = "restrict_regex", nulls = Nulls.SKIP) - public _FinalStage restrictRegex(Optional> restrictRegex) { - this.restrictRegex = restrictRegex; - return this; - } - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage allowRegex(List allowRegex) { - this.allowRegex = Optional.ofNullable(allowRegex); - return this; - } - - /** - *

                                  Regular expressions to display in plaintext. Entities appear in plaintext if an expression matches either the entirety of a detected entity or a substring of it. Expressions don't match across entity boundaries. If a string or entity matches both allow_regex and restrict_regex, the entity is displayed in plaintext.

                                  - */ - @Override - @JsonSetter(value = "allow_regex", nulls = Nulls.SKIP) - public _FinalStage allowRegex(Optional> allowRegex) { - this.allowRegex = allowRegex; - return this; - } - - @Override - public _FinalStage tokenType(TokenTypeMapping tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - @Override - @JsonSetter(value = "token_type", nulls = Nulls.SKIP) - public _FinalStage tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - /** - *

                                  Entities to detect and de-identify.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - /** - *

                                  Entities to detect and de-identify.

                                  - */ - @Override - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public _FinalStage entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - @Override - public DeidentifyStringRequest build() { - return new DeidentifyStringRequest( - text, - vaultId, - entityTypes, - tokenType, - allowRegex, - restrictRegex, - transformations, - configurationId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java deleted file mode 100644 index 3c42390c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java +++ /dev/null @@ -1,151 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.Format; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyStringRequest.Builder.class) -public final class ReidentifyStringRequest { - private final Optional text; - - private final Optional vaultId; - - private final Optional format; - - private final Map additionalProperties; - - private ReidentifyStringRequest( - Optional text, - Optional vaultId, - Optional format, - Map additionalProperties) { - this.text = text; - this.vaultId = vaultId; - this.format = format; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text to reidentify. - */ - @JsonProperty("text") - public Optional getText() { - return text; - } - - /** - * @return ID of the vault where the entities are stored. - */ - @JsonProperty("vault_id") - public Optional getVaultId() { - return vaultId; - } - - @JsonProperty("format") - public Optional getFormat() { - return format; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyStringRequest && equalTo((ReidentifyStringRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyStringRequest other) { - return text.equals(other.text) && vaultId.equals(other.vaultId) && format.equals(other.format); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.vaultId, this.format); - } - - @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 text = Optional.empty(); - - private Optional vaultId = Optional.empty(); - - private Optional format = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifyStringRequest other) { - text(other.getText()); - vaultId(other.getVaultId()); - format(other.getFormat()); - return this; - } - - /** - *

                                  Text to reidentify.

                                  - */ - @JsonSetter(value = "text", nulls = Nulls.SKIP) - public Builder text(Optional text) { - this.text = text; - return this; - } - - public Builder text(String text) { - this.text = Optional.ofNullable(text); - return this; - } - - /** - *

                                  ID of the vault where the entities are stored.

                                  - */ - @JsonSetter(value = "vault_id", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - @JsonSetter(value = "format", nulls = Nulls.SKIP) - public Builder format(Optional format) { - this.format = format; - return this; - } - - public Builder format(Format format) { - this.format = Optional.ofNullable(format); - return this; - } - - public ReidentifyStringRequest build() { - return new ReidentifyStringRequest(text, vaultId, format, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java deleted file mode 100644 index 28066122..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.strings.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifyStringRequestEntityTypesItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - DeidentifyStringRequestEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java index 794035bd..5543aadc 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java @@ -4,17 +4,35 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.io.IOException; 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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawTokensClient { protected final ClientOptions clientOptions; @@ -26,29 +44,26 @@ public AsyncRawTokensClient(ClientOptions clientOptions) { /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture> recordServiceDetokenize(String vaultId) { - return recordServiceDetokenize(vaultId, V1DetokenizePayload.builder().build()); + public CompletableFuture> detokenize( + String vaultId, DetokenizePayload request) { + return detokenize(vaultId, request, null); } /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture> recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return recordServiceDetokenize(vaultId, request, null); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public CompletableFuture> recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("detokenize") - .build(); + .addPathSegments("detokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -57,7 +72,7 @@ public CompletableFuture> recordServ throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -67,33 +82,60 @@ public CompletableFuture> recordServ if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DetokenizeResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetokenizeResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } @@ -108,31 +150,28 @@ public void onFailure(@NotNull Call call, @NotNull IOException e) { } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public CompletableFuture> recordServiceTokenize(String vaultId) { - return recordServiceTokenize(vaultId, V1TokenizePayload.builder().build()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture> recordServiceTokenize( - String vaultId, V1TokenizePayload request) { - return recordServiceTokenize(vaultId, request, null); + public CompletableFuture> tokenize( + String vaultId, TokenizePayload request) { + return tokenize(vaultId, request, null); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture> recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("tokenize") - .build(); + .addPathSegments("tokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -141,7 +180,7 @@ public CompletableFuture> recordServic throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -151,33 +190,60 @@ public CompletableFuture> recordServic if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1TokenizeResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, TokenizeResponse.class), 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; + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java index 621701af..da6a88de 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java @@ -5,11 +5,10 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; - +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.util.concurrent.CompletableFuture; public class AsyncTokensClient { @@ -32,49 +31,30 @@ public AsyncRawTokensClient withRawResponse() { /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture recordServiceDetokenize(String vaultId) { - return this.rawClient.recordServiceDetokenize(vaultId).thenApply(response -> response.body()); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public CompletableFuture recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return this.rawClient.recordServiceDetokenize(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture detokenize(String vaultId, DetokenizePayload request) { + return this.rawClient.detokenize(vaultId, request).thenApply(response -> response.body()); } /** * Returns records that correspond to the specified tokens. */ - public CompletableFuture recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceDetokenize(vaultId, request, requestOptions) - .thenApply(response -> response.body()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public CompletableFuture recordServiceTokenize(String vaultId) { - return this.rawClient.recordServiceTokenize(vaultId).thenApply(response -> response.body()); + public CompletableFuture detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.detokenize(vaultId, request, requestOptions).thenApply(response -> response.body()); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return this.rawClient.recordServiceTokenize(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture tokenize(String vaultId, TokenizePayload request) { + return this.rawClient.tokenize(vaultId, request).thenApply(response -> response.body()); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public CompletableFuture recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceTokenize(vaultId, request, requestOptions) - .thenApply(response -> response.body()); + public CompletableFuture tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.tokenize(vaultId, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java index 7ad69d11..6780c88c 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java @@ -4,15 +4,31 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.MediaTypes; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.RetryInterceptor; +import com.skyflow.generated.rest.errors.BadRequestError; +import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import okhttp3.*; - +import com.skyflow.generated.rest.errors.UnauthorizedError; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.ErrorResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; public class RawTokensClient { protected final ClientOptions clientOptions; @@ -24,29 +40,25 @@ public RawTokensClient(ClientOptions clientOptions) { /** * Returns records that correspond to the specified tokens. */ - public ApiClientHttpResponse recordServiceDetokenize(String vaultId) { - return recordServiceDetokenize(vaultId, V1DetokenizePayload.builder().build()); - } - - /** - * Returns records that correspond to the specified tokens. - */ - public ApiClientHttpResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request) { - return recordServiceDetokenize(vaultId, request, null); + public ApiClientHttpResponse detokenize(String vaultId, DetokenizePayload request) { + return detokenize(vaultId, request, null); } /** * Returns records that correspond to the specified tokens. */ - public ApiClientHttpResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse detokenize( + String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("detokenize") - .build(); + .addPathSegments("detokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -55,7 +67,7 @@ public ApiClientHttpResponse recordServiceDetokenize( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -65,57 +77,72 @@ public ApiClientHttpResponse recordServiceDetokenize( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DetokenizeResponse.class), - response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, DetokenizeResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public ApiClientHttpResponse recordServiceTokenize(String vaultId) { - return recordServiceTokenize(vaultId, V1TokenizePayload.builder().build()); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public ApiClientHttpResponse recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return recordServiceTokenize(vaultId, request, null); + public ApiClientHttpResponse tokenize(String vaultId, TokenizePayload request) { + return tokenize(vaultId, request, null); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public ApiClientHttpResponse recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public ApiClientHttpResponse tokenize( + String vaultId, TokenizePayload request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v1/vaults") .addPathSegment(vaultId) - .addPathSegments("tokenize") - .build(); + .addPathSegments("tokenize"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -124,7 +151,7 @@ public ApiClientHttpResponse recordServiceTokenize( throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -134,26 +161,45 @@ public ApiClientHttpResponse recordServiceTokenize( 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1TokenizeResponse.class), response); + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, TokenizeResponse.class), response); } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { - if (response.code() == 404) { - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); } catch (IOException e) { throw new ApiClientException("Network error executing HTTP request", e); } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java index 8b0e7e40..47656ee5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java @@ -5,10 +5,10 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.DetokenizeResponse; +import com.skyflow.generated.rest.types.TokenizeResponse; public class TokensClient { protected final ClientOptions clientOptions; @@ -30,48 +30,28 @@ public RawTokensClient withRawResponse() { /** * Returns records that correspond to the specified tokens. */ - public V1DetokenizeResponse recordServiceDetokenize(String vaultId) { - return this.rawClient.recordServiceDetokenize(vaultId).body(); + public DetokenizeResponse detokenize(String vaultId, DetokenizePayload request) { + return this.rawClient.detokenize(vaultId, request).body(); } /** * Returns records that correspond to the specified tokens. */ - public V1DetokenizeResponse recordServiceDetokenize(String vaultId, V1DetokenizePayload request) { - return this.rawClient.recordServiceDetokenize(vaultId, request).body(); + public DetokenizeResponse detokenize(String vaultId, DetokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.detokenize(vaultId, request, requestOptions).body(); } /** - * Returns records that correspond to the specified tokens. - */ - public V1DetokenizeResponse recordServiceDetokenize( - String vaultId, V1DetokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceDetokenize(vaultId, request, requestOptions) - .body(); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. - */ - public V1TokenizeResponse recordServiceTokenize(String vaultId) { - return this.rawClient.recordServiceTokenize(vaultId).body(); - } - - /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public V1TokenizeResponse recordServiceTokenize(String vaultId, V1TokenizePayload request) { - return this.rawClient.recordServiceTokenize(vaultId, request).body(); + public TokenizeResponse tokenize(String vaultId, TokenizePayload request) { + return this.rawClient.tokenize(vaultId, request).body(); } /** - * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.<br /><br /><b>Note:</b> This endpoint doesn't insert records—it returns tokens for existing values. To insert records and tokenize that new record's values, see <a href='#RecordService_InsertRecord'>Insert Record</a> and the tokenization parameter. + * Returns tokens that correspond to the specified records. Only applicable for fields with deterministic tokenization.Note: This endpoint doesn't insert records—it returns tokens for existing values. To insert records and return tokens for that new record's values, see Insert Records' tokenization parameter. */ - public V1TokenizeResponse recordServiceTokenize( - String vaultId, V1TokenizePayload request, RequestOptions requestOptions) { - return this.rawClient - .recordServiceTokenize(vaultId, request, requestOptions) - .body(); + public TokenizeResponse tokenize(String vaultId, TokenizePayload request, RequestOptions requestOptions) { + return this.rawClient.tokenize(vaultId, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java new file mode 100644 index 00000000..61f59fa4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DeleteTokenRequest.java @@ -0,0 +1,189 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenRequest.Builder.class) +public final class DeleteTokenRequest { + private final String vaultId; + + private final List tokens; + + private final Map additionalProperties; + + private DeleteTokenRequest(String vaultId, List tokens, Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Tokens to delete. + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenRequest && equalTo((DeleteTokenRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenRequest other) { + return vaultId.equals(other.vaultId) && tokens.equals(other.tokens); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DeleteTokenRequest other); + } + + public interface _FinalStage { + DeleteTokenRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Tokens to delete.

                                  + */ + _FinalStage tokens(List tokens); + + _FinalStage addTokens(String tokens); + + _FinalStage addAllTokens(List tokens); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteTokenRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Tokens to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + /** + *

                                  Tokens to delete.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokens(String tokens) { + this.tokens.add(tokens); + return this; + } + + /** + *

                                  Tokens to delete.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + @java.lang.Override + public DeleteTokenRequest build() { + return new DeleteTokenRequest(vaultId, tokens, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java rename to skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java index 52571f64..03681bb5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizePayload.java @@ -3,17 +3,27 @@ */ package com.skyflow.generated.rest.resources.tokens.requests; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1DetokenizeRecordRequest; - -import java.util.*; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizePayload.Builder.class) -public final class V1DetokenizePayload { - private final Optional> detokenizationParameters; +@JsonDeserialize(builder = DetokenizePayload.Builder.class) +public final class DetokenizePayload { + private final List detokenizationParameters; private final Optional downloadUrl; @@ -21,8 +31,8 @@ public final class V1DetokenizePayload { private final Map additionalProperties; - private V1DetokenizePayload( - Optional> detokenizationParameters, + private DetokenizePayload( + List detokenizationParameters, Optional downloadUrl, Optional continueOnError, Map additionalProperties) { @@ -36,7 +46,7 @@ private V1DetokenizePayload( * @return Detokenization details. */ @JsonProperty("detokenizationParameters") - public Optional> getDetokenizationParameters() { + public List getDetokenizationParameters() { return detokenizationParameters; } @@ -56,10 +66,10 @@ public Optional getContinueOnError() { return continueOnError; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DetokenizePayload && equalTo((V1DetokenizePayload) other); + return other instanceof DetokenizePayload && equalTo((DetokenizePayload) other); } @JsonAnyGetter @@ -67,18 +77,18 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DetokenizePayload other) { + private boolean equalTo(DetokenizePayload other) { return detokenizationParameters.equals(other.detokenizationParameters) && downloadUrl.equals(other.downloadUrl) && continueOnError.equals(other.continueOnError); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.detokenizationParameters, this.downloadUrl, this.continueOnError); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -89,7 +99,7 @@ public static Builder builder() { @JsonIgnoreProperties(ignoreUnknown = true) public static final class Builder { - private Optional> detokenizationParameters = Optional.empty(); + private List detokenizationParameters = new ArrayList<>(); private Optional downloadUrl = Optional.empty(); @@ -100,7 +110,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DetokenizePayload other) { + public Builder from(DetokenizePayload other) { detokenizationParameters(other.getDetokenizationParameters()); downloadUrl(other.getDownloadUrl()); continueOnError(other.getContinueOnError()); @@ -111,13 +121,23 @@ public Builder from(V1DetokenizePayload other) { *

                                  Detokenization details.

                                  */ @JsonSetter(value = "detokenizationParameters", nulls = Nulls.SKIP) - public Builder detokenizationParameters(Optional> detokenizationParameters) { - this.detokenizationParameters = detokenizationParameters; + public Builder detokenizationParameters(List detokenizationParameters) { + this.detokenizationParameters.clear(); + if (detokenizationParameters != null) { + this.detokenizationParameters.addAll(detokenizationParameters); + } return this; } - public Builder detokenizationParameters(List detokenizationParameters) { - this.detokenizationParameters = Optional.ofNullable(detokenizationParameters); + public Builder addDetokenizationParameters(DetokenizeRecordRequest detokenizationParameters) { + this.detokenizationParameters.add(detokenizationParameters); + return this; + } + + public Builder addAllDetokenizationParameters(List detokenizationParameters) { + if (detokenizationParameters != null) { + this.detokenizationParameters.addAll(detokenizationParameters); + } return this; } @@ -149,9 +169,18 @@ public Builder continueOnError(Boolean continueOnError) { return this; } - public V1DetokenizePayload build() { - return new V1DetokenizePayload( - detokenizationParameters, downloadUrl, continueOnError, additionalProperties); + public DetokenizePayload build() { + return new DetokenizePayload(detokenizationParameters, downloadUrl, continueOnError, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java new file mode 100644 index 00000000..3424acdc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/DetokenizeRequest.java @@ -0,0 +1,238 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenGroupRedactions; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeRequest.Builder.class) +public final class DetokenizeRequest { + private final String vaultId; + + private final List tokens; + + private final Optional> tokenGroupRedactions; + + private final Map additionalProperties; + + private DetokenizeRequest( + String vaultId, + List tokens, + Optional> tokenGroupRedactions, + Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.tokenGroupRedactions = tokenGroupRedactions; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Token to be detokenized + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + /** + * @return List of token groups to redact. + */ + @JsonProperty("tokenGroupRedactions") + public Optional> getTokenGroupRedactions() { + return tokenGroupRedactions; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeRequest && equalTo((DetokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeRequest other) { + return vaultId.equals(other.vaultId) + && tokens.equals(other.tokens) + && tokenGroupRedactions.equals(other.tokenGroupRedactions); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens, this.tokenGroupRedactions); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(DetokenizeRequest other); + } + + public interface _FinalStage { + DetokenizeRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Token to be detokenized

                                  + */ + _FinalStage tokens(List tokens); + + _FinalStage addTokens(String tokens); + + _FinalStage addAllTokens(List tokens); + + /** + *

                                  List of token groups to redact.

                                  + */ + _FinalStage tokenGroupRedactions(Optional> tokenGroupRedactions); + + _FinalStage tokenGroupRedactions(List tokenGroupRedactions); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private Optional> tokenGroupRedactions = Optional.empty(); + + private List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + tokenGroupRedactions(other.getTokenGroupRedactions()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  List of token groups to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupRedactions(List tokenGroupRedactions) { + this.tokenGroupRedactions = Optional.ofNullable(tokenGroupRedactions); + return this; + } + + /** + *

                                  List of token groups to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupRedactions", nulls = Nulls.SKIP) + public _FinalStage tokenGroupRedactions(Optional> tokenGroupRedactions) { + this.tokenGroupRedactions = tokenGroupRedactions; + return this; + } + + /** + *

                                  Token to be detokenized

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + /** + *

                                  Token to be detokenized

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokens(String tokens) { + this.tokens.add(tokens); + return this; + } + + /** + *

                                  Token to be detokenized

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + @java.lang.Override + public DetokenizeRequest build() { + return new DetokenizeRequest(vaultId, tokens, tokenGroupRedactions, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java new file mode 100644 index 00000000..ffa9160b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/GetTokensFromValuesRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.GetTokensFromValuesRequestObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesRequest.Builder.class) +public final class GetTokensFromValuesRequest { + private final String vaultId; + + private final List records; + + private final Map additionalProperties; + + private GetTokensFromValuesRequest( + String vaultId, List records, Map additionalProperties) { + this.vaultId = vaultId; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Array of value/token-group pairs to look up. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesRequest && equalTo((GetTokensFromValuesRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesRequest other) { + return vaultId.equals(other.vaultId) && records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.records); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(GetTokensFromValuesRequest other); + } + + public interface _FinalStage { + GetTokensFromValuesRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + */ + _FinalStage records(List records); + + _FinalStage addRecords(GetTokensFromValuesRequestObject records); + + _FinalStage addAllRecords(List records); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetTokensFromValuesRequest other) { + vaultId(other.getVaultId()); + records(other.getRecords()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addRecords(GetTokensFromValuesRequestObject records) { + this.records.add(records); + return this; + } + + /** + *

                                  Array of value/token-group pairs to look up.

                                  + */ + @java.lang.Override + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public _FinalStage records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + @java.lang.Override + public GetTokensFromValuesRequest build() { + return new GetTokensFromValuesRequest(vaultId, records, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java new file mode 100644 index 00000000..13466de6 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizePayload.java @@ -0,0 +1,124 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizePayload.Builder.class) +public final class TokenizePayload { + private final List tokenizationParameters; + + private final Map additionalProperties; + + private TokenizePayload( + List tokenizationParameters, Map additionalProperties) { + this.tokenizationParameters = tokenizationParameters; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokenization details. + */ + @JsonProperty("tokenizationParameters") + public List getTokenizationParameters() { + return tokenizationParameters; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizePayload && equalTo((TokenizePayload) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizePayload other) { + return tokenizationParameters.equals(other.tokenizationParameters); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokenizationParameters); + } + + @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 List tokenizationParameters = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizePayload other) { + tokenizationParameters(other.getTokenizationParameters()); + return this; + } + + /** + *

                                  Tokenization details.

                                  + */ + @JsonSetter(value = "tokenizationParameters", nulls = Nulls.SKIP) + public Builder tokenizationParameters(List tokenizationParameters) { + this.tokenizationParameters.clear(); + if (tokenizationParameters != null) { + this.tokenizationParameters.addAll(tokenizationParameters); + } + return this; + } + + public Builder addTokenizationParameters(TokenizeRecordRequest tokenizationParameters) { + this.tokenizationParameters.add(tokenizationParameters); + return this; + } + + public Builder addAllTokenizationParameters(List tokenizationParameters) { + if (tokenizationParameters != null) { + this.tokenizationParameters.addAll(tokenizationParameters); + } + return this; + } + + public TokenizePayload build() { + return new TokenizePayload(tokenizationParameters, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java new file mode 100644 index 00000000..7aab1a72 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/TokenizeRequest.java @@ -0,0 +1,191 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.tokens.requests; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.TokenizeRequestObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRequest.Builder.class) +public final class TokenizeRequest { + private final String vaultId; + + private final List data; + + private final Map additionalProperties; + + private TokenizeRequest( + String vaultId, List data, Map additionalProperties) { + this.vaultId = vaultId; + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault. + */ + @JsonProperty("vaultID") + public String getVaultId() { + return vaultId; + } + + /** + * @return Data to tokenize. + */ + @JsonProperty("data") + public List getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRequest && equalTo((TokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRequest other) { + return vaultId.equals(other.vaultId) && data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.vaultId, this.data); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static VaultIdStage builder() { + return new Builder(); + } + + public interface VaultIdStage { + /** + *

                                  ID of the vault.

                                  + */ + _FinalStage vaultId(@NotNull String vaultId); + + Builder from(TokenizeRequest other); + } + + public interface _FinalStage { + TokenizeRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Data to tokenize.

                                  + */ + _FinalStage data(List data); + + _FinalStage addData(TokenizeRequestObject data); + + _FinalStage addAllData(List data); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements VaultIdStage, _FinalStage { + private String vaultId; + + private List data = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRequest other) { + vaultId(other.getVaultId()); + data(other.getData()); + return this; + } + + /** + *

                                  ID of the vault.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("vaultID") + public _FinalStage vaultId(@NotNull String vaultId) { + this.vaultId = Objects.requireNonNull(vaultId, "vaultId must not be null"); + return this; + } + + /** + *

                                  Data to tokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllData(List data) { + if (data != null) { + this.data.addAll(data); + } + return this; + } + + /** + *

                                  Data to tokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addData(TokenizeRequestObject data) { + this.data.add(data); + return this; + } + + /** + *

                                  Data to tokenize.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(List data) { + this.data.clear(); + if (data != null) { + this.data.addAll(data); + } + return this; + } + + @java.lang.Override + public TokenizeRequest build() { + return new TokenizeRequest(vaultId, data, 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/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java deleted file mode 100644 index e5fc08f4..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.resources.tokens.requests; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.types.V1TokenizeRecordRequest; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizePayload.Builder.class) -public final class V1TokenizePayload { - private final Optional> tokenizationParameters; - - private final Map additionalProperties; - - private V1TokenizePayload( - Optional> tokenizationParameters, Map additionalProperties) { - this.tokenizationParameters = tokenizationParameters; - this.additionalProperties = additionalProperties; - } - - /** - * @return Tokenization details. - */ - @JsonProperty("tokenizationParameters") - public Optional> getTokenizationParameters() { - return tokenizationParameters; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizePayload && equalTo((V1TokenizePayload) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizePayload other) { - return tokenizationParameters.equals(other.tokenizationParameters); - } - - @Override - public int hashCode() { - return Objects.hash(this.tokenizationParameters); - } - - @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> tokenizationParameters = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizePayload other) { - tokenizationParameters(other.getTokenizationParameters()); - return this; - } - - /** - *

                                  Tokenization details.

                                  - */ - @JsonSetter(value = "tokenizationParameters", nulls = Nulls.SKIP) - public Builder tokenizationParameters(Optional> tokenizationParameters) { - this.tokenizationParameters = tokenizationParameters; - return this; - } - - public Builder tokenizationParameters(List tokenizationParameters) { - this.tokenizationParameters = Optional.ofNullable(tokenizationParameters); - return this; - } - - public V1TokenizePayload build() { - return new V1TokenizePayload(tokenizationParameters, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java deleted file mode 100644 index d16caf10..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum AuditEventAuditResourceType { - NONE_API("NONE_API"), - - ACCOUNT("ACCOUNT"), - - AUDIT("AUDIT"), - - BASE_DATA_TYPE("BASE_DATA_TYPE"), - - FIELD_TEMPLATE("FIELD_TEMPLATE"), - - FILE("FILE"), - - KEY("KEY"), - - POLICY("POLICY"), - - PROTO_PARSE("PROTO_PARSE"), - - RECORD("RECORD"), - - ROLE("ROLE"), - - RULE("RULE"), - - SECRET("SECRET"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"), - - TOKEN("TOKEN"), - - USER("USER"), - - VAULT("VAULT"), - - VAULT_TEMPLATE("VAULT_TEMPLATE"), - - WORKSPACE("WORKSPACE"), - - TABLE("TABLE"), - - POLICY_TEMPLATE("POLICY_TEMPLATE"), - - MEMBER("MEMBER"), - - TAG("TAG"), - - CONNECTION("CONNECTION"), - - MIGRATION("MIGRATION"), - - SCHEDULED_JOB("SCHEDULED_JOB"), - - JOB("JOB"), - - COLUMN_NAME("COLUMN_NAME"), - - NETWORK_TOKEN("NETWORK_TOKEN"), - - SUBSCRIPTION("SUBSCRIPTION"); - - private final String value; - - AuditEventAuditResourceType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java deleted file mode 100644 index 73aed9c1..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java +++ /dev/null @@ -1,435 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventContext.Builder.class) -public final class AuditEventContext { - private final Optional changeId; - - private final Optional requestId; - - private final Optional traceId; - - private final Optional sessionId; - - private final Optional actor; - - private final Optional actorType; - - private final Optional accessType; - - private final Optional ipAddress; - - private final Optional origin; - - private final Optional authMode; - - private final Optional jwtId; - - private final Optional bearerTokenContextId; - - private final Map additionalProperties; - - private AuditEventContext( - Optional changeId, - Optional requestId, - Optional traceId, - Optional sessionId, - Optional actor, - Optional actorType, - Optional accessType, - Optional ipAddress, - Optional origin, - Optional authMode, - Optional jwtId, - Optional bearerTokenContextId, - Map additionalProperties) { - this.changeId = changeId; - this.requestId = requestId; - this.traceId = traceId; - this.sessionId = sessionId; - this.actor = actor; - this.actorType = actorType; - this.accessType = accessType; - this.ipAddress = ipAddress; - this.origin = origin; - this.authMode = authMode; - this.jwtId = jwtId; - this.bearerTokenContextId = bearerTokenContextId; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID for the audit event. - */ - @JsonProperty("changeID") - public Optional getChangeId() { - return changeId; - } - - /** - * @return ID for the request that caused the event. - */ - @JsonProperty("requestID") - public Optional getRequestId() { - return requestId; - } - - /** - * @return ID for the request set by the service that received the request. - */ - @JsonProperty("traceID") - public Optional getTraceId() { - return traceId; - } - - /** - * @return ID for the session in which the request was sent. - */ - @JsonProperty("sessionID") - public Optional getSessionId() { - return sessionId; - } - - /** - * @return Member who sent the request. Depending on actorType, this may be a user ID or a service account ID. - */ - @JsonProperty("actor") - public Optional getActor() { - return actor; - } - - @JsonProperty("actorType") - public Optional getActorType() { - return actorType; - } - - @JsonProperty("accessType") - public Optional getAccessType() { - return accessType; - } - - /** - * @return IP Address of the client that made the request. - */ - @JsonProperty("ipAddress") - public Optional getIpAddress() { - return ipAddress; - } - - /** - * @return HTTP Origin request header (including scheme, hostname, and port) of the request. - */ - @JsonProperty("origin") - public Optional getOrigin() { - return origin; - } - - @JsonProperty("authMode") - public Optional getAuthMode() { - return authMode; - } - - /** - * @return ID of the JWT token. - */ - @JsonProperty("jwtID") - public Optional getJwtId() { - return jwtId; - } - - /** - * @return Embedded User Context. - */ - @JsonProperty("bearerTokenContextID") - public Optional getBearerTokenContextId() { - return bearerTokenContextId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventContext && equalTo((AuditEventContext) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventContext other) { - return changeId.equals(other.changeId) - && requestId.equals(other.requestId) - && traceId.equals(other.traceId) - && sessionId.equals(other.sessionId) - && actor.equals(other.actor) - && actorType.equals(other.actorType) - && accessType.equals(other.accessType) - && ipAddress.equals(other.ipAddress) - && origin.equals(other.origin) - && authMode.equals(other.authMode) - && jwtId.equals(other.jwtId) - && bearerTokenContextId.equals(other.bearerTokenContextId); - } - - @Override - public int hashCode() { - return Objects.hash( - this.changeId, - this.requestId, - this.traceId, - this.sessionId, - this.actor, - this.actorType, - this.accessType, - this.ipAddress, - this.origin, - this.authMode, - this.jwtId, - this.bearerTokenContextId); - } - - @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 changeId = Optional.empty(); - - private Optional requestId = Optional.empty(); - - private Optional traceId = Optional.empty(); - - private Optional sessionId = Optional.empty(); - - private Optional actor = Optional.empty(); - - private Optional actorType = Optional.empty(); - - private Optional accessType = Optional.empty(); - - private Optional ipAddress = Optional.empty(); - - private Optional origin = Optional.empty(); - - private Optional authMode = Optional.empty(); - - private Optional jwtId = Optional.empty(); - - private Optional bearerTokenContextId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventContext other) { - changeId(other.getChangeId()); - requestId(other.getRequestId()); - traceId(other.getTraceId()); - sessionId(other.getSessionId()); - actor(other.getActor()); - actorType(other.getActorType()); - accessType(other.getAccessType()); - ipAddress(other.getIpAddress()); - origin(other.getOrigin()); - authMode(other.getAuthMode()); - jwtId(other.getJwtId()); - bearerTokenContextId(other.getBearerTokenContextId()); - return this; - } - - /** - *

                                  ID for the audit event.

                                  - */ - @JsonSetter(value = "changeID", nulls = Nulls.SKIP) - public Builder changeId(Optional changeId) { - this.changeId = changeId; - return this; - } - - public Builder changeId(String changeId) { - this.changeId = Optional.ofNullable(changeId); - return this; - } - - /** - *

                                  ID for the request that caused the event.

                                  - */ - @JsonSetter(value = "requestID", nulls = Nulls.SKIP) - public Builder requestId(Optional requestId) { - this.requestId = requestId; - return this; - } - - public Builder requestId(String requestId) { - this.requestId = Optional.ofNullable(requestId); - return this; - } - - /** - *

                                  ID for the request set by the service that received the request.

                                  - */ - @JsonSetter(value = "traceID", nulls = Nulls.SKIP) - public Builder traceId(Optional traceId) { - this.traceId = traceId; - return this; - } - - public Builder traceId(String traceId) { - this.traceId = Optional.ofNullable(traceId); - return this; - } - - /** - *

                                  ID for the session in which the request was sent.

                                  - */ - @JsonSetter(value = "sessionID", nulls = Nulls.SKIP) - public Builder sessionId(Optional sessionId) { - this.sessionId = sessionId; - return this; - } - - public Builder sessionId(String sessionId) { - this.sessionId = Optional.ofNullable(sessionId); - return this; - } - - /** - *

                                  Member who sent the request. Depending on actorType, this may be a user ID or a service account ID.

                                  - */ - @JsonSetter(value = "actor", nulls = Nulls.SKIP) - public Builder actor(Optional actor) { - this.actor = actor; - return this; - } - - public Builder actor(String actor) { - this.actor = Optional.ofNullable(actor); - return this; - } - - @JsonSetter(value = "actorType", nulls = Nulls.SKIP) - public Builder actorType(Optional actorType) { - this.actorType = actorType; - return this; - } - - public Builder actorType(V1MemberType actorType) { - this.actorType = Optional.ofNullable(actorType); - return this; - } - - @JsonSetter(value = "accessType", nulls = Nulls.SKIP) - public Builder accessType(Optional accessType) { - this.accessType = accessType; - return this; - } - - public Builder accessType(ContextAccessType accessType) { - this.accessType = Optional.ofNullable(accessType); - return this; - } - - /** - *

                                  IP Address of the client that made the request.

                                  - */ - @JsonSetter(value = "ipAddress", nulls = Nulls.SKIP) - public Builder ipAddress(Optional ipAddress) { - this.ipAddress = ipAddress; - return this; - } - - public Builder ipAddress(String ipAddress) { - this.ipAddress = Optional.ofNullable(ipAddress); - return this; - } - - /** - *

                                  HTTP Origin request header (including scheme, hostname, and port) of the request.

                                  - */ - @JsonSetter(value = "origin", nulls = Nulls.SKIP) - public Builder origin(Optional origin) { - this.origin = origin; - return this; - } - - public Builder origin(String origin) { - this.origin = Optional.ofNullable(origin); - return this; - } - - @JsonSetter(value = "authMode", nulls = Nulls.SKIP) - public Builder authMode(Optional authMode) { - this.authMode = authMode; - return this; - } - - public Builder authMode(ContextAuthMode authMode) { - this.authMode = Optional.ofNullable(authMode); - return this; - } - - /** - *

                                  ID of the JWT token.

                                  - */ - @JsonSetter(value = "jwtID", nulls = Nulls.SKIP) - public Builder jwtId(Optional jwtId) { - this.jwtId = jwtId; - return this; - } - - public Builder jwtId(String jwtId) { - this.jwtId = Optional.ofNullable(jwtId); - return this; - } - - /** - *

                                  Embedded User Context.

                                  - */ - @JsonSetter(value = "bearerTokenContextID", nulls = Nulls.SKIP) - public Builder bearerTokenContextId(Optional bearerTokenContextId) { - this.bearerTokenContextId = bearerTokenContextId; - return this; - } - - public Builder bearerTokenContextId(String bearerTokenContextId) { - this.bearerTokenContextId = Optional.ofNullable(bearerTokenContextId); - return this; - } - - public AuditEventContext build() { - return new AuditEventContext( - changeId, - requestId, - traceId, - sessionId, - actor, - actorType, - accessType, - ipAddress, - origin, - authMode, - jwtId, - bearerTokenContextId, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java deleted file mode 100644 index bab4b42a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventData.Builder.class) -public final class AuditEventData { - private final Optional content; - - private final Map additionalProperties; - - private AuditEventData(Optional content, Map additionalProperties) { - this.content = content; - this.additionalProperties = additionalProperties; - } - - /** - * @return The entire body of the data requested or the query fired. - */ - @JsonProperty("content") - public Optional getContent() { - return content; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventData && equalTo((AuditEventData) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventData other) { - return content.equals(other.content); - } - - @Override - public int hashCode() { - return Objects.hash(this.content); - } - - @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 content = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventData other) { - content(other.getContent()); - return this; - } - - /** - *

                                  The entire body of the data requested or the query fired.

                                  - */ - @JsonSetter(value = "content", nulls = Nulls.SKIP) - public Builder content(Optional content) { - this.content = content; - return this; - } - - public Builder content(String content) { - this.content = Optional.ofNullable(content); - return this; - } - - public AuditEventData build() { - return new AuditEventData(content, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java deleted file mode 100644 index 9d3bbaed..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = AuditEventHttpInfo.Builder.class) -public final class AuditEventHttpInfo { - private final Optional uri; - - private final Optional method; - - private final Map additionalProperties; - - private AuditEventHttpInfo( - Optional uri, Optional method, Map additionalProperties) { - this.uri = uri; - this.method = method; - this.additionalProperties = additionalProperties; - } - - /** - * @return The http URI that is used. - */ - @JsonProperty("URI") - public Optional getUri() { - return uri; - } - - /** - * @return http method used. - */ - @JsonProperty("method") - public Optional getMethod() { - return method; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof AuditEventHttpInfo && equalTo((AuditEventHttpInfo) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(AuditEventHttpInfo other) { - return uri.equals(other.uri) && method.equals(other.method); - } - - @Override - public int hashCode() { - return Objects.hash(this.uri, this.method); - } - - @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 uri = Optional.empty(); - - private Optional method = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(AuditEventHttpInfo other) { - uri(other.getUri()); - method(other.getMethod()); - return this; - } - - /** - *

                                  The http URI that is used.

                                  - */ - @JsonSetter(value = "URI", nulls = Nulls.SKIP) - public Builder uri(Optional uri) { - this.uri = uri; - return this; - } - - public Builder uri(String uri) { - this.uri = Optional.ofNullable(uri); - return this; - } - - /** - *

                                  http method used.

                                  - */ - @JsonSetter(value = "method", nulls = Nulls.SKIP) - public Builder method(Optional method) { - this.method = method; - return this; - } - - public Builder method(String method) { - this.method = Optional.ofNullable(method); - return this; - } - - public AuditEventHttpInfo build() { - return new AuditEventHttpInfo(uri, method, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java index 8f5fb775..4b33661a 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchOperationResponse.java @@ -3,22 +3,31 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BatchOperationResponse.Builder.class) -public final class V1BatchOperationResponse { +@JsonDeserialize(builder = BatchOperationResponse.Builder.class) +public final class BatchOperationResponse { private final Optional vaultId; private final Optional>> responses; private final Map additionalProperties; - private V1BatchOperationResponse( + private BatchOperationResponse( Optional vaultId, Optional>> responses, Map additionalProperties) { @@ -36,17 +45,17 @@ public Optional getVaultId() { } /** - * @return Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs: <br/><ul><li>POST returns an Insert Records response.</li><li>PUT returns an Update Record response.</li><li>GET returns a Get Record response.</li><li>DELETE returns a Delete Record response.</li></ul> + * @return Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs:
                                  • POST returns an Insert Records response.
                                  • PUT returns an Update Record response.
                                  • GET returns a Get Record response.
                                  • DELETE returns a Delete Record response.
                                  */ @JsonProperty("responses") public Optional>> getResponses() { return responses; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1BatchOperationResponse && equalTo((V1BatchOperationResponse) other); + return other instanceof BatchOperationResponse && equalTo((BatchOperationResponse) other); } @JsonAnyGetter @@ -54,16 +63,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1BatchOperationResponse other) { + private boolean equalTo(BatchOperationResponse other) { return vaultId.equals(other.vaultId) && responses.equals(other.responses); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.vaultId, this.responses); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -83,7 +92,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1BatchOperationResponse other) { + public Builder from(BatchOperationResponse other) { vaultId(other.getVaultId()); responses(other.getResponses()); return this; @@ -104,7 +113,7 @@ public Builder vaultId(String vaultId) { } /** - *

                                  Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs: <br/><ul><li>POST returns an Insert Records response.</li><li>PUT returns an Update Record response.</li><li>GET returns a Get Record response.</li><li>DELETE returns a Delete Record response.</li></ul>

                                  + *

                                  Responses in the same order as in the request. Responses have the same payload structure as their corresponding APIs:

                                  • POST returns an Insert Records response.
                                  • PUT returns an Update Record response.
                                  • GET returns a Get Record response.
                                  • DELETE returns a Delete Record response.

                                  */ @JsonSetter(value = "responses", nulls = Nulls.SKIP) public Builder responses(Optional>> responses) { @@ -117,8 +126,18 @@ public Builder responses(List> responses) { return this; } - public V1BatchOperationResponse build() { - return new V1BatchOperationResponse(vaultId, responses, additionalProperties); + public BatchOperationResponse build() { + return new BatchOperationResponse(vaultId, responses, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java new file mode 100644 index 00000000..af90505e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecord.java @@ -0,0 +1,594 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BatchRecord.Builder.class) +public final class BatchRecord { + private final Map fields; + + private final String tableName; + + private final BatchRecordMethod method; + + private final Optional batchId; + + private final Optional redaction; + + private final Optional tokenization; + + private final Optional id; + + private final Optional downloadUrl; + + private final Optional upsert; + + private final Optional> tokens; + + private final Optional returnFileMetadata; + + private final Map additionalProperties; + + private BatchRecord( + Map fields, + String tableName, + BatchRecordMethod method, + Optional batchId, + Optional redaction, + Optional tokenization, + Optional id, + Optional downloadUrl, + Optional upsert, + Optional> tokens, + Optional returnFileMetadata, + Map additionalProperties) { + this.fields = fields; + this.tableName = tableName; + this.method = method; + this.batchId = batchId; + this.redaction = redaction; + this.tokenization = tokenization; + this.id = id; + this.downloadUrl = downloadUrl; + this.upsert = upsert; + this.tokens = tokens; + this.returnFileMetadata = returnFileMetadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT. + */ + @JsonProperty("fields") + public Map getFields() { + return fields; + } + + /** + * @return Name of the table to perform the operation on. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Method of the operation. + */ + @JsonProperty("method") + public BatchRecordMethod getMethod() { + return method; + } + + /** + * @return ID to group operations by. Operations in the same group are executed sequentially. + */ + @JsonProperty("batchID") + public Optional getBatchId() { + return batchId; + } + + /** + * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + /** + * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. + */ + @JsonProperty("tokenization") + public Optional getTokenization() { + return tokenization; + } + + /** + * @return skyflow_id for the record. Only valid when method is GET, DELETE, or PUT. + */ + @JsonProperty("ID") + public Optional getId() { + return id; + } + + /** + * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. + */ + @JsonProperty("downloadURL") + public Optional getDownloadUrl() { + return downloadUrl; + } + + /** + * @return Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST. + */ + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + /** + * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return If true, returns metadata for files. + */ + @JsonProperty("returnFileMetadata") + public Optional getReturnFileMetadata() { + return returnFileMetadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BatchRecord && equalTo((BatchRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BatchRecord other) { + return fields.equals(other.fields) + && tableName.equals(other.tableName) + && method.equals(other.method) + && batchId.equals(other.batchId) + && redaction.equals(other.redaction) + && tokenization.equals(other.tokenization) + && id.equals(other.id) + && downloadUrl.equals(other.downloadUrl) + && upsert.equals(other.upsert) + && tokens.equals(other.tokens) + && returnFileMetadata.equals(other.returnFileMetadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.fields, + this.tableName, + this.method, + this.batchId, + this.redaction, + this.tokenization, + this.id, + this.downloadUrl, + this.upsert, + this.tokens, + this.returnFileMetadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table to perform the operation on.

                                  + */ + MethodStage tableName(@NotNull String tableName); + + Builder from(BatchRecord other); + } + + public interface MethodStage { + /** + *

                                  Method of the operation.

                                  + */ + _FinalStage method(@NotNull BatchRecordMethod method); + } + + public interface _FinalStage { + BatchRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + */ + _FinalStage fields(Map fields); + + _FinalStage putAllFields(Map fields); + + _FinalStage fields(String key, Object value); + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + */ + _FinalStage batchId(Optional batchId); + + _FinalStage batchId(String batchId); + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + _FinalStage redaction(Optional redaction); + + _FinalStage redaction(BatchRecordRedaction redaction); + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + */ + _FinalStage tokenization(Optional tokenization); + + _FinalStage tokenization(Boolean tokenization); + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + */ + _FinalStage id(Optional id); + + _FinalStage id(String id); + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + */ + _FinalStage downloadUrl(Optional downloadUrl); + + _FinalStage downloadUrl(Boolean downloadUrl); + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + */ + _FinalStage upsert(Optional upsert); + + _FinalStage upsert(String upsert); + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + _FinalStage tokens(Optional> tokens); + + _FinalStage tokens(Map tokens); + + /** + *

                                  If true, returns metadata for files.

                                  + */ + _FinalStage returnFileMetadata(Optional returnFileMetadata); + + _FinalStage returnFileMetadata(Boolean returnFileMetadata); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, MethodStage, _FinalStage { + private String tableName; + + private BatchRecordMethod method; + + private Optional returnFileMetadata = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional upsert = Optional.empty(); + + private Optional downloadUrl = Optional.empty(); + + private Optional id = Optional.empty(); + + private Optional tokenization = Optional.empty(); + + private Optional redaction = Optional.empty(); + + private Optional batchId = Optional.empty(); + + private Map fields = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(BatchRecord other) { + fields(other.getFields()); + tableName(other.getTableName()); + method(other.getMethod()); + batchId(other.getBatchId()); + redaction(other.getRedaction()); + tokenization(other.getTokenization()); + id(other.getId()); + downloadUrl(other.getDownloadUrl()); + upsert(other.getUpsert()); + tokens(other.getTokens()); + returnFileMetadata(other.getReturnFileMetadata()); + return this; + } + + /** + *

                                  Name of the table to perform the operation on.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public MethodStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  Method of the operation.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("method") + public _FinalStage method(@NotNull BatchRecordMethod method) { + this.method = Objects.requireNonNull(method, "method must not be null"); + return this; + } + + /** + *

                                  If true, returns metadata for files.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage returnFileMetadata(Boolean returnFileMetadata) { + this.returnFileMetadata = Optional.ofNullable(returnFileMetadata); + return this; + } + + /** + *

                                  If true, returns metadata for files.

                                  + */ + @java.lang.Override + @JsonSetter(value = "returnFileMetadata", nulls = Nulls.SKIP) + public _FinalStage returnFileMetadata(Optional returnFileMetadata) { + this.returnFileMetadata = returnFileMetadata; + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage upsert(String upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + /** + *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  + */ + @java.lang.Override + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public _FinalStage upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage downloadUrl(Boolean downloadUrl) { + this.downloadUrl = Optional.ofNullable(downloadUrl); + return this; + } + + /** + *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  + */ + @java.lang.Override + @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) + public _FinalStage downloadUrl(Optional downloadUrl) { + this.downloadUrl = downloadUrl; + return this; + } + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage id(String id) { + this.id = Optional.ofNullable(id); + return this; + } + + /** + *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  + */ + @java.lang.Override + @JsonSetter(value = "ID", nulls = Nulls.SKIP) + public _FinalStage id(Optional id) { + this.id = id; + return this; + } + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenization(Boolean tokenization) { + this.tokenization = Optional.ofNullable(tokenization); + return this; + } + + /** + *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) + public _FinalStage tokenization(Optional tokenization) { + this.tokenization = tokenization; + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redaction(BatchRecordRedaction redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + @java.lang.Override + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public _FinalStage redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage batchId(String batchId) { + this.batchId = Optional.ofNullable(batchId); + return this; + } + + /** + *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  + */ + @java.lang.Override + @JsonSetter(value = "batchID", nulls = Nulls.SKIP) + public _FinalStage batchId(Optional batchId) { + this.batchId = batchId; + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage fields(String key, Object value) { + this.fields.put(key, value); + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage putAllFields(Map fields) { + if (fields != null) { + this.fields.putAll(fields); + } + return this; + } + + /** + *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  + */ + @java.lang.Override + @JsonSetter(value = "fields", nulls = Nulls.SKIP) + public _FinalStage fields(Map fields) { + this.fields.clear(); + if (fields != null) { + this.fields.putAll(fields); + } + return this; + } + + @java.lang.Override + public BatchRecord build() { + return new BatchRecord( + fields, + tableName, + method, + batchId, + redaction, + tokenization, + id, + downloadUrl, + upsert, + tokens, + returnFileMetadata, + 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/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java index a6f5e673..85fc6185 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java @@ -3,28 +3,101 @@ */ package com.skyflow.generated.rest.types; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -public enum BatchRecordMethod { - NONE("NONE"), +public final class BatchRecordMethod { + public static final BatchRecordMethod GET = new BatchRecordMethod(Value.GET, "GET"); - POST("POST"), + public static final BatchRecordMethod PUT = new BatchRecordMethod(Value.PUT, "PUT"); - PUT("PUT"), + public static final BatchRecordMethod DELETE = new BatchRecordMethod(Value.DELETE, "DELETE"); - GET("GET"), + public static final BatchRecordMethod POST = new BatchRecordMethod(Value.POST, "POST"); - DELETE("DELETE"); + private final Value value; - private final String value; + private final String string; - BatchRecordMethod(String value) { + BatchRecordMethod(Value value, String string) { this.value = value; + this.string = string; } + public Value getEnumValue() { + return value; + } + + @java.lang.Override @JsonValue - @Override public String toString() { - return this.value; + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof BatchRecordMethod && this.string.equals(((BatchRecordMethod) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case GET: + return visitor.visitGet(); + case PUT: + return visitor.visitPut(); + case DELETE: + return visitor.visitDelete(); + case POST: + return visitor.visitPost(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static BatchRecordMethod valueOf(String value) { + switch (value) { + case "GET": + return GET; + case "PUT": + return PUT; + case "DELETE": + return DELETE; + case "POST": + return POST; + default: + return new BatchRecordMethod(Value.UNKNOWN, value); + } + } + + public enum Value { + POST, + + PUT, + + GET, + + DELETE, + + UNKNOWN + } + + public interface Visitor { + T visitPost(); + + T visitPut(); + + T visitGet(); + + T visitDelete(); + + T visitUnknown(String unknownType); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java new file mode 100644 index 00000000..07361521 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BatchRecordRedaction.java @@ -0,0 +1,103 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class BatchRecordRedaction { + public static final BatchRecordRedaction DEFAULT = new BatchRecordRedaction(Value.DEFAULT, "DEFAULT"); + + public static final BatchRecordRedaction PLAIN_TEXT = new BatchRecordRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final BatchRecordRedaction MASKED = new BatchRecordRedaction(Value.MASKED, "MASKED"); + + public static final BatchRecordRedaction REDACTED = new BatchRecordRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + BatchRecordRedaction(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 BatchRecordRedaction && this.string.equals(((BatchRecordRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static BatchRecordRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new BatchRecordRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java similarity index 61% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java index b7151598..b698f904 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkDeleteRecordResponse.java @@ -3,20 +3,29 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BulkDeleteRecordResponse.Builder.class) -public final class V1BulkDeleteRecordResponse { +@JsonDeserialize(builder = BulkDeleteRecordResponse.Builder.class) +public final class BulkDeleteRecordResponse { private final Optional> recordIdResponse; private final Map additionalProperties; - private V1BulkDeleteRecordResponse( + private BulkDeleteRecordResponse( Optional> recordIdResponse, Map additionalProperties) { this.recordIdResponse = recordIdResponse; this.additionalProperties = additionalProperties; @@ -30,10 +39,10 @@ public Optional> getRecordIdResponse() { return recordIdResponse; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1BulkDeleteRecordResponse && equalTo((V1BulkDeleteRecordResponse) other); + return other instanceof BulkDeleteRecordResponse && equalTo((BulkDeleteRecordResponse) other); } @JsonAnyGetter @@ -41,16 +50,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1BulkDeleteRecordResponse other) { + private boolean equalTo(BulkDeleteRecordResponse other) { return recordIdResponse.equals(other.recordIdResponse); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.recordIdResponse); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -68,7 +77,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1BulkDeleteRecordResponse other) { + public Builder from(BulkDeleteRecordResponse other) { recordIdResponse(other.getRecordIdResponse()); return this; } @@ -87,8 +96,18 @@ public Builder recordIdResponse(List recordIdResponse) { return this; } - public V1BulkDeleteRecordResponse build() { - return new V1BulkDeleteRecordResponse(recordIdResponse, additionalProperties); + public BulkDeleteRecordResponse build() { + return new BulkDeleteRecordResponse(recordIdResponse, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java new file mode 100644 index 00000000..c753c19b --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/BulkGetRecordResponse.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = BulkGetRecordResponse.Builder.class) +public final class BulkGetRecordResponse { + private final Optional> records; + + private final Map additionalProperties; + + private BulkGetRecordResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return The specified records. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof BulkGetRecordResponse && equalTo((BulkGetRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(BulkGetRecordResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(BulkGetRecordResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  The specified records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public BulkGetRecordResponse build() { + return new BulkGetRecordResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java new file mode 100644 index 00000000..d445af16 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ColumnRedactions.java @@ -0,0 +1,160 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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 com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ColumnRedactions.Builder.class) +public final class ColumnRedactions { + private final String columnName; + + private final String redaction; + + private final Map additionalProperties; + + private ColumnRedactions(String columnName, String redaction, Map additionalProperties) { + this.columnName = columnName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the column to redact. + */ + @JsonProperty("columnName") + public String getColumnName() { + return columnName; + } + + /** + * @return Name of the redaction type. + */ + @JsonProperty("redaction") + public String getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ColumnRedactions && equalTo((ColumnRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ColumnRedactions other) { + return columnName.equals(other.columnName) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.columnName, this.redaction); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ColumnNameStage builder() { + return new Builder(); + } + + public interface ColumnNameStage { + /** + *

                                  Name of the column to redact.

                                  + */ + RedactionStage columnName(@NotNull String columnName); + + Builder from(ColumnRedactions other); + } + + public interface RedactionStage { + /** + *

                                  Name of the redaction type.

                                  + */ + _FinalStage redaction(@NotNull String redaction); + } + + public interface _FinalStage { + ColumnRedactions build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ColumnNameStage, RedactionStage, _FinalStage { + private String columnName; + + private String redaction; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(ColumnRedactions other) { + columnName(other.getColumnName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Name of the column to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("columnName") + public RedactionStage columnName(@NotNull String columnName) { + this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); + return this; + } + + /** + *

                                  Name of the redaction type.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("redaction") + public _FinalStage redaction(@NotNull String redaction) { + this.redaction = Objects.requireNonNull(redaction, "redaction must not be null"); + return this; + } + + @java.lang.Override + public ColumnRedactions build() { + return new ColumnRedactions(columnName, redaction, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java deleted file mode 100644 index 163e862e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ContextAccessType { - ACCESS_NONE("ACCESS_NONE"), - - API("API"), - - SQL("SQL"); - - private final String value; - - ContextAccessType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java deleted file mode 100644 index 204ad039..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ContextAuthMode { - AUTH_NONE("AUTH_NONE"), - - OKTA_JWT("OKTA_JWT"), - - SERVICE_ACCOUNT_JWT("SERVICE_ACCOUNT_JWT"), - - PAT_JWT("PAT_JWT"); - - private final String value; - - ContextAuthMode(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java deleted file mode 100644 index dc244be8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifiedFileOutput.Builder.class) -public final class DeidentifiedFileOutput { - private final Optional processedFile; - - private final Optional processedFileType; - - private final Optional processedFileExtension; - - private final Map additionalProperties; - - private DeidentifiedFileOutput( - Optional processedFile, - Optional processedFileType, - Optional processedFileExtension, - Map additionalProperties) { - this.processedFile = processedFile; - this.processedFileType = processedFileType; - this.processedFileExtension = processedFileExtension; - this.additionalProperties = additionalProperties; - } - - /** - * @return File content in Base64 format. - */ - @JsonProperty("processedFile") - public Optional getProcessedFile() { - return processedFile; - } - - /** - * @return Type of the processed file. - */ - @JsonProperty("processedFileType") - public Optional getProcessedFileType() { - return processedFileType; - } - - /** - * @return Extension of the processed file. - */ - @JsonProperty("processedFileExtension") - public Optional getProcessedFileExtension() { - return processedFileExtension; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifiedFileOutput && equalTo((DeidentifiedFileOutput) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifiedFileOutput other) { - return processedFile.equals(other.processedFile) - && processedFileType.equals(other.processedFileType) - && processedFileExtension.equals(other.processedFileExtension); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedFile, this.processedFileType, this.processedFileExtension); - } - - @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 processedFile = Optional.empty(); - - private Optional processedFileType = Optional.empty(); - - private Optional processedFileExtension = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifiedFileOutput other) { - processedFile(other.getProcessedFile()); - processedFileType(other.getProcessedFileType()); - processedFileExtension(other.getProcessedFileExtension()); - return this; - } - - /** - *

                                  File content in Base64 format.

                                  - */ - @JsonSetter(value = "processedFile", nulls = Nulls.SKIP) - public Builder processedFile(Optional processedFile) { - this.processedFile = processedFile; - return this; - } - - public Builder processedFile(String processedFile) { - this.processedFile = Optional.ofNullable(processedFile); - return this; - } - - /** - *

                                  Type of the processed file.

                                  - */ - @JsonSetter(value = "processedFileType", nulls = Nulls.SKIP) - public Builder processedFileType(Optional processedFileType) { - this.processedFileType = processedFileType; - return this; - } - - public Builder processedFileType(DeidentifiedFileOutputProcessedFileType processedFileType) { - this.processedFileType = Optional.ofNullable(processedFileType); - return this; - } - - /** - *

                                  Extension of the processed file.

                                  - */ - @JsonSetter(value = "processedFileExtension", nulls = Nulls.SKIP) - public Builder processedFileExtension( - Optional processedFileExtension) { - this.processedFileExtension = processedFileExtension; - return this; - } - - public Builder processedFileExtension(DeidentifiedFileOutputProcessedFileExtension processedFileExtension) { - this.processedFileExtension = Optional.ofNullable(processedFileExtension); - return this; - } - - public DeidentifiedFileOutput build() { - return new DeidentifiedFileOutput( - processedFile, processedFileType, processedFileExtension, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java deleted file mode 100644 index febaeca3..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifiedFileOutputProcessedFileExtension { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"); - - private final String value; - - DeidentifiedFileOutputProcessedFileExtension(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java deleted file mode 100644 index e020b28f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DeidentifiedFileOutputProcessedFileType { - REDACTED_AUDIO("redacted_audio"), - - REDACTED_IMAGE("redacted_image"), - - REDACTED_TRANSCRIPTION("redacted_transcription"), - - REDACTED_FILE("redacted_file"), - - REDACTED_TEXT("redacted_text"), - - ENTITIES("entities"), - - REDACTED_TRANSCRIPTION_DIARIZE_JSON("redacted_transcription_diarize_json"); - - private final String value; - - DeidentifiedFileOutputProcessedFileType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java deleted file mode 100644 index d5a2ebd5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyFileResponse.Builder.class) -public final class DeidentifyFileResponse { - private final Optional runId; - - private final Map additionalProperties; - - private DeidentifyFileResponse(Optional runId, Map additionalProperties) { - this.runId = runId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status URL for the Detect run. - */ - @JsonProperty("run_id") - public Optional getRunId() { - return runId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyFileResponse && equalTo((DeidentifyFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyFileResponse other) { - return runId.equals(other.runId); - } - - @Override - public int hashCode() { - return Objects.hash(this.runId); - } - - @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 runId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifyFileResponse other) { - runId(other.getRunId()); - return this; - } - - /** - *

                                  Status URL for the Detect run.

                                  - */ - @JsonSetter(value = "run_id", nulls = Nulls.SKIP) - public Builder runId(Optional runId) { - this.runId = runId; - return this; - } - - public Builder runId(String runId) { - this.runId = Optional.ofNullable(runId); - return this; - } - - public DeidentifyFileResponse build() { - return new DeidentifyFileResponse(runId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java deleted file mode 100644 index 1389fa0f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java +++ /dev/null @@ -1,186 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DeidentifyStringResponse.Builder.class) -public final class DeidentifyStringResponse { - private final Optional processedText; - - private final Optional> entities; - - private final Optional wordCount; - - private final Optional characterCount; - - private final Map additionalProperties; - - private DeidentifyStringResponse( - Optional processedText, - Optional> entities, - Optional wordCount, - Optional characterCount, - Map additionalProperties) { - this.processedText = processedText; - this.entities = entities; - this.wordCount = wordCount; - this.characterCount = characterCount; - this.additionalProperties = additionalProperties; - } - - /** - * @return De-identified text. - */ - @JsonProperty("processed_text") - public Optional getProcessedText() { - return processedText; - } - - /** - * @return Detected entities. - */ - @JsonProperty("entities") - public Optional> getEntities() { - return entities; - } - - /** - * @return Number of words from the input text. - */ - @JsonProperty("word_count") - public Optional getWordCount() { - return wordCount; - } - - /** - * @return Number of characters from the input text. - */ - @JsonProperty("character_count") - public Optional getCharacterCount() { - return characterCount; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DeidentifyStringResponse && equalTo((DeidentifyStringResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DeidentifyStringResponse other) { - return processedText.equals(other.processedText) - && entities.equals(other.entities) - && wordCount.equals(other.wordCount) - && characterCount.equals(other.characterCount); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedText, this.entities, this.wordCount, this.characterCount); - } - - @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 processedText = Optional.empty(); - - private Optional> entities = Optional.empty(); - - private Optional wordCount = Optional.empty(); - - private Optional characterCount = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DeidentifyStringResponse other) { - processedText(other.getProcessedText()); - entities(other.getEntities()); - wordCount(other.getWordCount()); - characterCount(other.getCharacterCount()); - return this; - } - - /** - *

                                  De-identified text.

                                  - */ - @JsonSetter(value = "processed_text", nulls = Nulls.SKIP) - public Builder processedText(Optional processedText) { - this.processedText = processedText; - return this; - } - - public Builder processedText(String processedText) { - this.processedText = Optional.ofNullable(processedText); - return this; - } - - /** - *

                                  Detected entities.

                                  - */ - @JsonSetter(value = "entities", nulls = Nulls.SKIP) - public Builder entities(Optional> entities) { - this.entities = entities; - return this; - } - - public Builder entities(List entities) { - this.entities = Optional.ofNullable(entities); - return this; - } - - /** - *

                                  Number of words from the input text.

                                  - */ - @JsonSetter(value = "word_count", nulls = Nulls.SKIP) - public Builder wordCount(Optional wordCount) { - this.wordCount = wordCount; - return this; - } - - public Builder wordCount(Integer wordCount) { - this.wordCount = Optional.ofNullable(wordCount); - return this; - } - - /** - *

                                  Number of characters from the input text.

                                  - */ - @JsonSetter(value = "character_count", nulls = Nulls.SKIP) - public Builder characterCount(Optional characterCount) { - this.characterCount = characterCount; - return this; - } - - public Builder characterCount(Integer characterCount) { - this.characterCount = Optional.ofNullable(characterCount); - return this; - } - - public DeidentifyStringResponse build() { - return new DeidentifyStringResponse( - processedText, entities, wordCount, characterCount, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java index 5351d897..7b7c731b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteRecordResponse.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DeleteRecordResponse.Builder.class) -public final class V1DeleteRecordResponse { +@JsonDeserialize(builder = DeleteRecordResponse.Builder.class) +public final class DeleteRecordResponse { private final Optional skyflowId; private final Optional deleted; private final Map additionalProperties; - private V1DeleteRecordResponse( + private DeleteRecordResponse( Optional skyflowId, Optional deleted, Map additionalProperties) { this.skyflowId = skyflowId; this.deleted = deleted; @@ -44,10 +49,10 @@ public Optional getDeleted() { return deleted; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DeleteRecordResponse && equalTo((V1DeleteRecordResponse) other); + return other instanceof DeleteRecordResponse && equalTo((DeleteRecordResponse) other); } @JsonAnyGetter @@ -55,16 +60,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DeleteRecordResponse other) { + private boolean equalTo(DeleteRecordResponse other) { return skyflowId.equals(other.skyflowId) && deleted.equals(other.deleted); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.deleted); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -84,7 +89,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DeleteRecordResponse other) { + public Builder from(DeleteRecordResponse other) { skyflowId(other.getSkyflowId()); deleted(other.getDeleted()); return this; @@ -118,8 +123,18 @@ public Builder deleted(Boolean deleted) { return this; } - public V1DeleteRecordResponse build() { - return new V1DeleteRecordResponse(skyflowId, deleted, additionalProperties); + public DeleteRecordResponse build() { + return new DeleteRecordResponse(skyflowId, deleted, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java new file mode 100644 index 00000000..8b2845c5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteResponse.Builder.class) +public final class DeleteResponse { + private final List records; + + private final Map additionalProperties; + + private DeleteResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of deleted records with skyflow ID and any partial errors. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteResponse && equalTo((DeleteResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of deleted records with skyflow ID and any partial errors.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(DeleteResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public DeleteResponse build() { + return new DeleteResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java new file mode 100644 index 00000000..2b743afa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteResponseObject.java @@ -0,0 +1,204 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteResponseObject.Builder.class) +public final class DeleteResponseObject { + private final String skyflowId; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private DeleteResponseObject( + String skyflowId, Optional error, int httpCode, Map additionalProperties) { + this.skyflowId = skyflowId; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the deleted record. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteResponseObject && equalTo((DeleteResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteResponseObject other) { + return skyflowId.equals(other.skyflowId) && error.equals(other.error) && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the deleted record.

                                  + */ + HttpCodeStage skyflowId(@NotNull String skyflowId); + + Builder from(DeleteResponseObject other); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + DeleteResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, HttpCodeStage, _FinalStage { + private String skyflowId; + + private int httpCode; + + private Optional error = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DeleteResponseObject other) { + skyflowId(other.getSkyflowId()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Skyflow ID of the deleted record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public HttpCodeStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + @java.lang.Override + public DeleteResponseObject build() { + return new DeleteResponseObject(skyflowId, error, httpCode, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java new file mode 100644 index 00000000..d651c5d9 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenResponse.Builder.class) +public final class DeleteTokenResponse { + private final List tokens; + + private final Map additionalProperties; + + private DeleteTokenResponse(List tokens, Map additionalProperties) { + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokens data for Delete + */ + @JsonProperty("tokens") + public List getTokens() { + return tokens; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenResponse && equalTo((DeleteTokenResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenResponse other) { + return tokens.equals(other.tokens); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokens); + } + + @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 List tokens = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteTokenResponse other) { + tokens(other.getTokens()); + return this; + } + + /** + *

                                  Tokens data for Delete

                                  + */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(List tokens) { + this.tokens.clear(); + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + public Builder addTokens(DeleteTokenResponseObject tokens) { + this.tokens.add(tokens); + return this; + } + + public Builder addAllTokens(List tokens) { + if (tokens != null) { + this.tokens.addAll(tokens); + } + return this; + } + + public DeleteTokenResponse build() { + return new DeleteTokenResponse(tokens, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java new file mode 100644 index 00000000..cd3c1698 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DeleteTokenResponseObject.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DeleteTokenResponseObject.Builder.class) +public final class DeleteTokenResponseObject { + private final Optional value; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private DeleteTokenResponseObject( + Optional value, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.value = value; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token to be deleted. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DeleteTokenResponseObject && equalTo((DeleteTokenResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DeleteTokenResponseObject other) { + return value.equals(other.value) && error.equals(other.error) && httpCode.equals(other.httpCode); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.error, this.httpCode); + } + + @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 value = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DeleteTokenResponseObject other) { + value(other.getValue()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Token to be deleted.

                                  + */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + public DeleteTokenResponseObject build() { + return new DeleteTokenResponseObject(value, error, httpCode, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java deleted file mode 100644 index 9cb2d319..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java +++ /dev/null @@ -1,231 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectGuardrailsResponse.Builder.class) -public final class DetectGuardrailsResponse { - private final String text; - - private final Optional toxic; - - private final Optional deniedTopic; - - private final DetectGuardrailsResponseValidation validation; - - private final Map additionalProperties; - - private DetectGuardrailsResponse( - String text, - Optional toxic, - Optional deniedTopic, - DetectGuardrailsResponseValidation validation, - Map additionalProperties) { - this.text = text; - this.toxic = toxic; - this.deniedTopic = deniedTopic; - this.validation = validation; - this.additionalProperties = additionalProperties; - } - - /** - * @return Text that was checked against guardrails. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - /** - * @return Whether the text is toxic. - */ - @JsonProperty("toxic") - public Optional getToxic() { - return toxic; - } - - /** - * @return Whether the text included a denied topic. - */ - @JsonProperty("denied_topic") - public Optional getDeniedTopic() { - return deniedTopic; - } - - /** - * @return Whether the text passed validation. - */ - @JsonProperty("validation") - public DetectGuardrailsResponseValidation getValidation() { - return validation; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectGuardrailsResponse && equalTo((DetectGuardrailsResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectGuardrailsResponse other) { - return text.equals(other.text) - && toxic.equals(other.toxic) - && deniedTopic.equals(other.deniedTopic) - && validation.equals(other.validation); - } - - @Override - public int hashCode() { - return Objects.hash(this.text, this.toxic, this.deniedTopic, this.validation); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Text that was checked against guardrails. - */ - ValidationStage text(@NotNull String text); - - Builder from(DetectGuardrailsResponse other); - } - - public interface ValidationStage { - /** - * Whether the text passed validation. - */ - _FinalStage validation(@NotNull DetectGuardrailsResponseValidation validation); - } - - public interface _FinalStage { - DetectGuardrailsResponse build(); - - /** - *

                                  Whether the text is toxic.

                                  - */ - _FinalStage toxic(Optional toxic); - - _FinalStage toxic(Boolean toxic); - - /** - *

                                  Whether the text included a denied topic.

                                  - */ - _FinalStage deniedTopic(Optional deniedTopic); - - _FinalStage deniedTopic(Boolean deniedTopic); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, ValidationStage, _FinalStage { - private String text; - - private DetectGuardrailsResponseValidation validation; - - private Optional deniedTopic = Optional.empty(); - - private Optional toxic = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(DetectGuardrailsResponse other) { - text(other.getText()); - toxic(other.getToxic()); - deniedTopic(other.getDeniedTopic()); - validation(other.getValidation()); - return this; - } - - /** - * Text that was checked against guardrails.

                                  Text that was checked against guardrails.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public ValidationStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - /** - * Whether the text passed validation.

                                  Whether the text passed validation.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("validation") - public _FinalStage validation(@NotNull DetectGuardrailsResponseValidation validation) { - this.validation = Objects.requireNonNull(validation, "validation must not be null"); - return this; - } - - /** - *

                                  Whether the text included a denied topic.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage deniedTopic(Boolean deniedTopic) { - this.deniedTopic = Optional.ofNullable(deniedTopic); - return this; - } - - /** - *

                                  Whether the text included a denied topic.

                                  - */ - @Override - @JsonSetter(value = "denied_topic", nulls = Nulls.SKIP) - public _FinalStage deniedTopic(Optional deniedTopic) { - this.deniedTopic = deniedTopic; - return this; - } - - /** - *

                                  Whether the text is toxic.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - public _FinalStage toxic(Boolean toxic) { - this.toxic = Optional.ofNullable(toxic); - return this; - } - - /** - *

                                  Whether the text is toxic.

                                  - */ - @Override - @JsonSetter(value = "toxic", nulls = Nulls.SKIP) - public _FinalStage toxic(Optional toxic) { - this.toxic = toxic; - return this; - } - - @Override - public DetectGuardrailsResponse build() { - return new DetectGuardrailsResponse(text, toxic, deniedTopic, validation, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java deleted file mode 100644 index e8bf032e..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectGuardrailsResponseValidation { - FAILED("failed"), - - PASSED("passed"); - - private final String value; - - DetectGuardrailsResponseValidation(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java deleted file mode 100644 index b73f7845..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java +++ /dev/null @@ -1,348 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = DetectRunsResponse.Builder.class) -public final class DetectRunsResponse { - private final Optional status; - - private final Optional outputType; - - private final Optional> output; - - private final Optional message; - - private final Optional size; - - private final Optional wordCharacterCount; - - private final Optional duration; - - private final Optional pages; - - private final Optional slides; - - private final Map additionalProperties; - - private DetectRunsResponse( - Optional status, - Optional outputType, - Optional> output, - Optional message, - Optional size, - Optional wordCharacterCount, - Optional duration, - Optional pages, - Optional slides, - Map additionalProperties) { - this.status = status; - this.outputType = outputType; - this.output = output; - this.message = message; - this.size = size; - this.wordCharacterCount = wordCharacterCount; - this.duration = duration; - this.pages = pages; - this.slides = slides; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status of the operation. - */ - @JsonProperty("status") - public Optional getStatus() { - return status; - } - - /** - * @return Format of the output file. - */ - @JsonProperty("outputType") - public Optional getOutputType() { - return outputType; - } - - /** - * @return Details of output files. Files are specified as Base64-encoded data. - */ - @JsonProperty("output") - public Optional> getOutput() { - return output; - } - - /** - * @return Status details about the Detect run. - */ - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - /** - * @return Size of the processed file in kilobytes (KB). - */ - @JsonProperty("size") - public Optional getSize() { - return size; - } - - @JsonProperty("wordCharacterCount") - public Optional getWordCharacterCount() { - return wordCharacterCount; - } - - /** - * @return Duration of the processed audio in seconds. - */ - @JsonProperty("duration") - public Optional getDuration() { - return duration; - } - - /** - * @return Number of pages in the processed PDF. - */ - @JsonProperty("pages") - public Optional getPages() { - return pages; - } - - /** - * @return Number of slides in the processed presentation. - */ - @JsonProperty("slides") - public Optional getSlides() { - return slides; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof DetectRunsResponse && equalTo((DetectRunsResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(DetectRunsResponse other) { - return status.equals(other.status) - && outputType.equals(other.outputType) - && output.equals(other.output) - && message.equals(other.message) - && size.equals(other.size) - && wordCharacterCount.equals(other.wordCharacterCount) - && duration.equals(other.duration) - && pages.equals(other.pages) - && slides.equals(other.slides); - } - - @Override - public int hashCode() { - return Objects.hash( - this.status, - this.outputType, - this.output, - this.message, - this.size, - this.wordCharacterCount, - this.duration, - this.pages, - this.slides); - } - - @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 status = Optional.empty(); - - private Optional outputType = Optional.empty(); - - private Optional> output = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional size = Optional.empty(); - - private Optional wordCharacterCount = Optional.empty(); - - private Optional duration = Optional.empty(); - - private Optional pages = Optional.empty(); - - private Optional slides = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(DetectRunsResponse other) { - status(other.getStatus()); - outputType(other.getOutputType()); - output(other.getOutput()); - message(other.getMessage()); - size(other.getSize()); - wordCharacterCount(other.getWordCharacterCount()); - duration(other.getDuration()); - pages(other.getPages()); - slides(other.getSlides()); - return this; - } - - /** - *

                                  Status of the operation.

                                  - */ - @JsonSetter(value = "status", nulls = Nulls.SKIP) - public Builder status(Optional status) { - this.status = status; - return this; - } - - public Builder status(DetectRunsResponseStatus status) { - this.status = Optional.ofNullable(status); - return this; - } - - /** - *

                                  Format of the output file.

                                  - */ - @JsonSetter(value = "outputType", nulls = Nulls.SKIP) - public Builder outputType(Optional outputType) { - this.outputType = outputType; - return this; - } - - public Builder outputType(DetectRunsResponseOutputType outputType) { - this.outputType = Optional.ofNullable(outputType); - return this; - } - - /** - *

                                  Details of output files. Files are specified as Base64-encoded data.

                                  - */ - @JsonSetter(value = "output", nulls = Nulls.SKIP) - public Builder output(Optional> output) { - this.output = output; - return this; - } - - public Builder output(List output) { - this.output = Optional.ofNullable(output); - return this; - } - - /** - *

                                  Status details about the Detect run.

                                  - */ - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - /** - *

                                  Size of the processed file in kilobytes (KB).

                                  - */ - @JsonSetter(value = "size", nulls = Nulls.SKIP) - public Builder size(Optional size) { - this.size = size; - return this; - } - - public Builder size(Float size) { - this.size = Optional.ofNullable(size); - return this; - } - - @JsonSetter(value = "wordCharacterCount", nulls = Nulls.SKIP) - public Builder wordCharacterCount(Optional wordCharacterCount) { - this.wordCharacterCount = wordCharacterCount; - return this; - } - - public Builder wordCharacterCount(WordCharacterCount wordCharacterCount) { - this.wordCharacterCount = Optional.ofNullable(wordCharacterCount); - return this; - } - - /** - *

                                  Duration of the processed audio in seconds.

                                  - */ - @JsonSetter(value = "duration", nulls = Nulls.SKIP) - public Builder duration(Optional duration) { - this.duration = duration; - return this; - } - - public Builder duration(Float duration) { - this.duration = Optional.ofNullable(duration); - return this; - } - - /** - *

                                  Number of pages in the processed PDF.

                                  - */ - @JsonSetter(value = "pages", nulls = Nulls.SKIP) - public Builder pages(Optional pages) { - this.pages = pages; - return this; - } - - public Builder pages(Integer pages) { - this.pages = Optional.ofNullable(pages); - return this; - } - - /** - *

                                  Number of slides in the processed presentation.

                                  - */ - @JsonSetter(value = "slides", nulls = Nulls.SKIP) - public Builder slides(Optional slides) { - this.slides = slides; - return this; - } - - public Builder slides(Integer slides) { - this.slides = Optional.ofNullable(slides); - return this; - } - - public DetectRunsResponse build() { - return new DetectRunsResponse( - status, - outputType, - output, - message, - size, - wordCharacterCount, - duration, - pages, - slides, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java deleted file mode 100644 index 171dd153..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectRunsResponseOutputType { - UNKNOWN("UNKNOWN"), - - BASE_64("BASE64"); - - private final String value; - - DetectRunsResponseOutputType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java deleted file mode 100644 index e5fa80d4..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum DetectRunsResponseStatus { - UNKNOWN("UNKNOWN"), - - FAILED("FAILED"), - - SUCCESS("SUCCESS"), - - IN_PROGRESS("IN_PROGRESS"); - - private final String value; - - DetectRunsResponseStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java new file mode 100644 index 00000000..2328e6fc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequest.java @@ -0,0 +1,174 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeRecordRequest.Builder.class) +public final class DetokenizeRecordRequest { + private final String token; + + private final Optional redaction; + + private final Map additionalProperties; + + private DetokenizeRecordRequest( + String token, + Optional redaction, + Map additionalProperties) { + this.token = token; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that identifies the record to detokenize. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + /** + * @return Redaction level to enforce for the returned record. Subject to policies assigned to the API caller. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeRecordRequest && equalTo((DetokenizeRecordRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeRecordRequest other) { + return token.equals(other.token) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.redaction); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that identifies the record to detokenize.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(DetokenizeRecordRequest other); + } + + public interface _FinalStage { + DetokenizeRecordRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + _FinalStage redaction(Optional redaction); + + _FinalStage redaction(DetokenizeRecordRequestRedaction redaction); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeRecordRequest other) { + token(other.getToken()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Token that identifies the record to detokenize.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage redaction(DetokenizeRecordRequestRedaction redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + /** + *

                                  Redaction level to enforce for the returned record. Subject to policies assigned to the API caller.

                                  + */ + @java.lang.Override + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public _FinalStage redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + @java.lang.Override + public DetokenizeRecordRequest build() { + return new DetokenizeRecordRequest(token, redaction, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java new file mode 100644 index 00000000..0578f30a --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordRequestRedaction.java @@ -0,0 +1,108 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class DetokenizeRecordRequestRedaction { + public static final DetokenizeRecordRequestRedaction DEFAULT = + new DetokenizeRecordRequestRedaction(Value.DEFAULT, "DEFAULT"); + + public static final DetokenizeRecordRequestRedaction PLAIN_TEXT = + new DetokenizeRecordRequestRedaction(Value.PLAIN_TEXT, "PLAIN_TEXT"); + + public static final DetokenizeRecordRequestRedaction MASKED = + new DetokenizeRecordRequestRedaction(Value.MASKED, "MASKED"); + + public static final DetokenizeRecordRequestRedaction REDACTED = + new DetokenizeRecordRequestRedaction(Value.REDACTED, "REDACTED"); + + private final Value value; + + private final String string; + + DetokenizeRecordRequestRedaction(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 DetokenizeRecordRequestRedaction + && this.string.equals(((DetokenizeRecordRequestRedaction) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case DEFAULT: + return visitor.visitDefault(); + case PLAIN_TEXT: + return visitor.visitPlainText(); + case MASKED: + return visitor.visitMasked(); + case REDACTED: + return visitor.visitRedacted(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetokenizeRecordRequestRedaction valueOf(String value) { + switch (value) { + case "DEFAULT": + return DEFAULT; + case "PLAIN_TEXT": + return PLAIN_TEXT; + case "MASKED": + return MASKED; + case "REDACTED": + return REDACTED; + default: + return new DetokenizeRecordRequestRedaction(Value.UNKNOWN, value); + } + } + + public enum Value { + DEFAULT, + + REDACTED, + + MASKED, + + PLAIN_TEXT, + + UNKNOWN + } + + public interface Visitor { + T visitDefault(); + + T visitRedacted(); + + T visitMasked(); + + T visitPlainText(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java similarity index 75% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java index dd3a9c1f..2aeecd0e 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponse.java @@ -3,18 +3,23 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeRecordResponse.Builder.class) -public final class V1DetokenizeRecordResponse { +@JsonDeserialize(builder = DetokenizeRecordResponse.Builder.class) +public final class DetokenizeRecordResponse { private final Optional token; private final Optional valueType; @@ -25,7 +30,7 @@ public final class V1DetokenizeRecordResponse { private final Map additionalProperties; - private V1DetokenizeRecordResponse( + private DetokenizeRecordResponse( Optional token, Optional valueType, Optional value, @@ -46,6 +51,9 @@ public Optional getToken() { return token; } + /** + * @return Data type of the value. + */ @JsonProperty("valueType") public Optional getValueType() { return valueType; @@ -67,10 +75,10 @@ public Optional getError() { return error; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1DetokenizeRecordResponse && equalTo((V1DetokenizeRecordResponse) other); + return other instanceof DetokenizeRecordResponse && equalTo((DetokenizeRecordResponse) other); } @JsonAnyGetter @@ -78,19 +86,19 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1DetokenizeRecordResponse other) { + private boolean equalTo(DetokenizeRecordResponse other) { return token.equals(other.token) && valueType.equals(other.valueType) && value.equals(other.value) && error.equals(other.error); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.token, this.valueType, this.value, this.error); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -114,7 +122,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1DetokenizeRecordResponse other) { + public Builder from(DetokenizeRecordResponse other) { token(other.getToken()); valueType(other.getValueType()); value(other.getValue()); @@ -136,6 +144,9 @@ public Builder token(String token) { return this; } + /** + *

                                  Data type of the value.

                                  + */ @JsonSetter(value = "valueType", nulls = Nulls.SKIP) public Builder valueType(Optional valueType) { this.valueType = valueType; @@ -175,8 +186,18 @@ public Builder error(String error) { return this; } - public V1DetokenizeRecordResponse build() { - return new V1DetokenizeRecordResponse(token, valueType, value, error, additionalProperties); + public DetokenizeRecordResponse build() { + return new DetokenizeRecordResponse(token, valueType, value, error, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java index e9f4be2a..990dac21 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java @@ -3,36 +3,161 @@ */ package com.skyflow.generated.rest.types; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -public enum DetokenizeRecordResponseValueType { - NONE("NONE"), +public final class DetokenizeRecordResponseValueType { + public static final DetokenizeRecordResponseValueType FLOAT = + new DetokenizeRecordResponseValueType(Value.FLOAT, "FLOAT"); - STRING("STRING"), + public static final DetokenizeRecordResponseValueType ARRAY = + new DetokenizeRecordResponseValueType(Value.ARRAY, "ARRAY"); - INTEGER("INTEGER"), + public static final DetokenizeRecordResponseValueType TIME = + new DetokenizeRecordResponseValueType(Value.TIME, "TIME"); - FLOAT("FLOAT"), + public static final DetokenizeRecordResponseValueType DATE = + new DetokenizeRecordResponseValueType(Value.DATE, "DATE"); - BOOL("BOOL"), + public static final DetokenizeRecordResponseValueType INTEGER = + new DetokenizeRecordResponseValueType(Value.INTEGER, "INTEGER"); - DATETIME("DATETIME"), + public static final DetokenizeRecordResponseValueType JSON = + new DetokenizeRecordResponseValueType(Value.JSON, "JSON"); - JSON("JSON"), + public static final DetokenizeRecordResponseValueType BOOL = + new DetokenizeRecordResponseValueType(Value.BOOL, "BOOL"); - ARRAY("ARRAY"), + public static final DetokenizeRecordResponseValueType DATETIME = + new DetokenizeRecordResponseValueType(Value.DATETIME, "DATETIME"); - DATE("DATE"); + public static final DetokenizeRecordResponseValueType STRING = + new DetokenizeRecordResponseValueType(Value.STRING, "STRING"); - private final String value; + private final Value value; - DetokenizeRecordResponseValueType(String value) { + private final String string; + + DetokenizeRecordResponseValueType(Value value, String string) { this.value = value; + this.string = string; + } + + public Value getEnumValue() { + return value; } + @java.lang.Override @JsonValue - @Override public String toString() { - return this.value; + return this.string; + } + + @java.lang.Override + public boolean equals(Object other) { + return (this == other) + || (other instanceof DetokenizeRecordResponseValueType + && this.string.equals(((DetokenizeRecordResponseValueType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case FLOAT: + return visitor.visitFloat(); + case ARRAY: + return visitor.visitArray(); + case TIME: + return visitor.visitTime(); + case DATE: + return visitor.visitDate(); + case INTEGER: + return visitor.visitInteger(); + case JSON: + return visitor.visitJson(); + case BOOL: + return visitor.visitBool(); + case DATETIME: + return visitor.visitDatetime(); + case STRING: + return visitor.visitString(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static DetokenizeRecordResponseValueType valueOf(String value) { + switch (value) { + case "FLOAT": + return FLOAT; + case "ARRAY": + return ARRAY; + case "TIME": + return TIME; + case "DATE": + return DATE; + case "INTEGER": + return INTEGER; + case "JSON": + return JSON; + case "BOOL": + return BOOL; + case "DATETIME": + return DATETIME; + case "STRING": + return STRING; + default: + return new DetokenizeRecordResponseValueType(Value.UNKNOWN, value); + } + } + + public enum Value { + STRING, + + INTEGER, + + FLOAT, + + BOOL, + + DATETIME, + + JSON, + + ARRAY, + + DATE, + + TIME, + + UNKNOWN + } + + public interface Visitor { + T visitString(); + + T visitInteger(); + + T visitFloat(); + + T visitBool(); + + T visitDatetime(); + + T visitJson(); + + T visitArray(); + + T visitDate(); + + T visitTime(); + + T visitUnknown(String unknownType); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java new file mode 100644 index 00000000..c16f5cb3 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponse.java @@ -0,0 +1,113 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeResponse.Builder.class) +public final class DetokenizeResponse { + private final Optional> records; + + private final Map additionalProperties; + + private DetokenizeResponse( + Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records corresponding to the specified tokens. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeResponse && equalTo((DetokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(DetokenizeResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Records corresponding to the specified tokens.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public DetokenizeResponse build() { + return new DetokenizeResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java new file mode 100644 index 00000000..1848b425 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/DetokenizeResponseObject.java @@ -0,0 +1,335 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = DetokenizeResponseObject.Builder.class) +public final class DetokenizeResponseObject { + private final String token; + + private final Optional value; + + private final Optional tokenGroupName; + + private final Optional error; + + private final Optional httpCode; + + private final Optional> metadata; + + private final Map additionalProperties; + + private DetokenizeResponseObject( + String token, + Optional value, + Optional tokenGroupName, + Optional error, + Optional httpCode, + Optional> metadata, + Map additionalProperties) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.httpCode = httpCode; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that was detokenized. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the token group. + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + /** + * @return Additional metadata associated with the token, such as tableName or skyflowID. + */ + @JsonProperty("metadata") + public Optional> getMetadata() { + return metadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof DetokenizeResponseObject && equalTo((DetokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(DetokenizeResponseObject other) { + return token.equals(other.token) + && value.equals(other.value) + && tokenGroupName.equals(other.tokenGroupName) + && error.equals(other.error) + && httpCode.equals(other.httpCode) + && metadata.equals(other.metadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.tokenGroupName, this.error, this.httpCode, this.metadata); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that was detokenized.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(DetokenizeResponseObject other); + } + + public interface _FinalStage { + DetokenizeResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + _FinalStage value(Optional value); + + _FinalStage value(GoogleProtobufValue value); + + /** + *

                                  Name of the token group.

                                  + */ + _FinalStage tokenGroupName(Optional tokenGroupName); + + _FinalStage tokenGroupName(String tokenGroupName); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(Optional httpCode); + + _FinalStage httpCode(Integer httpCode); + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + */ + _FinalStage metadata(Optional> metadata); + + _FinalStage metadata(Map metadata); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional> metadata = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional tokenGroupName = Optional.empty(); + + private Optional value = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(DetokenizeResponseObject other) { + token(other.getToken()); + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + error(other.getError()); + httpCode(other.getHttpCode()); + metadata(other.getMetadata()); + return this; + } + + /** + *

                                  Token that was detokenized.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage metadata(Map metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + /** + *

                                  Additional metadata associated with the token, such as tableName or skyflowID.

                                  + */ + @java.lang.Override + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public _FinalStage metadata(Optional> metadata) { + this.metadata = metadata; + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @java.lang.Override + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public _FinalStage httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the token group.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public _FinalStage tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + @java.lang.Override + public _FinalStage value(GoogleProtobufValue value) { + this.value = Optional.ofNullable(value); + return this; + } + + @java.lang.Override + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public _FinalStage value(Optional value) { + this.value = value; + return this; + } + + @java.lang.Override + public DetokenizeResponseObject build() { + return new DetokenizeResponseObject( + token, value, tokenGroupName, error, httpCode, metadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java index 4113b998..3becce63 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java @@ -3,14 +3,18 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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 com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponse.Builder.class) @@ -29,7 +33,7 @@ public ErrorResponseError getError() { return error; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; return other instanceof ErrorResponse && equalTo((ErrorResponse) other); @@ -44,12 +48,12 @@ private boolean equalTo(ErrorResponse other) { return error.equals(other.error); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.error); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -66,6 +70,10 @@ public interface ErrorStage { public interface _FinalStage { ErrorResponse build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -77,22 +85,34 @@ public static final class Builder implements ErrorStage, _FinalStage { private Builder() {} - @Override + @java.lang.Override public Builder from(ErrorResponse other) { error(other.getError()); return this; } - @Override + @java.lang.Override @JsonSetter("error") public _FinalStage error(@NotNull ErrorResponseError error) { this.error = Objects.requireNonNull(error, "error must not be null"); return this; } - @Override + @java.lang.Override public ErrorResponse build() { return new ErrorResponse(error, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java index 4774fa57..a10d36cc 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java @@ -3,13 +3,22 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; import org.jetbrains.annotations.NotNull; -import java.util.*; - @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponseError.Builder.class) public final class ErrorResponseError { @@ -68,7 +77,7 @@ public Optional>> getDetails() { return details; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; return other instanceof ErrorResponseError && equalTo((ErrorResponseError) other); @@ -87,12 +96,12 @@ private boolean equalTo(ErrorResponseError other) { && details.equals(other.details); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.grpcCode, this.httpCode, this.httpStatus, this.message, this.details); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -103,7 +112,7 @@ public static GrpcCodeStage builder() { public interface GrpcCodeStage { /** - * gRPC status codes. See https://grpc.io/docs/guides/status-codes. + *

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  */ HttpCodeStage grpcCode(int grpcCode); @@ -125,6 +134,10 @@ public interface MessageStage { public interface _FinalStage { ErrorResponseError build(); + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + _FinalStage details(Optional>> details); _FinalStage details(List> details); @@ -148,7 +161,7 @@ public static final class Builder private Builder() {} - @Override + @java.lang.Override public Builder from(ErrorResponseError other) { grpcCode(other.getGrpcCode()); httpCode(other.getHttpCode()); @@ -159,53 +172,65 @@ public Builder from(ErrorResponseError other) { } /** - * gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  + *

                                  gRPC status codes. See https://grpc.io/docs/guides/status-codes.

                                  * @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("grpc_code") public HttpCodeStage grpcCode(int grpcCode) { this.grpcCode = grpcCode; return this; } - @Override + @java.lang.Override @JsonSetter("http_code") public HttpStatusStage httpCode(int httpCode) { this.httpCode = httpCode; return this; } - @Override + @java.lang.Override @JsonSetter("http_status") public MessageStage httpStatus(@NotNull String httpStatus) { this.httpStatus = Objects.requireNonNull(httpStatus, "httpStatus must not be null"); return this; } - @Override + @java.lang.Override @JsonSetter("message") public _FinalStage message(@NotNull String message) { this.message = Objects.requireNonNull(message, "message must not be null"); return this; } - @Override + @java.lang.Override public _FinalStage details(List> details) { this.details = Optional.ofNullable(details); return this; } - @Override + @java.lang.Override @JsonSetter(value = "details", nulls = Nulls.SKIP) public _FinalStage details(Optional>> details) { this.details = details; return this; } - @Override + @java.lang.Override public ErrorResponseError build() { return new ErrorResponseError(grpcCode, httpCode, httpStatus, message, details, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java new file mode 100644 index 00000000..5c3433f4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryRecordResponse.java @@ -0,0 +1,111 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryRecordResponse.Builder.class) +public final class ExecuteQueryRecordResponse { + private final Optional> data; + + private final Map additionalProperties; + + private ExecuteQueryRecordResponse(Optional> data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Fields and values for the record. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryRecordResponse && equalTo((ExecuteQueryRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryRecordResponse other) { + return data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data); + } + + @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> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryRecordResponse other) { + data(other.getData()); + return this; + } + + /** + *

                                  Fields and values for the record.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + public ExecuteQueryRecordResponse build() { + return new ExecuteQueryRecordResponse(data, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java new file mode 100644 index 00000000..98eceffa --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponse.java @@ -0,0 +1,137 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryResponse.Builder.class) +public final class ExecuteQueryResponse { + private final Optional> records; + + private final Optional metadata; + + private final Map additionalProperties; + + private ExecuteQueryResponse( + Optional> records, + Optional metadata, + Map additionalProperties) { + this.records = records; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records corresponding to the specified query. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @JsonProperty("metadata") + public Optional getMetadata() { + return metadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryResponse && equalTo((ExecuteQueryResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryResponse other) { + return records.equals(other.records) && metadata.equals(other.metadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records, this.metadata); + } + + @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> records = Optional.empty(); + + private Optional metadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryResponse other) { + records(other.getRecords()); + metadata(other.getMetadata()); + return this; + } + + /** + *

                                  Records corresponding to the specified query.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public Builder metadata(Optional metadata) { + this.metadata = metadata; + return this; + } + + public Builder metadata(ExecuteQueryResponseMetadata metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + public ExecuteQueryResponse build() { + return new ExecuteQueryResponse(records, metadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java new file mode 100644 index 00000000..0c98eaee --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/ExecuteQueryResponseMetadata.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = ExecuteQueryResponseMetadata.Builder.class) +public final class ExecuteQueryResponseMetadata { + private final Optional> columns; + + private final Map additionalProperties; + + private ExecuteQueryResponseMetadata(Optional> columns, Map additionalProperties) { + this.columns = columns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns returned for the query. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof ExecuteQueryResponseMetadata && equalTo((ExecuteQueryResponseMetadata) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(ExecuteQueryResponseMetadata other) { + return columns.equals(other.columns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.columns); + } + + @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> columns = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(ExecuteQueryResponseMetadata other) { + columns(other.getColumns()); + return this; + } + + /** + *

                                  Columns returned for the query.

                                  + */ + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public Builder columns(Optional> columns) { + this.columns = columns; + return this; + } + + public Builder columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + public ExecuteQueryResponseMetadata build() { + return new ExecuteQueryResponseMetadata(columns, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java similarity index 73% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java index b64b8792..3fa42675 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FieldRecords.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1FieldRecords.Builder.class) -public final class V1FieldRecords { +@JsonDeserialize(builder = FieldRecords.Builder.class) +public final class FieldRecords { private final Optional> fields; private final Optional> tokens; private final Map additionalProperties; - private V1FieldRecords( + private FieldRecords( Optional> fields, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1FieldRecords && equalTo((V1FieldRecords) other); + return other instanceof FieldRecords && equalTo((FieldRecords) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1FieldRecords other) { + private boolean equalTo(FieldRecords other) { return fields.equals(other.fields) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.fields, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1FieldRecords other) { + public Builder from(FieldRecords other) { fields(other.getFields()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1FieldRecords build() { - return new V1FieldRecords(fields, tokens, additionalProperties); + public FieldRecords build() { + return new FieldRecords(fields, tokens, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java deleted file mode 100644 index fd6fa822..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileData.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileData.Builder.class) -public final class FileData { - private final String base64; - - private final FileDataDataFormat dataFormat; - - private final Map additionalProperties; - - private FileData(String base64, FileDataDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileData && equalTo((FileData) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileData other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileData other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDataFormat dataFormat); - } - - public interface _FinalStage { - FileData build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileData other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileData build() { - return new FileData(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java deleted file mode 100644 index 8ed06e57..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDataFormat { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"), - - JSONL("jsonl"); - - private final String value; - - FileDataDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java deleted file mode 100644 index b6a5ea11..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyAudio.Builder.class) -public final class FileDataDeidentifyAudio { - private final String base64; - - private final FileDataDeidentifyAudioDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyAudio( - String base64, FileDataDeidentifyAudioDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyAudioDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyAudio && equalTo((FileDataDeidentifyAudio) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyAudio other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyAudio other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyAudioDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyAudio build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyAudioDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyAudio other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyAudioDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyAudio build() { - return new FileDataDeidentifyAudio(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java deleted file mode 100644 index 06121b27..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyAudioDataFormat { - MP_3("mp3"), - - WAV("wav"); - - private final String value; - - FileDataDeidentifyAudioDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java deleted file mode 100644 index 5fb12fba..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyDocument.Builder.class) -public final class FileDataDeidentifyDocument { - private final String base64; - - private final FileDataDeidentifyDocumentDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyDocument( - String base64, FileDataDeidentifyDocumentDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyDocumentDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyDocument && equalTo((FileDataDeidentifyDocument) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyDocument other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyDocument other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyDocumentDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyDocument build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyDocumentDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyDocument other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyDocumentDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyDocument build() { - return new FileDataDeidentifyDocument(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java deleted file mode 100644 index a68ee832..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyDocumentDataFormat { - PDF("pdf"), - - DOC("doc"), - - DOCX("docx"); - - private final String value; - - FileDataDeidentifyDocumentDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java deleted file mode 100644 index bc5e2c6b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyImage.Builder.class) -public final class FileDataDeidentifyImage { - private final String base64; - - private final FileDataDeidentifyImageDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyImage( - String base64, FileDataDeidentifyImageDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyImageDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyImage && equalTo((FileDataDeidentifyImage) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyImage other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyImage other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyImageDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyImage build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyImageDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyImage other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyImageDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyImage build() { - return new FileDataDeidentifyImage(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java deleted file mode 100644 index 34541314..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java +++ /dev/null @@ -1,32 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyImageDataFormat { - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"); - - private final String value; - - FileDataDeidentifyImageDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java deleted file mode 100644 index 5606e917..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyPdf.Builder.class) -public final class FileDataDeidentifyPdf { - private final String base64; - - private final Map additionalProperties; - - private FileDataDeidentifyPdf(String base64, Map additionalProperties) { - this.base64 = base64; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public String getDataFormat() { - return "pdf"; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyPdf && equalTo((FileDataDeidentifyPdf) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyPdf other) { - return base64.equals(other.base64); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - _FinalStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyPdf other); - } - - public interface _FinalStage { - FileDataDeidentifyPdf build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, _FinalStage { - private String base64; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyPdf other) { - base64(other.getBase64()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public _FinalStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - @Override - public FileDataDeidentifyPdf build() { - return new FileDataDeidentifyPdf(base64, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java deleted file mode 100644 index 0bedabc5..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyPresentation.Builder.class) -public final class FileDataDeidentifyPresentation { - private final String base64; - - private final FileDataDeidentifyPresentationDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyPresentation( - String base64, - FileDataDeidentifyPresentationDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyPresentationDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyPresentation && equalTo((FileDataDeidentifyPresentation) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyPresentation other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyPresentation other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyPresentationDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyPresentation build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyPresentationDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyPresentation other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyPresentationDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyPresentation build() { - return new FileDataDeidentifyPresentation(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java deleted file mode 100644 index 6aed659d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyPresentationDataFormat { - PPT("ppt"), - - PPTX("pptx"); - - private final String value; - - FileDataDeidentifyPresentationDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java deleted file mode 100644 index dd017bb8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifySpreadsheet.Builder.class) -public final class FileDataDeidentifySpreadsheet { - private final String base64; - - private final FileDataDeidentifySpreadsheetDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifySpreadsheet( - String base64, - FileDataDeidentifySpreadsheetDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifySpreadsheetDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifySpreadsheet && equalTo((FileDataDeidentifySpreadsheet) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifySpreadsheet other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifySpreadsheet other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifySpreadsheetDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifySpreadsheet build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifySpreadsheetDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifySpreadsheet other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifySpreadsheetDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifySpreadsheet build() { - return new FileDataDeidentifySpreadsheet(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java deleted file mode 100644 index 9fc8b8ae..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifySpreadsheetDataFormat { - CSV("csv"), - - XLS("xls"), - - XLSX("xlsx"); - - private final String value; - - FileDataDeidentifySpreadsheetDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java deleted file mode 100644 index 814d51c3..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java +++ /dev/null @@ -1,143 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyStructuredText.Builder.class) -public final class FileDataDeidentifyStructuredText { - private final String base64; - - private final FileDataDeidentifyStructuredTextDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataDeidentifyStructuredText( - String base64, - FileDataDeidentifyStructuredTextDataFormat dataFormat, - Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataDeidentifyStructuredTextDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyStructuredText && equalTo((FileDataDeidentifyStructuredText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyStructuredText other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyStructuredText other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataDeidentifyStructuredTextDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataDeidentifyStructuredText build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataDeidentifyStructuredTextDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyStructuredText other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataDeidentifyStructuredTextDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataDeidentifyStructuredText build() { - return new FileDataDeidentifyStructuredText(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java deleted file mode 100644 index 29d9548b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataDeidentifyStructuredTextDataFormat { - JSON("json"), - - XML("xml"); - - private final String value; - - FileDataDeidentifyStructuredTextDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java deleted file mode 100644 index e5c88180..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java +++ /dev/null @@ -1,116 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataDeidentifyText.Builder.class) -public final class FileDataDeidentifyText { - private final String base64; - - private final Map additionalProperties; - - private FileDataDeidentifyText(String base64, Map additionalProperties) { - this.base64 = base64; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public String getDataFormat() { - return "txt"; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataDeidentifyText && equalTo((FileDataDeidentifyText) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataDeidentifyText other) { - return base64.equals(other.base64); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - _FinalStage base64(@NotNull String base64); - - Builder from(FileDataDeidentifyText other); - } - - public interface _FinalStage { - FileDataDeidentifyText build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, _FinalStage { - private String base64; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataDeidentifyText other) { - base64(other.getBase64()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public _FinalStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - @Override - public FileDataDeidentifyText build() { - return new FileDataDeidentifyText(base64, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java deleted file mode 100644 index 9148703c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = FileDataReidentifyFile.Builder.class) -public final class FileDataReidentifyFile { - private final String base64; - - private final FileDataReidentifyFileDataFormat dataFormat; - - private final Map additionalProperties; - - private FileDataReidentifyFile( - String base64, FileDataReidentifyFileDataFormat dataFormat, Map additionalProperties) { - this.base64 = base64; - this.dataFormat = dataFormat; - this.additionalProperties = additionalProperties; - } - - /** - * @return Base64-encoded data of the file. - */ - @JsonProperty("base64") - public String getBase64() { - return base64; - } - - /** - * @return Format of the file. - */ - @JsonProperty("data_format") - public FileDataReidentifyFileDataFormat getDataFormat() { - return dataFormat; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof FileDataReidentifyFile && equalTo((FileDataReidentifyFile) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(FileDataReidentifyFile other) { - return base64.equals(other.base64) && dataFormat.equals(other.dataFormat); - } - - @Override - public int hashCode() { - return Objects.hash(this.base64, this.dataFormat); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static Base64Stage builder() { - return new Builder(); - } - - public interface Base64Stage { - /** - * Base64-encoded data of the file. - */ - DataFormatStage base64(@NotNull String base64); - - Builder from(FileDataReidentifyFile other); - } - - public interface DataFormatStage { - /** - * Format of the file. - */ - _FinalStage dataFormat(@NotNull FileDataReidentifyFileDataFormat dataFormat); - } - - public interface _FinalStage { - FileDataReidentifyFile build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements Base64Stage, DataFormatStage, _FinalStage { - private String base64; - - private FileDataReidentifyFileDataFormat dataFormat; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(FileDataReidentifyFile other) { - base64(other.getBase64()); - dataFormat(other.getDataFormat()); - return this; - } - - /** - * Base64-encoded data of the file.

                                  Base64-encoded data of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("base64") - public DataFormatStage base64(@NotNull String base64) { - this.base64 = Objects.requireNonNull(base64, "base64 must not be null"); - return this; - } - - /** - * Format of the file.

                                  Format of the file.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("data_format") - public _FinalStage dataFormat(@NotNull FileDataReidentifyFileDataFormat dataFormat) { - this.dataFormat = Objects.requireNonNull(dataFormat, "dataFormat must not be null"); - return this; - } - - @Override - public FileDataReidentifyFile build() { - return new FileDataReidentifyFile(base64, dataFormat, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java deleted file mode 100644 index cc8293d2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FileDataReidentifyFileDataFormat { - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - XML("xml"); - - private final String value; - - FileDataReidentifyFileDataFormat(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java new file mode 100644 index 00000000..5d3aad52 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteRecord.java @@ -0,0 +1,280 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteRecord.Builder.class) +public final class FileDeleteRecord { + private final String tableName; + + private final Optional skyflowId; + + private final List columns; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private FileDeleteRecord( + String tableName, + Optional skyflowId, + List columns, + Optional> uniqueValues, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowId = skyflowId; + this.columns = columns; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record. + */ + @JsonProperty("columns") + public List getColumns() { + return columns; + } + + /** + * @return List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteRecord && equalTo((FileDeleteRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteRecord other) { + return tableName.equals(other.tableName) + && skyflowId.equals(other.skyflowId) + && columns.equals(other.columns) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowId, this.columns, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(FileDeleteRecord other); + } + + public interface _FinalStage { + FileDeleteRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + */ + _FinalStage columns(List columns); + + _FinalStage addColumns(String columns); + + _FinalStage addAllColumns(List columns); + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private Optional> uniqueValues = Optional.empty(); + + private List columns = new ArrayList<>(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteRecord other) { + tableName(other.getTableName()); + skyflowId(other.getSkyflowId()); + columns(other.getColumns()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values used to look up the record(s) to delete, in place of skyflowID. If more than one object is provided, each is resolved independently and the specified columns are deleted from every matching record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllColumns(List columns) { + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addColumns(String columns) { + this.columns.add(columns); + return this; + } + + /** + *

                                  Names of the file columns to delete on this record. If any listed column has no file present, the request fails for this record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(List columns) { + this.columns.clear(); + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record containing the file column(s) to delete. Either skyflowID or uniqueValues must be specified, not both.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileDeleteRecord build() { + return new FileDeleteRecord(tableName, skyflowId, columns, uniqueValues, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java new file mode 100644 index 00000000..5062fdf2 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteResponse.Builder.class) +public final class FileDeleteResponse { + private final List records; + + private final Map additionalProperties; + + private FileDeleteResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of records (max 100) with the result of the delete operation. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteResponse && equalTo((FileDeleteResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileDeleteResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of records (max 100) with the result of the delete operation.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(FileDeleteResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public FileDeleteResponse build() { + return new FileDeleteResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java new file mode 100644 index 00000000..61427130 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileDeleteResponseObject.java @@ -0,0 +1,295 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileDeleteResponseObject.Builder.class) +public final class FileDeleteResponseObject { + private final Optional skyflowId; + + private final String tableName; + + private final Optional> data; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private FileDeleteResponseObject( + Optional skyflowId, + String tableName, + Optional> data, + Optional error, + int httpCode, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tableName = tableName; + this.data = data; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Error message describing any issue with the specific record. Null if no error occurred. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code representing the result of the API request for this record. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileDeleteResponseObject && equalTo((FileDeleteResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileDeleteResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tableName.equals(other.tableName) + && data.equals(other.data) + && error.equals(other.error) + && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.tableName, this.data, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + HttpCodeStage tableName(@NotNull String tableName); + + Builder from(FileDeleteResponseObject other); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + FileDeleteResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, HttpCodeStage, _FinalStage { + private String tableName; + + private int httpCode; + + private Optional error = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileDeleteResponseObject other) { + skyflowId(other.getSkyflowId()); + tableName(other.getTableName()); + data(other.getData()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public HttpCodeStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Map of column name to deletion result. Populated only when the record's delete succeeds, with one entry per requested column with status DELETED. Null if any requested column has no file present, in which case error is populated instead.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record that was targeted. When the request specifies uniqueValues, this is the skyflowID resolved from the matching record. Null if the record failed validation before a skyflowID could be resolved.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileDeleteResponseObject build() { + return new FileDeleteResponseObject(skyflowId, tableName, data, error, httpCode, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java new file mode 100644 index 00000000..ff30111e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileMetadata.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileMetadata.Builder.class) +public final class FileMetadata { + private final Optional fileName; + + private final Optional fileSizeKb; + + private final Optional fileType; + + private final Map additionalProperties; + + private FileMetadata( + Optional fileName, + Optional fileSizeKb, + Optional fileType, + Map additionalProperties) { + this.fileName = fileName; + this.fileSizeKb = fileSizeKb; + this.fileType = fileType; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the file, including the extension if provided. + */ + @JsonProperty("fileName") + public Optional getFileName() { + return fileName; + } + + /** + * @return Size of the file in kilobytes (KB), rounded up from bytes to the nearest KB. + */ + @JsonProperty("fileSizeKB") + public Optional getFileSizeKb() { + return fileSizeKb; + } + + /** + * @return Type of the file, detected based on its content (MIME type). + */ + @JsonProperty("fileType") + public Optional getFileType() { + return fileType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileMetadata && equalTo((FileMetadata) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileMetadata other) { + return fileName.equals(other.fileName) + && fileSizeKb.equals(other.fileSizeKb) + && fileType.equals(other.fileType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.fileName, this.fileSizeKb, this.fileType); + } + + @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 fileName = Optional.empty(); + + private Optional fileSizeKb = Optional.empty(); + + private Optional fileType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileMetadata other) { + fileName(other.getFileName()); + fileSizeKb(other.getFileSizeKb()); + fileType(other.getFileType()); + return this; + } + + /** + *

                                  Name of the file, including the extension if provided.

                                  + */ + @JsonSetter(value = "fileName", nulls = Nulls.SKIP) + public Builder fileName(Optional fileName) { + this.fileName = fileName; + return this; + } + + public Builder fileName(String fileName) { + this.fileName = Optional.ofNullable(fileName); + return this; + } + + /** + *

                                  Size of the file in kilobytes (KB), rounded up from bytes to the nearest KB.

                                  + */ + @JsonSetter(value = "fileSizeKB", nulls = Nulls.SKIP) + public Builder fileSizeKb(Optional fileSizeKb) { + this.fileSizeKb = fileSizeKb; + return this; + } + + public Builder fileSizeKb(Integer fileSizeKb) { + this.fileSizeKb = Optional.ofNullable(fileSizeKb); + return this; + } + + /** + *

                                  Type of the file, detected based on its content (MIME type).

                                  + */ + @JsonSetter(value = "fileType", nulls = Nulls.SKIP) + public Builder fileType(Optional fileType) { + this.fileType = fileType; + return this; + } + + public Builder fileType(String fileType) { + this.fileType = Optional.ofNullable(fileType); + return this; + } + + public FileMetadata build() { + return new FileMetadata(fileName, fileSizeKb, fileType, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java new file mode 100644 index 00000000..73d3f27e --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadColumn.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadColumn.Builder.class) +public final class FileUploadColumn { + private final String column; + + private final Optional fileName; + + private final Map additionalProperties; + + private FileUploadColumn(String column, Optional fileName, Map additionalProperties) { + this.column = column; + this.fileName = fileName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the column where the file is being uploaded. + */ + @JsonProperty("column") + public String getColumn() { + return column; + } + + /** + * @return Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated. + */ + @JsonProperty("fileName") + public Optional getFileName() { + return fileName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadColumn && equalTo((FileUploadColumn) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadColumn other) { + return column.equals(other.column) && fileName.equals(other.fileName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.column, this.fileName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ColumnStage builder() { + return new Builder(); + } + + public interface ColumnStage { + /** + *

                                  Name of the column where the file is being uploaded.

                                  + */ + _FinalStage column(@NotNull String column); + + Builder from(FileUploadColumn other); + } + + public interface _FinalStage { + FileUploadColumn build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + */ + _FinalStage fileName(Optional fileName); + + _FinalStage fileName(String fileName); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ColumnStage, _FinalStage { + private String column; + + private Optional fileName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadColumn other) { + column(other.getColumn()); + fileName(other.getFileName()); + return this; + } + + /** + *

                                  Name of the column where the file is being uploaded.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("column") + public _FinalStage column(@NotNull String column) { + this.column = Objects.requireNonNull(column, "column must not be null"); + return this; + } + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage fileName(String fileName) { + this.fileName = Optional.ofNullable(fileName); + return this; + } + + /** + *

                                  Name of the file being uploaded to the file column. If not provided, a random 16-byte UUID name is generated.

                                  + */ + @java.lang.Override + @JsonSetter(value = "fileName", nulls = Nulls.SKIP) + public _FinalStage fileName(Optional fileName) { + this.fileName = fileName; + return this; + } + + @java.lang.Override + public FileUploadColumn build() { + return new FileUploadColumn(column, fileName, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java new file mode 100644 index 00000000..976b0bfb --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadRecord.java @@ -0,0 +1,235 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadRecord.Builder.class) +public final class FileUploadRecord { + private final String tableName; + + private final Optional skyflowId; + + private final List columns; + + private final Map additionalProperties; + + private FileUploadRecord( + String tableName, + Optional skyflowId, + List columns, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowId = skyflowId; + this.columns = columns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload. + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return List of file columns to generate signed upload URLs for. + */ + @JsonProperty("columns") + public List getColumns() { + return columns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadRecord && equalTo((FileUploadRecord) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadRecord other) { + return tableName.equals(other.tableName) && skyflowId.equals(other.skyflowId) && columns.equals(other.columns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowId, this.columns); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(FileUploadRecord other); + } + + public interface _FinalStage { + FileUploadRecord build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + */ + _FinalStage columns(List columns); + + _FinalStage addColumns(FileUploadColumn columns); + + _FinalStage addAllColumns(List columns); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private List columns = new ArrayList<>(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadRecord other) { + tableName(other.getTableName()); + skyflowId(other.getSkyflowId()); + columns(other.getColumns()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllColumns(List columns) { + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addColumns(FileUploadColumn columns) { + this.columns.add(columns); + return this; + } + + /** + *

                                  List of file columns to generate signed upload URLs for.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(List columns) { + this.columns.clear(); + if (columns != null) { + this.columns.addAll(columns); + } + return this; + } + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID of the record. If not provided, a new record is created and its skyflowID is used for the file upload.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public FileUploadRecord build() { + return new FileUploadRecord(tableName, skyflowId, columns, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java new file mode 100644 index 00000000..6ef52d52 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadResponse.Builder.class) +public final class FileUploadResponse { + private final List records; + + private final Map additionalProperties; + + private FileUploadResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of records with signed upload URLs. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadResponse && equalTo((FileUploadResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FileUploadResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of records with signed upload URLs.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(FileUploadResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public FileUploadResponse build() { + return new FileUploadResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java new file mode 100644 index 00000000..5a2d674c --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/FileUploadResponseObject.java @@ -0,0 +1,286 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FileUploadResponseObject.Builder.class) +public final class FileUploadResponseObject { + private final String skyflowId; + + private final String tableName; + + private final Optional> data; + + private final Optional error; + + private final int httpCode; + + private final Map additionalProperties; + + private FileUploadResponseObject( + String skyflowId, + String tableName, + Optional> data, + Optional error, + int httpCode, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tableName = tableName; + this.data = data; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Error message describing any issue with the specific record. Null if no error occurred. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code representing the result of the API request for this record. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FileUploadResponseObject && equalTo((FileUploadResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FileUploadResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tableName.equals(other.tableName) + && data.equals(other.data) + && error.equals(other.error) + && httpCode == other.httpCode; + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.tableName, this.data, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request.

                                  + */ + TableNameStage skyflowId(@NotNull String skyflowId); + + Builder from(FileUploadResponseObject other); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + HttpCodeStage tableName(@NotNull String tableName); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + */ + _FinalStage httpCode(int httpCode); + } + + public interface _FinalStage { + FileUploadResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, TableNameStage, HttpCodeStage, _FinalStage { + private String skyflowId; + + private String tableName; + + private int httpCode; + + private Optional error = Optional.empty(); + + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(FileUploadResponseObject other) { + skyflowId(other.getSkyflowId()); + tableName(other.getTableName()); + data(other.getData()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Skyflow ID of the record. A new skyflowID is returned if one was not provided in the request.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public TableNameStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public HttpCodeStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  HTTP status code representing the result of the API request for this record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message describing any issue with the specific record. Null if no error occurred.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Map of column names to signed upload URLs. Each signed URL expires after 15 minutes by default.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + @java.lang.Override + public FileUploadResponseObject build() { + return new FileUploadResponseObject(skyflowId, tableName, data, error, httpCode, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java deleted file mode 100644 index 1563b90a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Format.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Format.Builder.class) -public final class Format { - private final Optional> redacted; - - private final Optional> masked; - - private final Optional> plaintext; - - private final Map additionalProperties; - - private Format( - Optional> redacted, - Optional> masked, - Optional> plaintext, - Map additionalProperties) { - this.redacted = redacted; - this.masked = masked; - this.plaintext = plaintext; - this.additionalProperties = additionalProperties; - } - - /** - * @return Entity types to fully redact. - */ - @JsonProperty("redacted") - public Optional> getRedacted() { - return redacted; - } - - /** - * @return Entity types to mask. - */ - @JsonProperty("masked") - public Optional> getMasked() { - return masked; - } - - /** - * @return Entity types to return in plaintext. - */ - @JsonProperty("plaintext") - public Optional> getPlaintext() { - return plaintext; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Format && equalTo((Format) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Format other) { - return redacted.equals(other.redacted) && masked.equals(other.masked) && plaintext.equals(other.plaintext); - } - - @Override - public int hashCode() { - return Objects.hash(this.redacted, this.masked, this.plaintext); - } - - @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> redacted = Optional.empty(); - - private Optional> masked = Optional.empty(); - - private Optional> plaintext = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Format other) { - redacted(other.getRedacted()); - masked(other.getMasked()); - plaintext(other.getPlaintext()); - return this; - } - - /** - *

                                  Entity types to fully redact.

                                  - */ - @JsonSetter(value = "redacted", nulls = Nulls.SKIP) - public Builder redacted(Optional> redacted) { - this.redacted = redacted; - return this; - } - - public Builder redacted(List redacted) { - this.redacted = Optional.ofNullable(redacted); - return this; - } - - /** - *

                                  Entity types to mask.

                                  - */ - @JsonSetter(value = "masked", nulls = Nulls.SKIP) - public Builder masked(Optional> masked) { - this.masked = masked; - return this; - } - - public Builder masked(List masked) { - this.masked = Optional.ofNullable(masked); - return this; - } - - /** - *

                                  Entity types to return in plaintext.

                                  - */ - @JsonSetter(value = "plaintext", nulls = Nulls.SKIP) - public Builder plaintext(Optional> plaintext) { - this.plaintext = plaintext; - return this; - } - - public Builder plaintext(List plaintext) { - this.plaintext = Optional.ofNullable(plaintext); - return this; - } - - public Format build() { - return new Format(redacted, masked, plaintext, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java deleted file mode 100644 index 77d18a2b..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatMaskedItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatMaskedItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java deleted file mode 100644 index 0a5e97f8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatPlaintextItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatPlaintextItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java deleted file mode 100644 index 92eb291a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum FormatRedactedItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - FormatRedactedItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java new file mode 100644 index 00000000..230ddbbc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetFieldRecords.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetFieldRecords.Builder.class) +public final class GetFieldRecords { + private final Optional> fields; + + private final Optional> tokens; + + private final Optional> fileMetadata; + + private final Map additionalProperties; + + private GetFieldRecords( + Optional> fields, + Optional> tokens, + Optional> fileMetadata, + Map additionalProperties) { + this.fields = fields; + this.tokens = tokens; + this.fileMetadata = fileMetadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}. + */ + @JsonProperty("fields") + public Optional> getFields() { + return fields; + } + + /** + * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Metadata for the uploaded file, keyed by dynamic column name. + */ + @JsonProperty("fileMetadata") + public Optional> getFileMetadata() { + return fileMetadata; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetFieldRecords && equalTo((GetFieldRecords) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetFieldRecords other) { + return fields.equals(other.fields) && tokens.equals(other.tokens) && fileMetadata.equals(other.fileMetadata); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.fields, this.tokens, this.fileMetadata); + } + + @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> fields = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional> fileMetadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetFieldRecords other) { + fields(other.getFields()); + tokens(other.getTokens()); + fileMetadata(other.getFileMetadata()); + return this; + } + + /** + *

                                  Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}.

                                  + */ + @JsonSetter(value = "fields", nulls = Nulls.SKIP) + public Builder fields(Optional> fields) { + this.fields = fields; + return this; + } + + public Builder fields(Map fields) { + this.fields = Optional.ofNullable(fields); + return this; + } + + /** + *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  + */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Metadata for the uploaded file, keyed by dynamic column name.

                                  + */ + @JsonSetter(value = "fileMetadata", nulls = Nulls.SKIP) + public Builder fileMetadata(Optional> fileMetadata) { + this.fileMetadata = fileMetadata; + return this; + } + + public Builder fileMetadata(Map fileMetadata) { + this.fileMetadata = Optional.ofNullable(fileMetadata); + return this; + } + + public GetFieldRecords build() { + return new GetFieldRecords(fields, tokens, fileMetadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java new file mode 100644 index 00000000..0b9baf81 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetQueryResponse.java @@ -0,0 +1,112 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetQueryResponse.Builder.class) +public final class GetQueryResponse { + private final Optional> records; + + private final Map additionalProperties; + + private GetQueryResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records returned by the query. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetQueryResponse && equalTo((GetQueryResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetQueryResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetQueryResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Records returned by the query.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public GetQueryResponse build() { + return new GetQueryResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java new file mode 100644 index 00000000..dbe46db3 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetRequestData.java @@ -0,0 +1,324 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetRequestData.Builder.class) +public final class GetRequestData { + private final String tableName; + + private final List skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private GetRequestData( + String tableName, + List skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional> uniqueValues, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table. + */ + @JsonProperty("tableName") + public String getTableName() { + return tableName; + } + + /** + * @return Skyflow IDs of the records to return. + */ + @JsonProperty("skyflowIDs") + public List getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to redact. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to return. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return List of unique constraint values to query records by data. + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetRequestData && equalTo((GetRequestData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetRequestData other) { + return tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && uniqueValues.equals(other.uniqueValues); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowIDs, this.columnRedactions, this.columns, this.uniqueValues); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TableNameStage builder() { + return new Builder(); + } + + public interface TableNameStage { + /** + *

                                  Name of the table.

                                  + */ + _FinalStage tableName(@NotNull String tableName); + + Builder from(GetRequestData other); + } + + public interface _FinalStage { + GetRequestData build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow IDs of the records to return.

                                  + */ + _FinalStage skyflowIDs(List skyflowIDs); + + _FinalStage addSkyflowIDs(String skyflowIDs); + + _FinalStage addAllSkyflowIDs(List skyflowIDs); + + /** + *

                                  List of columns to redact.

                                  + */ + _FinalStage columnRedactions(Optional> columnRedactions); + + _FinalStage columnRedactions(List columnRedactions); + + /** + *

                                  List of columns to return.

                                  + */ + _FinalStage columns(Optional> columns); + + _FinalStage columns(List columns); + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + _FinalStage uniqueValues(Optional> uniqueValues); + + _FinalStage uniqueValues(List uniqueValues); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TableNameStage, _FinalStage { + private String tableName; + + private Optional> uniqueValues = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private List skyflowIDs = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetRequestData other) { + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

                                  Name of the table.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tableName") + public _FinalStage tableName(@NotNull String tableName) { + this.tableName = Objects.requireNonNull(tableName, "tableName must not be null"); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

                                  List of unique constraint values to query records by data.

                                  + */ + @java.lang.Override + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public _FinalStage uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + /** + *

                                  List of columns to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

                                  List of columns to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public _FinalStage columns(Optional> columns) { + this.columns = columns; + return this; + } + + /** + *

                                  List of columns to redact.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

                                  List of columns to redact.

                                  + */ + @java.lang.Override + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public _FinalStage columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllSkyflowIDs(List skyflowIDs) { + if (skyflowIDs != null) { + this.skyflowIDs.addAll(skyflowIDs); + } + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addSkyflowIDs(String skyflowIDs) { + this.skyflowIDs.add(skyflowIDs); + return this; + } + + /** + *

                                  Skyflow IDs of the records to return.

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public _FinalStage skyflowIDs(List skyflowIDs) { + this.skyflowIDs.clear(); + if (skyflowIDs != null) { + this.skyflowIDs.addAll(skyflowIDs); + } + return this; + } + + @java.lang.Override + public GetRequestData build() { + return new GetRequestData( + tableName, skyflowIDs, columnRedactions, columns, uniqueValues, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java new file mode 100644 index 00000000..fa49bbb4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetResponse.Builder.class) +public final class GetResponse { + private final List records; + + private final Map additionalProperties; + + private GetResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of fetched records. For file columns, the value in the data map is an object containing: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (non-null only when fileStatus is FAILED), url (pre-signed download URL, non-null only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL). + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetResponse && equalTo((GetResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of fetched records. For file columns, the value in the data map is an object containing: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (non-null only when fileStatus is FAILED), url (pre-signed download URL, non-null only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public GetResponse build() { + return new GetResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java new file mode 100644 index 00000000..c0fab010 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesRequestObject.java @@ -0,0 +1,151 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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 com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesRequestObject.Builder.class) +public final class GetTokensFromValuesRequestObject { + private final GoogleProtobufValue value; + + private final String tokenGroupName; + + private final Map additionalProperties; + + private GetTokensFromValuesRequestObject( + GoogleProtobufValue value, String tokenGroupName, Map additionalProperties) { + this.value = value; + this.tokenGroupName = tokenGroupName; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("value") + public GoogleProtobufValue getValue() { + return value; + } + + /** + * @return Name of the deterministic token group. + */ + @JsonProperty("tokenGroupName") + public String getTokenGroupName() { + return tokenGroupName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesRequestObject && equalTo((GetTokensFromValuesRequestObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesRequestObject other) { + return value.equals(other.value) && tokenGroupName.equals(other.tokenGroupName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.tokenGroupName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ValueStage builder() { + return new Builder(); + } + + public interface ValueStage { + TokenGroupNameStage value(@NotNull GoogleProtobufValue value); + + Builder from(GetTokensFromValuesRequestObject other); + } + + public interface TokenGroupNameStage { + /** + *

                                  Name of the deterministic token group.

                                  + */ + _FinalStage tokenGroupName(@NotNull String tokenGroupName); + } + + public interface _FinalStage { + GetTokensFromValuesRequestObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ValueStage, TokenGroupNameStage, _FinalStage { + private GoogleProtobufValue value; + + private String tokenGroupName; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetTokensFromValuesRequestObject other) { + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + return this; + } + + @java.lang.Override + @JsonSetter("value") + public TokenGroupNameStage value(@NotNull GoogleProtobufValue value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + /** + *

                                  Name of the deterministic token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("tokenGroupName") + public _FinalStage tokenGroupName(@NotNull String tokenGroupName) { + this.tokenGroupName = Objects.requireNonNull(tokenGroupName, "tokenGroupName must not be null"); + return this; + } + + @java.lang.Override + public GetTokensFromValuesRequestObject build() { + return new GetTokensFromValuesRequestObject(value, tokenGroupName, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java new file mode 100644 index 00000000..de800b47 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GetTokensFromValuesResponse.java @@ -0,0 +1,123 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetTokensFromValuesResponse.Builder.class) +public final class GetTokensFromValuesResponse { + private final List records; + + private final Map additionalProperties; + + private GetTokensFromValuesResponse( + List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Array of token result objects, one per input entry, in the same order as the request. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetTokensFromValuesResponse && equalTo((GetTokensFromValuesResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetTokensFromValuesResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetTokensFromValuesResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Array of token result objects, one per input entry, in the same order as the request.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(TokenizeResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public GetTokensFromValuesResponse build() { + return new GetTokensFromValuesResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java new file mode 100644 index 00000000..0b0efc95 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/GoogleProtobufValue.java @@ -0,0 +1,42 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import com.skyflow.generated.rest.core.WrappedAlias; + +public final class GoogleProtobufValue implements WrappedAlias { + private final Object value; + + private GoogleProtobufValue(Object value) { + this.value = value; + } + + @JsonValue + public Object get() { + return this.value; + } + + @java.lang.Override + public boolean equals(Object other) { + return this == other + || (other instanceof GoogleProtobufValue && this.value.equals(((GoogleProtobufValue) other).value)); + } + + @java.lang.Override + public int hashCode() { + return value.hashCode(); + } + + @java.lang.Override + public String toString() { + return value.toString(); + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static GoogleProtobufValue of(Object value) { + return new GoogleProtobufValue(value); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java deleted file mode 100644 index 55be5699..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = GooglerpcStatus.Builder.class) -public final class GooglerpcStatus { - private final Optional code; - - private final Optional message; - - private final Optional> details; - - private final Map additionalProperties; - - private GooglerpcStatus( - Optional code, - Optional message, - Optional> details, - Map additionalProperties) { - this.code = code; - this.message = message; - this.details = details; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("code") - public Optional getCode() { - return code; - } - - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - @JsonProperty("details") - public Optional> getDetails() { - return details; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof GooglerpcStatus && equalTo((GooglerpcStatus) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(GooglerpcStatus other) { - return code.equals(other.code) && message.equals(other.message) && details.equals(other.details); - } - - @Override - public int hashCode() { - return Objects.hash(this.code, this.message, this.details); - } - - @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 code = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional> details = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(GooglerpcStatus other) { - code(other.getCode()); - message(other.getMessage()); - details(other.getDetails()); - return this; - } - - @JsonSetter(value = "code", nulls = Nulls.SKIP) - public Builder code(Optional code) { - this.code = code; - return this; - } - - public Builder code(Integer code) { - this.code = Optional.ofNullable(code); - return this; - } - - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - @JsonSetter(value = "details", nulls = Nulls.SKIP) - public Builder details(Optional> details) { - this.details = details; - return this; - } - - public Builder details(List details) { - this.details = Optional.ofNullable(details); - return this; - } - - public GooglerpcStatus build() { - return new GooglerpcStatus(code, message, details, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java deleted file mode 100644 index c1bd23c6..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = IdentifyResponse.Builder.class) -public final class IdentifyResponse { - private final String text; - - private final Map additionalProperties; - - private IdentifyResponse(String text, Map additionalProperties) { - this.text = text; - this.additionalProperties = additionalProperties; - } - - /** - * @return Re-identified text. - */ - @JsonProperty("text") - public String getText() { - return text; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof IdentifyResponse && equalTo((IdentifyResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(IdentifyResponse other) { - return text.equals(other.text); - } - - @Override - public int hashCode() { - return Objects.hash(this.text); - } - - @Override - public String toString() { - return ObjectMappers.stringify(this); - } - - public static TextStage builder() { - return new Builder(); - } - - public interface TextStage { - /** - * Re-identified text. - */ - _FinalStage text(@NotNull String text); - - Builder from(IdentifyResponse other); - } - - public interface _FinalStage { - IdentifyResponse build(); - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TextStage, _FinalStage { - private String text; - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - @Override - public Builder from(IdentifyResponse other) { - text(other.getText()); - return this; - } - - /** - * Re-identified text.

                                  Re-identified text.

                                  - * @return Reference to {@code this} so that method calls can be chained together. - */ - @Override - @JsonSetter("text") - public _FinalStage text(@NotNull String text) { - this.text = Objects.requireNonNull(text, "text must not be null"); - return this; - } - - @Override - public IdentifyResponse build() { - return new IdentifyResponse(text, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java new file mode 100644 index 00000000..0b0ea516 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordData.java @@ -0,0 +1,176 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRecordData.Builder.class) +public final class InsertRecordData { + private final Map data; + + private final Optional tableName; + + private final Optional upsert; + + private final Map additionalProperties; + + private InsertRecordData( + Map data, + Optional tableName, + Optional upsert, + Map additionalProperties) { + this.data = data; + this.tableName = tableName; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns and values for the record. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + /** + * @return Name of the table to insert data into. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRecordData && equalTo((InsertRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRecordData other) { + return data.equals(other.data) && tableName.equals(other.tableName) && upsert.equals(other.upsert); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data, this.tableName, this.upsert); + } + + @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 Map data = new LinkedHashMap<>(); + + private Optional tableName = Optional.empty(); + + private Optional upsert = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertRecordData other) { + data(other.getData()); + tableName(other.getTableName()); + upsert(other.getUpsert()); + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder data(String key, Object value) { + this.data.put(key, value); + return this; + } + + /** + *

                                  Name of the table to insert data into.

                                  + */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public Builder upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + public Builder upsert(Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + public InsertRecordData build() { + return new InsertRecordData(data, tableName, upsert, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java new file mode 100644 index 00000000..a38b5dc1 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertRecordResponse.java @@ -0,0 +1,113 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertRecordResponse.Builder.class) +public final class InsertRecordResponse { + private final Optional> records; + + private final Map additionalProperties; + + private InsertRecordResponse( + Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Inserted records. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertRecordResponse && equalTo((InsertRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertRecordResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertRecordResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Inserted records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public InsertRecordResponse build() { + return new InsertRecordResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java new file mode 100644 index 00000000..63814444 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/InsertResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = InsertResponse.Builder.class) +public final class InsertResponse { + private final List records; + + private final Map additionalProperties; + + private InsertResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of inserted records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof InsertResponse && equalTo((InsertResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(InsertResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(InsertResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of inserted records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public InsertResponse build() { + return new InsertResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java deleted file mode 100644 index 4b95c485..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Locations.java +++ /dev/null @@ -1,188 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Locations.Builder.class) -public final class Locations { - private final Optional startIndex; - - private final Optional endIndex; - - private final Optional startIndexProcessed; - - private final Optional endIndexProcessed; - - private final Map additionalProperties; - - private Locations( - Optional startIndex, - Optional endIndex, - Optional startIndexProcessed, - Optional endIndexProcessed, - Map additionalProperties) { - this.startIndex = startIndex; - this.endIndex = endIndex; - this.startIndexProcessed = startIndexProcessed; - this.endIndexProcessed = endIndexProcessed; - this.additionalProperties = additionalProperties; - } - - /** - * @return Index of the first character of the string in the original text. - */ - @JsonProperty("start_index") - public Optional getStartIndex() { - return startIndex; - } - - /** - * @return Index of the last character of the string in the original text. - */ - @JsonProperty("end_index") - public Optional getEndIndex() { - return endIndex; - } - - /** - * @return Index of the first character of the string in the processed text. - */ - @JsonProperty("start_index_processed") - public Optional getStartIndexProcessed() { - return startIndexProcessed; - } - - /** - * @return Index of the last character of the string in the processed text. - */ - @JsonProperty("end_index_processed") - public Optional getEndIndexProcessed() { - return endIndexProcessed; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Locations && equalTo((Locations) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Locations other) { - return startIndex.equals(other.startIndex) - && endIndex.equals(other.endIndex) - && startIndexProcessed.equals(other.startIndexProcessed) - && endIndexProcessed.equals(other.endIndexProcessed); - } - - @Override - public int hashCode() { - return Objects.hash(this.startIndex, this.endIndex, this.startIndexProcessed, this.endIndexProcessed); - } - - @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 startIndex = Optional.empty(); - - private Optional endIndex = Optional.empty(); - - private Optional startIndexProcessed = Optional.empty(); - - private Optional endIndexProcessed = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Locations other) { - startIndex(other.getStartIndex()); - endIndex(other.getEndIndex()); - startIndexProcessed(other.getStartIndexProcessed()); - endIndexProcessed(other.getEndIndexProcessed()); - return this; - } - - /** - *

                                  Index of the first character of the string in the original text.

                                  - */ - @JsonSetter(value = "start_index", nulls = Nulls.SKIP) - public Builder startIndex(Optional startIndex) { - this.startIndex = startIndex; - return this; - } - - public Builder startIndex(Integer startIndex) { - this.startIndex = Optional.ofNullable(startIndex); - return this; - } - - /** - *

                                  Index of the last character of the string in the original text.

                                  - */ - @JsonSetter(value = "end_index", nulls = Nulls.SKIP) - public Builder endIndex(Optional endIndex) { - this.endIndex = endIndex; - return this; - } - - public Builder endIndex(Integer endIndex) { - this.endIndex = Optional.ofNullable(endIndex); - return this; - } - - /** - *

                                  Index of the first character of the string in the processed text.

                                  - */ - @JsonSetter(value = "start_index_processed", nulls = Nulls.SKIP) - public Builder startIndexProcessed(Optional startIndexProcessed) { - this.startIndexProcessed = startIndexProcessed; - return this; - } - - public Builder startIndexProcessed(Integer startIndexProcessed) { - this.startIndexProcessed = Optional.ofNullable(startIndexProcessed); - return this; - } - - /** - *

                                  Index of the last character of the string in the processed text.

                                  - */ - @JsonSetter(value = "end_index_processed", nulls = Nulls.SKIP) - public Builder endIndexProcessed(Optional endIndexProcessed) { - this.endIndexProcessed = endIndexProcessed; - return this; - } - - public Builder endIndexProcessed(Integer endIndexProcessed) { - this.endIndexProcessed = Optional.ofNullable(endIndexProcessed); - return this; - } - - public Locations build() { - return new Locations(startIndex, endIndex, startIndexProcessed, endIndexProcessed, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java deleted file mode 100644 index 40e73b99..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ProtobufAny.Builder.class) -public final class ProtobufAny { - private final Optional type; - - private final Map additionalProperties; - - private ProtobufAny(Optional type, Map additionalProperties) { - this.type = type; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("@type") - public Optional getType() { - return type; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ProtobufAny && equalTo((ProtobufAny) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ProtobufAny other) { - return type.equals(other.type); - } - - @Override - public int hashCode() { - return Objects.hash(this.type); - } - - @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 type = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ProtobufAny other) { - type(other.getType()); - return this; - } - - @JsonSetter(value = "@type", nulls = Nulls.SKIP) - public Builder type(Optional type) { - this.type = type; - return this; - } - - public Builder type(String type) { - this.type = Optional.ofNullable(type); - return this; - } - - public ProtobufAny build() { - return new ProtobufAny(type, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java index 17f77df6..d6c890d5 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordMetaProperties.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1RecordMetaProperties.Builder.class) -public final class V1RecordMetaProperties { +@JsonDeserialize(builder = RecordMetaProperties.Builder.class) +public final class RecordMetaProperties { private final Optional skyflowId; private final Optional> tokens; private final Map additionalProperties; - private V1RecordMetaProperties( + private RecordMetaProperties( Optional skyflowId, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1RecordMetaProperties && equalTo((V1RecordMetaProperties) other); + return other instanceof RecordMetaProperties && equalTo((RecordMetaProperties) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1RecordMetaProperties other) { + private boolean equalTo(RecordMetaProperties other) { return skyflowId.equals(other.skyflowId) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1RecordMetaProperties other) { + public Builder from(RecordMetaProperties other) { skyflowId(other.getSkyflowId()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1RecordMetaProperties build() { - return new V1RecordMetaProperties(skyflowId, tokens, additionalProperties); + public RecordMetaProperties build() { + return new RecordMetaProperties(skyflowId, tokens, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java new file mode 100644 index 00000000..a00428e2 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RecordResponseObject.java @@ -0,0 +1,448 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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 com.skyflow.generated.rest.core.Nullable; +import com.skyflow.generated.rest.core.NullableNonemptyFilter; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = RecordResponseObject.Builder.class) +public final class RecordResponseObject { + private final Optional skyflowId; + + private final Optional> tokens; + + private final Optional> data; + + private final Optional> hashedData; + + private final Optional error; + + private final int httpCode; + + private final Optional tableName; + + private final Map additionalProperties; + + private RecordResponseObject( + Optional skyflowId, + Optional> tokens, + Optional> data, + Optional> hashedData, + Optional error, + int httpCode, + Optional tableName, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tokens = tokens; + this.data = data; + this.hashedData = hashedData; + this.error = error; + this.httpCode = httpCode; + this.tableName = tableName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID for the inserted record + */ + @JsonIgnore + public Optional getSkyflowId() { + if (skyflowId == null) { + return Optional.empty(); + } + return skyflowId; + } + + /** + * @return Columns and tokens for the record. + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL). + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Columns and hashed values for the record. + */ + @JsonProperty("hashedData") + public Optional> getHashedData() { + return hashedData; + } + + /** + * @return Error message, if any. + */ + @JsonIgnore + public Optional getError() { + if (error == null) { + return Optional.empty(); + } + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public int getHttpCode() { + return httpCode; + } + + /** + * @return Name of the table that the record belongs to. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("skyflowID") + private Optional _getSkyflowId() { + return skyflowId; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("error") + private Optional _getError() { + return error; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof RecordResponseObject && equalTo((RecordResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(RecordResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tokens.equals(other.tokens) + && data.equals(other.data) + && hashedData.equals(other.hashedData) + && error.equals(other.error) + && httpCode == other.httpCode + && tableName.equals(other.tableName); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash( + this.skyflowId, this.tokens, this.data, this.hashedData, this.error, this.httpCode, this.tableName); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static HttpCodeStage builder() { + return new Builder(); + } + + public interface HttpCodeStage { + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(int httpCode); + + Builder from(RecordResponseObject other); + } + + public interface _FinalStage { + RecordResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Skyflow ID for the inserted record

                                  + */ + _FinalStage skyflowId(Optional skyflowId); + + _FinalStage skyflowId(String skyflowId); + + _FinalStage skyflowId(Nullable skyflowId); + + /** + *

                                  Columns and tokens for the record.

                                  + */ + _FinalStage tokens(Optional> tokens); + + _FinalStage tokens(Map tokens); + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + _FinalStage data(Optional> data); + + _FinalStage data(Map data); + + /** + *

                                  Columns and hashed values for the record.

                                  + */ + _FinalStage hashedData(Optional> hashedData); + + _FinalStage hashedData(Map hashedData); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + _FinalStage error(Nullable error); + + /** + *

                                  Name of the table that the record belongs to.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements HttpCodeStage, _FinalStage { + private int httpCode; + + private Optional tableName = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional> hashedData = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional skyflowId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(RecordResponseObject other) { + skyflowId(other.getSkyflowId()); + tokens(other.getTokens()); + data(other.getData()); + hashedData(other.getHashedData()); + error(other.getError()); + httpCode(other.getHttpCode()); + tableName(other.getTableName()); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("httpCode") + public _FinalStage httpCode(int httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Name of the table that the record belongs to.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table that the record belongs to.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(Nullable error) { + if (error.isNull()) { + this.error = null; + } else if (error.isEmpty()) { + this.error = Optional.empty(); + } else { + this.error = Optional.of(error.get()); + } + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Columns and hashed values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage hashedData(Map hashedData) { + this.hashedData = Optional.ofNullable(hashedData); + return this; + } + + /** + *

                                  Columns and hashed values for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "hashedData", nulls = Nulls.SKIP) + public _FinalStage hashedData(Optional> hashedData) { + this.hashedData = hashedData; + return this; + } + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

                                  Columns and values for the record. For file columns, the value is an object containing file metadata: fileName, mimeType, sizeBytes, fileStatus (PENDING | READY | FAILED | SCAN_ERROR), fileFailureReason (populated only when fileStatus is FAILED), url (pre-signed download URL, populated only when fileStatus is READY), and urlExpiresAt (UTC expiry of the URL).

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Optional> data) { + this.data = data; + return this; + } + + /** + *

                                  Columns and tokens for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

                                  Columns and tokens for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public _FinalStage tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(Nullable skyflowId) { + if (skyflowId.isNull()) { + this.skyflowId = null; + } else if (skyflowId.isEmpty()) { + this.skyflowId = Optional.empty(); + } else { + this.skyflowId = Optional.of(skyflowId.get()); + } + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

                                  Skyflow ID for the inserted record

                                  + */ + @java.lang.Override + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public _FinalStage skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + @java.lang.Override + public RecordResponseObject build() { + return new RecordResponseObject( + skyflowId, tokens, data, hashedData, error, httpCode, tableName, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java deleted file mode 100644 index 88022df8..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RedactionEnumRedaction { - DEFAULT("DEFAULT"), - - REDACTED("REDACTED"), - - MASKED("MASKED"), - - PLAIN_TEXT("PLAIN_TEXT"); - - private final String value; - - RedactionEnumRedaction(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java deleted file mode 100644 index a12660cb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifiedFileOutput.Builder.class) -public final class ReidentifiedFileOutput { - private final Optional processedFile; - - private final Optional processedFileType; - - private final Optional processedFileExtension; - - private final Map additionalProperties; - - private ReidentifiedFileOutput( - Optional processedFile, - Optional processedFileType, - Optional processedFileExtension, - Map additionalProperties) { - this.processedFile = processedFile; - this.processedFileType = processedFileType; - this.processedFileExtension = processedFileExtension; - this.additionalProperties = additionalProperties; - } - - /** - * @return File content in Base64 format. - */ - @JsonProperty("processed_file") - public Optional getProcessedFile() { - return processedFile; - } - - /** - * @return Type of the processed file. - */ - @JsonProperty("processed_file_type") - public Optional getProcessedFileType() { - return processedFileType; - } - - /** - * @return Extension of the processed file. - */ - @JsonProperty("processed_file_extension") - public Optional getProcessedFileExtension() { - return processedFileExtension; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifiedFileOutput && equalTo((ReidentifiedFileOutput) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifiedFileOutput other) { - return processedFile.equals(other.processedFile) - && processedFileType.equals(other.processedFileType) - && processedFileExtension.equals(other.processedFileExtension); - } - - @Override - public int hashCode() { - return Objects.hash(this.processedFile, this.processedFileType, this.processedFileExtension); - } - - @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 processedFile = Optional.empty(); - - private Optional processedFileType = Optional.empty(); - - private Optional processedFileExtension = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifiedFileOutput other) { - processedFile(other.getProcessedFile()); - processedFileType(other.getProcessedFileType()); - processedFileExtension(other.getProcessedFileExtension()); - return this; - } - - /** - *

                                  File content in Base64 format.

                                  - */ - @JsonSetter(value = "processed_file", nulls = Nulls.SKIP) - public Builder processedFile(Optional processedFile) { - this.processedFile = processedFile; - return this; - } - - public Builder processedFile(String processedFile) { - this.processedFile = Optional.ofNullable(processedFile); - return this; - } - - /** - *

                                  Type of the processed file.

                                  - */ - @JsonSetter(value = "processed_file_type", nulls = Nulls.SKIP) - public Builder processedFileType(Optional processedFileType) { - this.processedFileType = processedFileType; - return this; - } - - public Builder processedFileType(String processedFileType) { - this.processedFileType = Optional.ofNullable(processedFileType); - return this; - } - - /** - *

                                  Extension of the processed file.

                                  - */ - @JsonSetter(value = "processed_file_extension", nulls = Nulls.SKIP) - public Builder processedFileExtension( - Optional processedFileExtension) { - this.processedFileExtension = processedFileExtension; - return this; - } - - public Builder processedFileExtension(ReidentifiedFileOutputProcessedFileExtension processedFileExtension) { - this.processedFileExtension = Optional.ofNullable(processedFileExtension); - return this; - } - - public ReidentifiedFileOutput build() { - return new ReidentifiedFileOutput( - processedFile, processedFileType, processedFileExtension, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java deleted file mode 100644 index b99612e2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifiedFileOutputProcessedFileExtension { - MP_3("mp3"), - - WAV("wav"), - - PDF("pdf"), - - TXT("txt"), - - CSV("csv"), - - JSON("json"), - - JPG("jpg"), - - JPEG("jpeg"), - - TIF("tif"), - - TIFF("tiff"), - - PNG("png"), - - BMP("bmp"), - - XLS("xls"), - - XLSX("xlsx"), - - DOC("doc"), - - DOCX("docx"), - - PPT("ppt"), - - PPTX("pptx"), - - XML("xml"), - - DCM("dcm"); - - private final String value; - - ReidentifiedFileOutputProcessedFileExtension(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java deleted file mode 100644 index b7bc22ca..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ReidentifyFileResponse.Builder.class) -public final class ReidentifyFileResponse { - private final Optional status; - - private final Optional outputType; - - private final Optional output; - - private final Map additionalProperties; - - private ReidentifyFileResponse( - Optional status, - Optional outputType, - Optional output, - Map additionalProperties) { - this.status = status; - this.outputType = outputType; - this.output = output; - this.additionalProperties = additionalProperties; - } - - /** - * @return Status of the operation. - */ - @JsonProperty("status") - public Optional getStatus() { - return status; - } - - /** - * @return Format of the output file. - */ - @JsonProperty("output_type") - public Optional getOutputType() { - return outputType; - } - - @JsonProperty("output") - public Optional getOutput() { - return output; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ReidentifyFileResponse && equalTo((ReidentifyFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ReidentifyFileResponse other) { - return status.equals(other.status) && outputType.equals(other.outputType) && output.equals(other.output); - } - - @Override - public int hashCode() { - return Objects.hash(this.status, this.outputType, this.output); - } - - @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 status = Optional.empty(); - - private Optional outputType = Optional.empty(); - - private Optional output = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ReidentifyFileResponse other) { - status(other.getStatus()); - outputType(other.getOutputType()); - output(other.getOutput()); - return this; - } - - /** - *

                                  Status of the operation.

                                  - */ - @JsonSetter(value = "status", nulls = Nulls.SKIP) - public Builder status(Optional status) { - this.status = status; - return this; - } - - public Builder status(ReidentifyFileResponseStatus status) { - this.status = Optional.ofNullable(status); - return this; - } - - /** - *

                                  Format of the output file.

                                  - */ - @JsonSetter(value = "output_type", nulls = Nulls.SKIP) - public Builder outputType(Optional outputType) { - this.outputType = outputType; - return this; - } - - public Builder outputType(ReidentifyFileResponseOutputType outputType) { - this.outputType = Optional.ofNullable(outputType); - return this; - } - - @JsonSetter(value = "output", nulls = Nulls.SKIP) - public Builder output(Optional output) { - this.output = output; - return this; - } - - public Builder output(ReidentifiedFileOutput output) { - this.output = Optional.ofNullable(output); - return this; - } - - public ReidentifyFileResponse build() { - return new ReidentifyFileResponse(status, outputType, output, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java deleted file mode 100644 index 342e3d93..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java +++ /dev/null @@ -1,24 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifyFileResponseOutputType { - UNKNOWN("UNKNOWN"), - - BASE_64("BASE64"); - - private final String value; - - ReidentifyFileResponseOutputType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java deleted file mode 100644 index 2b6aaa85..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java +++ /dev/null @@ -1,28 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ReidentifyFileResponseStatus { - UNKNOWN("UNKNOWN"), - - FAILED("FAILED"), - - SUCCESS("SUCCESS"), - - IN_PROGRESS("IN_PROGRESS"); - - private final String value; - - ReidentifyFileResponseStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java deleted file mode 100644 index ad0a32a7..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum RequestActionType { - NONE("NONE"), - - ASSIGN("ASSIGN"), - - CREATE("CREATE"), - - DELETE("DELETE"), - - EXECUTE("EXECUTE"), - - LIST("LIST"), - - READ("READ"), - - UNASSIGN("UNASSIGN"), - - UPDATE("UPDATE"), - - VALIDATE("VALIDATE"), - - LOGIN("LOGIN"), - - ROTATE("ROTATE"), - - SCHEDULEROTATION("SCHEDULEROTATION"), - - SCHEDULEROTATIONALERT("SCHEDULEROTATIONALERT"), - - IMPORT("IMPORT"), - - GETIMPORTPARAMETERS("GETIMPORTPARAMETERS"), - - PING("PING"), - - GETCLOUDPROVIDER("GETCLOUDPROVIDER"); - - private final String value; - - RequestActionType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java deleted file mode 100644 index 37ef8cdf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = ShiftDates.Builder.class) -public final class ShiftDates { - private final Optional minDays; - - private final Optional maxDays; - - private final Optional> entityTypes; - - private final Map additionalProperties; - - private ShiftDates( - Optional minDays, - Optional maxDays, - Optional> entityTypes, - Map additionalProperties) { - this.minDays = minDays; - this.maxDays = maxDays; - this.entityTypes = entityTypes; - this.additionalProperties = additionalProperties; - } - - /** - * @return Minimum number of days to shift the date by. - */ - @JsonProperty("min_days") - public Optional getMinDays() { - return minDays; - } - - /** - * @return Maximum number of days to shift the date by. - */ - @JsonProperty("max_days") - public Optional getMaxDays() { - return maxDays; - } - - /** - * @return Entity types to shift dates for. - */ - @JsonProperty("entity_types") - public Optional> getEntityTypes() { - return entityTypes; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof ShiftDates && equalTo((ShiftDates) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(ShiftDates other) { - return minDays.equals(other.minDays) && maxDays.equals(other.maxDays) && entityTypes.equals(other.entityTypes); - } - - @Override - public int hashCode() { - return Objects.hash(this.minDays, this.maxDays, this.entityTypes); - } - - @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 minDays = Optional.empty(); - - private Optional maxDays = Optional.empty(); - - private Optional> entityTypes = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(ShiftDates other) { - minDays(other.getMinDays()); - maxDays(other.getMaxDays()); - entityTypes(other.getEntityTypes()); - return this; - } - - /** - *

                                  Minimum number of days to shift the date by.

                                  - */ - @JsonSetter(value = "min_days", nulls = Nulls.SKIP) - public Builder minDays(Optional minDays) { - this.minDays = minDays; - return this; - } - - public Builder minDays(Integer minDays) { - this.minDays = Optional.ofNullable(minDays); - return this; - } - - /** - *

                                  Maximum number of days to shift the date by.

                                  - */ - @JsonSetter(value = "max_days", nulls = Nulls.SKIP) - public Builder maxDays(Optional maxDays) { - this.maxDays = maxDays; - return this; - } - - public Builder maxDays(Integer maxDays) { - this.maxDays = Optional.ofNullable(maxDays); - return this; - } - - /** - *

                                  Entity types to shift dates for.

                                  - */ - @JsonSetter(value = "entity_types", nulls = Nulls.SKIP) - public Builder entityTypes(Optional> entityTypes) { - this.entityTypes = entityTypes; - return this; - } - - public Builder entityTypes(List entityTypes) { - this.entityTypes = Optional.ofNullable(entityTypes); - return this; - } - - public ShiftDates build() { - return new ShiftDates(minDays, maxDays, entityTypes, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java deleted file mode 100644 index a2fb5e64..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum ShiftDatesEntityTypesItem { - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"); - - private final String value; - - ShiftDatesEntityTypesItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java deleted file mode 100644 index 78df8838..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java +++ /dev/null @@ -1,212 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = StringResponseEntities.Builder.class) -public final class StringResponseEntities { - private final Optional token; - - private final Optional value; - - private final Optional location; - - private final Optional entityType; - - private final Optional> entityScores; - - private final Map additionalProperties; - - private StringResponseEntities( - Optional token, - Optional value, - Optional location, - Optional entityType, - Optional> entityScores, - Map additionalProperties) { - this.token = token; - this.value = value; - this.location = location; - this.entityType = entityType; - this.entityScores = entityScores; - this.additionalProperties = additionalProperties; - } - - /** - * @return Processed text of the entity. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - /** - * @return Original text of the entity. - */ - @JsonProperty("value") - public Optional getValue() { - return value; - } - - @JsonProperty("location") - public Optional getLocation() { - return location; - } - - /** - * @return Highest-rated label. - */ - @JsonProperty("entity_type") - public Optional getEntityType() { - return entityType; - } - - /** - * @return Labels and their scores. - */ - @JsonProperty("entity_scores") - public Optional> getEntityScores() { - return entityScores; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof StringResponseEntities && equalTo((StringResponseEntities) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(StringResponseEntities other) { - return token.equals(other.token) - && value.equals(other.value) - && location.equals(other.location) - && entityType.equals(other.entityType) - && entityScores.equals(other.entityScores); - } - - @Override - public int hashCode() { - return Objects.hash(this.token, this.value, this.location, this.entityType, this.entityScores); - } - - @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 token = Optional.empty(); - - private Optional value = Optional.empty(); - - private Optional location = Optional.empty(); - - private Optional entityType = Optional.empty(); - - private Optional> entityScores = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(StringResponseEntities other) { - token(other.getToken()); - value(other.getValue()); - location(other.getLocation()); - entityType(other.getEntityType()); - entityScores(other.getEntityScores()); - return this; - } - - /** - *

                                  Processed text of the entity.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - /** - *

                                  Original text of the entity.

                                  - */ - @JsonSetter(value = "value", nulls = Nulls.SKIP) - public Builder value(Optional value) { - this.value = value; - return this; - } - - public Builder value(String value) { - this.value = Optional.ofNullable(value); - return this; - } - - @JsonSetter(value = "location", nulls = Nulls.SKIP) - public Builder location(Optional location) { - this.location = location; - return this; - } - - public Builder location(Locations location) { - this.location = Optional.ofNullable(location); - return this; - } - - /** - *

                                  Highest-rated label.

                                  - */ - @JsonSetter(value = "entity_type", nulls = Nulls.SKIP) - public Builder entityType(Optional entityType) { - this.entityType = entityType; - return this; - } - - public Builder entityType(String entityType) { - this.entityType = Optional.ofNullable(entityType); - return this; - } - - /** - *

                                  Labels and their scores.

                                  - */ - @JsonSetter(value = "entity_scores", nulls = Nulls.SKIP) - public Builder entityScores(Optional> entityScores) { - this.entityScores = entityScores; - return this; - } - - public Builder entityScores(Map entityScores) { - this.entityScores = Optional.ofNullable(entityScores); - return this; - } - - public StringResponseEntities build() { - return new StringResponseEntities(token, value, location, entityType, entityScores, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java new file mode 100644 index 00000000..a05b6681 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenGroupRedactions.java @@ -0,0 +1,140 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenGroupRedactions.Builder.class) +public final class TokenGroupRedactions { + private final Optional tokenGroupName; + + private final Optional redaction; + + private final Map additionalProperties; + + private TokenGroupRedactions( + Optional tokenGroupName, Optional redaction, Map additionalProperties) { + this.tokenGroupName = tokenGroupName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the token group to redact. + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Name of the redaction to perform. + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenGroupRedactions && equalTo((TokenGroupRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenGroupRedactions other) { + return tokenGroupName.equals(other.tokenGroupName) && redaction.equals(other.redaction); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.tokenGroupName, this.redaction); + } + + @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 tokenGroupName = Optional.empty(); + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenGroupRedactions other) { + tokenGroupName(other.getTokenGroupName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

                                  Name of the token group to redact.

                                  + */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the redaction to perform.

                                  + */ + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public Builder redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + public Builder redaction(String redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + public TokenGroupRedactions build() { + return new TokenGroupRedactions(tokenGroupName, redaction, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java deleted file mode 100644 index b703895d..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java +++ /dev/null @@ -1,185 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = TokenTypeMapping.Builder.class) -public final class TokenTypeMapping { - private final Optional> vaultToken; - - private final Optional> entityOnly; - - private final Optional> entityUnqCounter; - - private final Optional default_; - - private final Map additionalProperties; - - private TokenTypeMapping( - Optional> vaultToken, - Optional> entityOnly, - Optional> entityUnqCounter, - Optional default_, - Map additionalProperties) { - this.vaultToken = vaultToken; - this.entityOnly = entityOnly; - this.entityUnqCounter = entityUnqCounter; - this.default_ = default_; - this.additionalProperties = additionalProperties; - } - - /** - * @return Entity types to replace with vault tokens. - */ - @JsonProperty("vault_token") - public Optional> getVaultToken() { - return vaultToken; - } - - /** - * @return Entity types to replace with entity tokens. - */ - @JsonProperty("entity_only") - public Optional> getEntityOnly() { - return entityOnly; - } - - /** - * @return Entity types to replace with entity tokens with unique counters. - */ - @JsonProperty("entity_unq_counter") - public Optional> getEntityUnqCounter() { - return entityUnqCounter; - } - - /** - * @return Default token type to generate for detected entities. - */ - @JsonProperty("default") - public Optional getDefault() { - return default_; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof TokenTypeMapping && equalTo((TokenTypeMapping) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(TokenTypeMapping other) { - return vaultToken.equals(other.vaultToken) - && entityOnly.equals(other.entityOnly) - && entityUnqCounter.equals(other.entityUnqCounter) - && default_.equals(other.default_); - } - - @Override - public int hashCode() { - return Objects.hash(this.vaultToken, this.entityOnly, this.entityUnqCounter, this.default_); - } - - @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> vaultToken = Optional.empty(); - - private Optional> entityOnly = Optional.empty(); - - private Optional> entityUnqCounter = Optional.empty(); - - private Optional default_ = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(TokenTypeMapping other) { - vaultToken(other.getVaultToken()); - entityOnly(other.getEntityOnly()); - entityUnqCounter(other.getEntityUnqCounter()); - default_(other.getDefault()); - return this; - } - - /** - *

                                  Entity types to replace with vault tokens.

                                  - */ - @JsonSetter(value = "vault_token", nulls = Nulls.SKIP) - public Builder vaultToken(Optional> vaultToken) { - this.vaultToken = vaultToken; - return this; - } - - public Builder vaultToken(List vaultToken) { - this.vaultToken = Optional.ofNullable(vaultToken); - return this; - } - - /** - *

                                  Entity types to replace with entity tokens.

                                  - */ - @JsonSetter(value = "entity_only", nulls = Nulls.SKIP) - public Builder entityOnly(Optional> entityOnly) { - this.entityOnly = entityOnly; - return this; - } - - public Builder entityOnly(List entityOnly) { - this.entityOnly = Optional.ofNullable(entityOnly); - return this; - } - - /** - *

                                  Entity types to replace with entity tokens with unique counters.

                                  - */ - @JsonSetter(value = "entity_unq_counter", nulls = Nulls.SKIP) - public Builder entityUnqCounter(Optional> entityUnqCounter) { - this.entityUnqCounter = entityUnqCounter; - return this; - } - - public Builder entityUnqCounter(List entityUnqCounter) { - this.entityUnqCounter = Optional.ofNullable(entityUnqCounter); - return this; - } - - /** - *

                                  Default token type to generate for detected entities.

                                  - */ - @JsonSetter(value = "default", nulls = Nulls.SKIP) - public Builder default_(Optional default_) { - this.default_ = default_; - return this; - } - - public Builder default_(TokenTypeMappingDefault default_) { - this.default_ = Optional.ofNullable(default_); - return this; - } - - public TokenTypeMapping build() { - return new TokenTypeMapping(vaultToken, entityOnly, entityUnqCounter, default_, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java deleted file mode 100644 index 17893bad..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingDefault { - ENTITY_UNQ_COUNTER("entity_unq_counter"), - - ENTITY_ONLY("entity_only"), - - VAULT_TOKEN("vault_token"); - - private final String value; - - TokenTypeMappingDefault(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java deleted file mode 100644 index c1daa680..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingEntityOnlyItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingEntityOnlyItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java deleted file mode 100644 index 6fcf08a9..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingEntityUnqCounterItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingEntityUnqCounterItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java deleted file mode 100644 index 1ffe9a26..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java +++ /dev/null @@ -1,160 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum TokenTypeMappingVaultTokenItem { - AGE("age"), - - BANK_ACCOUNT("bank_account"), - - CREDIT_CARD("credit_card"), - - CREDIT_CARD_EXPIRATION("credit_card_expiration"), - - CVV("cvv"), - - DATE("date"), - - DATE_INTERVAL("date_interval"), - - DOB("dob"), - - DRIVER_LICENSE("driver_license"), - - EMAIL_ADDRESS("email_address"), - - HEALTHCARE_NUMBER("healthcare_number"), - - IP_ADDRESS("ip_address"), - - LOCATION("location"), - - NAME("name"), - - NUMERICAL_PII("numerical_pii"), - - PHONE_NUMBER("phone_number"), - - SSN("ssn"), - - URL("url"), - - VEHICLE_ID("vehicle_id"), - - MEDICAL_CODE("medical_code"), - - NAME_FAMILY("name_family"), - - NAME_GIVEN("name_given"), - - ACCOUNT_NUMBER("account_number"), - - EVENT("event"), - - FILENAME("filename"), - - GENDER("gender"), - - LANGUAGE("language"), - - LOCATION_ADDRESS("location_address"), - - LOCATION_CITY("location_city"), - - LOCATION_COORDINATE("location_coordinate"), - - LOCATION_COUNTRY("location_country"), - - LOCATION_STATE("location_state"), - - LOCATION_ZIP("location_zip"), - - MARITAL_STATUS("marital_status"), - - MONEY("money"), - - NAME_MEDICAL_PROFESSIONAL("name_medical_professional"), - - OCCUPATION("occupation"), - - ORGANIZATION("organization"), - - ORGANIZATION_MEDICAL_FACILITY("organization_medical_facility"), - - ORIGIN("origin"), - - PASSPORT_NUMBER("passport_number"), - - PASSWORD("password"), - - PHYSICAL_ATTRIBUTE("physical_attribute"), - - POLITICAL_AFFILIATION("political_affiliation"), - - RELIGION("religion"), - - TIME("time"), - - USERNAME("username"), - - ZODIAC_SIGN("zodiac_sign"), - - BLOOD_TYPE("blood_type"), - - CONDITION("condition"), - - DOSE("dose"), - - DRUG("drug"), - - INJURY("injury"), - - MEDICAL_PROCESS("medical_process"), - - STATISTICS("statistics"), - - ROUTING_NUMBER("routing_number"), - - CORPORATE_ACTION("corporate_action"), - - FINANCIAL_METRIC("financial_metric"), - - PRODUCT("product"), - - TREND("trend"), - - DURATION("duration"), - - LOCATION_ADDRESS_STREET("location_address_street"), - - ALL("all"), - - SEXUALITY("sexuality"), - - EFFECT("effect"), - - PROJECT("project"), - - ORGANIZATION_ID("organization_id"), - - DAY("day"), - - MONTH("month"), - - YEAR("year"); - - private final String value; - - TokenTypeMappingVaultTokenItem(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java new file mode 100644 index 00000000..764f5af5 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordRequest.java @@ -0,0 +1,203 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRecordRequest.Builder.class) +public final class TokenizeRecordRequest { + private final Optional value; + + private final Optional table; + + private final Optional column; + + private final Optional columnGroup; + + private final Map additionalProperties; + + private TokenizeRecordRequest( + Optional value, + Optional table, + Optional column, + Optional columnGroup, + Map additionalProperties) { + this.value = value; + this.table = table; + this.column = column; + this.columnGroup = columnGroup; + this.additionalProperties = additionalProperties; + } + + /** + * @return Existing value to return a token for. Must be specified with either columnGroup or both table and column. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the table that the value belongs to. Must be specified with column. Can't be specified with columnGroup. + */ + @JsonProperty("table") + public Optional getTable() { + return table; + } + + /** + * @return Name of the column that the value belongs to. Must be specified with table. Can't be specified with columnGroup. + */ + @JsonProperty("column") + public Optional getColumn() { + return column; + } + + /** + * @return Name of the column group that the value belongs to. Can't be specified with table or column. + */ + @JsonProperty("columnGroup") + public Optional getColumnGroup() { + return columnGroup; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRecordRequest && equalTo((TokenizeRecordRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRecordRequest other) { + return value.equals(other.value) + && table.equals(other.table) + && column.equals(other.column) + && columnGroup.equals(other.columnGroup); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.table, this.column, this.columnGroup); + } + + @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 value = Optional.empty(); + + private Optional table = Optional.empty(); + + private Optional column = Optional.empty(); + + private Optional columnGroup = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizeRecordRequest other) { + value(other.getValue()); + table(other.getTable()); + column(other.getColumn()); + columnGroup(other.getColumnGroup()); + return this; + } + + /** + *

                                  Existing value to return a token for. Must be specified with either columnGroup or both table and column.

                                  + */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

                                  Name of the table that the value belongs to. Must be specified with column. Can't be specified with columnGroup.

                                  + */ + @JsonSetter(value = "table", nulls = Nulls.SKIP) + public Builder table(Optional table) { + this.table = table; + return this; + } + + public Builder table(String table) { + this.table = Optional.ofNullable(table); + return this; + } + + /** + *

                                  Name of the column that the value belongs to. Must be specified with table. Can't be specified with columnGroup.

                                  + */ + @JsonSetter(value = "column", nulls = Nulls.SKIP) + public Builder column(Optional column) { + this.column = column; + return this; + } + + public Builder column(String column) { + this.column = Optional.ofNullable(column); + return this; + } + + /** + *

                                  Name of the column group that the value belongs to. Can't be specified with table or column.

                                  + */ + @JsonSetter(value = "columnGroup", nulls = Nulls.SKIP) + public Builder columnGroup(Optional columnGroup) { + this.columnGroup = columnGroup; + return this; + } + + public Builder columnGroup(String columnGroup) { + this.columnGroup = Optional.ofNullable(columnGroup); + return this; + } + + public TokenizeRecordRequest build() { + return new TokenizeRecordRequest(value, table, column, columnGroup, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java new file mode 100644 index 00000000..9de12f17 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRecordResponse.java @@ -0,0 +1,128 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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 com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRecordResponse.Builder.class) +public final class TokenizeRecordResponse { + private final String token; + + private final Map additionalProperties; + + private TokenizeRecordResponse(String token, Map additionalProperties) { + this.token = token; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token corresponding to a value. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRecordResponse && equalTo((TokenizeRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRecordResponse other) { + return token.equals(other.token); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token corresponding to a value.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(TokenizeRecordResponse other); + } + + public interface _FinalStage { + TokenizeRecordResponse build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRecordResponse other) { + token(other.getToken()); + return this; + } + + /** + *

                                  Token corresponding to a value.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + @java.lang.Override + public TokenizeRecordResponse build() { + return new TokenizeRecordResponse(token, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java new file mode 100644 index 00000000..6cffce95 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeRequestObject.java @@ -0,0 +1,212 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeRequestObject.Builder.class) +public final class TokenizeRequestObject { + private final GoogleProtobufValue value; + + private final List tokenGroupNames; + + private final Optional token; + + private final Map additionalProperties; + + private TokenizeRequestObject( + GoogleProtobufValue value, + List tokenGroupNames, + Optional token, + Map additionalProperties) { + this.value = value; + this.tokenGroupNames = tokenGroupNames; + this.token = token; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("value") + public GoogleProtobufValue getValue() { + return value; + } + + /** + * @return Names of token groups the value might be present in. + */ + @JsonProperty("tokenGroupNames") + public List getTokenGroupNames() { + return tokenGroupNames; + } + + @JsonProperty("token") + public Optional getToken() { + return token; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeRequestObject && equalTo((TokenizeRequestObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeRequestObject other) { + return value.equals(other.value) && tokenGroupNames.equals(other.tokenGroupNames) && token.equals(other.token); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.value, this.tokenGroupNames, this.token); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static ValueStage builder() { + return new Builder(); + } + + public interface ValueStage { + _FinalStage value(@NotNull GoogleProtobufValue value); + + Builder from(TokenizeRequestObject other); + } + + public interface _FinalStage { + TokenizeRequestObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Names of token groups the value might be present in.

                                  + */ + _FinalStage tokenGroupNames(List tokenGroupNames); + + _FinalStage addTokenGroupNames(String tokenGroupNames); + + _FinalStage addAllTokenGroupNames(List tokenGroupNames); + + _FinalStage token(Optional token); + + _FinalStage token(GoogleProtobufValue token); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements ValueStage, _FinalStage { + private GoogleProtobufValue value; + + private Optional token = Optional.empty(); + + private List tokenGroupNames = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeRequestObject other) { + value(other.getValue()); + tokenGroupNames(other.getTokenGroupNames()); + token(other.getToken()); + return this; + } + + @java.lang.Override + @JsonSetter("value") + public _FinalStage value(@NotNull GoogleProtobufValue value) { + this.value = Objects.requireNonNull(value, "value must not be null"); + return this; + } + + @java.lang.Override + public _FinalStage token(GoogleProtobufValue token) { + this.token = Optional.ofNullable(token); + return this; + } + + @java.lang.Override + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public _FinalStage token(Optional token) { + this.token = token; + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addAllTokenGroupNames(List tokenGroupNames) { + if (tokenGroupNames != null) { + this.tokenGroupNames.addAll(tokenGroupNames); + } + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage addTokenGroupNames(String tokenGroupNames) { + this.tokenGroupNames.add(tokenGroupNames); + return this; + } + + /** + *

                                  Names of token groups the value might be present in.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupNames", nulls = Nulls.SKIP) + public _FinalStage tokenGroupNames(List tokenGroupNames) { + this.tokenGroupNames.clear(); + if (tokenGroupNames != null) { + this.tokenGroupNames.addAll(tokenGroupNames); + } + return this; + } + + @java.lang.Override + public TokenizeRequestObject build() { + return new TokenizeRequestObject(value, tokenGroupNames, token, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java new file mode 100644 index 00000000..739059f4 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeResponse.Builder.class) +public final class TokenizeResponse { + private final List records; + + private final Map additionalProperties; + + private TokenizeResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokens corresponding to the specified values. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeResponse && equalTo((TokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(TokenizeResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  Tokens corresponding to the specified values.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(TokenizeRecordResponse records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public TokenizeResponse build() { + return new TokenizeResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java new file mode 100644 index 00000000..70f9d9dc --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/TokenizeResponseObject.java @@ -0,0 +1,321 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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 com.skyflow.generated.rest.core.Nullable; +import com.skyflow.generated.rest.core.NullableNonemptyFilter; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = TokenizeResponseObject.Builder.class) +public final class TokenizeResponseObject { + private final String token; + + private final Optional value; + + private final Optional tokenGroupName; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private TokenizeResponseObject( + String token, + Optional value, + Optional tokenGroupName, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token that was generated. + */ + @JsonProperty("token") + public String getToken() { + return token; + } + + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Name of the token group. + */ + @JsonIgnore + public Optional getTokenGroupName() { + if (tokenGroupName == null) { + return Optional.empty(); + } + return tokenGroupName; + } + + /** + * @return Error message, if any. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response. + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NullableNonemptyFilter.class) + @JsonProperty("tokenGroupName") + private Optional _getTokenGroupName() { + return tokenGroupName; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof TokenizeResponseObject && equalTo((TokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(TokenizeResponseObject other) { + return token.equals(other.token) + && value.equals(other.value) + && tokenGroupName.equals(other.tokenGroupName) + && error.equals(other.error) + && httpCode.equals(other.httpCode); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.tokenGroupName, this.error, this.httpCode); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static TokenStage builder() { + return new Builder(); + } + + public interface TokenStage { + /** + *

                                  Token that was generated.

                                  + */ + _FinalStage token(@NotNull String token); + + Builder from(TokenizeResponseObject other); + } + + public interface _FinalStage { + TokenizeResponseObject build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + _FinalStage value(Optional value); + + _FinalStage value(GoogleProtobufValue value); + + /** + *

                                  Name of the token group.

                                  + */ + _FinalStage tokenGroupName(Optional tokenGroupName); + + _FinalStage tokenGroupName(String tokenGroupName); + + _FinalStage tokenGroupName(Nullable tokenGroupName); + + /** + *

                                  Error message, if any.

                                  + */ + _FinalStage error(Optional error); + + _FinalStage error(String error); + + /** + *

                                  HTTP status code of the response.

                                  + */ + _FinalStage httpCode(Optional httpCode); + + _FinalStage httpCode(Integer httpCode); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements TokenStage, _FinalStage { + private String token; + + private Optional httpCode = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional tokenGroupName = Optional.empty(); + + private Optional value = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(TokenizeResponseObject other) { + token(other.getToken()); + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

                                  Token that was generated.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("token") + public _FinalStage token(@NotNull String token) { + this.token = Objects.requireNonNull(token, "token must not be null"); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

                                  HTTP status code of the response.

                                  + */ + @java.lang.Override + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public _FinalStage httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + /** + *

                                  Error message, if any.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

                                  Error message, if any.

                                  + */ + @java.lang.Override + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public _FinalStage error(Optional error) { + this.error = error; + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(Nullable tokenGroupName) { + if (tokenGroupName.isNull()) { + this.tokenGroupName = null; + } else if (tokenGroupName.isEmpty()) { + this.tokenGroupName = Optional.empty(); + } else { + this.tokenGroupName = Optional.of(tokenGroupName.get()); + } + return this; + } + + /** + *

                                  Name of the token group.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

                                  Name of the token group.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public _FinalStage tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + @java.lang.Override + public _FinalStage value(GoogleProtobufValue value) { + this.value = Optional.ofNullable(value); + return this; + } + + @java.lang.Override + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public _FinalStage value(Optional value) { + this.value = value; + return this; + } + + @java.lang.Override + public TokenizeResponseObject build() { + return new TokenizeResponseObject(token, value, tokenGroupName, error, httpCode, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java deleted file mode 100644 index c9165409..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/Transformations.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = Transformations.Builder.class) -public final class Transformations { - private final Optional shiftDates; - - private final Map additionalProperties; - - private Transformations(Optional shiftDates, Map additionalProperties) { - this.shiftDates = shiftDates; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("shift_dates") - public Optional getShiftDates() { - return shiftDates; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof Transformations && equalTo((Transformations) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(Transformations other) { - return shiftDates.equals(other.shiftDates); - } - - @Override - public int hashCode() { - return Objects.hash(this.shiftDates); - } - - @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 shiftDates = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(Transformations other) { - shiftDates(other.getShiftDates()); - return this; - } - - @JsonSetter(value = "shift_dates", nulls = Nulls.SKIP) - public Builder shiftDates(Optional shiftDates) { - this.shiftDates = shiftDates; - return this; - } - - public Builder shiftDates(ShiftDates shiftDates) { - this.shiftDates = Optional.ofNullable(shiftDates); - return this; - } - - public Transformations build() { - return new Transformations(shiftDates, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java new file mode 100644 index 00000000..7c185437 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UniqueValue.java @@ -0,0 +1,121 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UniqueValue.Builder.class) +public final class UniqueValue { + private final Map data; + + private final Map additionalProperties; + + private UniqueValue(Map data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns names and values for the unique value entry. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UniqueValue && equalTo((UniqueValue) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UniqueValue other) { + return data.equals(other.data); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.data); + } + + @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 Map data = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(UniqueValue other) { + data(other.getData()); + return this; + } + + /** + *

                                  Columns names and values for the unique value entry.

                                  + */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + public Builder data(String key, Object value) { + this.data.put(key, value); + return this; + } + + public UniqueValue build() { + return new UniqueValue(data, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java new file mode 100644 index 00000000..83a11ab0 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordData.java @@ -0,0 +1,279 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateRecordData.Builder.class) +public final class UpdateRecordData { + private final String skyflowId; + + private final Map data; + + private final Optional tableName; + + private final Optional updateType; + + private final Map additionalProperties; + + private UpdateRecordData( + String skyflowId, + Map data, + Optional tableName, + Optional updateType, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.data = data; + this.tableName = tableName; + this.updateType = updateType; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID of the record to update. + */ + @JsonProperty("skyflowID") + public String getSkyflowId() { + return skyflowId; + } + + /** + * @return Columns and values for the record. + */ + @JsonProperty("data") + public Map getData() { + return data; + } + + /** + * @return Name of the table to update data in. + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateRecordData && equalTo((UpdateRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateRecordData other) { + return skyflowId.equals(other.skyflowId) + && data.equals(other.data) + && tableName.equals(other.tableName) + && updateType.equals(other.updateType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.data, this.tableName, this.updateType); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static SkyflowIdStage builder() { + return new Builder(); + } + + public interface SkyflowIdStage { + /** + *

                                  Skyflow ID of the record to update.

                                  + */ + _FinalStage skyflowId(@NotNull String skyflowId); + + Builder from(UpdateRecordData other); + } + + public interface _FinalStage { + UpdateRecordData build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + + /** + *

                                  Columns and values for the record.

                                  + */ + _FinalStage data(Map data); + + _FinalStage putAllData(Map data); + + _FinalStage data(String key, Object value); + + /** + *

                                  Name of the table to update data in.

                                  + */ + _FinalStage tableName(Optional tableName); + + _FinalStage tableName(String tableName); + + /** + *

                                  Type of update operation to perform.

                                  + */ + _FinalStage updateType(Optional updateType); + + _FinalStage updateType(UpdateRecordDataUpdateType updateType); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder implements SkyflowIdStage, _FinalStage { + private String skyflowId; + + private Optional updateType = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Map data = new LinkedHashMap<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(UpdateRecordData other) { + skyflowId(other.getSkyflowId()); + data(other.getData()); + tableName(other.getTableName()); + updateType(other.getUpdateType()); + return this; + } + + /** + *

                                  Skyflow ID of the record to update.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("skyflowID") + public _FinalStage skyflowId(@NotNull String skyflowId) { + this.skyflowId = Objects.requireNonNull(skyflowId, "skyflowId must not be null"); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage updateType(UpdateRecordDataUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @java.lang.Override + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public _FinalStage updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + /** + *

                                  Name of the table to update data in.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

                                  Name of the table to update data in.

                                  + */ + @java.lang.Override + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public _FinalStage tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage data(String key, Object value) { + this.data.put(key, value); + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + public _FinalStage putAllData(Map data) { + if (data != null) { + this.data.putAll(data); + } + return this; + } + + /** + *

                                  Columns and values for the record.

                                  + */ + @java.lang.Override + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public _FinalStage data(Map data) { + this.data.clear(); + if (data != null) { + this.data.putAll(data); + } + return this; + } + + @java.lang.Override + public UpdateRecordData build() { + return new UpdateRecordData(skyflowId, data, tableName, updateType, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java new file mode 100644 index 00000000..2fe52e9d --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordDataUpdateType.java @@ -0,0 +1,84 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpdateRecordDataUpdateType { + public static final UpdateRecordDataUpdateType REPLACE = new UpdateRecordDataUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpdateRecordDataUpdateType UPDATE = new UpdateRecordDataUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpdateRecordDataUpdateType(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 UpdateRecordDataUpdateType + && this.string.equals(((UpdateRecordDataUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpdateRecordDataUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpdateRecordDataUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java similarity index 70% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java index d2fcbf1b..a4b4fd87 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateRecordResponse.java @@ -3,25 +3,30 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1UpdateRecordResponse.Builder.class) -public final class V1UpdateRecordResponse { +@JsonDeserialize(builder = UpdateRecordResponse.Builder.class) +public final class UpdateRecordResponse { private final Optional skyflowId; private final Optional> tokens; private final Map additionalProperties; - private V1UpdateRecordResponse( + private UpdateRecordResponse( Optional skyflowId, Optional> tokens, Map additionalProperties) { @@ -46,10 +51,10 @@ public Optional> getTokens() { return tokens; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1UpdateRecordResponse && equalTo((V1UpdateRecordResponse) other); + return other instanceof UpdateRecordResponse && equalTo((UpdateRecordResponse) other); } @JsonAnyGetter @@ -57,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1UpdateRecordResponse other) { + private boolean equalTo(UpdateRecordResponse other) { return skyflowId.equals(other.skyflowId) && tokens.equals(other.tokens); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.tokens); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -86,7 +91,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1UpdateRecordResponse other) { + public Builder from(UpdateRecordResponse other) { skyflowId(other.getSkyflowId()); tokens(other.getTokens()); return this; @@ -120,8 +125,18 @@ public Builder tokens(Map tokens) { return this; } - public V1UpdateRecordResponse build() { - return new V1UpdateRecordResponse(skyflowId, tokens, additionalProperties); + public UpdateRecordResponse build() { + return new UpdateRecordResponse(skyflowId, tokens, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java new file mode 100644 index 00000000..7f509065 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpdateResponse.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = UpdateResponse.Builder.class) +public final class UpdateResponse { + private final List records; + + private final Map additionalProperties; + + private UpdateResponse(List records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of updated records. + */ + @JsonProperty("records") + public List getRecords() { + return records; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof UpdateResponse && equalTo((UpdateResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(UpdateResponse other) { + return records.equals(other.records); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.records); + } + + @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 List records = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(UpdateResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

                                  List of updated records.

                                  + */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(List records) { + this.records.clear(); + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public Builder addRecords(RecordResponseObject records) { + this.records.add(records); + return this; + } + + public Builder addAllRecords(List records) { + if (records != null) { + this.records.addAll(records); + } + return this; + } + + public UpdateResponse build() { + return new UpdateResponse(records, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java similarity index 53% rename from skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java rename to skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java index 8f5fea5a..b4d0ca27 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UploadFileResponseV2.java @@ -3,48 +3,58 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.*; +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; - import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = UploadFileV2Response.Builder.class) -public final class UploadFileV2Response { +@JsonDeserialize(builder = UploadFileResponseV2.Builder.class) +public final class UploadFileResponseV2 { private final Optional skyflowId; - private final Optional fileMetadata; + private final Optional> fileMetadata; private final Map additionalProperties; - private UploadFileV2Response( - Optional skyflowId, Optional fileMetadata, Map additionalProperties) { + private UploadFileResponseV2( + Optional skyflowId, + Optional> fileMetadata, + Map additionalProperties) { this.skyflowId = skyflowId; this.fileMetadata = fileMetadata; this.additionalProperties = additionalProperties; } /** - * @return Skyflow ID of the record the file was uploaded to. + * @return ID of the record to update. */ @JsonProperty("skyflowID") public Optional getSkyflowId() { return skyflowId; } + /** + * @return Metadata for the uploaded file with keys based on the name of the column containing the file. + */ @JsonProperty("fileMetadata") - public Optional getFileMetadata() { + public Optional> getFileMetadata() { return fileMetadata; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof UploadFileV2Response && equalTo((UploadFileV2Response) other); + return other instanceof UploadFileResponseV2 && equalTo((UploadFileResponseV2) other); } @JsonAnyGetter @@ -52,16 +62,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(UploadFileV2Response other) { + private boolean equalTo(UploadFileResponseV2 other) { return skyflowId.equals(other.skyflowId) && fileMetadata.equals(other.fileMetadata); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.skyflowId, this.fileMetadata); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -74,21 +84,21 @@ public static Builder builder() { public static final class Builder { private Optional skyflowId = Optional.empty(); - private Optional fileMetadata = Optional.empty(); + private Optional> fileMetadata = Optional.empty(); @JsonAnySetter private Map additionalProperties = new HashMap<>(); private Builder() {} - public Builder from(UploadFileV2Response other) { + public Builder from(UploadFileResponseV2 other) { skyflowId(other.getSkyflowId()); fileMetadata(other.getFileMetadata()); return this; } /** - *

                                  Skyflow ID of the record the file was uploaded to.

                                  + *

                                  ID of the record to update.

                                  */ @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) public Builder skyflowId(Optional skyflowId) { @@ -101,19 +111,32 @@ public Builder skyflowId(String skyflowId) { return this; } + /** + *

                                  Metadata for the uploaded file with keys based on the name of the column containing the file.

                                  + */ @JsonSetter(value = "fileMetadata", nulls = Nulls.SKIP) - public Builder fileMetadata(Optional fileMetadata) { + public Builder fileMetadata(Optional> fileMetadata) { this.fileMetadata = fileMetadata; return this; } - public Builder fileMetadata(Object fileMetadata) { + public Builder fileMetadata(Map fileMetadata) { this.fileMetadata = Optional.ofNullable(fileMetadata); return this; } - public UploadFileV2Response build() { - return new UploadFileV2Response(skyflowId, fileMetadata, additionalProperties); + public UploadFileResponseV2 build() { + return new UploadFileResponseV2(skyflowId, fileMetadata, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java new file mode 100644 index 00000000..d413f637 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/Upsert.java @@ -0,0 +1,154 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = Upsert.Builder.class) +public final class Upsert { + private final Optional updateType; + + private final List uniqueColumns; + + private final Map additionalProperties; + + private Upsert( + Optional updateType, + List uniqueColumns, + Map additionalProperties) { + this.updateType = updateType; + this.uniqueColumns = uniqueColumns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Type of update operation to perform. + */ + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + /** + * @return List of unique columns in the table that upsert operations use to identify if a record with matching values exists. If a matching record exists, the record updates with the specified values. If a matching record doesn't exist, the upsert operation inserts a new record. + */ + @JsonProperty("uniqueColumns") + public List getUniqueColumns() { + return uniqueColumns; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof Upsert && equalTo((Upsert) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(Upsert other) { + return updateType.equals(other.updateType) && uniqueColumns.equals(other.uniqueColumns); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.updateType, this.uniqueColumns); + } + + @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 updateType = Optional.empty(); + + private List uniqueColumns = new ArrayList<>(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(Upsert other) { + updateType(other.getUpdateType()); + uniqueColumns(other.getUniqueColumns()); + return this; + } + + /** + *

                                  Type of update operation to perform.

                                  + */ + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public Builder updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + public Builder updateType(UpsertUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

                                  List of unique columns in the table that upsert operations use to identify if a record with matching values exists. If a matching record exists, the record updates with the specified values. If a matching record doesn't exist, the upsert operation inserts a new record.

                                  + */ + @JsonSetter(value = "uniqueColumns", nulls = Nulls.SKIP) + public Builder uniqueColumns(List uniqueColumns) { + this.uniqueColumns.clear(); + if (uniqueColumns != null) { + this.uniqueColumns.addAll(uniqueColumns); + } + return this; + } + + public Builder addUniqueColumns(String uniqueColumns) { + this.uniqueColumns.add(uniqueColumns); + return this; + } + + public Builder addAllUniqueColumns(List uniqueColumns) { + if (uniqueColumns != null) { + this.uniqueColumns.addAll(uniqueColumns); + } + return this; + } + + public Upsert build() { + return new Upsert(updateType, uniqueColumns, 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/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java new file mode 100644 index 00000000..09196134 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/UpsertUpdateType.java @@ -0,0 +1,83 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; + +public final class UpsertUpdateType { + public static final UpsertUpdateType REPLACE = new UpsertUpdateType(Value.REPLACE, "REPLACE"); + + public static final UpsertUpdateType UPDATE = new UpsertUpdateType(Value.UPDATE, "UPDATE"); + + private final Value value; + + private final String string; + + UpsertUpdateType(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 UpsertUpdateType && this.string.equals(((UpsertUpdateType) other).string)); + } + + @java.lang.Override + public int hashCode() { + return this.string.hashCode(); + } + + public T visit(Visitor visitor) { + switch (value) { + case REPLACE: + return visitor.visitReplace(); + case UPDATE: + return visitor.visitUpdate(); + case UNKNOWN: + default: + return visitor.visitUnknown(string); + } + } + + @JsonCreator(mode = JsonCreator.Mode.DELEGATING) + public static UpsertUpdateType valueOf(String value) { + switch (value) { + case "REPLACE": + return REPLACE; + case "UPDATE": + return UPDATE; + default: + return new UpsertUpdateType(Value.UNKNOWN, value); + } + } + + public enum Value { + UPDATE, + + REPLACE, + + UNKNOWN + } + + public interface Visitor { + T visitUpdate(); + + T visitReplace(); + + T visitUnknown(String unknownType); + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java deleted file mode 100644 index 037b80bf..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditAfterOptions.Builder.class) -public final class V1AuditAfterOptions { - private final Optional timestamp; - - private final Optional changeId; - - private final Map additionalProperties; - - private V1AuditAfterOptions( - Optional timestamp, Optional changeId, Map additionalProperties) { - this.timestamp = timestamp; - this.changeId = changeId; - this.additionalProperties = additionalProperties; - } - - /** - * @return Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - /** - * @return Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank. - */ - @JsonProperty("changeID") - public Optional getChangeId() { - return changeId; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditAfterOptions && equalTo((V1AuditAfterOptions) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditAfterOptions other) { - return timestamp.equals(other.timestamp) && changeId.equals(other.changeId); - } - - @Override - public int hashCode() { - return Objects.hash(this.timestamp, this.changeId); - } - - @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 timestamp = Optional.empty(); - - private Optional changeId = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditAfterOptions other) { - timestamp(other.getTimestamp()); - changeId(other.getChangeId()); - return this; - } - - /** - *

                                  Timestamp provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - /** - *

                                  Change ID provided in the previous audit response's nextOps attribute. An alternate way to manage response pagination. Can't be used with sortOps or offset. For the first request in a series of audit requests, leave blank.

                                  - */ - @JsonSetter(value = "changeID", nulls = Nulls.SKIP) - public Builder changeId(Optional changeId) { - this.changeId = changeId; - return this; - } - - public Builder changeId(String changeId) { - this.changeId = Optional.ofNullable(changeId); - return this; - } - - public V1AuditAfterOptions build() { - return new V1AuditAfterOptions(timestamp, changeId, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java deleted file mode 100644 index f7ca73f0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java +++ /dev/null @@ -1,182 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditEventResponse.Builder.class) -public final class V1AuditEventResponse { - private final Optional code; - - private final Optional message; - - private final Optional data; - - private final Optional timestamp; - - private final Map additionalProperties; - - private V1AuditEventResponse( - Optional code, - Optional message, - Optional data, - Optional timestamp, - Map additionalProperties) { - this.code = code; - this.message = message; - this.data = data; - this.timestamp = timestamp; - this.additionalProperties = additionalProperties; - } - - /** - * @return The status of the overall operation. - */ - @JsonProperty("code") - public Optional getCode() { - return code; - } - - /** - * @return The status message for the overall operation. - */ - @JsonProperty("message") - public Optional getMessage() { - return message; - } - - @JsonProperty("data") - public Optional getData() { - return data; - } - - /** - * @return time when this response is generated, use extention method to set it. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditEventResponse && equalTo((V1AuditEventResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditEventResponse other) { - return code.equals(other.code) - && message.equals(other.message) - && data.equals(other.data) - && timestamp.equals(other.timestamp); - } - - @Override - public int hashCode() { - return Objects.hash(this.code, this.message, this.data, this.timestamp); - } - - @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 code = Optional.empty(); - - private Optional message = Optional.empty(); - - private Optional data = Optional.empty(); - - private Optional timestamp = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditEventResponse other) { - code(other.getCode()); - message(other.getMessage()); - data(other.getData()); - timestamp(other.getTimestamp()); - return this; - } - - /** - *

                                  The status of the overall operation.

                                  - */ - @JsonSetter(value = "code", nulls = Nulls.SKIP) - public Builder code(Optional code) { - this.code = code; - return this; - } - - public Builder code(Integer code) { - this.code = Optional.ofNullable(code); - return this; - } - - /** - *

                                  The status message for the overall operation.

                                  - */ - @JsonSetter(value = "message", nulls = Nulls.SKIP) - public Builder message(Optional message) { - this.message = message; - return this; - } - - public Builder message(String message) { - this.message = Optional.ofNullable(message); - return this; - } - - @JsonSetter(value = "data", nulls = Nulls.SKIP) - public Builder data(Optional data) { - this.data = data; - return this; - } - - public Builder data(AuditEventData data) { - this.data = Optional.ofNullable(data); - return this; - } - - /** - *

                                  time when this response is generated, use extention method to set it.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - public V1AuditEventResponse build() { - return new V1AuditEventResponse(code, message, data, timestamp, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java deleted file mode 100644 index 36d7ccce..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponse.Builder.class) -public final class V1AuditResponse { - private final Optional> event; - - private final Optional nextOps; - - private final Map additionalProperties; - - private V1AuditResponse( - Optional> event, - Optional nextOps, - Map additionalProperties) { - this.event = event; - this.nextOps = nextOps; - this.additionalProperties = additionalProperties; - } - - /** - * @return Events matching the query. - */ - @JsonProperty("event") - public Optional> getEvent() { - return event; - } - - @JsonProperty("nextOps") - public Optional getNextOps() { - return nextOps; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponse && equalTo((V1AuditResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponse other) { - return event.equals(other.event) && nextOps.equals(other.nextOps); - } - - @Override - public int hashCode() { - return Objects.hash(this.event, this.nextOps); - } - - @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> event = Optional.empty(); - - private Optional nextOps = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponse other) { - event(other.getEvent()); - nextOps(other.getNextOps()); - return this; - } - - /** - *

                                  Events matching the query.

                                  - */ - @JsonSetter(value = "event", nulls = Nulls.SKIP) - public Builder event(Optional> event) { - this.event = event; - return this; - } - - public Builder event(List event) { - this.event = Optional.ofNullable(event); - return this; - } - - @JsonSetter(value = "nextOps", nulls = Nulls.SKIP) - public Builder nextOps(Optional nextOps) { - this.nextOps = nextOps; - return this; - } - - public Builder nextOps(V1AuditAfterOptions nextOps) { - this.nextOps = Optional.ofNullable(nextOps); - return this; - } - - public V1AuditResponse build() { - return new V1AuditResponse(event, nextOps, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java deleted file mode 100644 index a54eec6c..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java +++ /dev/null @@ -1,229 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponseEvent.Builder.class) -public final class V1AuditResponseEvent { - private final Optional context; - - private final Optional request; - - private final Optional response; - - private final Optional parentAccountId; - - private final Optional accountId; - - private final Optional> resourceIDs; - - private final Map additionalProperties; - - private V1AuditResponseEvent( - Optional context, - Optional request, - Optional response, - Optional parentAccountId, - Optional accountId, - Optional> resourceIDs, - Map additionalProperties) { - this.context = context; - this.request = request; - this.response = response; - this.parentAccountId = parentAccountId; - this.accountId = accountId; - this.resourceIDs = resourceIDs; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("context") - public Optional getContext() { - return context; - } - - @JsonProperty("request") - public Optional getRequest() { - return request; - } - - @JsonProperty("response") - public Optional getResponse() { - return response; - } - - /** - * @return Parent account ID of the account that made the request, if any. - */ - @JsonProperty("parentAccountID") - public Optional getParentAccountId() { - return parentAccountId; - } - - /** - * @return ID of the account that made the request. - */ - @JsonProperty("accountID") - public Optional getAccountId() { - return accountId; - } - - /** - * @return IDs for resources involved in the event. Presented in {resourceType}/{resourceID} format. For example, VAULT/cd1d815aa09b4cbfbb803bd20349f202. - */ - @JsonProperty("resourceIDs") - public Optional> getResourceIDs() { - return resourceIDs; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponseEvent && equalTo((V1AuditResponseEvent) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponseEvent other) { - return context.equals(other.context) - && request.equals(other.request) - && response.equals(other.response) - && parentAccountId.equals(other.parentAccountId) - && accountId.equals(other.accountId) - && resourceIDs.equals(other.resourceIDs); - } - - @Override - public int hashCode() { - return Objects.hash( - this.context, this.request, this.response, this.parentAccountId, this.accountId, this.resourceIDs); - } - - @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 context = Optional.empty(); - - private Optional request = Optional.empty(); - - private Optional response = Optional.empty(); - - private Optional parentAccountId = Optional.empty(); - - private Optional accountId = Optional.empty(); - - private Optional> resourceIDs = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponseEvent other) { - context(other.getContext()); - request(other.getRequest()); - response(other.getResponse()); - parentAccountId(other.getParentAccountId()); - accountId(other.getAccountId()); - resourceIDs(other.getResourceIDs()); - return this; - } - - @JsonSetter(value = "context", nulls = Nulls.SKIP) - public Builder context(Optional context) { - this.context = context; - return this; - } - - public Builder context(AuditEventContext context) { - this.context = Optional.ofNullable(context); - return this; - } - - @JsonSetter(value = "request", nulls = Nulls.SKIP) - public Builder request(Optional request) { - this.request = request; - return this; - } - - public Builder request(V1AuditResponseEventRequest request) { - this.request = Optional.ofNullable(request); - return this; - } - - @JsonSetter(value = "response", nulls = Nulls.SKIP) - public Builder response(Optional response) { - this.response = response; - return this; - } - - public Builder response(V1AuditEventResponse response) { - this.response = Optional.ofNullable(response); - return this; - } - - /** - *

                                  Parent account ID of the account that made the request, if any.

                                  - */ - @JsonSetter(value = "parentAccountID", nulls = Nulls.SKIP) - public Builder parentAccountId(Optional parentAccountId) { - this.parentAccountId = parentAccountId; - return this; - } - - public Builder parentAccountId(String parentAccountId) { - this.parentAccountId = Optional.ofNullable(parentAccountId); - return this; - } - - /** - *

                                  ID of the account that made the request.

                                  - */ - @JsonSetter(value = "accountID", nulls = Nulls.SKIP) - public Builder accountId(Optional accountId) { - this.accountId = accountId; - return this; - } - - public Builder accountId(String accountId) { - this.accountId = Optional.ofNullable(accountId); - return this; - } - - /** - *

                                  IDs for resources involved in the event. Presented in {resourceType}/{resourceID} format. For example, VAULT/cd1d815aa09b4cbfbb803bd20349f202.

                                  - */ - @JsonSetter(value = "resourceIDs", nulls = Nulls.SKIP) - public Builder resourceIDs(Optional> resourceIDs) { - this.resourceIDs = resourceIDs; - return this; - } - - public Builder resourceIDs(List resourceIDs) { - this.resourceIDs = Optional.ofNullable(resourceIDs); - return this; - } - - public V1AuditResponseEvent build() { - return new V1AuditResponseEvent( - context, request, response, parentAccountId, accountId, resourceIDs, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java deleted file mode 100644 index 90d9c538..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java +++ /dev/null @@ -1,330 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1AuditResponseEventRequest.Builder.class) -public final class V1AuditResponseEventRequest { - private final Optional data; - - private final Optional apiName; - - private final Optional workspaceId; - - private final Optional vaultId; - - private final Optional> tags; - - private final Optional timestamp; - - private final Optional actionType; - - private final Optional resourceType; - - private final Optional httpInfo; - - private final Map additionalProperties; - - private V1AuditResponseEventRequest( - Optional data, - Optional apiName, - Optional workspaceId, - Optional vaultId, - Optional> tags, - Optional timestamp, - Optional actionType, - Optional resourceType, - Optional httpInfo, - Map additionalProperties) { - this.data = data; - this.apiName = apiName; - this.workspaceId = workspaceId; - this.vaultId = vaultId; - this.tags = tags; - this.timestamp = timestamp; - this.actionType = actionType; - this.resourceType = resourceType; - this.httpInfo = httpInfo; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("data") - public Optional getData() { - return data; - } - - /** - * @return API name. - */ - @JsonProperty("apiName") - public Optional getApiName() { - return apiName; - } - - /** - * @return The workspaceID (if any) of the request. - */ - @JsonProperty("workspaceID") - public Optional getWorkspaceId() { - return workspaceId; - } - - /** - * @return The vaultID (if any) of the request. - */ - @JsonProperty("vaultID") - public Optional getVaultId() { - return vaultId; - } - - /** - * @return Tags associated with the event. To provide better search capabilities. Like login. - */ - @JsonProperty("tags") - public Optional> getTags() { - return tags; - } - - /** - * @return time when this request is generated, use extention method to set it. - */ - @JsonProperty("timestamp") - public Optional getTimestamp() { - return timestamp; - } - - @JsonProperty("actionType") - public Optional getActionType() { - return actionType; - } - - @JsonProperty("resourceType") - public Optional getResourceType() { - return resourceType; - } - - @JsonProperty("httpInfo") - public Optional getHttpInfo() { - return httpInfo; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1AuditResponseEventRequest && equalTo((V1AuditResponseEventRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1AuditResponseEventRequest other) { - return data.equals(other.data) - && apiName.equals(other.apiName) - && workspaceId.equals(other.workspaceId) - && vaultId.equals(other.vaultId) - && tags.equals(other.tags) - && timestamp.equals(other.timestamp) - && actionType.equals(other.actionType) - && resourceType.equals(other.resourceType) - && httpInfo.equals(other.httpInfo); - } - - @Override - public int hashCode() { - return Objects.hash( - this.data, - this.apiName, - this.workspaceId, - this.vaultId, - this.tags, - this.timestamp, - this.actionType, - this.resourceType, - this.httpInfo); - } - - @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 data = Optional.empty(); - - private Optional apiName = Optional.empty(); - - private Optional workspaceId = Optional.empty(); - - private Optional vaultId = Optional.empty(); - - private Optional> tags = Optional.empty(); - - private Optional timestamp = Optional.empty(); - - private Optional actionType = Optional.empty(); - - private Optional resourceType = Optional.empty(); - - private Optional httpInfo = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1AuditResponseEventRequest other) { - data(other.getData()); - apiName(other.getApiName()); - workspaceId(other.getWorkspaceId()); - vaultId(other.getVaultId()); - tags(other.getTags()); - timestamp(other.getTimestamp()); - actionType(other.getActionType()); - resourceType(other.getResourceType()); - httpInfo(other.getHttpInfo()); - return this; - } - - @JsonSetter(value = "data", nulls = Nulls.SKIP) - public Builder data(Optional data) { - this.data = data; - return this; - } - - public Builder data(AuditEventData data) { - this.data = Optional.ofNullable(data); - return this; - } - - /** - *

                                  API name.

                                  - */ - @JsonSetter(value = "apiName", nulls = Nulls.SKIP) - public Builder apiName(Optional apiName) { - this.apiName = apiName; - return this; - } - - public Builder apiName(String apiName) { - this.apiName = Optional.ofNullable(apiName); - return this; - } - - /** - *

                                  The workspaceID (if any) of the request.

                                  - */ - @JsonSetter(value = "workspaceID", nulls = Nulls.SKIP) - public Builder workspaceId(Optional workspaceId) { - this.workspaceId = workspaceId; - return this; - } - - public Builder workspaceId(String workspaceId) { - this.workspaceId = Optional.ofNullable(workspaceId); - return this; - } - - /** - *

                                  The vaultID (if any) of the request.

                                  - */ - @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) - public Builder vaultId(Optional vaultId) { - this.vaultId = vaultId; - return this; - } - - public Builder vaultId(String vaultId) { - this.vaultId = Optional.ofNullable(vaultId); - return this; - } - - /** - *

                                  Tags associated with the event. To provide better search capabilities. Like login.

                                  - */ - @JsonSetter(value = "tags", nulls = Nulls.SKIP) - public Builder tags(Optional> tags) { - this.tags = tags; - return this; - } - - public Builder tags(List tags) { - this.tags = Optional.ofNullable(tags); - return this; - } - - /** - *

                                  time when this request is generated, use extention method to set it.

                                  - */ - @JsonSetter(value = "timestamp", nulls = Nulls.SKIP) - public Builder timestamp(Optional timestamp) { - this.timestamp = timestamp; - return this; - } - - public Builder timestamp(String timestamp) { - this.timestamp = Optional.ofNullable(timestamp); - return this; - } - - @JsonSetter(value = "actionType", nulls = Nulls.SKIP) - public Builder actionType(Optional actionType) { - this.actionType = actionType; - return this; - } - - public Builder actionType(RequestActionType actionType) { - this.actionType = Optional.ofNullable(actionType); - return this; - } - - @JsonSetter(value = "resourceType", nulls = Nulls.SKIP) - public Builder resourceType(Optional resourceType) { - this.resourceType = resourceType; - return this; - } - - public Builder resourceType(AuditEventAuditResourceType resourceType) { - this.resourceType = Optional.ofNullable(resourceType); - return this; - } - - @JsonSetter(value = "httpInfo", nulls = Nulls.SKIP) - public Builder httpInfo(Optional httpInfo) { - this.httpInfo = httpInfo; - return this; - } - - public Builder httpInfo(AuditEventHttpInfo httpInfo) { - this.httpInfo = Optional.ofNullable(httpInfo); - return this; - } - - public V1AuditResponseEventRequest build() { - return new V1AuditResponseEventRequest( - data, - apiName, - workspaceId, - vaultId, - tags, - timestamp, - actionType, - resourceType, - httpInfo, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java deleted file mode 100644 index 3f0455cc..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java +++ /dev/null @@ -1,377 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BatchRecord.Builder.class) -public final class V1BatchRecord { - private final Optional> fields; - - private final Optional tableName; - - private final Optional method; - - private final Optional batchId; - - private final Optional redaction; - - private final Optional tokenization; - - private final Optional id; - - private final Optional downloadUrl; - - private final Optional upsert; - - private final Optional> tokens; - - private final Map additionalProperties; - - private V1BatchRecord( - Optional> fields, - Optional tableName, - Optional method, - Optional batchId, - Optional redaction, - Optional tokenization, - Optional id, - Optional downloadUrl, - Optional upsert, - Optional> tokens, - Map additionalProperties) { - this.fields = fields; - this.tableName = tableName; - this.method = method; - this.batchId = batchId; - this.redaction = redaction; - this.tokenization = tokenization; - this.id = id; - this.downloadUrl = downloadUrl; - this.upsert = upsert; - this.tokens = tokens; - this.additionalProperties = additionalProperties; - } - - /** - * @return Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT. - */ - @JsonProperty("fields") - public Optional> getFields() { - return fields; - } - - /** - * @return Name of the table to perform the operation on. - */ - @JsonProperty("tableName") - public Optional getTableName() { - return tableName; - } - - @JsonProperty("method") - public Optional getMethod() { - return method; - } - - /** - * @return ID to group operations by. Operations in the same group are executed sequentially. - */ - @JsonProperty("batchID") - public Optional getBatchId() { - return batchId; - } - - @JsonProperty("redaction") - public Optional getRedaction() { - return redaction; - } - - /** - * @return If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified. - */ - @JsonProperty("tokenization") - public Optional getTokenization() { - return tokenization; - } - - /** - * @return skyflow_id for the record. Only valid when method is GET, DELETE, or PUT. - */ - @JsonProperty("ID") - public Optional getId() { - return id; - } - - /** - * @return If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean. - */ - @JsonProperty("downloadURL") - public Optional getDownloadUrl() { - return downloadUrl; - } - - /** - * @return Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST. - */ - @JsonProperty("upsert") - public Optional getUpsert() { - return upsert; - } - - /** - * @return Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}. - */ - @JsonProperty("tokens") - public Optional> getTokens() { - return tokens; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BatchRecord && equalTo((V1BatchRecord) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BatchRecord other) { - return fields.equals(other.fields) - && tableName.equals(other.tableName) - && method.equals(other.method) - && batchId.equals(other.batchId) - && redaction.equals(other.redaction) - && tokenization.equals(other.tokenization) - && id.equals(other.id) - && downloadUrl.equals(other.downloadUrl) - && upsert.equals(other.upsert) - && tokens.equals(other.tokens); - } - - @Override - public int hashCode() { - return Objects.hash( - this.fields, - this.tableName, - this.method, - this.batchId, - this.redaction, - this.tokenization, - this.id, - this.downloadUrl, - this.upsert, - this.tokens); - } - - @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> fields = Optional.empty(); - - private Optional tableName = Optional.empty(); - - private Optional method = Optional.empty(); - - private Optional batchId = Optional.empty(); - - private Optional redaction = Optional.empty(); - - private Optional tokenization = Optional.empty(); - - private Optional id = Optional.empty(); - - private Optional downloadUrl = Optional.empty(); - - private Optional upsert = Optional.empty(); - - private Optional> tokens = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BatchRecord other) { - fields(other.getFields()); - tableName(other.getTableName()); - method(other.getMethod()); - batchId(other.getBatchId()); - redaction(other.getRedaction()); - tokenization(other.getTokenization()); - id(other.getId()); - downloadUrl(other.getDownloadUrl()); - upsert(other.getUpsert()); - tokens(other.getTokens()); - return this; - } - - /** - *

                                  Field and value key pairs. For example, {'field_1':'value_1', 'field_2':'value_2'}. Only valid when method is POST or PUT.

                                  - */ - @JsonSetter(value = "fields", nulls = Nulls.SKIP) - public Builder fields(Optional> fields) { - this.fields = fields; - return this; - } - - public Builder fields(Map fields) { - this.fields = Optional.ofNullable(fields); - return this; - } - - /** - *

                                  Name of the table to perform the operation on.

                                  - */ - @JsonSetter(value = "tableName", nulls = Nulls.SKIP) - public Builder tableName(Optional tableName) { - this.tableName = tableName; - return this; - } - - public Builder tableName(String tableName) { - this.tableName = Optional.ofNullable(tableName); - return this; - } - - @JsonSetter(value = "method", nulls = Nulls.SKIP) - public Builder method(Optional method) { - this.method = method; - return this; - } - - public Builder method(BatchRecordMethod method) { - this.method = Optional.ofNullable(method); - return this; - } - - /** - *

                                  ID to group operations by. Operations in the same group are executed sequentially.

                                  - */ - @JsonSetter(value = "batchID", nulls = Nulls.SKIP) - public Builder batchId(Optional batchId) { - this.batchId = batchId; - return this; - } - - public Builder batchId(String batchId) { - this.batchId = Optional.ofNullable(batchId); - return this; - } - - @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { - this.redaction = redaction; - return this; - } - - public Builder redaction(RedactionEnumRedaction redaction) { - this.redaction = Optional.ofNullable(redaction); - return this; - } - - /** - *

                                  If true, this operation returns tokens for fields with tokenization enabled. Only applicable if skyflow_id values are specified.

                                  - */ - @JsonSetter(value = "tokenization", nulls = Nulls.SKIP) - public Builder tokenization(Optional tokenization) { - this.tokenization = tokenization; - return this; - } - - public Builder tokenization(Boolean tokenization) { - this.tokenization = Optional.ofNullable(tokenization); - return this; - } - - /** - *

                                  skyflow_id for the record. Only valid when method is GET, DELETE, or PUT.

                                  - */ - @JsonSetter(value = "ID", nulls = Nulls.SKIP) - public Builder id(Optional id) { - this.id = id; - return this; - } - - public Builder id(String id) { - this.id = Optional.ofNullable(id); - return this; - } - - /** - *

                                  If true, returns download URLs for fields with a file data type. URLs are valid for 15 minutes. If virus scanning is enabled, only returns if the file is clean.

                                  - */ - @JsonSetter(value = "downloadURL", nulls = Nulls.SKIP) - public Builder downloadUrl(Optional downloadUrl) { - this.downloadUrl = downloadUrl; - return this; - } - - public Builder downloadUrl(Boolean downloadUrl) { - this.downloadUrl = Optional.ofNullable(downloadUrl); - return this; - } - - /** - *

                                  Column that stores primary keys for upsert operations. The column must be marked as unique in the vault schema. Only valid when method is POST.

                                  - */ - @JsonSetter(value = "upsert", nulls = Nulls.SKIP) - public Builder upsert(Optional upsert) { - this.upsert = upsert; - return this; - } - - public Builder upsert(String upsert) { - this.upsert = Optional.ofNullable(upsert); - return this; - } - - /** - *

                                  Fields and tokens for the record. For example, {'field_1':'token_1', 'field_2':'token_2'}.

                                  - */ - @JsonSetter(value = "tokens", nulls = Nulls.SKIP) - public Builder tokens(Optional> tokens) { - this.tokens = tokens; - return this; - } - - public Builder tokens(Map tokens) { - this.tokens = Optional.ofNullable(tokens); - return this; - } - - public V1BatchRecord build() { - return new V1BatchRecord( - fields, - tableName, - method, - batchId, - redaction, - tokenization, - id, - downloadUrl, - upsert, - tokens, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java deleted file mode 100644 index 88c1c125..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BinListResponse.Builder.class) -public final class V1BinListResponse { - private final Optional> cardsData; - - private final Map additionalProperties; - - private V1BinListResponse(Optional> cardsData, Map additionalProperties) { - this.cardsData = cardsData; - this.additionalProperties = additionalProperties; - } - - /** - * @return Card metadata associated with the specified BIN. - */ - @JsonProperty("cards_data") - public Optional> getCardsData() { - return cardsData; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BinListResponse && equalTo((V1BinListResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BinListResponse other) { - return cardsData.equals(other.cardsData); - } - - @Override - public int hashCode() { - return Objects.hash(this.cardsData); - } - - @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> cardsData = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BinListResponse other) { - cardsData(other.getCardsData()); - return this; - } - - /** - *

                                  Card metadata associated with the specified BIN.

                                  - */ - @JsonSetter(value = "cards_data", nulls = Nulls.SKIP) - public Builder cardsData(Optional> cardsData) { - this.cardsData = cardsData; - return this; - } - - public Builder cardsData(List cardsData) { - this.cardsData = Optional.ofNullable(cardsData); - return this; - } - - public V1BinListResponse build() { - return new V1BinListResponse(cardsData, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java deleted file mode 100644 index 27878fab..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1BulkGetRecordResponse.Builder.class) -public final class V1BulkGetRecordResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1BulkGetRecordResponse(Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return The specified records. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1BulkGetRecordResponse && equalTo((V1BulkGetRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1BulkGetRecordResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @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> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1BulkGetRecordResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  The specified records.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1BulkGetRecordResponse build() { - return new V1BulkGetRecordResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java deleted file mode 100644 index bafd7a09..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1Byot { - DISABLE("DISABLE"), - - ENABLE("ENABLE"), - - ENABLE_STRICT("ENABLE_STRICT"); - - private final String value; - - V1Byot(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java deleted file mode 100644 index ba4f7349..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Card.java +++ /dev/null @@ -1,357 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1Card.Builder.class) -public final class V1Card { - private final Optional bin; - - private final Optional issuerName; - - private final Optional countryCode; - - private final Optional currency; - - private final Optional cardType; - - private final Optional cardCategory; - - private final Optional cardScheme; - - private final Optional cardLastFourDigits; - - private final Optional cardExpiry; - - private final Map additionalProperties; - - private V1Card( - Optional bin, - Optional issuerName, - Optional countryCode, - Optional currency, - Optional cardType, - Optional cardCategory, - Optional cardScheme, - Optional cardLastFourDigits, - Optional cardExpiry, - Map additionalProperties) { - this.bin = bin; - this.issuerName = issuerName; - this.countryCode = countryCode; - this.currency = currency; - this.cardType = cardType; - this.cardCategory = cardCategory; - this.cardScheme = cardScheme; - this.cardLastFourDigits = cardLastFourDigits; - this.cardExpiry = cardExpiry; - this.additionalProperties = additionalProperties; - } - - /** - * @return BIN of the card. - */ - @JsonProperty("BIN") - public Optional getBin() { - return bin; - } - - /** - * @return Name of the card issuer bank. - */ - @JsonProperty("issuer_name") - public Optional getIssuerName() { - return issuerName; - } - - /** - * @return Country code of the card. - */ - @JsonProperty("country_code") - public Optional getCountryCode() { - return countryCode; - } - - /** - * @return Currency of the card. - */ - @JsonProperty("currency") - public Optional getCurrency() { - return currency; - } - - /** - * @return Type of the card. - */ - @JsonProperty("card_type") - public Optional getCardType() { - return cardType; - } - - /** - * @return Category of the card. - */ - @JsonProperty("card_category") - public Optional getCardCategory() { - return cardCategory; - } - - /** - * @return Scheme of the card. - */ - @JsonProperty("card_scheme") - public Optional getCardScheme() { - return cardScheme; - } - - /** - * @return Last four digits of the card number. - */ - @JsonProperty("card_last_four_digits") - public Optional getCardLastFourDigits() { - return cardLastFourDigits; - } - - /** - * @return Expiry date of the card. - */ - @JsonProperty("card_expiry") - public Optional getCardExpiry() { - return cardExpiry; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1Card && equalTo((V1Card) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1Card other) { - return bin.equals(other.bin) - && issuerName.equals(other.issuerName) - && countryCode.equals(other.countryCode) - && currency.equals(other.currency) - && cardType.equals(other.cardType) - && cardCategory.equals(other.cardCategory) - && cardScheme.equals(other.cardScheme) - && cardLastFourDigits.equals(other.cardLastFourDigits) - && cardExpiry.equals(other.cardExpiry); - } - - @Override - public int hashCode() { - return Objects.hash( - this.bin, - this.issuerName, - this.countryCode, - this.currency, - this.cardType, - this.cardCategory, - this.cardScheme, - this.cardLastFourDigits, - this.cardExpiry); - } - - @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 bin = Optional.empty(); - - private Optional issuerName = Optional.empty(); - - private Optional countryCode = Optional.empty(); - - private Optional currency = Optional.empty(); - - private Optional cardType = Optional.empty(); - - private Optional cardCategory = Optional.empty(); - - private Optional cardScheme = Optional.empty(); - - private Optional cardLastFourDigits = Optional.empty(); - - private Optional cardExpiry = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1Card other) { - bin(other.getBin()); - issuerName(other.getIssuerName()); - countryCode(other.getCountryCode()); - currency(other.getCurrency()); - cardType(other.getCardType()); - cardCategory(other.getCardCategory()); - cardScheme(other.getCardScheme()); - cardLastFourDigits(other.getCardLastFourDigits()); - cardExpiry(other.getCardExpiry()); - return this; - } - - /** - *

                                  BIN of the card.

                                  - */ - @JsonSetter(value = "BIN", nulls = Nulls.SKIP) - public Builder bin(Optional bin) { - this.bin = bin; - return this; - } - - public Builder bin(String bin) { - this.bin = Optional.ofNullable(bin); - return this; - } - - /** - *

                                  Name of the card issuer bank.

                                  - */ - @JsonSetter(value = "issuer_name", nulls = Nulls.SKIP) - public Builder issuerName(Optional issuerName) { - this.issuerName = issuerName; - return this; - } - - public Builder issuerName(String issuerName) { - this.issuerName = Optional.ofNullable(issuerName); - return this; - } - - /** - *

                                  Country code of the card.

                                  - */ - @JsonSetter(value = "country_code", nulls = Nulls.SKIP) - public Builder countryCode(Optional countryCode) { - this.countryCode = countryCode; - return this; - } - - public Builder countryCode(String countryCode) { - this.countryCode = Optional.ofNullable(countryCode); - return this; - } - - /** - *

                                  Currency of the card.

                                  - */ - @JsonSetter(value = "currency", nulls = Nulls.SKIP) - public Builder currency(Optional currency) { - this.currency = currency; - return this; - } - - public Builder currency(String currency) { - this.currency = Optional.ofNullable(currency); - return this; - } - - /** - *

                                  Type of the card.

                                  - */ - @JsonSetter(value = "card_type", nulls = Nulls.SKIP) - public Builder cardType(Optional cardType) { - this.cardType = cardType; - return this; - } - - public Builder cardType(String cardType) { - this.cardType = Optional.ofNullable(cardType); - return this; - } - - /** - *

                                  Category of the card.

                                  - */ - @JsonSetter(value = "card_category", nulls = Nulls.SKIP) - public Builder cardCategory(Optional cardCategory) { - this.cardCategory = cardCategory; - return this; - } - - public Builder cardCategory(String cardCategory) { - this.cardCategory = Optional.ofNullable(cardCategory); - return this; - } - - /** - *

                                  Scheme of the card.

                                  - */ - @JsonSetter(value = "card_scheme", nulls = Nulls.SKIP) - public Builder cardScheme(Optional cardScheme) { - this.cardScheme = cardScheme; - return this; - } - - public Builder cardScheme(String cardScheme) { - this.cardScheme = Optional.ofNullable(cardScheme); - return this; - } - - /** - *

                                  Last four digits of the card number.

                                  - */ - @JsonSetter(value = "card_last_four_digits", nulls = Nulls.SKIP) - public Builder cardLastFourDigits(Optional cardLastFourDigits) { - this.cardLastFourDigits = cardLastFourDigits; - return this; - } - - public Builder cardLastFourDigits(String cardLastFourDigits) { - this.cardLastFourDigits = Optional.ofNullable(cardLastFourDigits); - return this; - } - - /** - *

                                  Expiry date of the card.

                                  - */ - @JsonSetter(value = "card_expiry", nulls = Nulls.SKIP) - public Builder cardExpiry(Optional cardExpiry) { - this.cardExpiry = cardExpiry; - return this; - } - - public Builder cardExpiry(String cardExpiry) { - this.cardExpiry = Optional.ofNullable(cardExpiry); - return this; - } - - public V1Card build() { - return new V1Card( - bin, - issuerName, - countryCode, - currency, - cardType, - cardCategory, - cardScheme, - cardLastFourDigits, - cardExpiry, - additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java deleted file mode 100644 index 4d9b24eb..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DeleteFileResponse.Builder.class) -public final class V1DeleteFileResponse { - private final Optional skyflowId; - - private final Optional deleted; - - private final Map additionalProperties; - - private V1DeleteFileResponse( - Optional skyflowId, Optional deleted, Map additionalProperties) { - this.skyflowId = skyflowId; - this.deleted = deleted; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID of the record. - */ - @JsonProperty("skyflow_id") - public Optional getSkyflowId() { - return skyflowId; - } - - /** - * @return If true, the file was deleted. - */ - @JsonProperty("deleted") - public Optional getDeleted() { - return deleted; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DeleteFileResponse && equalTo((V1DeleteFileResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DeleteFileResponse other) { - return skyflowId.equals(other.skyflowId) && deleted.equals(other.deleted); - } - - @Override - public int hashCode() { - return Objects.hash(this.skyflowId, this.deleted); - } - - @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 skyflowId = Optional.empty(); - - private Optional deleted = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DeleteFileResponse other) { - skyflowId(other.getSkyflowId()); - deleted(other.getDeleted()); - return this; - } - - /** - *

                                  ID of the record.

                                  - */ - @JsonSetter(value = "skyflow_id", nulls = Nulls.SKIP) - public Builder skyflowId(Optional skyflowId) { - this.skyflowId = skyflowId; - return this; - } - - public Builder skyflowId(String skyflowId) { - this.skyflowId = Optional.ofNullable(skyflowId); - return this; - } - - /** - *

                                  If true, the file was deleted.

                                  - */ - @JsonSetter(value = "deleted", nulls = Nulls.SKIP) - public Builder deleted(Optional deleted) { - this.deleted = deleted; - return this; - } - - public Builder deleted(Boolean deleted) { - this.deleted = Optional.ofNullable(deleted); - return this; - } - - public V1DeleteFileResponse build() { - return new V1DeleteFileResponse(skyflowId, deleted, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java deleted file mode 100644 index b6fb9cb6..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeRecordRequest.Builder.class) -public final class V1DetokenizeRecordRequest { - private final Optional token; - - private final Optional redaction; - - private final Map additionalProperties; - - private V1DetokenizeRecordRequest( - Optional token, - Optional redaction, - Map additionalProperties) { - this.token = token; - this.redaction = redaction; - this.additionalProperties = additionalProperties; - } - - /** - * @return Token that identifies the record to detokenize. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - @JsonProperty("redaction") - public Optional getRedaction() { - return redaction; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DetokenizeRecordRequest && equalTo((V1DetokenizeRecordRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DetokenizeRecordRequest other) { - return token.equals(other.token) && redaction.equals(other.redaction); - } - - @Override - public int hashCode() { - return Objects.hash(this.token, this.redaction); - } - - @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 token = Optional.empty(); - - private Optional redaction = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DetokenizeRecordRequest other) { - token(other.getToken()); - redaction(other.getRedaction()); - return this; - } - - /** - *

                                  Token that identifies the record to detokenize.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - @JsonSetter(value = "redaction", nulls = Nulls.SKIP) - public Builder redaction(Optional redaction) { - this.redaction = redaction; - return this; - } - - public Builder redaction(RedactionEnumRedaction redaction) { - this.redaction = Optional.ofNullable(redaction); - return this; - } - - public V1DetokenizeRecordRequest build() { - return new V1DetokenizeRecordRequest(token, redaction, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java deleted file mode 100644 index 53660cbe..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1DetokenizeResponse.Builder.class) -public final class V1DetokenizeResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1DetokenizeResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Records corresponding to the specified tokens. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1DetokenizeResponse && equalTo((V1DetokenizeResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1DetokenizeResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @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> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1DetokenizeResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Records corresponding to the specified tokens.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1DetokenizeResponse build() { - return new V1DetokenizeResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java deleted file mode 100644 index 02658ef2..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java +++ /dev/null @@ -1,38 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1FileAvScanStatus { - SCAN_NONE("SCAN_NONE"), - - SCAN_CLEAN("SCAN_CLEAN"), - - SCAN_INFECTED("SCAN_INFECTED"), - - SCAN_DELETED("SCAN_DELETED"), - - SCAN_ERROR("SCAN_ERROR"), - - SCAN_PENDING("SCAN_PENDING"), - - SCAN_UNSCANNABLE("SCAN_UNSCANNABLE"), - - SCAN_FILE_NOT_FOUND("SCAN_FILE_NOT_FOUND"), - - SCAN_INVALID("SCAN_INVALID"); - - private final String value; - - V1FileAvScanStatus(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java deleted file mode 100644 index 43a86ae0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetAuthTokenResponse.Builder.class) -public final class V1GetAuthTokenResponse { - private final Optional accessToken; - - private final Optional tokenType; - - private final Map additionalProperties; - - private V1GetAuthTokenResponse( - Optional accessToken, Optional tokenType, Map additionalProperties) { - this.accessToken = accessToken; - this.tokenType = tokenType; - this.additionalProperties = additionalProperties; - } - - /** - * @return AccessToken. - */ - @JsonProperty("accessToken") - public Optional getAccessToken() { - return accessToken; - } - - /** - * @return TokenType : Bearer. - */ - @JsonProperty("tokenType") - public Optional getTokenType() { - return tokenType; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetAuthTokenResponse && equalTo((V1GetAuthTokenResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetAuthTokenResponse other) { - return accessToken.equals(other.accessToken) && tokenType.equals(other.tokenType); - } - - @Override - public int hashCode() { - return Objects.hash(this.accessToken, this.tokenType); - } - - @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 accessToken = Optional.empty(); - - private Optional tokenType = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetAuthTokenResponse other) { - accessToken(other.getAccessToken()); - tokenType(other.getTokenType()); - return this; - } - - /** - *

                                  AccessToken.

                                  - */ - @JsonSetter(value = "accessToken", nulls = Nulls.SKIP) - public Builder accessToken(Optional accessToken) { - this.accessToken = accessToken; - return this; - } - - public Builder accessToken(String accessToken) { - this.accessToken = Optional.ofNullable(accessToken); - return this; - } - - /** - *

                                  TokenType : Bearer.

                                  - */ - @JsonSetter(value = "tokenType", nulls = Nulls.SKIP) - public Builder tokenType(Optional tokenType) { - this.tokenType = tokenType; - return this; - } - - public Builder tokenType(String tokenType) { - this.tokenType = Optional.ofNullable(tokenType); - return this; - } - - public V1GetAuthTokenResponse build() { - return new V1GetAuthTokenResponse(accessToken, tokenType, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java deleted file mode 100644 index 3138c766..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java +++ /dev/null @@ -1,91 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetFileScanStatusResponse.Builder.class) -public final class V1GetFileScanStatusResponse { - private final Optional avScanStatus; - - private final Map additionalProperties; - - private V1GetFileScanStatusResponse( - Optional avScanStatus, Map additionalProperties) { - this.avScanStatus = avScanStatus; - this.additionalProperties = additionalProperties; - } - - @JsonProperty("av_scan_status") - public Optional getAvScanStatus() { - return avScanStatus; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetFileScanStatusResponse && equalTo((V1GetFileScanStatusResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetFileScanStatusResponse other) { - return avScanStatus.equals(other.avScanStatus); - } - - @Override - public int hashCode() { - return Objects.hash(this.avScanStatus); - } - - @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 avScanStatus = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetFileScanStatusResponse other) { - avScanStatus(other.getAvScanStatus()); - return this; - } - - @JsonSetter(value = "av_scan_status", nulls = Nulls.SKIP) - public Builder avScanStatus(Optional avScanStatus) { - this.avScanStatus = avScanStatus; - return this; - } - - public Builder avScanStatus(V1FileAvScanStatus avScanStatus) { - this.avScanStatus = Optional.ofNullable(avScanStatus); - return this; - } - - public V1GetFileScanStatusResponse build() { - return new V1GetFileScanStatusResponse(avScanStatus, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java deleted file mode 100644 index a44b0f62..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java +++ /dev/null @@ -1,93 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetQueryResponse.Builder.class) -public final class V1GetQueryResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1GetQueryResponse(Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Records returned by the query. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1GetQueryResponse && equalTo((V1GetQueryResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1GetQueryResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @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> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1GetQueryResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Records returned by the query.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1GetQueryResponse build() { - return new V1GetQueryResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java deleted file mode 100644 index f8a00001..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1InsertRecordResponse.Builder.class) -public final class V1InsertRecordResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1InsertRecordResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Identifiers for the inserted records. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1InsertRecordResponse && equalTo((V1InsertRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1InsertRecordResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @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> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1InsertRecordResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Identifiers for the inserted records.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1InsertRecordResponse build() { - return new V1InsertRecordResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java deleted file mode 100644 index 48e96379..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java +++ /dev/null @@ -1,26 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.JsonValue; - -public enum V1MemberType { - NONE("NONE"), - - USER("USER"), - - SERVICE_ACCOUNT("SERVICE_ACCOUNT"); - - private final String value; - - V1MemberType(String value) { - this.value = value; - } - - @JsonValue - @Override - public String toString() { - return this.value; - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java deleted file mode 100644 index 43fe264a..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeRecordRequest.Builder.class) -public final class V1TokenizeRecordRequest { - private final Optional value; - - private final Optional columnGroup; - - private final Map additionalProperties; - - private V1TokenizeRecordRequest( - Optional value, Optional columnGroup, Map additionalProperties) { - this.value = value; - this.columnGroup = columnGroup; - this.additionalProperties = additionalProperties; - } - - /** - * @return Existing value to return a token for. - */ - @JsonProperty("value") - public Optional getValue() { - return value; - } - - /** - * @return Name of the column group that the value belongs to. - */ - @JsonProperty("columnGroup") - public Optional getColumnGroup() { - return columnGroup; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeRecordRequest && equalTo((V1TokenizeRecordRequest) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeRecordRequest other) { - return value.equals(other.value) && columnGroup.equals(other.columnGroup); - } - - @Override - public int hashCode() { - return Objects.hash(this.value, this.columnGroup); - } - - @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 value = Optional.empty(); - - private Optional columnGroup = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeRecordRequest other) { - value(other.getValue()); - columnGroup(other.getColumnGroup()); - return this; - } - - /** - *

                                  Existing value to return a token for.

                                  - */ - @JsonSetter(value = "value", nulls = Nulls.SKIP) - public Builder value(Optional value) { - this.value = value; - return this; - } - - public Builder value(String value) { - this.value = Optional.ofNullable(value); - return this; - } - - /** - *

                                  Name of the column group that the value belongs to.

                                  - */ - @JsonSetter(value = "columnGroup", nulls = Nulls.SKIP) - public Builder columnGroup(Optional columnGroup) { - this.columnGroup = columnGroup; - return this; - } - - public Builder columnGroup(String columnGroup) { - this.columnGroup = Optional.ofNullable(columnGroup); - return this; - } - - public V1TokenizeRecordRequest build() { - return new V1TokenizeRecordRequest(value, columnGroup, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java deleted file mode 100644 index 66721fa1..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeRecordResponse.Builder.class) -public final class V1TokenizeRecordResponse { - private final Optional token; - - private final Map additionalProperties; - - private V1TokenizeRecordResponse(Optional token, Map additionalProperties) { - this.token = token; - this.additionalProperties = additionalProperties; - } - - /** - * @return Token corresponding to a value. - */ - @JsonProperty("token") - public Optional getToken() { - return token; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeRecordResponse && equalTo((V1TokenizeRecordResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeRecordResponse other) { - return token.equals(other.token); - } - - @Override - public int hashCode() { - return Objects.hash(this.token); - } - - @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 token = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeRecordResponse other) { - token(other.getToken()); - return this; - } - - /** - *

                                  Token corresponding to a value.

                                  - */ - @JsonSetter(value = "token", nulls = Nulls.SKIP) - public Builder token(Optional token) { - this.token = token; - return this; - } - - public Builder token(String token) { - this.token = Optional.ofNullable(token); - return this; - } - - public V1TokenizeRecordResponse build() { - return new V1TokenizeRecordResponse(token, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java deleted file mode 100644 index 05e64bc0..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java +++ /dev/null @@ -1,94 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.*; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1TokenizeResponse.Builder.class) -public final class V1TokenizeResponse { - private final Optional> records; - - private final Map additionalProperties; - - private V1TokenizeResponse( - Optional> records, Map additionalProperties) { - this.records = records; - this.additionalProperties = additionalProperties; - } - - /** - * @return Tokens corresponding to the specified values. - */ - @JsonProperty("records") - public Optional> getRecords() { - return records; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1TokenizeResponse && equalTo((V1TokenizeResponse) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1TokenizeResponse other) { - return records.equals(other.records); - } - - @Override - public int hashCode() { - return Objects.hash(this.records); - } - - @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> records = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1TokenizeResponse other) { - records(other.getRecords()); - return this; - } - - /** - *

                                  Tokens corresponding to the specified values.

                                  - */ - @JsonSetter(value = "records", nulls = Nulls.SKIP) - public Builder records(Optional> records) { - this.records = records; - return this; - } - - public Builder records(List records) { - this.records = Optional.ofNullable(records); - return this; - } - - public V1TokenizeResponse build() { - return new V1TokenizeResponse(records, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java deleted file mode 100644 index 6fc09854..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java +++ /dev/null @@ -1,158 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1VaultFieldMapping.Builder.class) -public final class V1VaultFieldMapping { - private final Optional cardNumber; - - private final Optional cardLastFourDigits; - - private final Optional cardExpiry; - - private final Map additionalProperties; - - private V1VaultFieldMapping( - Optional cardNumber, - Optional cardLastFourDigits, - Optional cardExpiry, - Map additionalProperties) { - this.cardNumber = cardNumber; - this.cardLastFourDigits = cardLastFourDigits; - this.cardExpiry = cardExpiry; - this.additionalProperties = additionalProperties; - } - - /** - * @return Name of the column that stores the card number. - */ - @JsonProperty("card_number") - public Optional getCardNumber() { - return cardNumber; - } - - /** - * @return Name of the column that stores the card number suffix. - */ - @JsonProperty("card_last_four_digits") - public Optional getCardLastFourDigits() { - return cardLastFourDigits; - } - - /** - * @return Name of the column that stores the expiry date. - */ - @JsonProperty("card_expiry") - public Optional getCardExpiry() { - return cardExpiry; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1VaultFieldMapping && equalTo((V1VaultFieldMapping) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1VaultFieldMapping other) { - return cardNumber.equals(other.cardNumber) - && cardLastFourDigits.equals(other.cardLastFourDigits) - && cardExpiry.equals(other.cardExpiry); - } - - @Override - public int hashCode() { - return Objects.hash(this.cardNumber, this.cardLastFourDigits, this.cardExpiry); - } - - @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 cardNumber = Optional.empty(); - - private Optional cardLastFourDigits = Optional.empty(); - - private Optional cardExpiry = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1VaultFieldMapping other) { - cardNumber(other.getCardNumber()); - cardLastFourDigits(other.getCardLastFourDigits()); - cardExpiry(other.getCardExpiry()); - return this; - } - - /** - *

                                  Name of the column that stores the card number.

                                  - */ - @JsonSetter(value = "card_number", nulls = Nulls.SKIP) - public Builder cardNumber(Optional cardNumber) { - this.cardNumber = cardNumber; - return this; - } - - public Builder cardNumber(String cardNumber) { - this.cardNumber = Optional.ofNullable(cardNumber); - return this; - } - - /** - *

                                  Name of the column that stores the card number suffix.

                                  - */ - @JsonSetter(value = "card_last_four_digits", nulls = Nulls.SKIP) - public Builder cardLastFourDigits(Optional cardLastFourDigits) { - this.cardLastFourDigits = cardLastFourDigits; - return this; - } - - public Builder cardLastFourDigits(String cardLastFourDigits) { - this.cardLastFourDigits = Optional.ofNullable(cardLastFourDigits); - return this; - } - - /** - *

                                  Name of the column that stores the expiry date.

                                  - */ - @JsonSetter(value = "card_expiry", nulls = Nulls.SKIP) - public Builder cardExpiry(Optional cardExpiry) { - this.cardExpiry = cardExpiry; - return this; - } - - public Builder cardExpiry(String cardExpiry) { - this.cardExpiry = Optional.ofNullable(cardExpiry); - return this; - } - - public V1VaultFieldMapping build() { - return new V1VaultFieldMapping(cardNumber, cardLastFourDigits, cardExpiry, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java deleted file mode 100644 index 1542ab0f..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java +++ /dev/null @@ -1,150 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1VaultSchemaConfig.Builder.class) -public final class V1VaultSchemaConfig { - private final Optional id; - - private final Optional tableName; - - private final Optional mapping; - - private final Map additionalProperties; - - private V1VaultSchemaConfig( - Optional id, - Optional tableName, - Optional mapping, - Map additionalProperties) { - this.id = id; - this.tableName = tableName; - this.mapping = mapping; - this.additionalProperties = additionalProperties; - } - - /** - * @return ID of the vault that stores card details. - */ - @JsonProperty("id") - public Optional getId() { - return id; - } - - /** - * @return Name of the table that stores card details. - */ - @JsonProperty("table_name") - public Optional getTableName() { - return tableName; - } - - @JsonProperty("mapping") - public Optional getMapping() { - return mapping; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof V1VaultSchemaConfig && equalTo((V1VaultSchemaConfig) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(V1VaultSchemaConfig other) { - return id.equals(other.id) && tableName.equals(other.tableName) && mapping.equals(other.mapping); - } - - @Override - public int hashCode() { - return Objects.hash(this.id, this.tableName, this.mapping); - } - - @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 id = Optional.empty(); - - private Optional tableName = Optional.empty(); - - private Optional mapping = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(V1VaultSchemaConfig other) { - id(other.getId()); - tableName(other.getTableName()); - mapping(other.getMapping()); - return this; - } - - /** - *

                                  ID of the vault that stores card details.

                                  - */ - @JsonSetter(value = "id", nulls = Nulls.SKIP) - public Builder id(Optional id) { - this.id = id; - return this; - } - - public Builder id(String id) { - this.id = Optional.ofNullable(id); - return this; - } - - /** - *

                                  Name of the table that stores card details.

                                  - */ - @JsonSetter(value = "table_name", nulls = Nulls.SKIP) - public Builder tableName(Optional tableName) { - this.tableName = tableName; - return this; - } - - public Builder tableName(String tableName) { - this.tableName = Optional.ofNullable(tableName); - return this; - } - - @JsonSetter(value = "mapping", nulls = Nulls.SKIP) - public Builder mapping(Optional mapping) { - this.mapping = mapping; - return this; - } - - public Builder mapping(V1VaultFieldMapping mapping) { - this.mapping = Optional.ofNullable(mapping); - return this; - } - - public V1VaultSchemaConfig build() { - return new V1VaultSchemaConfig(id, tableName, mapping, additionalProperties); - } - } -} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java deleted file mode 100644 index 314b5942..00000000 --- a/skyvault/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.rest.types; - -import com.fasterxml.jackson.annotation.*; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -@JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = WordCharacterCount.Builder.class) -public final class WordCharacterCount { - private final Optional wordCount; - - private final Optional characterCount; - - private final Map additionalProperties; - - private WordCharacterCount( - Optional wordCount, Optional characterCount, Map additionalProperties) { - this.wordCount = wordCount; - this.characterCount = characterCount; - this.additionalProperties = additionalProperties; - } - - /** - * @return Number of words in the processed text. - */ - @JsonProperty("wordCount") - public Optional getWordCount() { - return wordCount; - } - - /** - * @return Number of characters in the processed text. - */ - @JsonProperty("characterCount") - public Optional getCharacterCount() { - return characterCount; - } - - @Override - public boolean equals(Object other) { - if (this == other) return true; - return other instanceof WordCharacterCount && equalTo((WordCharacterCount) other); - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - private boolean equalTo(WordCharacterCount other) { - return wordCount.equals(other.wordCount) && characterCount.equals(other.characterCount); - } - - @Override - public int hashCode() { - return Objects.hash(this.wordCount, this.characterCount); - } - - @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 wordCount = Optional.empty(); - - private Optional characterCount = Optional.empty(); - - @JsonAnySetter - private Map additionalProperties = new HashMap<>(); - - private Builder() {} - - public Builder from(WordCharacterCount other) { - wordCount(other.getWordCount()); - characterCount(other.getCharacterCount()); - return this; - } - - /** - *

                                  Number of words in the processed text.

                                  - */ - @JsonSetter(value = "wordCount", nulls = Nulls.SKIP) - public Builder wordCount(Optional wordCount) { - this.wordCount = wordCount; - return this; - } - - public Builder wordCount(Integer wordCount) { - this.wordCount = Optional.ofNullable(wordCount); - return this; - } - - /** - *

                                  Number of characters in the processed text.

                                  - */ - @JsonSetter(value = "characterCount", nulls = Nulls.SKIP) - public Builder characterCount(Optional characterCount) { - this.characterCount = characterCount; - return this; - } - - public Builder characterCount(Integer characterCount) { - this.characterCount = Optional.ofNullable(characterCount); - return this; - } - - public WordCharacterCount build() { - return new WordCharacterCount(wordCount, characterCount, additionalProperties); - } - } -} From 91085f13aac9f71628aacd71e090a8e44008e28c Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 17:39:09 +0530 Subject: [PATCH 17/41] SK-3175 updated skyvault generated code --- flowvault/README.md | 2 +- skyvault/api-report/skyflow-java.baseline.jar | Bin 1373082 -> 1214677 bytes .../main/java/com/skyflow/VaultClient.java | 82 ++-- .../resources/files/AsyncFilesClient.java | 9 +- .../resources/files/AsyncRawFilesClient.java | 14 +- .../rest/resources/files/FilesClient.java | 9 +- .../rest/resources/files/RawFilesClient.java | 14 +- .../files/requests/UploadFileRequestV2.java | 44 +-- .../rest/types/RedactionEnumRedaction.java | 28 ++ .../skyflow/generated/rest/types/V1Byot.java | 26 ++ .../types/V1DetokenizeRecordResponse.java | 182 +++++++++ .../vault/controller/VaultController.java | 142 ++++--- .../tokens/DetokenizeRecordResponse.java | 30 +- .../com/skyflow/RequestFidelityTests.java | 354 +++++++++--------- .../java/com/skyflow/VaultClientTests.java | 41 +- .../controller/VaultControllerTests.java | 227 ++++++----- .../skyflow/vault/tokens/DetokenizeTests.java | 27 +- 17 files changed, 745 insertions(+), 486 deletions(-) create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java create mode 100644 skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java diff --git a/flowvault/README.md b/flowvault/README.md index 589e7107..378de9a0 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1896,7 +1896,7 @@ if (response.getValidation() == GuardrailsValidation.FAILED) { All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java) [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Custom Request Headers diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index da729c8793f74d796093dbc51159c28932ad6b0b..dc2ace2b0c194a0cf1a0cf8d0b503b619f8a5997 100644 GIT binary patch delta 516426 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
-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 z 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ͳds+qI#SnpZr$p_zRl`86SV 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%0D@TB+*bB{o@>RNq& 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�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

Name of the column that contains the file.

*/ - FileStage columnName(@NotNull String columnName); - } - - public interface FileStage { - /** - *

Path of the file to upload. Each request only supports one file.

- */ - _FinalStage file(@NotNull String file); + _FinalStage columnName(@NotNull String columnName); } public interface _FinalStage { @@ -167,13 +147,11 @@ public interface _FinalStage { } @JsonIgnoreProperties(ignoreUnknown = true) - public static final class Builder implements TableNameStage, ColumnNameStage, FileStage, _FinalStage { + public static final class Builder implements TableNameStage, ColumnNameStage, _FinalStage { private String tableName; private String columnName; - private String file; - private Optional returnFileMetadata = Optional.empty(); private Optional skyflowId = Optional.empty(); @@ -188,7 +166,6 @@ public Builder from(UploadFileRequestV2 other) { tableName(other.getTableName()); columnName(other.getColumnName()); skyflowId(other.getSkyflowId()); - file(other.getFile()); returnFileMetadata(other.getReturnFileMetadata()); return this; } @@ -210,22 +187,11 @@ public ColumnNameStage tableName(@NotNull String tableName) { */ @java.lang.Override @JsonSetter("columnName") - public FileStage columnName(@NotNull String columnName) { + public _FinalStage columnName(@NotNull String columnName) { this.columnName = Objects.requireNonNull(columnName, "columnName must not be null"); return this; } - /** - *

Path of the file to upload. Each request only supports one file.

- * @return Reference to {@code this} so that method calls can be chained together. - */ - @java.lang.Override - @JsonSetter("file") - public _FinalStage file(@NotNull String file) { - this.file = Objects.requireNonNull(file, "file must not be null"); - return this; - } - /** *

If true, returns metadata about the uploaded file.

* @return Reference to {@code this} so that method calls can be chained together. @@ -269,7 +235,7 @@ public _FinalStage skyflowId(Optional skyflowId) { @java.lang.Override public UploadFileRequestV2 build() { return new UploadFileRequestV2( - tableName, columnName, skyflowId, file, returnFileMetadata, additionalProperties); + tableName, columnName, skyflowId, returnFileMetadata, additionalProperties); } @java.lang.Override diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java new file mode 100644 index 00000000..88022df8 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java @@ -0,0 +1,28 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum RedactionEnumRedaction { + DEFAULT("DEFAULT"), + + REDACTED("REDACTED"), + + MASKED("MASKED"), + + PLAIN_TEXT("PLAIN_TEXT"); + + private final String value; + + RedactionEnumRedaction(String value) { + this.value = value; + } + + @JsonValue + @Override + public String toString() { + return this.value; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java new file mode 100644 index 00000000..bafd7a09 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1Byot.java @@ -0,0 +1,26 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum V1Byot { + DISABLE("DISABLE"), + + ENABLE("ENABLE"), + + ENABLE_STRICT("ENABLE_STRICT"); + + private final String value; + + V1Byot(String value) { + this.value = value; + } + + @JsonValue + @Override + public String toString() { + return this.value; + } +} diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java new file mode 100644 index 00000000..dd3a9c1f --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java @@ -0,0 +1,182 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DetokenizeRecordResponse.Builder.class) +public final class V1DetokenizeRecordResponse { + private final Optional token; + + private final Optional valueType; + + private final Optional value; + + private final Optional error; + + private final Map additionalProperties; + + private V1DetokenizeRecordResponse( + Optional token, + Optional valueType, + Optional value, + Optional error, + Map additionalProperties) { + this.token = token; + this.valueType = valueType; + this.value = value; + this.error = error; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token of the record. + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + @JsonProperty("valueType") + public Optional getValueType() { + return valueType; + } + + /** + * @return Data corresponding to the token. + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Error if token isn't found. + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DetokenizeRecordResponse && equalTo((V1DetokenizeRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DetokenizeRecordResponse other) { + return token.equals(other.token) + && valueType.equals(other.valueType) + && value.equals(other.value) + && error.equals(other.error); + } + + @Override + public int hashCode() { + return Objects.hash(this.token, this.valueType, this.value, this.error); + } + + @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 token = Optional.empty(); + + private Optional valueType = Optional.empty(); + + private Optional value = Optional.empty(); + + private Optional error = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DetokenizeRecordResponse other) { + token(other.getToken()); + valueType(other.getValueType()); + value(other.getValue()); + error(other.getError()); + return this; + } + + /** + *

Token of the record.

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(String token) { + this.token = Optional.ofNullable(token); + return this; + } + + @JsonSetter(value = "valueType", nulls = Nulls.SKIP) + public Builder valueType(Optional valueType) { + this.valueType = valueType; + return this; + } + + public Builder valueType(DetokenizeRecordResponseValueType valueType) { + this.valueType = Optional.ofNullable(valueType); + return this; + } + + /** + *

Data corresponding to the token.

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

Error if token isn't found.

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + public V1DetokenizeRecordResponse build() { + return new V1DetokenizeRecordResponse(token, valueType, value, error, additionalProperties); + } + } +} diff --git a/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java b/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java index 94d081a3..b3f9623b 100644 --- a/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java +++ b/skyvault/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -27,30 +27,28 @@ import com.skyflow.generated.rest.core.ApiClientException; import com.skyflow.generated.rest.core.ApiClientHttpResponse; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1RecordMetaProperties; -import com.skyflow.generated.rest.types.V1TokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.RecordMetaProperties; +import com.skyflow.generated.rest.types.TokenizeRecordResponse; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.UploadFileResponseV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.Constants; @@ -136,7 +134,7 @@ private static synchronized HashMap getFormattedBatchInsertRecor return insertRecord; } - private static synchronized HashMap getFormattedBulkInsertRecord(V1RecordMetaProperties record) { + private static synchronized HashMap getFormattedBulkInsertRecord(RecordMetaProperties record) { HashMap insertRecord = new HashMap<>(); if (record.getSkyflowId().isPresent()) { insertRecord.put("skyflowId", record.getSkyflowId().get()); @@ -149,7 +147,7 @@ private static synchronized HashMap getFormattedBulkInsertRecord return insertRecord; } - private static synchronized HashMap getFormattedGetRecord(V1FieldRecords record) { + private static synchronized HashMap getFormattedGetRecord(GetFieldRecords record) { HashMap getRecord = new HashMap<>(); Optional> fieldsOpt = record.getFields(); @@ -169,7 +167,7 @@ private static synchronized HashMap getFormattedGetRecord(V1Fiel return getRecord; } - private static synchronized HashMap getFormattedUpdateRecord(V1UpdateRecordResponse record) { + private static synchronized HashMap getFormattedUpdateRecord(UpdateRecordResponse record) { HashMap updateTokens = new HashMap<>(); record.getSkyflowId().ifPresent(skyflowId -> updateTokens.put("skyflowId", skyflowId)); @@ -179,7 +177,7 @@ private static synchronized HashMap getFormattedUpdateRecord(V1U return updateTokens; } - private static synchronized HashMap getFormattedQueryRecord(V1FieldRecords record) { + private static synchronized HashMap getFormattedQueryRecord(FieldRecords record) { HashMap queryRecord = new HashMap<>(); Optional> fieldsOpt = record.getFields(); if (fieldsOpt.isPresent()) { @@ -197,8 +195,8 @@ private static synchronized HashMap getFormattedQueryRecord(V1Fi @Override public InsertResponse insert(InsertRequest insertRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); - V1InsertRecordResponse bulkInsertResult = null; - ApiClientHttpResponse batchInsertResult = null; + InsertRecordResponse bulkInsertResult = null; + ApiClientHttpResponse batchInsertResult = null; ArrayList> insertedFields = new ArrayList<>(); ArrayList> errorFields = new ArrayList<>(); try { @@ -207,9 +205,9 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio Boolean continueOnError = insertRequest.getContinueOnError(); setBearerToken(); if (continueOnError) { - RecordServiceBatchOperationBody insertBody = super.getBatchInsertRequestBody(insertRequest); + BatchOperationRequest insertBody = super.getBatchInsertRequestBody(insertRequest); RequestOptions requestOptions = buildRequestOptions(); - batchInsertResult = super.getRecordsApi().withRawResponse().recordServiceBatchOperation(super.getVaultConfig().getVaultId(), insertBody, requestOptions); + batchInsertResult = super.getRecordsApi().withRawResponse().batchOperation(super.getVaultConfig().getVaultId(), insertBody, requestOptions); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); Optional>> records = batchInsertResult.body().getResponses(); @@ -230,13 +228,13 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio } } } else { - RecordServiceInsertRecordBody insertBody = super.getBulkInsertRequestBody(insertRequest); - bulkInsertResult = super.getRecordsApi().recordServiceInsertRecord( + InsertRecordRequest insertBody = super.getBulkInsertRequestBody(insertRequest); + bulkInsertResult = super.getRecordsApi().insertRecords( super.getVaultConfig().getVaultId(), insertRequest.getTable(), insertBody); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); - Optional> records = bulkInsertResult.getRecords(); + Optional> records = bulkInsertResult.getRecords(); if (records.isPresent()) { - for (V1RecordMetaProperties record : records.get()) { + for (RecordMetaProperties record : records.get()) { HashMap insertRecord = getFormattedBulkInsertRecord(record); insertedFields.add(insertRecord); } @@ -259,25 +257,25 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog()); - ApiClientHttpResponse result = null; + ApiClientHttpResponse result = null; ArrayList detokenizedFields = new ArrayList<>(); ArrayList errorRecords = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog()); Validations.validateDetokenizeRequest(detokenizeRequest); setBearerToken(); - V1DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest); + DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getTokensApi().withRawResponse().recordServiceDetokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); + result = super.getTokensApi().withRawResponse().detokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog()); Map> responseHeaders = result.headers(); String requestId = extractRequestId(responseHeaders); - Optional> records = result.body().getRecords(); + Optional> records = result.body().getRecords(); if (records.isPresent()) { - List recordList = records.get(); + List recordList = records.get(); - for (V1DetokenizeRecordResponse record : recordList) { + for (com.skyflow.generated.rest.types.DetokenizeRecordResponse record : recordList) { if (record.getError().isPresent()) { DetokenizeRecordResponse recordResponse = new DetokenizeRecordResponse(record, requestId); errorRecords.add(recordResponse); @@ -309,7 +307,7 @@ public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws public GetResponse get(GetRequest getRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.GET_TRIGGERED.getLog()); - V1BulkGetRecordResponse result = null; + BulkGetRecordResponse result = null; ArrayList> data = new ArrayList<>(); ArrayList> errors = new ArrayList<>(); try { @@ -317,9 +315,9 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { Validations.validateGetRequest(getRequest); setBearerToken(); RedactionType redactionType = getRequest.getRedactionType(); - RecordServiceBulkGetRecordRequest recordServiceBulkGetRecordRequest = RecordServiceBulkGetRecordRequest.builder() + GetRecordsRequest getRecordsRequest = GetRecordsRequest.builder() .skyflowIds(getRequest.getIds()) - .redaction(redactionType != null ? RecordServiceBulkGetRecordRequestRedaction.valueOf(redactionType.toString()) : null) + .redaction(redactionType != null ? GetRecordsRequestRedaction.valueOf(redactionType.toString()) : null) .tokenization(getRequest.getReturnTokens()) .offset(getRequest.getOffset()) .limit(getRequest.getLimit()) @@ -327,20 +325,20 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { .columnName(getRequest.getColumnName()) .columnValues(getRequest.getColumnValues()) .fields(getRequest.getFields()) - .orderBy(RecordServiceBulkGetRecordRequestOrderBy.valueOf(getRequest.getOrderBy())) + .orderBy(GetRecordsRequestOrderBy.valueOf(getRequest.getOrderBy())) .build(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceBulkGetRecord( + result = super.getRecordsApi().getRecords( super.getVaultConfig().getVaultId(), getRequest.getTable(), - recordServiceBulkGetRecordRequest, + getRecordsRequest, requestOptions ); LogUtil.printInfoLog(InfoLogs.GET_REQUEST_RESOLVED.getLog()); if (result.getRecords().isPresent()) { - List records = result.getRecords().get(); - for (V1FieldRecords record : records) { + List records = result.getRecords().get(); + for (GetFieldRecords record : records) { data.add(getFormattedGetRecord(record)); } } @@ -355,16 +353,16 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.UPDATE_TRIGGERED.getLog()); - V1UpdateRecordResponse result; + UpdateRecordResponse result; String skyflowId; HashMap tokensMap; try { LogUtil.printInfoLog(InfoLogs.VALIDATE_UPDATE_REQUEST.getLog()); Validations.validateUpdateRequest(updateRequest); setBearerToken(); - RecordServiceUpdateRecordBody updateBody = super.getUpdateRequestBody(updateRequest); + UpdateRecordRequest updateBody = super.getUpdateRequestBody(updateRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceUpdateRecord( + result = super.getRecordsApi().updateRecord( super.getVaultConfig().getVaultId(), updateRequest.getTable(), extractUpdateSkyflowId(updateRequest.getData()), @@ -385,16 +383,16 @@ public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowExceptio public DeleteResponse delete(DeleteRequest deleteRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.DELETE_TRIGGERED.getLog()); - V1BulkDeleteRecordResponse result; + BulkDeleteRecordResponse result; try { LogUtil.printInfoLog(InfoLogs.VALIDATING_DELETE_REQUEST.getLog()); Validations.validateDeleteRequest(deleteRequest); setBearerToken(); - RecordServiceBulkDeleteRecordBody deleteBody = RecordServiceBulkDeleteRecordBody.builder().skyflowIds(deleteRequest.getIds()) + BulkDeleteRecordRequest deleteBody = BulkDeleteRecordRequest.builder().skyflowIds(deleteRequest.getIds()) .build(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getRecordsApi().recordServiceBulkDeleteRecord( + result = super.getRecordsApi().deleteRecords( super.getVaultConfig().getVaultId(), deleteRequest.getTable(), deleteBody, requestOptions); LogUtil.printInfoLog(InfoLogs.DELETE_REQUEST_RESOLVED.getLog()); } catch (ApiClientApiException e) { @@ -408,22 +406,22 @@ public DeleteResponse delete(DeleteRequest deleteRequest) throws SkyflowExceptio public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.QUERY_TRIGGERED.getLog()); - V1GetQueryResponse result; + GetQueryResponse result; ArrayList> fields = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATING_QUERY_REQUEST.getLog()); Validations.validateQueryRequest(queryRequest); setBearerToken(); RequestOptions requestOptions = buildRequestOptions(); - result = super.getQueryApi().queryServiceExecuteQuery( + result = super.getQueryApi().executeQuery( super.getVaultConfig().getVaultId(), - QueryServiceExecuteQueryBody.builder().query(queryRequest.getQuery()).build(), + GetQueryRequest.builder().query(queryRequest.getQuery()).build(), requestOptions ); LogUtil.printInfoLog(InfoLogs.QUERY_REQUEST_RESOLVED.getLog()); if (result.getRecords().isPresent()) { - List records = result.getRecords().get(); // Extract the List from Optional - for (V1FieldRecords record : records) { + List records = result.getRecords().get(); // Extract the List from Optional + for (FieldRecords record : records) { fields.add(getFormattedQueryRecord(record)); } } @@ -438,20 +436,20 @@ public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { public TokenizeResponse tokenize(TokenizeRequest tokenizeRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.TOKENIZE_TRIGGERED.getLog()); - V1TokenizeResponse result = null; + com.skyflow.generated.rest.types.TokenizeResponse result = null; List list = new ArrayList<>(); try { LogUtil.printInfoLog(InfoLogs.VALIDATING_TOKENIZE_REQUEST.getLog()); Validations.validateTokenizeRequest(tokenizeRequest); setBearerToken(); - V1TokenizePayload payload = super.getTokenizePayload(tokenizeRequest); + TokenizePayload payload = super.getTokenizePayload(tokenizeRequest); RequestOptions requestOptions = buildRequestOptions(); - result = super.getTokensApi().recordServiceTokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); + result = super.getTokensApi().tokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); - if (result != null && result.getRecords().isPresent() && !result.getRecords().get().isEmpty()) { - for (V1TokenizeRecordResponse response : result.getRecords().get()) { - if (response.getToken().isPresent()) { - list.add(response.getToken().get()); + if (result != null && result.getRecords() != null && !result.getRecords().isEmpty()) { + for (TokenizeRecordResponse response : result.getRecords()) { + if (response.getToken() != null) { + list.add(response.getToken()); } } } @@ -474,7 +472,7 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws setBearerToken(); File file = super.getFileForFileUpload(fileUploadRequest); - UploadFileV2Request uploadFileV2Request = UploadFileV2Request.builder() + UploadFileRequestV2 uploadFileRequest = UploadFileRequestV2.builder() .tableName(fileUploadRequest.getTable()) .columnName(fileUploadRequest.getColumnName()) .skyflowId(fileUploadRequest.getSkyflowId()) @@ -482,15 +480,15 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws .build(); RequestOptions requestOptions = buildRequestOptions(); - UploadFileV2Response uploadFileV2Response = super.getRecordsApi().uploadFileV2( + UploadFileResponseV2 uploadFileResponse = super.getFilesApi().uploadFileV2( super.getVaultConfig().getVaultId(), file, - uploadFileV2Request, + uploadFileRequest, requestOptions ); fileUploadResponse = new FileUploadResponse( - uploadFileV2Response.getSkyflowId().orElse(null), + uploadFileResponse.getSkyflowId().orElse(null), null ); diff --git a/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java b/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java index a16b17dd..276e8b87 100644 --- a/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java +++ b/skyvault/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java @@ -4,27 +4,43 @@ import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; import com.skyflow.vault.data.BaseDetokenizeRecordResponse; +import java.util.Optional; + public class DetokenizeRecordResponse extends BaseDetokenizeRecordResponse { private final String type; private final String requestId; private final String value; + public DetokenizeRecordResponse(com.skyflow.generated.rest.types.DetokenizeRecordResponse record) { + this(record, null); + } + + public DetokenizeRecordResponse(com.skyflow.generated.rest.types.DetokenizeRecordResponse record, String requestId) { + this(record.getToken(), record.getError(), record.getValue(), record.getValueType().map(Object::toString), requestId); + } + + /** Kept for binary compatibility with callers built against the previous generated model. */ public DetokenizeRecordResponse(V1DetokenizeRecordResponse record) { this(record, null); } + /** Kept for binary compatibility with callers built against the previous generated model. */ public DetokenizeRecordResponse(V1DetokenizeRecordResponse record, String requestId) { - super(record.getToken().orElse(null), record.getError().orElse(null)); - this.value = record.getValue() - .filter(val -> val != null && !val.toString().isEmpty()) + this(record.getToken(), record.getError(), record.getValue(), record.getValueType().map(Object::toString), requestId); + } + + private DetokenizeRecordResponse(Optional token, Optional error, Optional value, + Optional valueType, String requestId) { + super(token.orElse(null), error.orElse(null)); + this.value = value + .filter(val -> val != null && !val.isEmpty()) .orElse(null); - this.type = record.getValueType() - .map(Enum::toString) + this.type = valueType .filter(val -> !"NONE".equals(val)) .orElse(null); - this.requestId = requestId; } + public String getValue() { return value; } @@ -36,4 +52,4 @@ public String getType() { public String getRequestId() { return requestId; } -} \ No newline at end of file +} diff --git a/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java b/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java index 7dd2cfd0..70f6784f 100644 --- a/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java +++ b/skyvault/src/test/java/com/skyflow/RequestFidelityTests.java @@ -15,34 +15,9 @@ import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.resources.query.QueryClient; -import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; import com.skyflow.generated.rest.resources.records.RawRecordsClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; -import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.BatchRecordMethod; -import com.skyflow.generated.rest.types.RedactionEnumRedaction; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BatchRecord; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1Byot; -import com.skyflow.generated.rest.types.V1DetokenizeRecordRequest; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeRecordRequest; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; import com.skyflow.utils.HttpUtility; import com.skyflow.utils.Utils; import com.skyflow.vault.connection.InvokeConnectionRequest; @@ -85,6 +60,33 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; +import com.skyflow.generated.rest.types.UploadFileResponseV2; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.DetokenizeRecordRequestRedaction; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BatchRecord; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestRedaction; +import com.skyflow.generated.rest.resources.records.types.GetRecordsRequestOrderBy; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.GetRecordsRequest; +import com.skyflow.generated.rest.resources.records.requests.BulkDeleteRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.query.requests.GetQueryRequest; +import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; +import com.skyflow.generated.rest.resources.files.FilesClient; /** * Request-fidelity tests for the v2 SDK. @@ -197,14 +199,14 @@ public void testInsertBulk_everyBuilderValueReachesGeneratedBody() { .continueOnError(false) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertTrue("tokenization must carry returnTokens", body.getTokenization().isPresent()); Assert.assertTrue(body.getTokenization().get()); Assert.assertEquals("email", body.getUpsert().get()); - Assert.assertEquals(V1Byot.ENABLE_STRICT, body.getByot().get()); + Assert.assertEquals(InsertRecordRequestByot.ENABLE_STRICT, body.getByot().get()); - List records = body.getRecords().get(); + List records = body.getRecords(); Assert.assertEquals(2, records.size()); Map fields0 = records.get(0).getFields().get(); @@ -232,7 +234,7 @@ public void testInsertBulk_homogeneousReachesGeneratedBody() { .homogeneous(true) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertTrue(body.getHomogeneous().isPresent()); Assert.assertTrue(body.getHomogeneous().get()); } @@ -245,9 +247,9 @@ public void testInsertBulk_defaultsReachGeneratedBody() { .values(rows(richRow())) .build(); - RecordServiceInsertRecordBody body = client.getBulkInsertRequestBody(request); + InsertRecordRequest body = client.getBulkInsertRequestBody(request); Assert.assertFalse("returnTokens defaults to false", body.getTokenization().get()); - Assert.assertEquals("tokenMode defaults to DISABLE -> byot DISABLE", V1Byot.DISABLE, body.getByot().get()); + Assert.assertEquals("tokenMode defaults to DISABLE -> byot DISABLE", InsertRecordRequestByot.DISABLE, body.getByot().get()); Assert.assertFalse("upsert not set -> absent", body.getUpsert().isPresent()); Assert.assertFalse("homogeneous not set -> absent", body.getHomogeneous().isPresent()); } @@ -273,7 +275,7 @@ public void testInsertBulk_tokensPairPositionallyWithValues() { .tokenMode(TokenMode.ENABLE_STRICT) .build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals("4111111111111111", records.get(0).getFields().get().get("card_number")); Assert.assertEquals("token-for-row-0", records.get(0).getTokens().get().get("card_number")); @@ -292,7 +294,7 @@ public void testInsertBulk_recordOrderIsPreserved() { } InsertRequest request = InsertRequest.builder().table("cards").values(values).build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals(5, records.size()); for (int i = 0; i < 5; i++) { @@ -318,7 +320,7 @@ public void testInsertBulk_fewerTokensThanValuesLeavesTrailingRecordsWithoutToke .tokenMode(TokenMode.ENABLE) .build(); - List records = client.getBulkInsertRequestBody(request).getRecords().get(); + List records = client.getBulkInsertRequestBody(request).getRecords(); Assert.assertEquals(2, records.size()); Assert.assertEquals("token-0", records.get(0).getTokens().get().get("card_number")); Assert.assertFalse("record without a matching token entry gets no tokens", @@ -346,24 +348,25 @@ public void testInsertBatch_everyBuilderValueReachesGeneratedBody() { .continueOnError(true) .build(); - RecordServiceBatchOperationBody body = client.getBatchInsertRequestBody(request); + BatchOperationRequest body = client.getBatchInsertRequestBody(request); Assert.assertTrue("batch body always sends continueOnError=true", body.getContinueOnError().get()); - Assert.assertEquals(V1Byot.ENABLE, body.getByot().get()); + Assert.assertEquals("byot is carried as an extra property on the batch body", "ENABLE", + body.getAdditionalProperties().get("byot")); - List records = body.getRecords().get(); + List records = body.getRecords(); Assert.assertEquals(2, records.size()); - V1BatchRecord first = records.get(0); - Assert.assertEquals("table maps to per-record tableName", "cards", first.getTableName().get()); - Assert.assertEquals(BatchRecordMethod.POST, first.getMethod().get()); + BatchRecord first = records.get(0); + Assert.assertEquals("table maps to per-record tableName", "cards", first.getTableName()); + Assert.assertEquals(BatchRecordMethod.POST, first.getMethod()); Assert.assertEquals("email", first.getUpsert().get()); Assert.assertTrue(first.getTokenization().get()); - Assert.assertEquals("whole values map must be carried verbatim", row1, first.getFields().get()); - Assert.assertEquals(NON_ASCII_NAME, first.getFields().get().get("name")); + Assert.assertEquals("whole values map must be carried verbatim", row1, first.getFields()); + Assert.assertEquals(NON_ASCII_NAME, first.getFields().get("name")); - Assert.assertEquals("cards", records.get(1).getTableName().get()); - Assert.assertEquals("second record", records.get(1).getFields().get().get("name")); + Assert.assertEquals("cards", records.get(1).getTableName()); + Assert.assertEquals("second record", records.get(1).getFields().get("name")); } @Test @@ -390,10 +393,10 @@ public void testInsertBatch_tokensPairPositionallyAndOrderIsPreserved() { .continueOnError(true) .build(); - List records = client.getBatchInsertRequestBody(request).getRecords().get(); + List records = client.getBatchInsertRequestBody(request).getRecords(); Assert.assertEquals(4, records.size()); for (int i = 0; i < 4; i++) { - Assert.assertEquals(i, records.get(i).getFields().get().get("position")); + Assert.assertEquals(i, records.get(i).getFields().get("position")); Assert.assertEquals("token-" + i, records.get(i).getTokens().get().get("position")); } } @@ -408,23 +411,24 @@ public void testInsertBatch_homogeneousIsDropped_knownGap() { InsertRequest bulkRequest = InsertRequest.builder() .table("cards").values(rows(richRow())).homogeneous(true).continueOnError(false).build(); - RecordServiceInsertRecordBody bulkBody = client.getBulkInsertRequestBody(bulkRequest); + InsertRecordRequest bulkBody = client.getBulkInsertRequestBody(bulkRequest); Assert.assertTrue("bulk branch DOES send homogeneous", bulkBody.getHomogeneous().get()); Assert.assertTrue(bulkBody.toString().contains("homogeneous")); InsertRequest batchRequest = InsertRequest.builder() .table("cards").values(rows(richRow())).homogeneous(true).continueOnError(true).build(); - RecordServiceBatchOperationBody batchBody = client.getBatchInsertRequestBody(batchRequest); + BatchOperationRequest batchBody = client.getBatchInsertRequestBody(batchRequest); - for (Method method : RecordServiceBatchOperationBody.class.getMethods()) { + for (Method method : BatchOperationRequest.class.getMethods()) { Assert.assertFalse("batch body has no homogeneous accessor", method.getName().toLowerCase(Locale.ROOT).contains("homogeneous")); } - for (Method method : V1BatchRecord.class.getMethods()) { + for (Method method : BatchRecord.class.getMethods()) { Assert.assertFalse("batch record has no homogeneous accessor", method.getName().toLowerCase(Locale.ROOT).contains("homogeneous")); } - Assert.assertTrue(batchBody.getAdditionalProperties().isEmpty()); + Assert.assertEquals("only byot rides along as an extra property", + Collections.singleton("byot"), batchBody.getAdditionalProperties().keySet()); Assert.assertFalse("homogeneous never reaches the wire on the batch branch", batchBody.toString().contains("homogeneous")); } @@ -434,17 +438,17 @@ public void testInsert_continueOnErrorFalseUsesBulkEndpointWithTableAsPathParam( ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) - .thenReturn(V1InsertRecordResponse.builder().build()); + when(mockRecords.insertRecords(anyString(), anyString(), any())) + .thenReturn(InsertRecordResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); InsertRequest request = InsertRequest.builder() .table("cards").values(rows(richRow())).returnTokens(true).continueOnError(false).build(); controller.insert(request); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceInsertRecordBody.class); - Mockito.verify(mockRecords).recordServiceInsertRecord(eq(VAULT_ID), eq("cards"), bodyCaptor.capture()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(InsertRecordRequest.class); + Mockito.verify(mockRecords).insertRecords(eq(VAULT_ID), eq("cards"), bodyCaptor.capture()); Assert.assertTrue(bodyCaptor.getValue().getTokenization().get()); Mockito.verify(mockRecords, Mockito.never()).withRawResponse(); } @@ -456,21 +460,21 @@ public void testInsert_continueOnErrorTrueUsesBatchEndpoint() throws Exception { RawRecordsClient mockRawRecords = Mockito.mock(RawRecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())) + when(mockRawRecords.batchOperation(anyString(), any(), any())) .thenReturn(new com.skyflow.generated.rest.core.ApiClientHttpResponse<>( - V1BatchOperationResponse.builder().build(), buildOkHttpResponse())); + BatchOperationResponse.builder().build(), buildOkHttpResponse())); VaultController controller = newControllerWithMockApi(mockApi); InsertRequest request = InsertRequest.builder() .table("cards").values(rows(richRow())).continueOnError(true).build(); controller.insert(request); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceBatchOperationBody.class); - Mockito.verify(mockRawRecords).recordServiceBatchOperation(eq(VAULT_ID), bodyCaptor.capture(), any()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(BatchOperationRequest.class); + Mockito.verify(mockRawRecords).batchOperation(eq(VAULT_ID), bodyCaptor.capture(), any()); Assert.assertTrue(bodyCaptor.getValue().getContinueOnError().get()); - Assert.assertEquals("cards", bodyCaptor.getValue().getRecords().get().get(0).getTableName().get()); - Mockito.verify(mockRecords, Mockito.never()).recordServiceInsertRecord(anyString(), anyString(), any()); + Assert.assertEquals("cards", bodyCaptor.getValue().getRecords().get(0).getTableName()); + Mockito.verify(mockRecords, Mockito.never()).insertRecords(anyString(), anyString(), any()); } // ================================================================== @@ -482,8 +486,8 @@ public void testUpdate_everyBuilderValueReachesGeneratedRequest() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -508,17 +512,17 @@ public void testUpdate_everyBuilderValueReachesGeneratedRequest() throws Excepti ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor idCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( eq(VAULT_ID), tableCaptor.capture(), idCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); Assert.assertEquals("skyflowId becomes the path id", "sky-id-1", idCaptor.getValue()); - RecordServiceUpdateRecordBody body = bodyCaptor.getValue(); + UpdateRecordRequest body = bodyCaptor.getValue(); Assert.assertTrue(body.getTokenization().get()); - Assert.assertEquals(V1Byot.ENABLE, body.getByot().get()); + Assert.assertEquals(UpdateRecordRequestByot.ENABLE, body.getByot().get()); Map fields = body.getRecord().get().getFields().get(); Assert.assertFalse("skyflowId must be stripped from fields", fields.containsKey("skyflowId")); @@ -535,8 +539,8 @@ public void testUpdate_deprecatedSkyflowIdKeyBecomesPathIdAndIsStripped() throws ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("snake-id").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("snake-id").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -547,9 +551,9 @@ public void testUpdate_deprecatedSkyflowIdKeyBecomesPathIdAndIsStripped() throws controller.update(UpdateRequest.builder().table("cards").data(data).build()); ArgumentCaptor idCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( anyString(), anyString(), idCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("snake-id", idCaptor.getValue()); @@ -563,8 +567,8 @@ public void testUpdate_defaultsReachGeneratedRequest() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -574,13 +578,13 @@ public void testUpdate_defaultsReachGeneratedRequest() throws Exception { controller.update(UpdateRequest.builder().table("cards").data(data).build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceUpdateRecordBody.class); - Mockito.verify(mockRecords).recordServiceUpdateRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(UpdateRecordRequest.class); + Mockito.verify(mockRecords).updateRecord( anyString(), anyString(), anyString(), bodyCaptor.capture(), any()); Assert.assertFalse("returnTokens defaults to false", bodyCaptor.getValue().getTokenization().get()); - Assert.assertEquals(V1Byot.DISABLE, bodyCaptor.getValue().getByot().get()); + Assert.assertEquals(UpdateRecordRequestByot.DISABLE, bodyCaptor.getValue().getByot().get()); Assert.assertFalse("no tokens supplied -> tokens absent", bodyCaptor.getValue().getRecord().get().getTokens().isPresent()); } @@ -594,8 +598,8 @@ public void testUpdate_mutatesCallersDataMap_knownGap() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) - .thenReturn(V1UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) + .thenReturn(UpdateRecordResponse.builder().skyflowId("sky-id-1").build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -625,9 +629,9 @@ public void testUpdate_mutatesCallersDataMap_knownGap() throws Exception { private static VaultController mockGetController(RecordsClient mockRecords) throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) - .thenReturn(V1BulkGetRecordResponse.builder() - .records(Collections.emptyList()) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) + .thenReturn(BulkGetRecordResponse.builder() + .records(Collections.emptyList()) .build()); return newControllerWithMockApi(mockApi); } @@ -651,21 +655,21 @@ public void testGet_idsFieldsRedactionAndPagingReachGeneratedRequest() throws Ex controller.get(request); ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( eq(VAULT_ID), tableCaptor.capture(), requestCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); - RecordServiceBulkGetRecordRequest generated = requestCaptor.getValue(); + GetRecordsRequest generated = requestCaptor.getValue(); Assert.assertEquals("ids map to skyflowIds, order preserved", Arrays.asList("id-1", "id-2", "id-3"), generated.getSkyflowIds().get()); Assert.assertEquals(Arrays.asList("name", "card_number"), generated.getFields().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestRedaction.PLAIN_TEXT, generated.getRedaction().get()); + Assert.assertEquals(GetRecordsRequestRedaction.PLAIN_TEXT, generated.getRedaction().get()); Assert.assertEquals("10", generated.getOffset().get()); Assert.assertEquals("25", generated.getLimit().get()); Assert.assertFalse("downloadUrl(false) must reach downloadURL", generated.getDownloadUrl().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.DESCENDING, generated.getOrderBy().get()); + Assert.assertEquals(GetRecordsRequestOrderBy.DESCENDING, generated.getOrderBy().get()); Assert.assertFalse(generated.getColumnName().isPresent()); Assert.assertFalse(generated.getColumnValues().isPresent()); } @@ -684,16 +688,16 @@ public void testGet_columnNameAndColumnValuesReachGeneratedRequest() throws Exce controller.get(request); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - RecordServiceBulkGetRecordRequest generated = requestCaptor.getValue(); + GetRecordsRequest generated = requestCaptor.getValue(); Assert.assertEquals("email", generated.getColumnName().get()); Assert.assertEquals(Arrays.asList("a@example.com", NON_ASCII_NAME, "value with spaces"), generated.getColumnValues().get()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestRedaction.MASKED, generated.getRedaction().get()); + Assert.assertEquals(GetRecordsRequestRedaction.MASKED, generated.getRedaction().get()); Assert.assertFalse(generated.getSkyflowIds().isPresent()); } @@ -704,9 +708,9 @@ public void testGet_returnTokensMapsToTokenization() throws Exception { controller.get(GetRequest.builder().table("cards").ids(list("id-1")).returnTokens(true).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); Assert.assertTrue(requestCaptor.getValue().getTokenization().get()); @@ -720,12 +724,12 @@ public void testGet_defaultOrderByAndDownloadUrlReachGeneratedRequest() throws E controller.get(GetRequest.builder().table("cards").ids(list("id-1")).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.ASCENDING, + Assert.assertEquals(GetRecordsRequestOrderBy.ASCENDING, requestCaptor.getValue().getOrderBy().get()); Assert.assertTrue("downloadUrl defaults to true", requestCaptor.getValue().getDownloadUrl().get()); } @@ -738,11 +742,11 @@ public void testGet_orderByAcceptsAllThreeGeneratedEnumNames() throws Exception controller.get(GetRequest.builder().table("cards").ids(list("id-1")).orderBy(orderBy).build()); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); - Assert.assertEquals(RecordServiceBulkGetRecordRequestOrderBy.valueOf(orderBy), + Assert.assertEquals(GetRecordsRequestOrderBy.valueOf(orderBy), requestCaptor.getValue().getOrderBy().get()); } } @@ -766,7 +770,7 @@ public void testGet_orderByInvalidValueThrowsSkyflowException() throws Exception Assert.assertEquals(ErrorMessage.InvalidOrderBy.getMessage(), e.getMessage()); } Mockito.verify(mockRecords, Mockito.never()) - .recordServiceBulkGetRecord(anyString(), anyString(), any(), any()); + .getRecords(anyString(), anyString(), any(), any()); } } @@ -790,9 +794,9 @@ public void testGet_downloadUrlNullCoercesToTrueButReturnTokensNullDoesNot_known VaultController controller = mockGetController(mockRecords); controller.get(request); - ArgumentCaptor requestCaptor = - ArgumentCaptor.forClass(RecordServiceBulkGetRecordRequest.class); - Mockito.verify(mockRecords).recordServiceBulkGetRecord( + ArgumentCaptor requestCaptor = + ArgumentCaptor.forClass(GetRecordsRequest.class); + Mockito.verify(mockRecords).getRecords( anyString(), anyString(), requestCaptor.capture(), any()); Assert.assertTrue("downloadURL=true is sent even though the user passed null", @@ -810,8 +814,8 @@ public void testDelete_tableAndIdsReachGeneratedRequest() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) - .thenReturn(V1BulkDeleteRecordResponse.builder().build()); + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) + .thenReturn(BulkDeleteRecordResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.delete(DeleteRequest.builder() @@ -820,9 +824,9 @@ public void testDelete_tableAndIdsReachGeneratedRequest() throws Exception { .build()); ArgumentCaptor tableCaptor = ArgumentCaptor.forClass(String.class); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(RecordServiceBulkDeleteRecordBody.class); - Mockito.verify(mockRecords).recordServiceBulkDeleteRecord( + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(BulkDeleteRecordRequest.class); + Mockito.verify(mockRecords).deleteRecords( eq(VAULT_ID), tableCaptor.capture(), bodyCaptor.capture(), any()); Assert.assertEquals("cards", tableCaptor.getValue()); @@ -839,8 +843,8 @@ public void testQuery_queryStringReachesGeneratedBodyVerbatim() throws Exception ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) - .thenReturn(V1GetQueryResponse.builder().build()); + when(mockQuery.executeQuery(anyString(), any(), any())) + .thenReturn(GetQueryResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); @@ -848,12 +852,12 @@ public void testQuery_queryStringReachesGeneratedBodyVerbatim() throws Exception + "WHERE name = 'Smith''s' AND city = '" + NON_ASCII_CITY + "'\nLIMIT 10"; controller.query(QueryRequest.builder().query(sql).build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(QueryServiceExecuteQueryBody.class); - Mockito.verify(mockQuery).queryServiceExecuteQuery(eq(VAULT_ID), bodyCaptor.capture(), any()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(GetQueryRequest.class); + Mockito.verify(mockQuery).executeQuery(eq(VAULT_ID), bodyCaptor.capture(), any()); Assert.assertEquals("query with quotes and newlines must be sent unchanged", - sql, bodyCaptor.getValue().getQuery().get()); + sql, bodyCaptor.getValue().getQuery()); } @Test @@ -861,16 +865,16 @@ public void testQuery_simpleQueryReachesGeneratedBody() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) - .thenReturn(V1GetQueryResponse.builder().build()); + when(mockQuery.executeQuery(anyString(), any(), any())) + .thenReturn(GetQueryResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.query(QueryRequest.builder().query("SELECT * FROM cards LIMIT 1").build()); - ArgumentCaptor bodyCaptor = - ArgumentCaptor.forClass(QueryServiceExecuteQueryBody.class); - Mockito.verify(mockQuery).queryServiceExecuteQuery(anyString(), bodyCaptor.capture(), any()); - Assert.assertEquals("SELECT * FROM cards LIMIT 1", bodyCaptor.getValue().getQuery().get()); + ArgumentCaptor bodyCaptor = + ArgumentCaptor.forClass(GetQueryRequest.class); + Mockito.verify(mockQuery).executeQuery(anyString(), bodyCaptor.capture(), any()); + Assert.assertEquals("SELECT * FROM cards LIMIT 1", bodyCaptor.getValue().getQuery()); } // ================================================================== @@ -886,10 +890,10 @@ public void testTokenize_columnValuesReachPayloadInOrder() { ColumnValue.builder().value(NON_ASCII_NAME).columnGroup("cg_names").build(), ColumnValue.builder().value("value with spaces").columnGroup("cg_misc").build()); - V1TokenizePayload payload = client.getTokenizePayload( + TokenizePayload payload = client.getTokenizePayload( TokenizeRequest.builder().values(columnValues).build()); - List parameters = payload.getTokenizationParameters().get(); + List parameters = payload.getTokenizationParameters(); Assert.assertEquals(3, parameters.size()); Assert.assertEquals("4111111111111111", parameters.get(0).getValue().get()); Assert.assertEquals("cg_cards", parameters.get(0).getColumnGroup().get()); @@ -905,17 +909,17 @@ public void testTokenize_payloadReachesGeneratedApiCall() throws Exception { com.skyflow.generated.rest.resources.tokens.TokensClient mockTokens = Mockito.mock(com.skyflow.generated.rest.resources.tokens.TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) - .thenReturn(V1TokenizeResponse.builder().build()); + when(mockTokens.tokenize(anyString(), any(), any())) + .thenReturn(com.skyflow.generated.rest.types.TokenizeResponse.builder().build()); VaultController controller = newControllerWithMockApi(mockApi); controller.tokenize(TokenizeRequest.builder().values(Collections.singletonList( ColumnValue.builder().value(NON_ASCII_NAME).columnGroup("cg_names").build())).build()); - ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(V1TokenizePayload.class); - Mockito.verify(mockTokens).recordServiceTokenize(eq(VAULT_ID), payloadCaptor.capture(), any()); + ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(TokenizePayload.class); + Mockito.verify(mockTokens).tokenize(eq(VAULT_ID), payloadCaptor.capture(), any()); - V1TokenizeRecordRequest parameter = payloadCaptor.getValue().getTokenizationParameters().get().get(0); + TokenizeRecordRequest parameter = payloadCaptor.getValue().getTokenizationParameters().get(0); Assert.assertEquals(NON_ASCII_NAME, parameter.getValue().get()); Assert.assertEquals("cg_names", parameter.getColumnGroup().get()); } @@ -934,20 +938,20 @@ public void testDetokenize_eachTokenKeepsItsOwnRedactionType() { new DetokenizeData("tok-masked", RedactionType.MASKED), new DetokenizeData("tok-redacted", RedactionType.REDACTED))); - V1DetokenizePayload payload = client.getDetokenizePayload( + DetokenizePayload payload = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()); - List parameters = payload.getDetokenizationParameters().get(); + List parameters = payload.getDetokenizationParameters(); Assert.assertEquals(4, parameters.size()); - Assert.assertEquals("tok-default", parameters.get(0).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(0).getRedaction().get()); - Assert.assertEquals("tok-plain", parameters.get(1).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.PLAIN_TEXT, parameters.get(1).getRedaction().get()); - Assert.assertEquals("tok-masked", parameters.get(2).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.MASKED, parameters.get(2).getRedaction().get()); - Assert.assertEquals("tok-redacted", parameters.get(3).getToken().get()); - Assert.assertEquals(RedactionEnumRedaction.REDACTED, parameters.get(3).getRedaction().get()); + Assert.assertEquals("tok-default", parameters.get(0).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(0).getRedaction().get()); + Assert.assertEquals("tok-plain", parameters.get(1).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.PLAIN_TEXT, parameters.get(1).getRedaction().get()); + Assert.assertEquals("tok-masked", parameters.get(2).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.MASKED, parameters.get(2).getRedaction().get()); + Assert.assertEquals("tok-redacted", parameters.get(3).getToken()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.REDACTED, parameters.get(3).getRedaction().get()); } @Test @@ -957,12 +961,12 @@ public void testDetokenize_tokenWithoutRedactionDefaultsToDefault() { new DetokenizeData("tok-a"), new DetokenizeData("tok-b", null))); - V1DetokenizePayload payload = client.getDetokenizePayload( + DetokenizePayload payload = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()); - List parameters = payload.getDetokenizationParameters().get(); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(0).getRedaction().get()); - Assert.assertEquals(RedactionEnumRedaction.DEFAULT, parameters.get(1).getRedaction().get()); + List parameters = payload.getDetokenizationParameters(); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(0).getRedaction().get()); + Assert.assertEquals(DetokenizeRecordRequestRedaction.DEFAULT, parameters.get(1).getRedaction().get()); } @Test @@ -971,7 +975,7 @@ public void testDetokenize_continueOnErrorAndDownloadUrlReachPayload() { ArrayList detokenizeData = new ArrayList<>(Collections.singletonList(new DetokenizeData("tok-a"))); - V1DetokenizePayload payload = client.getDetokenizePayload(DetokenizeRequest.builder() + DetokenizePayload payload = client.getDetokenizePayload(DetokenizeRequest.builder() .detokenizeData(detokenizeData) .continueOnError(true) .downloadUrl(true) @@ -979,7 +983,7 @@ public void testDetokenize_continueOnErrorAndDownloadUrlReachPayload() { Assert.assertTrue(payload.getContinueOnError().get()); Assert.assertTrue(payload.getDownloadUrl().get()); - V1DetokenizePayload defaults = client.getDetokenizePayload(DetokenizeRequest.builder() + DetokenizePayload defaults = client.getDetokenizePayload(DetokenizeRequest.builder() .detokenizeData(detokenizeData) .build()); Assert.assertFalse("continueOnError defaults to false", defaults.getContinueOnError().get()); @@ -994,12 +998,12 @@ public void testDetokenize_tokenOrderIsPreserved() { detokenizeData.add(new DetokenizeData("tok-" + i, RedactionType.MASKED)); } - List parameters = client.getDetokenizePayload( + List parameters = client.getDetokenizePayload( DetokenizeRequest.builder().detokenizeData(detokenizeData).build()) - .getDetokenizationParameters().get(); + .getDetokenizationParameters(); for (int i = 0; i < 5; i++) { - Assert.assertEquals("tok-" + i, parameters.get(i).getToken().get()); + Assert.assertEquals("tok-" + i, parameters.get(i).getToken()); } } @@ -1007,11 +1011,11 @@ public void testDetokenize_tokenOrderIsPreserved() { // uploadFile // ================================================================== - private static VaultController mockUploadController(RecordsClient mockRecords) throws Exception { + private static VaultController mockUploadController(FilesClient mockFiles) throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) - .thenReturn(UploadFileV2Response.builder().build()); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) + .thenReturn(UploadFileResponseV2.builder().build()); return newControllerWithMockApi(mockApi); } @@ -1021,8 +1025,8 @@ public void testUploadFile_metadataFieldsAndFilePathReachGeneratedRequest() thro tempFile.deleteOnExit(); Files.write(tempFile.toPath(), "hello".getBytes("UTF-8")); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1032,11 +1036,11 @@ public void testUploadFile_metadataFieldsAndFilePathReachGeneratedRequest() thro .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( eq(VAULT_ID), fileCaptor.capture(), requestCaptor.capture(), any()); - UploadFileV2Request generated = requestCaptor.getValue(); + UploadFileRequestV2 generated = requestCaptor.getValue(); Assert.assertEquals("table maps to tableName", "cards", generated.getTableName()); Assert.assertEquals("file_column", generated.getColumnName()); Assert.assertEquals("sky-id-9", generated.getSkyflowId().get()); @@ -1054,8 +1058,8 @@ public void testUploadFile_base64AndFileNameProduceMatchingFile() throws Excepti byte[] payload = "café ☕".getBytes("UTF-8"); String base64 = Base64.getEncoder().encodeToString(payload); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1066,8 +1070,8 @@ public void testUploadFile_base64AndFileNameProduceMatchingFile() throws Excepti .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( anyString(), fileCaptor.capture(), requestCaptor.capture(), any()); Assert.assertEquals(target.getAbsolutePath(), fileCaptor.getValue().getPath()); @@ -1082,8 +1086,8 @@ public void testUploadFile_fileObjectIsPassedThroughUnchanged() throws Exception tempFile.deleteOnExit(); Files.write(tempFile.toPath(), new byte[]{1, 2, 3}); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1092,8 +1096,8 @@ public void testUploadFile_fileObjectIsPassedThroughUnchanged() throws Exception .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileV2Request.class); - Mockito.verify(mockRecords).uploadFileV2( + ArgumentCaptor requestCaptor = ArgumentCaptor.forClass(UploadFileRequestV2.class); + Mockito.verify(mockFiles).uploadFileV2( anyString(), fileCaptor.capture(), requestCaptor.capture(), any()); Assert.assertSame("the caller's File instance must be forwarded", tempFile, fileCaptor.getValue()); @@ -1110,8 +1114,8 @@ public void testUploadFile_filePathTakesPrecedenceOverOtherSources() throws Exce objectFile.deleteOnExit(); Files.write(objectFile.toPath(), "from-object".getBytes("UTF-8")); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - VaultController controller = mockUploadController(mockRecords); + FilesClient mockFiles = Mockito.mock(FilesClient.class); + VaultController controller = mockUploadController(mockFiles); controller.uploadFile(FileUploadRequest.builder() .table("cards") @@ -1121,7 +1125,7 @@ public void testUploadFile_filePathTakesPrecedenceOverOtherSources() throws Exce .build()); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); - Mockito.verify(mockRecords).uploadFileV2(anyString(), fileCaptor.capture(), any(), any()); + Mockito.verify(mockFiles).uploadFileV2(anyString(), fileCaptor.capture(), any(), any()); Assert.assertEquals(pathFile.getAbsolutePath(), fileCaptor.getValue().getPath()); } diff --git a/skyvault/src/test/java/com/skyflow/VaultClientTests.java b/skyvault/src/test/java/com/skyflow/VaultClientTests.java index 85db62a8..75339585 100644 --- a/skyvault/src/test/java/com/skyflow/VaultClientTests.java +++ b/skyvault/src/test/java/com/skyflow/VaultClientTests.java @@ -10,12 +10,7 @@ import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; import com.skyflow.vault.tokens.ColumnValue; @@ -43,6 +38,12 @@ import java.util.*; import java.util.Arrays; import java.util.Collections; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; public class VaultClientTests { private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; @@ -148,10 +149,10 @@ public void testGetDetokenizePayload() { .downloadURL(true) .continueOnError(false) .build(); - V1DetokenizePayload payload = vaultClient.getDetokenizePayload(detokenizeRequest); + DetokenizePayload payload = vaultClient.getDetokenizePayload(detokenizeRequest); Assert.assertFalse(payload.getContinueOnError().get()); Assert.assertTrue(payload.getDownloadUrl().get()); - Assert.assertEquals(2, payload.getDetokenizationParameters().get().size()); + Assert.assertEquals(2, payload.getDetokenizationParameters().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -177,17 +178,17 @@ public void testGetBulkInsertRequestBody() { .tokenMode(TokenMode.ENABLE) .returnTokens(true) .build(); - RecordServiceInsertRecordBody body1 = vaultClient.getBulkInsertRequestBody(insertRequest1); + InsertRecordRequest body1 = vaultClient.getBulkInsertRequestBody(insertRequest1); Assert.assertTrue(body1.getTokenization().get()); - Assert.assertEquals(V1Byot.ENABLE, body1.getByot().get()); - Assert.assertEquals(2, body1.getRecords().get().size()); + Assert.assertEquals(InsertRecordRequestByot.ENABLE, body1.getByot().get()); + Assert.assertEquals(2, body1.getRecords().size()); InsertRequest insertRequest2 = InsertRequest.builder() .table(table) .values(insertValues) .build(); - RecordServiceInsertRecordBody body2 = vaultClient.getBulkInsertRequestBody(insertRequest2); - Assert.assertEquals(2, body2.getRecords().get().size()); + InsertRecordRequest body2 = vaultClient.getBulkInsertRequestBody(insertRequest2); + Assert.assertEquals(2, body2.getRecords().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -213,13 +214,13 @@ public void testGetBatchInsertRequestBody() { .tokenMode(TokenMode.ENABLE) .returnTokens(false) .build(); - RecordServiceBatchOperationBody body1 = vaultClient.getBatchInsertRequestBody(insertRequest1); + BatchOperationRequest body1 = vaultClient.getBatchInsertRequestBody(insertRequest1); Assert.assertTrue(body1.getContinueOnError().get()); - Assert.assertEquals(2, body1.getRecords().get().size()); + Assert.assertEquals(2, body1.getRecords().size()); InsertRequest insertRequest2 = InsertRequest.builder().table(table).values(insertValues).build(); - RecordServiceBatchOperationBody body2 = vaultClient.getBatchInsertRequestBody(insertRequest2); - Assert.assertEquals(2, body2.getRecords().get().size()); + BatchOperationRequest body2 = vaultClient.getBatchInsertRequestBody(insertRequest2); + Assert.assertEquals(2, body2.getRecords().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -239,7 +240,7 @@ public void testGetUpdateRequestBodyWithTokens() { .tokens(tokenMap) .returnTokens(true) .build(); - RecordServiceUpdateRecordBody body = vaultClient.getUpdateRequestBody(updateRequest); + UpdateRecordRequest body = vaultClient.getUpdateRequestBody(updateRequest); Assert.assertTrue(body.getTokenization().get()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); @@ -259,7 +260,7 @@ public void testGetUpdateRequestBodyWithoutTokens() { .data(valueMap) .returnTokens(false) .build(); - RecordServiceUpdateRecordBody body = vaultClient.getUpdateRequestBody(updateRequest); + UpdateRecordRequest body = vaultClient.getUpdateRequestBody(updateRequest); Assert.assertFalse(body.getTokenization().get()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); @@ -273,8 +274,8 @@ public void testGetTokenizePayload() { List columnValues = new ArrayList<>(); columnValues.add(columnValue); TokenizeRequest tokenizeRequest = TokenizeRequest.builder().values(columnValues).build(); - V1TokenizePayload payload = vaultClient.getTokenizePayload(tokenizeRequest); - Assert.assertEquals(1, payload.getTokenizationParameters().get().size()); + TokenizePayload payload = vaultClient.getTokenizePayload(tokenizeRequest); + Assert.assertEquals(1, payload.getTokenizationParameters().size()); } catch (Exception e) { Assert.fail(INVALID_EXCEPTION_THROWN); } diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java index 8cae2235..4636dd6d 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java @@ -20,19 +20,6 @@ import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.tokens.RawTokensClient; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1DetokenizeResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetQueryResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1RecordMetaProperties; -import com.skyflow.generated.rest.types.V1TokenizeRecordResponse; -import com.skyflow.generated.rest.types.V1TokenizeResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; import com.skyflow.vault.data.DeleteRequest; @@ -74,6 +61,18 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; +import com.skyflow.generated.rest.types.UploadFileResponseV2; +import com.skyflow.generated.rest.types.UpdateRecordResponse; +import com.skyflow.generated.rest.types.TokenizeRecordResponse; +import com.skyflow.generated.rest.types.RecordMetaProperties; +import com.skyflow.generated.rest.types.InsertRecordResponse; +import com.skyflow.generated.rest.types.GetQueryResponse; +import com.skyflow.generated.rest.types.GetFieldRecords; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.BulkGetRecordResponse; +import com.skyflow.generated.rest.types.BulkDeleteRecordResponse; +import com.skyflow.generated.rest.types.BatchOperationResponse; +import com.skyflow.generated.rest.resources.files.FilesClient; public class VaultControllerTests { private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; @@ -275,9 +274,9 @@ public void testGetFormattedGetRecordNormalisesSkyflowId() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "abc-123"); fields.put("name", "John"); - V1FieldRecords record = V1FieldRecords.builder().fields(fields).build(); + GetFieldRecords record = GetFieldRecords.builder().fields(fields).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", GetFieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -292,9 +291,9 @@ public void testGetFormattedQueryRecordNormalisesSkyflowId() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "xyz-456"); fields.put("email", "test@example.com"); - V1FieldRecords record = V1FieldRecords.builder().fields(fields).build(); + FieldRecords record = FieldRecords.builder().fields(fields).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedQueryRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedQueryRecord", FieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -309,9 +308,9 @@ public void testGetFormattedGetRecordNormalisesSkyflowIdInTokensBranch() throws Map tokens = new HashMap<>(); tokens.put("skyflow_id", "tok-789"); tokens.put("card_number", "tok-card-abc"); - V1FieldRecords record = V1FieldRecords.builder().tokens(tokens).build(); + GetFieldRecords record = GetFieldRecords.builder().tokens(tokens).build(); - Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", V1FieldRecords.class); + Method method = VaultController.class.getDeclaredMethod("getFormattedGetRecord", GetFieldRecords.class); method.setAccessible(true); @SuppressWarnings("unchecked") HashMap result = (HashMap) method.invoke(null, record); @@ -443,11 +442,11 @@ public void testInsert_bulkSuccess() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1RecordMetaProperties meta = V1RecordMetaProperties.builder().skyflowId("id-123").build(); - V1InsertRecordResponse insertResp = V1InsertRecordResponse.builder() + RecordMetaProperties meta = RecordMetaProperties.builder().skyflowId("id-123").build(); + InsertRecordResponse insertResp = InsertRecordResponse.builder() .records(Collections.singletonList(meta)) .build(); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())).thenReturn(insertResp); + when(mockRecords.insertRecords(anyString(), anyString(), any())).thenReturn(insertResp); VaultController controller = createControllerWithMock(mockApi); @@ -470,7 +469,7 @@ public void testInsert_bulkApiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) + when(mockRecords.insertRecords(anyString(), anyString(), any())) .thenThrow(new ApiClientApiException("insert failed", 400, "bad request body")); VaultController controller = createControllerWithMock(mockApi); @@ -496,7 +495,7 @@ public void testInsert_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())) + when(mockRecords.insertRecords(anyString(), anyString(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -525,10 +524,10 @@ public void testInsert_batchSuccess() throws Exception { when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder().build(); + BatchOperationResponse batchBody = BatchOperationResponse.builder().build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -553,7 +552,7 @@ public void testInsert_batchApiErrorThrowsSkyflowException() throws Exception { RawRecordsClient mockRawRecords = Mockito.mock(RawRecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); when(mockRecords.withRawResponse()).thenReturn(mockRawRecords); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())) + when(mockRawRecords.batchOperation(anyString(), any(), any())) .thenThrow(new ApiClientApiException("batch failed", 500, "server error")); VaultController controller = createControllerWithMock(mockApi); @@ -586,15 +585,15 @@ public void testDetokenize_success() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse detokRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse detokRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-123") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(detokRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -617,7 +616,7 @@ public void testDetokenize_apiErrorThrowsSkyflowException() throws Exception { RawTokensClient mockRawTokens = Mockito.mock(RawTokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())) + when(mockRawTokens.detokenize(anyString(), any(), any())) .thenThrow(new ApiClientApiException("detokenize failed", 401, "unauthorized")); VaultController controller = createControllerWithMock(mockApi); @@ -643,7 +642,7 @@ public void testDetokenize_apiClientExceptionThrowsSkyflowException() throws Exc RawTokensClient mockRawTokens = Mockito.mock(RawTokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())) + when(mockRawTokens.detokenize(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -673,11 +672,11 @@ public void testGet_success() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-get-001"); fields.put("card_number", "4111111111111111"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder() + GetFieldRecords fieldRecords = GetFieldRecords.builder().fields(fields).build(); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); @@ -697,7 +696,7 @@ public void testGet_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("get failed", 404, "not found")); VaultController controller = createControllerWithMock(mockApi); @@ -719,7 +718,7 @@ public void testGet_apiClientExceptionThrowsSkyflowException() throws Exception ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())) + when(mockRecords.getRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -744,8 +743,8 @@ public void testUpdate_success() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1UpdateRecordResponse updateResp = V1UpdateRecordResponse.builder().skyflowId("id-upd-001").build(); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + UpdateRecordResponse updateResp = UpdateRecordResponse.builder().skyflowId("id-upd-001").build(); + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenReturn(updateResp); VaultController controller = createControllerWithMock(mockApi); @@ -764,7 +763,7 @@ public void testUpdate_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("update failed", 403, "forbidden")); VaultController controller = createControllerWithMock(mockApi); @@ -787,7 +786,7 @@ public void testUpdate_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -813,10 +812,10 @@ public void testDelete_success() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1BulkDeleteRecordResponse deleteResp = V1BulkDeleteRecordResponse.builder() + BulkDeleteRecordResponse deleteResp = BulkDeleteRecordResponse.builder() .recordIdResponse(Collections.singletonList("id-del-001")) .build(); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenReturn(deleteResp); VaultController controller = createControllerWithMock(mockApi); @@ -837,7 +836,7 @@ public void testDelete_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientApiException("delete failed", 400, "bad id")); VaultController controller = createControllerWithMock(mockApi); @@ -859,7 +858,7 @@ public void testDelete_apiClientExceptionThrowsSkyflowException() throws Excepti ApiClient mockApi = Mockito.mock(ApiClient.class); RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.recordServiceBulkDeleteRecord(anyString(), anyString(), any(), any())) + when(mockRecords.deleteRecords(anyString(), anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -886,11 +885,11 @@ public void testQuery_success() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-qry-001"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1GetQueryResponse queryResp = V1GetQueryResponse.builder() + FieldRecords fieldRecords = FieldRecords.builder().fields(fields).build(); + GetQueryResponse queryResp = GetQueryResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())).thenReturn(queryResp); + when(mockQuery.executeQuery(anyString(), any(), any())).thenReturn(queryResp); VaultController controller = createControllerWithMock(mockApi); @@ -908,7 +907,7 @@ public void testQuery_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) + when(mockQuery.executeQuery(anyString(), any(), any())) .thenThrow(new ApiClientApiException("query failed", 400, "invalid sql")); VaultController controller = createControllerWithMock(mockApi); @@ -928,7 +927,7 @@ public void testQuery_apiClientExceptionThrowsSkyflowException() throws Exceptio ApiClient mockApi = Mockito.mock(ApiClient.class); QueryClient mockQuery = Mockito.mock(QueryClient.class); when(mockApi.query()).thenReturn(mockQuery); - when(mockQuery.queryServiceExecuteQuery(anyString(), any(), any())) + when(mockQuery.executeQuery(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -973,12 +972,12 @@ public void testInsert_batchSuccessWithRecords() throws Exception { List> responses = new ArrayList<>(); responses.add(responseItem); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(responses) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1009,14 +1008,14 @@ public void testInsert_bulkSuccessWithTokens() throws Exception { Map tokens = new HashMap<>(); tokens.put("card_number", "tok-card-456"); - V1RecordMetaProperties meta = V1RecordMetaProperties.builder() + RecordMetaProperties meta = RecordMetaProperties.builder() .skyflowId("id-with-tokens") .tokens(tokens) .build(); - V1InsertRecordResponse insertResp = V1InsertRecordResponse.builder() + InsertRecordResponse insertResp = InsertRecordResponse.builder() .records(Collections.singletonList(meta)) .build(); - when(mockRecords.recordServiceInsertRecord(anyString(), anyString(), any())).thenReturn(insertResp); + when(mockRecords.insertRecords(anyString(), anyString(), any())).thenReturn(insertResp); VaultController controller = createControllerWithMock(mockApi); @@ -1044,11 +1043,11 @@ public void testUpdate_withTokensInResponse() throws Exception { Map tokens = new HashMap<>(); tokens.put("card_number", "tok-upd-card"); - V1UpdateRecordResponse updateResp = V1UpdateRecordResponse.builder() + UpdateRecordResponse updateResp = UpdateRecordResponse.builder() .skyflowId("id-upd-tok") .tokens(tokens) .build(); - when(mockRecords.recordServiceUpdateRecord(anyString(), anyString(), anyString(), any(), any())) + when(mockRecords.updateRecord(anyString(), anyString(), anyString(), any(), any())) .thenReturn(updateResp); VaultController controller = createControllerWithMock(mockApi); @@ -1076,16 +1075,16 @@ public void testDetokenize_errorRecordPath() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse errRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse errRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(errRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1122,12 +1121,12 @@ public void testInsert_batchItemWithDeprecatedSkyflowId() throws Exception { Map responseItem = new HashMap<>(); responseItem.put("Body", bodyMap); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Collections.singletonList(responseItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1166,12 +1165,12 @@ public void testInsert_batchMixedResult() throws Exception { Map errorItem = new HashMap<>(); errorItem.put("Body", errorBody); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Arrays.asList(successItem, errorItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1208,12 +1207,12 @@ public void testInsert_batchAllErrors() throws Exception { Map errorItem = new HashMap<>(); errorItem.put("Body", errorBody); - V1BatchOperationResponse batchBody = V1BatchOperationResponse.builder() + BatchOperationResponse batchBody = BatchOperationResponse.builder() .responses(Collections.singletonList(errorItem)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); - when(mockRawRecords.recordServiceBatchOperation(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(batchBody, rawResp); + when(mockRawRecords.batchOperation(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1241,12 +1240,12 @@ public void testDetokenize_emptyRecordsList() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() - .records(Collections.emptyList()) + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() + .records(Collections.emptyList()) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1272,11 +1271,11 @@ public void testGet_successWithRedactionType() throws Exception { Map fields = new HashMap<>(); fields.put("skyflow_id", "id-redact-001"); - V1FieldRecords fieldRecords = V1FieldRecords.builder().fields(fields).build(); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder() + GetFieldRecords fieldRecords = GetFieldRecords.builder().fields(fields).build(); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder() .records(Collections.singletonList(fieldRecords)) .build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); @@ -1304,19 +1303,19 @@ public void testDetokenize_mixedSuccessAndError() throws Exception { when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse goodRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse goodRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-good") .build(); - V1DetokenizeRecordResponse badRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse badRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Arrays.asList(goodRecord, badRecord)) .build(); Response rawResp = buildOkHttpResponse(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1343,11 +1342,11 @@ public void testTokenize_success() throws Exception { TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - V1TokenizeRecordResponse tokenRecord = V1TokenizeRecordResponse.builder().token("tok-abc").build(); - V1TokenizeResponse tokenResp = V1TokenizeResponse.builder() + TokenizeRecordResponse tokenRecord = TokenizeRecordResponse.builder().token("tok-abc").build(); + com.skyflow.generated.rest.types.TokenizeResponse tokenResp = com.skyflow.generated.rest.types.TokenizeResponse.builder() .records(Collections.singletonList(tokenRecord)) .build(); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())).thenReturn(tokenResp); + when(mockTokens.tokenize(anyString(), any(), any())).thenReturn(tokenResp); VaultController controller = createControllerWithMock(mockApi); @@ -1368,7 +1367,7 @@ public void testTokenize_apiErrorThrowsSkyflowException() throws Exception { ApiClient mockApi = Mockito.mock(ApiClient.class); TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) + when(mockTokens.tokenize(anyString(), any(), any())) .thenThrow(new ApiClientApiException("tokenize failed", 422, "unprocessable")); VaultController controller = createControllerWithMock(mockApi); @@ -1391,7 +1390,7 @@ public void testTokenize_apiClientExceptionThrowsSkyflowException() throws Excep ApiClient mockApi = Mockito.mock(ApiClient.class); TokensClient mockTokens = Mockito.mock(TokensClient.class); when(mockApi.tokens()).thenReturn(mockTokens); - when(mockTokens.recordServiceTokenize(anyString(), any(), any())) + when(mockTokens.tokenize(anyString(), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -1418,11 +1417,11 @@ public void testUploadFile_withFilePath() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-path")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1441,11 +1440,11 @@ public void testUploadFile_withBase64() throws Exception { String b64 = java.util.Base64.getEncoder().encodeToString("file content".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-b64")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1467,11 +1466,11 @@ public void testUploadFile_withFileObject() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - UploadFileV2Response uploadResp = UploadFileV2Response.builder() + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + UploadFileResponseV2 uploadResp = UploadFileResponseV2.builder() .skyflowId(java.util.Optional.of("sky-id-obj")).build(); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())).thenReturn(uploadResp); VaultController controller = createControllerWithMock(mockApi); FileUploadRequest request = FileUploadRequest.builder() @@ -1492,9 +1491,9 @@ public void testUploadFile_apiError() throws Exception { java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) .thenThrow(new ApiClientApiException("upload failed", 403, "forbidden")); VaultController controller = createControllerWithMock(mockApi); @@ -1519,9 +1518,9 @@ public void testUploadFile_apiClientExceptionThrowsSkyflowException() throws Exc java.nio.file.Files.write(tmpFile.toPath(), "data".getBytes()); ApiClient mockApi = Mockito.mock(ApiClient.class); - RecordsClient mockRecords = Mockito.mock(RecordsClient.class); - when(mockApi.records()).thenReturn(mockRecords); - when(mockRecords.uploadFileV2(anyString(), any(File.class), any(), any())) + FilesClient mockFiles = Mockito.mock(FilesClient.class); + when(mockApi.files()).thenReturn(mockFiles); + when(mockFiles.uploadFileV2(anyString(), any(File.class), any(), any())) .thenThrow(new ApiClientException("Network error executing HTTP request")); VaultController controller = createControllerWithMock(mockApi); @@ -1608,11 +1607,11 @@ public void testDetokenize_missingRequestIdHeaderDoesNotThrowAndRequestIdIsNull( when(mockApi.tokens()).thenReturn(mockTokens); when(mockTokens.withRawResponse()).thenReturn(mockRawTokens); - V1DetokenizeRecordResponse errRecord = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse errRecord = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-bad") .error("token not found") .build(); - V1DetokenizeResponse detokBody = V1DetokenizeResponse.builder() + com.skyflow.generated.rest.types.DetokenizeResponse detokBody = com.skyflow.generated.rest.types.DetokenizeResponse.builder() .records(Collections.singletonList(errRecord)) .build(); // Deliberately no REQUEST_ID_HEADER_KEY header set (unlike buildOkHttpResponse()) @@ -1622,8 +1621,8 @@ public void testDetokenize_missingRequestIdHeaderDoesNotThrowAndRequestIdIsNull( .code(200) .message("OK") .build(); - ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); - when(mockRawTokens.recordServiceDetokenize(anyString(), any(), any())).thenReturn(httpResp); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(detokBody, rawResp); + when(mockRawTokens.detokenize(anyString(), any(), any())).thenReturn(httpResp); VaultController controller = createControllerWithMock(mockApi); @@ -1688,8 +1687,8 @@ public void testGet_recordsOptionalAbsentReturnsEmptyData() throws Exception { RecordsClient mockRecords = Mockito.mock(RecordsClient.class); when(mockApi.records()).thenReturn(mockRecords); - V1BulkGetRecordResponse getResp = V1BulkGetRecordResponse.builder().build(); - when(mockRecords.recordServiceBulkGetRecord(anyString(), anyString(), any(), any())).thenReturn(getResp); + BulkGetRecordResponse getResp = BulkGetRecordResponse.builder().build(); + when(mockRecords.getRecords(anyString(), anyString(), any(), any())).thenReturn(getResp); VaultController controller = createControllerWithMock(mockApi); diff --git a/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java b/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java index 3d76215a..07e1107e 100644 --- a/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java @@ -5,7 +5,6 @@ import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.types.DetokenizeRecordResponseValueType; -import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; import com.skyflow.utils.validations.Validations; @@ -201,7 +200,7 @@ public void testDetokenizeDataNullRedactionTypeDefaultsToDefault() { @Test public void testDetokenizeRecordResponseNullValue() { - V1DetokenizeRecordResponse record = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-null-val") .build(); DetokenizeRecordResponse response = new DetokenizeRecordResponse(record); @@ -210,12 +209,28 @@ public void testDetokenizeRecordResponseNullValue() { Assert.assertNull(response.getRequestId()); } + @Test + public void testLegacyGeneratedRecordConstructorStillWorks() { + com.skyflow.generated.rest.types.V1DetokenizeRecordResponse legacy = + com.skyflow.generated.rest.types.V1DetokenizeRecordResponse.builder() + .token("tok-legacy") + .value("legacy-value") + .valueType(DetokenizeRecordResponseValueType.STRING) + .build(); + DetokenizeRecordResponse response = new DetokenizeRecordResponse(legacy, "req-legacy"); + Assert.assertEquals("tok-legacy", response.getToken()); + Assert.assertEquals("legacy-value", response.getValue()); + Assert.assertEquals("STRING", response.getType()); + Assert.assertEquals("req-legacy", response.getRequestId()); + Assert.assertNull(new DetokenizeRecordResponse(legacy).getRequestId()); + } + @Test public void testDetokenizeRecordResponseNoneValueTypeBecomesNull() { - V1DetokenizeRecordResponse record = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("tok-none-type") .value("some-value") - .valueType(DetokenizeRecordResponseValueType.NONE) + .valueType(DetokenizeRecordResponseValueType.valueOf("NONE")) .build(); DetokenizeRecordResponse response = new DetokenizeRecordResponse(record); Assert.assertNull("NONE valueType should be normalised to null", response.getType()); @@ -255,14 +270,14 @@ public void testDetokenizeRequestBuilderDownloadUrlNull() { @Test public void testDetokenizeResponse() { try { - V1DetokenizeRecordResponse record1 = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record1 = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("1234-5678-9012-3456") .value("4111111111111111") .valueType(DetokenizeRecordResponseValueType.STRING) .build(); DetokenizeRecordResponse field = new DetokenizeRecordResponse(record1); - V1DetokenizeRecordResponse record2 = V1DetokenizeRecordResponse.builder() + com.skyflow.generated.rest.types.DetokenizeRecordResponse record2 = com.skyflow.generated.rest.types.DetokenizeRecordResponse.builder() .token("3456-7890-1234-5678") .value("") .error("Invalid token") From 41fd3076ca53b81b8137502f72814011b1467f1f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Thu, 22 Oct 2026 12:20:27 +0000 Subject: [PATCH 18/41] [AUTOMATED] Private Release 1.2.0-dev-225f34ec --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index e71d8077..43a57f15 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.ee51b1dc + 1.2.0-dev.225f34ec jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 54fdaffe7e43ae3f37e0b92356ee7283a113da3c Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 15:14:17 +0530 Subject: [PATCH 19/41] SK-3175 fix sdk response parsing issue --- .../java/com/skyflow/BaseVaultClient.java | 26 ++++++- .../BaseVaultClientErrorBodyTests.java | 69 +++++++++++++++++++ 2 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 common/src/test/java/com/skyflow/BaseVaultClientErrorBodyTests.java diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java index 973510d7..9cec36c2 100644 --- a/common/src/main/java/com/skyflow/BaseVaultClient.java +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -1,12 +1,12 @@ package com.skyflow; -import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.skyflow.config.BaseCredentials; import com.skyflow.config.BaseVaultConfig; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.detect.rest.core.ObjectMappers; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.serviceaccount.util.Token; @@ -108,7 +108,27 @@ protected static SkyflowException wrapApiException(int statusCode, Throwable cau Map> headers, Object responseBody, ErrorLogs errorLog) { LogUtil.printErrorLog(errorLog.getLog()); - Gson gson = new GsonBuilder().serializeNulls().create(); - return new SkyflowException(statusCode, cause, headers, gson.toJson(responseBody)); + return new SkyflowException(statusCode, cause, headers, errorBodyAsJson(responseBody)); + } + + /** + * Serialises an API error body back to the JSON the server sent. The generated clients hand us either a + * plain {@code Map} or a typed {@code ErrorResponse}; the typed form carries Jackson annotations for the wire + * names ({@code grpc_code}, {@code http_status}) and {@code Optional} fields, so Jackson must do the + * serialisation. Gson would emit the Java field names, which {@link SkyflowException} cannot parse, and + * fails outright on {@code Optional} under JDK 17+. + */ + static String errorBodyAsJson(Object responseBody) { + if (responseBody == null) { + return null; + } + if (responseBody instanceof String) { + return (String) responseBody; + } + try { + return ObjectMappers.JSON_MAPPER.writeValueAsString(responseBody); + } catch (Exception e) { + return new GsonBuilder().serializeNulls().create().toJson(responseBody); + } } } diff --git a/common/src/test/java/com/skyflow/BaseVaultClientErrorBodyTests.java b/common/src/test/java/com/skyflow/BaseVaultClientErrorBodyTests.java new file mode 100644 index 00000000..f016a6f3 --- /dev/null +++ b/common/src/test/java/com/skyflow/BaseVaultClientErrorBodyTests.java @@ -0,0 +1,69 @@ +package com.skyflow; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class BaseVaultClientErrorBodyTests { + + /** Shape of the Fern-generated ErrorResponse: wire names via @JsonProperty, Optional fields. */ + public static final class TypedError { + @JsonProperty("grpc_code") public Optional grpcCode = Optional.of(5); + @JsonProperty("http_code") public Optional httpCode = Optional.of(404); + @JsonProperty("http_status") public Optional httpStatus = Optional.of("Not Found"); + @JsonProperty("message") public Optional message = Optional.of("Detokenization failed. Token x is invalid."); + @JsonProperty("details") public Optional> details = Optional.of(Collections.emptyList()); + } + + public static final class TypedErrorResponse { + @JsonProperty("error") public TypedError error = new TypedError(); + } + + private static Map> headers() { + Map> h = new HashMap<>(); + h.put("x-request-id", Collections.singletonList("req-1")); + return h; + } + + @Test + public void typedErrorBodyIsParsedIntoTheExceptionFields() { + SkyflowException e = BaseVaultClient.wrapApiException(404, new RuntimeException("boom"), headers(), + new TypedErrorResponse(), ErrorLogs.DETOKENIZE_REQUEST_REJECTED); + Assert.assertEquals(404, e.getHttpCode()); + Assert.assertEquals("Not Found", e.getHttpStatus()); + Assert.assertEquals(Integer.valueOf(5), e.getGrpcCode()); + Assert.assertEquals("Detokenization failed. Token x is invalid.", e.getMessage()); + Assert.assertEquals("req-1", e.getRequestId()); + Assert.assertEquals(0, e.getDetails().size()); + } + + @Test + public void mapErrorBodyStillWorks() { + Map error = new HashMap<>(); + error.put("grpc_code", 3); + error.put("http_status", "Bad Request"); + error.put("message", "Insert failed. Column cv is invalid."); + error.put("details", Collections.emptyList()); + Map body = new HashMap<>(); + body.put("error", error); + SkyflowException e = BaseVaultClient.wrapApiException(400, new RuntimeException("boom"), headers(), body, + ErrorLogs.INSERT_RECORDS_REJECTED); + Assert.assertEquals("Bad Request", e.getHttpStatus()); + Assert.assertEquals(Integer.valueOf(3), e.getGrpcCode()); + Assert.assertEquals("Insert failed. Column cv is invalid.", e.getMessage()); + } + + @Test + public void nullAndStringBodiesDoNotThrow() { + Assert.assertNull(BaseVaultClient.errorBodyAsJson(null)); + Assert.assertEquals("{\"error\":{}}", BaseVaultClient.errorBodyAsJson("{\"error\":{}}")); + } +} From d5fceff54c2fec2f2b3cab572700f90106bfe1c4 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 09:45:15 +0000 Subject: [PATCH 20/41] [AUTOMATED] Private Release 1.2.0-dev-54fdaffe --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 43a57f15..eb34ebff 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.225f34ec + 1.2.0-dev.54fdaffe jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 3657b62df4cd75b89f44cf6e2123e6723b57260b Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 15:22:15 +0530 Subject: [PATCH 21/41] SK-3175 fix spellcheck --- common/src/main/java/com/skyflow/BaseVaultClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java index 9cec36c2..ba53d00e 100644 --- a/common/src/main/java/com/skyflow/BaseVaultClient.java +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -112,10 +112,10 @@ protected static SkyflowException wrapApiException(int statusCode, Throwable cau } /** - * Serialises an API error body back to the JSON the server sent. The generated clients hand us either a + * Serializes an API error body back to the JSON the server sent. The generated clients hand us either a * plain {@code Map} or a typed {@code ErrorResponse}; the typed form carries Jackson annotations for the wire * names ({@code grpc_code}, {@code http_status}) and {@code Optional} fields, so Jackson must do the - * serialisation. Gson would emit the Java field names, which {@link SkyflowException} cannot parse, and + * serialization. Gson would emit the Java field names, which {@link SkyflowException} cannot parse, and * fails outright on {@code Optional} under JDK 17+. */ static String errorBodyAsJson(Object responseBody) { From a03e44193abe88a9f329083f6b3ab442b23382fb Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 09:52:41 +0000 Subject: [PATCH 22/41] [AUTOMATED] Private Release 1.2.0-dev-3657b62d --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index eb34ebff..f66c66c2 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.54fdaffe + 1.2.0-dev.3657b62d jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 14ede71ee49e9ec5d2f989c0379617a65c641510 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 16:56:15 +0530 Subject: [PATCH 23/41] SK-3175 fix validation --- .../main/java/com/skyflow/logs/ErrorLogs.java | 2 +- .../java/com/skyflow/errors/ErrorMessage.java | 2 +- .../utils/validations/Validations.java | 17 ++++---- .../com/skyflow/vault/data/InsertTests.java | 39 ++++++++++++++++++- 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java index 2051cedc..921defaf 100644 --- a/common/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -95,7 +95,7 @@ public enum ErrorLogs { EMPTY_OR_NULL_VALUE_IN_VALUES("Invalid %s1 request. Value can not be null or empty in values for key \"%s2\"."), EMPTY_OR_NULL_KEY_IN_VALUES("Invalid %s1 request. Key can not be null or empty in values"), NULL_VALUE_ENTRY_IN_VALUES("Invalid %s1 request. Value entry in 'values' can not be null at index %s2."), - TOKENS_VALUES_SIZE_MISMATCH("Invalid %s1 request. 'tokens' and 'values' must contain the same number of entries."), + TOKENS_VALUES_SIZE_MISMATCH("Invalid %s1 request. 'tokens' contains more entries than 'values'."), NULL_TOKENS_OR_VALUES_ENTRY("Invalid %s1 request. Entry in 'tokens' or 'values' can not be null at index %s2."), EMPTY_UPSERT("Invalid %s1 request. Upsert can not be empty."), INVALID_UPSERT_UPDATE_TYPE("Invalid %s1 request. Upsert updateType must be either UPDATE or REPLACE."), diff --git a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java index d49a4641..16c3fcf4 100644 --- a/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/skyvault/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -73,7 +73,7 @@ public enum ErrorMessage { NoTokensWithTokenMode("%s0 Validation error. Tokens weren't specified for records while 'tokenMode' was %s1. Specify tokens."), MismatchOfFieldsAndTokens("%s0 Validation error. 'fields' and 'tokens' have different columns names. Verify that 'fields' and 'tokens' columns match."), InsufficientTokensPassedForTokenModeEnableStrict("%s0 Validation error. 'tokenMode' is set to 'ENABLE_STRICT', but some fields are missing tokens. Specify tokens for all fields."), - TokensValuesSizeMismatch("%s0 Validation error. 'tokens' and 'values' must contain the same number of entries."), + TokensValuesSizeMismatch("%s0 Validation error. 'tokens' contains more entries than 'values'. Specify at most one tokens entry per values entry."), NullTokensOrValuesEntry("%s0 Validation error. Entry in 'tokens' or 'values' is null. Specify a valid entry."), BatchInsertPartialSuccess("%s0 Insert operation completed with partial success."), BatchInsertFailure("%s0 Insert operation failed."), diff --git a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java index 48b9b34d..6f87b2a6 100644 --- a/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/skyvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -771,14 +771,17 @@ private static void validateTokensForInsertRequest( throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokens.getMessage()); } - if (tokens.size() != values.size()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.TOKENS_VALUES_SIZE_MISMATCH.getLog(), InterfaceName.INSERT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensValuesSizeMismatch.getMessage()); - } - + // Fewer token maps than records is allowed for ENABLE (the server validates record by record, and + // continueOnError inserts the records that have tokens), matching the Node, Go and Python SDKs. + // ENABLE_STRICT already requires equal counts in validateInsertRequest. More token maps than records + // can never be paired, so it is rejected here instead of failing with IndexOutOfBoundsException. for (int index = 0; index < tokens.size(); index++) { + if (index >= values.size()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TOKENS_VALUES_SIZE_MISMATCH.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensValuesSizeMismatch.getMessage()); + } HashMap tokensMap = tokens.get(index); HashMap valuesMap = values.get(index); if (tokensMap == null || valuesMap == null) { diff --git a/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java b/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java index 966deb04..baa2d90d 100644 --- a/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java @@ -425,10 +425,27 @@ public void testNullValueEntryInValuesInInsertRequestValidations() { } @Test - public void testTokensValuesSizeMismatchWithTokenModeEnableInInsertRequestValidations() { + public void testFewerTokensThanValuesIsAllowedWithTokenModeEnableInInsertRequestValidations() { + // ENABLE lets the server validate record by record (and continueOnError insert the records that + // have tokens), as in the Node, Go and Python SDKs; only ENABLE_STRICT requires equal counts. values.add(valueMap); values.add(valueMap); tokens.add(tokenMap); + InsertRequest request = InsertRequest.builder() + .table(table).values(values).tokens(tokens).tokenMode(TokenMode.ENABLE) + .build(); + try { + Validations.validateInsertRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testMoreTokensThanValuesIsRejectedWithTokenModeEnableInInsertRequestValidations() { + values.add(valueMap); + tokens.add(tokenMap); + tokens.add(tokenMap); InsertRequest request = InsertRequest.builder() .table(table).values(values).tokens(tokens).tokenMode(TokenMode.ENABLE) .build(); @@ -444,6 +461,26 @@ public void testTokensValuesSizeMismatchWithTokenModeEnableInInsertRequestValida } } + @Test + public void testFewerTokensThanValuesIsRejectedWithTokenModeEnableStrictInInsertRequestValidations() { + values.add(valueMap); + values.add(valueMap); + tokens.add(tokenMap); + InsertRequest request = InsertRequest.builder() + .table(table).values(values).tokens(tokens).tokenMode(TokenMode.ENABLE_STRICT) + .build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals( + Utils.parameterizedString(ErrorMessage.InsufficientTokensPassedForTokenModeEnableStrict.getMessage(), Constants.SDK_PREFIX), + e.getMessage() + ); + } + } + @Test public void testNullEntryInTokensOrValuesInInsertRequestValidations() { values.add(valueMap); From 8ed78e56a58e00f0ef5c4a85764663ae38696b4f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 11:26:49 +0000 Subject: [PATCH 24/41] [AUTOMATED] Private Release 1.2.0-dev-14ede71e --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index f66c66c2..f9db081c 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.3657b62d + 1.2.0-dev.14ede71e jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 68d5268cfdaf8e402b17a5eb6d0f8acd1b2b70e8 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 17:25:18 +0530 Subject: [PATCH 25/41] SK-3175 fix validation --- .../main/java/com/skyflow/logs/ErrorLogs.java | 1 - skyvault/api-report/skyflow-java.baseline.jar | Bin 1214677 -> 1214738 bytes .../java/com/skyflow/errors/ErrorMessage.java | 1 - .../utils/validations/Validations.java | 18 +++++++----------- .../com/skyflow/vault/data/InsertTests.java | 11 ++++------- 5 files changed, 11 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java index 921defaf..154c26e8 100644 --- a/common/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -95,7 +95,6 @@ public enum ErrorLogs { EMPTY_OR_NULL_VALUE_IN_VALUES("Invalid %s1 request. Value can not be null or empty in values for key \"%s2\"."), EMPTY_OR_NULL_KEY_IN_VALUES("Invalid %s1 request. Key can not be null or empty in values"), NULL_VALUE_ENTRY_IN_VALUES("Invalid %s1 request. Value entry in 'values' can not be null at index %s2."), - TOKENS_VALUES_SIZE_MISMATCH("Invalid %s1 request. 'tokens' contains more entries than 'values'."), NULL_TOKENS_OR_VALUES_ENTRY("Invalid %s1 request. Entry in 'tokens' or 'values' can not be null at index %s2."), EMPTY_UPSERT("Invalid %s1 request. Upsert can not be empty."), INVALID_UPSERT_UPDATE_TYPE("Invalid %s1 request. Upsert updateType must be either UPDATE or REPLACE."), diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index dc2ace2b0c194a0cf1a0cf8d0b503b619f8a5997..309482bf92ada6da267cbf1562e7cb4797c7c119 100644 GIT binary patch delta 77684 zcmZsD1z1(f_qL~L&Y`=cL0URQI;2abQEHV%2*{uQHAP>&UX+MFrGCKKXC0&SOqwr`ry(rYqTfi}|sGSBcmRt3`Mpm0E8 z`{-Gk{Fud%i4Za_T#w;sdd}91N2WGt;#8nARth(?Ym7{3TIbflAmg8iKt%ltnGD?> zBXc&L;8jD%8)`AC&@)~v2NeDoOIJYQM|LbYsYp|d4YC^`Gc~CT)D!;IqfMPcZjuwb zg{-GdgbqxQg`ju5Smq`}aTrkpn4kiA3saaNAsHMUD%wJ(pC$x(l)!}}Ky@F1f&sEJ zi0r15iq3S%CZcEgA}wQ07HT5H8IQ(lQtU*#Mp#o zXnKmvSO)Y% zCd(BLA(Lq$X!PMhDWaE4U*J*n>>qm}Z!Qd_DdKb(0$;SU!^(n$o6QvB;85o^nHAUm~Q?2ohJ`9J&NT_I>^tWUjmqj}b4TKn?&* zE_@Us{v!bJA0t?hIVajAzIqnfuBq*tC~6mN-!dr-EA-e1!`-C2_8vtSfsz(rO~Jn` z{^Q|#B88*r=kE)snMj(mdyVCR`Yz&G;4gR#9))D3m01e%js{_?z=#?BhkU1rSa#Ts z33CRGaD*2`o&)pe-=Kv75z`R$AmBS%a-n&Y88+m>1a7YU!AhgOF!W3gWIbAH zfd2?%LP&_o2nxWaaoR5!Lo*ZTn8Aql9)VLAK zQ-1=NdB|fPqllV-*tOHclA&!mAn;|+FvAD8VHW>`+rO#Uj+?>)-%-I-qE9!yDFEHy z01~fgV4nOdk(Lc$kPRN8Q;~2_2<0nK5}<>7^)NRP#F4xQ*tr=g8^6d%-e7`fj4%tx zLbMia1|1aon@k6ZSYQT_eP}X^SSfr33gUE7geH~*+gW0+{b#>=z-=V+(*(l~wwrn* zyDqCx$k07{V2`;IrV0%>TCf0t(y--jOady$rwAusltAH!I6MJfAWy4(6A#61yycNFs)u?N7S4^6I-nP89)%Kn;&R61dr7&e$S6SIhHeCq^e1`Qd6 z^B{^uV9k>lEZUf$Y-`4_K*B$<%n-E@^YX91jG;gGF(jyzL;-v$+GHmpgN6hIkYIpV z=_o{a;56pLf3n~|_8@`7UV_O(3lEZf|2|})B{CwsauIVE2`d z=&+k908tu56CeDQ87q$1MvHtHxWfG3m2eve_7$Q&4PN*uFLoS_Pl_Z?AE|fH8YhJf zrW3}-qH45ftlJRo4mN?4Rth-ILt;0p}&>0k+EYy|2#S~@^#(wI7S zv&zvb7i_1AeTf=H!wLq;zIU_KgGLr)Hx8)nBm)JGHpXs8fuSk%H%&03(fZ2-`-0~9 zzp0E99o}k&-Au+bn*kqqPEUgRX=08YLreoc)-700C&ED%*d3^rlxaFCT35am>J^}{ z!Z=$j6I$qK{Y1fJIvKWc!B(P3B83+T5fwLVFCvkakzu9X*dwS%LG;0(<`$#vzep6Q ziR5OCJlq?E^+aW$G!v$9!Lh+Kr2ZQ5x9)7_L9KA?X9N{sp&Io25j_dse+cV|#)2J*8>}ki%}Zf}6qZ5e4@EC*fwEn0r2}2kj$lx7f8;)9vgj>D{2#K%fu+!)mEoC6Y6E4T9p!`L$BCTbo9Ri^V4lF%< zwF29K(h$vjv|~_$B!vgQQjHx&(=l2UX$=9b6M}oMV2^LY_#ap{YoWU&jtvq?#S%fD z$L`t0hL%$QHfoH}xD?2%yRTz?(8$}&)JVP|RsU|pBHF{?WY&N#N4BS(C}^iEnB@+( z2Gy4q(4aq)fF|)6c9``(HXqGkNFdUV(D3_CtR^}}Yc)X=!B0C!y+Ig@NToHO&}Uh| z!s;hj55y=Wl)!3E$mSV#1ey9@?;{up!pYCEcTfzFemj9g*{sIr`>?sF+O#cUP(VA- zpGeQ}?@1GMfg~tl2>Tkz+eq}$nlq?u8$}d`Uts-FAJSIAp!o$dL4?47(2A%yn(;7* z>@%nq$XO4BmG<1?$gYB~U3MFcB@Z5O69P?sD)sF(V`Wk z6J{EI3=mlwhh_*=KDc6m!4=Ch6g7lJ;08bn$RjR~Gg!`()V1t|no0HW>!Rm3WX z85{+&aDyl{fDamxzx`_zfP?}y=i(mHbcKORW2jRB8giTP`Qnt}wlg>v^d}O52p&pu zcsgi@0UIOiQGx^24G4hjZqaPA$FV>=N*P&UxeK_{D4D?4%22H_Nbby)xF7$tf*_Q> z;E0g$AK*$ah?y03xr+PFfan5538TgW=E*|<07dv&GfowGik2vVDkIdl12oY(9k_IK zBLo?xtKfl!B|u;TW~74|AK|v6q5xMn@iF*?qd*aN7=_@<$GA51De$=pRBA?J_cI(T z>ZQLfrGqXMGLoP_3~b;mK8PzuSAe+Ll;>p*Qhae6AlT|l+~yt5UtM^hwi;#Sh<+%I$i!fT*18LHdKMuhvOaiSDt#lP+_ zx1_McnqP3PsGmUZ_b(IZ;3wa4o9)&=5Wqm*Rn%?&NP&g^;A~KYX)O*-M@~rkE;AW! zpvON%B_p~ZKK8bz&_V6Yc=WR2f3Tp3?puSFV1xyK4vh`j~hSne<^2c18n@pkH54j6Oal95hRaB8gQR73|Og;K8;kuJ0M#i zXzx(Qi$Zv1JbIN5a+^HVmxpJAw%LJXaab8|F7hv)ZB)DzWPY9ro$Dz;(1*&LDI%v` z@EkDYfG418wR3};yJb&2Xmd01^w2$jJQu|O8nh~T4tP44!v)WP%!5Iit3ovbe=~-T z2jaP*xZU`zu$dPg1R6uA+mMsCZV`XdiwJp*pM| zinm8qv1cae!+jC>1E@G~h-F0CTb6}4hV$d_WON?*X$=D@vnZ=*PybOKH2vVc0j!sd zuSK;*>;^)GpeL^2ICj2{o&omG#Ooni!CK^Wp?2AQ zya;rE4`@$2!1#Z&R3-}(7)#(L5Fp{L1S0&a z0>4>w0HXSk_jf#KhL{OVFu3*0Lv5rzfXgo9@1U6r;Ef7}=w}G5aC<$T8PNdlZ^nb0 z5?Us-Nh7L5eaZwr=+7@;TCXS2VDvt|8Ko*f4{+)-*hu6yo&ec+0bXzP-~&_(LWZKFCQ5=hwwb<+`s|J~6}hrkZ$?E}*B41~>h2Q*-mynu50 zLEto`#YjM2VZZ>B9f&X(=&JR95#QlM0rxL7L7!O&uaW2k-~^yp1IrQO%p)5kN{WP1 zC{UjVg$U{Gr?5f5i9GN}9>ONm5Udd$esF>=t&)$>jBX8rD+)CqX~4a?2@*6iqIby% zhBZMHPS{PH0N(x3_=La*c+3pl4*_AyEKAsY8-+{;59px!a0(-;`hBHMY(VbNheS$1 zdIEH(hZdaijPO@wf(yDe0w&-n7a9j;nuI_!G0^OU0i-9Ho(^{2 zNw|e-hJf-{0dUkcCuE}!5XV?eqn z{CobNvCz#i2w@<8g^-QP1WrW-K)pVInmLI_0g7$Y$ec>wz` z6VWaeLhj8FHvzEO;Q&@*97+nrfB6zbVMv6Zh*oLzj%_bd1LRvMoq8NAP%5{X-UWEQNU@NMCz9BIfT?QDe4o{jAA0lCmaGcB!I6h}V z6k61Dy%`soC4MK!ROxS7Gh=|KMU5hAEr{+nph+9)u>1tn#G zX0O1XID#%lq%M^aNzh^j$YSlmL^2Xm5G{Oe9U+o8W1IHwbFvJ$@qhhu{|S)~^0-H& zgZom5$53d1jpHb*06)|rAY2a4&mmT#W1v>qAuFKVLgF~hG8hbPCihRTiKfs*0fh{C zXM;jO2NBWB6_CHxq3~%Uc)gbc(x=x+5C&Ffh~O|wi%nz|b(%;=d&&xdlu8Hbo+F}{ zj!2AX;5`k*4n!UdioypJRD^W(Plz%w@WnMW%)wI| zc<)1^9J)De3Jj(^LRTO;<*%jyI1qL4rvc*T#VcU!I07d%;JJPGQr(R7(}6i@4h2Cp}81bQ_90TmWeuO zm-2rm+noW<28o*)p8ZVJMpnS08^kZjM(D{{hD3&JHUR&2;YhA1SJC5;42c8sI16s6 z-?5NdP(;v!jSNWyp5`Lyqlw4I8=UWUh>+9}$I^-vlrK&agdd2I&i_ZJzH<~6xJ8_F z6dgk@gus{tlp;-fgDgcdSp8Yhzm>_55>Y5<9WiXDM2bWeqf844@|cXV{oB;>6Z^zZmxFkWpCLqfMiKu6~v zBK<*j5(ZyPK@%AyB6Q;Lrc`h$M2FyKhe_v9;K5zf=2*@#(tT7K?dvOKDI9g2bPgT+ zXDyUh0qT)SB1r+I<3A7Jv#BIWR4DChEg0;rhu$dyRSb}eR4@)+(b29{cbp>5p z+fvYvM2rJHBPxLtX?Kuz-r)Vo-yss*R!NdWuMK;%{xg>Zfd?d5_$tW-{h;Fi_q663 zi4%R=UPrQ`Nk>?Y2>*Q)Tp#Jzlep0d2+RL@0D%XLR0Y2fpXlhWI8v-r7uT|uYH>*8 z**;u~{nvV2)y7L(k=eunSQue*CPm*w!yQ1>pD&I#H%U{%I;}5m>j1cZ_^3z8vQ;ir6^Vot!-bL-QTOiwM*{u`IJzlhCfZrK-hC{YI<@K9@MWh(b-FMm0>c+`+ezYMrO{DNZFU2%GS{kHSAuPGNBURv=B_bG(3XFOs} zQzLZjW>ydjf8J6?%Jx>(<}3eccUW!Zwzqh8)B|M(Q`HCqovQu247R3lKfEsWW;>I% zOS@*8W9z$huF{FYkT_+-cH>9J@7ui8j_udYIUeq;w|isgB6ANqs9r4Es{Pt7c1W#ei>O50{K|V54R78DrkS+$6TNdHri;tvBTB z#2KChFg)hHRY2{D+TqP)VA~$aG|^MW+xZ~>GpBrC@e8NWBu_di&2oqKOuJO2g}#$w z;+8Sn@2{jtzq?%CAJZZF@VfBUS|_>7K533J-W+qguE0ZLzQ5W-<9v6Q++ds!}u7fwn zDc8%8QFZi%Lv9Y!;rvv$U=Wd4Q zF9))`AG~>To53X*&X`Q9S5EuPSsTdY@nBda_SR`ePIvr)M{#%c3-IkX+4tO(bFY|m z2z}|In=O9ic9IvtO4HJpC%4mvYj548S8=eSagODO1A7k^P$9pD!|oB^95K zIFXc7PhW0!Q76*Z_uX!n7uFx?OTTm2=5V@6no_2dq@!|5d}XNPm%LT28Z;~#f@`Ft zJK1_yx$=5@f6pXci)dkAw2P2>ldAOa`6L62$-;I?H&dNhbMG4-pCR50SNLpIKV5Dr zYCKZPo9g_e@yttg!gr-||D-b>b6&c|@TZyZMaRC!6A`hcgVVvDyc-`d1lFC!D@7KP z)ir?uvAgYB_tCEuQH$_8-gnp!v7IEZhbXsj=sx8t@a1U?mDP`}`YO1LxgTy`2ws9Ey&9@fcfYdrX|gC00DVqB@lQ_DI0UH}O0(8G-$W zd+e|Z)_y*$QXfz3OwG);i@mW;KJBD0!&c5*hO{oa4b44MJc~{O`sZddBRP^HbYC~< zSk^{P8_P1Y8if&m)1Rq|V3Tq=RHgDecjQ9FvRmM>jP^s3nJx#a0xwYS)Go(2EAdB{ zXzub+czaSZ$vsl6+Vo`K&*IuQ{10Q5>ZW5-RbviT1eD*7)JSW5`sSIF<`X8Fsv{Bs zluNFc>oayKj;~!%?sd`Z&JNeNZ8GSbwQP8rImhs>k%wrOl`Fe+C7Z12xX1a#2R)|a zB@Yx&rhdoWs4BS39Po@W{ZC877gimkR zHf^^NlcK>Pr=^AVof7`R=%`WOh@fc&3Ynh^(3fQK|$uplWQgKE(!38$CW=gaVCQ5XmYW< zLXsN%q%mOEv*WhUbnB=M?K$j<)LXHAqCTcY;SKguQ&kL#gU?bANpCBB+*+aXIAhi& zE&I$6CqtdT!&nZEIIUUNKhZicwr}JWUu;RgN9FP!(^on}_Ca&0Q!SoTqu!cQ%6reS ztq@!LGe2^MwH1@ogb(f2j^#*AZ?BR%^6N#b#<${j$w}|fnB-6w8LnoJSVn4C%(P@G z9Hsd&o^ERuUv16php*kbLOH@*np5F3myB}DD;AQHrjMLX%D(L6R$|ru$m6kTkIp@h zDZzDe_wwBlC)U{gmpka~dcLm9Z@p_ZHD*0cSCA4=KDEXk%=%rrm3ygj@|0`mMe@4P zz(nlp?~d*%Hcy9=8D7U|%j{Pfrur7s%U`<0dRY2RCae89_~>yzL1iJX#6Xsub0ZbD zLRlR?(MR^O%EhI?MIj+q8*kKh>RroDZQ48KCttF{vFpj_&trpc{OgJ?T?`C@PM<1S z?O6`lPuHQ$Q);&+zI04Hw4&<3gc79!O~di8nKmGj=i_TpZPvF-X7jv7rBubqwz zv!AZ18OYf)@;Jc%dU6GEEZ<~z_OxK?Qq-BH%l2z~&+%XDTxPphx9sI|=h640ADAnI zWj7vKa(CUlsh{_Dkv;X#t*AqZaQjs$s)6I0maXK+=%V%0X{KXRgBo748(H>;nd1CR zPD0E4sS|soPIf&T3YvY-uyicdp#CX)PV@Bh7xuGeseb~dB;QN#jGC%4klQffPA(TU z7w+DZa9?IaFP81y^+=6#ZB*GeL5!^#+O>u6eRB?&I z=Zc~nNy8^jFvv2or4<^JB(y*H5pWY<5`;R)hg~X8?Aq7$<44u#nu&&lL()#wg;dN@ z>HY%DDW(MM;qtw8OI5~8-p^m2p5=(Ab|f{OBwVt8^xbv)dOZC!oyv)Yf#4%1w-+ns z<1~M|Ch=Tmj6a}a$aE>`=H+JTyc$;fY3Wb*T}W>3I|ai7SibZ6o?#3ARykG1oE0Ns zs`RFF)$&s~eGcosigI5(Lbw_fx6J2C2u9{0%J<)wJzNfCdklxaID9pQ? zbI+#?c?rqj0;cuq^RSHN`ztMVnPQFpSJWy>9=V96Q@+->G^OspQ~t$WVl^a)pni*| zBSs<+-^-A+p)_kP5tu4aI@;_ryi+1;f!bYd$i;K?7F#sW(b&uBqYd?yrrz6}E3zBD zso8>trA1lbhr7hv;Fphs9A_x~2eTL?-hLdISi7(yRM)xlS?CXy=hfdXipa{yWU#-k zTQ}OV@3z}TiI^8-78+-LPTSX|DBR)P zO1;U^<2)Wi^tjX+MLc-c<6^%yLn+&FqNUm%vm|S>+;_ubv4IRyYtVtm`*quTS~8Moprm`Nf3QU^;bXiST^uLj_1WrzMnnE5(I5-D6DZV z1zAI~k!P>%rJwfUaFvb>SUx40kT7-KWtwkq%ytIBwA(hBACvoEJbiOx<)Gyok+6$O zls%38lDOOL(t*+=#s$V|Q%@ycOzjJNCn*v3lB=}XHJ`g{T0^$MVsGn;p6bzJw)NOM z(bub~!bqz7x9WAY>R#%c(dOc7 zP5CrwA#q_qu+B4lqC-gH+bCO5!i%7yScNm1IDb#7-Ly&k=-_zGnb_T#uCcG^Z>cJ; zoMWr|xV5ZNTFQ5N*UD+f)?E@Mu_T{;EmArGQ}28{c47+-E=Y_!PRE~jer>CAXk6cJ z+UV^y+Z)z?{nl*49Wm8wDH}3{V)2QUKm1A@(sbcfmO$hT|<(G)5 z85OmAXhRJT+dp-EPh4Fm>!)`m^AcTiO_gs;gp2wJp2hELCSmhRjB#!%ZNzAp> zG|7~D*p;0B$acR$0wo&oVcfWFwJ{Diuj}`jLfBd1qlH;`E+gLlDxt&!xEYU}I zWZn-wS`V=pilulYoqFV8IS_ArH{Evih^Op)y*B+lajK9;TF^{U%wv3I@Z^h^GSN~` zVq13|W#8R8T;+dC@Ma_{Y$quz6ek)8d$aOLhK~OrzBO zo&D!akIIZti+hu%^`r_U)?=^Ko%;2q@KyK6v;I^G(tGVkPbE%2T5B=1WO=#ZR=h1_ zt^vkKiNgRvN;P^BgiYUi9+zPb-ewgHx>VX8X!Ww}{hi9AM~VpUB)@y|u>Wyi3qWe*k_gHA3@%M&}$?o-MXI5O@=e?&OgZb-u=#L7IvUr}yB>6c%k-L`uVVw=)6 z$mI+Su`gcAX}aTIPn2b5z5cz*^kZku{VPXhf_GbW$Ur94PqMRJ0^5WL3z59$_eACds%zA6>z<17+%<>SS#TLdi1@4b6 z2R?ao)MihZ?_5966s>OaXJ^_&sF354SeV8Sw$tjVY zKeMCT&vJ~p(r?&`=jh&-*R(?8k1UH7A3t#GzDK`AKn%~C`T21^HlL{I z_nbR!z{5Kgw@7mozpWY+moba(+_Qf`>Sm{(o^U&x>x)D&FVZsA`(1#0&I-Lui|@}U zmK=i3ZMhGxkNCXe!T7OiebX*%NS7aKvgJQdW|EJ zT-v6cGdDV_&8sZdsG_(BDfKl*DegLQqFQnl(P3t6{jWo|(brbFQ%1W6#4`gU3>VTe zP9M6SGb?&-->45pwESg=WKS3O?p@y3u046l$fOAA8*rL7rXEl!2yQBW%pl&}r*8q> zy7PFjj=tBtaXCUT46tpbK@R(B8PIR8E!DE5=;Hney4PqFu}KLQiw zOV=rTDsBX)Xa1rRhuRY<8X!U;kA;!6qOip|VK?&7U>$~C3S%xR(N zU&ew%^X+#C`!US>#q~$r)t8I<#S#5$S^ZI1^2W{9kigl-ozc7RJXF<*GOW4TmKGE? z+sF_-lA$*#(16Pg5;fnJayx%#X-Dv}`Fy6W=4rf2c+-KW((Ah3#E1D`BnRIK@GvrZ z3kK9%*jD*oNcid74H zRr8BsY;WZqc4KNT=Ifu>=b`NMAY}REW1A#4O-9S9{nE+Ib}W0}zxGgKy^t_7dE|0J zo_C^)6V>SSfa2a86+)+|a@Hn#(zd=P!CzyC$rJMhd5DC$K+Smush&Iz@8Y>E&i@*p!xZ zF+It5n{}%8s-xo56p7hntDf&4f)B~WtLM9_+Yh@FzdwkIC7hc&xcbUAc!O^vVvCEN zm^MK$LRPXPc$nU%`?nfPqN)=6^9QLB>I#X`%VL_`iiyt67as145DH7DzE~sIwwq1) zzF~wWqa$SQnay-Z@czcSW(Y-8@i4h&x;O8!PCwA8%g6oTrmvQ};zmTJ8~w+wAN7W{ zX~kW05ht1{>REez3Wl+8)+aT6ES%};b2XResx)zoF?E$Ai^XQNC+>)>UKhJp>Z;m> ztqSj+3?9kdcP_d!ar{+sz)5FJ2vm=GIGQN+ZXK$y(mo(d7KlRSuzlZHr z&*yoIHmArc_g%JZt6g2I*dwCB(_*TJct5_vzpSIL_42!Pn!W7FWH&>$}1{24PmlUBGt4Hig$)l4Xrwa`nO$k z6=Cz8NSfl?Zx?b|G!dWHabs6?cUq5<&+M!|{?Jp?%e>>&%-#BF>{+G@62C&rEz6lz zRRtI91&1q{@&qQb3h0lO2p&tV>}4t8OEte|;a}9Yjr58zR!uoN`0l)TW6PtsMahOS zlf`J(+r9C#`q!LX-`IZb#8C?e7NuSVZ#5gWQPO#|`_O|Cwd5}QDuN1Rw7vCW=Qvj_ z6^Q*Zb*EgLFb}S-@*UasB9HrQYPoW>;In!y=Cn@xpFXwhgQiQQ&R>1h!A$l`CoLAz zpN}e;E>-Rv2;+G5F;wualSFdR90si)eL^{RuXbPa;BCbxF`l-&$;iPXuq;M^phv$vFHWv9 z5TI9&a=fbFY!K((YRG8ZH{tyJ+G*>3tJ^>HuB1;?hx`%>c*{EJzD8CkUtfz_;|aSI zsk*^0RKfI1I?l9wE;_d8Av{I3TI0HxBrJ2_4`HHhVtL!4gz$R)xICjNk^tkMcKYS5 z&&wL;ehpRK%giXPY^$@I7FPS66IsEi zZNji2dbHBY+C(BsdAD^pi?2`)V?%*k?wB#-rHq1x7PnNrPR=iJf|s)PQX8P*)c7v; zVO!mtUtLX_J6aQPT{@cPaW=gZ(J#D5iuJ zzIc}~m|0bFN;&7xYR8C8Yicu(R%X<#vNiYjo!ftkW;T95{##fh>YL$usfe^WtB}RK z&dK8syVE;AURyo1)l+JSExLyTekT6A@R`bYQ~2q-q?L7(+*frGt;f&Le5JnD_Pk#` z^ObaV<;#!AO9lD{&#cRO6;;^hKYz4#^%n?Fcc|4IXK@qBT}r$;@A7QfBc%BcetN%y z08 z#e6y>(Z0Gc;Gm^EXTOYkge&84Pus0qmN9wECHpasHpK-WKFF@$%>4aPq*R#nzFYpd zz(ryDxswg{EX*$Cv-0T;HJKqFePcuVDw9o%gSn?J5109coDx2el#|DNns>`kR7R^QoP2Vg%!%LTGvS)79&U+ak@_rc z1Wks#Zslfj^)$WPj$Vmav6lnizrJsu`*MTrZKuxdoBX43UgzvZ`jP0 z_LVEn+ciD&zwKkgoCI}ENUv^s5{ zv}Euy*aYrVG32y zAzoKrSh=OkWt7P6;`;uBQ6VWgQB&clk{kK5ekZ+Ce1_~5{gm`8toG1+#%1}@cDAdH z`&i{K8gVqt)19z6TD)&)>bi`&brWIG`NoaRf|rJpdgm)j>Dq%ED0r3+)WaFkLg@m` zhmMETGlqJHPW$flzAvs`|6-@ZZKdNWH%G4ec6jiU^Isex<~g7E)P2QWIHvv;>D%)r zz4#Gr+eIxwm)=aH5WyhD^|K}hA8Tf;8Rj)#8@&$e4&Jh1EBKD3L4D7C-p;kWpSv0^ z)P~)ylx&>|33qMJEr_N6R&3=>)sMetePo&QadMr5P+aQj=;4HnSL{hOY76n0~h`avWnjxTbrYAUySI znQ$EEH3JXn9mkPYjxA&vOxmvrTUTZmSR}m&u8s;Q*7OTk_`v6%6?JQtU)ZUAv36ge zl-=50B4@>kPgthSN357mn)OpZ(R&J#k^wmJVAeti~TT%Y1-2JGUblLI^N||Kc5fFhcTK~ zXDBr4i6tsTS$b8bmq6pM1j zmxHb#|H9df;^nya*6X#R@kh-|Z(g)zosU+YkEWlGmhsOzdPbhFEdQZHKmMREuRQmY zcExi(oH^X|1|ej*8yhYBd!b{qRL}T@rJ~;Y+MBu_B40%fX0sV7V@<1CgH%X+0h`exzI5o*cax)UIR^{Z&wMwTo@q#P zWr@z}H9ed)4b?q<#WXYUiTS?iN$(P!(d#u`w(0jSNzSa_6j5=$f#Z|||GK4XzL2+b ztJelEyX68a)kN}((?z}d4UvZAp&s-0cb8Rid+h^!12-}R9j>MJ)UfE~?xN=S9rEu! z6C1$&B!xagFnd(OQPwmB(o;EK^IZMx9j;Tc3r#FXhZA$@-1i4xUKonqrSAW1NAxq6 zBjN$7T5;oC=FehAU9)eEg$Wk%1)Vx^LR>?EyoDnCuzH18>oHS`V*9?vyuFXi)KBGw zhzXCF>qqhbc;vEr@^z2dqKNSA0&3hW%j(IN9OXWL;EfbdwEki;J zhi^IhzBbGZ)iFs=mu~n}aq*i{oS0DJpMkZO;T(%;`UUX|or}{lmSMItJ64!-*?Xsr zR|M_^%X2Au-;5!==t{+^7+r$j-ZJX%7_wC$SvPQX?#yVD~ zU3k^w=&51B!v{#(?Bkak(RK*dgX~H}rA?0#06xvPbcs+aZ`l?&}`*Sy} z0$oF(!9(GRYuIiNs?u;BK8|hzdFN}c7XqEwX06aZ9^!Q`c;nN zFq^)*HA&FC;oYtu4G&d}kF!n6WBd)+EN*S#{&UzqrFgLPBAv;(#L~gqCd<7BubV(^RJ-C5*KVF= zr4Or@mAO8KC#}p6;lqBXYh>3%)~r0FRtQFYlO;)9Y4onxgV(d*AhlbV6kCaXsc5)g zsAMW>?^WKmt)M)csmkHd#SaziLra2vSmt~vofN;5gJdj7|e5ytV8 zcc-?FzrYQLh{GC`!&Ux$(GH=6Zg70)SAtzw;q478Wew@xSqN6#?F8m zZ|TAMRWsuLM)m=#^A(y^yu<3G`p`hfe$89>h!ACVH`@&1=q=hJLS+}sG>rW&v#;as z;KvM)vxKmFC7k$kjG@DL(s(e=c{HN(nj}3@PU{!(I(W}IOWwQv(ib5^gB2m=z6Rcj zP?k9O>^;WnKN5qG1Tp@p+BpTcfJZ|Dm`k;b z>-W)leL-wMfpXIblMY+`35yN>^&c(<@ly9mztS|u+xX`TMFxA~jwf{f!P!}n=%TZu zp8S#7vPIHw%a;H7Um|)y500@2Am6*f&)$%dk^i3jvt#%KU@zw3%__Vw)A!O>>u4#%`NieKbN;8D(Q2Cm!7BU z#@yJ>XQ1+Wm-uw%?1DDo6(fS)sXHRi`alB;8z!ETMASHBT3LH(&QkqRQoE)4h0AC7 zEls8yl3v)~F_P!G64SkQka3Mausxzm!NuDkU<(`0sS<17 z=Rj|^S4q#?pmu3EdSt)ETzIg5V?W4bh2Xj4RZA#mhJ<#3^;v9E65O|BuCqTjU- z6gcmWCT-6WYKw6;o6SGwv~pmZTlHGvrT*PL)T4}iO=;@gl?vS*ri|(VIE((T4cYZQ zNpC}p?MRp2I5rRNksp5SQTl1G#D4wJ_JZgZg3fB1P39|-&dd473yt0y{4RG5SMJM> z^Uip_KG3eu;vu0_^-6N)&D&pGDa{{SVw^5i956g!^C_x&M=^oI((?7B|0&CGYhxCY zWv7Ik(>uKJh>R2c7_NRMv){WiVNx4V8lc|Fi+T=#&TZe6`DFO9C ziffCB1zkO3*KdE4#&`dYu%%_iaBW(8H^(JhKEzV>gZ-(kKFin zH-Oq26j?R&*-20N*5FLq+bL0V$tLkB5jNY_tNlE0`7N#_Eqv$1%Pwk{QKWw0@FgFP zKHPTi#EWC&ZupXx=B&>j5-rW@r=_dXKHe~D(&}$A3+IV{b<|rZW%9?z#PvIL%BMcw zOpsb%WP6+ZQ9)`glMX(K_n0ziw_1aws}3w&r7A5fuWnXmn=>?%R=#lYd?T}ja!q_Q z_{t$Ge)hx3{X@OsLG&paCApdfH-)>eELz}aEgv@=iq(@e=hV(V6HT`wdDF=yOWbz9 z2lr7c?YAzwkFerTNd=_Stw^zZLTzo4AH{rNG?b!Mx*+igZKA26d5o>s%Qnpec zLp6zd*>=i*I7p|8tG9r(2mEx3*{wk7!r9Xj#a`C)96G7S?iO;CFNWSWwXSu{ZwHSm zXTQ}ly092DJ;bKg!X^5qBH}^aVG~#X{-9i+{4s&glD})|j29hacvpT{TRq^no|o3? za8uTJMm%leGzZcHCP5I@m~@#sr)bp-)=o&qAGOZu&iL$n zY@)1we~WtW$utKlo}p~ysPgBWucDhtmEMd7F!g*$uwB-}YX^3Z9~S@lONEVO9u(l` z{Au5FCbp;(PKW%?+43(#D$Vt;*Oyf9o#@-b<34tO;Lx#yMOyD=2;QQ@JyW7llf7p% zuRT8lmvzpaEx%@7ex}J$+xUSu*Q@Etprp;wu=n+M%q$!o=Q*=?zpNk7U$7oYEHP?S zRXq#7w&B|Gz?<(CqnjG%3s3Gv+Z|=|+o)y=<4TotmzdSk#Ew>pr`&$r3Rze66y=@P z^uS9<27QrMZ>gUc5buaDt}JVP+Ay}>8sRQo)L!E3TW`TuvJ5FL6-0$TdOj^R8v;G&y{=CESZQAql@n-NoXoUNe?>Q&CbEkin|eBt)DIfEB2Q(Ch|y8pvpIT!IphG^@qAVB^bl$f`m1$8BLzp$v7^wS`=s>9Yr5> zHSw~r_ij6?Y=Y${^9mZ~*;r17)Lc!PocQaWelNY1*}@oSbX4*{*!A^*Af0_*(H#^7kvB zCrpg$43!NyBo{v0S5I5O-|a3;RgY0h?>V^{&-x8q)y7d{(oHEEktWC9MC;jIHCc8r z=&0b|^5wSL*84t^Wh2BY$>_Kyd5VVB`JP|bE*G6=2N;aTKQdWLOfTKG)#XsJxa^Ys zC55}gGWni@$+4kc?}LKJgBo`T7EQ%HVq3JS>obmB6$$xl&q0{du~t#~c7`G;5d64=Zo$)JIc0Dvw6-%(4K9~pBSiwXj_GRR|x^+P!w>7lYGp9$A*8J8%Ryj-ToMK&st`oS~TT~ErXute$D9%l&2%r-{PE7$vkw#l3T06_LGFC zbp=tnqcN8&@3vf^P$JcM{2k% z3Rq+cJ~YonDlo?y&c&^!%*N&IvEr1PBIwI>de{$DX53oKV;Htm_vY^m52^_fuDurX z$zrR*;v=|Yzg^@HTUdWheZTpLGrPyBr87#@^2_gosN}*cjH=(9Xk+P~9>0;)xEpMb!VK2jSMV3o@V!BN zGw!SkX)&wt-rjU8!K2ja>Idns1=&+6zhD2--TBjF(qpUNmr0iJ-@#=W>~$abr)m;= zQ`4DsbM@B9^&R$ah&dy?`5m7zqOqPvWgkj$t{z{{TxWSh9TMofuB>b^!L{REU`4jL z61H|#LhJ=u_d@8!Q!};_l8k%s+=X8`$Ig69RkPT2*O+&~x@*Q~xwzJ1McNbXlmp=S%TG2KmXuYv7;=WQk?WgvZwM&!?=^tlTSF_AHyy@`gZ-+-? zhMCj~(pJBxevhEWEWOO~Zo8OKwPYe^IW@HD`;Gfsk{+2wFkx&W6UP`_T55Z{tgg=- z6KayjSPbhFw!D6PqJO;uBo3V%2K!F3j~&t5?k_VV7LqNUEjPn13NlT;%oOr|Aze z98>*MSj?HYBF<}xJx%K6HQib1xViYC>ei*2lpF5^niepj5gZ;bYcM5-a|dFlV7IG6 zw@noTDvWG1U28wywg}Cy%nVV@PQ1oAm9@1a@NW;+FX zPMT>x=9Jv)XNaE)nGa(T6Oitd+8uqVra@Y=hyM%jXS;jh9i(4Iu|Wxtf#g~uixg8c zoAl{jn?j7kvvy-g6x;+UDzL7GZ&zt~Mr)8Ghd+v2F2^@^?q9v7TvkSqVd7 z){xTsRr1p##PaXdN*3az&pWG>tNsE>mn|cR+FOM$+hjbi{gSEwFg?z(LPd-%aoa8L z^n^(3hue|@G$UlRm3@xhclo+>$wTYfK&08}=`(g=^V6Gm4L?{qJ$X{%BAdr-!3@vj z4{;|3m+?y;c~AY+qFcU6nayZg4__g+mvg+#$}3qi9J+ic;;stSnf+6(){nEXBhg0?91;!h9aMMm_E95?y3IQ3JHnN-#m96GWGJCPHXrJ@D_{@7gYmG}HytCKCNJhVzT?Uh0uO3$F z?NRFMQ!cT5<>x-Vmd>TTvoHTw%Vjg+$Q_w#Efy=+6fV*KU@VOg# z*Rq5%bx7EfFO-TqcouB??7p<9pxAu;%5(9djM}?--9r^w`Ozc$A5x7TUCfi@*FVED zmMLf#+a2^)CI#2MZ6dzXEb_>N#s1Gn3mtafald)V(XVUbcCO?v^N8-qTGKXpGqsZa z0}?uH8nNSTXx{6pS2_VGGoSTG7G(z zZ)WX@TIjYtMlbQrWsg*v2=%^U1io6uaT=DsviD&UPqbM?BvS%wOO}V{CzHEfjk`vU zCuLvckFPOp*HR+IjCX5C2dF@Oe)peG7aZcF*E{2DN>*VX@%v_?o1#XzHC~W;z&hV% z7_#rUy?v-5tBUQo9{ey;JM~?}xUPh!xZmciF5B7xZmbns(RMFRd@r@jD(23Ogz=or zOQK!J+l&i)RzLdPWIYpmuW3&A+kp#bFBP%CiLk4BWxmg({Lz}=hCr5M;y=O~sB>k{ zw@chLT#k+#UmiDKIAM|Fr5P);zb{vJ;bchMW7xh%%vy7Nr^Kw}<4Wa~g+>eO^v`<^ zM3f4I_{AIl>=Llkk1ZWAqxuZ1HMQv_GxYSfukqOIY%1U7n<&<_74t<~o#pZDK%`jC zaJ*2dnC^o2>&1gds}CK+A1aOWO_5);+-U_F?uZ>XU3AQ_%2~XZpE#UtreYG&w^aZOCLVRPEDBk7rMmb6J>2DN-h>=tw#A8n+l74d)OiNQ6i4Ia8#l;v@Cz6 z8Q=dnaH7{t&Ac*KaYsx0rZ3T<(UYDxe^ELf-#`7fIDR~I(#&*WbTp_b?$GAnlzxK+ z|JUDAhNG8uajxor(ke5JNN2h7!pUO% zdPODdC4cP8>3zGWZ*FL%I!T%O=*OEk`P^g5{en%e+6xAo20AL)FM4Gq0#456u>_Q*Ke=W8=~<#V^~#}5EBXuc z^}A1&yE$E%^vwy{_tv)5(&}VWO2TTfkHK(hU-iilJ@ecp{|2rMwc=w(naR{@Ofa{g zJbb_6%F~q5(&UL@sKYjTcHnF0bsupK53HzQYm~fYLDb&Q__Lk`GJNk6lUjuJ9%y5J zC~1=#gYrAJxe|ALctn@+d$aP%wGSio%11G0kBGZ@xf3oj$Voum$0hNF6 zdh+;2M(wL{=2vEumK}7B!JE8&s1x#^fA(w&`9(NN&%n*&=3P~1O8=aL=ahF)ogTdu z(MWlB_b5;BB2ji{)tga;U@3wncadUM^XQ)7oAk<@r*~ELj*^0_iL;6v3UA!x9Oc~P zJmrp;b&pEW8!P%;ud5)YxzBG2X6LNw89hl~y3^-o-8Au?%e-?i%vIAq%1fo6+vx+> zT_(QsnimL;=J0PDWu{Nxxq7=Um$=t`UL|-3hyUx*m-NTvSCi}diM6it9>H@Q{{5qu z=|_}TGwP^ZYcEErN(Eka^2xg`j@@(Qaqy0*6QB>}*gkIDvLX010_(x%^Zx$=h~?uu+^ zz_`Z(+eF96>)i0byX)UpyhnmL0=5ia{=^(HQjrrIuc>jGeJ;@97v1*6FB&Yl8aHl< zZHlj*pN`b%G&XP#*N_|;w`*cP!}hDBc5su(>C?=&yN(5pbw~66WNglTb)G6Wb^K$n z&)`;{f{5Ytl8PSKa)^4VQ@D`gn0*rs}psHgRb)N z7|Xo~KC&%XJ<-77a#^557=svvu;hTf`o2zYTZ5Xlp4{7Dt{^79B0-KRP4zl)G8ZOl z!C`Bi3wamwjRgmMoi+I(6VG&=QP3H_83B$t&6w?@nu!iU3=9}iKkt~)-Bj`*R@Aps zQ*IzwxQ>NPVm|EWecPdcA(z>3anvwqito+=?;3`WOl|X{`-77BYz^gJ1{*WCEsvfJ zQsJ}Jmg^68$4>fsZ>{qudkR{Q*2!!W^O>g$y2kg`$UBqan5gxKI=gL=>Z@FJ6tY@S zHlNzQvbNw*tkKs|)1V1HH6v_|7v2 zS@6|pl??``GZ!t4S_Ju#1GLNff|W6SzVkLg^yC1YvUkB6j6412#e#@@Yu6m^G4L~< z{yI9hEk%8mT{Dj1x2Q{wqI4Y_St5Ccjrq4 zc99__Ej3$B@6HCdpaXn;Oj_!;2RdiR_5>w{-rRPEtju)Y=Z&Fvd8iGR!Z*A9uEdk- ze0R%R<5w20rkVZ^mCw9kM+#Hfmw`Cb{b19v>OzDA5u)zm3>-qqFViF4o84NlrV@RUFFpJnmfN z?D^oQ$|{|6v-{+(>Zif5qN1tdr8ir7))W-ul+NXPsQ9oenk$`y)jR8`rSj)$oM#^} zsC<%FG*Da_3g-0>OnQ{;`{E(5e_|3{vTq~b_~^a1J9$aZXEI28JK8AiYR6Sc0g*{@ zI~TLm+v?`zD$Ep(2O4jWhrBXldd=ep3IJGo;$O zHoo>6*XT?0aN9Pe#fQA!^OxE}loq4Z>*_S*&h1m28)W8PV^(BPT1>lgCzyIX$4+r> zD2`_>Fp1Re?_zv$ey&YeY0>y{MDTCN$uj4?PsM->KMcPyG}&)%La|iE}wTDzT*vQc@hU{}86q_BK1ociB;=?bM`u zvPzx(c-XZzpX4Jac3fz5bmr@9GrOE5lpw!Y=A1Ajrs7Da810tRYCjw1=FHb`Sp1}( z=|Y>ofnwp8_$cd!wo5xJ`by3=?s2ZoOa&8``larT{!w05$nNCfTlT`*h&uaxGX}F4>^zzmcQ>4Cb zW4e4#$msaw*7iGYUS}I!+o)@His@y_s^bLb_3WgI8Bv`(?QKt$7WJwJm_AC+n;uM3UYZQr`vPR)2kRo&n;P_%mU?Y+J;z5Arw~}&l#Q!6H7djljJqTq@&i-hHLll-}@;n zH!;7jZRN{>D4*n{J?(4HqV|kak2v?aOzK>$7D{t+PIV4A{hViEi{j1X@A z8b)3AjNZ&RFtmG5*v;Gqi%lyH+YIZp)cB(srX45&bfWK-9dPRy$%TG7*59~pEr~Wp zA%~nqTty=#QHIMQ>dn@3+6-;XAD{W3VU=ct8^Dhpt;N%>GB*{Lg+);!r(DXjPKe(* ztbk2`q(fLm+#OD~kn$wM_g`qCa+;W*u{mvWm(P#-n<>(F?|W7 zpbOcXUBpuvrVZRP?pM<7iho!)*=3%Q|Bd1z`-|ta%oB!(@d4Zqp>>vvw`=KC4SsK~ zZvD|PTYkSR_cYs#j1Bf@>#hT3(uAKcNeA*~_G6&oO`ZdGoky2<^N3&O8*HV%3)CH8 z@Xo8@$(*>i-F`1GW#Z-bBkwTzU$1l?NegV4_*j4ItNUorSJlzVuR5dOzMdLu``SNR z^mS!)2Dka6B_ViGGUwTM*2vMIhzH)sn`BoHYZGJ(cH?DBsA5Ppzxjv`Qz&Xxz`g_gYf|FiHKFD6rx zMme0Ji{V2nAtTk1{{sNen_;-nE;6887D_n`AVX*k^j0g3Hi8zEQWApHOF+>~Gi%Im zbjWdIJ#Cx`Dl7r@I^&LjNtz0NB;qY zOxTx!!gRrL7*JgR06{SSflUwlBw%V#q<{2*s2m5mreIqBKaT*xM&VcQJD9g9qu>h> z2N9@%Ak^-km0}p6o7I4fj&zI(vI-W+#I&Nd`uQ9|}a_9}h8h|A_xDdcX`b1XW`i5pf_6fJ}~7Gx5NwH5d&PBVywSyfTY&aIh18njr* zcpu9I>5hSL0!ARDdL0;IgOdLYAw}1~5D!{39IS#t%|Xy*;2u~Hs`{xwcNanDqKOX} zbvk4WbQlqXwvRFGfK2L`aPYOym{4>v*ro!N)iG^{T)toik+q?;)tNPO(W>bH2)p|QJcruq0m85MvVjx>~=`b3sj2Syu5)G2II5n*62X2 z3dER-Wr60`fdTAoWWvS0-GYIWeqs2xBESJ5s?gm=CO(K|GZrBPUf7K7LlGb(J+r|| z!@L;mJ9G@8JbD~Nj?oXGHl8U7`xBi2r7{7pj5rR+WE^-2wHcfp#VlA*0G!4Ipb24^ z1KRc+i0Bj>)(V+`L3Q-{Gq8L;ri06T21+Wp@ z{t%CdoDDkN0wlvCiXB143(m1Ukemc|n6?aNl*B5~BO6Sv0v!S32~dO_wikg5!jmH8 z&4I%~fz~(%I7c44jv}P#6CPE@>Y`g|!iF5QarChFUaa+2+Fs!18yvT%Vev5Qek}h# zax0_9%Rv4Lcp{vrgC#QjAy@+n{0ZDJupOB0W@D@h3LUgQ0Nl}b+_J!qB5ONkaWw4` z;HQ>YZ&WUz&g}n)7!Q5v0GvlzV=<^c0k7uJ$Zt^K`-cryn;u~i)QLp6W`Khnv56>& zh-Cl+;>LxB0cup)mK!-40q1*q7Oy+ASq2#A6OwZ0p^*sqA(V1Nye zDio{()lz8+1-xu%e^(D~?DIqVb)u1WY@on~4+`HB1k`4#!5JXpl<3qc5tbw3;j+3n%yut4T!u0#|6u!VnOdjnp1;j9)DRJ z|DzKXXuB1T83G+0$uRLQ7W8eQ?FXV%g|^RQwjpY#@yZ7O%Eh{(x=uLo9(dP%Y$3YtkM{$cdjqOts>4_rWCHf6!Q#;+z=BmE zhXE!E)Le&c{Ub!gcv#_&^;l3XmqsI^3I`RyV^t#-gUSs60b5moj96N*JGf9LY4(LU zC(VSRyGMY%8x4U2B;!3c3Qt=Cjyq7M`4(uzlW$Y_-8Et5E3`3#07Xu`?g6%{QgTl$6%cKHs2jo2r&{?fw4N%GvSv?zO z+7FR_U_bmN5{Qq7CKg7Bs}>Mx_7jat5NMqs27&de(D!$s_;T7B7Syq&sTA>PV2$+f zy)8JS|NKl98vTytfMVVNKRblOg&utwbu32=X@1`&-F?qtJ(O0_iMBD4e5 zslw?TI5uPqR4)H(YZ&-9Ck`~U{3E?GF+4x?iyt?H>_#*Qgh7Et1#m4WdSFs2klas@ zdy%(Nu&{v`4kTqXCXmzK5y0Xwnq8%tO5T^$E5mEo2 zV9XCMDB%>*3FOQG>$bz5D!4K{4F?Pe(%gt;pMV$8bPX37;C`W218frU7832Kpof2( z;3iO-X*giuAKOt%!Rde)<~CZqe1i~$mhY~|3Zn557?&h!bs&W9fvB^7_^ov z<3P_enhHT96ktNMfM8RK0~PdXW1zk^2>-x*V7Ujl+vpe))@Uk(NYywrML@KQaE3IS z)2+b;p_YmkMGwUZL5w?aM4IP}Ap)c+6*)unp5hcyupn-!LevG&Pot?3cNC4Fs0%HC zbJ^=9ZhpgsXb}Ts9h@|th;V5)&J;BO8nX!_I0|Ici|a$EM?=ISIIeyAaAg~cp>0P( zgk1|LqwF_~(?>}~^b9;u7KuMl%w8-OmLI_>{bSHbFa{mvIN^?Q96y2;23VOljDi-z zy_cAzVCyLy-9Ol9i3%Dtp3H3s3<-tcl;eQrh+9C1(0Lp<+-U+wB>6w_(7OYin#L=* zMU)gYK-pk{1+ReIspKc_J+k$WvRUA2@Y4lgD#*nc!(hY z1Cxaa&jD8qyYXnMh=_q^Iq)47d^oxm4gNG;e4(W_kOtoWAH^fN@nr=(2|jZW-;GYt z=z#+d;T2E-NZ>^b;mQ=qml)0QSTq6ob9xY=j?EMX$kh`65|IimR=^+@-$RWKJOS8< z`xbT^LPlcmpIA9|F7+m-dBYyzkicm}wo(_KHgr08P3Ut+xunBA4)>BMog6f|)h}&-vkFQPV;~2r>qGl}VvvNVq@%*s4+3VU<99 zAQl0Dq&&z(vl@j9CPm;|P!S>4gG_)PWQ?%jEj(!M1yCYstqGpO1^v9Sl?;E4#e4oW z2ng8#NWns7QCl%k(QSMif(C6ZbsNtItuuh5?P)wd3*{OF9Kb9C1r*-LQ1DPk;#MO3 zCoAzlgI=;M8Z*6;Eym~9hD4XXaEH>WZVL5#OpEs{r`##;b$F3A;DQs@EPdrA4GI; z;4}On>H{O&AmE%R6jr#O4>T}DX`f=l^~&dNY9{J~kbS&5K= z9*o-$0X)X?1TL7YMgW1FmXsi%p0NW^ta}L={{R4E8vx|?5vouC2tk004T6s95YVg@ z29WDfoq`502=B_!JO$9KXH4it6iaJ;=Zr`PJU9i4;i4RXza1qsqh1ZJql)nS34#of zwgd((xNe{_29Zt?0u$`;cRzv_8vFNA30?^8piPB3G#WMj0Dh0&OK?_$cNuZ#co00a1g03<30SqbbB7mH=9-(1Ze1g8-I;A`TH4 zVWHau(3PBKZOGXLXa|{z0Py3rctYMkzT;g*;DcrofqrRgk^3iY2sTL~6l_=q&En-! z2|JM${ErC+P~bfRH{6~|*a(maiTi{Ai31q~&^?L~>tqoiFkt%;8YIA9&X9vB zg&x``0)#zMPB?{n1q})ea2Fu}U;w}uCEyQu4G5sbK)=A-b(po50J>{zAabTnFvHuP z5kS9A+8D9}fckewZWEyo-2o^-S%31PrWn6;%>2ZqSWzgIH}yZkZqeeP*UmV7D&>T~vD@ zHvvtI6)D`%GkFR-6tjhhfd%IX%_w2u3C+grzApq0$aI}OEd1PD?PFf*=UZOM< zG<%0*)(CMZVBT#cU_La$0AP*;MbPW;&N^WudjW(QK?ulBDGJjAJK{@JLVu|Nlk6~{ zrWYjy^f*B`z#Uj3Xg5kjNb>_4=~9r9JUG8qDa2vKG{IU!3}Tu<5=P(#N|AvlxQYHK ziobLL6kJf$IH1zOCY)3AkH!zA%bolG|rG_7v3F2GNfv=5#m8l4A9;1 zI1vX${ux4BQgjf(Q$rQtDM*7v+HT~Q0d^zfypWMCaSVZqP!B+e!c;q=4r&PC^b~`^ z7-)`6+X{ZO2X0O00b(Doje~^Nr38`#jZ2~VSRw%eyFh@bOVx309>4qeF%{r ze&<14K>ZOpk`PEppH|MZL?Xf)csm7d#^;GSNPMK79`N=6A{}BmXd4Uw30Vs&$A;jFx0&9_c$v2w# zZ@xsEg#n~^6grZP(YS^I*Al3#5RD>Gi2Eqqum?o6NAF=wX)!#Ony1Fvx=_C^BU4AEgqZQ4;V;vpOQ0m;B`ukrvW8 z)Tf@9fuKM{33hVB_AiLT{|F1gI&lcxmt$Iq&rlNol7r+hcRGlmRVIzuzh*;|7&NC1 zg8Wc7aTm%3=>7w`gpUCO{x8EptPl(dK~;Z}9^lf*s{Qc3LE;)p$--BnBlJv%!T{&J zC4z=IG+eYXm~Vv0fqtZIg8`&{=tt1K3W1^t@s9ulX8J%JM3oA*=|eGWBsy4q=8w1h zML9oDTt`sCVBKXD6wT&9wnLFd+h+mXFgRl-QOdY~5?!H4Ly+<6to|`!1RU6~ACmq- zoS_j5gJq!eD2;4{FfgeJ8~!48ApQY^c*uuR2YO{8WD7wf`n02fk326ijsQl+K}RHJxL2N} zhtLBH>?9>2f6+n(8uE~3{^lS?;*?1SDA~xh=noKf_^t{Gyb-14I7sWFKs^$}-*-gF zi>l5{5*BV(BY~DKv}GWx=LIcRNgR-a1%(d!e3&8(7w;!cqCgO#{F%kWecGf5^dgG% zCIZmg5g_0lo-ickMCO35cmfXN^hqtWaTvVf;z8DfkR}ZM_9TOTw3dMUXGWy0D1tw5 z7@*H4q-F#dNFaFOPE*o2x`NiQ2txQ6)hE+KBZo$r5__bMTiCsn_AIj$WOPCWr3$C zILP+I28D=J0EJA@GX_9X%y}$G(2fG%J$aG@+EdfSO4|yTxsW)~k05*_QpP|5$H+MN zr#mSD4MN4Ay%bpd3W*V&KxBC=fHaPvKxhK&VPQ8aDIbLn?n0o= zCNLck?J2w9vq7XJG}8d~_eVX>;JzGfPvL|uLrKc$HspI2oe5-CXvH4f=HG^su;>Ih zw1pu?PvB2B$0#_M{|2c5nE-JW1qTD=si15B+K9=m4GkdMM`;LkV@c0xR3jD!%z+Iu zj3c2B`B62|Xa?p^`bSOnw@K-UULGcr&Z0PgZ3sgh$AKYbCzHTSUz(^vTdED#xE(<| z@tx@;e^i^aSNJdx#)dC|hFO1=i-jX|NGxbDcxeroeD??t@G5^J9Rk5*111<}hoYPS zMx_GM8T8>62qu4Lv2b4nX$(CI5INE`2ZL>=|2aGmZ6YWbPXYrBtR=Cbp#JLm&nzcA z@|;vDfJ9ZqVQCX^!xSkAy=?qH(y$PKhk=Gpg3LQ-i8M_@B!awA28&*I6A=-6K^4v@*Hrz3(xH~{{|2=_6P$55CcZV1Egn8}43 z^8QZ|W$a|s`;qTM07|&vLJl(P#=Q}ILj@k?A)}TAAx4e22Nt333W8DxKe_4usTI7c z+)h4(VnAXBa93tXLl_WD(>^kU@G2)lHb9oa03;i_0Wo_L4*|eY$PoTCFo{kjasoQ>Ux0vbs*tNt9EkOs zoS|%^Ax9qo(j*4ac>o{tS0_iJ%l-yJ2M=)I?%zlD{VQJRr5doyS`VP3wf$s}W&Y)v z=J~(1{}VnfwtF3?P@oYp0v+V<3Cv<%kBkI(=syj@AULxjFK*DJ2FQ{K@pu7x)GasY zfq^@CAWR`nP75$lv^$vyb$Wp`GTfHjjuL@HU2x_gu@doQ7%*IkPSOqsBo4tcPUMCS zs)7H(Ko{51kH~=m6o*OhA~V2EE@be8jK&-i^#5S(LWcf22`#|Gv8Txg|AM5Up}}ZH zmLk^lpBP|_HyNY{G_e20UHI5J@|}NB(aZ^!y-5Cyj{Rry`J)XYbS#C89I%kU9r8{p)|zL6Gk{uh91_^Pe?RG5+%`7vb8du0 z%!#S@@c{KG6{wyngko#or z<-@+gfZuIp(sHLeKf0!crY2Eq=YEdNt*^H*@7ViIE)bMOtUJJW%Q{d;Yr_8A!vp(Vs=0h56TAF87`fa^dD#d1;!u zTo%QFlKjuBCdfkIHN{zklxwd6wUR^ff z(G&k$$Io0-jN{zNt$li2)4V6QG0WxXPRyJA_IlA=B`KbCH@Uir63(B#ziBSp{-)=N zSf}6J-221uP=D80DS6v)70(czt$-tgTW*$)w>4GygQk9T*y$Jd1+FhWoGOB^=QIjt zP29-dVjG^i?Af~} zlq24>k2y2%+I*R#FK2p(dvd|lySq!DR9n^e+h07+zqVyL(q(_(*XLK8p6|HnX6-Eg z4L;w?utu%Eye8w3%1e;ilJu!1{b#3OCacG7>5x{+e%7YB{i;D*_Gq2Ye90+sDPE%B zNZ$pC{Wr90>#F3{vK5NXZIMfj^R9f)#WcM8#i%HcM0hqUsrGC`sJm}@Z7fdv+DP3~ zyDfekeYQ2?kIrBQ)^e@1Fdy2@Qj6rizoWb;>y(IiO!bMMWoFXUpu6LLrM|}pmv2$* zE=B%&Vz;#8ro((^i5K=o$=`0f-O}PHc-SaGtSMd;bUIifq(vUImUP(07)BQt+ifq* zkziEoVjL3{eD?DbZu%(i3cd-w)a%9fj+sa6J~16QtimrO==rQrx4SAQFWFJt+_1GQ z!%_B2;LFEUtTMhzyRq2Tw!O_wPFOp>tg&wDqOrbuT-5T=)Ow9wBd=PFEsO3_4%V)U zxs+-CC{t;}G-pDV7mJ0^p7>{bmG&w3@TdmYrv2DOHI6Gy;c|7bG>fQLJp+X)e=YWT zkfE(S+nhpIquprZD_xwN&ln!|A{lZ~ol4RaW^N`>ZF0Du&tKd;$GBi5Tj}C=-lQdC zdb^ma?700~9lgR&&K*g5mpgA>8XMm7PH6mz&q$@bLwU{D)JNY1&l>i<@F$jMwHys) zjT`znshXR$wrQ{U=w>D{@7S+=%f4?D*`s93X2p>S8M}P$4{^Ia@=H zT*a)|x&~8AYlr*ab-y0`;6Alr*FBk=_6)mMbo~9DyII4}c@vE$o5jvRf#xhf74NvR z3CtdvePqg%KJF>C^NPYk1j8C9lir<^iC%rB^h#>BrE~qgZz^XMZq0PCPV*QShjLsr z%(sqv6yGG${^ZP9_v($nP;J|1LOWTrrWME9%c#nRsXI>iC>>FLK}|mWUNGa# zk@o_%8gB->x@|}LCf#$36n_ninGW?tkq$ly&FlbhBgHx9Hdc@!8*+*@) zW}?{=#ivC@C(nAG$LPh<#gnY_RlK=O7B{s{dW9^`WvBP(?(V>U+nvU^Afl!hN1$VF zx~m`v3umfPqpZv#Uu?gdph(qjv|3PV?T!(RyIGXc6ds=U^r{zbH6hIF9GyXGm~K?Y z+28D=68=`tRm%6izl!ECPmr{)iA)}Smnt%Z!A z9=z-pA^$zBm~p^8C!{ANAv)c3Tff+ifPyxmSc?^EhY59;`W>_7D{KSbS6KxrKR=VK z{mRYsv}vx5jRkVL&8&1TIa72W%P4vEUZBQ;@5fgm$_+Dno-_@qG-|F{G>-W2wkaPr zsNsG!#=m7;^PRV<#w{TynaEQy&HXv;KF8YqTXxSa7t9#mnNQj$1*By_+EIw z5bmVQ_;$*e_+LQ@#6#9tAMDzqYkBb^YO- z;aiUF@a}y0D6Kx{duivL6;Yu8--Ggm6on_HDV$H=YOUXR!;|FPl*0bdc(?mU@3Jvg zU+Z**-xKCj;q!}pBKSvDKgP|>6kWbZi(Q|}6`aiuY`9@C9ohbhyRM4I?8og+7Kdw^ z!FyO92&t~VmDoE>JuTgQ+cfV}m}rx0pdpj|jhYYdJo+n=&Yf`kmREe|UcKiY7H;gY zzU5@D4^aV7|0l*;UK@UoV?RKz{O&ABB>DwNut%i-?r?J4$1z&+18 z;p(kBp3yuE;!CUho|&lKv%#Kz-gx}h*{+dfwrSPRk1w`md(NK6@m?}H#F(azGp^`z zJ^9P5W8e4Qy9L)hO=6W^?kove61>P7+`rJ!Gt-xt{+!F@;HjH}L-h~4;$F2cmp$1s zBxV*hlS@*>8ix~2-Kdwh=D;rI`Np_g-Vwip>b~WQbw8(1X{oO=j<|NO+@8;*_i9LY z%wBFGFW((=*$+-SziUnM;?8#2sr!D{s|(Z{9rQO%_4-fRIkbOZ%58n6v(J5&$(mdH zS}?cxH$xqawC*)Oqg@nhF%ey7GdC4BdCP8BDSTic&$#HZWq)+=Y*5|VXs-3$}ZGGD_xV?X{=dHupYrD#tC?_5U#t%BqZBIGFIPuZ+?G-kB z$Gytx7hm|AGApWt!{aT;$7McoR11U`wAit~PGXtQWZ}MlNBR*CVovJUIxb<6X7=Qc z%!x>s#d?Xk$?SLW*(~-q&aPj3vA>z`ecIh6=BzUKksA-)+s*IdKIL4a)}LuxoG*M- z4xgCjkaf@Zhp8@g2?oO@y#l+n7nBR(~>^fJrkI2XRAUOk@Okyf_zcb*HFt?Y69 zIPM-BQ}FzLRkDV#z)0kNvg+1rzX@rLkDbLh+k4qvhCh|;jm*I39ts@^8e&o|UFm$C zdTcKE;PT|I=_bb?#X_kiStithaL1X<_`(;S#5^sbRJMywif4L{? z_}z!sw)~!pcRKm%-UnZ4Pe#T$#?gC)laB7~9~`r+Rix6rWm6l=+lmjWS?CeY6-JL8 ze7OqWbea;kPi^FGo)?XNapT(rBHF*%Vm`QTL*+&AKNQj!3<-%Qw=+AI&kP8 zy$g!IDJe8q3%NE^Vr(kzdRqh}Yid1=Du#(?6;CQeFPDp`==nPma(x?RiVI3O8-h>C z?@IFXJlD^mazx4W^n*8V=q-sild?Jr)0clJa!l+7hQGfoWX+m9qz*1<_l_{rg27dbTxGcv}`K1{9h&?%RC zk(RLJb|lsJN$i)(nU@#iuov(9{cz8WSJFDxwx#G=+ainmNvn^K=6TXGPO-b665=hw z8>}1Bydwh7L#G|$7FT% zYZ2%R3R(wv(2-pLE_y-!h`!KAer|w3Id&O5x@qYm-$E&+Jw<~3ddLjuLnY)fCV49( z87dngqi+O}i!c~sNf<>(z`d0he8ZHH1vVKae_)|Kpo*iWqeD;(6@d3yB3mLv!r-Nz z4Eh%!jeu|oGyWzwq7TEtiM@s(2!Jlb6sFT8r;*5cti zBj3!iwcg=Qg?wG}b_1!)9wMc}46)V*?lupzSi4%U-Z|Hy^06%j{QumC^I5^@ztYE# zt&)dRZ~3nTtj#;An_Jioga3LJ6<)2MnG4<|C*&3BKT5c+ENUZmsbrumQ{<87S%b4D zKYq~Fq3V?1+w$9T6X7)0w==qqEqhTY8_zx23pKVnioA{(yl#EM^h(yll8l1d%%Hlk z2yfMj+X4a^`#2?|EM;W#!xEHwv=jQ2vxbCj+5ED|T?@)1mNFTG=Mp;tdEsPp+=yp%pX~p%2yW-^xu^va*!V|O$ zK4(t6@=&6GVF%ooG``05~I_7{=1tPFvHg3phyfBpQUpqz1v zS7b)(&}}F2gWf!a+=3R_y(e?>9kP#5oKM|YkBxP)J78BC%i>lbCCOFb{yDSPf@Srb z@JvA#e8|8mLE1w+zcBJ}Ur#T+#BJTgLY9LT{r$bvo_?j<+D^Nbd+(nl8f0Eryw&zv zJdQELl$av_`&&nxTzZc3^BS(AF6*pDjBHGq3D(nXTQ$RZJ?V(q?k$D4O|+XGuQcl4 z4AFklq%VCb(Osm6?zw*8yd%~?cXu1pZ$|03vTDjjcF5s`(rrttc%6?*S_uc;r(M)m zZkIuRwN&5c#d0^oo?a^D@L3{dIm1r!fb7ws;pqtq*Oe`9)UKbrQ7XQ%F=hL)Ecq_h zeKBn2(Uy8HmeJP}EPMLi7Ox(io|GwHamUAK+9)B)iKiD&Hm^C~;Cc9Nv&%)!tAw7@ci_<5txt(Q}7ArFT$sye>+T9H4 z>`EdRsEhG0k|-USkJ?zLRJb~Bd6!VQvaX%4uI%XPUKFt%<(`jCc4?@8QJ(gZU9ZYo zoj;LJTqq;WPI63Pspx6nO$#e6aleunZ;@h|b|>iq`FkHLE4$BH8B`r?@racOHP7hS zBXTA+WZISQO1IWWhv9OrvvUWr%CG4YWK52j#a*N>vSDE}_BDK`;a3leXD-vsKwy_a zUd&N{p2dc1#}BcdROR5s!bSPMK{l8&41awtV4f2!r_f;1Iu@X#p%*>V9$k z>F+$357#^SDV=zEo6KZ2KN3RVmbD-eNr^6s z`V}9Y`fAQr5!S_m1>KZm`DwK~#koj-qBm ziUaBTt2b;{bTpd>79WM|5MOt{w^$%J$s>G!kno6FD(rvAzAwJb!a(TUrrKNc#ai_O20Ypv%lf)}fwNvb>SVY|EK%^Bu=Ab5 zC{Ao~#s}M$>#OwDwFhq&`N=&Pz{J|; zRyQ@dg6XBrwl>Gi&3PNFGqYaz&sxT^N?kkCd`iUDjB0B7L|CTaz(cc%XD44DWwqA# z$T~69+0o5g;P3$LjkZ7iEv<+FNGXd#|QSW@c72 zC|lNJ^(3Q|D8;o)gUqNXJEA9rl)Xt*c8RR`pL?HMpL~CRua{S+^WNjU&$;)y_ub#` zzIZqecHg(`zWBy4!Tm`>|F->QHC0+R`kHayO$A`r@ik4h+v6QQJYo4tNQlv4n6!4i4iskww-rYbTn;ZZz~^N$j=!KDw$kOjh-xjo1IW}qafk6wZM`#qvb+VghG+&>cF!I+pG^f?nniH~ZlXFq3Df9a1z9yN;Wbe#vkNLH|B; znn$GarciimM1fq*@h7$&ulD(hBpVLinpTnc>B=D^Ni@??wRa9Y9N?mtGR9(<0|g!p zh?hMveba<#?$-1Lg&X6~br}V2PYb?%HE-&E+^C!X=Cr9z27<@lpZkzTffT#dS- zz3m<42KP4t?j%mD6Z-7xyS-Mg9Q!1DciUAf6&PTb&< zQKPD8$h+s6=Uczl9$sQB47{`BYWB16Um_v8_j%K7Pm~l3+G=PQ3g|CEJ91hKcuDrM$|0yryvL7oqmZ()9%H#G>qb z7H4ige0$m?C-L>L=vv$?_#&8_#Jz_S)@vOrmrv`q-M)QLLTFq5k2?v!PbXx=e%XlG zgiqI+Jn=jodZc)`qgHgSC2%}JJe@Io^YGGTuLBecm1NS435whwnu#gGZ>5_&u3mQ3 z4YU9BTjc#NQ+lP_KZbqI_!F*i9CmngfcW`p^w13-@fETYSJTSWb&p+2iLmhvz5Chd zbq(82MeFn3fiLnarPqZmj~y{qy&1aOL;oC|_WRB;rvxv(_^|#s;}GAbL&@i@+}5^t zEJ%wEzs<>9^7Qmi>8o1qN{DZMvE0PoWBJ4MnSWG#F=3zHQ60S)FP4O`!3aRaQU5r`4TGiYi#uv)7ONIVpgdKj$iz+9NKh0{5nyAzi) z{Lo8%g|^AcS%W9WblP%k>5&Zelg`9rPe12}HEq8hqtE?#r;#aQIO(+gv3))bk0K#_G>MPDsl zxkvi^!=pb+pB?#XU^RG3PkvC^ZMP|5?RKA(q`v-<^VOeu&i1s}-^){f_3#(GPDZ=e zSMXut$2yyj86s8(*bkj;;T2h_^Xs}S`L#B{jaOpDY2BN0rGHY1L9^tL*9j5UAHpl9 zE9>4(@e@S3H*W4n%0#_G_!Y}e`iFXio)nB7!ibf z{Naaftt89JRfaw$K60pYT$9(C`Iv-v`64A?nl^dX(^mc6@Fj&kOU5_X%`b5C_dQMP zPc`$En;?F6)g#JShH3Brp}2CKUTT_!U#sGG{@W;RZ>Vmw zx0SlPXZ{+O2zgqOZQ^bt(XO1UR!X~UQm>}@kG1f{WPifjn)$d{?NSyvq}wMZX47xR zb5*nH$AeFOO9xIZTxD1`=(lhdqq%YE#A`>P#a#Ru&m0Zr40~zuXTt-QRpfX4{6$RM z2zN)U6q2E@V^s$vx;oi4B*-c0E-*w`WbsXZb-kwYoA6bzPu$b9o>CQB54O|#%IQ-b z=#f04Dxb{q)&BUsa`6vI^?E-;7e6+&>~I%=9@_2YdF1EE^#g=Dfs-aI8cl}Z&8t*;J3k~-Cx0s{OFH1P z%jh$0C$-MEX;&|=b4HJv(uJ1q(_3EV&aVDk8<**jmM*i*;zW_aSaHDD)#Bc(XPMJG z6&9a` zDh}K$#7mSag}r5c_B?;&vD_8PKDX@!=Is8?D790xP>o$#r|DYuh((?;YEGRv-K+ z!1IX5>4{jHM(sdziC{Om{137QB{dCYliN4b>ryuFaM;IlNa(>tO%_ELR#mb7V?CQR zjbh(l5~S^dI^q;NtDZ1;+&k3R#5U-3eMlNwmrNh)At)0o={6WV% z!>*x+qj5y-k;7}-j`Q{7)ivdc4?mrgt*d>t@Pw%}`}Do19)9}ySzS7pHb>|_m+H(M zY2+$PxUI0mAn^W(uG9H}G#d8-T_U+9^#)ypc-U9Ma^Jn)y^YRwgjWufl1XJFv7a2^ zcDrjM1i9p{9LqfsN1Ws-uU)b@daO}8My*vOJK1&ekczAAhwPgYN_q)O(T#6rtzSKS z&JN!^pSRyyC4%qhEe{X1;un&qn{7@p@u`g2*S~csex=9rCUb4EUgES#(yYy?GCtl^ z-u5ih;#xv6rDJN9&+GGIUw1mG*T_wqX*%9xWJ`MIIPp5g?y zzQ13HR;laH$WI@1XfmqB6%y@ko#iR4$NN=P2RWU5b(S#hS+yfjhr8G;QdyxOF`;bJ zOt|Kpy1n)N4!7Sml>1AWl|)@=+~^}RRy$OiEH6g+Mk(|En%_g`|MvIJhjfw3G{5FY z>dtw|INa*NJqRc%&dz%mGt`l4k-6`^>8OHJ3$?FIQbU9MqeRK5(g<0;x2A6y#g(;J z{Th7pA_`uc5te^tHw52Ou@f%HcvWGW7uT|wyYo;HN0$t}P<7rS@5k)oJuVVsGfx+d zS+4qv>QWUBiWCfn9zRuFiq~ZLboOV6QpVTs6J@j8q&@A}=B}uIqAUV!+5ruhf9aGKaYnIkjYh7U%Lv5>+p=YzT99>R5IeS_fCANEyO&?zFUp2Kp zwED4k=k<#L7udT9@=mawDeqdGxol_e<9dzEx)(Q?nSNzu^U4x9x{lP$Xq$+>Y|)MK zceR#J5z{=ZJ#y7x;gXM2MtJ3(GofL=ZdQ^3_x#mg(}}V3Wsf$jzCN(;Oo#bgsnTn75x`zn&jBEj2 zSg&*Rhp3eDy;qLZU5)goiP%xC7X9u?gt?wu#s~F)urJF>er`94Wtb{?uKDq_Q{+4? zyRM{lz}hORF(^#)pt~noiD8t#bi_*aIseizy&I4E+cLklvNn%C)IDix^jhd=4LJiN zM;C(=9g)+Hr);u^olsw)K5glG;fZogzwMKJ#cG#)+lted`(nEa>kA8y+Im^0F1v3e|X2G){0Vb?hSqa@aV4Qobt1tJWhk*RQpa$RCw(<@9{0S&&WFP zvSDHgi=5i2DF5Nj8vW*D%?_e0k&BK!lpnh#K8SsIbJ|I}-tqkip|a^`jKO}~oK)-b zZv4K!$E_BA;n{BkQ?<^semO8KnX8vgGvz}m>XbQIl+t$0$~d=qrBS%rC$S=s**(Nb zJ8I=bmkK}rNeN%nqI=H~i=?|MslVEPd8D}Trim7Cgf^akoVx9)_91Io#Yc4UHyv`a z#q+}ps_z}Je!Ox%r=XpXEnf8QOY_EUnkmCYb(8qJ1#(D6O4o-XP3Msy#IiUMw%q zRn#=$iCl~?&Ulg@5WQ0%iEiqS)6M-h)fHKR>F&nN^{ZAr21MrEqPSUUm1V!ldD(pY z>LRnPXaPa7XN;iIpX~n4)ua9U!+`2iZFTQo;xF{9H)(hpCfOu4Si)2GrWMx(&fUzi z*eh;#@ncPWS-oCv#eH$Y2l>GLfy_5+swHxzubU?x%%8~Z&wFxZGbe8{@6B1IH0FTX z;xo2q5+F8h54Ct6MWLxk`;p3|mSR=a6q|?pOA623kDb}&&c*KWP$z7&651Tt(W_TSs`JlNjQs`dQ{} zLCIUYG$L)tLh=4ohxN;u^1G-*j!L!s-dC5?3%-)CG2Iv%usxtudFy`RU&eg@(%*M=Wx#>$8_9D~b zPCQ56kW*hvneA$uepsK$Pe|JDHBiUx_>Q@Z!TzL$wR)rIFL$}#4jxIO*(|r0b_?zk z%&=bFm=ksij2uk(dTqzE)bZ1@%3V42v$Vfgj~-9S5v!&RoNL`|o&Qqr@ZNFmx@4Kk z(D?w9FwyDXT(=_!oF_SZUxa+{iVVX=JQRHXH1FU~1wZFYGV6Vy&5z%Ka|EkemZdBw zMXRnTWxe}-xfPn-ZoX${shk8L_R%vjNe3Pi8;$FAxC4n&+kY5}wHe!SM`SwW)syBQ6Vs}fL-UFSsNX3Z(YkA;82Q_~$57&=3amv zR*Q0Z^<9Z)Uy-T5kUeMobgDy@bCieh%JULTyB5{__@vo|jFH#xqJEzrK2f;z0dGD} z>r|V$Qa+)l3 zy|_B8c7`%J5#HVvRjW$t-eu$6(JwdGGqQH<@Gc=Yi}N@23mW)bMZ-h~!#zfy88^)s zRu1D-DxMeXy0o$P?9O&@we;z~oAG6{&DAYh)Llhp`f>fzCHFJDZw^!jpRxGZ*^!=} ze}TE`NYAjGHNOU*`kfe;Fvf(;l-7dRgeQw_-HG)Zadq2xhHuA^FYX9F%zApqOFgv` zn;zZB9fty!bFXx5%QhnZ?4-1enEWLWd~NRMjvKwa?NG18^qqRy`OZU1uDAHF2X%cN z2=Q6uFJ24eGp8(Ysj=^=mFsy}BVEGJXL^ZdkGkU(#!{)Yim(0ITV0=bbxiDHh9T>mMF&mU6gIU#0UwyIH57tA*me zaKfseRA#+!a-G=T>oR(QR$|B4CSh4c!ikQh z9{1u#$B&Me>p*u+hFP!qoe`J0wdzMcP{u3b@70;nXL`;{MSS6|dO6ZaDXWNoSm#FX z;59FXd>?*r#GZ0adHG`9Wdx1&Ujz1 zQ;AsPHsG>z@z#x?;?`;y8KsO@z!!k8$`dl(=anK{xV4BQE0nSd_}n^4dIyhrjR;ll zs>Tryt4(#I*Oy&d6<7-KL}AgFbY z&_`%;4)l)5PzEYmyA}^Pb~r}WxkkuGEK>}c5@Fn z&XYw@Nk-O9o{%8(j?O1!Y$ME4?FdqMtm{leF`sku<(}VGU%&64{d`EPIlgKK;bhQ3 zk=)GVCNGVfd8pGryO8ZF^OoZYRMjOcIXUWQu8lA7uA8~$R_)E3sj6H4r6t0+*L3kQ z*WDWmDgxL0_3;DCP~i7lM8m3xI~UxZmkWi`&Z{b|G5oyj)iiD5&Og3zcCvH$kuSTl z99d&x?0(}P(KoUT9ZiPXstgUicHOsn`?$*I`9k|szRjU8_)O0_ar2hROl^Mj#nHd-gk$F&#p~Jmr^AaMQiTY+kMHHp z>WL7GEY!A+k^30YN!^ccyINdGHA8)0>+6A@)`(K-``SGhO?I7mIIEsR~a|hhLU^7omxB4)Ip4m*F3{EJuu>f&vytpvXZjJa1M* zL=J8ucwTB>E|u)g+d=aR`x+v;ac{NpEKZqJguTggbs^NIOgaa^hxK<+(`heD?u(*2 zA!HsruNo=Av=L`AQ>P0$=PmE57h)o8MBx@jhN(;W*Qv5vPhB*blaCd1DIu;3N`1H9 zR(~x1NaPuQo-4(bL`vc5(Go-4($5~b$ZD-J_4*V__Jq&nkr~|XJmwSz}cB6d%dp^<4o|6h;f$qWMZ5d{sqy< z93M$EGQ~e28d>3Q6I+krpAiYI7Wi1Aj0wH~+{?wM6J^ZsRm385{3T+MDgGX@$O@l8 z^gM=tLiDu2UnP24;q!>I$MC7dSqppxk>3O#P2{)4XA}9&@JYl>b9@;w(-a>^%(TK6 z5gm@os_!{Dn2|k=SWQorr4q4!D5_L@QB}5%dd<;>?jDXK2)|lW^h&7h@a$=1I zK8jdlg?~uAV2)2DUa-WM5-(WbuM;m=;R}fy=J*U^dHs}jX3jiiJYAG(a8+%6nwGKzYU$XGdhieL8=c{owZva0J~zeZ5TBdjVIonYs(*}yb!hB+ z6YbpMvQiY`S5Rn3)US}xLs3ll(4=}QZJk4-`}t)}my3z-Sam*q526)VTqci-52`vg zI>!IlbUBjf#-{V_dn4_gAIl0+#v!4`QSb3pdq)84HRvcWb*X)@Z^s2XE+>6;PFXeegmdqxd z{CH|mcW=k|9K_PuOw}p}6Al|hIqL+d_^#|~Fn60ED7w6Ox2bPnpm;(pt#bY7$w}pf zQpNglg0OS0bB%wQ_sVcg?|#K$P1}lffrjbA6oHIFyA9)$pHf$P#RFDqublhX{J6DC zW>ZyOQhA|L@#FZWpmVA7hF_VF^v>)=&TE?e6-fsTDxH6%n-+D(CmXd;yJ&Vx>~t=4 zUe&yBf0V!s`YIf3vODsVO;}nL5g6jT6bS$@++mMxr#%j(U9*0=V(n9 zJ2&5xaUYu5TMu;iB_xk2n@t;>FD#5vKcd*LcFW$)_M}l~b3iL=H@9IkS1Q+(fq$V- zLwaEfO{-FO>fz>~)Rbw1z(Vl`&==ucD}8sWQL`u^wRfm@sMMJm^g{^nbFSzzYOs5l za=ewXNI5OpO<9rH`=K;Ibb_+wwwh*nm)%LvE`yY(Pu&h)`L3k+K4siyA*Ou4B3*iK zQR$83N@cTe)1PcC8U}JwxLxAhq=hE-wsdGzR#@`M$DegBd79=XEjZ!R;;8r8rjljh zw)2wT1finKp+PG@g)*n3bV+bxM~hV8Tf6+5$*}S*Z=s^nOUd0zPv43M7CN6C>S*S6 z$#g5lEpW6vQ(v%`JklJJ+S?sdVM!$~;3_sQmN}nP(bd>+xW#UAL;!{qO%$!vDl5AZ8|b^5J6rjS{2Aoa&Q55!7 zCOf4P%0KkJEAm;f{Y45*N><1Zi5G#%TmjUF_m4_4Y6I# zzgy3D2VYF~0nI+n`4wJ{NqLlVC_}6}I5t^4HK_i`i>_M@2Hnl=t+d_2(a9;PL9NHX z*}P|Yddu0t&$7JhXhU;Xv!u~ew`%?7BGAZV@c4|47f#Vi(M#RUZp!1NP-+nIoKIn3 zOv>YwUm2F&s~3}_Qdi!b^DT^z$^F=zWAw39N7(tMvrb^2{S@8FNu`Cvr;pvj3_*jD z&@sOkUC$e)i&Ey&jk;GeldF{$B5s{86o~0Pq^PTIU$m$w4_YKN9-p$QWq!I(u~vP` zjxZH?GF5ru^3$Qx4Uz09&NOu%yEK+t9kDahU;2U?{LYFE_YRltkhf12_ha;)*=Q)} zZYKM(r&~tInb4xvy0=LCN^*qKm&oi9Syatun&ak5&rV*Xo%HCbk}|&= zd3WZXj`Gyh$nkJDW3fqcL&HY>y3!oTza-n)@xw@8KZ}1#cEHQky3#*}JiTZwrsrQbe}{8sjd*u9Gk4^hc}?09JXu3RO9FZ4!s(aR^T zrQha9_AB`-TjGlhbEt;R&AOdRzV!Kp&X1;6KvO#1*$WX~S-G~w+YQVbQ!Ci=_jWH` z>C-cNe#+@+>H7rE`L=m$GMHz5P%+x6AcOHh+WA$5H_y z*VJtOx?nI8bqz7pj(hmfO?PicTxu|FzCrhe)JMltgW2hf%qHg5Q-c}ZjDgT-`0V6C zsr~k8jJyunxmLwOhLWxA9r@Pj6)K4Wq2bv>FEu(#b2mm3Q-gVqT6SlXM|Pi`v@aky z*r!S09P)FSif{OPNbFrcX&4r(Tqqrzw;Sv8R)lkMR zPtZv|Ri>n{ah`HxFnX`GW&X8|Z#S6E?7YiQ>$ropKKLsWF?@AXi1A|DU26X5@OcTf zc`ny=`iK-VnBlUZJGp!P#7h%PinJ%=a`~Z z8GWaPdOBsI%a@dPm%h8(>_88Nu-zu~uhnU-ZBO<(vE6iy-P%!?mTsmytA2x5V&=qM ziO0CS1-(6nLn790R_eg9iS*H3*ZAckKL#^>;Pi zT|<#$jj;EnWz}?RIWi-O-O;z`vR{esAdGvv)+wkJ-rZp&tH#;7TaBSr>IHMF#0#EQ z89ZaF_%d0m^fFbt)!A1oQEBx%qQ*w*>+MJG)pNgiQ4Gn5+tI=7{B$sz0~yRQL~q5a zLuE2~<;Pl>I12=H6SYR>dAReQ}Q868>Tr9J|+QH z`|SekgR}x{+KhKtt9RUC3u7QiuQG+|w1vx3dQzNVOs8S@ULZe%ADW01-Vi`ufe81d z`7|j*M)oZ9e_nw=8XY{p>Vo5>M*l1yed|DGj*1GFdj#!x-s*(|eF2a+CBVD=;$ozi z+t1@fp6^M)eIvc6fPSC=p?Gd`A6H9yO8~S`k$Ju+8+V@zWs1Jzfc9ZP8?kUlfL8(} zUgAVauTY?`^uHI(4L-Xo~2qfyKd9DfUZ9Jja$ zmx*ff9DMNve4H0~#Q}_@;I>8_EleK`K3(&^1-FXKgAamZ%}4%NBk^45Jr4U|Klp&x zztE4-%wo^KwBdG>SfZa2_|F={%iz->b{}!qNKo(rihpT=pXi?pb>PUiQyg@%gm?Ae z;?Q0*FM4ol=wP7-7lL-r@ae_LqJ#UrI8}6znFsN}%e^=;^nZeVIJBP#?AnJjKxfMP zaCmf})Q>xlGRy79okeF@2XLO~OcXLe`qwNC;QY{m#~{uJ9gGg*&Y=UtA)G5Zs2IYK zC5LgYG=R$f;BbxUbNF#Tjtzb~j59>BC`K?Lo+CI{Y6R){i)8m)~vk9Ch4M4H~F2(eu6237BlpUVHnWCzx?2}H1i~50TMqe=fGr!>MQL!6e zaNg*^=PS+wl{WenlW+75=Z?-)e*?&f|M(^`(A7x{v@(fl;yMNRAUK0lUG;try8odAe((wM{O^5;N|5g|M0 zv9QI?gNP#1D86H=d4I=T-1!~z?EW9P0Fow$gpLAivf@3n-b(by911S;a-FU&E|{tSedF@M}%#+0X7!Fi#wLRK)LBP&>7 zZC5er^{beHGHYN4Q7mx{cLo*ldks^=a~%V9u45qW-v6(VX zOqu`}rsORyh_pZ!xiF2axgj@Hkyf&tHmqWeazm!nz$f+|S#znRR5IbgQt2)akc)_8 z=7mT#G>{kaMRl9u#S+Jv50mnSkCe)=6h9V9m>-Hp$#)6>a>VaZ0vKri&%kykWP_@- zO;u!f58NgX0@uD1%d%a9AkGL~svzW#hSzyXg60W4Isz7hv=Brp`9VTJCq&CRA&{|P zVDF+nB`^Vpj{__pVaN<+K@`UH6c>R=JH!nUEP2*NF#nto#gd>y6w^~z3?w1KJ4X!5 zA>Lh>w1iz)ey;Aqkk9OfNSnu}-54J$aV&66;#i(3NMMWNz64mph~G`TD*Z@)SCqt- zcZ4M7T~ z+?N0ShIYB9?C#6d^a1<+LJZwUZK7 zU0RiZe8hV?%9yM3lrbt66)bNrs$dMqRj`_1tcooJqAC^_2{nxBmKs)VwyR?}q3W3R z3+kBkvl?LeAVOO;AkqmZLk)bY*hLePL#I{t`5T=cR zMzx{i=!~`wWQPvYbui!1>0*n+TNg`~9$m-^#ZlOU@wu@F!&%((XD#l0kA* zc%C?fajrasX}I$+#wX@5hCF>3E6InBVCFnLf+9 zJ~e?NQ5+3Z=rTHJFvW6W-!W|P@)#6@f(*={2z2n#3@lyObAT?QicLFU(!Eb$GYco6P_#U%McV{b!lTZ}!Oszk=#(QS z#N7!)pL4?G`=7+Nq3ob`Afiqaiv2(_d`<*dz zbC*Bvbot}pvzYYmvzT=IbC}S+a~MMhR}5#=74!62H>?&8xnX?l-7$SS+_4!m4=k!5 zJTQGsJu%L$o|s?Fys()zFN~p{H@1Xo{tQ%nuqvDDgMkFkV}q3QSS6(L#byY92EYCc zy!^m10m+~@epmqnHw;N9uRH!&L17HQa^X?{bOMdo0Am~NOIYv{h}b5WLm4;)VjlVu zh`G}dkIhWru^>1FVGjQEXK*SQv-Rtrfkz02{51sQ;}nWH_;V-*IuV9>dLj&4NZuEq zE2tW47qBw|u#5-3LVz^U>DL5oTJ0jHZ|X&ihhR9y{y{hvB%Vu{-;*z4(c*}}bh#0M z*~A_RMWLKCBQd48q96h~lNN6?{n;A2?9DLhNZ(;8dmunYeC+eOotRuQaBy+`f571XE|kHh>aQ8t|60& zZB@52v3UQ^#P$H|JJ4a2&;2{tS*kh*uxGpr38T|WcOi3haP80F(_Kty(?UfR z^Z*h^{}=oKoO2Px)(6-jRpcQy2!03-w+QIW&u#T>^HPoykJ092Yz|}Atxh~ zfp6qM5-2I+cM8TiDp+uiiWQ#Af#?Mh+J8Gvi*BJc{euf`E%Ku*5O0$E(!)-<5G&Ka zRv`8BCIT!)fdX*LBZwX)89-*q84wZ`ST+|^*mr*HQwb2p0vx5aMW`z5n2W`?C>M|( zgAh`Aq!%^kPDEeFY>4$X1sT~r@PU})TS$vp5mZ$e^rRMnnNolPNW74HXXNiVQJvxU zc@Peb6!nSuFQb534JZI&_|Fe$n1+}KhjLMKz^$h-F6#M!%MtFsAbR*EH#I$cVgyH$ zf*K#mgTOgpTmk4e){>8r4j`l-{sW1le$grbv(bDc0`CHlfQS#%k=f&iNwaMQkPJGz ztq{xxANz+nXl>07%YmD&s4>PVu4Ko7A&KNyNphPLu;5b=0;F*^d=w9~K=3OO(5aIMXcxTs7!pG> z;nDbk`*I)?@@dG(B({h;bcVzQbafU$8C)y|4Bnq5&4Py5%xGj$E*rz0YWaYA5&X(+ z;nMEEWOVh!xd>=^5aX6aLpAW*9X0=112is>)sBY~XhgL2Iy&ZHr#h{3h)SmGnw6FJo#(n3S}X8)h6EBFFnnEZo* z_7#UgUvW;jbqZ7`#Lid*sWDI0B-2@)v~mB`2+?Ap~Sy z_7_A&vH)nPfX1xkuC`eo$e=Iack9w%hJ7lrq<&lpn6Ouon1IgYyHVrms=zE<^AGDk zy~#;Q-|muhYa0j`>vl3S=`Bf0TlWtU@F*+%xC(Pr4Z_s<)mAudQZ>Yd%H##j%PI7U z)bQR}DmK`-8alAe7`|N%X>E&xKU719xAh|b@WXL6Al(nvKoZ;JVecBqj$C~N_Nf6a z7i&hSX}9D8@+mH46QcMyLJga)QS<*FC~~aZCIHLVf~Mt;zo~cpAB18A!RIdm9h}#P zqZa^-?LGY#@epvq0;sfyx457QL$?OKgl%7fV*>K1E%YVO!{jqHEWZiK!JvOA103tk z%#6aO5!m22YS`xsBn``zfJPA)Ig#GYbr3s>aIOv@5T{Wi#E};3Qt0$BGW~mo8m{{d zsoWao;DH?mLBb*8?CSw2V-BT|MH)tP!k526%z^-BUmV_6BMfRR9RnGe`4-L17fA$v z8nBbpJN^prT3JOw7VwA@2qz+B%mE(zY~!RLI?i%t|6X&1qo%Mu=@ELX}r#ceV^@SHTLN@@~=Y5*3LH+5;JByqVMl z(F-6n+l!nW`vJ`guxM*6%E04IaGwg%SK>902~K%HraZiJ9W-K&INyHge2gL zAHm+ux`<;zx%e7i;%Ne^z5uEkY~kX_O~OYzdV(JD^swtCW_t8-b=Die@BYre?xKZd z1!))%^HFh3O#tjGN+JjCyV2J1>@`>wQs@NL{?EhGRrMbk^nk*qm7cOVCi>Y6GRq+`4`xX6>JS( z*~rNDZL#WvD(uq*j=9sSG>owBHyl0cg=oY60)DW`O#+&&4j`6$(*c=6e=0GRrNlF||dAq=2flV(=GhPz(@PUwsewtvZnc(DNP(%M3Ex z=|Tzs$Pg|Vw74f_077)G4S-`k5q_F5zZd3eRP`YQwCPI{1r{L3f0T&RY(4<+I397j zKGOA`6wk2;`zquBxBz~YwD37|bRzaz*}gq8Y7!0OON5*%c`0=l*w z7W^0)L8zO64~}hNl?s3O2sxqgjW(N43N zs-$It^Wtb2U|a_X1mXjM4ge0mjTkBiyLSM`A+zDgtXCQ`i-w09-b@2Z4MjCoh+D3;tbX@6)e_`<$z{45IS8%0-;p` z>H7=EKL+9cn~rq|QhqTB39M8)ShWOr$wU;hSGEVh)64!cp+)-A3!zFk4L^WWK@c8- zlc(O6Ac(?sJ>bp?VmVhYpjWK>%b&Eng(I^^>q%Zjm)@6p8YY-`7~77v^#M3v14g9| zy!@i!kCzdyVF*0r&0jbtJkW<({T%^qd?Hm5(1x8B>9LJ|a1%b)4?vT%m@WN~Aeu{8 z=1Mmhfm@w`TlZ`+gC3smhm29*zY18SD+It5@TB=IBAL{!X1K@lL(!gE|yfIev z|HV&TLh$9`MSzNWh<*@gRru?#EsU_Y0!UWxK}_pw2;6=J@s$(|_A(i`+7DYn&=5kp ziWyV~f(wF!gXxwq)-eeD%i3SkUGT~f#D!WtsdFe^j0)W90QWk!-aX)j<%hxD1H{dQ zVL)F%1DlS4eW`5-Txs6u0e2q&$UcCqM;bZYi~gS#SOP;M*b4L*0rZOOBzn*So(dlM z4DPwKjbNrtA@D^G5*&1k=79}IA#PN(>nH$ubCE#vX&_~5!3+u-L_l5w7)XGY4KC+{ zNc%*?0=L{_5X(&vON}jIx&?Ma#0sDVDFur^0WNuBe`RxkZ?}TRQAc;tGQt;H0Y4;+ z1G;U)=78Tfz)x`tzjjb)#-P2ZFO-F)5_`eQb^1Rg>k3>l205V_G~>M*Jq?h80g~|+ zR-^JHB^=d(Xb^iYbRR>BBx@K?ae-nu2#Acf5a}!bwFmX8B!L3J4&C4Ww;6*BUa|Rsn+b+}6!^4x9KC=kZ$g3m+235$J zQHP;nJ~stGg0Tol6&~RNhblxAtNB=iAaLOr5O-*c8|813P-}0}GNT7_6#v?`b^rGO zHx;O6vjv}+fU1@>4AAdRV^<4Mg0N>4^ zrG(#mV8yBgK_b7u)o20K9>G}v%6>!wffY&*`^{pkZz7lfiu+Nb$T0S7N zgrPsIcB54bb&By%01^B|%3Ogga?(;q<-bEfkH!!Xx{_Gn)ISGV%|!sJ`AU-VXTej$ zaf{%Z0&#U70_U6~!O_hKaW(1>^0|wOpFx;B!I@caOJtADlkm~?JjXyz3Dfpsdj;$1 zL*l)lw(8LRZ+!EXNJMBsM2`^OtyntZegP$Zul}RN@Fv6rU;G7;F4um1xG8xUg!VqT z8r`==6N7aU5t=01d$Bb;L~%djIf$Yupt0V9znuckS_P#K6e$rnmx7KSZllC1L+mn8 zVlO2L?tO@c2cBJq1W`{^4yNuF1(~r2@Z7ql7pVT>7q$ZIL6S6e1+cnHLjs{Y^j82v z^FMt%?W{ClwHHxui)!GG+$!XVB6$@&`B?yf|My&^2j5)<&z6wLeOm=Wte7$RYmhW5 z+7aycUK|1E71k5o<))B`D zk-#_B!A)^Q{9|->7e*ui3e)>tbfAR$V%wG015f`JV5ByP!T;>cQvVQnNz-wYwo|~= z{?b(6tGz%yS)kt5l#`Sr5f%4CjBte<9S%L#qR}~W-qMZ?4e9vd z8!niW4H+Eyk&P)FIC<+8j>j<){+}(E7RH%@Y)7u;(L4#>1{CSAAR&Pz$pE)*V`f2f zWIExPW&p652Ncq+2ZuRJcpEwM5tM-;Ibw<3Uj~$LDmgRh>|KI@2JJ~8Z~#RQfuvKW zGz9?ppW6zefg32XvnzOkgok_?Je}CiEDm4O#O^HROnpD|7MREYD$!PrjNzTzne|bp zdu#`!m%xJsg!JilW+BqjRlYEI4tOXIkZ*kgs+|_IFscS4C1BtO9tt38yw+kCLubQ~*@PRUS)?sE z{AL2Hm=fxD`OHBUMguLk-c_+lAmLwpNk;?I?ZXc0##De6&utP2C{F_y$5BxKx5G|; z>z%#|!uJkbLu@@=E5aYBnD?OuRl6q~lLw2;1Gr`DX33vM;+&aA#|XPpV_R4dH4yqF z69K8hCI_&(J&DZb+$Ryp(J+gkyqkNhl)liCksTHI-)g;Xr>!X3|v; z4;=uJfj^2tLIRx0LwY)jRIzIah^>(X0%|eBpo=*bJb3ueJx$->cSt230KZCGR(~xF z(KGKyt!OX5qe2gkOB%cXw?wqOA?bUEo|$yU7!ci2u@CrN99$%By_7o8M^XY9%m7>H zV}}F@2B6>UAc>3j5SJ_8ucj`9*emTJ3Dq8Uu2_JM=C!JK0KeQp2`i)ct5x964JuPgghb12Pt2Z9Kqip3$m`4=<-F>}HzIPjzqi7gWZ;69YF6F0LAY{J4!n?yy=3Ac%37QVO8A5uE+cN?C!>QUXD47zybgWmu2}G+%FHVOB${FdZw!a)dv`^_D(3?=~9`!H+ve*0v#H2+}x(9`drjep)xC}(Q{~yuE;F}znXa-Ke z#7CFJ1hwif|11P_U+*u7WEHBgG#3E%82klE!+%Ai2`NH3aIO-p1yfD4tSm!dn#n72blJPKPcd4K7?jfJ~x=yX9IuWVYYyAA@r1_2qUMLh2EylQE=NX zMeu*`r~98q7-+&*d9cFw=Ec~3N^0<|1MIQ3TXgC1L0F$dWoh#QSuVlI#2(Pq=TG(` z(XB&3%NIy&=Wo%|z}GHfTf00T0R6wVt^};gqWc3bAj`d%R{=%#MGO@|5;Z{-HI;}U z%mtK1#7tyUG!Q)>$ zH}5U<&;TW=aq{!;NqmdHzTdD6j~15dqcfILR%b1WUh~)2{4#%ZctCGWTISrg*&Uby z0Qz_(6GSWbpm=6KIOzOIHr)0#xa}8}G5fyH6l19&K$GQAr$F%Wz=?KeZ6sxO!e3zi zW{tBfWsCE;4}3oxO}B$Jce|VaGLWRl+%fU&y>7^x#v#hcQhIr5y^xD4gS1Ft%cT~_ z)qL4wFPy828jMqF41rNQa{u^q_raPbx^5hMDuyh9n!Bwn6$NWEgpJ(@hP-EYt3-M| zxf4JspEGDI{nbg6d3J0Iw`nfu`Yx7|s*8a&1{eQkg=`4{mmj~h0x>I*=j;xsn|c(E zAPcdzI*Q(u*;y+TL#=PB3I6AyzIT+F3N6b~3jFc+^S`@{RhZfJ?}WuJ{z5DOQry3kQ{IaK#! zW4f>cuSwE<5!jrLbRh)#m~>dg^NR8OaYqVJ=<8ypgX8raxgh7tD-jq#0n9pG!S`=6 z@GW%D4IwbR!q^{of9}nR>t-yq90kAbe-fVuSQV*x32~mDY_{JH^j28E6BP7S52fUW zD!%TH@%&&*6%kNy|C`PpRB4CTs(j>a+NgDhJ_L%^qlAW4bBT|(1-nFeVo)7zfeq1%XT5o`P z4@^3T9dGo&aJ;+?$vo+;2hJw4MCv}sHxlsgd<-eP#j%jkan1Fo?$$!;6!f7UZVw4! z{E>2Z=UyV71ec}31{VwU>*Ug$v+reaNeF|5y}Of7XT-JJ3iS{#rYGPn!wvWoLi9b{ zx~R9&>P~lE^Cv!Jw^`beYy8GcLRP273z@QMi_>|tw4Q}m? zlV)xW@2h7I-z2sA@3&a54`8WkYL}WPQPbyR<<#Z5I8azWJx{1CJnry2bW{RDH3NQ) zj`h_Bi#2v<&x(hf;P$}Qqb6eYQzhq&VocP-R(j!~Vp~?^7uW>eMUtrov)kuL{O+YL zo^&}{AJ465jOX$^Lr7Yok1TjBG*_goF2sJJ8Xx3Xx;yY zB#3>}#hVi1bY8DA=m#85v)ZcHxyZCxIP811vB_L`E{47KR!r+(WQo;-yVO|F7cPs79^=zS?3k%&!$n zv8o!+e#9Nh+GOZJ&~DfxY4h=m^o-oPcb{y9b|uFv4|d$u~dOE};*Cep|& zH_bTZ^eI&C05z%wxl^?gA2#7k=?C#o%^=+{jt)ZCcMeJTkI%|t9K{SqtJ6{0%Gs#U zk;jw+Azl#ZSL~$fDtqpvoYPx_^}`aL3}{n)LiL~W$B}d7|1^>`_SGVX=yaYI57YX( zSzk`)o$8&G>)zj2#cOVMZwrk6AjULU@EvMn1P zG@D;<7s#;BA4VlNDXerSJr;MCfvB0_aQb zG1pYOw^Kj3?E5TQPu`cU^Z&w1<;xO+tH*nLqc{|Eb+fSAyqrq(nW&jpCNt>1iO zeKwX@SM;prh7a5fq7GE)ZVC`YEJ;-o1i9vI1)l9=@-)Cy!SMh2F+7lbl982^`J>Md zm+ISA9m5NQ47e6QF#+Epe^E=cIfTC_ zDND4Xx_dobN_i;-uV>-NKn&Vp?y`u9ga42q}3Djl22vdo;Qy`hz#tk&noElaa56pEabTtKy+=m z7B0H;egQ%x4mLoYMe8hX?Kn)fZhk@QAY#QcUH9MN9U!dDGSF{u#>epI5wf0%D>LwiSP z{tk@4>FrJZsSLxhD@~H{Ye^;-QI-~?2p@@2kqWUxH%Nv>>5G zj*o4FsXR>!6~Au*mTe*b?n6FvOpf$xk;z_O4B{dG{?o2$g&0XZ@^^Ln+dh>!doxiR z3M+=INg4xB&OK+0LC-Tw47elxSpq}(@DaR*;TvZga8GjVr?0283+B(=1P$=HXt<(@ z-{;7YKz-ignE>vod@MLMl}gCOGE;l%atl}C7<8UNM=K=ADP0>Rl-Q!rip$;)b zl!@aw230WV>m?E-98SVJCI>@Hml=HK9SMg2vNAtG9+L(5E|PF8Txl6AxwYGJ*?Kff zUxdGK>*uRvYsYb#hZtM;mcy3zgwfB%-Y`U&wp>acr;QNZY#awtxAl?~w(3Y%$LT53 zUjW&rQdYL++vV@!)1OHrQbxkP?!WGJnMc{DO= z5S`D_{KU|jav*;~OLCora^K#TX0yC7hIt>`bLtmihoSZ|bgFJv@%D_5$23b#ZphKF zI(f?y{I*U2zal3IhqZfiYt@Tr%)=wUOmyCC#vNOnKnwgt2Blgg2o6tP?OM&PQ`&NC zM>_kWF6(`69poW#KlCs=HG7gPe?)%N2w9gyR@CjRK3&^OE~OK3Sj6UBJrP_=ytvh! ze)clA6{}jzL#vzw((-1pu_U^@5A3zgH-i5&vlWaJlba*sJ07sbHjZ*=Yn5ym_))fy3_DnEle=2 zJO7nu2;{NAYSr;wjL?}bHnpO}9_H4MJ!o^B*(UXrXz*PQM<;5PhjVk*TUZ`g zeGw~JW#;Lz$uj4oDf_@+2%M$LV0s**deAq~*r)d9N%KWP1Y8!w2H1Y#cV&cAmtE`i z&k>(~F3CYW* zg5M|8jCI|b!ls)Y#Z^~frGJ(`jO0>H4I(N(t2wc;IXOe}i=7Ei_}XpM*|`6;o!*!` z82Hm4TX+7{zZfY!&qrY~I^9vm^c`tcd(eMetZ&mt81zZGWR0~ay`A4Qw9cLw0hZtYjuA4m4VE&#}gO|Jy zzDMxIZfy0rxt#G)B3og0pu-+`!2sjGyRBvAuc$g5LF}O7pI>37h?QoUUkll1Ivu(^ z&DO?-AdjaNXB!*$4YYlRCR4QwGf?U}xe+^MHLf$8W@`STqoC!M_xwQEggH?M-fo+Y zyKAc%?1k9CAGvtV9KSIW)PKWnCwmAY@Z`R9XXI=;=`mmEv_oM;W8Nsn4*&W7o% z7Omarz-+y|HsjvYwmw+SF-W)7YU!tq%r<~3%TO(y(P;LOR?BhLn%l(#_d?mfU}gs? zx=X&#M9+(8EVB1dzpa2a;;Z`QiU*7pM*SYZ&l%4^?7z0yaSYbN8!V2(weq1MikXrg znoZ(%k$A@QqT6!YkAd70)2J3pN7`Aa{+`)i4&cOn*LH$n)Yfpni&$-i2!qs3b_%YH z34&f_nunOW*>Nv`EuTMCV|xXSx$yo#(}2<&G?jbp;z65qbJ1-n(b?#C~ImF@fV zSGm?zj3cxH<2YSlk#GOtmjx4E7L2FTD|CWcjNms_N7!7U1qg3*oSPGt>CJeJusij) z$NFI#_~9ozAAaXVTj(-Sk!j3YodE9`w#a8Y*;Z%H#rWdZlk0q~9pT-=&h*J#Em+7` z#~}B82FQu<+Tj2Jik%10-2DvlHeNR@uK}!J(1tU?I1t>??e8UJK{8D0f(W7%=Ui=93wgrkE ztSGgK1}xNu3*qa|_n69$0vyJ7fP(a&W3ofMs#@zXFLpPe}&+zGC6@=_`geoVHNJX$LRrcgA8*j*F0>#+_+yGAThWzu>rV5e#SK Yxn>k6NF(?#tPT%BHkq6z5xj$8jMm;7c;GZj!A9kBF&J$EoHLvFy+aD+Lc7`bbBq`@y{vgUlUSVUWrq zi!wswS7ZwG^Cg+1E{S(L2GLVff!PKfnIiLNQTU$HMzS)LXcn?T>G5n#b!z<8|Ir({ zN@l8)61|UXr7eVx$WVB)l=+F!8(u7PoxV7XN2DT7HFE%Sic~SoP(Tlslw~gSq9GRRIZP9^%Fq=(~hmg;V3NXS-91Biu-0!0MM|4wGEGdPrp>_-3q zkP6lbxj3K_L9o^8sy)R~Y>`;GJjF6WWF8z{mT)I)o%~S};tJyA5RO8I6etwBtVrKp z#CF<_tVq9gMD3H)SehZ6XkrYWc=j)RdY%~etZDz($jEFvSpX^$21!K-97G_5GR865 zkgx&>iSX&&=n!iugA}BKQ0?6p3 zj-VI+I5Ek!T}00ACn##VDJxmdk#Qm`0OD%Mo5Q1$0vBvz&7J5m_iW zAk1|ExhD|3>Sm!x6vn@E_`l&LKtAt5t~6YEjAV2jwXg$CZ6t)%A3#Q@7UTZ284QWm zEnXW%(~-8SZtd1G`Wwg_RS3b}s+Nver&x0jEg>Xvs()bwvaFklkdQB!Q@&e=&LMlO z*sBe{H5Mrco6qYkf_%v&sZ}U+!{WdEcsUKpUaAyySDyTC=DFc*Vf+a#TcnmSi zdXhd%w;#!Ih*rNeqfiiqSAn;F1G^9>H$%h$u|{F&>M%nkL^K#QH$eK4>lR1&P$hqJ zTp(-jt$rS|&bf6%4zRo(GlW@tGfu_mifIO=}>E-*tlM0xRD8NW6 z0)2EapxXxsfPX{D1QqPWj3T;_?KB2}AE;wMcxmSsQtXj_TLFjD!Gk)OdIZGc&X^tq&{=294zvbn z#Rk!85O(pzoI;N!YTmI^9Vyi&Jn00XEU3Sjll1%a9=KF1;v7vNHh2qhWY_M_z#tlX7KR$jZGs2ViFq25eWl;-}qJz>Uv7FE^B7p>pHe*~+ zEQ2rBw9PP z6#Ltpu|p{zFy9bu2%!O%L3uMx1?2d%kDF|T9O}wb*sV}A8Hit8#@t0p2L_u25a3`S zbr6XI1je>!MefE!e<&0Vc={J+E2uUMcXoD?EF&4Fz|xdO=r&>J$*T2c7EZXJJ{H1lQcv{Cv59#qznBi?I zST{5X2vaDtgT||hm%;`wt6?|Wa^#?*u^W6$9s3Y1K(u+C!iqtWTLCiuI@oHI9gw4) zwit@ZU|@rTjj%gVJP|tsG(n3+yFWmGjDh_$oc~fCdar;aOtI*RgJRKu5r%e|Vds&h zAWgKhR^o|JAwSURXO7*hoIq<@%cw<>hksdN+0dg6X()sj$ZW8+J+>Hy7jZ<`0XvIu zCylfLhhxK0_i1+Iu93IGADpqt2%W$YN3k`i@qZ6WI@&z}51;VHp8j_ijrc@pO%D;) z@W*~e+bhH^&`U5w{=$H|&W2)lqYUIv59kFP`%KW3FbEFgX>1$KIT+w$gvy+q#BR%V z#xOzFAL)p&QzSMOH3H-nT0KXYDXfsZD5wVWC@dfvupK>)pJFLcktpaWzD9%Mp`Duu zG&EucJ+A;P7>o7zcRB4KM*M+;~Y}{m6BH9YQ5u>nV$sJ{Yf5l_J zq8WgINux>VhysQlvK9xswNkL1f2{$f$p)LJVyjR*kiK%z07r%tKa!bYiyW*!>h0e; zgFjxzzD0-r(hw|Ej8#QLhrmhm0|sqrA8G+YnB)ck)B{Nh4}7y6`vPTfWIt$D;K7^N zb0~IyaS(;7rNCtd06_;%1?(Yo7Lf#wQE&m029gfm#=4>^5Ve55*%4xbf7N0!DC2^w z7Dx>m!Zc;HtAixWd>?xgrHB7CT${%sJIwkBn~u7Nlp%5kvDAV*{`eTHicb7JoRA&` zxuHxVd5@?NmIErvd$CTa$%ti<&w8+t1zwD zkg5ofrzpeuL)bKQjHVR^6xoLUiZl`65-ANuKF3b{D-$$i63B524`V$x4;ye7fUPGs z^AiSntAxs+`A@4Q$V3Sw>9MKJB!!T>9f%lG(?pnO2HTC|OjC+R`1upFp+h-A>7kRe)}Ai)_dBdqfi3!V;W zP=Y8T)mX2Dd%3xuc5?^(&J8hb2fc+05vPrsh{O*-Dh#iZaP~;75jF>)Q=sMTfFmAN z;|XvfGcFP(ufKO-dFUi3ZUnIr^e4J-G8fJe%{r9I!Id2*^Wf0a8xfhV2HLj-0o;B> zGYni{+T>+ghlX6McSzunRDl7XJVd3TY%Y)ChKSO*QA8i2;4eea`ejB~MFw{t1q?|U zVMUx2nzuj@^6tP%qiPa#MFX5GSGVElky#j^oA4hTz!4w`=V;;xbci10Py{r>2~8Pn zx+-#z)__frd1y~NfPg@24EbsSM0t#GApA7&SJT1UN#qe62PAovnV&WU13qeEL_~t0 zRNx^S+%oDp;CU73g*Ld2ybNVzhPe*n63_++FtG}xt3zRh=Nxh8Q0kaDPKO9aTT-x9 z0}|8*MS9%@cMVl-&`Jr808e@1HqbE;h|Mt; zZ(Jrl;snAvL)zf(_hA=>7ycN8dxTniJ`GqrB!VZxZ^CgO(UkaW7zcD)4G}A{Z&l;puV{m?`k9I9xq?3Zci-9OxQ`5^?Bd5(c5DMf2fb z*8n{9P<1M90Kpg-26CN-Hb6!WMG@ek0ykg8*`tDKwFm3v<1V9;kVdJRriWaBt3fLV z=uv^*mooCe%%!;R|8$1(x#oapttvo__TR#-qYW^!ABbavnvDUKT)B&TinvLH;NDaQHNi8ATe&YhW@N z?wP|$QP6b&eMtEhjuG0;z{UituHl@}#Yl5UivtAWO@uyL0GfFF4JV2g@IMg1K;A7h zasVq=5HS?~{0 zWyp;I$xFvQ6gKE32fiHHg`~wmA~12q2-rTviSOIYa2j=`yWkk$A#VKiziEbyLCIDi zYm&Z!Y+~WZr=luoqF|60@|%T5OHoh+pwCBoB4xZS@&kglo(f(B!mHrXXK}!6@(?)~ zi1e|haKfil@MgluS_F<2XS@Ie&(fi5_Z|X=6EdWnfTzHxZSkULNmPIN&jda6&;!o} zIonVepfp=hp&a&j24o!!i0&$C68OmoI_HJwh9VB)#bDDTctEYdRyfcD4_**yRzG1S z=;qo2P5{e}qQLy!MF*|e0~RwphF?bl1MB+XZ8ocunV<^~1>k*9ao}#th~{unBHjp2 zkHC{rJi)J)G%0*ALnOW%O-9-h2)KrLz>&3!NQ8Bw@fE1W|2PkW6@G|`FxX&+s{Ly$ z1T^qMkQZJO4o}5Pqn?1aS{@!s!)Kyi{IeD~hIm4O9C#R*;lT_%c>AYO9LO_pAQa>I zpgmb2PP8E;pIx{K5|EG>fdD_q!i%Ek2~9X;eVC#LTjk?7A4P!%Q^>_1blV$;K`-uC zjMqX1voL{)NNxfFqB?@UkF^xdO zE1B6DG%ny6XGO0LPa5#xxr7$CDo&6Lz*1GX{}H|&O-KNgE)?JaI)&sT6gGIH8}Ef0 zge=zc2hA6Q3%EP>_TpR737}|it|x^6$z*|p@KZnD95nzmbZXF$3W0+9moki>L$m_V z%%F3w6n=PQ1mA-)AR>ImouUXaxq$Z8))|YV@0k9g%g_mfJd)z2s(&d`gsB?%)X3gLf>fsI;LPL zGc;8Ps3qbXUKzy-yg-6?v`66hkMsl+%)jxm=mrEZ5DzYBW11iY(~$@V(Lf;$B0yIL z`sfD^(noZJ8N`1?b)*yU=JzoQ3BofF&`$;sO9R{}LXavWVH|M-K&6M~FW97kibbHZ z_647$01UanD>WVTnT0TctOsa$qK6g$07;*>NJ=6$3g?4zp`{w!$U~t1C#XZmDZAj( zt%L?t0a89d!4CL7KY)#g@f<3D0FKkHp5aA+qf)`rzG?!p&EkXt=5~+i~ zK8e7V282gw`6I3aUF^`%2%ZG{n-P*w>kucblL_*$wG}~;hlUJ%-ivSwjU)JJAH3I} zV2J#hH4Di@!a<<&#!nFv7!eea75AbEe*bQOnuEac8_--R9o+fu76~kVkyl>m|AYlFb5bIM+NO6%9Eu0W^xhzuyw_Hpl$H zV%iwAJ^@ZJ{3;X5NiY|uEjO9xWGdnp$<(Cq<#Q)g1JCjJt*k;Ah3LKa&4_o1g@@S4BrSNwx#4OK7f#1**H~UBADE&JLzhoqyM@!X}nFxAS z+DU-iwLu`HVNX_K1e!!hl+z`MLXa>Y5j`-FWy)$qPUz8LB0J;~3HT+Ok2r}EG8#Dz z5V?afn;Q_bzy?)VS(51RA6fuog7AU>h%hS8FXjB zI_Q23I6=0m6E}MTT7ckc4Wc6&2-h!k$T~rqb!1dZ$S&gM6DkrWM9Qu>kSx0TL~nE( zlKbg#;HLJ?gjj`815zhsJ|KiO9>ny!Igx=G2>_@G#6}_wSpsZ&fT;1G5&_aVVK5=G zS)yq;`P^_K1rqky#F^G{fe|j~(FNd0mIrYhg@h(HHxtxyg*Q=x714y$+)NQz+xVFX zEPFBYyUY<4b0Oj^q7$3|G%;j| zItTWhfWd#XD~W8dYcX+-rVjp7Or%FIDG1A?XM%1TY~smfW5z@NWyIlsfuK1J7hWZ9wp@S||F@yw zxX1-yrj--_9x}AV0}{6)7{I`d=corWY#{MK3^XA*pbw6#BBF235aL>OFHspvog`_K> zu$UyiN7epC3I-vaL(>{L;r?bJCw%t}@i0pN;E7Wn)>|QJp-s_0>tK+r?avO!!! zSr5Hp%aF*>^hMB^?z#lJAs=NDJ?xGn>7(x$$V;)cGKmGAWg)eo_@I|38ImwO$3@ab z`Y`AmBe*o`36r*?#}+spp>%PQ0Ng4}x`KACh$-NvLW04>Rdft_W1@}G77Ic#(xgdb zKSG5-D*^hI2kQK~3@LmwX0-QmFcFAyto$qpVNn5v3A%2FKEeF`$b=PI(ISyxb8QkE zlAh?591KB%+gZ3FM{N=ld`Fk`6%7Z{+#?%i^hgvmpJ^9JSlEyxg8oXoZ^Hq`B>v4` zY4<^zX1LXqB!u=Yn;&wq!ek552Nb>xJ~{zdz@B8niTDNV6@VCvz^m{j9};*PqGelB z5J`{r13VB!+Wejo_(>eR0Z_QgcZHBp*))9NBcY^CCXZwSf~GH!h)~ig5_%I1R0j7# z+7R4-igX#p7kQ#W#!}9Z9-)$G-@-!I1)U>ZM#uiy3-y(ND}?cRk|Iig|4s;%f{BV) z5<4oH_SG#INY+8~5wWM}J}VItlVU>O!oZ42bn?6f(1=W0mw}!?B$G5kMlya+Dai!+ z!T&Jx=8Aw)5Vht~k{sGxiB$dFN}GVd1PK`X05lxobqsIe{2xAxKyE=E#9G{!~mG}g?3&B5$Ehq7=-x^Jt2 znQ)_i4R?i0Rgr@phVS_EEhTP*Gs`chovGADx=#a_&Mbd?$;Ned`KO@J_`OS4>|U>J z3!WW+Bou+)V$v(*D6FU1QY_3eM~NHVuF$`xaPZ*hP>6w7()7ekucHn1>zEYe7-fkXVf!J=p9@X)^H-ah{mCypzYNyVH9 z4w7Z)y>%^@gS(-8|GnOuiE<2#lph>-S+hTgZU}IM#8??MOwE^@8*KMDHaoY(IedwE zIOWSF&);7D?mCt4u})Wp_UKa?LQEHh?#UTAEqf1$b8xO{8GKU3t{uKZwv97#6VU9W z*P#%{Yr=V2p@UuLJ z;cBs~)ydsB5$}r6Pdi9=c2D3%KY6F$cHz0zV!Y5F&b<~n>uX{v8X`28Dyhqz9GPLI zZqXu5{CKo{U+LSUaVxE3Ut$__^*g0`dIJ)_O%Ba{K65!msYCAKmVq%aFE6blO zSDp}-<1_1^#9r{*qsI5ah>%4cbK6tuVVu1`=k?(20O<9b8p||$}!`2rI`G-kRZwTlSz1F}b;R zg)_W<*MIz`n!Zxxe7^P7nXv07Jf~O8C~Ok^_=Cu|Ll7T(#{6 zhjQZQ^4!MViEVDAVCV9p0*&Pk`#mPl7jL+-Fa-yl=jPIKO^71ej}#pXr4S8%7r*Si z>?smfY@?rLf2!*gXFqe_Vi2K!mYQrL+gVi<%lqNDOs7dyO@7ggQODEa=V=1mZG~ks z9&yXQ*QJ?$>?4%F-QpX4OIm^H=o}N_=y7jjW!I0ddQQKMVuKX9z`+VK&?{4~Nw-4`@aSlyw z=BB8KwMe@;GmpwS4BEG0@}!&s#3mPF@;H4XQ|NR=Una1#YYo;ec^%rj-Xs-%ys}wU zB$52aG{a|sWA~~(ACEnyB9gy#uVf(6%=McM-FuuoH1%q{BY;R3&Wl57lrIr)V1}mcC!uksHW|TDBNz$ zq)lkNQf=DuY{im}d#iBE?nAe~?%WYftZ%#DA8xS1ue}_@&C%2~UbcIIt+v{D_@Uci z!a3)kwNVEgbW=@qY6P6^Ry3RR$IA=oS*U_+GG)?1?%$iP&iLi-W$oQrYPRS^Sgwh& zwS2>rLvjDE*Akz6wNB*KL5)|>-j;4JH*2F-%&^BTUzgzDj*Z*c*K(9;yuCyy#&bxC zBjScwiMb}nx({Lcm`k+0it{1w(w|qNmQUV(9^xn2QT=ECN@;34mn+|P+@G?UqXPIn z)E*J8A95S7W2QMbFx0r`q&OGz`TN;7zSb1RJ5&_(dEu!tW2B$m6=oMT{jV9>z0j88 z7ru2=s?z`XP5%{-k)K^ki-#I7!exJ9)Zh1f7@bR7~q|9U;F=S2|pk;s!Ld3T(ycbTe;zZWX05`Exe8hgc8 zv%XIS7O%>D9_7Rl%DnWPi;qXm*!7fOU-{kl`s0GzYlH+}KmN@?65jvjZHB%b?z^g3QHnKh{=luTb~(dh;!F$McOIyc zU;9D5W9oLfwJn@o$1ks|S7xwADqP!OmfW~IjxE4dlkp7C!6O{9mL3hQVt%eF$sBe( z#Q`45@+LE#HVmf0<#Q`f#P=p&CCAKu^K;MG<+fOji|-!aV4!|hF5FI8NMzU8kr*>I?eS_#xg$E9 zvs@m2A(~C*oQ!d6~)dDk-EXKM;*=_dUJZ@hv$#w{_er;&b@rUm}tR z;$B%*SgXgkr*p|@-fX(H&2Yxjd%u$Jit@S&gWR|y`^iVcdU9c*4_nn)!e{aIVC{k2ommV*{AAE-KJwR+yY+Zm}i zAoDc!WyMgZi=yEvre0+Qh69VrhAoBJ99Hj*V&zWOQ9Zi)tv-0fmMfR3UfpvFue+yisI-y{zeG zh1*C)=F?9bO*ikI=*iG;<(6(rr~kHdztL9N6Q7`Z`NJd6-+y~P@Z|?L@1%NQN_#X5 z{j*zVlae**sY>=?2`3cq7i|+wM;lr)qB7#WY>dFiLFGNEmO;zA!rb#mcd2h1f)K9TS1CdW*?um*rfU z`7*jPHRk`+vU$5-h_~7;j?XU@n|ODs2bQ)TR?q*Udm)2r%RKVj@tt4AYc+znM8mF+HdSx|H@T@aYQwi0^wg8TZE{7sT}{qtG;^@Z@WxfxS8 zRum-zFPgX34h3u^+=*}GoQnQt8_=!fWlMLKb;-Z!!%t~N11Ya1Ost>g6^@;}zBT=L zF1u&(6PzELNmQBs!#a;@Qh8XD^tQzr_4_`NV(pk6(rBuT=g{q&uu!|Zf4{x+Qo*5t z*72(=He3VhiPty@gpW5))Q-y9+13U1^q5%@Ji^p=#LSwtb#m&q{1nvBJ9gvN=aH}* z_r3S3d{3$1wqi87`YF5hrRICf-n8T|d*veH+#i%FU3wbKKrI}_cwUy;-t(x-=C{Q0 zofGscEnk|xa>iB#t-KDlJyn@j?tEaK_|QB5aQ5lrw@#MYKMdl%^seZ-{!R}YwbHP| zvs(PGwT^TA&V6knr_yv`SterIf}7yHH(GzqFjnZ`+mf=|18<&8o-J9~Wj~;}rub#4 zdywPYKvwq;$E(Gj-qg~MS#R@{IM20T*CIZwDd|dDPigh9%<9VYTG|$LGWOepRw0Mi z2_}w#Z{A9ODsBB!6TlwAA#!i!X(8wDlBAX)a#@``aabC%$zHDSHcXk{T7m@ zg(r*>{&0|j)@%r3d#pumOmiZGaDx1qj28_u*(}~bWCs2B678`$M0!Jul4v%8FEvr; z{SWD-xn9tcd(tj>Co?Ka)o-IDk4;9unD=Yz7M<+H?k(m-z2e5M%F%DOC8v~+`s@x$ zeCXOT-i5W3S@?O2?-%tUK9J{n;k4G6P4K zqI1*@epU@*a0)H zB)Yv;?v>|rES?@`vlv(1n*tB`NP9N1vEShv3yihb5cRG3M=^n3(p4+91lTNgoDHsRk>`c*zWNPyDsZL(p-gi=4 z%VP@9v!#q=2(v$C_%S?rp)r?yfj!5e`;CzKjy)+J^(nrR^m85tUW&Iq9sjAbpZ@I9 z%Ll$*o|ydyGCDubF-fc?oO+|0q!(%DAUt62mZKgoe{+1^=eWbHipQJV!#g=M*b>iK zNevMw9l=c`fEX_nMLXl_eSD3m1{{k4Ub1E@vF*-z1a=gVdm_5 z%>f5w19KGaZ;fSXb1Z#a-?Dhz>%@z7O^Ms=qjneR6vmHbou72!*p}^EVlH|);C1>^ z07qSLDcer(q`_XLzBIR0zU;B<3RCL^ybplY+AlQ*pUu$Mtt$Wdq90gmRa&nR$p7TiClBEZP(+#0$P!?t%R^*|N8>?*5qVb5fyO4zKLQk2VH zW?lKT^0``3S6sccZkte5f!(S6J%#Q5z7J$+_wpS(>jMrbJUlQL|23F8aOY`e z;z66>fi#Q7sJm4PS>9zLm*P3U)v-OQp37vId_KOfPgcIWJ2+u_Ebm;}O)kGo!W1zv znt9J~Jtpl3^Dg()Z?dc0!P?ia1Qqv~#B02)dOWSBGqyWkn9{1KZ|)%@@m9B_rA_L) zwo*=r!xj7ywlsnMx>XBJ&!{KcSE$F|W#7y4)Si-jkl^e5-d43c^+iMcVd1Qt_s!fn z-OfUJzUFngk{@hCZENe)?uwo|$jcemal6Mt)}nk#w0W$s;Od^9+ZLhod#-VYpVb97 zTXq?rhBZjnckNLeCmu9bg8$G+6O;l@UIMP>X!G_r}pnSim`W8 zC5iLxeV9r3;oGb2qb#dlJ0kqx&To4wM)D|V@TA>!qB2hrklL+_(b`mh_->2=SCM0<2!EgLu% zf1|2qK*YYy=lMNef1{J~Yig$x59cbbZGT6dceId+-LqquIrwJYgN;Uww<}7Yen_uz z34VIwdiO(4ZaQ}^(fI7u_Pa57Q(}E9%d=fvbe!+xk`GYBaFm-x7aZIll(y}!{l%Gg zz2SrZXnI}t_gg->>ACgW^MekqeXBK?nhYfPUOD%cH|(C&+=ojdHtm#$R=s6*d+=+s z@p!7`)M58Ce`3}4xl<)#wt6N#3Z1sONbY%E{BY7`F(~8V0%h#D3iB<`xWmAEU_pk()ro2v|H(uq|I(C#ntoy_5+LZh74sZJQ7I(XE`n0SBf)SH2C7!{L_m_ z?uKjBp%SHvG0KP0RHsr$O}6;oGtB)lW-P2HPF>@z>+>?^{`ttbOS;kFIGy19yU}1b z!LL39Iwiux22HEDA4THU-}#IWZ<#GJY&Kn58_A^0$}?Q1D|zsm>$IU>@z{2yE0X3K zm&HbGvvhkT1o_sJa~p2bhhQ`#Nr$)1e@srZ9;b3nK*7i41A4C59GPZpd_%``rt98V zOR|nfaqh{W-O|2|Cj1P?#RP+l0+r`P7@6nli>p7du@a0Iy(p|Y9z0JK{eEihIi$dP zUV9^bi~0Q4WH$S**-RaEmR)9LifL@+^Y%Qs0)ERGFV$;?R73^Kg*1(2_q6U6A$P>@ z5fERXzBowVeUMUlQY-VqRJ@P5i@>YIAvH+Se7kpSjh5u07xxr1nQ-#1nxm3(ljDz#eLUS~K}*dy`pAIdWm zJg0ti9H;KymJz;vss7WSJpsR|smn9aIGuvci&{hKj{UPa=)L*7E z{!@@8-MQvb+EL7uxBWX@S*MlBZC4R&7d}}r-SV8bTl;n-rg{s0rBHEuhrV`^cELG5 z!osQT9asHvO^{$r#kIYVa|B-9<$|Nx-W~^W9}k6;gr{Qfj!B3#XB|t4eqCTbjr(=D zWt`YOK`s7lwP-WWaKkUaL5}Hobn%3+`+?JZ9$Zg57e#;Y9MHC`8ccQEHSV~pf;s3# zk&A*-9_3y|mt$`6YG0zGwU?QVl6;B=2B6h0B`^UQUy#=k4XK=Dt` zp6H*fp*^qGVxuEZr<+{9I{3Ux_Hx!*e`lNtm&u87_UB!qBVA8L4S9P-p&upE?#2tX zIU+sk64aoUw>H^<_6xPa6`m8b5f8lfEL`5*w_`T3r}XTbtP%z@n`h=_C)i$F+8z|S zQFcK$$=iv3UyJ-oMvqmbtvaq}#zH!tuL!I54Ayd0)Mn{y4z{KjYKf@4{yR?o>XEz0 zjCG_BTueNzSJ0gJbm^_p(m3nexYK4kqYXlWOB}rysU55A_nfgB%;JA35Gs{NUu!j^TTJ znq`^_er&5dsqXC5PVtA|o3HXd4mU~v{LLLl^|)l>JFx9H@0&jfdp14`zu}MyWnvBb zz2A4nzmkqU@AK@R_vFIcBH(n6Wj7H5*U0FHxN-bL82eyWJ zzIHA_TvFxSdoug3(7WNKhG*uT8BT8L%=mKPJbS7X>-DII)ztJTF9m`*E1_NUBKFHd zx${L#QaAWKXnDubd$u2r7S7{FuED&MxZYXMV{xNhM|NFZ^;u~<=b)dkC?3+>eUYi$ zMM|CX=QDL4t2TLc9C!1j2A+Xd##!GcI{VqvTX(iD^sv8n_0fXAE>dnpeNYq zS-u!c#l77!#`%(adKDROdKt~wxi8oBIy};>K6ldP*YR!j{3It6!JMplZ{TE@`UT zL5^}(qVEGk-{++2P6S$Th!P|-_G5PnIdF#*nk?=qJeA({QT+40q{pFB_Xb}s=zh!m zdB@f%P-vL_o1H~tnqzqizc*ituhh|T%+aS|f>&$aMKZAoo~Kq;GYXcteA3n?D%l)A z!&(rjwD?^sEOBztHMyK2W>4t$8*XyhJxQ-5JXBfr3!1VmpJ3j#$SGw(!73N5!eg5< znaR!>2fA=U8073^SYQ$7mHROQCvJ@;CjxQmKU&k~OTFK5abp5QBN6 zjicP?Rujr81&L0oc+ZkVoK1t@P1)qzH#3WDvTaX4zLzZ+D0tP>G5uB1;C$WOVqI?S zrH%$^wGN3{PS*1~I*5k_D5BW!(V>=b4iUMlPExXnB`l>X*% zoc46>hnfM7qj7gXo>8^Uf6;W{s6?6M`}3=nVHy3&jLh4t0!^s!{B8w%wihc5V)rDj zNnY-*j4A9}cx`dA25#`xdZ4QIXcYfx)ah2&XBLk7IZZ3;odV&FCypv#+10>NR;asX zXS8c4>vT$YWtfle+Tn`HCembOnCZgZ!+}10cTLVW6$&dXjIgC7+)Vq>;J2+pgKpqT zP2k5n^Wr)+w@-K!>rmOw97sFZs2WC(=a#>EoLib-eTKlGsFeBhfnLiiPX@)ROuk1Z z_r9O(>G!ujaV|^tHGJLVTzt^y#(k`hOvisX_4ElfkFSV08hu&4x}q{^G%vZ%s%^&m zgR-7%(EDbEA;rH1T2Y7~?6MvC&G_*AquImnw@kb2To;UQW>qKtrY6nLn&w-%t8Bz@ zu543`*;P&X{WzzZdvElk70a=BAMYm0?~b3>cb~;kcA1_(Qv7(=u?@a?Bkqtyj&;K| z6X;@;#e!??#W;b-j$651q-yvZ6SyoXQf{Ye7|vYiUHrb)68ycZQVsjh#Lk++FovH= zM*||m1WAc-VETG~!J~F+Tf30DL+E3XT5gt{vnoz3?XE%UI%%!5K@5U2<+El7lS@x- zsl;(V#AGdKGUO?~X!-IKTuk3(jCaupBMkGxc-*(M;D%MqX-Ek?<9@sHdkye0wYBpd9MW{|K<7Kw+PSx% z=jEl&p1Yi*S9ruj;^~{wgVfty>QgLN9RiyKs`dD%nSHiZT%K(l3;4tQc(^QETE47c4PktO* zY9%wVlxV{>ILDMK|uX1f3e4i^>?AWu`f3|_+l&jdom_6&Vifydk zuXe6&i2aDc@!?;oKf&!SX*yH87+-!t%$q-@Jb_=^$+B~su}p!4?27MfaUgwx;rDNj zftt?JiY>!)L5^Z-Lk$EaE>`O7)$CJB>`Jq*=ESz{>Xd6Q46A=1Ioj2>a!7+b+EaRr zKW((zz)|VVEOQWMN*a2)*p~N-w?V%kp6}KEu%sp~|D40eCKK~sSxt%xbxtgN4r`2{ zUrrZ#vaT^D@#k?ROTsCwxm7{aQ(J$!+;YcHz2S-ergd!wmwIFDwRC9>8x_{dontX& z)Lm4koYEX9Uv-NZtHGSo_}F18ptY*f8NA*wZyeFOs;K*RJ*wbQ+so8lfqVI9Za0KQ zIFAxe864%`^8Hh2_n$2yyf;I3q{lQK`^chmifP zzsg~M^n7?YY_miCYuA~D2aY?`se)OR`{b;LXU1ffOZ{&g56~7~e#1^s?+An=^a@S* z-!$yG`@|0WTvM&b?~WpcOKYU}gCmR|U}9p>x)62VkL0>-WVvWwe zro}I`dBI~A6Em$#s!nGwB)Wi?eg6v)0%})FsrSn)QE$29CI=-)b31 zVGcddT(PI3hVV7X4R=^UJcp4wA9pzKfvDQ#Fa~q*%Fz{v`p4%gdcNqB&YX2w)}D9< zReoM5c;@;gUwv#O@M}rorM0>O&4IG?)HQj>;xlXKh5-Jla7>XuM=Oj?37`BXiN=X@#~3R zZe@yKOdyZR7dibL4 z%n>Qmw%^v7`J0z(R-*sVy(cNWUven$8T(R-YbA?lpWWtCw%&y*pZ%5GkANIYqO zNvZmg5Vl*!M*{^?b|&3+yR|4ONY-g*$&eLfd+_*K2^IEDkRU5Cci`Ql`-S{pxGj0LGNK;zPFZ{;sHFcillo;D5M%Vo z^p(4bIQP+u@hx9W#2>YI`R_D6Mg28Xe{se~CGd=m$9gKu)@>0mj%(|~T2&-*%kty2pFA-(W|NYh7jRcCx+ZkB&uQiQyZ0(eeEU+GfRnug;L!n`LT? zNGWIAjd)}v+Z+P7dnCyO-03>+sJ}xtrSpRJG4l6n1CC}36=ubvRkqo<6gNq#FIQ|p zqjVI>J7QmU^E)@LCMmDB_!5qDMXTI4sq}6vp_Jg7G@QVts-7z}ciG(oi zvqz+ERvLQ0$A#Yy4Ju+x9o~`Qu`MI5S8D8LV43IeMc3y>=MBBxz2d`no#7Eron$>| zvftp^@qA0xA<3vCu4a%bs6db!6U&D~@;o;XNeE^?NSe&wdI zZoI9cWYu6cp6@Y(!k>>FBd<=}GZp%I=G8NKABDZ#W@o!t@3|WqeM^oQ3Gq&(P&X2B z_nDvQ9G&P-dUEQsg>^_(Udb6LwdX(2Gx{AD7H*RBWtAP`v|2KZ{G&g%g)i>QxQH&N z$NfT1JCUa;K{MQqB9}aNWWGB(NDkl%)rAJGtzrX3 zD!6@S)B-7!N{VquA4{w>HE>LEK`rHL8}$v?uSs$>(G3h*Nw;dM8i?^jpEKMPG~Q|U zary+@ZxC4#?EMu`6Je#h_jb70Bv*q{P%rmF(hKuO+xeBuUk}X&n|v?Z3VnWP7D3hS zSm`OYS{=V`WwY^#^ZQL#$NLXvN2S@4gH0!P)UUst8GY{I_=wBoT4HFC+ttL-=3G+3 zFB^}Aq+RX?31?@kx?&0v?~v@t;-Qh6yfW+j`#V-OZd&#w3O#hXS+6WJT->R0Bd{;^ zJr8@;d$&u2D(9f-@866h@DDLo3zpm;{M)c&k%FUPPi!^JNuG@?ywA5S1*BD znZh=qX5l*_Q{z{;Ya(e28*V+(L{Jva+T!-WqHnU&M?9vB5JQ4#~J&GWTC{t zRl8NfZ~2F1L7(|P_;ebG{t(&oQ1VE*8}-M*Mak)O{~(e)+rr^bejj|QF4G5!oen8g zs%GC1nJ$(}csVQe{kGM$vol)X1zi)`&acEq6ebyeNXil!XL$EIV9V>MXENs)L%(eN zIGA|i{WpE;=}AT>Qh!KKhRnr><(k(3I}F@0w^ zT6RUXJSZ>!zR$MD+?pT7Et2bmm}aO8*JZvwRkGi}C(IpPlsXrUnd9b>J{P-v^~}t0 zm62J7P){0NsBnA1&V|mcy)NI)BkS<#zs$s`8d%4TKcrfEB$Y&`Kw-YMQ5Z+B?hk(Y_MnX*p<5|qzS}#J`zAhIh#Qh0-^|SYnQm2m=Do3~PSetojOV8d%HF6}wOzl?t2Qm+~4ef2(#uO6P zaVifx?N_qg`j*qNF|Wv#r6IIj(pZ)%SF zc&n8IwR1}jiJ-0)pcouF6xs1fr>rmXT#!1yOj=BaD!b&b*VY~G$&iokXpWc) zf9%YoFAxyp@hA%aTj_9e5OIlKg#B&KiToEfcb~cLtz9Yz(S1;=QvHO*H!Daqyj#5X zVyWM3E%fo7h_x5*w!A)N2~6X~$B(WR`ma5MKWPp5$IPE>%CMqWHDt-1Hk|u|vEEIh z)6D4U_#(4q%Tf0&TmJpOBhtQuihN%h`Tpz5HSqWM-zG`mFZ^f|8Q|N&$QNVb$SKkf zC%<)=s#}?BWkCw`0qdP#m4F7 zFXz1lKNgEkF)jt`*RlB4G3zEjuTRvWn%rX>U6wmDE=Xl=^WpFf$m*WKz^uaAhpdUO z=*04(1)l8lYmmJh5IyT&U$cMJVfTWbllUbAo&%#PS0#F~?-Zq}?&!OCGp&5XE8Aih zqx@CX>W5-mJ$EP^sKszG?W?UZYM->0WlQ6%NPQ~c(c*GdtEcL4^E8<;PWFLF5A}%s z&UYaV1hMQWr)MJtns;Sq<6b(*vL#FA1e6g1fPwD^-vTCeq6a8$eG zvmNw(CZ*mIMgP7p`yl5Bvul$vTvoM3naoR<*NyGuFWxk=x}RV5#6q_}>aB&Y8Fzoy zz#SK^Z~Em=_at1mz3ATJcvV@ws(~^{g@>I~W^>9;8GQJ2 zQ{JIF1KO3ye8Wh*1Lx$YpJMyASN6T_6CZhpTZ`u`57e8o-0S3cG!XSAaoKpSQbE1q&7)JpWEM#f3A zK04_T#~Xg$nNs(tr|&OaJjC(#xBws5^9Upid zJCc#WC$RE;ly!@nhS%So?-N!GSHa?$idV{l|5VG}^ zW_NV)r62g_*7o+8Y(obR!?^t2R@sK+6E6iXCU2(4b=&y{s!3W)J*rElI=V1!X&noY zk-Q_BZah_TW;9~QT1gTS&3@&5xvL*LPo_ur)RlG zZUmgq0un4%iZ^~OkN;%D|LD2l{)Q+!_4@L}hUdODGTdD@E5i6s)^@e-kGI>|iEie4 z+PX5(l6qP-f0zBlPq|<{F5!IqyH8%RIq!?<4l+ePc5@uZG*$WS{9JaGeW~7Z#plo* zW+1Rgrl{bUm16$1i#|L1)t(>qtVw?EKk97Q#hxd!s4q2gYjrtTek@KEDBbJG5OA}F>k^a0Tp7PL zN>#69=lA;xP~at9Jvl{a)%`xcLCaPoEq@D*tc)0;Jo=Yz*GDverp4EeX2dvw+M>U47) z*W!EpNp8VD&vjxK-BM}tR)B`@My=cna`wq)##i1*9d785ZS>svQAk=Q!b{e{+1Xkx z-rucEwtUeivf+NsWFL6mln)7Mw!;rBw`YY`Ts(jK(X8yq_^|3UPTj8I$-t}Cxa&cI zW*_O#gD(|0U5F+c`$fF;-r}KuSB!G)_O)A_F6CwG&A8S4*Nv(rzaj<<+0J+yw~+TX zhcc{_6MmBK+>Mz~!^1y!C>*@=qS;}!^UG7G9tTAWqea_>f&0f6yoR>9PlU_2$_?@2 z0>!C0eu|#?7vwNp8?(yZXC3E%x9?`{@J9C|p7d5j)_U7u4)W&I=xg&CCbh@Eq~3{S zJY-}(clz+a)Zti<*F#&@HaX8nR_;gLxQ-tc@|s$zj_*!55WSodR&>z7o)}pYagqHj*ny=%4D6IB{LYL@Q#S(l*U9vhYKzt#c}Pi$@mEF3zbp zh#4FTp-Xlqy2|jHNO(-E9jF>>^f2jsKjg(}e}(wHRe8P~r#0N{KbOLJWEt1n7BwtP zj48QL>OVBdZ>mya7#BSv(YhpkMX1zoM|bmrb>G&ZuNj70QkJBn!g}xM)$-GI##w`x zXe=F1G&qddhBkU9*B>}%D9a(fynlOB%5%Ng?isrB`cUod+!(f_pDsU`2)J!)m#?6C z-}c*g2}}w;(Er@F6Y0RH##*E!Va?3+ABvBMqyu8VzVt#JM%j&|ozvlIBu(x5}q zozBmtR`fAq+EU2&_Mo?w=Y?zw|6AtUJijMus5#v9Jua%|`jL~lzc}0rrubr8tsEle_HBCZCB_U+A)f1-0U%V<%pi9e#hOye`=!W9xi22D}M=EzRj> zoxP_w33CLUa@OjO&BC~fIt=HkI$v(_5fhv-+PIRU;iWEop>$KFxo+CWx}7(2xJw9c zbcLQXgTs{BlH~u)?_lJHwx!J{@7{NARykbQ5j~R2aJ}vJ1Sli~=RA`*; z$3ty$8qIc`y`;zX_geB^w3V?>Q{VH|C>*dnS0YgO;|4u=zmih@p-BZw`nPAcZ)aRP zRE*EuJQj$XdGw4`N)j*bnYMHy%C|d#)iPk{TgAE7v)YC zBs|}~D=j{H16^oaU_GJLpxpc^hhy(P1U!3T7HxYW)TwGunvB5(ncLfbUh9Yw zfALd%HGfvTw9C59czdKJJ|KHQ)w5hm_q|8(G4cp|z%>zt&2jWyhF?q8WiF3c9n0@B z2&+6S-W2`pS>sEC;X`5eoq4oXzAc+Y=c_QM?^M5PA$x8B{OjF2Azr(}AL(LX5J%U^ z<`yb=c$mw&$9vxKmUU2Pkwzx&F5 zEEw;e_3?rhmF=dk=}*${2*>TY-+9+dFX@$F+7hL?O_(KxUbt}7=2W=3$Q4Oe(GMTa zy>j}&n)1GU(Mgm(GtFYMT6(Epa?>%x{X;J{_s7602j1{2jGnD6DpABXElEo~CL0Ex z4|4lpFa1L_fK$!pjdJtrcRNB#J@xX2Uf(QyIsf5QBvxHJhF$6NxyCQy=Qw{+lB4g< zZn2zw@|$Oj$H-aCQ=vbh=~U<|;ZHb^l=CJoBe;=3LBX%HAs6uk@ zZ1R<#2M^z|iN8q;l>W*R6VGPF=BSOv(K? z6Q1gOopXU>L_XP8$+yL}n@tkjAk%6_SwruZnhMM}!@T=!dwZ6*%>%!a3tQ!u-w_=V3jonhoGE#pt zd;cCW;qdW;sy*0XIy*gZ&s{m82kVT-GDFffwm-k=!!E9h5q3XP?z^}y0LX&bSN^0tE?eIc*Bmfv;3L%KermhR)l_9fc& z6Q6WeJe%R7%x*Yr*eK0YSE^ObA0x-{^0IGL|25lsmdtR+_$vmdlI(7})4reb+8zB8 zZ~0*+=y}{+BfHwG+uuCt(-P7V2HB0>Dt4uhri&gr(Yb&G|g@rG_sC1Lu{Moz z1x2?Vy*!+%p`Rg@Z}W#A_e&3utlw;q?%Lf@VhByuiJa0cX;#@8B2m%nX%mumY5RZ- zFX^q_Yp>kg0L?cyj5itknLi&$)7%sP$a>3;H;*TO7iv^B?)mY4%x%YuEA;1qVlVo) ztEOD&zO<#Vfg}I+UhDVIn_qXYr?wY1G`y3^343*;D|Dq~5ZZ~;{@xXT4ti!D+mba_^^tUz3?Q(Z*%Q%}&%k{5^f3re^0 z#E;6~P*FdKQZ*T zRpAm_^Am@|3Zom#Mf|cj9iJE7y9r5EHvc#6i zLFf)8+<&-eDIrARW#4|?_cW@ZDgDEEW8aL9T)<*?>Sp!E!eF8^eZV^)McHTI^t&zB zId2bbZT;NIn$he-tQiQy3Gw>Bulg)P9}kyajaA%}Sw3_iJ0$mp2#5M9xKG=DzF1;a zcGMDrzj^aHH&02wIx@Cri^VKd8Gqg(>RjOEjKkd)w#)6_A<#|bQ&o+yR)f4SZclb( zTx^ZY#kA6bq#yCQ*~b&ktGm&Zj4UfC5jw=n8*Vz4itV)1$A@_Dd3XAO8K3U*L3(Eb zcZ5BEeAd=+i4^Pn+aUw3P|$Fcn@MkiPt)@%@6Zy3_N5l()Z1LO>uwVNODxwg4=WHj zTb;DCeOxaxl1Nh3Xdd4Z=|V_U)&O@)j2mp%1#;YcD;cb8Jbd=YeQz_;*iH~CRU1Z~ z?lC&q1c=_M4G+h?BYzTN2=%-ddFdDVFAA9QeozeV9rs}CRt&CZ_!AwS=0qbQ{<|IH zX>3($!4-^I;;8E!EfVIv+d2M`?XyZS%s5Tdahls4nZ$dhWBfH+p5js=<2q5tWll4) zTi^_1+=T7Owxv?W0I|t=&MeYL;LM}(Mz%5arE?52an+*WM>9`BoYl9Fa`d)vHg;Y? zSKnC11lwMItx=~3<5)H+zMP}JS&U4!x4bz%zWEFZHi)lW$=1s^ff2~2&O72-&2Xw^ zd}KStH*&)F{x06~Cb@M^Ne9M)^1I(W+k01T^qSxgo*yd09KCr>!ZDv7ZAfySb@+;H zJ#xtE$)5;NMYmeU(tPGCC*w3OgdZHs zJ4;oo=QEyBc<}6oRATsl8?CPI2p)V`@clL4_leu5j(s4VrT(~a?I#=Wdi9!L&Iiac zTSi~2_4tfDr7rg7^?E(~{kTnc@Y&Da5_&v6lh$4M-p}p&=!Lh_@c4x$?o2#I77VAl#rVzf2i$^eoWhH&J zG%}rH*|%b1LaXDQGT6(oF{k&LDAJoFw@19z8Z=bwiIih0&~g{${m4*@c&$BX1pcB@ zo5e*NLuJvzY`nNI{vRWlOrqwD?-XFLkcY66p_jxnrWno<#^gkb>Ed`mgtTyukz!w@ zKgRs)xK@ORu)U$;tH=vjTJW4lM5eI4xng@{8HRRxPBTJN*nY3#K%@X>8a$-4Ml1`T ziE}!~4pVcc7zeT3p}y=4QF7DH>cI_3PI2ttDYD?FtH>}XpQnEK;>*JDChw(unD-?x9LbL;9~OMq?|k;qIO3PE zxdbLeGnFHl$zeeE5xJ z8+jHxDeNuj{=NG0I42pViffJRy!6#qedp7MVZ%~dR%LUH8Fg@TtS);_RaO_%@WTot>IT^_xCnn$H*mWO8Rm7briX7NB z;XWCf{dD9(hhpc5t5v=NUC}>>=3RfI7s}wP$UOW(hcx=M!?tsT_C0W}tmEQ9$HyRD z_RmhVYqU>wa_sjR9j=`tUf)kWbD7@VIdX#RJEudVxlgYT?c!0MomxJd-i|9|ye!G&`EZ%E8lNeb74k&*&3Jo< zipMn9>AJ}K&a`ZrqUk(sZh&wlDe6lCzed7Ir=miIXIa9%%7Oy=J6URk$koleG@k&yXaWdVD-R;3FDXOxn{{%Q6=}?%8X9m6xUS%v0}^Ee0L$3KisUW()aAE5FHFzId;X0&RP- zSNY)Ju%MrWaym`t1pP%)Stege=7|qNi4EzQjI8Cm_g+v2l$8%Cs}D5_`fXGeQ&})L z4U2ixXsNU&&(D4>avc|+cO3k1FR>vZ(=Tf|>s~hnR#x7rd<2e6Y)Hv8?i_LZe5&PD zhiPAjcF<$WcO_*9M4)alQkx{(YQUP z8-vQkgpbi~(3*Vq3eK}Ax2rDb|GX-e>q;x4g}ZJ#+47>J*L_+lsF%{MSZkxKduv#5 zUQl^fb-{nfbnM&A8v`8*9~;CRooKZ*$GTymd8%?k*7B{ecriz3S{W_;gp}aCjPeeZ zg&jL)Vh1u`R%GhZ2c`GkWpp&Lx8{9fJbN`mWNX5lpZSjCWl1*I40DqI8h!j7yV=#% z`!`kt_&4cEeb^aL$!jX*eBK<^f7h}-$2?!`o$C$r3t}@Y8u8|VF7FD}(#?;o+rB^H zA?L+M3ll7N*(ApYoJ7O%k`oqJsdRkG{AWdj)Mk}!gyIWN6!qz{F`3s$v^Z_W!*ve@ z{YV{L2N_y^TRV8j&FkkmbHp8EqU)9q?LL;?DiJv`m5i+}cU>o|a0tKEI7rXhh|?xL zXI+`GeB}G&?EK;>M_Y$4EalQ6>-y90VsA-oYQEF6uDVI(zrZ4YCw&jqUP$d>TaV44 zWvGlws^j{EBK2KX^cjchim#2;_rAWZF8E5WuKjwXx~yE`gS-Io^i$e{(HgGmDo;F1 zdvo>u4~kJw<)eIG29Bq{S|{h0)O@bySpKaKs?!aTva)9ZG}stY(+?;an}RQ<6QdVcjJwG!&`SX zTstKw77Jc*C815Fpm^3C zVXY!BsHhF9I|^a2%yE9$f{6Ko7Fh!I?EYs0>b?Q0ZC&QTv?G8(wW)uTl5iOXLq-cN zff{oECit1V*r1Y9ia0FAg{ee}e5K@|TiKv}WuO$}Z(cwMv*M93A7-uX1*rIiz(7_I z;Anmf_U{9?I=3N)-a z3c5|*1hu~;JTVpj7cv0A4qIsLhG8IT`o}Do zTq|?CFC23eMf#5&Krj({e-`ry*#-Iptlt7PykT0EqXjd_fc!}JD(oIjkf!U{QW?=<*#8P*6LR>eQLY}vk^Md#Ky)f z;fT6AnOU=+xhq9ilK}rN!GJQW%%B2H4Ro@}1J7*;QGqd@^hRK82Wl`Rly6W-9f7|Ia%%(?*6-J29R5d1fBAq8G-A;HEKCoA z0U&1-E@C%-mQmobCJZQ2&m<5jRSqV2U=s#L0v$t$MwrwcVZ+094>4C!k3!rM{CWig zpLv9F;@fb-cJ22r<3ub4A~NfjGlxJ$JPYI>NG&%oCy3TIXU>6&fx6J82Oz{KOk%dK zN0xz#ftu+IFjPH-QD@!Y36_C2D4+(W4VDV|GAL58@q5hq^~eO+ubIw`<%Q_}pvjEf zN6Zj13~CWeLHqhC5=i?`7_|R1TZc@50*soF;x7y*BsWFDL1#m8Y%u#AQ$2th7*sL6 zh9U(2(uMYIz;nWfeqyqby`cY=6m)h4CkZv}!?8iD(O6Q-C~$JeUzklB{t&YR;*h~& zAd3Jj89M8~jy>%qb_ih#1b>8sjquz$Yz~S9p>iCH104yK@FaMS9s3NSgDDkF=#naq zALb@uf1+cTi^|(7<06|=e!=|F90qP!W z!cK`;ag=CK-4lV#3%8|WYtb=Kw{%TbLOgg3)RGM}zh=d{Q1w0>iRqIB=q(SH2(Q0_ zHAf|UE)E!2H6M-$J==-JL059I1Ala=30LP~>(~)RAfo;&1Q^%_sEW?i&>wjV0>fp8 zy>DP+QM;gQz@w3)-4efs)TIh*i8|IFH=sguk~kb>F$hjxP?Q`CQ*UBZ(fw zo&#Q~$10=apm?w*L>>jE0)hYus-6Q8Chjh_4izloE*w?BR3aJJp8t`xIaUPPGz2Q~ zHa25D5z5hc^9C4X-Vm^=xE3s^g3sg#VAuieJBI^){)U2sUp~ev@FNq5hEN%N2Q_*V zhQTcDH8v5C-~mS*2q2%a)5uyThoFco)^g1&g;9M`nNor}M?jA9>KpbEy7bQ+G`6+c+&CFe zguEvK15Y>MULZn1bUBX26JZd^dQt8FF+Xd(aLT z+iHMYL2-ln*NFRWf_+VJsGGyUhBc7rhuGSm^Kv6JwgvQQ<2Z=>hCussbWtG?n(>gS zE$%sU90o4$!;h$vd16Dr7dJwq{lxsDSDi5EAr2ycdI`T5wLNS0HW$QY{QD-;P^EqbA})AgAF&Wt;s4kQ4C&2bzB| zg#_3`AwwJcaQ%pok-!LKDGsam-1x_f>mc#~Qrf?6?!v#45fXm`w%nXkIf6i+p!9c>w+0Qs6tiT{T zTBCF^-2d8jk~h2z&;o}==j1E9U3zhu^9Lh7GIBQ7Y&-` zAoD?VulEZG`zIL>TBtF>gAa{0lVKVjME(gvO*RGJhT^^gyac4a0&oKrFZ%byMN(%h zEWv|!!6ImZks?VV336QlwVdCG;Atp5e+&|_J1l%z6c1XgF$qO>fZ!$ong0Temq_9D zQELCB+-sJKP`gVG4`LOQTI7@ihY1O$E8nmYHrT}s51QyP z2|@xd$f4ArPx8P{CM@y4kf;g+v*$%+@Gp+h=~y<%dp(s18y>`iZi!4mfcpy&CDsF1 z5OBbEFk$}5tB@o>1lD)NYoRA8Gwo(32BPpQ54;45A6!-lK_IQ;hV&lbSs`s7ydXjs zg48z*Pk~5eDhV3hzX1c6`rs!~K7kaJ(G7DfRBjkFj>|!f4WS0v=9G%Z!uLY)aj4*# ziiE+07W$t^#6Z?%YEgOMRXYAGmWdYzF0+>GB8J6WlFm-$fZtxihau_$AJ(9iG8l&Q zlJPO91`#VkpaHC}5IA~i_;)CWe-f!R4l^-;ovw@xL^wPfk2*GlL^otVV3rIe?gqNs zn1|0r9Plqf$O}v5g;@&m>oACjfbRhz5J3w*G6ARrbY>%=at5kHCa4f;F9=)ZFkX8t zJ~Kb>5IlEZ1IZ$-)GY4cAOByO04{Ja=$%%HPB0O{Ks{qm9Rrs(AgcVrDDL4Y#t>Qu7j6WvNTmZMS5#Evz zzQBq^R8h#s4wzMibA&;=N0dsYDv%u?HWQ|hn1U!8!D7Kp#iE@~m>zZ_g`f>_ND($d z9K2M1xLk^`_TjpyMA(OnK~Bm9EL0>-m_%F>i41=LiNXsqgf7%qk7$Dp54fmXVcl(n zIy9gFAU3F7oR7m~27lMHI^X!c7;U zib0BYpnN{lN5Q?XBC2Z;QNTxz096To>q_`ZKwyCmW9WK40U#}-lY}j(7MPI^fdj@_ zp#ecEFC_SZh=r#@3BqVhM=Zp56HqhKWrj&C=;6WKWB|XW6LzAKkcuJbtnq&j2uyD? zNQUQxsfzGqEWsX058$1b2py=fIFgwx0!T2>;ylVMIM0x65-=l;Q1U;nvrmX94DCt) zO$(SZLDMhhkhCauBfKS(0HLOX%{x0z%6tad2F`D<Shwe6d!U9E2>h#gI_O!hzx72bYun!uKt~p)_JFA$Ks5!3HGs~_ zQk7waj|9+*oXH+YXUriz6##hb6QK)DfWWO1_!0;3V35+wpvVxP09uxUs^zJh;VUZy z6BPXHFTy>PQGf_RE`3Xs*pBW8(6^%;gXS(MWzcOE0twE?62GGph#xp@qbh;kGOrMV z!BSHU@-M*7cN8|jvc_1F5OFPiLP!VHAT5uGu;nJ=Z`2u>^fP(d1Tn;k6Ns!p{X1~f zuaVCI4XJ>>kzA5QUlckp>%;JCDdJYd-C*#a=TOH(CgwDV+t&UQxesC5b-NlkyXiZL zACQ9p^0p${Ab9@VA`qZzTOvD@qz(kjdw>YqeK6I7cquaROP$IG2ig!>(Fx>C2j2(; z7|ep!B+SLg9|~6I63OX@K@$|_2-5chjBtW3glj{f#fB9!2fh-d(q9sB(AC34Hb~xq z$OCP(Ut^w`t^b{a!5p|bUL)tMg2D5K+*SrErG7;#^R0amAj1o#C*pHAR0G}-+ zHlZ*9FM0pituH4^qic~Q69K|ZOyJ-uq6aFjzqG^rw}_c*&d0o(V=jh2+$E0uUjTp= zZit6LM01TlL}1ZeL%W#>zI*}iFc1{zi1SwpdIsPuwth-{fP(vn*1U^||G##@lmeXf zf~bW~fVT*y;VCkqAy)Nlg(wDvy<9VD;H(}n>kx4T75ceR;!)_=UMf56H9`b!e3-<5 zu~771VDT}OEYNBT+&VEKB^gseAGO!Sag=?q*qAxS3XzP#xeAU>In)7|h@eVi0Qv6R zpGd>R2J8xJh9svq(OINFi+>l^+UgW5vKO!lXi!9q_sY;^2O8DDU1(QbSdTcqteYftqAV z-0+Y%i3=4Ek`#jp(EO6QLtUDr@jtfnXMzYhDzXz{uvZ=3hI|(xVe0HQ5<8^0jf93T zV9MKIFyw-g!i;%HRAR1zLH{Q3P{p(^W`OuR4tZ&Sj>_F?B$KsC@X7pd5{dwR@1{v& zph*qrxg-QRnFE|=S^y{Wcw@d-rKgg3;Hz3BKlGpmZP3m zCb;1=1JWgQ0>oW$C@B!66rZiB?99L0zKs9}Pw7nHppz>^CPMp+NysG`^Fd7<$~^#> zvM?ddqogr|7z|)Qtc_#JDc1)1(VG(Kagk$1J;^-LC0t=xs=?HM4sSBi1WCFgNNOC}z09$yE>_^rDa2p{~@|tBJ zXCJa1=v)}$OCh26^GvPOr;?gc1^inDbVP;D#*hgxdj?4n#RRM%0i}08570Ky04uzZ zONv1EGJhBVY#4Nw%_6Ztjqc#fsp=ZZ7o7wxzQiFu7vN+z#U!9rrh8tp1!MFXup{-x znqz|iA_PCXLCQvNq(ImJFV#0l9B_6mX#$P-h-|=^Fns4W$$BlkFn?FVTnBN`K!7u7 zB5|Vt5KSQ{zyt=eb_3>K_=r@u8I2E2{UY0{-GH0s&X6M4?r4}lNBIMfA3pJoG)qDR z%Y20X%Of1gLVk`)9(l}0r2EIV@$e;f@+@k;z&DmrF(BRwXy>XULN+{xT&Fla$D&|4YMJGU!XHO1_4U{c|G_+t{FN zPvGarHOW^|@c(=Ppd>)rTI7ca>CAWuOKFpf&}9g7zzr}^t``ssyB;|NodD}3A>SA> zJ6yesy!ICTFZKcd!ouwa-8o#GM53h%fk`225TOW(y%ppfW%r2hb@ieDDm}ZEXxaTK^|3T>;O3_ ziKl?+vn7$U|7QZx6jQ*E(<$JxBbUi*5gh$_3JBRy(CES3>#m!(%IL`c9{%}z)BT^{(;wy0=QjVh!?sL7^D);YDbY==grWf>v1A3h zWNSfF;_B>Fb=SUUS6jI5UEVxk_3HJm&Gzd@MB_!2$_Zr;b-dgIM2dwMR86u*#EOoF znwVaGU03VgvSj&sgK=uUjJp&`ptfGS?UeT0`-Z!*#(Ym>!)+5_@i&;8R)rbq(Qyf- zj(VC8CEh=~S}9fkb9)Tw*>KB&z8uS=6ixcf9zG}(`>@AIX+4Kj2$yQOp|y*=?8B4m z(nM{XBp%A>%Sk)L%_~2=;hLPWd?(fUc6Pu+kvi6)#>SP+F{+I6!f)OOoVX4y9;dc# z)X*S@1d`9+v1!>}e$19Lmo3>Dl6rUXe$)00v(+CbYr@lF69!wxEhq2f5ZbX+*Ylv_ zr@IK3I`5BNH+DxXN_p9DNIBi>s(t<)Wj|42XR0V=nE#=9((BxiIluHy0k^z7%6EW6Q2A zndUTi&g#7_*6v4bua`8HTq76%2%CsilJ#)TiY>`0@~Jw0vg^VP>XZAIr}Cho@iEb( z3g@#;23bD13_3wa%q9B@r}3G2s{#!MkDtm5>ghe$NvXhCu4s79FC4tUf0-|S!$)m1 z#sm6jlitt#Px3K+49~Bw-5cC_o}bg_l#P1ox{FU@e3#U&^>=m$6g=XSR!?J;n)Rzl z8w;5HdWa1Ru%ivWV{w``Z+;$EX7F_q6PfMns$ml>==mmQ)4-fl7*+yj@qp2!z5WMp ze|KK$h(^5q>N_3^+o9TBVsfSx*#y3Hjgb9hdUwwT(QCZo=ToXI_^1|QsNkS&EWW2ug$I1M~~+# z8z_<5GXvEF1YaM&caHrQ@$i6?rMBd^N3Qx)yDr8xP}DCM#uZ+Z**Pr+$j} zU5XENjz;mBXsQdU*J}}#kqX;AY&J#^y`flnn6CAzVWZE+xgg5taZ{6Hq3lJ1p=AG> z*P@@=v^neIX)QUFy1gU8QlB=?$x}YJou<{TvzkfE>*(W2dwnvwcR<#}Nb{xJkEzP& zmtE3Z#?F7oHymlf<`g!-{?DhTVyWpxzP1v1%4HdWxffU(Hs^DE){OXoQ6FVDI1_ug z^4d%KSntf|53}#xzro*^t8_T8W<9{_h)x#dT)q3Eo9Hg(|N3=<{(}uuKWi^~h;Q~b z^Sn6a@-$;4 zH{Q>zDqlQ3dZ+f-iV-ERS%1oCqR>=rTYKpX$!qj*-aPI(K1yEeTSE!+-7R|$lKCUe z%x4~JUU!^g{ND2LlZR%Y%nvVZ!|c?OQ%_?Jf(c3ZrHELmIdOw5{iOYUN?W8^ObspD zQdQr3a}RHiHTO@R(~4HWF4e?Vjh7K5l>2X(w!CpkU;jj>R?{^!eb<>Qo*qFw`K{~jbI%K`r0>qsXJLnMx?u>3eW3AYJ>w+Fn^hbk}GXdrWaYo*=wKqLPtW~KBRp;68 zX*7!Ubz%C?D?TY{ho_%&2g>9gf2d}1(NR~WU2g|Zs6wXm{i6jNvc4=?A9|_i*;zlT zI847Czy8ooP4BFYK0909FRRO5?R(4RbRfH*!e#kB?u!7&2Cv!Lk z^4-cRbVn!ah`0TcK321wuw}yILA?GQPT^~w-kNzkYAxu>xJ;c2%`MvLsnlLew^-h` z)mb~|H?=RXSQqmS98}onr0%fsTPlrhEB?~`n4(lki-8tS$){E{{@!4B3wFZ_+n%T9 zoyT1RLjApWO73{dz2{D>+s3meclDMunOr%c@o;tK?T&_m1d$T=I|UC<>TWu6iFNhu zhE?74!$K)BKgH;lX)ca8hMGA#au4N%-&GXAzdf0iZ36GATbn<{ibqy%StO}IHSCj zZYfhLQa?J)X|AR!!)nI3LAQVe7wCeg^1`zLF7Nv6%T7d5dSkMxC2Lm1^_IO`zJ~35 zXcthTA`%^^*}C_6^{-j%>BG)mO521lO3977=Ne@C-i~1CYHzU5tx^5{yT|Wp zoSzZ;y3Gm>ktp#vz+p#+8%Gbv6Jp!bLO)LhV1$uCvS>s zTmJOA<^Fty!DAOUnAV51sO53ldisdPX~vc=Y?;-*(E4`&^TY3hl3ZpE*(bMUWwGB} zXXxV3uWEH&ULyA_nQJh@y70-ZhMdP|*l<=Qr5E2>n>s~Dy=MKHC82o4-;E{c#nXg_ zC%fB(x5=){5jhv;rAp`7-$ESU5$Bk-r770HaaE1B2z}0Y;Px>v>Drm~#Kr}gg{P-- z^!-Uoy)_GS-xFQv{9dnv_w%3co^0j0`_?bDkHT=bx3ZvRKSGB zotY@%kqZwSHrNN&2v#(-sHqA@#G(7G_r9FS= z*x-J^d+_b97@%_@TPM;)nWb0 zSMxiARIvtLtW9gWIX|>|@?t^TT~&{ZCo3$*i;BM-@uO^Qn}4d}sD4g8xI(k0)hOWE z`ID5Qm9)0QFB)bwp5C3FK240@-lTHwyYO3C9VeG8)AN^ z8W$8y6^7YHo_GQtA02dW=$Mu!JTsJhy=NP)b^4tPpIbtwWq*d*q4i&8xp}JO>ZEtO zwhx{(+5DZdbKO1dv=EOop6jo7y;jk5-=0wGku!FsTgcbI%*##Z_WS7CU{@J#9==>2 zsj@QLJ^yLe?MdM&bKOdC7p|u#I~>*fQf=*dYu(7henn-okiqTsxr%c7e8Ue)4JlTl zzCRLn`|NpFY^kmQaZhJ^kjL)VP7CUEZ!tP^bLGU_c@@SgZ5i%aO8hPu{$Nh=Q=uQf zuGwoIkCn=b;zhyLOOfmsS+vvi;r)u9Qm0<+3?1`m&)<>ob)CzB&but7iHDyC5z8br z(q#?_X`7wZsc#MTaT_+J49ZW{eDsw1^)a7Mp2pW0uUbG&y2(AQ;QQQRRr*KJ&9D#u z?TCH)8`PF$$0W|pdr1=h`|qsa|NdnX`0jwkZjkSwH&x(^Wea2x0&Yb3%E+w9MFI@Q z{L$|dWcVF!f@*sK}h0q27NkKiU8RpEDmIA3O|Pq@(*y22L5n~pMw=%@M$19{w`8p^bM#bDPGvr%Ob_&UBl_ zA!A1)lK9Q^{(4WNt%YeDG~edOWA*dwZLx)eZ;gh!XBHL;misG z790I^pHX?Jk%wFP-J3dh%A2;?yvjIXizTOuq|F88SF{!23*5dvKPllL>s*~Y>KV?t zN#($?+r=y~hPx@`g`&iARY%`SPeib7k*t z)|jK5k8T!kvvaVq^3KB9WXU<3_rFt+OXySYe^hFiUte5PbF;W!$HvO+obJJ9VdK!B z7Xz$kYT9~!{BXDS3Uj!$>qb8gY>NxkF>SKCPo69>LxoR0~pR4SsMR~8W?a0CM zmWA`T&3A?Qma||KE?1{UJrtZLGfrYpOFN%3lHOzEa>y*uz%$$>;81yGZks=S6ZU86 z+rw_!3RR4&R==cnN(^jqrVka>OdSo>zUR0(|B2MqMX7sZ6B#K|M%b-sdN<=^-X!pC z`{sTtiu;?p?IAaPhcFf4tM_bnl~Mibf~u~D4$5yX5>8Aw+AC7#rQWjbTqx3z7Oi%r) zdA~eCP2AVLcPY1Ibvi@SxcRw?bO>#qEmm;rga-ez>G+!qIU*CgPqGf+qYq09yEc)o z$WCzLzUNkyHPQATxMJ4#JXrcrX?(iPfNFnwf1d|zp5nWmcp}j3ck?l0jSKcFVf49> z{fF)D>&4}WP1t9(pSe6*FmVRUvn7ACogr*8YpQ+Eu(`EqokB%|s(ifs=dkb_QSH48 zjLdUN)b}sBsFer0*^a*oHgik8_Vze-;Mq`*R@*gx6w&sh>K(9CfTyN!)rN#u7WCFmXuTm>&m&}`;EY}Bh9#%&2&c_ufU4ph z>D@P_#I3&yB%`Mnmk?<&eeCN*jOSMgom*zw}?GMr2 z2t-!dDM;e(HSw6_pwZU@;&;v20yNZGTy9f+jDs&U*Gv6=Vpw|pvtcmQp3T&w&uA%U^1i&<{q4uQ=sT%p?a4nan-5O8h0SQ)QmJ7dKY<-v3JRCA zaGvO|yas;D>Rh{VdCNA?!==G}7?mt?<_HdYCNH}72wK9g$jM6y<*;HVqD zgzs9;Bi3YWsawsdxLnix>;C12HRsm-BpF;i;(f`rwa)WQjAHz2&7+B~`j2zw+XD+Y|>mPaD_sJ-MtYX1}rfaf+LSx@nEvnUtP=Wi&nQLCYG-p&gOoQTrdV5gZiQCL=$_=A46@p1T{&ikBuuY2FyCLXg$7ZnzsOonIbH}OoWH`^2{{E#u*VkkB5qg87PZ{9S@z%(NnfMME5?9n_u9u_g($CQs*%m&ZuogFybvi*LVi`|Xos~jgwi4Af5 z2VTtMQxzPe^a3kodY1GGa&`3s@6@w(g>7`^&nMjZBp1h@VnJB>)bo8pL>=5GkyAN4 zmynHDe`He^ze_#oRqTAhx#OMracRAwf*hr69k+;vb$sWjpJwj8@;+(f$M%7NxU_?_ z@}5C2?svo!!#2NuD$Dk)!K_U%@*Q_!(7rZ@!H5_x>8$D zaESi6L`(7Z#oeA&G+%5b2LkTvPGrStSk!i!jp0AcDyWAn&<+a?+|c*o^*C(8Dx#P) zFf;eIEpGTggnRqqP)ohhqYvUNpEX|7Ih#CE?|HG)Z&#wxZ||1*%*&6UO%tJ9F@>pd6d)o*X?=$00t76B1TwF_$#i)UNX?}af5zJ#X(=EPgla}MPR zP6w^1<6F{~&PeXcUYQmNy|foT(>*$G5LaiIVzBb7jn7Pf-J->g!T$a)K02%WK1Y^C zZIAs3magA3pk7C1_%44Xv}NRbQEsimFXp)LeY3-Em$Jm2$8N@j-?6A@^USm9PLxbb z>ebd;rlZQ0nOsm?2$@XyoFTFn^G$2>#=eCHE6yzZGQq|EeKcDkN7fQ&OMSb5armCZ zv`?EBkDiI=%Ow>^9=8>+%`v17uyS9weY9}rRsXjugKsR8=zA{&Z0s1&cGrKCozQvF zVpXQ)f?|ttuis|VruCx?@sld@^}G6gX0+pe&(tKha47G1zW>}5Z|B8U=_7CBhH{{` z3#pn}VHfeAsMwerF8r!)Vi1wpX~w8{=i4Y@(*L?a3ypZ^+10E}75A{xPq8vD+xl&A zdtSEgFH+Mwc231}l>XL$%{RyT7q-Kf#YgjQqq z!~BmFXDAAa(Iy`=8Bf=^wizxQQ?yUewPUHPOCJ{?yIRwqeWi+P&ifjqeM2U$R=)IW(D8|$xIWVf$K~}KGIuqMPnNxr zEhRS6I0|}w3u)oq?e^x0&ztB{=8Bc0EwEX~IW6^vB`w?~b-PAWYCl6U6IS#>Z73{Z6XUTn|cdB3V z%k*vJgf=3-ZMYx z*~WZc|J!z}7N(xMLzW%CS_E5+TWVfcU77j($SQg2)oG1by9AYYnsXY}33)gA@(lFC zPqo&F*z3|9kU4Y57q9ABX8q|6b&JY-(M$!~fKl!j{!eSmj?I~SJT8>lBis_POFQw( z@Q_+TvVzSo(-!7zoFeB@D{1~DL1ohm)D=%-9=}w$(xjEh}zq{Wq z*S$ZwZY{(w^QvHn$?mac{R=y_qxav>SL#V`nhPFUd7~5^5G`JWk6yMg_c>r~JTd zneBoHxwg@_u2pWvYoSzGbHiu)r>b>4&p&b%iAa03`sA$@tF7(ha2?y~#}C4LyzmTf z$Og0xzCB)53+nE0clXijc$p{&mvHkw(^*>5Xz7^dlr1ea2^#zKmhLL;1-Xb}=ef^T z27WDx#qJ_$EtJ*qwqNiqBBvh48+lHj7u%bn&bp__Hi<^WD0(?=`B=5fp-1=YYRUu7 zLCOL7=Vs*@D};O~sw;H%WsaSYKSHf+`)u#YIAiZ4aG{r8g);o)^DFDU@ogf}%TsX` z^U@w#mo7Xp(XR-&uX5M__GF7l0Dnu)-2~pRNfi%U4LO9Uo?U6!HG?;ADOfiS5Ur`U z?mGSKL7j_;)|Yw1tX_wP5;s|ecg?FU{Qd4vagF$KRl@3KQJudxv}}~;1l!r z?_-#}rB{k7gWkz~{53!5+pyputMabqn~Qw3K`&Bv7a=gSnY=yRIwFx zN9VgU#^?QW-=6hOd7s~Y1D_N<|LwzJR0cSgEq#XCC5x`NC##j+{~4=)$Y+nM(ys`MLYcCnkcMY2zU`aS_(OfOglnDb z(Z!z%lSGX2mlc=sPSJWAz6>V>0>%u>3q5pGKAY)zoHDV@K5sy^$uq6GVc+)E?(!y+ zO0x)ESPqZvz@q{eO=&0MbthlGV=}Bo9%|#?M&7+oIR5oX$=K+4@W4$gKZ$`JE#;yf zQ%`)u<`;%f0a|k{A}1@3-jT;s8J>?H({?&H1k-s9X*W|Gr{7SB$p8I$WiV@C|4WVr z{7XA($-CtrV?Nr!eKrqExgx&&_MlQsWVzesaJJOLz52dV((|MyHglujd7@_|do}b4 zuXe}1D&^{7^{o8SJ1&3JIDr1)#Rln9`OATPmP721T#NGI?I~Zq9ogmjgYof9pW1&@ zJ2E+$rhl`~|Z%&e_fzpSF zY(lw6#6U{1z*ytiMxHNk+f-VpPVJ26oY^y{<9O!!*-mGw-{vX0S>+5%p?JECYvz$k z*Ba_CQF{zptGH$bc<2Dq&N<&2Jk^+-FD>@#sHa&ly{0Zfl2GoK==YUPG#03QM&yqBPE{KaL~7|G?01LJ87@7%KZqwDm}|k`K!zMy`e`^ z8Y$B9_5E8rpBYJYCal{$34B=kChVkhX}Jy!(?`o6p;Bp|qwg-Klkai2O8ac6I8I$$ z(Wf41(coZZ?{@69mM>iD#OV41pIas0Gmt}lw0!i=%(48Gi=hOI7Kb0TE?KM{yQ~E3 z#dGuf-#KzLQ#KYf1g@V=6=yN*%}CPvA?Mt1UzC|aGB!8xInV39_8+ryj!LqLEZylm zZ&y-ucZJ9X%tiei07<7d@33eWG_ zThop6cloeLb@L7RYgbXa6;n%FM!Y`HAgiRmNRHPogO33ZE=cZPDJ$)Dym4aizCKMC z^Qj|~&pcM%=_Raw^x?N0bMR3&KU29o%&}HtAf0HK_ky`CT%zy><14q9!K1-nryKWj zWtSL>eJHs4&f~W&UARc$3$7R@X(+F6!0+dc(%2tGYh1hw+ky&ZQ=o@W}?p zXvba+B>i~0R971N^TFf&JmhohLWS{-(p65X%V}S<3La-f21rEE?GO=|KiC#*x3RNO zA?!owJ^hO*&*)}}rB3n(1LH!TvnNeaO*HOhK7Xm8>B`-Td1a!`2l^OJL#e$+FIt$4 zTJFEe%OCMP}h9Ns1wG`yQj}q8JlETrFzK4 z@^mSMv+?lnE_@q4;Ci?7&_LDxt9lLB2m$O7gmBd>Zy&`Ud*zW<791Epz2fihd9}3o zlqu)wqthOz4<@v0Qhy0jp59%wDP67{LUXd}U0l=LjWeQ!yp8k2S(>q~JZ9YEqI>J` zgi`PA)(4sRpYVK(h`)jBJ;TWH<3Z2xr4++Q7o2q;i8090WM9~SSdIJUd$%2@eLWq6 z9k0LVvf-@AIvHI$zrE(G)h!Q$@!q7F`8TOFGt{y@`O4Kx56^xe_V!vI<0$kFcsFv| zahNl3$BB{&yP~raTKz6{GUrn5kfk{u0qb7^8 z#Vh0IV}@+K6Ps)Fif=W}QyD|O=8h@mcuCU~9pNs*k~;O;w$V^m<4~T1%$(mjr@!$ z)j|(dm0nnQ`}Umiqp3*gw#RD<_Lg|l5}qZi`Or@s^s_hXe`ywOW{N33Wa-V|lA3Ye z7Gi7L0~|zKMZfr9zVNsue)|W9kfKSR*G+rzZ(NmjTc(xPJD3hf-5h*8bSz)+u|eb# zTzYWlP+M(zl21@o=|(|)8c*W&Pp34z1RZ~CO6gsra#b%hv)o){f2<}E{%h#{Py%nB zWaLswY1*U9fmehC;~IaRxBPVLc!u|9ezCszp2lA${f5o)U*_A>_b9LU&-{>is56x< zS#ccS|J-3=bHK~IpuDEYwizB=>Rp=Z)68|KDJ?49UwE?WktBB_H=huZyk0#)sz_g- znexv2MrlUg2g&VIF4MI)H1%|*TnnERgYUl!JWMa~ZhVuyFzE=Ye@pzF@ou%hqvo7Y zr)P8>x)gQG{1@#Y)TsEPYUgC2!p_L4JL{Y-b zJB?=uJ$m{|+5-+*Zce&TkA9bxgteg^eyMNMV+;tI!av&hG_Ti%I`&U$)*R@6+^8IP ziweh~pjnhT@Q_gFX}P`5oyPNG=WL{=SnF=1g6bF#BV+xpB0W!uat?*dt>Rtj;@|vS zR}VWbKpW7LqxU>dXAcgtaE&~r4YdoB%Xw3c*Xn&W*BEjnaDC1a7$z>U{cld#qk;uN5Nx=8k!@ zEP}6;kzuHbZn&e>>ois*5Ngyfxi+v85Lin$yCW2KfV(hC&jw)z1q5Ox#Hm7udTx$ z#TrL&fd*MJ9Pd10OaKs`ZO!=@@Fv8VS% zA2wfJ5XBRx4;<8e)^f#-yqB_0hCQEo+2WXyVu_J)Ypq|QefPeSK+fgsGX~Q9Mfp14 zMQd>_KiQTge?MEcEg4y$9p!qntpvBsJK!^v^LuZ@jpoSTftx-}%UwYa#*`W_$gEks zGdisyO=R|cZ;>z(^ET6+wO;f&Z{%;Y{+CuAvqRyvc--tyjRohEzrWGiixN#5wSKP1 z48A+d)BAd)aYIV#`n-FS*T7) z7=0Q&T5w`H~Z{oLP_L?^0nZIBR)QLDmo%X zEdhEF+>(+>_(X%lhqDuF>sewEV62 zoswjNBJ#;cz4=C;c4j8z=jhDF>9}2&cO>=~FfgVTxP$~0R4K=&7vyw3w8qi*c)CX` z3N$b(Gkf^cRo6%)6(6%Fwr)rl+;$L}QY=qixN0?Vr}0zjLVWv|x8JKyXCA>99iC&G z@o9HWH#+XRoJx(4$)F%xAXYv2MLAA(l|cQVp@BMzXJ}~5H^Q2G=+#&t^-~qq-mz^F z@r=ewsxQW*B5HV2oqd@jzB3+Xl9sJ}?NHwEl6sa&TB#Cl2xpr2DQy|kkJv+P&6L9! z$U{`FY#7^5&8!p@*^td7;I^m}k;|nqJa&@0Ln-J|!*wP*yz8QVL?2h}$e0nek5W)n zLk;7I=OTFoGcWi!d^~lA+)8Q#CsV!CVnBoscUa%p8nw3KN?C&m(*^HE$%s*|_1>|c z)OgvI_y&8%jU2PzEk_Qp=FZ&Q$Fg0~(hGbUzKzk_(KoW8i0LjD-x*(;hzTZRMb(#M z{t@cjLodg?BJh4pcX^~#R7b}SL|9OJGWBxXIDs$Uhchbk*f`3%`<6G9Q-5F*aF9LY zTh~CzB;d5@8==ds(F?vbZ=xKO+@Qde?z|Wl!O30QJ;siF@jk7AmubXlF)-phPi^zq zZ)!pLmAnQqMy)f8CnIFI!Uo1XsYex8VjF%kUT|0xj=*Pdt+$TB)X$VxR3b*X*K->L znKrx@Pu!T1S-}lbGca;+^SQi}`^>}V>T3`o%;fFqd#6E;x|w^ZbIc{8i?Lm?@^Qm3 z8g5WCD+eVu z2(veuF7@GYWU0`M%)YS&%6qc%it^hYQ*q*XsTjNQhXk}|1TG9YudjUgs=_f4v#Upe zfqwPN?Y2wt>xN@Z989NJ=O@IpsSR8Fo`tz^ZAg|Mb7ANSbWz>l+yBv*%>pk+PPkJ> zb$aM{BWoaEu#C1}@IrOHT!; zD~7&3FR=CwH8p*z@zHUxH0&Zx#LQjJpt0^foC1{rZ~5(@cz!?T>J$jiph5t^}1TG@3F89`x1h=XX?KUe@U!ija?V z6gVd2HNKzGv63c%);h#ALbfqNweh%sqEO5a2kypR0pg9)8#HS>yk_@PWHv>(M$Tzi z5@g>*DA8tXo<7(=60to}PQZT$ajao)WSM}M4%c);1DEBPG7n2Qf2PBxU&s)zbg zHcAT&#gsmzdAfr*bty{rLqrWU733?}I4_`a6?`pU7q`4Pb~aK|Gl)L3J7RQ4>-VwX zNO@+v1H17*$1EcAXncf@1uZH!hB05bS^7LeTc}B6MY!<*^G0Op>j-V(V?H+*-l#Vx=r*;%BS+ZsJI5Xe|H7aN`hn;(9 z#c%F8{CUw*vyoiD`r5lMWp%h}jS86qgU)Nh{-K3*j%m%ucNYG%WN4(mS-#Wjhb8^^ zzMBC%`9785y(1$uE6B%jH~Axd^P0CGQf+nC?cO6u5fw^2P0$S@suFZVh&lw_U?Lkq zH7YHiYJ2A_bv2l;}hd3nI!B#6pPr1hHTu4?!%H7(&PmB8n1nLx{%- zxxvKkgxpY~G{G&1Xh(1hA(9i^f{Bg!`@A(i-*0QsM#IXKk=Ad>*Loddcmcj{KjStyW+*OH#<(OL^g9uguS1zpwIXg zRMeQOX_vdmeN)D4Mg6ACiIu`;{7g|cd_3-v-88ugv;lHmf9cj5uSog zkDDert)!oQw!6@h=HUME+=s~%IJ0}v4|hsGOTN0($VUD7WFI7VgjI#Da{cg5JfG2! zl+6VOs94n7&vZJ_>5BU+KYIB&ulyu+{_g7QiMNxhn#KKB>zceCCatAq#q{oO(->p) zUyW!2pK^Z@>%S`86w}q}+%5!b8@I+L2fr5&Ts3bp>}^$OcYrrz6Wx=8+t1o;Xvirj zea}*8nv{VagDVcFC+%^peXS?jk4tYd z$T20azT*D!?HS8sLxs`3)-~%3O~j(4g|ss^8_Z72U9HUR71EoWa&&F$pYGr**GHQa zJ*PO`)ZxvjM2qCrHttEQeXTrBQu8r^d#)!cx9OzL*?N-6@h3y=TzwL|atstG)A(%+ zSRNZIyll7Z<1uVK+{SqJRaLL4)Art0*Y=>k!PLYTijN5j4dqu@{qDOSR#mU=J>JBZ zom7+-U0lv2*X)_ol=R8!1LPNncRj2gZ|fQAWZcuby`8O($DoxvnR~%7pop$1wJ0gN zU9m4&r!_b^>7(KKqWmVCyreJfjD5-bTSbxwT9Uq4J-%9Hqfn!&Ue#ONWb+_tpk1mj z`Cw~#a?&i3Xcda{i*VIXv$gRQkW=x@85-y*&uSXVNm_09E-t^wWum~4h94*{znWO1 zWIow?w#dV2zRR%aagFC5(W(7y-D-Ze57QHM6(2VZyePlR^1aekmj7H)-PK@yg*DX& z#pN<`&$(ht6hqm#JN%Q$V*ykKhQV0uQfx_@809r<=c0Hb_Qxq z`Tj)*qgM|oM5$X82W*qWcea`tmwWOXwc0EB6`D_2HACOex22ACSNBFYtshhnQ@?II z%jUH4AgL?0(lgDt^_h}ij`_5e8}wbUEp?*1rnl;v00c2x2iXx=}4Q++?aMBPQg;4Pc5{ncd3c7r}akrNO1tGT#Dxu zhnrwubwc8Ja@FuaU-`U{t7O~I7vi*)KS${qMZcR}pOMj=qTjQ}&pb8vwJs+Izt*el zebE%t)0*8*-xm^-NS7RpZ*)IbBo>`?KPflOwJ+pKVt#UPuU>VpUsLP5R)%){zL49A zCzFE*PEJ~t;2uA8weve((>vSL+S!_7eBHC|P^&<4aP!Fts|6O&Ib=c2({?u8DJyyP zxqCnnbM(o3NjFoK`+g-R9!g$qaz9^W5}n`M>Sp|=TuaQg%(dQsuMK`y(rHHNd%535 z&+vn-N88rhzW5jUL=PA!jH=ldFKNoHc}!&(50+mLa>ci;fA+8GHE9B^L)_fbJbxc( z)o)v$DLh{^dewc$E7x}FzNw}s9%3hBbRo54gwb>`L`1XYL7GmEcdhrW6nl#9i>^Wrw8A0@?y>OyvK^=!W`R*HE-wn zDJgM#Qud`E=%z|ezH;iar-|5%lTlmKwTANZJ7?sL=3-t(crG01PQWJ*GR@NVr5klC zB@gl&(D$VqbT1_jvOZ+!lNOl~HA-;I93Pz287|1DFI2M$)iOJOTH?xNl&8$D8EGR6 zCy|eX7COTZ^LeE7ZEEi3(I~Pv|7t3qy&7U^&SY6oxy+I!(A6zpXk` z6DpXM-r0S@@@-|HuvrJ*UEAP`DS(T^tT<`fcSBrVk0pc!MuFQ(p!FK_U;WT%PD@9++O~LICfAm zfdB6KVxuUUQA2YTrw7x6c>j>aJ&FMg9O1=A%`}3U`5($Q0Fm}eZ*n!O!T!D+%1HS1 zj6fm1LicH-;p7?(nTd2%i;oskKI^YO1|b`Hg`CWZ=A+M-ys}~1jeII zdkEbf^p2!wxv&y``=k1**?E@&Z%>&ZUVMck?eW2x#}~Qrreu>s_sHoTMc5jsxoE{M z|H6-|(s~n|f*7e^%#J0nPUw-yNA zkR`uPRLOk5!B{{P%-nl)o6_yuro2gv*M&n5Xs|?GIietik1mXOaC^e>k8W%H^mj^0ZrgzKVr>zS4y} zzM6#si)2q2gP>l<6iscK)hA;oR1H;qE4iq2uO|84&%2o2B(G{!c*(h`!M9MA zJ(d-I@wG96waMH!D~Q*a#r}EA$5CJXaUs?6(rw0)spPqw$DeZ(-j2669#?(1D63kt zXsDXI$fNpnQA@RCkxKR1;=#&$iwnMvx0yKE&yaI+8eKHFh7XJ~xb89jC`+`m_B6kZ znLmZiNq;#T3x8f4+aKF(%ztp$SpT51Iq^fmM!S^Do2!z4NYz(#NYPhoNW)jA@{|Mb z(B4Jg$}?jpeb=6Qj>lg58KJUxsM2ptaJ=}^Xv45P#n0E{z9mD@e7xWI{wgkkxVFVo z8|Is@S;xT#$u&grK2gn+@r#jRyyQ~8b>lDh z&n>>cCp{-w&u(>2qjMO%PeFd96sTwFY#-zLuu;1Ygw8 z>+y?GADI^Sf7M%b{Q6+A`J?(+_Q%|@iI3;U;y;#*b-diX)IqJRzPLKpx%hJIGNOc`wp8vI7!mW z7VXIAX272`@Rv*A<#{(h+=2-DmiT{weU||sJ_*-FdSL>*=ue_}dLtY6?C%$C(0(Y; z)9@TzHaGfO0rFM@_-Z8%d{q~Ddjb7U1!!%-{IsS42fmVk%pq^WKLvB7FI+zbpF7x3 zLPp<+K#*bWD=hR+t($R-|HB2ABCxQ+`LA)Lz5suke1O+82;fsOpIUIaBoXMRUrEb4Ri8J>Aub z+l{J)zUu#1U6`Q?d?_pGJ?=V5XYk2~|JX4;weQAJY@__1cm#Io$Hh|8M;wQj`f;l0 zKz0BZiuSW89>B?vI&Tc%RM5eP0*Dt@8pMfGEMJDd)hslR{7*UL3`E?;FFNM$sRR0W3s=SK(e1W$@WG z96PKqj?+U~;Ky+;=wNCbXNRKee#AMUGld^<4(JT?1kMv3giqjH(ZSRNri%F|TnIYz z?h`hnIf)rwIf?T|mD`>+vmX}`hH_V?Gzu^K=&a2!{{ecYuDhgWevXr_FB_&ul??)(li zrE3+Zivsz7;et@$kNh)UC8RWZ{0qbrq1^lh%ti*DYnTD=*Kns$kL+E?#5`QbKrFv8 zP{?mA_+NfwDSB@4R3o-X&TfE2Mp!m%U|6!7*dSw*(1O zh!l<%a)=b)Llh8cHI!07=g_o_3|f=IMD3%5NTP00k{H4?+aQwvLbm}A}Lv6)DE=mJVb#Q>xsurlrci5P#kV1 z%%EFLn2x`gAYT;c%yz&TAs^U|Q7JM5H4x5e%)m!rU>nIO_Ol!w$AOx)2L~CTz)&1S zT5=z77`hIGdAkaNTv0kTCs+MPr2Nrjfk^oi#e%tXjRm7~VZ~U=i#VfUcm(wt|2h(V$TffDq(8 zLKse>5M+gdmV~fGa@hf5iXivx0KP#6CObg_0xH`du?lDPVS6zU!Ooo^&InLS7$VjD zcwsC7x9!3Vcin}7+IC@irzV2AB2@&7G9-#A5+;ge*(XtKk(?C6Z0!)kKq|X2^|N+E zA*daK;uxPh;+U(bC9pvFNMQPmNniQm#7x!6|{bMbRYOo*}+a42F>i4;aBvZPy{Db30r>CN|^Pg${0?aGRAPH z3bxc^RIr@iriv{GH&sm5JJmm`s$sFOQp3!V-HUnp!CtUZ5TOj}P$=rLK~)xB_`W(M zi~iN8jwPg;29^gY8Xz+ficJkH*=#f+YZSR!6H8hFE$AeQ6QTv#pr8RQEFq6*V-^%? zV|l>74?2P3`0T^@wC%%iBOgCH=7 zru%d-XBFsRSAWC=mG^1&bCJ|U%xtn zd0$))TS}37m^B~uFs~fe#}Xx1AFC?723VrR8DOCA2EeHZXH!Fr>WLwyD!&n^u83mc zMp$*5Fv65KGRDY@jWH0L38t#A31o^gd|`ssasgA27Kn(OrkH;gO`%A1=DZmcg$~G% zf^0x=@P7usk3!MtOtd)^fvUlL48yr`47!YhSS+A0ba2}O>_`YX%W>!uihLItATvBC zutE9>OsI$@Hj{4&I3qYRC$Umjc@mSQWrcYo%L=#-!QrsRa5Ahh91$B#XpRl0kEAUa zARa5V1&Sd989U73Id;%RbVl4B)3C@Mn~`v<3NxA86)P)Au22}dbHp^s->ZbnoIzDqa03~H z*m~Oyx`3AKm=%YCIyl1>*>q21>3;h(&<)#Xyv*J@SsTGJ_5fYp1IwZm z4-8$v6Zjud_<<)@5P7{Yg_FH7g`qQG2H}0{3|1Ysdt(a6dSgYK!3Xp9Eg#GSOukqZ zj_}3S)Y_kc-&w5GPMyU-cIUtV5z%`NtBg8+7^wEoK+zw=DfEYqqsUYN*e-r909yh> z0a$@C2*fhvSs+%rcAUo)OFxfAZC4N$qqHC>0(F%L@Hz4#xH?LAwjgfjD@4;G8VF95txl_5t!BHkq`kz z{t$_2cANm=(V2b%#?bl-@F$}5%PZKHBOir1HZuyVS`0X_L&#o*G*D8Xt5`W1yNV&2 zL}Q3AqOl4pdJW69qH917qOa_A%mX#opP zdk;E>4qpEm2xemXp3Q_bQBYYXw)Jew0v8Af`Oz%sFgi%d!a(zX2K%!iLsVx#&I>=x zhIXQVz56pQcpoxGXMFEttKsQ=?5c_30c4JX9RCcSK7dFUpOiU}4HF2e?cUpOUM-1} zk-5QMIY2ZL=Vv((FJ;;g4SW_flYqyDXgFb9F2sn!1akrG@CXV6EeUfWPE>6VWZHF- z2EH*#!voU?voMkj1=Hla;I>?d)ZZ9*iI;pE%#jD}+yTtC{kIRa2-&|sx(hV0_X3S5 zjL!p-5f>rmQxr48XA2-U_}QP?_B=4Vh|UVa^!XSrcRrZaWI}M2VXu6M1?6xFnLUR? zW>w&IH;5ITokeDEK*+2doB@F*!p|?TFbX2-IpjcWcPPoovcLynPX4PM*(~f^fSu@( zJ6jag+$6owKGC>`f1LFYfDHcw2@4?}=hJ<`H37J(larB2Y~dQo^Op-F{Nw@)7wU4< z#Amz+2z(4P0^A0qFT@0J7Xkr{eE)zzlWBJNRuSfhUx(ozF27>WNm%GP7k6uI`Y8qk<1!fZ07SrlZAT(^SVlfB? zl4N?tfD@G^X%^{E4PP&YxKJ(~;MMU-Kz#@}NO}tw-IIUu`Cx5uGgJr(6N2(bD(4pb zt5&dF8N>~%mH-72R2x&b$g|tX$ex3Uifuvdz)(R)V|rMPz(Puy)Doa&f<3}T0={Pt zT4`^d!C2i(uk}0+#O|jdBh%i(D&2`B6*PxdMDr+bQYTv$E|T!k-rM<4u|;n91hD#e2?0sM^OtA^;EQ%xjcPzZP6QIw zAGM`W-K5I_=y@~=^r!tcH>yBUdoZOP$j=|ZLA(EP4H;SEH4;A3ksE%&4w3vkg0KpV zA%TEyqW>wNR{=olv40g1LIwO-RtUQbnA21LuZ4%>|0=`=cd%nieGTEFboVca76whb zrBGJnhbvcdfsSL~7gYLxek4*z_abSmE9pEJKM1 zE3?|ap#OT6Q^C*fLZq~xCo`x5^_R>7EXl1~$NT!flq~S|T5L()s|8FCHT=~Nf|Z+tE+ffgPRDObd79f`eyF9i&5k4eqRiG{{@v?e)+R3br1Y zxgO$&-`0a>ZI|mI2@0?OX0#~$$NqvLSnV0aL3%8QY}ZWVu-psKFf{fVPy_j-GjcYg zutH~d!6ScW=aAV#bXEdBqXvpSz_s=EUkZYN3%-L|dSr`Vw|zv|$|8NuMNzg@&jEw$ zpO9Gz&?Hk7eP|~R+Bs5i&7hM=Z$||o@W{+I|F_Y~b0kt=NpIy!F-M~R+wI(R8EB0> z{^M%|oK)vYoX|F`i_FkA_}VazAB86)@csn^F8jC9GO77F%*zik3L@r|UV2wA45G=v zL`HUOi#a!8*%y#As-0Pbtg;W#tPAX1TagskNbHfG=`iS-&H~?)0{aDGQo-@x@l0UT z$p;0*cnfEd-+y&tLmH|x!b~(k9fYWeZ2b2B-w(xbX%o1igoKO!B{1w0Ib7BRiYaKS z$s%QHKu*C%#zsa zn6C+l@PKHm)0WubORu3LumA_>;VWZ>MM7Hm7(o=^TLOHWEkd5a7n{MA24ebrGf>in z8?iwGY3nWo^XOr&^E0{3+X8H^1d%k{LZ1R(d<||`AoL@z0sV;3U)Q0%-brnw4O;-H zSOjH_v~-0*w|7!xP#>I|_B-$hu%!Sh?%l%v%kF>JfllzW@LCg=q7rWaPf7^{j=3CZ z3lAr~0rdesgGhalZQ1}R#rPi(=r2zVyZ2!$;g@od_%oorJaC=<7As^e{viscgxF9m z^xFYHH_#KH8PfRMex4MhHwZ|?l0=1c^+l3y2byo6jaMl}z*_5IB_lh&MM{kI-v9`} zpd~#uECCwApiv#Yk}V$u9J~uhMy9ldNXdy574~-^Rv@2YiFZIW?lh9R2hfi7$jU*P z7(GpH+W@730Wi_s!lc=oq$zME1HADL^A~R?;I!8tQR*OU=TFDB^l|(;K=PStJ ztu;d^n8ayouX}iO4%1;G!nPJUoqh+uTMhBYlQIQ#e`SKL9WcXRRCnFz13GtY|6fU$ zFOu-V>f(lb-$UG}ckRCWgYG9}WG%qMN4MD6Lm;i@zl99-$rba(gb=`=4)EU^bLVIh zf6)D!9d7S}Na;D#1$<%=i?EU+b$QqB2JS)@iA^^EmER%RpWlrwoqA-pAmwi+(7`{N zz*de%st17Hq>?~?T8=ZKl?i27h`=wUli+A*($c}IW$eXLowpajA7qf!1RIMGobeeP zZ4g~GhmK&!im&}zUQLl{RqGW%i)B>=^p z25uXI*wBb+$o6{`1G87bugVrT_1ql>H-!*=^@aiU=bt2fpU;5{+U+Z#j3ZG;U48XV zgy9=NYlCcGTX-a{A|n5*{T#6N2$p5WBM8%9e?tesr6Uk4$}g-@cRU|tQ3(qfncWtC zJJ+}JV}_MS!3srEZ$?Y^rYH>=880sxnZ_2P6BKYJ5p2>Kqgd9|jsnrsbjYj}jFSLu zrO~WGxCD~*??EnkME=jZB{C!UXh9}LxnK-%@#cW#romo(ONpKjW*W!#{{8{!n027T z8{iPLExO2Zk?_IEj~|Xf@DZuPON$&az+fWC)k9nGA99m)|5NMfV0L~iraT{k`~pGP zYymVP_xT91qVa6{&Ldj_SZ#t8xOJayhciEdyKhMD&LO0eq9j$oijszL;#mHiodBTi z;v^8LnN+ZVI9MjCA918uD+x;_41k5}_ot?s5HS5ZNSm#u zvmGL-hE^#8X&AxU|$3J?eMKlQ0EX(Is(ct{c8{p-0>PaXN~OnRxt() z`2u2Vyv3kFSaurRBSu!tt!Y57Y>82A40DQ8?$1C{R1*P<4>XjB}V{0`~@TfqOkQB05T6j1>Qxj6+j97=d4eM zWLW{--P&6C_9Cbq?BFiNG&nt*Es3l1+&KeI=ZGefvw;2?xCw!%UcwCtkV=HQ*^^vQjm^N$uD-=oRM>Y|0Jbl@OW6n9P6HO# z)&thLCX!LW(@gM+9CjcpQp{}Z1?BiC_y3k-_O~SYXi1ZPi|xUvllOfC@-4dlI(a*s z@(toalh=$l_sJ9Z>}Qa?%iSae=_y#)P~Dub(OkO=bfW`D-+f!$!qbcBrU6&(0;d8b zgH&HPdF%q-lLA?^^;{+}jGBR7`e+UV(~&DPRIBYjfL7HbB%#;G!2Q|lAHYtI_&Npw z*?MBa8g|(@kck!ecBAnaNSRA)Be_ZTk;49LN>VO z-fDEzI>u@R5<=rOLYW=$6a>Hwpl>}dXj8&xH^8dJtwKC-=_)uhm9BtWH;DX}6(B#1 z`Y&7qoi$knv(mJGXHlwMsB5dUD-PZSt~~)VR&$GMKhTlz$Ckmdcb<;nzYCDmZS?bd zKzi&)wA(_{!;H}|Gl-)nA5?t9FChLBczA;-jg}hbHHegyr6!iQDL@jW(Eo3hiDMz* zgEIgxe02@m&ePTaD+W#yNY)Z;Y~R+fD*)zo0ICxD2jsGjrP_VUylCW<8wgGgs#_Ee z+eyM7V+I>R-#R9Rh_DJ1`wQZQjelcHL*u@8KpU`I6GY{IcIrKU@%iEA-&jD#egjsn zvY1v2Kw-QrIDi)`V--X1+;JN+;Q!0uve0ykYP|9YksX=~EXNmYk$WqCK=M|sBo&PH zZ*WUghy&b=_`4!aH-TsqH585>XVW*aqg@RG;ngNlGLL{P0$B zpe$`&|8$4{ierOAI!Ufic*X)QRgFjxa7D-k3y_1GLdYUCVsa3e07_p1+_qkC=N(1x z6+u$~;1jS9bD%dE(41Vj=;U1nd_fB=-g-!71`oB6B)XRi3`Hs%T6%U+0QnN&*%bl; zr!i{Sn}UUO#dr+?(bKyJXHa3TU%@PW(dSj1r-b?}S=q1wL<%w7Ytj4YBcjv2fJFk(gtT8xAHG$_0P zf!76+s1~=e>_l(o)hJyUb_X7c1s+n~k^lv;92LtUlr)$Mke&}Gkv^khA>F$iMP`S= zl{=yaXc8`r;u=tc*%EO5jLd=-;iNmN)yQnyEp+xS4GXEegdh!=Oo$_)X2daY!P|{6 z6Jrq2@jE1t!yN_)J(i&{o%u3AyarPCEjaxvY|+>|frPJ0%R;)nSLYRXR1Q?mGr+j5 z`{BtH5^54H3lGXQ%O?F?Bv_+0U_02lwa=yhbtw}ZtApKZ=*lwEnFd>D4bWoilf94G zB-Ur>SazYTTl-HaPJ;qtAo#yUSGf>DHAMqKP*)xh27%xON^H%#8?X>Pivj9fZ+hSs zo@zuPHF)(N=(TRT9}6!L0UfC$$p#*yhcy^jNcTljhEt;-0Jil&i33|arv99S51da2 z8$V}YL7x?&T8|JPYwrX4-26ZKn7%}aRA9jaETl`pZGItd3jyCD@T<6m|F32e|I>PZ z+*XyL%m}v8z2JG+)_PCdf>=c|bCVI+f**u;(6cDRl;b$kVs^pz8gB=IKL^Y(+9F1L zgcPC@CKg##d54|TFFdp9JT|2sgsDZ%J7H*c6Z|D z$LU_=B*zFiZBo|H{CN<~ORKG4ZY1ZGc|| z@V8zDdH*Eg#~4F`Xv~p+7$SFrFX32Z;A@AmXlq%4f0B5COp;b;3qYa}-#|(R=!nS* z-t-ZGSR_$;LkNHhso`-J7FGBqH6s`7z{|pj-l))%A6efHci>pqDTdh*1WkC2oskDF z^23&)0Sln@79i2yV`15WrmAR&UU(@;i~Haxx7E8{@E8k=Jz7PP00Hl#KU)_FxfqF` z2?q-ue2*1agdA&2Sb->C43xpeA`BObF|xq>5+FwOY-ytgDZRPN0aSGmC()xw&)Gl{ zBB!Ja!lI9gfk&G`c5S^MQ7Q3P-cHzv9eZAYJJK_s3~iDB;pPV2v+2R3Z#aTEMkc}XfMWGDa%*6W?3$TR{FBCM6*&$ zl(c%ODU?37tlt03jQ8Hb`2A=(|Fg}RGc#xAo9{#VDgO0qw1vMbi!$qEZB9=9-Wg5? z_q5=BxM`0~ogS%zn!6r$c26m)N_$yYyViD*i-K<#C|TRzimy$MK*x5w&Tsg(}+5q3K?L+*1W~$V=mYJg3$h#4{s^ z$WuY94bnOBeBr6Ikl;=e365fkCj6o0v)=M}>E>_qUfGVvZ7w+3nV`nNmOs%)6E$yv z4^-`b(ni(sCv`qnQ>}!%KW&3U)SLBolgnp`FYs4NRNRq$Fk6WzDcV*`~Yks`Xcdl&-AAtGa-g_ zM2`UIE2vSSu54$G%yDk?Gh%vlO)XXvI4>M(hF^w&b%OVh!4^AADvmW z3d66ZL)#j8C37=rxx72+ex&_6R%6lzav{^e>A9s?E~jD$4N=ot4ukDBiCsl=`9)A9f8ZrnbLko1%?se33q)ecx7;UsTF z13|0aw=}}UCLPu3Ysbo`jS1~K&vk`+cd+28fh=Q1VcIi1XRd@nN8nM?k!=wdqqQ55 z*&kc9hq1z9xqKMA18V%j0`chDG?dG4CZ_GD*=iFO#lY`%j_g9LtC4-%N0zC+;lQ20 zx8P!7;maEZ{Ql&xuAHI&Wv!7~0?S+{ml*qpq2&chJ<$Vy1N^i9>N>O3o^qhRMEI&J zLMpKraMuV~fJR0D`r(>@xTxPRayaqs{jkozekUf;xw!D9o>EUHu2~3QB;t3xyp=mF2E2_7osdy7^ThR zy>>AQR=obQc;U&a{SaGfH4ot683z2RMLRo3j9+z0Is3Q8wcebS<)oDFMJuZxXr;dc zv+spiBQ$MWSse}gna&p6lkM-N<6CUr^#NwUpSTHlca&yi%gwlF?#+;?O++J2s;GF|(>@CfA^XdSt*@vz^a)+fwY998LwY{`_ z&OWOb*uM<1VL#VP^XJeX1ic$ZkTq%D*bjyBc($ZB@B}=~R`EV=nmaFvets`K*~lt- zqt5s!R^`IqqeET9V}36>aq=n5l4;m7r6`#&I!Oq9)<+BC4z=`w!3|@G8q9WQxVC4p zePt)Fd^7RVFX-e#F!+x|2*&yQ20l(lYO;OoM~YDB>}`V z6-?^!<2IHQtED>3$l&i*J2+&r)rlJJ=ETa(r+1eeQaLqUngqI5~B8~UFzz}oSWs7or2V!m3z>;p_p9M6u7rSD5=L5nq5qC z^W)JxP~JFaEcj_{RVQNqYQeu@s2eVrRJ$6in{RUh%%88}=2>Zi)`hDwjPtvG3ud3i zs+y!E!nQR+mFpnQVBH}v3-{eV2qi!o&KeUHeghNy=bW`Lp0f>&Yrmq|?qhhVs{Vl0 zBx)nM{pbHRu-*>#>F$C0OsBa{=&QekbAsRNTs^J3;+!NjCHqx@qp4v$1wJQg!5e}) z@u*8@wu|l@P`a1g9QDhOa3c;gs(NJLwq5YgAE5bi)-g%1xTV3Fvsj+h$0ZYY3D)lh z$VtF{APj1I1=V}6t2;lI;aVPT^pAZT&FX~YQa8_+@f?Wq`C2_X=fFTYN8F8>wtBt0(q6-SI}u)RMNth}Gg2gzx&ZVjtK}U6U^h{k_@W(Q$bBj*1Bn|oljLm=^~ zz*u#P7Ql*!V5y;1V`zd6Q{VjYy%V>QEbm~F$WZcXSCe2paS5|*yqgTz zOGBY0qM4xn!hms@RJAs_(&;c#^eRrD`9xvEVU0#hraB!teZ}*O%GF6m1G`FyFL1eoKh9+;VlcmPrR5 zgVobkDBAkKXw+~(@87ma1+Zho#!e(TH>;#;Cd~cj{%M%D zR%V7!2!zx%XLlbPp_#FoiAUi47}$TTpAEz+v7%6IMlaPkq{p$zSz2dh!$u`m^Zw{9 z!(rnlt|LS#QC}w{SWTSXhc%8xJ4xAvv9L2>09VFZa#38S4bXQLH=+rjI1c#IWDD-W zQ-fD?&y6{Mf|+tLLdFjhc=cSYz&FNe;%3Cx5g+_-7hL!ozcGp{1DR>Omc*a1o~Wx_ zc?5B3LUA0aFpXvl$7^E4eRw>aC>kM*G!@~En1T^{+41CLKsxaKBL%)|B=U1ox@_M} zg0_wl(B^b)C~x%@qP{*>P&bX$>sfe)6zG=$sCJxy5D+)EahzT!&QdAB?h~4Bu7<-5 zgD6aKczuQt8j%Bin=|k*`}}>S*GTEYOo97P&^-AuSo8MV^{+Aer%|6~w9{und7HhSQ(N9ja)wzlQyzRR?TdZU9>LyM;hN&R#@pJ)U>@6dxc zCSJ<}|Cf^Ve8zme!B=|As7xzVj?83}qLxG;#6o z9#MZ-AgBr1*qKstD3;soLE6W+I6;5V}Ipn%fk*Dvd)lw(yZgd2}3 zEp)CFtQd!#S@tBY2e(o^30mx{1mrhGb799PX(2qKXKrLpzk%8P7}Tk?$s%UV(Neg4 zb`IpfT`uISbFi?JZ*LLx&?-SiUK-euRT%yJ%?!eQbAbn}mUyl_)SOOK-5MKTT-V^n z3e{CyYXjkqF9;k%B%D+ICWGqsFF{4)jMhZrcnRUZF@YnF8mm}r5CeBex16uP0=+NGLe@kFWf<_}7bX2-fnS_0G!N zOeMwbk>kgtqcq&(*Y^2bvyB+L_=et_#W|sfr9|qvHG4kYFYAj5U9BlMylu6`*1xUy zP+&kpR@<0{}*xt_oEBzhsS!G_8B6h>llgJj}9 z?b}(TTW7Mft1oF=Sg-h4mF&RA58)rbvandR_9?kpb&jO+NIA) zJccX9te`%^9L-wu@PLG}w%=3mvFagapRaXhJX4B5;ZQX}&$k!Q{lV(OYT6^6ENk9X zV%qM)7S6^z=|4p-tMOAnecd2Lkx$~O?{cEPXcW}<@AG~~)EziDv3T%?yP*>c*ej3y z$8XKwzX2KX5q{N#E$>2RJ=u(@xJyI*d--P1cW5iN4xx!qa%qaE(2rboXN8_m)APa zjbN?AKvQqPF00Mgmeg@L7h%aEG1%AnR;?vib>DR1{8Z{S0ikDEsP3OaC~6Oe{46 zx7{qa42?4Znd602SiHfT4gXo5^yd@wXM*Vbx|woqIZV{I1_%Lkjx*amz~E-R1m`mg z`0-?cV^()&>#yK_Epnrfpt@lKLWDe7+IV@a*GSN=6ak^Sabnw23?0Q~M-nv^0KYa) z;OJZ@HlaWZJB z=Bg{FUPhLj!f#ibY_YTZf}MO?i{Wv6?`qC*BjR`(si_W!!v#Vqx(v1UY`J2sEgWmk zhZDOnX@@IHqh?dwV@2xCMpIhn3I*3^A-GOU`WwR${f!o{Jlj2NBJ*` zpO5f7&&b|i@C@wrT_Ke0 zd`1iAqAUC7cw)4<*Z*$)UCBb;r#|WvW8+= zPNwV$d_Ek(9g1~Z?Z`UTTC64TLf*SJdCf-Fl8!>Y+j^mjFH8CJ{B+vDHqVna;K_OLW$Eke`aGQ0&=B*Qk7aG}n+9gyWx)8JFK3McB3JF?lF>_`bH| zvmj?4Gq97p+6S;9&&us?K9QH6lH41fmA!M2$Rkf1*zczexH687zU9cf_ySv4hV8(F z1sMHk4dX}NA98BY1EtrNy_Yxc$KhoNM!1@h+C|cXS87T%m)cTnVkk26?hdy1M?>RL zbgAc);mlmBWpjh8OVM3N?pnmfb(Nm6Lj!jrHn;GrUTM1dr-fC=MwDTfOr}1#vbtjy zI$#BvQ)1eVRg`JNxv3Lnh{LD$MrJC*qN6X@f_Z;r?2HaPkDM<=?Vv7QKR8I<-R+Dn zxX31Bw5l9>e4MR%jO={5Jg*_!@Pq&0afr>&T`y*+klkvozzvp1SZak9#XT#-|2zB< z!`4^ex(;Qb?U#K6ZIocE+Lv7=G0JS;g;0~rVi#%=yd}+^%eVXi>kHAEAVq3zfssB8 z;>9-MgTFk_{mX7X`W4b|)U>v*w_n1?KH_H^adVG87eaRQm9S%A;gwn}kM^aX9QW1IOa48?4= values.size()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.TOKENS_VALUES_SIZE_MISMATCH.getLog(), InterfaceName.INSERT.getName() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensValuesSizeMismatch.getMessage()); - } + // Only the token maps that pair with a record are validated, as in the Node, Go and Python SDKs. + // Fewer token maps than records is allowed for ENABLE: the server validates record by record, and + // continueOnError inserts the records that have tokens. ENABLE_STRICT already requires equal + // counts in validateInsertRequest. Bounding the loop by both lists is what prevents the + // IndexOutOfBoundsException that 2.1.1 threw when tokens outnumbered values. + int pairedEntries = Math.min(tokens.size(), values.size()); + for (int index = 0; index < pairedEntries; index++) { HashMap tokensMap = tokens.get(index); HashMap valuesMap = values.get(index); if (tokensMap == null || valuesMap == null) { diff --git a/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java b/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java index baa2d90d..d4773151 100644 --- a/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/data/InsertTests.java @@ -442,7 +442,9 @@ public void testFewerTokensThanValuesIsAllowedWithTokenModeEnableInInsertRequest } @Test - public void testMoreTokensThanValuesIsRejectedWithTokenModeEnableInInsertRequestValidations() { + public void testMoreTokensThanValuesDoesNotThrowWithTokenModeEnableInInsertRequestValidations() { + // 2.1.1 threw IndexOutOfBoundsException here; only paired entries are validated now and the + // server decides about the surplus, as in the Node and Python SDKs. values.add(valueMap); tokens.add(tokenMap); tokens.add(tokenMap); @@ -451,13 +453,8 @@ public void testMoreTokensThanValuesIsRejectedWithTokenModeEnableInInsertRequest .build(); try { Validations.validateInsertRequest(request); - Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.TokensValuesSizeMismatch.getMessage(), Constants.SDK_PREFIX), - e.getMessage() - ); + Assert.fail(INVALID_EXCEPTION_THROWN); } } From 7245658c06d199afb92eb2201b1d79dcf6695b46 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 26 Oct 2026 11:55:49 +0000 Subject: [PATCH 26/41] [AUTOMATED] Private Release 1.2.0-dev-68d5268c --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index f9db081c..d9dd86f1 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.14ede71e + 1.2.0-dev.68d5268c jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 3ccd5af42fc34181479f7d4d56c28b33a8cc0662 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 09:46:46 +0530 Subject: [PATCH 27/41] SK-3175 update README and samples --- README.md | 1 + docs/api_reference.md | 48 +++++++--- flowvault/README.md | 81 ++++++++++++++-- .../detect/DeidentifyFileAsyncSample.java | 94 +++++++++++++++++++ .../example/detect/DeidentifyFileSample.java | 29 ++++-- .../java/com/example/detect/GetRunSample.java | 24 ++++- .../example/detect/ReidentifyFileSample.java | 22 ++++- skyvault/README.md | 78 +++++++++++++-- .../detect/DeidentifyFileAsyncSample.java | 94 +++++++++++++++++++ .../example/detect/DeidentifyFileSample.java | 36 +++---- .../example/detect/ReidentifyFileSample.java | 6 +- 11 files changed, 454 insertions(+), 59 deletions(-) create mode 100644 flowvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java create mode 100644 skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java diff --git a/README.md b/README.md index a5bce548..b50ef808 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ The root `pom.xml` (`packaging=pom`) aggregates this Maven reactor: ## Documentation - [skyvault API Reference](docs/api_reference.md) — full list of request builder methods, response getters, enums, and service-account utilities +- [Detect API Reference](docs/api_reference.md#detect-api) — request, response, configuration and enum classes for Detect, shared by both SDKs - [Migrate from v1 to v2](docs/migrate_to_v2.md) ## Reporting a Vulnerability diff --git a/docs/api_reference.md b/docs/api_reference.md index 5908751c..8791fbee 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -1,11 +1,16 @@ # API Reference -A reference for the public Skyflow Java SDK surface: client-management methods, config classes, request and response objects, helper classes, enums, and service-account utilities. For task-oriented usage and examples, see the [README](../README.md). +A reference for the public Skyflow Java SDK surface: client-management methods, config classes, request and response objects, helper classes, enums, and service-account utilities. + +The vault, connection and file-upload classes belong to the skyvault SDK (`com.skyflow:skyflow-java`). The Detect classes in `com.skyflow.detect`, together with the credentials, config and service-account classes, live in the shared `common` module and apply to both the skyvault and the flowvault SDK (`com.skyflow:skyflow-flowvault-java`). Where a Detect field is specific to one vault type the table says so. The flowvault vault-operation classes (bulk insert, tokenize, detokenize and delete) are documented in the [flowvault README](../flowvault/README.md). + +For task-oriented usage and examples, see the [skyvault README](../skyvault/README.md) and the [flowvault README](../flowvault/README.md). All attributes, parameters, and enum values below are taken directly from the SDK source. ## Table of Contents +- [Detect API](#detect-api) - [Client management methods](#client-management-methods) - [Config classes](#config-classes) - [Request objects](#request-objects) @@ -16,6 +21,23 @@ All attributes, parameters, and enum values below are taken directly from the SD --- +## Detect API + +Shared by the skyvault and flowvault SDKs. `skyflowClient.detect()` and `skyflowClient.detect(vaultId)` return a `DetectController`; every class below is in `com.skyflow.detect`. Usage and examples: [skyvault README](../skyvault/README.md#detect), [flowvault README](../flowvault/README.md#detect). + +| Method | Request | Response | +|--------|---------|----------| +| `deidentifyString` | [`DeidentifyStringRequest`](#deidentifystringrequest) | [`DeidentifyStringResponse`](#deidentifystringresponse) | +| `deidentifyFile` | [`DeidentifyFileRequest`](#deidentifyfilerequest) | [`DeidentifyFileResponse`](#deidentifyfileresponse) | +| `reidentifyString` | [`ReidentifyStringRequest`](#reidentifystringrequest) | [`ReidentifyStringResponse`](#reidentifystringresponse) | +| `reidentifyFile` | [`ReidentifyFileRequest`](#reidentifyfilerequest) | [`ReidentifyFileResponse`](#reidentifyfileresponse) | +| `getRun` | [`GetRunRequest`](#getrunrequest) | [`GetRunResponse`](#getrunresponse) | +| `checkGuardrails` | [`CheckGuardrailsRequest`](#checkguardrailsrequest) | [`CheckGuardrailsResponse`](#checkguardrailsresponse) | + +Configuration and helper classes: [`DetectConfiguration`](#detectconfiguration), [`Detect`](#detect), [`Entity`](#entity), [`Transformation` and `ShiftDates`](#transformation-and-shiftdates), [`CustomType`](#customtype), [`ObjectEntity`](#objectentity), [`FileMapping`](#filemapping), [`Media`](#media) (with `Audio`, `Bleep`, `Document`, `Pdf`, `Image`), [`PollOptions`](#polloptions), [`RedactionLevel`](#redactionlevel), [`DetectedEntity`](#detectedentity), [`EntityLocation`](#entitylocation), [`Metrics`](#metrics), [`FileOutput`](#fileoutput). Enums: [Detect enums](#detect-enums). + +--- + ## Client management methods A built `Skyflow` client exposes methods to mutate its configuration and logging at runtime, in addition to the builder methods used during initialization. @@ -211,8 +233,8 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| | `text(String)` | _(required)_ | Text to de-identify. | -| `configurationId(String)` | `null` | Id of a Detect configuration created in Studio or through the management API. | -| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). Supply this or `configurationId`. | +| `configurationId(String)` | `null` | Id of a Detect configuration created through the management API. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration).| ### `DeidentifyFileRequest` @@ -228,7 +250,7 @@ Parameters listed with their defaults as defined in the builders. | `configurationId(String)` | `null` | Id of a stored Detect configuration. | | `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). | | `pollOptions(PollOptions)` | `null` | Poll the run after submitting. `null` submits only and returns the run id. See [`PollOptions`](#polloptions). | -| `outputDirectory(String)` | working directory | Where outputs are written on success. Requires `pollOptions` and a local file. | +| `outputDirectory(String)` | working directory | Where outputs are written on success. Requires `pollOptions` and a local file; setting it without `pollOptions` fails client-side validation. | ### `ReidentifyStringRequest` @@ -247,8 +269,8 @@ Parameters listed with their defaults as defined in the builders. |----------------|---------|-------------| | `dataSource(DataSourceType)` | _(required)_ | `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. | | `value(String)` | _(required)_ | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | -| `dataFormat(FileDataFormat)` | `null` | File format. | -| `redactionLevel(List)` | `null` | Per-entity redaction rules. See [`RedactionLevel`](#redactionlevel). | +| `dataFormat(FileDataFormat)` | `null` | File format. Limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` or `PPTX`. | +| `redactionLevel(List)` | `null` | Redaction rules. See [`RedactionLevel`](#redactionlevel). | ### `GetRunRequest` @@ -265,7 +287,7 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| | `text(String)` | _(required)_ | Text to screen. | -| `checkToxicity(Boolean)` | `true` on the server | Whether to check for toxicity. | +| `checkToxicity(Boolean)` | `null` | Whether to check for toxicity. Sent only when set. | | `denyTopics(List)` | `null` | Topics to deny. | ### `InvokeConnectionRequest` @@ -501,7 +523,7 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. |----------------|---------|-------------| | `entityType(EntityType)` | `ALL` | Entity type. See [`EntityType`](#entitytype). | | `deidentificationType(DeidentificationType)` | `ENTITY_UNIQUE_COUNTER` | How the value is replaced. See [`DeidentificationType`](#deidentificationtype). | -| `destination(String)` | `null` | For `VAULT_TOKEN`: the `table.column` that stores the value. | +| `destination(String)` | `null` | For `VAULT_TOKEN`: where the value is stored. A `table.column` on skyvault vaults, a token group name on flowvault vaults. Must already exist. | | `transformation(Transformation)` | `null` | Date shifting. See [`Transformation`](#transformation). | ### `Transformation` and `ShiftDates` @@ -555,14 +577,14 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. ### `RedactionLevel` -`com.skyflow.detect` — element of `ReidentifyStringRequest.redactionLevel()`. For skyvault vaults name an entity and a redaction type. +`com.skyflow.detect` — element of `redactionLevel()` on `ReidentifyStringRequest` and `ReidentifyFileRequest`. Each rule names one source and one replacement: `entityName` plus `redactionType` on skyvault vaults, `tokenGroupName` plus `redactionPattern` on flowvault vaults. Every field is optional on the API; the server rejects invalid combinations. | Builder method | Description | |----------------|-------------| -| `entityName(EntityType)` | Entity the rule applies to. | -| `redactionType(RedactionType)` | `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`. See [`RedactionType`](#redactiontype). | -| `tokenGroupName(String)` | Flowvault vaults only. | -| `redactionPattern(String)` | Flowvault vaults only. | +| `entityName(EntityType)` | Skyvault vaults: entity type the rule applies to. | +| `redactionType(RedactionType)` | Skyvault vaults: `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`. See [`RedactionType`](#redactiontype). | +| `tokenGroupName(String)` | Flowvault vaults: token group the rule applies to. | +| `redactionPattern(String)` | Flowvault vaults: name of a redaction pattern configured in the vault. | ### `DetectedEntity` diff --git a/flowvault/README.md b/flowvault/README.md index 378de9a0..d2e50c28 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1646,9 +1646,16 @@ Detect configurations are created in Studio or through the management API. The S > Detect V2 is in beta. +## Before you start + +- **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. +- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). +- **Destination for vault tokens.** An entity de-identified with `VAULT_TOKEN` stores its value in the token group named by `destination`. That token group must already exist in the vault; Detect writes into it but does not create it. +- **API reference.** Every Detect request, response and configuration class is listed in the [API reference](../docs/api_reference.md#detect-api). + ## Deidentify string -`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) and/or `configuration` (an inline `DetectConfiguration`). Both are optional on the API and are sent exactly as supplied. The SDK fills the vault id from the controller. +`DeidentifyStringRequest` takes the text plus exactly one of `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both fields are sent exactly as supplied and the server rejects a request that has neither or both (see [Before you start](#before-you-start)). For an inline configuration the SDK fills the vault id from the controller. ```java import com.skyflow.detect.*; @@ -1696,6 +1703,60 @@ System.out.println(response.getMetrics().getWordCount()); `DeidentifyStringResponse` carries `getProcessedText()`, `getEntities()` (a `List` with token, entity type, location and confidence scores; never `null`) and `getMetrics()`. +## Detect configuration + +`DetectConfiguration` is the inline form of a stored configuration and accepts the same options. `detect` applies to string and file inputs; `fileMapping` and `media` apply to file inputs only. + +| Class | Builder methods | Notes | +|-------|-----------------|-------| +| `Detect` | `entities`, `objectEntities`, `restrict`, `skip`, `customTypes`, `returnEntities` | `restrict` and `skip` are regexes that are always, respectively never, treated as sensitive. `returnEntities` is `EXCLUDE_SENSITIVE_DATA` (server default), `ALL` or `NONE`. | +| `Entity` | `entityType`, `deidentificationType`, `destination`, `transformation` | `entityType` defaults to `ALL`. `deidentificationType` is `ENTITY_UNIQUE_COUNTER` (server default), `ENTITY_ONLY`, `MASK` or `VAULT_TOKEN`. `destination` is used only with `VAULT_TOKEN`. | +| `Transformation` / `ShiftDates` | `shiftDates(ShiftDates)`; `minDays`, `maxDays` | Shifts detected dates by a random number of days within the range. | +| `CustomType` | `label`, `match` | A regex-defined entity type. `label` is reported as the entity type of its matches. | +| `ObjectEntity` | `entityType`, `deidentificationType` | Visual objects in images: `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE` or `ALL`, handled with `REDACT` or `UNREDACT`. File inputs only. | +| `FileMapping` | `source`, `destination`, `outputFileNameSuffix`, `entitiesDestination`, `objectEntitiesDestination` | Where the processed file and the entity files are written. File inputs only. | +| `Media` | `audio(Audio)`, `document(Document)`, `image(Image)` | Media-type options. File inputs only. | +| `Audio` / `Bleep` | `outputProcessedAudio`, `outputTranscription`, `bleep`; `startPadding`, `stopPadding`, `frequency`, `gain` | `outputTranscription` is `NONE`, `TRANSCRIPTION`, `MEDICAL_TRANSCRIPTION`, `DIARIZED_TRANSCRIPTION` or `MEDICAL_DIARIZED_TRANSCRIPTION`. `Bleep` is the tone laid over detected speech; paddings are in seconds, frequency in Hz. | +| `Document` / `Pdf` | `pdf(Pdf)`; `processingMode`, `density`, `maxResolution` | `processingMode` is `NONE`, `OCR` or `TEXT_LAYER`. `density` is the rendering DPI. | +| `Image` | `outputProcessedImage`, `outputOcrText`, `maskingMethod` | `maskingMethod` is `NONE`, `BLUR` or `BLACKBOX`. | + +```java +DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.DOB) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .transformation(Transformation.builder() + .shiftDates(ShiftDates.builder().minDays(10).maxDays(30).build()) + .build()) + .build(), + Entity.builder().entityType(EntityType.ALL).build())) + .objectEntities(Collections.singletonList( + ObjectEntity.builder() + .entityType(ObjectEntityType.FACE) + .deidentificationType(ObjectDeidentificationType.REDACT) + .build())) + .customTypes(Collections.singletonList( + CustomType.builder() + .label("EMPLOYEE_ID") + .match(Collections.singletonList("EMP-[0-9]{6}")) + .build())) + .restrict(Collections.singletonList("[0-9]{3}-[0-9]{2}-[0-9]{4}")) + .build()) + .media(Media.builder() + .image(Image.builder().maskingMethod(MaskingMethod.BLUR).outputOcrText(true).build()) + .document(Document.builder() + .pdf(Pdf.builder().processingMode(PdfProcessingMode.OCR).build()) + .build()) + .audio(Audio.builder() + .outputTranscription(OutputTranscriptionType.TRANSCRIPTION) + .bleep(Bleep.builder().startPadding(0.5f).stopPadding(0.5f).build()) + .build()) + .build()) + .build(); +``` + ## Deidentify file File de-identification is asynchronous on the API: the submit call returns a run id and the result is retrieved from the run. `deidentifyFile` exposes both modes. @@ -1703,7 +1764,11 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`, and exactly one of `configurationId` or an inline `configuration`; the server rejects neither-or-both (see [Before you start](#before-you-start)). + +`dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. + +`outputDirectory` is meaningful only when polling. Setting it without `pollOptions` fails client-side validation with a `SkyflowException` before any request is sent. ```java // Submit only @@ -1744,7 +1809,7 @@ Outputs are written only when polling reached `SUCCESS`, the request was built f With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. -**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. [DeidentifyFileAsyncSample.java](samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java) runs several files this way on a bounded pool. ```java ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ @@ -1805,6 +1870,8 @@ Either way the main thread only pays for the submit round trip. Avoid `new Threa ## Reidentify string +Re-identification looks tokens up in the vault, so it applies to values that were de-identified with `VAULT_TOKEN`. Placeholders produced by `ENTITY_UNIQUE_COUNTER`, `ENTITY_ONLY` or `MASK` are not stored anywhere and cannot be re-identified. + `ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For flowvault vaults each rule targets a `tokenGroupName` and applies a named `redactionPattern`. Without rules every token is replaced by its original value. ```java @@ -1822,11 +1889,11 @@ System.out.println(response.getProcessedText()); // My name is J**n D*e. ``` -A `RedactionLevel` is expected to name one source (`tokenGroupName` or `entityName`) and one replacement (`redactionPattern` or `redactionType`). Every field is optional on the API, so the SDK passes the list through as given and the server enforces the combination rules, including which fields apply to flowvault vaults. +A `RedactionLevel` names one source and one replacement. On flowvault vaults the source is a `tokenGroupName` and the replacement a `redactionPattern` configured in the vault. The `entityName` and `redactionType` fields are the skyvault equivalents and do not apply to flowvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. ## Reidentify file -`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. ```java byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); @@ -1879,7 +1946,7 @@ switch (run.getStatus()) { ## Check guardrails -`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. Each check runs only when requested: `getToxic()` is `null` unless `checkToxicity(true)` was set, and `getDeniedTopic()` is `null` unless `denyTopics` was supplied. `getValidation()` is `FAILED` if any requested check triggered. +`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. `checkToxicity` and `denyTopics` are optional: the SDK sends each one only when you set it and does not fill in a default. The response is passed through as returned, so `getToxic()`, `getDeniedTopic()` and `getValidation()` carry exactly what the API sent back. ```java CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( @@ -1896,7 +1963,7 @@ if (response.getValidation() == GuardrailsValidation.FAILED) { All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [DeidentifyFileAsyncSample.java](samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Custom Request Headers diff --git a/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java new file mode 100644 index 00000000..4d223b12 --- /dev/null +++ b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java @@ -0,0 +1,94 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.PollOptions; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * De-identifies several local files concurrently with polling enabled. Each task calls + * deidentifyFile with pollOptions, so the SDK polls the run with exponential backoff and writes + * the outputs to outputDirectory on success. The blocking poll runs on a pool thread, not on the + * caller's thread, and the pool is bounded because every in-flight run parks one thread. + */ +public class DeidentifyFileAsyncSample { + public static void main(String[] args) throws SkyflowException, InterruptedException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + List files = Arrays.asList("", ""); // Replace with the files to de-identify + + // One thread per concurrent run; size this to how many runs you want in flight at once. + ExecutorService pool = Executors.newFixedThreadPool(2); + List> futures = new ArrayList<>(); + try { + for (String file : files) { + // submit() rather than execute(): the Future carries the response or the SkyflowException, + // and future.cancel(true) interrupts the poll, which returns the last run the SDK saw. + futures.add(pool.submit(() -> skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath(file) // BASE64 and the format are derived from the file + .configurationId("") // Replace with a Detect configuration id + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("") // optional; defaults to the working directory + .build()))); + } + + // The main thread is free until here; block on each result only when it is needed. + for (int i = 0; i < futures.size(); i++) { + String file = files.get(i); + try { + DeidentifyFileResponse response = futures.get(i).get(); + System.out.println(file + ": run " + response.getRunId() + " " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + // Outputs are already on disk as processed-. and processed-entities-.json + System.out.println(" outputs: " + response.getOutput().size() + ", metrics: " + response.getMetrics()); + } else if (response.getStatus() == DetectRunStatus.FAILED) { + System.err.println(" run failed: " + response.getMessage()); + } else { + // IN_PROGRESS or QUEUED: the budget ran out; resume with getRun(runId) + System.out.println(" still running; poll later with getRun(" + response.getRunId() + ")"); + } + } catch (ExecutionException e) { + // The task threw: unwrap the SkyflowException raised inside deidentifyFile. + Throwable cause = e.getCause(); + if (cause instanceof SkyflowException) { + System.err.println(file + ": error during deidentifyFile: " + cause.getMessage()); + } else { + System.err.println(file + ": unexpected error"); + cause.printStackTrace(); + } + } + } + } finally { + pool.shutdown(); + pool.awaitTermination(1, TimeUnit.MINUTES); + } + } +} diff --git a/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java index c373f181..3f479e3e 100644 --- a/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java +++ b/flowvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -12,11 +12,17 @@ import com.skyflow.errors.SkyflowException; /** - * De-identifies a local file with the Detect V2 API. The first call submits the run and returns its - * id; the second submits and polls, and writes the outputs next to the input on success. + * De-identifies a local file with the Detect V2 API. With {@code waitForResult} false the sample + * submits the run and returns its id; with it true the sample submits, polls, and on success the + * SDK writes the outputs into {@code outputDirectory} (the working directory when unset). Only one + * path runs, so each execution creates a single run. */ public class DeidentifyFileSample { public static void main(String[] args) throws SkyflowException { + // false: submit only and retrieve the result later with GetRunSample. + // true: submit and poll until the run is terminal or the budget runs out. + boolean waitForResult = true; + Credentials credentials = new Credentials(); credentials.setPath(""); // Replace with the path to the credentials file @@ -32,16 +38,19 @@ public static void main(String[] args) throws SkyflowException { .build(); try { - // Submit only: the API's own behaviour. Keep the run id and retrieve the result with getRun. - DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( - DeidentifyFileRequest.builder() - .filePath("") // BASE64 and the format are derived from the file - .configurationId("") // Replace with a Detect configuration id - .build()); - System.out.println("Submitted run " + submitted.getRunId()); + if (!waitForResult) { + // Submit only: the API's own behaviour. Keep the run id and retrieve the result with getRun. + DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") // BASE64 and the format are derived from the file + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Submitted run " + submitted.getRunId() + "; retrieve it with getRun"); + return; + } // Submit and poll: waits up to 90 seconds with exponential backoff, then writes - // processed-. and processed-.json into the output directory. + // processed-. and processed-entities-.json into the output directory. DeidentifyFileResponse polled = skyflowClient.detect().deidentifyFile( DeidentifyFileRequest.builder() .filePath("") diff --git a/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java index cc3e7667..9d704f25 100644 --- a/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java +++ b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -3,6 +3,7 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DataSourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.GetRunRequest; @@ -16,7 +17,9 @@ import java.util.Base64; /** - * Retrieves a Detect file run by id and, once it has succeeded, writes the base64 outputs to disk. + * Retrieves a Detect file run by id and, once it has succeeded, writes its base64 outputs to disk. + * Submit-and-poll (see DeidentifyFileSample) lets the SDK write the files; this sample shows the + * same work for a run that was submitted without polling. */ public class GetRunSample { public static void main(String[] args) throws Exception { @@ -43,8 +46,13 @@ public static void main(String[] args) throws Exception { System.out.println("Run " + run.getRunId() + " status: " + run.getStatus()); if (run.getStatus() == DetectRunStatus.SUCCESS) { for (FileOutput output : run.getOutput()) { + if (run.getOutputType() != DataSourceType.BASE64) { + // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. + System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); + continue; + } String name = "processed-" + run.getRunId() + "-" + output.getProcessedFileType() - + "." + output.getProcessedFileExtension().name().toLowerCase(); + + "." + extensionOf(output); Files.write(new File(name).toPath(), Base64.getDecoder().decode(output.getProcessedFile())); System.out.println("Wrote " + name); } @@ -59,4 +67,16 @@ public static void main(String[] args) throws Exception { e.printStackTrace(); } } + + /** + * The extension can be absent on an output. Mirror the SDK's own writer: entity outputs fall + * back to json, anything else to bin. + */ + private static String extensionOf(FileOutput output) { + if (output.getProcessedFileExtension() != null) { + return output.getProcessedFileExtension().name().toLowerCase(); + } + String type = output.getProcessedFileType(); + return type != null && type.toUpperCase().contains("ENTITIES") ? "json" : "bin"; + } } diff --git a/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java index 587d58eb..3e0cd0d8 100644 --- a/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java +++ b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -58,11 +58,25 @@ public static void main(String[] args) throws Exception { System.out.println("Status: " + response.getStatus()); if (response.getStatus() == DetectRunStatus.SUCCESS) { + int index = 0; for (FileOutput output : response.getOutput()) { - String name = "reidentified-" + input.getName(); - Files.write(new File(input.getParentFile(), name).toPath(), - Base64.getDecoder().decode(output.getProcessedFile())); - System.out.println("Wrote " + name + " (" + output.getProcessedFileType() + ")"); + index++; + if (response.getOutputType() != DataSourceType.BASE64) { + // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. + System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); + continue; + } + // One file per output: the output type keeps the names apart, the index guards against + // two outputs of the same type (the SDK's own writer follows the same pattern). + String type = output.getProcessedFileType() == null ? String.valueOf(index) : output.getProcessedFileType(); + String name = "reidentified-" + type + "-" + input.getName(); + File target = new File(input.getParentFile(), name); + if (target.exists()) { + name = "reidentified-" + type + "-" + index + "-" + input.getName(); + target = new File(input.getParentFile(), name); + } + Files.write(target.toPath(), Base64.getDecoder().decode(output.getProcessedFile())); + System.out.println("Wrote " + name); } System.out.println("Metrics: " + response.getMetrics()); } diff --git a/skyvault/README.md b/skyvault/README.md index b5302dd5..25eb5041 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1680,9 +1680,15 @@ Detect configurations are created in Studio or through the management API. The S > Detect V2 is in beta. +## Before you start +- **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination table and columns, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. +- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). +- **Destination for vault tokens.** An entity de-identified with `VAULT_TOKEN` stores its value in the `table.column` named by `destination`. That table and column must already exist in the vault; Detect writes into them but does not create them. +- **API reference.** Every Detect request, response and configuration class is listed in the [API reference](../docs/api_reference.md#detect-api). + ## Deidentify string -`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) and/or `configuration` (an inline `DetectConfiguration`). Both are optional on the API and are sent exactly as supplied. The SDK fills the vault id from the controller. +`DeidentifyStringRequest` takes the text plus exactly one of `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both fields are sent exactly as supplied. For an inline configuration the SDK fills the vault id from the controller. ```java import com.skyflow.detect.*; @@ -1730,6 +1736,60 @@ System.out.println(response.getMetrics().getWordCount()); `DeidentifyStringResponse` carries `getProcessedText()`, `getEntities()` (a `List` with token, entity type, location and confidence scores; never `null`) and `getMetrics()`. +## Detect configuration + +`DetectConfiguration` is the inline form of a stored configuration and accepts the same options. `detect` applies to string and file inputs; `fileMapping` and `media` apply to file inputs only. + +| Class | Builder methods | Notes | +|-------|-----------------|-------| +| `Detect` | `entities`, `objectEntities`, `restrict`, `skip`, `customTypes`, `returnEntities` | `restrict` and `skip` are regexes that are always, respectively never, treated as sensitive. `returnEntities` is `EXCLUDE_SENSITIVE_DATA` (server default), `ALL` or `NONE`. | +| `Entity` | `entityType`, `deidentificationType`, `destination`, `transformation` | `entityType` defaults to `ALL`. `deidentificationType` is `ENTITY_UNIQUE_COUNTER` (server default), `ENTITY_ONLY`, `MASK` or `VAULT_TOKEN`. `destination` is used only with `VAULT_TOKEN`. | +| `Transformation` / `ShiftDates` | `shiftDates(ShiftDates)`; `minDays`, `maxDays` | Shifts detected dates by a random number of days within the range. | +| `CustomType` | `label`, `match` | A regex-defined entity type. `label` is reported as the entity type of its matches. | +| `ObjectEntity` | `entityType`, `deidentificationType` | Visual objects in images: `FACE`, `LICENSE_PLATE`, `LOGO`, `SIGNATURE` or `ALL`, handled with `REDACT` or `UNREDACT`. File inputs only. | +| `FileMapping` | `source`, `destination`, `outputFileNameSuffix`, `entitiesDestination`, `objectEntitiesDestination` | Where the processed file and the entity files are written. File inputs only. | +| `Media` | `audio(Audio)`, `document(Document)`, `image(Image)` | Media-type options. File inputs only. | +| `Audio` / `Bleep` | `outputProcessedAudio`, `outputTranscription`, `bleep`; `startPadding`, `stopPadding`, `frequency`, `gain` | `outputTranscription` is `NONE`, `TRANSCRIPTION`, `MEDICAL_TRANSCRIPTION`, `DIARIZED_TRANSCRIPTION` or `MEDICAL_DIARIZED_TRANSCRIPTION`. `Bleep` is the tone laid over detected speech; paddings are in seconds, frequency in Hz. | +| `Document` / `Pdf` | `pdf(Pdf)`; `processingMode`, `density`, `maxResolution` | `processingMode` is `NONE`, `OCR` or `TEXT_LAYER`. `density` is the rendering DPI. | +| `Image` | `outputProcessedImage`, `outputOcrText`, `maskingMethod` | `maskingMethod` is `NONE`, `BLUR` or `BLACKBOX`. | + +```java +DetectConfiguration configuration = DetectConfiguration.builder() + .detect(Detect.builder() + .entities(Arrays.asList( + Entity.builder() + .entityType(EntityType.DOB) + .deidentificationType(DeidentificationType.ENTITY_UNIQUE_COUNTER) + .transformation(Transformation.builder() + .shiftDates(ShiftDates.builder().minDays(10).maxDays(30).build()) + .build()) + .build(), + Entity.builder().entityType(EntityType.ALL).build())) + .objectEntities(Collections.singletonList( + ObjectEntity.builder() + .entityType(ObjectEntityType.FACE) + .deidentificationType(ObjectDeidentificationType.REDACT) + .build())) + .customTypes(Collections.singletonList( + CustomType.builder() + .label("EMPLOYEE_ID") + .match(Collections.singletonList("EMP-[0-9]{6}")) + .build())) + .restrict(Collections.singletonList("[0-9]{3}-[0-9]{2}-[0-9]{4}")) + .build()) + .media(Media.builder() + .image(Image.builder().maskingMethod(MaskingMethod.BLUR).outputOcrText(true).build()) + .document(Document.builder() + .pdf(Pdf.builder().processingMode(PdfProcessingMode.OCR).build()) + .build()) + .audio(Audio.builder() + .outputTranscription(OutputTranscriptionType.TRANSCRIPTION) + .bleep(Bleep.builder().startPadding(0.5f).stopPadding(0.5f).build()) + .build()) + .build()) + .build(); +``` + ## Deidentify file File de-identification is asynchronous on the API: the submit call returns a run id and the result is retrieved from the run. `deidentifyFile` exposes both modes. @@ -1739,6 +1799,10 @@ File de-identification is asynchronous on the API: the submit call returns a run The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. +`dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. + +`outputDirectory` is meaningful only when polling. Setting it without `pollOptions` fails client-side validation with a `SkyflowException` before any request is sent. + ```java // Submit only DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( @@ -1778,7 +1842,7 @@ Outputs are written only when polling reached `SUCCESS`, the request was built f With `pollOptions` set, `deidentifyFile` polls on the thread that called it: each lookup is a synchronous `getRun` followed by a sleep, until the run is terminal or the budget runs out. No other thread, lock or connection is held while it waits, so other SDK calls are unaffected, but the calling thread is. If that thread is your main thread, a request thread or an event loop, run the call elsewhere. -**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. +**Run the blocking call on a thread you own.** Simplest when you process a few files at a time. The SDK still enforces the budget and writes outputs to disk; your thread is parked for the whole poll. [DeidentifyFileAsyncSample.java](samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java) runs several files this way on a bounded pool. ```java ExecutorService pool = Executors.newFixedThreadPool(4); // or Executors.newVirtualThreadPerTaskExecutor() on JDK 21+ @@ -1839,6 +1903,8 @@ Either way the main thread only pays for the submit round trip. Avoid `new Threa ## Reidentify string +Re-identification looks tokens up in the vault, so it applies to values that were de-identified with `VAULT_TOKEN`. Placeholders produced by `ENTITY_UNIQUE_COUNTER`, `ENTITY_ONLY` or `MASK` are not stored anywhere and cannot be re-identified. + `ReidentifyStringRequest` takes the tokenized text and an optional list of `RedactionLevel` rules. For skyvault vaults each rule names an `entityName` and the `redactionType` to apply to it: `PLAIN_TEXT` reveals the original value, `MASKED` masks it, `REDACTED` keeps the token, `DEFAULT` applies the vault's default. Without rules every token is replaced by its original value. ```java @@ -1860,11 +1926,11 @@ System.out.println(response.getProcessedText()); // My name is John Doe and my email is j*******@acme.com. ``` -A `RedactionLevel` is expected to name one source (`entityName`) and one replacement (`redactionType`). Every field is optional on the API, so the SDK passes the list through as given and the server enforces the combination rules. The `tokenGroupName` and `redactionPattern` fields apply to flowvault vaults only. +A `RedactionLevel` names one source and one replacement. On skyvault vaults the source is an `entityName` and the replacement a `redactionType`. The `tokenGroupName` and `redactionPattern` fields are the flowvault equivalents and do not apply to skyvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. ## Reidentify file -`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. Re-identification supports text-based formats such as TXT, CSV, JSON, JSONL, XML, DOCX, XLSX and PPTX. +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. ```java byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); @@ -1917,7 +1983,7 @@ switch (run.getStatus()) { ## Check guardrails -`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. Each check runs only when requested: `getToxic()` is `null` unless `checkToxicity(true)` was set, and `getDeniedTopic()` is `null` unless `denyTopics` was supplied. `getValidation()` is `FAILED` if any requested check triggered. +`checkGuardrails` screens text for toxicity and for a list of denied topics, which makes it a natural pre-LLM check. `checkToxicity` and `denyTopics` are optional: the SDK sends each one only when you set it and does not fill in a default. The response is passed through as returned, so `getToxic()`, `getDeniedTopic()` and `getValidation()` carry exactly what the API sent back. ```java CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( @@ -1934,7 +2000,7 @@ if (response.getValidation() == GuardrailsValidation.FAILED) { All Detect methods throw `SkyflowException` as described in [Error Handling](#error-handling). Client-side validation fails before any network call. -See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). +See the samples [DeidentifyStringSample.java](samples/src/main/java/com/example/detect/DeidentifyStringSample.java), [DeidentifyFileSample.java](samples/src/main/java/com/example/detect/DeidentifyFileSample.java), [DeidentifyFileAsyncSample.java](samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java), [ReidentifyStringSample.java](samples/src/main/java/com/example/detect/ReidentifyStringSample.java), [ReidentifyFileSample.java](samples/src/main/java/com/example/detect/ReidentifyFileSample.java), [GetRunSample.java](samples/src/main/java/com/example/detect/GetRunSample.java) and [CheckGuardrailsSample.java](samples/src/main/java/com/example/detect/CheckGuardrailsSample.java). # Connections diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java new file mode 100644 index 00000000..b4b8ca7e --- /dev/null +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java @@ -0,0 +1,94 @@ +package com.example.detect; + +import com.skyflow.Skyflow; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.DeidentifyFileResponse; +import com.skyflow.detect.DetectRunStatus; +import com.skyflow.detect.PollOptions; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; + +/** + * De-identifies several local files concurrently with polling enabled. Each task calls + * deidentifyFile with pollOptions, so the SDK polls the run with exponential backoff and writes + * the outputs to outputDirectory on success. The blocking poll runs on a pool thread, not on the + * caller's thread, and the pool is bounded because every in-flight run parks one thread. + */ +public class DeidentifyFileAsyncSample { + public static void main(String[] args) throws SkyflowException, InterruptedException { + Credentials credentials = new Credentials(); + credentials.setPath(""); // Replace with the path to the credentials file + + VaultConfig vaultConfig = new VaultConfig(); + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + + Skyflow skyflowClient = Skyflow.builder() + .setLogLevel(LogLevel.ERROR) + .addVaultConfig(vaultConfig) + .addSkyflowCredentials(credentials) + .build(); + + List files = Arrays.asList("", ""); // Replace with the files to de-identify + + // One thread per concurrent run; size this to how many runs you want in flight at once. + ExecutorService pool = Executors.newFixedThreadPool(2); + List> futures = new ArrayList<>(); + try { + for (String file : files) { + // submit() rather than execute(): the Future carries the response or the SkyflowException, + // and future.cancel(true) interrupts the poll, which returns the last run the SDK saw. + futures.add(pool.submit(() -> skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath(file) // BASE64 data source, format inferred from the extension + .configurationId("") // Replace with a Detect configuration id + .pollOptions(PollOptions.builder().waitTime(120).build()) // 1..300 s, default 60 + .outputDirectory("") // optional, defaults to the working directory + .build()))); + } + + // The main thread is free until here; block on each result only when it is needed. + for (int i = 0; i < futures.size(); i++) { + String file = files.get(i); + try { + DeidentifyFileResponse response = futures.get(i).get(); + System.out.println(file + ": run " + response.getRunId() + " " + response.getStatus()); + if (response.getStatus() == DetectRunStatus.SUCCESS) { + // Outputs are already on disk as processed-. and processed-entities-.json + System.out.println(" outputs: " + response.getOutput().size() + ", pages: " + response.getMetrics().getPages()); + } else if (response.getStatus() == DetectRunStatus.FAILED) { + System.err.println(" run failed: " + response.getMessage()); + } else { + // IN_PROGRESS or QUEUED: the budget ran out; resume with getRun(runId) + System.out.println(" budget ran out, resume with getRun(" + response.getRunId() + ")"); + } + } catch (ExecutionException e) { + // The task threw: unwrap the SkyflowException raised inside deidentifyFile. + Throwable cause = e.getCause(); + if (cause instanceof SkyflowException) { + System.err.println(file + ": error during deidentifyFile: " + cause.getMessage()); + } else { + System.err.println(file + ": unexpected error"); + cause.printStackTrace(); + } + } + } + } finally { + pool.shutdown(); + pool.awaitTermination(1, TimeUnit.MINUTES); + } + } +} diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java index 4b3c8b8d..04090a1e 100644 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -13,11 +13,17 @@ import com.skyflow.errors.SkyflowException; /** - * De-identifies a local file. The first call submits the run and returns its id; the second - * submits and polls until the run completes, writing the outputs to disk on success. + * De-identifies a local file. With {@code waitForResult} false the sample submits the run and + * returns its id; with it true the sample submits, polls until the run completes, and on success + * the SDK writes the outputs into {@code outputDirectory} (the working directory when unset). Only + * one path runs, so each execution creates a single run. */ public class DeidentifyFileSample { public static void main(String[] args) throws SkyflowException { + // false: submit only and retrieve the result later with GetRunSample. + // true: submit and poll until the run is terminal or the budget runs out. + boolean waitForResult = true; + Credentials credentials = new Credentials(); credentials.setPath(""); // Replace with the path to the credentials file @@ -32,21 +38,19 @@ public static void main(String[] args) throws SkyflowException { .addSkyflowCredentials(credentials) .build(); - // 1. Submit only: returns the run id, retrieve the result later with getRun. try { - DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( - DeidentifyFileRequest.builder() - .filePath("") // BASE64 data source, format inferred from the extension - .configurationId("") // Replace with a Detect configuration id - .build()); - System.out.println("Run id: " + submitted.getRunId()); // getStatus() is null, nothing written to disk - } catch (SkyflowException e) { - System.err.println("Error during deidentifyFile (submit only):"); - e.printStackTrace(); - } + if (!waitForResult) { + // 1. Submit only: returns the run id, retrieve the result later with getRun. + DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( + DeidentifyFileRequest.builder() + .filePath("") // BASE64 data source, format inferred from the extension + .configurationId("") // Replace with a Detect configuration id + .build()); + System.out.println("Run id: " + submitted.getRunId()); // getStatus() is null, nothing written to disk + return; + } - // 2. Submit and poll: blocks the calling thread until the run is terminal or the budget runs out. - try { + // 2. Submit and poll: blocks the calling thread until the run is terminal or the budget runs out. DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( DeidentifyFileRequest.builder() .filePath("") @@ -67,7 +71,7 @@ public static void main(String[] args) throws SkyflowException { System.out.println("Budget ran out, resume with getRun(" + response.getRunId() + ")"); } } catch (SkyflowException e) { - System.err.println("Error during deidentifyFile (submit and poll):"); + System.err.println("Error during deidentifyFile:"); e.printStackTrace(); } } diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java index 443e51dd..1747de95 100644 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -58,7 +58,11 @@ public static void main(String[] args) throws Exception { System.out.println("Status: " + response.getStatus()); if (response.getStatus() == DetectRunStatus.SUCCESS) { for (FileOutput output : response.getOutput()) { - // output.getProcessedFile() is base64 or a presigned URL, per response.getOutputType() + if (response.getOutputType() != DataSourceType.BASE64) { + // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. + System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); + continue; + } byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); System.out.println(output.getProcessedFileType() + ": " + processed.length + " bytes"); } From 69309018cc2a58e761db59d35eb26cbed7ad1189 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 04:17:19 +0000 Subject: [PATCH 28/41] [AUTOMATED] Private Release 1.2.0-dev-3ccd5af4 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index d9dd86f1..80fd08a1 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.68d5268c + 1.2.0-dev.3ccd5af4 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 52ba1c80dca2f0ecb51b3d31defb860b4318e3e8 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 09:51:48 +0530 Subject: [PATCH 29/41] SK-3175 update README --- flowvault/README.md | 2 -- skyvault/README.md | 2 -- 2 files changed, 4 deletions(-) diff --git a/flowvault/README.md b/flowvault/README.md index d2e50c28..894a21c3 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1644,8 +1644,6 @@ Detect configurations are created in Studio or through the management API. The S | `getRun(GetRunRequest)` | `com.skyflow.detect.GetRunRequest` | `com.skyflow.detect.GetRunResponse` | Retrieve the status and outputs of a Detect file run | | `checkGuardrails(CheckGuardrailsRequest)` | `com.skyflow.detect.CheckGuardrailsRequest` | `com.skyflow.detect.CheckGuardrailsResponse` | Screen text for toxicity and denied topics | -> Detect V2 is in beta. - ## Before you start - **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. diff --git a/skyvault/README.md b/skyvault/README.md index 25eb5041..a6715cbf 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1678,8 +1678,6 @@ Detect configurations are created in Studio or through the management API. The S | `getRun(GetRunRequest)` | `com.skyflow.detect.GetRunRequest` | `com.skyflow.detect.GetRunResponse` | Retrieve the status and outputs of a Detect file run | | `checkGuardrails(CheckGuardrailsRequest)` | `com.skyflow.detect.CheckGuardrailsRequest` | `com.skyflow.detect.CheckGuardrailsResponse` | Screen text for toxicity and denied topics | -> Detect V2 is in beta. - ## Before you start - **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination table and columns, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. - **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). From 1d367f78bf944ffcf8af4a7ef353fda8b51fe1f3 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 04:22:17 +0000 Subject: [PATCH 30/41] [AUTOMATED] Private Release 1.2.0-dev-52ba1c80 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 80fd08a1..6ed59489 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.3ccd5af4 + 1.2.0-dev.52ba1c80 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From d4140366ff2c8709d2f2983b51d23f4d28f6007f Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 10:46:39 +0530 Subject: [PATCH 31/41] SK-3175 update autogenerated code --- .../java/com/skyflow/BaseVaultClient.java | 2 +- .../com/skyflow/detect/RedactionLevel.java | 2 + .../com/skyflow/detect/RedactionType.java | 11 - .../detect/internal/DetectRequestMapper.java | 82 +-- .../detect/internal/DetectResponseMapper.java | 20 +- .../detect/internal/ReidentifyFileMapper.java | 12 +- .../java/com/skyflow/enums/RedactionType.java | 21 + .../generated/auth/rest/ApiClient.java | 29 - .../generated/auth/rest/ApiClientBuilder.java | 67 --- .../generated/auth/rest/AsyncApiClient.java | 29 - .../auth/rest/AsyncApiClientBuilder.java | 67 --- .../auth/rest/core/ApiClientApiException.java | 74 --- .../auth/rest/core/ClientOptions.java | 171 ------ .../auth/rest/core/DateTimeDeserializer.java | 56 -- .../auth/rest/core/ObjectMappers.java | 37 -- .../auth/rest/core/QueryStringMapper.java | 139 ----- .../auth/rest/core/RequestOptions.java | 101 ---- .../auth/rest/core/RetryInterceptor.java | 79 --- .../generated/auth/rest/core/Stream.java | 97 ---- .../auth/rest/errors/BadRequestError.java | 34 -- .../auth/rest/errors/HttpStatus.java | 15 - .../auth/rest/errors/UnauthorizedError.java | 34 -- .../AsyncAuthenticationClient.java | 46 -- .../authentication/AuthenticationClient.java | 44 -- .../RawAuthenticationClient.java | 99 ---- .../generated/common/rest/ApiClient.java | 99 ++++ .../common/rest/ApiClientBuilder.java | 286 ++++++++++ .../generated/common/rest/AsyncApiClient.java | 100 ++++ .../common/rest/AsyncApiClientBuilder.java | 286 ++++++++++ .../common/rest/AsyncRawApiClient.java | 110 ++++ .../generated/common/rest/RawApiClient.java | 90 +++ .../rest/core/ApiClientApiException.java | 2 +- .../rest/core/ApiClientException.java | 2 +- .../rest/core/ApiClientHttpResponse.java | 5 +- .../rest/core/ClientOptions.java | 2 +- .../rest/core/ConsoleLogger.java | 2 +- .../rest/core/DateTimeDeserializer.java | 2 +- .../rest/core/DoubleSerializer.java | 2 +- .../rest/core/Environment.java | 6 +- .../rest/core/FileStream.java | 7 +- .../{detect => common}/rest/core/ILogger.java | 2 +- .../rest/core/InputStreamRequestBody.java | 16 +- .../rest/core/LogConfig.java | 2 +- .../rest/core/LogLevel.java | 2 +- .../{detect => common}/rest/core/Logger.java | 2 +- .../rest/core/LoggingInterceptor.java | 2 +- .../rest/core/MediaTypes.java | 2 +- .../{auth => common}/rest/core/Nullable.java | 2 +- .../rest/core/NullableNonemptyFilter.java | 7 +- .../rest/core/ObjectMappers.java | 2 +- .../rest/core/QueryStringMapper.java | 2 +- .../rest/core/RequestOptions.java | 2 +- .../rest/core/ResponseBodyInputStream.java | 5 +- .../rest/core/ResponseBodyReader.java | 5 +- .../ResponseDecompressionInterceptor.java | 2 +- .../rest/core/RetryInterceptor.java | 2 +- .../core/Rfc2822DateTimeDeserializer.java | 25 + .../generated/common/rest/core/SseEvent.java | 114 ++++ .../common/rest/core/SseEventParser.java | 228 ++++++++ .../generated/common/rest/core/Stream.java | 513 ++++++++++++++++++ .../{auth => common}/rest/core/Suppliers.java | 2 +- .../rest/errors/BadRequestError.java | 6 +- .../rest/errors/InternalServerError.java | 6 +- .../rest/errors/NotFoundError.java | 17 +- .../rest/errors/UnauthorizedError.java | 6 +- .../rest/requests/PatchV2VaultsIdRequest.java | 69 +++ .../AsyncAuthenticationClient.java | 43 ++ .../AsyncRawAuthenticationClient.java | 102 ++-- .../authentication/AuthenticationClient.java | 41 ++ .../RawAuthenticationClient.java | 119 ++++ .../requests/GetAuthTokenRequest.java} | 101 ++-- .../resources/filesv2/AsyncFilesV2Client.java | 18 +- .../filesv2/AsyncRawFilesV2Client.java | 40 +- .../rest/resources/filesv2/FilesV2Client.java | 18 +- .../resources/filesv2/RawFilesV2Client.java | 40 +- .../requests/DeidentifyFileRequestV2.java | 10 +- .../filesv2/requests/GetRunV2Request.java | 4 +- .../requests/ReidentifyFileRequestV2.java | 10 +- .../DeidentifyFileRequestV2DataFormat.java | 2 +- .../DeidentifyFileRequestV2DataSource.java | 2 +- .../ReidentifyFileRequestV2DataFormat.java | 2 +- .../ReidentifyFileRequestV2DataSource.java | 2 +- .../guardrailsv2/AsyncGuardrailsV2Client.java | 10 +- .../AsyncRawGuardrailsV2Client.java | 30 +- .../guardrailsv2/GuardrailsV2Client.java | 10 +- .../guardrailsv2/RawGuardrailsV2Client.java | 30 +- .../requests/DetectGuardrailsRequestV2.java | 4 +- .../stringsv2/AsyncRawStringsV2Client.java | 34 +- .../stringsv2/AsyncStringsV2Client.java | 16 +- .../stringsv2/RawStringsV2Client.java | 34 +- .../resources/stringsv2/StringsV2Client.java | 16 +- .../requests/DeidentifyStringRequestV2.java | 6 +- .../requests/ReidentifyStringRequestV2.java | 6 +- .../AsyncRawTokenExchangeClient.java | 146 +++++ .../AsyncTokenExchangeClient.java | 43 ++ .../tokenexchange/RawTokenExchangeClient.java | 119 ++++ .../tokenexchange/TokenExchangeClient.java | 41 ++ .../requests/GetStsTokenRequest.java | 214 ++++++++ .../rest/types/AudioV2.java | 4 +- .../rest/types/AudioV2Bleep.java | 4 +- .../types/AudioV2OutputTranscription.java | 2 +- .../rest/types/DeidentifyFileResponseV2.java | 4 +- .../types/DeidentifyStringResponseV2.java | 4 +- ...dentifyStringResponseV2DetectedEntity.java | 4 +- ...dentifyStringResponseV2EntityLocation.java | 4 +- .../{detect => common}/rest/types/Detect.java | 4 +- .../rest/types/DetectConfigV2.java | 4 +- .../rest/types/DetectConfigV2VaultType.java | 2 +- .../rest/types/DetectCustomTypes.java | 4 +- .../rest/types/DetectEntity.java | 4 +- .../DetectEntityDeidentificationType.java | 2 +- .../rest/types/DetectEntityEntityType.java | 2 +- .../types/DetectGuardrailsResponseV2.java | 4 +- .../DetectGuardrailsResponseV2Validation.java | 2 +- .../rest/types/DetectObjectEntity.java | 4 +- ...etectObjectEntityDeidentificationType.java | 2 +- .../types/DetectObjectEntityEntityType.java | 2 +- .../rest/types/DetectReturnEntities.java | 2 +- .../rest/types/DetectRunsResponseV2.java | 4 +- .../types/DetectRunsResponseV2OutputType.java | 2 +- .../types/DetectRunsResponseV2Status.java | 2 +- .../rest/types/DocumentV2.java | 4 +- .../rest/types/DocumentV2Pdf.java | 4 +- .../types/DocumentV2PdfProcessingMode.java | 2 +- .../rest/types/EntityTransformation.java | 4 +- .../rest/types/ErrorResponse.java | 4 +- .../rest/types/ErrorResponseError.java | 4 +- .../rest/types/FileMapping.java | 4 +- .../rest/types/FileOutput.java | 4 +- .../FileOutputProcessedFileExtension.java | 2 +- .../types/FileOutputProcessedFileType.java | 2 +- .../rest/types/GetAuthTokenResponse.java} | 47 +- .../rest/types/GetStsTokenResponse.java | 173 ++++++ .../rest/types/ImageV2.java | 4 +- .../rest/types/ImageV2MaskingMethod.java | 2 +- .../{detect => common}/rest/types/Media.java | 4 +- .../rest/types/Metrics.java | 4 +- .../rest/types/RedactionLevel.java | 4 +- .../rest/types/RedactionLevelEntityName.java | 2 +- .../types/RedactionLevelRedactionType.java | 2 +- .../rest/types/ReidentifyFileResponseV2.java | 4 +- .../ReidentifyFileResponseV2OutputType.java | 2 +- .../types/ReidentifyFileResponseV2Status.java | 2 +- .../types/ReidentifyStringResponseV2.java | 4 +- .../rest/types/TransformationShiftDates.java | 4 +- .../detect/rest/core/ApiClientException.java | 17 - .../rest/core/ApiClientHttpResponse.java | 37 -- .../detect/rest/core/Environment.java | 25 - .../detect/rest/core/MediaTypes.java | 13 - .../serviceaccount/util/BearerToken.java | 26 +- .../controller/BaseDetectController.java | 42 +- .../internal/DeidentifyFileMapperTests.java | 6 +- .../internal/DetectRequestMapperTests.java | 14 +- .../internal/DetectResponseMapperTests.java | 10 +- .../internal/DetectValidationsTests.java | 2 +- .../internal/ReidentifyFileMapperTests.java | 8 +- .../ReidentifyFileValidationsTests.java | 2 +- .../serviceaccount/util/BearerTokenTests.java | 12 +- docs/api_reference.md | 5 +- .../skyflow-flowvault-java.baseline.jar | Bin 937609 -> 964784 bytes pom.xml | 2 +- skyvault/README.md | 2 +- skyvault/api-report/skyflow-java.baseline.jar | Bin 1214738 -> 1630691 bytes .../example/detect/CheckGuardrailsSample.java | 21 +- .../detect/DeidentifyFileAsyncSample.java | 18 +- .../example/detect/DeidentifyFileSample.java | 51 +- .../detect/DeidentifyStringSample.java | 25 +- .../java/com/example/detect/GetRunSample.java | 67 ++- .../example/detect/ReidentifyFileSample.java | 43 +- .../detect/ReidentifyStringSample.java | 37 +- .../java/com/skyflow/enums/RedactionType.java | 26 - 171 files changed, 3617 insertions(+), 1983 deletions(-) delete mode 100644 common/src/main/java/com/skyflow/detect/RedactionType.java create mode 100644 common/src/main/java/com/skyflow/enums/RedactionType.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java delete mode 100644 common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/ApiClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/ApiClientBuilder.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClientBuilder.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/AsyncRawApiClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/RawApiClient.java rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ApiClientApiException.java (97%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/ApiClientException.java (88%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/ApiClientHttpResponse.java (94%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ClientOptions.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ConsoleLogger.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/DateTimeDeserializer.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/DoubleSerializer.java (96%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/Environment.java (80%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/FileStream.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ILogger.java (95%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/InputStreamRequestBody.java (90%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/LogConfig.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/LogLevel.java (94%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/Logger.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/LoggingInterceptor.java (98%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/MediaTypes.java (84%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/Nullable.java (98%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/NullableNonemptyFilter.java (67%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ObjectMappers.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/QueryStringMapper.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/RequestOptions.java (98%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/ResponseBodyInputStream.java (97%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/ResponseBodyReader.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/ResponseDecompressionInterceptor.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/core/RetryInterceptor.java (99%) create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/core/Rfc2822DateTimeDeserializer.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/core/SseEvent.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/core/SseEventParser.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/core/Stream.java rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/core/Suppliers.java (92%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/errors/BadRequestError.java (80%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/errors/InternalServerError.java (80%) rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/errors/NotFoundError.java (55%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/errors/UnauthorizedError.java (80%) create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/requests/PatchV2VaultsIdRequest.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncAuthenticationClient.java rename common/src/main/java/com/skyflow/generated/{auth => common}/rest/resources/authentication/AsyncRawAuthenticationClient.java (51%) create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AuthenticationClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/RawAuthenticationClient.java rename common/src/main/java/com/skyflow/generated/{auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java => common/rest/resources/authentication/requests/GetAuthTokenRequest.java} (68%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/AsyncFilesV2Client.java (86%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/AsyncRawFilesV2Client.java (93%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/FilesV2Client.java (84%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/RawFilesV2Client.java (91%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/requests/GetRunV2Request.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java (81%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java (86%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/guardrailsv2/GuardrailsV2Client.java (79%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/guardrailsv2/RawGuardrailsV2Client.java (83%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/AsyncRawStringsV2Client.java (91%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/AsyncStringsV2Client.java (85%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/RawStringsV2Client.java (89%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/StringsV2Client.java (83%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java (97%) create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncRawTokenExchangeClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncTokenExchangeClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/RawTokenExchangeClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/TokenExchangeClient.java create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/requests/GetStsTokenRequest.java rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/AudioV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/AudioV2Bleep.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/AudioV2OutputTranscription.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DeidentifyFileResponseV2.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DeidentifyStringResponseV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DeidentifyStringResponseV2DetectedEntity.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DeidentifyStringResponseV2EntityLocation.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/Detect.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectConfigV2.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectConfigV2VaultType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectCustomTypes.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectEntity.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectEntityDeidentificationType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectEntityEntityType.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectGuardrailsResponseV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectGuardrailsResponseV2Validation.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectObjectEntity.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectObjectEntityDeidentificationType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectObjectEntityEntityType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectReturnEntities.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectRunsResponseV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectRunsResponseV2OutputType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DetectRunsResponseV2Status.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DocumentV2.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DocumentV2Pdf.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/DocumentV2PdfProcessingMode.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/EntityTransformation.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ErrorResponse.java (96%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ErrorResponseError.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/FileMapping.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/FileOutput.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/FileOutputProcessedFileExtension.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/FileOutputProcessedFileType.java (96%) rename common/src/main/java/com/skyflow/generated/{auth/rest/types/V1GetAuthTokenResponse.java => common/rest/types/GetAuthTokenResponse.java} (67%) create mode 100644 common/src/main/java/com/skyflow/generated/common/rest/types/GetStsTokenResponse.java rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ImageV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ImageV2MaskingMethod.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/Media.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/Metrics.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/RedactionLevel.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/RedactionLevelEntityName.java (99%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/RedactionLevelRedactionType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ReidentifyFileResponseV2.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ReidentifyFileResponseV2OutputType.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ReidentifyFileResponseV2Status.java (98%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/ReidentifyStringResponseV2.java (97%) rename common/src/main/java/com/skyflow/generated/{detect => common}/rest/types/TransformationShiftDates.java (97%) delete mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java delete mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java delete mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java delete mode 100644 common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java delete mode 100644 skyvault/src/main/java/com/skyflow/enums/RedactionType.java diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java index ba53d00e..8fb94454 100644 --- a/common/src/main/java/com/skyflow/BaseVaultClient.java +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -6,7 +6,7 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.serviceaccount.util.Token; diff --git a/common/src/main/java/com/skyflow/detect/RedactionLevel.java b/common/src/main/java/com/skyflow/detect/RedactionLevel.java index 74f04f1e..b10d1806 100644 --- a/common/src/main/java/com/skyflow/detect/RedactionLevel.java +++ b/common/src/main/java/com/skyflow/detect/RedactionLevel.java @@ -1,5 +1,7 @@ package com.skyflow.detect; +import com.skyflow.enums.RedactionType; + /** * Controls how one group of tokens is rendered when re-identifying. Supply exactly one source (entityName or tokenGroupName) and exactly one replacement (redactionType or redactionPattern). */ diff --git a/common/src/main/java/com/skyflow/detect/RedactionType.java b/common/src/main/java/com/skyflow/detect/RedactionType.java deleted file mode 100644 index 87b3e891..00000000 --- a/common/src/main/java/com/skyflow/detect/RedactionType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.skyflow.detect; - -/** - * How a token is rendered when re-identifying (skyvault vaults). - */ -public enum RedactionType { - PLAIN_TEXT, - MASKED, - DEFAULT, - REDACTED; -} diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java index 42ef0faf..8461eddb 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -31,36 +31,36 @@ import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; -import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; +import com.skyflow.generated.common.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.BaseUtils; import com.skyflow.utils.logger.LogUtil; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.AudioV2; -import com.skyflow.generated.detect.rest.types.AudioV2Bleep; -import com.skyflow.generated.detect.rest.types.AudioV2OutputTranscription; -import com.skyflow.generated.detect.rest.types.DetectConfigV2; -import com.skyflow.generated.detect.rest.types.DetectCustomTypes; -import com.skyflow.generated.detect.rest.types.DetectEntity; -import com.skyflow.generated.detect.rest.types.DetectEntityDeidentificationType; -import com.skyflow.generated.detect.rest.types.DetectEntityEntityType; -import com.skyflow.generated.detect.rest.types.DetectObjectEntity; -import com.skyflow.generated.detect.rest.types.DetectObjectEntityDeidentificationType; -import com.skyflow.generated.detect.rest.types.DetectObjectEntityEntityType; -import com.skyflow.generated.detect.rest.types.DetectReturnEntities; -import com.skyflow.generated.detect.rest.types.DocumentV2; -import com.skyflow.generated.detect.rest.types.DocumentV2Pdf; -import com.skyflow.generated.detect.rest.types.DocumentV2PdfProcessingMode; -import com.skyflow.generated.detect.rest.types.EntityTransformation; -import com.skyflow.generated.detect.rest.types.ImageV2; -import com.skyflow.generated.detect.rest.types.ImageV2MaskingMethod; -import com.skyflow.generated.detect.rest.types.RedactionLevelEntityName; -import com.skyflow.generated.detect.rest.types.RedactionLevelRedactionType; -import com.skyflow.generated.detect.rest.types.TransformationShiftDates; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.AudioV2; +import com.skyflow.generated.common.rest.types.AudioV2Bleep; +import com.skyflow.generated.common.rest.types.AudioV2OutputTranscription; +import com.skyflow.generated.common.rest.types.DetectConfigV2; +import com.skyflow.generated.common.rest.types.DetectCustomTypes; +import com.skyflow.generated.common.rest.types.DetectEntity; +import com.skyflow.generated.common.rest.types.DetectEntityDeidentificationType; +import com.skyflow.generated.common.rest.types.DetectEntityEntityType; +import com.skyflow.generated.common.rest.types.DetectObjectEntity; +import com.skyflow.generated.common.rest.types.DetectObjectEntityDeidentificationType; +import com.skyflow.generated.common.rest.types.DetectObjectEntityEntityType; +import com.skyflow.generated.common.rest.types.DetectReturnEntities; +import com.skyflow.generated.common.rest.types.DocumentV2; +import com.skyflow.generated.common.rest.types.DocumentV2Pdf; +import com.skyflow.generated.common.rest.types.DocumentV2PdfProcessingMode; +import com.skyflow.generated.common.rest.types.EntityTransformation; +import com.skyflow.generated.common.rest.types.ImageV2; +import com.skyflow.generated.common.rest.types.ImageV2MaskingMethod; +import com.skyflow.generated.common.rest.types.RedactionLevelEntityName; +import com.skyflow.generated.common.rest.types.RedactionLevelRedactionType; +import com.skyflow.generated.common.rest.types.TransformationShiftDates; /** * Converts public SDK request models into generated V2 API requests. Internal to the SDK. @@ -178,9 +178,9 @@ public static DetectConfigV2 toDetectConfig(DetectConfiguration configuration, S return builder.build(); } - static com.skyflow.generated.detect.rest.types.Detect toDetect(Detect detect) { - com.skyflow.generated.detect.rest.types.Detect.Builder builder = - com.skyflow.generated.detect.rest.types.Detect.builder(); + static com.skyflow.generated.common.rest.types.Detect toDetect(Detect detect) { + com.skyflow.generated.common.rest.types.Detect.Builder builder = + com.skyflow.generated.common.rest.types.Detect.builder(); if (detect.getEntities() != null) { List entities = new ArrayList<>(); for (Entity entity : detect.getEntities()) { @@ -276,14 +276,14 @@ static DetectObjectEntity toObjectEntity(ObjectEntity objectEntity) { return builder.build(); } - static List toFileMappings(List fileMappings) { - List result = new ArrayList<>(); + static List toFileMappings(List fileMappings) { + List result = new ArrayList<>(); for (FileMapping mapping : fileMappings) { if (mapping == null) { continue; } - com.skyflow.generated.detect.rest.types.FileMapping.Builder builder = - com.skyflow.generated.detect.rest.types.FileMapping.builder(); + com.skyflow.generated.common.rest.types.FileMapping.Builder builder = + com.skyflow.generated.common.rest.types.FileMapping.builder(); if (mapping.getSource() != null) { builder.source(mapping.getSource()); } @@ -304,9 +304,9 @@ static List toFileMappings( return result; } - static com.skyflow.generated.detect.rest.types.Media toMedia(Media media) { - com.skyflow.generated.detect.rest.types.Media.Builder builder = - com.skyflow.generated.detect.rest.types.Media.builder(); + static com.skyflow.generated.common.rest.types.Media toMedia(Media media) { + com.skyflow.generated.common.rest.types.Media.Builder builder = + com.skyflow.generated.common.rest.types.Media.builder(); if (media.getAudio() != null) { builder.audio(toAudio(media.getAudio())); } @@ -380,14 +380,14 @@ static ImageV2 toImage(Image image) { return builder.build(); } - public static List toRedactionLevels(List levels) { - List result = new ArrayList<>(); + public static List toRedactionLevels(List levels) { + List result = new ArrayList<>(); for (RedactionLevel level : levels) { if (level == null) { continue; } - com.skyflow.generated.detect.rest.types.RedactionLevel.Builder builder = - com.skyflow.generated.detect.rest.types.RedactionLevel.builder(); + com.skyflow.generated.common.rest.types.RedactionLevel.Builder builder = + com.skyflow.generated.common.rest.types.RedactionLevel.builder(); if (level.getEntityName() != null) { builder.entityName(RedactionLevelEntityName.valueOf(level.getEntityName().name())); } diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java index f4d2484b..9994ab70 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java @@ -13,12 +13,12 @@ import com.skyflow.detect.EntityLocation; import com.skyflow.detect.Metrics; import com.skyflow.detect.ReidentifyStringResponse; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2DetectedEntity; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2EntityLocation; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2DetectedEntity; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2EntityLocation; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import java.util.ArrayList; import java.util.Collections; @@ -83,9 +83,9 @@ public static CheckGuardrailsResponse toCheckGuardrailsResponse(DetectGuardrails public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 response) { List outputs = new ArrayList<>(); - List apiOutputs = response.getOutput().orElse(null); + List apiOutputs = response.getOutput().orElse(null); if (apiOutputs != null) { - for (com.skyflow.generated.detect.rest.types.FileOutput apiOutput : apiOutputs) { + for (com.skyflow.generated.common.rest.types.FileOutput apiOutput : apiOutputs) { if (apiOutput != null) { outputs.add(toFileOutput(apiOutput)); } @@ -112,7 +112,7 @@ public static DeidentifyFileResponse toDeidentifyFileResponse(String runId, GetR run.getMetrics(), run.getMessage()); } - public static FileOutput toFileOutput(com.skyflow.generated.detect.rest.types.FileOutput apiOutput) { + public static FileOutput toFileOutput(com.skyflow.generated.common.rest.types.FileOutput apiOutput) { return new FileOutput( apiOutput.getProcessedFile().orElse(null), apiOutput.getProcessedFileType().map(Object::toString).orElse(null), @@ -133,7 +133,7 @@ static > E enumOrDefault(Class type, String value, E fallba } } - public static Metrics toMetrics(com.skyflow.generated.detect.rest.types.Metrics metrics) { + public static Metrics toMetrics(com.skyflow.generated.common.rest.types.Metrics metrics) { return new Metrics( metrics.getSize().orElse(null), metrics.getWordCount().orElse(null), diff --git a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java index d1653166..188f0013 100644 --- a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java @@ -5,10 +5,10 @@ import com.skyflow.detect.FileOutput; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.detect.ReidentifyFileResponse; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; -import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; +import com.skyflow.generated.common.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; import java.util.ArrayList; import java.util.Collections; @@ -39,9 +39,9 @@ public static ReidentifyFileRequestV2 toApiRequest(ReidentifyFileRequest request public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 response) { List outputs = new ArrayList<>(); - List apiOutputs = response.getOutput().orElse(null); + List apiOutputs = response.getOutput().orElse(null); if (apiOutputs != null) { - for (com.skyflow.generated.detect.rest.types.FileOutput apiOutput : apiOutputs) { + for (com.skyflow.generated.common.rest.types.FileOutput apiOutput : apiOutputs) { if (apiOutput != null) { outputs.add(DetectResponseMapper.toFileOutput(apiOutput)); } diff --git a/common/src/main/java/com/skyflow/enums/RedactionType.java b/common/src/main/java/com/skyflow/enums/RedactionType.java new file mode 100644 index 00000000..c6feaa68 --- /dev/null +++ b/common/src/main/java/com/skyflow/enums/RedactionType.java @@ -0,0 +1,21 @@ +package com.skyflow.enums; + +/** + * How a stored value is rendered when it is read back. Shared by the skyvault vault operations + * ({@code get} and {@code detokenize}) and by Detect re-identification, where a + * {@code RedactionLevel} applies it to one entity type. + */ +public enum RedactionType { + PLAIN_TEXT, + MASKED, + DEFAULT, + REDACTED; + + /** + * @return the wire value, which is the constant name + */ + @Override + public String toString() { + return name(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java deleted file mode 100644 index a1dd3aae..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.Suppliers; -import com.skyflow.generated.auth.rest.resources.authentication.AuthenticationClient; - -import java.util.function.Supplier; - -public class ApiClient { - protected final ClientOptions clientOptions; - - protected final Supplier authenticationClient; - - public ApiClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.authenticationClient = Suppliers.memoize(() -> new AuthenticationClient(clientOptions)); - } - - public AuthenticationClient authentication() { - return this.authenticationClient.get(); - } - - public static ApiClientBuilder builder() { - return new ApiClientBuilder(); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java deleted file mode 100644 index aed3ed24..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.Environment; -import okhttp3.OkHttpClient; - -public final class ApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); - - private String token = null; - - private Environment environment = Environment.PRODUCTION; - - /** - * Sets token - */ - public ApiClientBuilder token(String token) { - this.token = token; - return this; - } - - public ApiClientBuilder environment(Environment environment) { - this.environment = environment; - return this; - } - - public ApiClientBuilder url(String url) { - this.environment = Environment.custom(url); - return this; - } - - /** - * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. - */ - public ApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); - return this; - } - - /** - * Sets the maximum number of retries for the client. Defaults to 2 retries. - */ - public ApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); - return this; - } - - /** - * Sets the underlying OkHttp client - */ - public ApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); - return this; - } - - public ApiClient build() { - if (token == null) { - throw new RuntimeException("Please provide token"); - } - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new ApiClient(clientOptionsBuilder.build()); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java deleted file mode 100644 index 748eb02e..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java +++ /dev/null @@ -1,29 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.Suppliers; -import com.skyflow.generated.auth.rest.resources.authentication.AsyncAuthenticationClient; - -import java.util.function.Supplier; - -public class AsyncApiClient { - protected final ClientOptions clientOptions; - - protected final Supplier authenticationClient; - - public AsyncApiClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.authenticationClient = Suppliers.memoize(() -> new AsyncAuthenticationClient(clientOptions)); - } - - public AsyncAuthenticationClient authentication() { - return this.authenticationClient.get(); - } - - public static AsyncApiClientBuilder builder() { - return new AsyncApiClientBuilder(); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java deleted file mode 100644 index 2e30d45a..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.Environment; -import okhttp3.OkHttpClient; - -public final class AsyncApiClientBuilder { - private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); - - private String token = null; - - private Environment environment = Environment.PRODUCTION; - - /** - * Sets token - */ - public AsyncApiClientBuilder token(String token) { - this.token = token; - return this; - } - - public AsyncApiClientBuilder environment(Environment environment) { - this.environment = environment; - return this; - } - - public AsyncApiClientBuilder url(String url) { - this.environment = Environment.custom(url); - return this; - } - - /** - * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. - */ - public AsyncApiClientBuilder timeout(int timeout) { - this.clientOptionsBuilder.timeout(timeout); - return this; - } - - /** - * Sets the maximum number of retries for the client. Defaults to 2 retries. - */ - public AsyncApiClientBuilder maxRetries(int maxRetries) { - this.clientOptionsBuilder.maxRetries(maxRetries); - return this; - } - - /** - * Sets the underlying OkHttp client - */ - public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { - this.clientOptionsBuilder.httpClient(httpClient); - return this; - } - - public AsyncApiClient build() { - if (token == null) { - throw new RuntimeException("Please provide token"); - } - this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); - clientOptionsBuilder.environment(this.environment); - return new AsyncApiClient(clientOptionsBuilder.build()); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java deleted file mode 100644 index 53d67f0b..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java +++ /dev/null @@ -1,74 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.Response; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * This exception type will be thrown for any non-2XX API responses. - */ -public class ApiClientApiException extends ApiClientException { - /** - * The error code of the response that triggered the exception. - */ - private final int statusCode; - - /** - * The body of the response that triggered the exception. - */ - private final Object body; - - private final Map> headers; - - public ApiClientApiException(String message, int statusCode, Object body) { - super(message); - this.statusCode = statusCode; - this.body = body; - this.headers = new HashMap<>(); - } - - public ApiClientApiException(String message, int statusCode, Object body, Response rawResponse) { - super(message); - this.statusCode = statusCode; - this.body = body; - this.headers = new HashMap<>(); - rawResponse.headers().forEach(header -> { - String key = header.component1(); - String value = header.component2(); - this.headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); - }); - } - - /** - * @return the statusCode - */ - public int statusCode() { - return this.statusCode; - } - - /** - * @return the body - */ - public Object body() { - return this.body; - } - - /** - * @return the headers - */ - public Map> headers() { - return this.headers; - } - - @Override - public String toString() { - return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + body - + "}"; - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java deleted file mode 100644 index 4eee6b92..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java +++ /dev/null @@ -1,171 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.OkHttpClient; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -public final class ClientOptions { - private final Environment environment; - - private final Map headers; - - private final Map> headerSuppliers; - - private final OkHttpClient httpClient; - - private final int timeout; - - private ClientOptions( - Environment environment, - Map headers, - Map> headerSuppliers, - OkHttpClient httpClient, - int timeout) { - this.environment = environment; - this.headers = new HashMap<>(); - this.headers.putAll(headers); - this.headers.putAll(new HashMap() { - { - put("X-Fern-Language", "JAVA"); - put("X-Fern-SDK-Name", "com.skyflow.generated.rest.fern:api-sdk"); - put("X-Fern-SDK-Version", "0.0.279"); - } - }); - this.headerSuppliers = headerSuppliers; - this.httpClient = httpClient; - this.timeout = timeout; - } - - public Environment environment() { - return this.environment; - } - - public Map headers(RequestOptions requestOptions) { - Map values = new HashMap<>(this.headers); - headerSuppliers.forEach((key, supplier) -> { - values.put(key, supplier.get()); - }); - if (requestOptions != null) { - values.putAll(requestOptions.getHeaders()); - } - return values; - } - - public int timeout(RequestOptions requestOptions) { - if (requestOptions == null) { - return this.timeout; - } - return requestOptions.getTimeout().orElse(this.timeout); - } - - public OkHttpClient httpClient() { - return this.httpClient; - } - - public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { - if (requestOptions == null) { - return this.httpClient; - } - return this.httpClient - .newBuilder() - .callTimeout(requestOptions.getTimeout().get(), requestOptions.getTimeoutTimeUnit()) - .connectTimeout(0, TimeUnit.SECONDS) - .writeTimeout(0, TimeUnit.SECONDS) - .readTimeout(0, TimeUnit.SECONDS) - .build(); - } - - public static Builder builder() { - return new Builder(); - } - - public static final class Builder { - private Environment environment; - - private final Map headers = new HashMap<>(); - - private final Map> headerSuppliers = new HashMap<>(); - - private int maxRetries = 2; - - private Optional timeout = Optional.empty(); - - private OkHttpClient httpClient = null; - - public Builder environment(Environment environment) { - this.environment = environment; - return this; - } - - public Builder addHeader(String key, String value) { - this.headers.put(key, value); - return this; - } - - public Builder addHeader(String key, Supplier value) { - this.headerSuppliers.put(key, value); - return this; - } - - /** - * Override the timeout in seconds. Defaults to 60 seconds. - */ - public Builder timeout(int timeout) { - this.timeout = Optional.of(timeout); - return this; - } - - /** - * Override the timeout in seconds. Defaults to 60 seconds. - */ - public Builder timeout(Optional timeout) { - this.timeout = timeout; - return this; - } - - /** - * Override the maximum number of retries. Defaults to 2 retries. - */ - public Builder maxRetries(int maxRetries) { - this.maxRetries = maxRetries; - return this; - } - - public Builder httpClient(OkHttpClient httpClient) { - this.httpClient = httpClient; - return this; - } - - public ClientOptions build() { - OkHttpClient.Builder httpClientBuilder = - this.httpClient != null ? this.httpClient.newBuilder() : new OkHttpClient.Builder(); - - if (this.httpClient != null) { - timeout.ifPresent(timeout -> httpClientBuilder - .callTimeout(timeout, TimeUnit.SECONDS) - .connectTimeout(0, TimeUnit.SECONDS) - .writeTimeout(0, TimeUnit.SECONDS) - .readTimeout(0, TimeUnit.SECONDS)); - } else { - httpClientBuilder - .callTimeout(this.timeout.orElse(60), TimeUnit.SECONDS) - .connectTimeout(0, TimeUnit.SECONDS) - .writeTimeout(0, TimeUnit.SECONDS) - .readTimeout(0, TimeUnit.SECONDS) - .addInterceptor(new RetryInterceptor(this.maxRetries)); - } - - this.httpClient = httpClientBuilder.build(); - this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); - - return new ClientOptions(environment, headers, headerSuppliers, httpClient, this.timeout.get()); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java deleted file mode 100644 index dfa25a82..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.module.SimpleModule; - -import java.io.IOException; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.time.temporal.TemporalAccessor; -import java.time.temporal.TemporalQueries; - -/** - * Custom deserializer that handles converting ISO8601 dates into {@link OffsetDateTime} objects. - */ -class DateTimeDeserializer extends JsonDeserializer { - private static final SimpleModule MODULE; - - static { - MODULE = new SimpleModule().addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); - } - - /** - * Gets a module wrapping this deserializer as an adapter for the Jackson ObjectMapper. - * - * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. - */ - public static SimpleModule getModule() { - return MODULE; - } - - @Override - public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { - JsonToken token = parser.currentToken(); - if (token == JsonToken.VALUE_NUMBER_INT) { - return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); - } else { - TemporalAccessor temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( - parser.getValueAsString(), OffsetDateTime::from, LocalDateTime::from); - - if (temporal.query(TemporalQueries.offset()) == null) { - return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); - } else { - return OffsetDateTime.from(temporal); - } - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java deleted file mode 100644 index 4997b3ca..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - -import java.io.IOException; - -public final class ObjectMappers { - public static final ObjectMapper JSON_MAPPER = JsonMapper.builder() - .addModule(new Jdk8Module()) - .addModule(new JavaTimeModule()) - .addModule(DateTimeDeserializer.getModule()) - .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) - .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .build(); - - private ObjectMappers() {} - - public static String stringify(Object o) { - try { - return JSON_MAPPER - .setSerializationInclusion(JsonInclude.Include.ALWAYS) - .writerWithDefaultPrettyPrinter() - .writeValueAsString(o); - } catch (IOException e) { - return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java deleted file mode 100644 index 8b1f9f7e..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import okhttp3.HttpUrl; -import okhttp3.MultipartBody; - -import java.util.*; - -public class QueryStringMapper { - - private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; - - public static void addQueryParameter(HttpUrl.Builder httpUrl, String key, Object value, boolean arraysAsRepeats) { - JsonNode valueNode = MAPPER.valueToTree(value); - - List> flat; - if (valueNode.isObject()) { - flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); - } else if (valueNode.isArray()) { - flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); - } else { - if (valueNode.isTextual()) { - httpUrl.addQueryParameter(key, valueNode.textValue()); - } else { - httpUrl.addQueryParameter(key, valueNode.toString()); - } - return; - } - - for (Map.Entry field : flat) { - if (field.getValue().isTextual()) { - httpUrl.addQueryParameter(key + field.getKey(), field.getValue().textValue()); - } else { - httpUrl.addQueryParameter(key + field.getKey(), field.getValue().toString()); - } - } - } - - public static void addFormDataPart( - MultipartBody.Builder multipartBody, String key, Object value, boolean arraysAsRepeats) { - JsonNode valueNode = MAPPER.valueToTree(value); - - List> flat; - if (valueNode.isObject()) { - flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); - } else if (valueNode.isArray()) { - flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); - } else { - if (valueNode.isTextual()) { - multipartBody.addFormDataPart(key, valueNode.textValue()); - } else { - multipartBody.addFormDataPart(key, valueNode.toString()); - } - return; - } - - for (Map.Entry field : flat) { - if (field.getValue().isTextual()) { - multipartBody.addFormDataPart( - key + field.getKey(), field.getValue().textValue()); - } else { - multipartBody.addFormDataPart( - key + field.getKey(), field.getValue().toString()); - } - } - } - - public static List> flattenObject(ObjectNode object, boolean arraysAsRepeats) { - List> flat = new ArrayList<>(); - - Iterator> fields = object.fields(); - while (fields.hasNext()) { - Map.Entry field = fields.next(); - - String key = "[" + field.getKey() + "]"; - - if (field.getValue().isObject()) { - List> flatField = - flattenObject((ObjectNode) field.getValue(), arraysAsRepeats); - addAll(flat, flatField, key); - } else if (field.getValue().isArray()) { - List> flatField = - flattenArray((ArrayNode) field.getValue(), key, arraysAsRepeats); - addAll(flat, flatField, ""); - } else { - flat.add(new AbstractMap.SimpleEntry<>(key, field.getValue())); - } - } - - return flat; - } - - private static List> flattenArray( - ArrayNode array, String key, boolean arraysAsRepeats) { - List> flat = new ArrayList<>(); - - Iterator elements = array.elements(); - - int index = 0; - while (elements.hasNext()) { - JsonNode element = elements.next(); - - String indexKey = key + "[" + index + "]"; - - if (arraysAsRepeats) { - indexKey = key; - } - - if (element.isObject()) { - List> flatField = flattenObject((ObjectNode) element, arraysAsRepeats); - addAll(flat, flatField, indexKey); - } else if (element.isArray()) { - List> flatField = flattenArray((ArrayNode) element, "", arraysAsRepeats); - addAll(flat, flatField, indexKey); - } else { - flat.add(new AbstractMap.SimpleEntry<>(indexKey, element)); - } - - index++; - } - - return flat; - } - - private static void addAll( - List> target, List> source, String prefix) { - for (Map.Entry entry : source) { - Map.Entry entryToAdd = - new AbstractMap.SimpleEntry<>(prefix + entry.getKey(), entry.getValue()); - target.add(entryToAdd); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java deleted file mode 100644 index b70c02df..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -public final class RequestOptions { - private final String token; - - private final Optional timeout; - - private final TimeUnit timeoutTimeUnit; - - private final Map headers; - - private final Map> headerSuppliers; - - private RequestOptions( - String token, - Optional timeout, - TimeUnit timeoutTimeUnit, - Map headers, - Map> headerSuppliers) { - this.token = token; - this.timeout = timeout; - this.timeoutTimeUnit = timeoutTimeUnit; - this.headers = headers; - this.headerSuppliers = headerSuppliers; - } - - public Optional getTimeout() { - return timeout; - } - - public TimeUnit getTimeoutTimeUnit() { - return timeoutTimeUnit; - } - - public Map getHeaders() { - Map headers = new HashMap<>(); - if (this.token != null) { - headers.put("Authorization", "Bearer " + this.token); - } - headers.putAll(this.headers); - this.headerSuppliers.forEach((key, supplier) -> { - headers.put(key, supplier.get()); - }); - return headers; - } - - public static Builder builder() { - return new Builder(); - } - - public static final class Builder { - private String token = null; - - private Optional timeout = Optional.empty(); - - private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; - - private final Map headers = new HashMap<>(); - - private final Map> headerSuppliers = new HashMap<>(); - - public Builder token(String token) { - this.token = token; - return this; - } - - public Builder timeout(Integer timeout) { - this.timeout = Optional.of(timeout); - return this; - } - - public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { - this.timeout = Optional.of(timeout); - this.timeoutTimeUnit = timeoutTimeUnit; - return this; - } - - public Builder addHeader(String key, String value) { - this.headers.put(key, value); - return this; - } - - public Builder addHeader(String key, Supplier value) { - this.headerSuppliers.put(key, value); - return this; - } - - public RequestOptions build() { - return new RequestOptions(token, timeout, timeoutTimeUnit, headers, headerSuppliers); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java deleted file mode 100644 index 8344b974..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java +++ /dev/null @@ -1,79 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.Interceptor; -import okhttp3.Response; - -import java.io.IOException; -import java.time.Duration; -import java.util.Optional; -import java.util.Random; - -public class RetryInterceptor implements Interceptor { - - private static final Duration ONE_SECOND = Duration.ofSeconds(1); - private final ExponentialBackoff backoff; - private final Random random = new Random(); - - public RetryInterceptor(int maxRetries) { - this.backoff = new ExponentialBackoff(maxRetries); - } - - @Override - public Response intercept(Chain chain) throws IOException { - Response response = chain.proceed(chain.request()); - - if (shouldRetry(response.code())) { - return retryChain(response, chain); - } - - return response; - } - - private Response retryChain(Response response, Chain chain) throws IOException { - Optional nextBackoff = this.backoff.nextBackoff(); - while (nextBackoff.isPresent()) { - try { - Thread.sleep(nextBackoff.get().toMillis()); - } catch (InterruptedException e) { - throw new IOException("Interrupted while trying request", e); - } - response.close(); - response = chain.proceed(chain.request()); - if (shouldRetry(response.code())) { - nextBackoff = this.backoff.nextBackoff(); - } else { - return response; - } - } - - return response; - } - - private static boolean shouldRetry(int statusCode) { - return statusCode == 408 || statusCode == 429 || statusCode >= 500; - } - - private final class ExponentialBackoff { - - private final int maxNumRetries; - - private int retryNumber = 0; - - ExponentialBackoff(int maxNumRetries) { - this.maxNumRetries = maxNumRetries; - } - - public Optional nextBackoff() { - retryNumber += 1; - if (retryNumber > maxNumRetries) { - return Optional.empty(); - } - - int upperBound = (int) Math.pow(2, retryNumber); - return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java deleted file mode 100644 index 4a984faa..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java +++ /dev/null @@ -1,97 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.core; - -import java.io.Reader; -import java.util.Iterator; -import java.util.NoSuchElementException; -import java.util.Scanner; - -/** - * The {@code Stream} class implements {@link Iterable} to provide a simple mechanism for reading and parsing - * objects of a given type from data streamed via a {@link Reader} using a specified delimiter. - *

- * {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a - * {@code Scanner} to block during iteration if the next object is not available. - * - * @param The type of objects in the stream. - */ -public final class Stream implements Iterable { - /** - * The {@link Class} of the objects in the stream. - */ - private final Class valueType; - /** - * The {@link Scanner} used for reading from the input stream and blocking when needed during iteration. - */ - private final Scanner scanner; - - /** - * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. - * - * @param valueType The class of the objects in the stream. - * @param reader The reader that provides the streamed data. - * @param delimiter The delimiter used to separate elements in the stream. - */ - public Stream(Class valueType, Reader reader, String delimiter) { - this.scanner = new Scanner(reader).useDelimiter(delimiter); - this.valueType = valueType; - } - - /** - * Returns an iterator over the elements in this stream that blocks during iteration when the next object is - * not yet available. - * - * @return An iterator that can be used to traverse the elements in the stream. - */ - @Override - public Iterator iterator() { - return new Iterator() { - /** - * Returns {@code true} if there are more elements in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return {@code true} if there are more elements, {@code false} otherwise. - */ - @Override - public boolean hasNext() { - return scanner.hasNext(); - } - - /** - * Returns the next element in the stream. - *

- * Will block and wait for input if the stream has not ended and the next object is not yet available. - * - * @return The next element in the stream. - * @throws NoSuchElementException If there are no more elements in the stream. - */ - @Override - public T next() { - if (!scanner.hasNext()) { - throw new NoSuchElementException(); - } else { - try { - T parsedResponse = ObjectMappers.JSON_MAPPER.readValue( - scanner.next().trim(), valueType); - return parsedResponse; - } catch (Exception e) { - throw new RuntimeException(e); - } - } - } - - /** - * Removing elements from {@code Stream} is not supported. - * - * @throws UnsupportedOperationException Always, as removal is not supported. - */ - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java deleted file mode 100644 index 4517200d..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.errors; - -import com.skyflow.generated.auth.rest.core.ApiClientApiException; -import okhttp3.Response; - -import java.util.Map; - -public final class BadRequestError extends ApiClientApiException { - /** - * The body of the response that triggered the exception. - */ - private final Map body; - - public BadRequestError(Map body) { - super("BadRequestError", 400, body); - this.body = body; - } - - public BadRequestError(Map body, Response rawResponse) { - super("BadRequestError", 400, body, rawResponse); - this.body = body; - } - - /** - * @return the body - */ - @Override - public Map body() { - return this.body; - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java deleted file mode 100644 index 2e1c45d2..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.skyflow.generated.auth.rest.errors; - -public enum HttpStatus { - BAD_REQUEST("Bad Request"); - - private final String httpStatus; - - HttpStatus(String httpStatus) { - this.httpStatus = httpStatus; - } - - public String getHttpStatus() { - return httpStatus; - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java deleted file mode 100644 index 42f1c624..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java +++ /dev/null @@ -1,34 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.errors; - -import com.skyflow.generated.auth.rest.core.ApiClientApiException; -import okhttp3.Response; - -import java.util.Map; - -public final class UnauthorizedError extends ApiClientApiException { - /** - * The body of the response that triggered the exception. - */ - private final Map body; - - public UnauthorizedError(Map body) { - super("UnauthorizedError", 401, body); - this.body = body; - } - - public UnauthorizedError(Map body, Response rawResponse) { - super("UnauthorizedError", 401, body, rawResponse); - this.body = body; - } - - /** - * @return the body - */ - @Override - public Map body() { - return this.body; - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java deleted file mode 100644 index c742b239..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java +++ /dev/null @@ -1,46 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.resources.authentication; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.RequestOptions; -import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; - -import java.util.concurrent.CompletableFuture; - -public class AsyncAuthenticationClient { - protected final ClientOptions clientOptions; - - private final AsyncRawAuthenticationClient rawClient; - - public AsyncAuthenticationClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new AsyncRawAuthenticationClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public AsyncRawAuthenticationClient withRawResponse() { - return this.rawClient; - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public CompletableFuture authenticationServiceGetAuthToken(V1GetAuthTokenRequest request) { - return this.rawClient.authenticationServiceGetAuthToken(request).thenApply(response -> response.body()); - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public CompletableFuture authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request, RequestOptions requestOptions) { - return this.rawClient - .authenticationServiceGetAuthToken(request, requestOptions) - .thenApply(response -> response.body()); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java deleted file mode 100644 index a0ba860a..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java +++ /dev/null @@ -1,44 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.resources.authentication; - -import com.skyflow.generated.auth.rest.core.ClientOptions; -import com.skyflow.generated.auth.rest.core.RequestOptions; -import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; - -public class AuthenticationClient { - protected final ClientOptions clientOptions; - - private final RawAuthenticationClient rawClient; - - public AuthenticationClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - this.rawClient = new RawAuthenticationClient(clientOptions); - } - - /** - * Get responses with HTTP metadata like headers - */ - public RawAuthenticationClient withRawResponse() { - return this.rawClient; - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public V1GetAuthTokenResponse authenticationServiceGetAuthToken(V1GetAuthTokenRequest request) { - return this.rawClient.authenticationServiceGetAuthToken(request).body(); - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public V1GetAuthTokenResponse authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request, RequestOptions requestOptions) { - return this.rawClient - .authenticationServiceGetAuthToken(request, requestOptions) - .body(); - } -} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java deleted file mode 100644 index 6c52c048..00000000 --- a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java +++ /dev/null @@ -1,99 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.auth.rest.resources.authentication; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.skyflow.generated.auth.rest.core.*; -import com.skyflow.generated.auth.rest.errors.BadRequestError; -import com.skyflow.generated.auth.rest.errors.NotFoundError; -import com.skyflow.generated.auth.rest.errors.UnauthorizedError; -import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; -import okhttp3.*; - -import java.io.IOException; -import java.util.Map; - -public class RawAuthenticationClient { - protected final ClientOptions clientOptions; - - public RawAuthenticationClient(ClientOptions clientOptions) { - this.clientOptions = clientOptions; - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public ApiClientHttpResponse authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request) { - return authenticationServiceGetAuthToken(request, null); - } - - /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

- */ - public ApiClientHttpResponse authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) - .newBuilder() - .addPathSegments("v1/auth/sa/oauth/token") - .build(); - RequestBody body; - try { - body = RequestBody.create( - ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); - } catch (JsonProcessingException e) { - throw new ApiClientException("Failed to serialize request", e); - } - Request okhttpRequest = new Request.Builder() - .url(httpUrl) - .method("POST", body) - .headers(Headers.of(clientOptions.headers(requestOptions))) - .addHeader("Content-Type", "application/json") - .addHeader("Accept", "application/json") - .build(); - OkHttpClient client = clientOptions.httpClient(); - if (requestOptions != null && requestOptions.getTimeout().isPresent()) { - client = clientOptions.httpClientWithTimeout(requestOptions); - } - try (Response response = client.newCall(okhttpRequest).execute()) { - ResponseBody responseBody = response.body(); - if (response.isSuccessful()) { - return new ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetAuthTokenResponse.class), - response); - } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; - try { - switch (response.code()) { - case 400: - throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), - response); - case 401: - throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), - response); - case 404: - throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), - response); - } - } catch (JsonProcessingException ignored) { - // unable to map error response, throwing generic error - } - throw new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response); - } catch (IOException e) { - throw new ApiClientException("Network error executing HTTP request", e); - } - } -} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/ApiClient.java b/common/src/main/java/com/skyflow/generated/common/rest/ApiClient.java new file mode 100644 index 00000000..79634e85 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/ApiClient.java @@ -0,0 +1,99 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.Suppliers; +import com.skyflow.generated.common.rest.requests.PatchV2VaultsIdRequest; +import com.skyflow.generated.common.rest.resources.authentication.AuthenticationClient; +import com.skyflow.generated.common.rest.resources.filesv2.FilesV2Client; +import com.skyflow.generated.common.rest.resources.guardrailsv2.GuardrailsV2Client; +import com.skyflow.generated.common.rest.resources.stringsv2.StringsV2Client; +import com.skyflow.generated.common.rest.resources.tokenexchange.TokenExchangeClient; +import java.util.Optional; +import java.util.function.Supplier; + +public class ApiClient implements AutoCloseable { + protected final ClientOptions clientOptions; + + private final RawApiClient rawClient; + + protected final Supplier authenticationClient; + + protected final Supplier tokenExchangeClient; + + protected final Supplier filesV2Client; + + protected final Supplier stringsV2Client; + + protected final Supplier guardrailsV2Client; + + public ApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawApiClient(clientOptions); + this.authenticationClient = Suppliers.memoize(() -> new AuthenticationClient(clientOptions)); + this.tokenExchangeClient = Suppliers.memoize(() -> new TokenExchangeClient(clientOptions)); + this.filesV2Client = Suppliers.memoize(() -> new FilesV2Client(clientOptions)); + this.stringsV2Client = Suppliers.memoize(() -> new StringsV2Client(clientOptions)); + this.guardrailsV2Client = Suppliers.memoize(() -> new GuardrailsV2Client(clientOptions)); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawApiClient withRawResponse() { + return this.rawClient; + } + + public void patchV2VaultsId(Optional vaultId) { + this.rawClient.patchV2VaultsId(vaultId).body(); + } + + public void patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, requestOptions).body(); + } + + public void patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + this.rawClient.patchV2VaultsId(vaultId, request).body(); + } + + public void patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).body(); + } + + public AuthenticationClient authentication() { + return this.authenticationClient.get(); + } + + public TokenExchangeClient tokenExchange() { + return this.tokenExchangeClient.get(); + } + + public FilesV2Client filesV2() { + return this.filesV2Client.get(); + } + + public StringsV2Client stringsV2() { + return this.stringsV2Client.get(); + } + + public GuardrailsV2Client guardrailsV2() { + return this.guardrailsV2Client.get(); + } + + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); + } + + public static ApiClientBuilder builder() { + return new ApiClientBuilder(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/ApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/common/rest/ApiClientBuilder.java new file mode 100644 index 00000000..216c95fc --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/ApiClientBuilder.java @@ -0,0 +1,286 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.Environment; +import com.skyflow.generated.common.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import okhttp3.OkHttpClient; + +public class ApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); + + private String token = null; + + private Environment environment = Environment.PRODUCTION; + + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String vaultUrl; + + /** + * Sets token + */ + public ApiClientBuilder token(String token) { + this.token = token; + return this; + } + + public ApiClientBuilder environment(Environment environment) { + this.environment = environment; + return this; + } + + public ApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public ApiClientBuilder timeout(int timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public ApiClientBuilder maxRetries(int maxRetries) { + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public ApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public ApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public ApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public ApiClientBuilder httpClient(OkHttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public ApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public ApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public ApiClientBuilder vaultUrl(String vaultUrl) { + this.vaultUrl = vaultUrl; + return this; + } + + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.vaultUrl != null) { + String _vaultUrl = this.vaultUrl != null ? this.vaultUrl : "{{vault_url}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{vault_url}"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{vault_url}"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{vault_url}"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{vault_url}", _vaultUrl)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + + public ApiClient build() { + validateConfiguration(); + return new ApiClient(buildClientOptions()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClient.java b/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClient.java new file mode 100644 index 00000000..dd931b70 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClient.java @@ -0,0 +1,100 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.Suppliers; +import com.skyflow.generated.common.rest.requests.PatchV2VaultsIdRequest; +import com.skyflow.generated.common.rest.resources.authentication.AsyncAuthenticationClient; +import com.skyflow.generated.common.rest.resources.filesv2.AsyncFilesV2Client; +import com.skyflow.generated.common.rest.resources.guardrailsv2.AsyncGuardrailsV2Client; +import com.skyflow.generated.common.rest.resources.stringsv2.AsyncStringsV2Client; +import com.skyflow.generated.common.rest.resources.tokenexchange.AsyncTokenExchangeClient; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; +import java.util.function.Supplier; + +public class AsyncApiClient implements AutoCloseable { + protected final ClientOptions clientOptions; + + private final AsyncRawApiClient rawClient; + + protected final Supplier authenticationClient; + + protected final Supplier tokenExchangeClient; + + protected final Supplier filesV2Client; + + protected final Supplier stringsV2Client; + + protected final Supplier guardrailsV2Client; + + public AsyncApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawApiClient(clientOptions); + this.authenticationClient = Suppliers.memoize(() -> new AsyncAuthenticationClient(clientOptions)); + this.tokenExchangeClient = Suppliers.memoize(() -> new AsyncTokenExchangeClient(clientOptions)); + this.filesV2Client = Suppliers.memoize(() -> new AsyncFilesV2Client(clientOptions)); + this.stringsV2Client = Suppliers.memoize(() -> new AsyncStringsV2Client(clientOptions)); + this.guardrailsV2Client = Suppliers.memoize(() -> new AsyncGuardrailsV2Client(clientOptions)); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawApiClient withRawResponse() { + return this.rawClient; + } + + public CompletableFuture patchV2VaultsId(Optional vaultId) { + return this.rawClient.patchV2VaultsId(vaultId).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return this.rawClient.patchV2VaultsId(vaultId, request).thenApply(response -> response.body()); + } + + public CompletableFuture patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + return this.rawClient.patchV2VaultsId(vaultId, request, requestOptions).thenApply(response -> response.body()); + } + + public AsyncAuthenticationClient authentication() { + return this.authenticationClient.get(); + } + + public AsyncTokenExchangeClient tokenExchange() { + return this.tokenExchangeClient.get(); + } + + public AsyncFilesV2Client filesV2() { + return this.filesV2Client.get(); + } + + public AsyncStringsV2Client stringsV2() { + return this.stringsV2Client.get(); + } + + public AsyncGuardrailsV2Client guardrailsV2() { + return this.guardrailsV2Client.get(); + } + + /** + * Releases resources owned by this client. See {@code ClientOptions.close()} for what is + * and is not released. + */ + @Override + public void close() { + this.clientOptions.close(); + } + + public static AsyncApiClientBuilder builder() { + return new AsyncApiClientBuilder(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClientBuilder.java new file mode 100644 index 00000000..c39617c4 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/AsyncApiClientBuilder.java @@ -0,0 +1,286 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.Environment; +import com.skyflow.generated.common.rest.core.LogConfig; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import okhttp3.OkHttpClient; + +public class AsyncApiClientBuilder { + private Optional timeout = Optional.empty(); + + private Optional maxRetries = Optional.empty(); + + private Optional initialRetryDelayMillis = Optional.empty(); + + private Optional maxRetryDelayMillis = Optional.empty(); + + private Optional retryJitterFactor = Optional.empty(); + + private final Map customHeaders = new HashMap<>(); + + private String token = null; + + private Environment environment = Environment.PRODUCTION; + + private OkHttpClient httpClient; + + private Optional logging = Optional.empty(); + + private String vaultUrl; + + /** + * Sets token + */ + public AsyncApiClientBuilder token(String token) { + this.token = token; + return this; + } + + public AsyncApiClientBuilder environment(Environment environment) { + this.environment = environment; + return this; + } + + public AsyncApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public AsyncApiClientBuilder timeout(int timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public AsyncApiClientBuilder maxRetries(int maxRetries) { + this.maxRetries = Optional.of(maxRetries); + return this; + } + + /** + * Sets the initial delay (in milliseconds) used for exponential backoff between retries. Defaults to 1000 milliseconds. + */ + public AsyncApiClientBuilder initialRetryDelayMillis(long initialRetryDelayMillis) { + this.initialRetryDelayMillis = Optional.of(initialRetryDelayMillis); + return this; + } + + /** + * Sets the maximum delay (in milliseconds) between retries. Defaults to 60000 milliseconds. + */ + public AsyncApiClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) { + this.maxRetryDelayMillis = Optional.of(maxRetryDelayMillis); + return this; + } + + /** + * Sets the jitter factor (between 0 and 1) applied to retry delays. Defaults to 0.2. + */ + public AsyncApiClientBuilder retryJitterFactor(double retryJitterFactor) { + this.retryJitterFactor = Optional.of(retryJitterFactor); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + /** + * Configure logging for the SDK. Silent by default — no log output unless explicitly configured. + */ + public AsyncApiClientBuilder logging(LogConfig logging) { + this.logging = Optional.of(logging); + return this; + } + + /** + * Add a custom header to be sent with all requests. + * For headers that need to be computed dynamically or conditionally, use the setAdditional() method override instead. + * + * @param name The header name + * @param value The header value + * @return This builder for method chaining + */ + public AsyncApiClientBuilder addHeader(String name, String value) { + this.customHeaders.put(name, value); + return this; + } + + public AsyncApiClientBuilder vaultUrl(String vaultUrl) { + this.vaultUrl = vaultUrl; + return this; + } + + protected ClientOptions buildClientOptions() { + ClientOptions.Builder builder = ClientOptions.builder(); + setEnvironment(builder); + setAuthentication(builder); + setHttpClient(builder); + setTimeouts(builder); + setRetries(builder); + setLogging(builder); + for (Map.Entry header : this.customHeaders.entrySet()) { + builder.addHeader(header.getKey(), header.getValue()); + } + setAdditional(builder); + return builder.build(); + } + + /** + * Sets the environment configuration for the client. + * Override this method to modify URLs or add environment-specific logic. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setEnvironment(ClientOptions.Builder builder) { + if (this.vaultUrl != null) { + String _vaultUrl = this.vaultUrl != null ? this.vaultUrl : "{{vault_url}}"; + String _urlTemplate = null; + if (this.environment == null) { + _urlTemplate = "https://{vault_url}"; + } else if (this.environment.equals(Environment.PRODUCTION)) { + _urlTemplate = "https://{vault_url}"; + } else if (this.environment.equals(Environment.SANDBOX)) { + _urlTemplate = "https://{vault_url}"; + } + if (_urlTemplate != null) { + this.environment = Environment.custom(_urlTemplate.replace("{vault_url}", _vaultUrl)); + } + } + builder.environment(this.environment); + } + + /** + * Override this method to customize authentication. + * This method is called during client options construction to set up authentication headers. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAuthentication(ClientOptions.Builder builder) {
+     *     super.setAuthentication(builder); // Keep existing auth
+     *     builder.addHeader("X-API-Key", this.apiKey);
+     * }
+     * }
+ */ + protected void setAuthentication(ClientOptions.Builder builder) { + if (this.token != null) { + builder.addHeader("Authorization", "Bearer " + this.token); + } + } + + /** + * Sets the request timeout configuration. + * Override this method to customize timeout behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setTimeouts(ClientOptions.Builder builder) { + if (this.timeout.isPresent()) { + builder.timeout(this.timeout.get()); + } + } + + /** + * Sets the retry configuration for failed requests. + * Override this method to implement custom retry strategies. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setRetries(ClientOptions.Builder builder) { + if (this.maxRetries.isPresent()) { + builder.maxRetries(this.maxRetries.get()); + } + if (this.initialRetryDelayMillis.isPresent()) { + builder.initialRetryDelayMillis(this.initialRetryDelayMillis.get()); + } + if (this.maxRetryDelayMillis.isPresent()) { + builder.maxRetryDelayMillis(this.maxRetryDelayMillis.get()); + } + if (this.retryJitterFactor.isPresent()) { + builder.retryJitterFactor(this.retryJitterFactor.get()); + } + } + + /** + * Sets the OkHttp client configuration. + * Override this method to customize HTTP client behavior (interceptors, connection pools, etc). + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setHttpClient(ClientOptions.Builder builder) { + if (this.httpClient != null) { + builder.httpClient(this.httpClient); + } + } + + /** + * Sets the logging configuration for the SDK. + * Override this method to customize logging behavior. + * + * @param builder The ClientOptions.Builder to configure + */ + protected void setLogging(ClientOptions.Builder builder) { + if (this.logging.isPresent()) { + builder.logging(this.logging.get()); + } + } + + /** + * Override this method to add any additional configuration to the client. + * This method is called at the end of the configuration chain, allowing you to add + * custom headers, modify settings, or perform any other client customization. + * + * @param builder The ClientOptions.Builder to configure + * + * Example: + *
{@code
+     * @Override
+     * protected void setAdditional(ClientOptions.Builder builder) {
+     *     builder.addHeader("X-Request-ID", () -> UUID.randomUUID().toString());
+     *     builder.addHeader("X-Client-Version", "1.0.0");
+     * }
+     * }
+ */ + protected void setAdditional(ClientOptions.Builder builder) {} + + /** + * Override this method to add custom validation logic before the client is built. + * This method is called at the beginning of the build() method to ensure the configuration is valid. + * Throw an exception to prevent client creation if validation fails. + * + * Example: + *
{@code
+     * @Override
+     * protected void validateConfiguration() {
+     *     super.validateConfiguration(); // Run parent validations
+     *     if (tenantId == null || tenantId.isEmpty()) {
+     *         throw new IllegalStateException("tenantId is required");
+     *     }
+     * }
+     * }
+ */ + protected void validateConfiguration() {} + + public AsyncApiClient build() { + validateConfiguration(); + return new AsyncApiClient(buildClientOptions()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/AsyncRawApiClient.java b/common/src/main/java/com/skyflow/generated/common/rest/AsyncRawApiClient.java new file mode 100644 index 00000000..369c255e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/AsyncRawApiClient.java @@ -0,0 +1,110 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawApiClient { + protected final ClientOptions clientOptions; + + public AsyncRawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public CompletableFuture> patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public CompletableFuture> patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + 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 ApiClientHttpResponse<>(null, response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/RawApiClient.java b/common/src/main/java/com/skyflow/generated/common/rest/RawApiClient.java new file mode 100644 index 00000000..6777a1ca --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/RawApiClient.java @@ -0,0 +1,90 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.requests.PatchV2VaultsIdRequest; +import java.io.IOException; +import java.util.Optional; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawApiClient { + protected final ClientOptions clientOptions; + + public RawApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build()); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, RequestOptions requestOptions) { + return patchV2VaultsId(vaultId, PatchV2VaultsIdRequest.builder().build(), requestOptions); + } + + public ApiClientHttpResponse patchV2VaultsId(Optional vaultId, PatchV2VaultsIdRequest request) { + return patchV2VaultsId(vaultId, request, null); + } + + public ApiClientHttpResponse patchV2VaultsId( + Optional vaultId, PatchV2VaultsIdRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults"); + if (vaultId.isPresent()) { + httpUrl.addPathSegment(vaultId.get()); + } + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + Request.Builder _requestBuilder = new Request.Builder() + .url(httpUrl.build()) + .method("PATCH", RequestBody.create("", null)) + .headers(Headers.of(clientOptions.headers(requestOptions))); + 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 ApiClientHttpResponse<>(null, response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientApiException.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientApiException.java index d864c404..ae75156d 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientApiException.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientApiException.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.ArrayList; import java.util.HashMap; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientException.java similarity index 88% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientException.java index f08afa2e..fdc44e9b 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientException.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; /** * This class serves as the base exception for all errors in the SDK. diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientHttpResponse.java similarity index 94% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientHttpResponse.java index 8a28d22f..aeefd9b6 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ApiClientHttpResponse.java @@ -1,14 +1,13 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.Response; +package com.skyflow.generated.common.rest.core; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import okhttp3.Response; public final class ApiClientHttpResponse { diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ClientOptions.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ClientOptions.java index cf61d5db..da903b21 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ClientOptions.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ClientOptions.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ConsoleLogger.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ConsoleLogger.java index e4feb843..dc14c66c 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ConsoleLogger.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ConsoleLogger.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.logging.Level; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java b/common/src/main/java/com/skyflow/generated/common/rest/core/DateTimeDeserializer.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/DateTimeDeserializer.java index f2c9053a..c4a94049 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/DateTimeDeserializer.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/DateTimeDeserializer.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java b/common/src/main/java/com/skyflow/generated/common/rest/core/DoubleSerializer.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/DoubleSerializer.java index 635869a6..6ede9fd7 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/DoubleSerializer.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/DoubleSerializer.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Environment.java similarity index 80% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/Environment.java index 098667c0..00c25f17 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Environment.java @@ -1,12 +1,12 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; public final class Environment { - public static final Environment PRODUCTION = new Environment("https://manage.skyflowapis.com"); + public static final Environment PRODUCTION = new Environment("https://%7B%7Bvault_url%7D%7D"); - public static final Environment SANDBOX = new Environment("https://manage.skyflowapis-preview.com"); + public static final Environment SANDBOX = new Environment("https://%7B%7Bvault_url%7D%7D"); private final String url; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java b/common/src/main/java/com/skyflow/generated/common/rest/core/FileStream.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/FileStream.java index 0e878ed3..760b574e 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/FileStream.java @@ -1,15 +1,14 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; import org.jetbrains.annotations.Nullable; -import java.io.InputStream; -import java.util.Objects; - /** * Represents a file stream with associated metadata for file uploads. */ diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ILogger.java similarity index 95% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ILogger.java index 0df7a4f5..340277a0 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ILogger.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ILogger.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; /** * Interface for custom logger implementations. diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java b/common/src/main/java/com/skyflow/generated/common/rest/core/InputStreamRequestBody.java similarity index 90% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/InputStreamRequestBody.java index a94faec9..d22d2d05 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/InputStreamRequestBody.java @@ -1,20 +1,18 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; -import okhttp3.internal.Util; import okio.BufferedSink; import okio.Okio; import okio.Source; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; - /** * A custom implementation of OkHttp's RequestBody that wraps an InputStream. * This class allows streaming of data from an InputStream directly to an HTTP request body, @@ -69,12 +67,8 @@ public long contentLength() throws IOException { */ @Override public void writeTo(BufferedSink sink) throws IOException { - Source source = null; - try { - source = Okio.source(inputStream); + try (Source source = Okio.source(inputStream)) { sink.writeAll(source); - } finally { - Util.closeQuietly(Objects.requireNonNull(source)); } } } diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java b/common/src/main/java/com/skyflow/generated/common/rest/core/LogConfig.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/LogConfig.java index e613616b..8db7fe7a 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogConfig.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/LogConfig.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; /** * Configuration for SDK logging. diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java b/common/src/main/java/com/skyflow/generated/common/rest/core/LogLevel.java similarity index 94% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/LogLevel.java index b37806c0..a6b8775e 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/LogLevel.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/LogLevel.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; /** * Log levels for SDK logging configuration. diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Logger.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/Logger.java index 19a9d1fe..dd98e661 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/Logger.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Logger.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; /** * SDK logger that filters messages based on level and silent mode. diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java b/common/src/main/java/com/skyflow/generated/common/rest/core/LoggingInterceptor.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/LoggingInterceptor.java index 33c1d6aa..9e87fafb 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/LoggingInterceptor.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/LoggingInterceptor.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.io.IOException; import java.util.Arrays; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java b/common/src/main/java/com/skyflow/generated/common/rest/core/MediaTypes.java similarity index 84% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/MediaTypes.java index d4374647..a4b5d490 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/MediaTypes.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; import okhttp3.MediaType; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Nullable.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/Nullable.java index efabe806..c62bfb7e 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Nullable.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.Optional; import java.util.function.Function; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java b/common/src/main/java/com/skyflow/generated/common/rest/core/NullableNonemptyFilter.java similarity index 67% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/NullableNonemptyFilter.java index dd32d66c..27a91ec4 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/NullableNonemptyFilter.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.Optional; @@ -14,6 +14,9 @@ public boolean equals(Object o) { } private boolean isOptionalEmpty(Object o) { - return o instanceof Optional && !((Optional) o).isPresent(); + if (o instanceof Optional) { + return !((Optional) o).isPresent(); + } + return false; } } diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ObjectMappers.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ObjectMappers.java index 7b4660ad..1d99d774 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ObjectMappers.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ObjectMappers.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java b/common/src/main/java/com/skyflow/generated/common/rest/core/QueryStringMapper.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/QueryStringMapper.java index ba2dadc4..6a5091f9 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/QueryStringMapper.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/QueryStringMapper.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java b/common/src/main/java/com/skyflow/generated/common/rest/core/RequestOptions.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/RequestOptions.java index 7f5ccea0..a3db26e4 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/RequestOptions.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/RequestOptions.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyInputStream.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyInputStream.java index 1d0a9110..bcb4fc33 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyInputStream.java @@ -1,12 +1,11 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.Response; +package com.skyflow.generated.common.rest.core; import java.io.FilterInputStream; import java.io.IOException; +import okhttp3.Response; /** * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyReader.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyReader.java index f4dfb17b..3d70a739 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseBodyReader.java @@ -1,12 +1,11 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; - -import okhttp3.Response; +package com.skyflow.generated.common.rest.core; import java.io.FilterReader; import java.io.IOException; +import okhttp3.Response; /** * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseDecompressionInterceptor.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/ResponseDecompressionInterceptor.java index 9988a7fc..a9fe6502 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ResponseDecompressionInterceptor.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/ResponseDecompressionInterceptor.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.io.IOException; import java.util.zip.Inflater; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java b/common/src/main/java/com/skyflow/generated/common/rest/core/RetryInterceptor.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/RetryInterceptor.java index c46a526e..17613132 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/RetryInterceptor.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/RetryInterceptor.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.core; +package com.skyflow.generated.common.rest.core; import java.io.IOException; import java.time.Duration; diff --git a/common/src/main/java/com/skyflow/generated/common/rest/core/Rfc2822DateTimeDeserializer.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Rfc2822DateTimeDeserializer.java new file mode 100644 index 00000000..15272081 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Rfc2822DateTimeDeserializer.java @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import java.io.IOException; +import java.time.OffsetDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +/** + * Custom deserializer that handles converting RFC 2822 (RFC 1123) dates into {@link OffsetDateTime} objects. + * This is used for fields with format "date-time-rfc-2822", such as Twilio's dateCreated, dateSent, dateUpdated. + */ +public class Rfc2822DateTimeDeserializer extends JsonDeserializer { + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + String raw = parser.getValueAsString(); + return ZonedDateTime.parse(raw, DateTimeFormatter.RFC_1123_DATE_TIME).toOffsetDateTime(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/core/SseEvent.java b/common/src/main/java/com/skyflow/generated/common/rest/core/SseEvent.java new file mode 100644 index 00000000..f0ccf071 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/SseEvent.java @@ -0,0 +1,114 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.core; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Objects; +import java.util.Optional; + +/** + * Represents a Server-Sent Event with all standard fields. + * Used for event-level discrimination where the discriminator is at the SSE envelope level. + * + * @param The type of the data field + */ +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonIgnoreProperties(ignoreUnknown = true) +public final class SseEvent { + private final String event; + private final T data; + private final String id; + private final Long retry; + + private SseEvent(String event, T data, String id, Long retry) { + this.event = event; + this.data = data; + this.id = id; + this.retry = retry; + } + + @JsonProperty("event") + public Optional getEvent() { + return Optional.ofNullable(event); + } + + @JsonProperty("data") + public T getData() { + return data; + } + + @JsonProperty("id") + public Optional getId() { + return Optional.ofNullable(id); + } + + @JsonProperty("retry") + public Optional getRetry() { + return Optional.ofNullable(retry); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SseEvent sseEvent = (SseEvent) o; + return Objects.equals(event, sseEvent.event) + && Objects.equals(data, sseEvent.data) + && Objects.equals(id, sseEvent.id) + && Objects.equals(retry, sseEvent.retry); + } + + @Override + public int hashCode() { + return Objects.hash(event, data, id, retry); + } + + @Override + public String toString() { + return "SseEvent{" + "event='" + + event + '\'' + ", data=" + + data + ", id='" + + id + '\'' + ", retry=" + + retry + '}'; + } + + public static Builder builder() { + return new Builder<>(); + } + + public static final class Builder { + private String event; + private T data; + private String id; + private Long retry; + + private Builder() {} + + public Builder event(String event) { + this.event = event; + return this; + } + + public Builder data(T data) { + this.data = data; + return this; + } + + public Builder id(String id) { + this.id = id; + return this; + } + + public Builder retry(Long retry) { + this.retry = retry; + return this; + } + + public SseEvent build() { + return new SseEvent<>(event, data, id, retry); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/core/SseEventParser.java b/common/src/main/java/com/skyflow/generated/common/rest/core/SseEventParser.java new file mode 100644 index 00000000..6380f93e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/SseEventParser.java @@ -0,0 +1,228 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.core; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.core.type.TypeReference; +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +/** + * Utility class for parsing Server-Sent Events with support for discriminated unions. + *

+ * Handles two discrimination patterns: + *

    + *
  1. Data-level discrimination: The discriminator (e.g., 'type') is inside the JSON data payload. + * Jackson's polymorphic deserialization handles this automatically.
  2. + *
  3. Event-level discrimination: The discriminator (e.g., 'event') is at the SSE envelope level. + * This requires constructing the full SSE envelope for Jackson to process.
  4. + *
+ */ +public final class SseEventParser { + + private static final Set SSE_ENVELOPE_FIELDS = new HashSet<>(Arrays.asList("event", "data", "id", "retry")); + + private SseEventParser() { + // Utility class + } + + /** + * Parse an SSE event using event-level discrimination. + *

+ * Constructs the full SSE envelope object with event, data, id, and retry fields, + * then deserializes it to the target union type. + * + * @param eventType The SSE event type (from event: field) + * @param data The SSE data content (from data: field) + * @param id The SSE event ID (from id: field), may be null + * @param retry The SSE retry value (from retry: field), may be null + * @param unionClass The target union class + * @param discriminatorProperty The property name used for discrimination (e.g., "event") + * @param The target type + * @return The deserialized object + */ + public static T parseEventLevelUnion( + String eventType, String data, String id, Long retry, Class unionClass, String discriminatorProperty) { + try { + // Determine if data should be parsed as JSON based on the variant's expected type + Object parsedData = parseDataForVariant(eventType, data, unionClass, discriminatorProperty); + + // Construct the SSE envelope object + Map envelope = new HashMap<>(); + envelope.put(discriminatorProperty, eventType); + envelope.put("data", parsedData); + if (id != null) { + envelope.put("id", id); + } + if (retry != null) { + envelope.put("retry", retry); + } + + // Serialize to JSON and deserialize to target type + String envelopeJson = ObjectMappers.JSON_MAPPER.writeValueAsString(envelope); + return ObjectMappers.JSON_MAPPER.readValue(envelopeJson, unionClass); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE event with event-level discrimination", e); + } + } + + /** + * Parse an SSE event using data-level discrimination. + *

+ * Simply parses the data field as JSON and deserializes it to the target type. + * Jackson's polymorphic deserialization handles the discrimination automatically. + * + * @param data The SSE data content (from data: field) + * @param valueType The target type + * @param The target type + * @return The deserialized object + */ + public static T parseDataLevelUnion(String data, Class valueType) { + try { + return ObjectMappers.JSON_MAPPER.readValue(data, valueType); + } catch (Exception e) { + throw new RuntimeException("Failed to parse SSE data with data-level discrimination", e); + } + } + + /** + * Determines if the given discriminator property indicates event-level discrimination. + * Event-level discrimination occurs when the discriminator is an SSE envelope field. + * + * @param discriminatorProperty The discriminator property name + * @return true if event-level discrimination, false otherwise + */ + public static boolean isEventLevelDiscrimination(String discriminatorProperty) { + return SSE_ENVELOPE_FIELDS.contains(discriminatorProperty); + } + + /** + * Attempts to find the discriminator property from the union class's Jackson annotations. + * + * @param unionClass The union class to inspect + * @return The discriminator property name, or empty if not found + */ + public static Optional findDiscriminatorProperty(Class unionClass) { + try { + // Look for JsonTypeInfo on the class itself + JsonTypeInfo typeInfo = unionClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + + // Look for inner Value interface with JsonTypeInfo + for (Class innerClass : unionClass.getDeclaredClasses()) { + typeInfo = innerClass.getAnnotation(JsonTypeInfo.class); + if (typeInfo != null && !typeInfo.property().isEmpty()) { + return Optional.of(typeInfo.property()); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return Optional.empty(); + } + + /** + * Parse the data field based on what the matching variant expects. + * If the variant expects a String for its data field, returns the raw string. + * Otherwise, parses the data as JSON. + */ + private static Object parseDataForVariant( + String eventType, String data, Class unionClass, String discriminatorProperty) { + if (data == null || data.isEmpty()) { + return data; + } + + try { + // Try to find the variant class that matches this event type + Class variantClass = findVariantClass(unionClass, eventType, discriminatorProperty); + if (variantClass != null) { + // Check if the variant expects a String for the data field + Field dataField = findField(variantClass, "data"); + if (dataField != null && String.class.equals(dataField.getType())) { + // Variant expects String - return raw data + return data; + } + } + + // Try to parse as JSON + return ObjectMappers.JSON_MAPPER.readValue(data, new TypeReference>() {}); + } catch (Exception e) { + // If JSON parsing fails, return as string + return data; + } + } + + /** + * Find the variant class that matches the given discriminator value. + */ + private static Class findVariantClass( + Class unionClass, String discriminatorValue, String discriminatorProperty) { + try { + // Look for JsonSubTypes annotation + JsonSubTypes subTypes = findJsonSubTypes(unionClass); + if (subTypes == null) { + return null; + } + + for (JsonSubTypes.Type subType : subTypes.value()) { + JsonTypeName typeName = subType.value().getAnnotation(JsonTypeName.class); + if (typeName != null && typeName.value().equals(discriminatorValue)) { + return subType.value(); + } + // Also check the name attribute of @JsonSubTypes.Type + if (subType.name().equals(discriminatorValue)) { + return subType.value(); + } + } + } catch (Exception e) { + // Ignore reflection errors + } + return null; + } + + /** + * Find JsonSubTypes annotation on the class or its inner classes. + */ + private static JsonSubTypes findJsonSubTypes(Class unionClass) { + // Check the class itself + JsonSubTypes subTypes = unionClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + + // Check inner classes (for Fern-style unions with inner Value interface) + for (Class innerClass : unionClass.getDeclaredClasses()) { + subTypes = innerClass.getAnnotation(JsonSubTypes.class); + if (subTypes != null) { + return subTypes; + } + } + return null; + } + + /** + * Find a field by name in a class, including private fields. + */ + private static Field findField(Class clazz, String fieldName) { + try { + return clazz.getDeclaredField(fieldName); + } catch (NoSuchFieldException e) { + // Check superclass + Class superClass = clazz.getSuperclass(); + if (superClass != null && superClass != Object.class) { + return findField(superClass, fieldName); + } + return null; + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/core/Stream.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Stream.java new file mode 100644 index 00000000..1586718a --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Stream.java @@ -0,0 +1,513 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.core; + +import java.io.Closeable; +import java.io.IOException; +import java.io.Reader; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Scanner; + +/** + * The {@code Stream} class implements {@link Iterable} to provide a simple mechanism for reading and parsing + * objects of a given type from data streamed via a {@link Reader} using a specified delimiter. + *

+ * {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a + * {@code Scanner} to block during iteration if the next object is not available. + * Iterable stream for parsing JSON and Server-Sent Events (SSE) data. + * Supports both newline-delimited JSON and SSE with optional stream termination. + * + * @param The type of objects in the stream. + */ +public final class Stream implements Iterable, Closeable { + + private static final String NEWLINE = "\n"; + private static final String DATA_PREFIX = "data:"; + + public enum StreamType { + JSON, + SSE, + SSE_EVENT_DISCRIMINATED + } + + private final Class valueType; + private final Scanner scanner; + private final StreamType streamType; + private final String messageTerminator; + private final String streamTerminator; + private final Reader sseReader; + private final String discriminatorProperty; + private boolean isClosed = false; + + /** + * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. + * + * @param valueType The class of the objects in the stream. + * @param reader The reader that provides the streamed data. + * @param delimiter The delimiter used to separate elements in the stream. + */ + public Stream(Class valueType, Reader reader, String delimiter) { + this.valueType = valueType; + this.scanner = new Scanner(reader).useDelimiter(delimiter); + this.streamType = StreamType.JSON; + this.messageTerminator = delimiter; + this.streamTerminator = null; + this.sseReader = null; + this.discriminatorProperty = null; + } + + private Stream(Class valueType, StreamType type, Reader reader, String terminator) { + this(valueType, type, reader, terminator, null); + } + + private Stream( + Class valueType, StreamType type, Reader reader, String terminator, String discriminatorProperty) { + this.valueType = valueType; + this.streamType = type; + this.discriminatorProperty = discriminatorProperty; + if (type == StreamType.JSON) { + this.scanner = new Scanner(reader).useDelimiter(terminator); + this.messageTerminator = terminator; + this.streamTerminator = null; + this.sseReader = null; + } else { + this.scanner = null; + this.messageTerminator = NEWLINE; + this.streamTerminator = terminator; + this.sseReader = reader; + } + } + + public static Stream fromJson(Class valueType, Reader reader, String delimiter) { + return new Stream<>(valueType, reader, delimiter); + } + + public static Stream fromJson(Class valueType, Reader reader) { + return new Stream<>(valueType, reader, NEWLINE); + } + + public static Stream fromSse(Class valueType, Reader sseReader) { + return new Stream<>(valueType, StreamType.SSE, sseReader, null); + } + + public static Stream fromSse(Class valueType, Reader sseReader, String streamTerminator) { + return new Stream<>(valueType, StreamType.SSE, sseReader, streamTerminator); + } + + /** + * Creates a stream from SSE data with event-level discrimination support. + * Use this when the SSE payload is a discriminated union where the discriminator + * is an SSE envelope field (e.g., 'event'). + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty) { + return new Stream<>(valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, null, discriminatorProperty); + } + + /** + * Creates a stream from SSE data with event-level discrimination support and a stream terminator. + * + * @param valueType The class of the objects in the stream. + * @param sseReader The reader that provides the SSE data. + * @param discriminatorProperty The property name used for discrimination (e.g., "event"). + * @param streamTerminator The terminator string that signals end of stream (e.g., "[DONE]"). + * @param The type of objects in the stream. + * @return A new Stream instance configured for SSE with event-level discrimination. + */ + public static Stream fromSseWithEventDiscrimination( + Class valueType, Reader sseReader, String discriminatorProperty, String streamTerminator) { + return new Stream<>( + valueType, StreamType.SSE_EVENT_DISCRIMINATED, sseReader, streamTerminator, discriminatorProperty); + } + + @Override + public void close() throws IOException { + if (!isClosed) { + isClosed = true; + if (scanner != null) { + scanner.close(); + } + if (sseReader != null) { + sseReader.close(); + } + } + } + + private boolean isStreamClosed() { + return isClosed; + } + + /** + * Returns an iterator over the elements in this stream that blocks during iteration when the next object is + * not yet available. + * + * @return An iterator that can be used to traverse the elements in the stream. + */ + @Override + public Iterator iterator() { + switch (streamType) { + case SSE: + return new SSEIterator(); + case SSE_EVENT_DISCRIMINATED: + return new SSEEventDiscriminatedIterator(); + case JSON: + default: + return new JsonIterator(); + } + } + + private final class JsonIterator implements Iterator { + + /** + * Returns {@code true} if there are more elements in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return {@code true} if there are more elements, {@code false} otherwise. + */ + @Override + public boolean hasNext() { + if (isStreamClosed()) { + return false; + } + return scanner.hasNext(); + } + + /** + * Returns the next element in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return The next element in the stream. + * @throws NoSuchElementException If there are no more elements in the stream. + */ + @Override + public T next() { + if (isStreamClosed()) { + throw new NoSuchElementException("Stream is closed"); + } + + if (!scanner.hasNext()) { + throw new NoSuchElementException(); + } else { + try { + T parsedResponse = + ObjectMappers.JSON_MAPPER.readValue(scanner.next().trim(), valueType); + return parsedResponse; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + } + + private final class SSEIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + + private SSEIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; + } + + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0) { + try { + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + // Event ID field (ignored) + } else if (line.startsWith("retry:")) { + // Retry field (ignored) + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + if (eventDataBuffer.length() > 0) { + try { + nextItem = ObjectMappers.JSON_MAPPER.readValue(eventDataBuffer.toString(), valueType); + hasNextItem = true; + eventDataBuffer.setLength(0); + currentEventType = null; + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + eventDataBuffer.setLength(0); + currentEventType = null; + } + } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; + } + } + } + + /** + * Iterator for SSE streams with event-level discrimination. + * Uses SseEventParser to construct the full SSE envelope for Jackson deserialization. + */ + private final class SSEEventDiscriminatedIterator implements Iterator { + private Scanner sseScanner; + private T nextItem; + private boolean hasNextItem = false; + private boolean endOfStream = false; + private StringBuilder eventDataBuffer = new StringBuilder(); + private String currentEventType = null; + private String currentEventId = null; + private Long currentRetry = null; + + private SSEEventDiscriminatedIterator() { + if (sseReader != null && !isStreamClosed()) { + this.sseScanner = new Scanner(sseReader); + } else { + this.endOfStream = true; + } + } + + @Override + public boolean hasNext() { + if (isStreamClosed() || endOfStream) { + return false; + } + + if (hasNextItem) { + return true; + } + + return readNextMessage(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException("No more elements in stream"); + } + + T result = nextItem; + nextItem = null; + hasNextItem = false; + return result; + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + private boolean readNextMessage() { + if (sseScanner == null || isStreamClosed()) { + endOfStream = true; + return false; + } + + try { + while (sseScanner.hasNextLine()) { + String line = sseScanner.nextLine(); + + if (line.trim().isEmpty()) { + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + // Use SseEventParser for event-level discrimination + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse SSE event: " + parseEx.getMessage()); + resetEventState(); + continue; + } + } + continue; + } + + if (line.startsWith(DATA_PREFIX)) { + String dataContent = line.substring(DATA_PREFIX.length()); + if (dataContent.startsWith(" ")) { + dataContent = dataContent.substring(1); + } + + if (eventDataBuffer.length() == 0 + && streamTerminator != null + && dataContent.trim().equals(streamTerminator)) { + endOfStream = true; + return false; + } + + if (eventDataBuffer.length() > 0) { + eventDataBuffer.append('\n'); + } + eventDataBuffer.append(dataContent); + } else if (line.startsWith("event:")) { + String eventValue = line.length() > 6 ? line.substring(6) : ""; + if (eventValue.startsWith(" ")) { + eventValue = eventValue.substring(1); + } + currentEventType = eventValue; + } else if (line.startsWith("id:")) { + String idValue = line.length() > 3 ? line.substring(3) : ""; + if (idValue.startsWith(" ")) { + idValue = idValue.substring(1); + } + currentEventId = idValue; + } else if (line.startsWith("retry:")) { + String retryValue = line.length() > 6 ? line.substring(6) : ""; + if (retryValue.startsWith(" ")) { + retryValue = retryValue.substring(1); + } + try { + currentRetry = Long.parseLong(retryValue.trim()); + } catch (NumberFormatException e) { + // Ignore invalid retry values + } + } else if (line.startsWith(":")) { + // Comment line (ignored) + } + } + + // Handle any remaining buffered data at end of stream + if (eventDataBuffer.length() > 0 || currentEventType != null) { + try { + nextItem = SseEventParser.parseEventLevelUnion( + currentEventType, + eventDataBuffer.toString(), + currentEventId, + currentRetry, + valueType, + discriminatorProperty); + hasNextItem = true; + resetEventState(); + return true; + } catch (Exception parseEx) { + System.err.println("Failed to parse final SSE event: " + parseEx.getMessage()); + resetEventState(); + } + } + + endOfStream = true; + return false; + + } catch (Exception e) { + System.err.println("Failed to parse SSE stream: " + e.getMessage()); + endOfStream = true; + return false; + } + } + + private void resetEventState() { + eventDataBuffer.setLength(0); + currentEventType = null; + currentEventId = null; + currentRetry = null; + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java b/common/src/main/java/com/skyflow/generated/common/rest/core/Suppliers.java similarity index 92% rename from common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java rename to common/src/main/java/com/skyflow/generated/common/rest/core/Suppliers.java index d3ab5e53..a648cd99 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/core/Suppliers.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.core; +package com.skyflow.generated.common.rest.core; import java.util.Objects; import java.util.concurrent.atomic.AtomicReference; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java b/common/src/main/java/com/skyflow/generated/common/rest/errors/BadRequestError.java similarity index 80% rename from common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java rename to common/src/main/java/com/skyflow/generated/common/rest/errors/BadRequestError.java index 7858ef63..1687be40 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/errors/BadRequestError.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/errors/BadRequestError.java @@ -1,10 +1,10 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.errors; +package com.skyflow.generated.common.rest.errors; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.types.ErrorResponse; import okhttp3.Response; public final class BadRequestError extends ApiClientApiException { diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java b/common/src/main/java/com/skyflow/generated/common/rest/errors/InternalServerError.java similarity index 80% rename from common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java rename to common/src/main/java/com/skyflow/generated/common/rest/errors/InternalServerError.java index c21d7766..ef3a1b46 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/errors/InternalServerError.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/errors/InternalServerError.java @@ -1,10 +1,10 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.errors; +package com.skyflow.generated.common.rest.errors; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.types.ErrorResponse; import okhttp3.Response; public final class InternalServerError extends ApiClientApiException { diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java b/common/src/main/java/com/skyflow/generated/common/rest/errors/NotFoundError.java similarity index 55% rename from common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java rename to common/src/main/java/com/skyflow/generated/common/rest/errors/NotFoundError.java index 60a1771c..bc8af4a3 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/errors/NotFoundError.java @@ -1,25 +1,24 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.errors; +package com.skyflow.generated.common.rest.errors; -import com.skyflow.generated.auth.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.types.ErrorResponse; import okhttp3.Response; -import java.util.Map; - public final class NotFoundError extends ApiClientApiException { /** * The body of the response that triggered the exception. */ - private final Map body; + private final ErrorResponse body; - public NotFoundError(Map body) { + public NotFoundError(ErrorResponse body) { super("NotFoundError", 404, body); this.body = body; } - public NotFoundError(Map body, Response rawResponse) { + public NotFoundError(ErrorResponse body, Response rawResponse) { super("NotFoundError", 404, body, rawResponse); this.body = body; } @@ -27,8 +26,8 @@ public NotFoundError(Map body, Response rawResponse) { /** * @return the body */ - @Override - public Map body() { + @java.lang.Override + public ErrorResponse body() { return this.body; } } diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java b/common/src/main/java/com/skyflow/generated/common/rest/errors/UnauthorizedError.java similarity index 80% rename from common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java rename to common/src/main/java/com/skyflow/generated/common/rest/errors/UnauthorizedError.java index 63754690..0531cc88 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/errors/UnauthorizedError.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/errors/UnauthorizedError.java @@ -1,10 +1,10 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.errors; +package com.skyflow.generated.common.rest.errors; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.types.ErrorResponse; import okhttp3.Response; public final class UnauthorizedError extends ApiClientApiException { diff --git a/common/src/main/java/com/skyflow/generated/common/rest/requests/PatchV2VaultsIdRequest.java b/common/src/main/java/com/skyflow/generated/common/rest/requests/PatchV2VaultsIdRequest.java new file mode 100644 index 00000000..8ab5b295 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/requests/PatchV2VaultsIdRequest.java @@ -0,0 +1,69 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.requests; + +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.databind.annotation.JsonDeserialize; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = PatchV2VaultsIdRequest.Builder.class) +public final class PatchV2VaultsIdRequest { + private final Map additionalProperties; + + private PatchV2VaultsIdRequest(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof PatchV2VaultsIdRequest; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @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 { + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(PatchV2VaultsIdRequest other) { + return this; + } + + public PatchV2VaultsIdRequest build() { + return new PatchV2VaultsIdRequest(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/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncAuthenticationClient.java new file mode 100644 index 00000000..928f9c82 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncAuthenticationClient.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.authentication; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.authentication.requests.GetAuthTokenRequest; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; +import java.util.concurrent.CompletableFuture; + +public class AsyncAuthenticationClient { + protected final ClientOptions clientOptions; + + private final AsyncRawAuthenticationClient rawClient; + + public AsyncAuthenticationClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawAuthenticationClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawAuthenticationClient withRawResponse() { + return this.rawClient; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture getBearerToken(GetAuthTokenRequest request) { + return this.rawClient.getBearerToken(request).thenApply(response -> response.body()); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture getBearerToken( + GetAuthTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.getBearerToken(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncRawAuthenticationClient.java similarity index 51% rename from common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncRawAuthenticationClient.java index 56a47dc0..e4f780f4 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AsyncRawAuthenticationClient.java @@ -1,22 +1,36 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.resources.authentication; +package com.skyflow.generated.common.rest.resources.authentication; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.skyflow.generated.auth.rest.core.*; -import com.skyflow.generated.auth.rest.errors.BadRequestError; -import com.skyflow.generated.auth.rest.errors.NotFoundError; -import com.skyflow.generated.auth.rest.errors.UnauthorizedError; -import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; -import okhttp3.*; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.NotFoundError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.authentication.requests.GetAuthTokenRequest; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; import java.io.IOException; -import java.util.Map; 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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; public class AsyncRawAuthenticationClient { protected final ClientOptions clientOptions; @@ -26,22 +40,25 @@ public AsyncRawAuthenticationClient(ClientOptions clientOptions) { } /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

+ * Generates a Bearer Token to authenticate with Skyflow. */ - public CompletableFuture> authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request) { - return authenticationServiceGetAuthToken(request, null); + public CompletableFuture> getBearerToken(GetAuthTokenRequest request) { + return getBearerToken(request, null); } /** - *

<p>Generates a Bearer Token to authenticate with Skyflow. This method doesn't require the <code>Authorization</code> header.</p><p><b>Note:</b> For recommended ways to authenticate, see <a href='/api-authentication/'>API authentication</a>.</p>

+ * Generates a Bearer Token to authenticate with Skyflow. */ - public CompletableFuture> authenticationServiceGetAuthToken( - V1GetAuthTokenRequest request, RequestOptions requestOptions) { - HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + public CompletableFuture> getBearerToken( + GetAuthTokenRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() - .addPathSegments("v1/auth/sa/oauth/token") - .build(); + .addPathSegments("v1/auth/sa/oauth/token"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } RequestBody body; try { body = RequestBody.create( @@ -50,7 +67,7 @@ public CompletableFuture> authenti throw new ApiClientException("Failed to serialize request", e); } Request okhttpRequest = new Request.Builder() - .url(httpUrl) + .url(httpUrl.build()) .method("POST", body) .headers(Headers.of(clientOptions.headers(requestOptions))) .addHeader("Content-Type", "application/json") @@ -60,49 +77,60 @@ public CompletableFuture> authenti if (requestOptions != null && requestOptions.getTimeout().isPresent()) { client = clientOptions.httpClientWithTimeout(requestOptions); } - CompletableFuture> future = new CompletableFuture<>(); + 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 ApiClientHttpResponse<>( - ObjectMappers.JSON_MAPPER.readValue( - responseBody.string(), V1GetAuthTokenResponse.class), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetAuthTokenResponse.class), response)); return; } - String responseBodyString = responseBody != null ? responseBody.string() : "{}"; try { switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; case 404: future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue( - responseBodyString, new TypeReference>() {}), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response)); return; } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); future.completeExceptionally(new ApiClientApiException( - "Error with status code " + response.code(), - response.code(), - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), - response)); + "Error with status code " + response.code(), response.code(), errorBody, response)); return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); } catch (IOException e) { future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); } diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AuthenticationClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AuthenticationClient.java new file mode 100644 index 00000000..b5143997 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/AuthenticationClient.java @@ -0,0 +1,41 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.authentication; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.authentication.requests.GetAuthTokenRequest; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; + +public class AuthenticationClient { + protected final ClientOptions clientOptions; + + private final RawAuthenticationClient rawClient; + + public AuthenticationClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawAuthenticationClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawAuthenticationClient withRawResponse() { + return this.rawClient; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public GetAuthTokenResponse getBearerToken(GetAuthTokenRequest request) { + return this.rawClient.getBearerToken(request).body(); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public GetAuthTokenResponse getBearerToken(GetAuthTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.getBearerToken(request, requestOptions).body(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/RawAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/RawAuthenticationClient.java new file mode 100644 index 00000000..dba11478 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/RawAuthenticationClient.java @@ -0,0 +1,119 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.authentication; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.NotFoundError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.authentication.requests.GetAuthTokenRequest; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; +import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawAuthenticationClient { + protected final ClientOptions clientOptions; + + public RawAuthenticationClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public ApiClientHttpResponse getBearerToken(GetAuthTokenRequest request) { + return getBearerToken(request, null); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public ApiClientHttpResponse getBearerToken( + GetAuthTokenRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v1/auth/sa/oauth/token"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetAuthTokenResponse.class), response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/requests/GetAuthTokenRequest.java similarity index 68% rename from common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/requests/GetAuthTokenRequest.java index 382c5431..65006de0 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/authentication/requests/GetAuthTokenRequest.java @@ -1,21 +1,26 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.resources.authentication.requests; - -import com.fasterxml.jackson.annotation.*; +package com.skyflow.generated.common.rest.resources.authentication.requests; + +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.auth.rest.core.ObjectMappers; -import org.jetbrains.annotations.NotNull; - +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetAuthTokenRequest.Builder.class) -public final class V1GetAuthTokenRequest { +@JsonDeserialize(builder = GetAuthTokenRequest.Builder.class) +public final class GetAuthTokenRequest { private final String grantType; private final String assertion; @@ -30,7 +35,7 @@ public final class V1GetAuthTokenRequest { private final Map additionalProperties; - private V1GetAuthTokenRequest( + private GetAuthTokenRequest( String grantType, String assertion, Optional subjectToken, @@ -56,7 +61,7 @@ public String getGrantType() { } /** - * @return User-signed JWT token that contains the following fields: <br/> <ul><li><code>iss</code>: Issuer of the JWT.</li><li><code>key</code>: Unique identifier for the key.</li><li><code>aud</code>: Recipient the JWT is intended for.</li><li><code>exp</code>: Time the JWT expires.</li><li><code>sub</code>: Subject of the JWT.</li><li><code>ctx</code>: (Optional) Value for <a href='/context-aware-overview/'>Context-aware authorization</a>.</li></ul> + * @return User-signed JWT token that contains the following fields: iss (Issuer), key (Unique identifier), aud (Recipient), exp (Expiry), sub (Subject), ctx (Optional context for context-aware authorization). */ @JsonProperty("assertion") public String getAssertion() { @@ -88,17 +93,17 @@ public Optional getRequestedTokenUse() { } /** - * @return Subset of available <a href='#Roles'>roles</a> to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>". + * @return Subset of available roles to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>". */ @JsonProperty("scope") public Optional getScope() { return scope; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1GetAuthTokenRequest && equalTo((V1GetAuthTokenRequest) other); + return other instanceof GetAuthTokenRequest && equalTo((GetAuthTokenRequest) other); } @JsonAnyGetter @@ -106,7 +111,7 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1GetAuthTokenRequest other) { + private boolean equalTo(GetAuthTokenRequest other) { return grantType.equals(other.grantType) && assertion.equals(other.assertion) && subjectToken.equals(other.subjectToken) @@ -115,7 +120,7 @@ private boolean equalTo(V1GetAuthTokenRequest other) { && scope.equals(other.scope); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash( this.grantType, @@ -126,7 +131,7 @@ public int hashCode() { this.scope); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -137,22 +142,26 @@ public static GrantTypeStage builder() { public interface GrantTypeStage { /** - * Grant type of the request. Set this to `urn:ietf:params:oauth:grant-type:jwt-bearer`. + *

Grant type of the request. Set this to urn:ietf:params:oauth:grant-type:jwt-bearer.

*/ AssertionStage grantType(@NotNull String grantType); - Builder from(V1GetAuthTokenRequest other); + Builder from(GetAuthTokenRequest other); } public interface AssertionStage { /** - * User-signed JWT token that contains the following fields:
+ *

User-signed JWT token that contains the following fields: iss (Issuer), key (Unique identifier), aud (Recipient), exp (Expiry), sub (Subject), ctx (Optional context for context-aware authorization).

*/ _FinalStage assertion(@NotNull String assertion); } public interface _FinalStage { - V1GetAuthTokenRequest build(); + GetAuthTokenRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); /** *

Subject token.

@@ -176,7 +185,7 @@ public interface _FinalStage { _FinalStage requestedTokenUse(String requestedTokenUse); /** - *

Subset of available <a href='#Roles'>roles</a> to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

+ *

Subset of available roles to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

*/ _FinalStage scope(Optional scope); @@ -202,8 +211,8 @@ public static final class Builder implements GrantTypeStage, AssertionStage, _Fi private Builder() {} - @Override - public Builder from(V1GetAuthTokenRequest other) { + @java.lang.Override + public Builder from(GetAuthTokenRequest other) { grantType(other.getGrantType()); assertion(other.getAssertion()); subjectToken(other.getSubjectToken()); @@ -214,10 +223,10 @@ public Builder from(V1GetAuthTokenRequest other) { } /** - * Grant type of the request. Set this to `urn:ietf:params:oauth:grant-type:jwt-bearer`.

Grant type of the request. Set this to urn:ietf:params:oauth:grant-type:jwt-bearer.

+ *

Grant type of the request. Set this to urn:ietf:params:oauth:grant-type:jwt-bearer.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("grant_type") public AssertionStage grantType(@NotNull String grantType) { this.grantType = Objects.requireNonNull(grantType, "grantType must not be null"); @@ -225,10 +234,10 @@ public AssertionStage grantType(@NotNull String grantType) { } /** - * User-signed JWT token that contains the following fields:
  • iss: Issuer of the JWT.
  • key: Unique identifier for the key.
  • aud: Recipient the JWT is intended for.
  • exp: Time the JWT expires.
  • sub: Subject of the JWT.
  • ctx: (Optional) Value for Context-aware authorization.

User-signed JWT token that contains the following fields: <br/> <ul><li><code>iss</code>: Issuer of the JWT.</li><li><code>key</code>: Unique identifier for the key.</li><li><code>aud</code>: Recipient the JWT is intended for.</li><li><code>exp</code>: Time the JWT expires.</li><li><code>sub</code>: Subject of the JWT.</li><li><code>ctx</code>: (Optional) Value for <a href='/context-aware-overview/'>Context-aware authorization</a>.</li></ul>

+ *

User-signed JWT token that contains the following fields: iss (Issuer), key (Unique identifier), aud (Recipient), exp (Expiry), sub (Subject), ctx (Optional context for context-aware authorization).

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override @JsonSetter("assertion") public _FinalStage assertion(@NotNull String assertion) { this.assertion = Objects.requireNonNull(assertion, "assertion must not be null"); @@ -236,19 +245,19 @@ public _FinalStage assertion(@NotNull String assertion) { } /** - *

Subset of available <a href='#Roles'>roles</a> to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

+ *

Subset of available roles to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage scope(String scope) { this.scope = Optional.ofNullable(scope); return this; } /** - *

Subset of available <a href='#Roles'>roles</a> to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

+ *

Subset of available roles to associate with the requested token. Uses the format "role:<roleID1> role:<roleID2>".

*/ - @Override + @java.lang.Override @JsonSetter(value = "scope", nulls = Nulls.SKIP) public _FinalStage scope(Optional scope) { this.scope = scope; @@ -259,7 +268,7 @@ public _FinalStage scope(Optional scope) { *

Token use type. Either delegation or impersonation.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage requestedTokenUse(String requestedTokenUse) { this.requestedTokenUse = Optional.ofNullable(requestedTokenUse); return this; @@ -268,7 +277,7 @@ public _FinalStage requestedTokenUse(String requestedTokenUse) { /** *

Token use type. Either delegation or impersonation.

*/ - @Override + @java.lang.Override @JsonSetter(value = "requested_token_use", nulls = Nulls.SKIP) public _FinalStage requestedTokenUse(Optional requestedTokenUse) { this.requestedTokenUse = requestedTokenUse; @@ -279,7 +288,7 @@ public _FinalStage requestedTokenUse(Optional requestedTokenUse) { *

Subject token type.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage subjectTokenType(String subjectTokenType) { this.subjectTokenType = Optional.ofNullable(subjectTokenType); return this; @@ -288,7 +297,7 @@ public _FinalStage subjectTokenType(String subjectTokenType) { /** *

Subject token type.

*/ - @Override + @java.lang.Override @JsonSetter(value = "subject_token_type", nulls = Nulls.SKIP) public _FinalStage subjectTokenType(Optional subjectTokenType) { this.subjectTokenType = subjectTokenType; @@ -299,7 +308,7 @@ public _FinalStage subjectTokenType(Optional subjectTokenType) { *

Subject token.

* @return Reference to {@code this} so that method calls can be chained together. */ - @Override + @java.lang.Override public _FinalStage subjectToken(String subjectToken) { this.subjectToken = Optional.ofNullable(subjectToken); return this; @@ -308,16 +317,16 @@ public _FinalStage subjectToken(String subjectToken) { /** *

Subject token.

*/ - @Override + @java.lang.Override @JsonSetter(value = "subject_token", nulls = Nulls.SKIP) public _FinalStage subjectToken(Optional subjectToken) { this.subjectToken = subjectToken; return this; } - @Override - public V1GetAuthTokenRequest build() { - return new V1GetAuthTokenRequest( + @java.lang.Override + public GetAuthTokenRequest build() { + return new GetAuthTokenRequest( grantType, assertion, subjectToken, @@ -326,5 +335,17 @@ public V1GetAuthTokenRequest build() { scope, 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/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncFilesV2Client.java similarity index 86% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncFilesV2Client.java index c032d144..52e19e33 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncFilesV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncFilesV2Client.java @@ -1,16 +1,16 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2; +package com.skyflow.generated.common.rest.resources.filesv2; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; import java.util.concurrent.CompletableFuture; public class AsyncFilesV2Client { diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncRawFilesV2Client.java similarity index 93% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncRawFilesV2Client.java index 6764e32b..83e6c2cc 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/AsyncRawFilesV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/AsyncRawFilesV2Client.java @@ -1,28 +1,28 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2; +package com.skyflow.generated.common.rest.resources.filesv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.QueryStringMapper; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.QueryStringMapper; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; import java.io.IOException; import java.util.concurrent.CompletableFuture; import okhttp3.Call; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/FilesV2Client.java similarity index 84% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/FilesV2Client.java index 9f9f8c1a..60935ef7 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/FilesV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/FilesV2Client.java @@ -1,16 +1,16 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2; +package com.skyflow.generated.common.rest.resources.filesv2; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; public class FilesV2Client { protected final ClientOptions clientOptions; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/RawFilesV2Client.java similarity index 91% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/RawFilesV2Client.java index 2ffe352d..abe6815f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/RawFilesV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/RawFilesV2Client.java @@ -1,28 +1,28 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2; +package com.skyflow.generated.common.rest.resources.filesv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.QueryStringMapper; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.QueryStringMapper; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; import java.io.IOException; import okhttp3.Headers; import okhttp3.HttpUrl; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java index f95ee7ab..99075ff3 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/DeidentifyFileRequestV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.requests; +package com.skyflow.generated.common.rest.resources.filesv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,10 +11,10 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; -import com.skyflow.generated.detect.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; -import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.resources.filesv2.types.DeidentifyFileRequestV2DataFormat; +import com.skyflow.generated.common.rest.resources.filesv2.types.DeidentifyFileRequestV2DataSource; +import com.skyflow.generated.common.rest.types.DetectConfigV2; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/GetRunV2Request.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/GetRunV2Request.java index f90f7153..93ff2521 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/GetRunV2Request.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/GetRunV2Request.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.requests; +package com.skyflow.generated.common.rest.resources.filesv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java index 29751862..6ab80a00 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/requests/ReidentifyFileRequestV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.requests; +package com.skyflow.generated.common.rest.resources.filesv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,10 +11,10 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; -import com.skyflow.generated.detect.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; -import com.skyflow.generated.detect.rest.types.RedactionLevel; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.resources.filesv2.types.ReidentifyFileRequestV2DataFormat; +import com.skyflow.generated.common.rest.resources.filesv2.types.ReidentifyFileRequestV2DataSource; +import com.skyflow.generated.common.rest.types.RedactionLevel; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java index 6a4aaf01..58b4f251 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataFormat.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.types; +package com.skyflow.generated.common.rest.resources.filesv2.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java index 83c9aed3..af0f978a 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/DeidentifyFileRequestV2DataSource.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.types; +package com.skyflow.generated.common.rest.resources.filesv2.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java index df3c688f..ea599b40 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataFormat.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.types; +package com.skyflow.generated.common.rest.resources.filesv2.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java index 538cbc49..9c02024b 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/filesv2/types/ReidentifyFileRequestV2DataSource.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.filesv2.types; +package com.skyflow.generated.common.rest.resources.filesv2.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java similarity index 81% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java index fe74a2d3..e59a3246 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncGuardrailsV2Client.java @@ -1,12 +1,12 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.guardrailsv2; +package com.skyflow.generated.common.rest.resources.guardrailsv2; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; import java.util.concurrent.CompletableFuture; public class AsyncGuardrailsV2Client { diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java similarity index 86% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java index c6b84c0e..8554afda 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/AsyncRawGuardrailsV2Client.java @@ -1,23 +1,23 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.guardrailsv2; +package com.skyflow.generated.common.rest.resources.guardrailsv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; import java.io.IOException; import java.util.concurrent.CompletableFuture; import okhttp3.Call; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/GuardrailsV2Client.java similarity index 79% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/GuardrailsV2Client.java index 2d3a9bf7..98e0732f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/GuardrailsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/GuardrailsV2Client.java @@ -1,12 +1,12 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.guardrailsv2; +package com.skyflow.generated.common.rest.resources.guardrailsv2; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; public class GuardrailsV2Client { protected final ClientOptions clientOptions; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/RawGuardrailsV2Client.java similarity index 83% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/RawGuardrailsV2Client.java index c124c516..102434d4 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/RawGuardrailsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/RawGuardrailsV2Client.java @@ -1,23 +1,23 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.guardrailsv2; +package com.skyflow.generated.common.rest.resources.guardrailsv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; import java.io.IOException; import okhttp3.Headers; import okhttp3.HttpUrl; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java index f6d8dbad..17888dd9 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/guardrailsv2/requests/DetectGuardrailsRequestV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.guardrailsv2.requests; +package com.skyflow.generated.common.rest.resources.guardrailsv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncRawStringsV2Client.java similarity index 91% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncRawStringsV2Client.java index cac69231..554f1cbf 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncRawStringsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncRawStringsV2Client.java @@ -1,25 +1,25 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2; +package com.skyflow.generated.common.rest.resources.stringsv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import java.io.IOException; import java.util.concurrent.CompletableFuture; import okhttp3.Call; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncStringsV2Client.java similarity index 85% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncStringsV2Client.java index 47c34f06..fd172616 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/AsyncStringsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/AsyncStringsV2Client.java @@ -1,14 +1,14 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2; - -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +package com.skyflow.generated.common.rest.resources.stringsv2; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import java.util.concurrent.CompletableFuture; public class AsyncStringsV2Client { diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/RawStringsV2Client.java similarity index 89% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/RawStringsV2Client.java index 61f71478..093b9f31 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/RawStringsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/RawStringsV2Client.java @@ -1,25 +1,25 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2; +package com.skyflow.generated.common.rest.resources.stringsv2; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.MediaTypes; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.core.RetryInterceptor; -import com.skyflow.generated.detect.rest.errors.BadRequestError; -import com.skyflow.generated.detect.rest.errors.InternalServerError; -import com.skyflow.generated.detect.rest.errors.UnauthorizedError; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.ErrorResponse; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import java.io.IOException; import okhttp3.Headers; import okhttp3.HttpUrl; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/StringsV2Client.java similarity index 83% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/StringsV2Client.java index 2a50d897..5cfa05b3 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/StringsV2Client.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/StringsV2Client.java @@ -1,14 +1,14 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2; - -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +package com.skyflow.generated.common.rest.resources.stringsv2; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; public class StringsV2Client { protected final ClientOptions clientOptions; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java index c3964a6d..8af6804c 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/DeidentifyStringRequestV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2.requests; +package com.skyflow.generated.common.rest.resources.stringsv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,8 +11,8 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.types.DetectConfigV2; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java index b242a87b..6d388058 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/stringsv2/requests/ReidentifyStringRequestV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.resources.stringsv2.requests; +package com.skyflow.generated.common.rest.resources.stringsv2.requests; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,8 +11,8 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.types.RedactionLevel; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.types.RedactionLevel; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncRawTokenExchangeClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncRawTokenExchangeClient.java new file mode 100644 index 00000000..565e8649 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncRawTokenExchangeClient.java @@ -0,0 +1,146 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.tokenexchange; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.NotFoundError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.tokenexchange.requests.GetStsTokenRequest; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.GetStsTokenResponse; +import java.io.IOException; +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.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; +import org.jetbrains.annotations.NotNull; + +public class AsyncRawTokenExchangeClient { + protected final ClientOptions clientOptions; + + public AsyncRawTokenExchangeClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture> getStsToken(GetStsTokenRequest request) { + return getStsToken(request, null); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture> getStsToken( + GetStsTokenRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v1/auth/sts/token"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetStsTokenResponse.class), + response)); + return; + } + try { + switch (response.code()) { + case 400: + future.completeExceptionally(new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 401: + future.completeExceptionally(new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 404: + future.completeExceptionally(new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + case 500: + future.completeExceptionally(new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), + response)); + return; + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response)); + return; + } catch (JsonProcessingException e) { + future.completeExceptionally( + new ApiClientException("Failed to deserialize response: " + e.getMessage(), e)); + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncTokenExchangeClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncTokenExchangeClient.java new file mode 100644 index 00000000..4ea687a8 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/AsyncTokenExchangeClient.java @@ -0,0 +1,43 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.tokenexchange; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.tokenexchange.requests.GetStsTokenRequest; +import com.skyflow.generated.common.rest.types.GetStsTokenResponse; +import java.util.concurrent.CompletableFuture; + +public class AsyncTokenExchangeClient { + protected final ClientOptions clientOptions; + + private final AsyncRawTokenExchangeClient rawClient; + + public AsyncTokenExchangeClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawTokenExchangeClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawTokenExchangeClient withRawResponse() { + return this.rawClient; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture getStsToken(GetStsTokenRequest request) { + return this.rawClient.getStsToken(request).thenApply(response -> response.body()); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public CompletableFuture getStsToken( + GetStsTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.getStsToken(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/RawTokenExchangeClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/RawTokenExchangeClient.java new file mode 100644 index 00000000..64051243 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/RawTokenExchangeClient.java @@ -0,0 +1,119 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.tokenexchange; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.MediaTypes; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.core.RetryInterceptor; +import com.skyflow.generated.common.rest.errors.BadRequestError; +import com.skyflow.generated.common.rest.errors.InternalServerError; +import com.skyflow.generated.common.rest.errors.NotFoundError; +import com.skyflow.generated.common.rest.errors.UnauthorizedError; +import com.skyflow.generated.common.rest.resources.tokenexchange.requests.GetStsTokenRequest; +import com.skyflow.generated.common.rest.types.ErrorResponse; +import com.skyflow.generated.common.rest.types.GetStsTokenResponse; +import java.io.IOException; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.ResponseBody; + +public class RawTokenExchangeClient { + protected final ClientOptions clientOptions; + + public RawTokenExchangeClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public ApiClientHttpResponse getStsToken(GetStsTokenRequest request) { + return getStsToken(request, null); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public ApiClientHttpResponse getStsToken( + GetStsTokenRequest request, RequestOptions requestOptions) { + HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v1/auth/sts/token"); + if (requestOptions != null) { + requestOptions.getQueryParameters().forEach((_key, _value) -> { + httpUrl.addQueryParameter(_key, _value); + }); + } + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl.build()) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .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 ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, GetStsTokenResponse.class), response); + } + try { + switch (response.code()) { + case 400: + throw new BadRequestError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 401: + throw new UnauthorizedError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 404: + throw new NotFoundError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + case 500: + throw new InternalServerError( + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, ErrorResponse.class), response); + } + } catch (JsonProcessingException ignored) { + // unable to map error response, throwing generic error + } + Object errorBody = ObjectMappers.parseErrorBody(responseBodyString); + throw new ApiClientApiException( + "Error with status code " + response.code(), response.code(), errorBody, response); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to deserialize response: " + e.getMessage(), e); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/TokenExchangeClient.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/TokenExchangeClient.java new file mode 100644 index 00000000..c0eb551d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/TokenExchangeClient.java @@ -0,0 +1,41 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.tokenexchange; + +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.tokenexchange.requests.GetStsTokenRequest; +import com.skyflow.generated.common.rest.types.GetStsTokenResponse; + +public class TokenExchangeClient { + protected final ClientOptions clientOptions; + + private final RawTokenExchangeClient rawClient; + + public TokenExchangeClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawTokenExchangeClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawTokenExchangeClient withRawResponse() { + return this.rawClient; + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public GetStsTokenResponse getStsToken(GetStsTokenRequest request) { + return this.rawClient.getStsToken(request).body(); + } + + /** + * Generates a Bearer Token to authenticate with Skyflow. + */ + public GetStsTokenResponse getStsToken(GetStsTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.getStsToken(request, requestOptions).body(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/requests/GetStsTokenRequest.java b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/requests/GetStsTokenRequest.java new file mode 100644 index 00000000..2a12253d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/resources/tokenexchange/requests/GetStsTokenRequest.java @@ -0,0 +1,214 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.resources.tokenexchange.requests; + +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 com.skyflow.generated.common.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import org.jetbrains.annotations.NotNull; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetStsTokenRequest.Builder.class) +public final class GetStsTokenRequest { + private final String grantType; + + private final String subjectToken; + + private final String subjectTokenType; + + private final String serviceAccountId; + + private final Map additionalProperties; + + private GetStsTokenRequest( + String grantType, + String subjectToken, + String subjectTokenType, + String serviceAccountId, + Map additionalProperties) { + this.grantType = grantType; + this.subjectToken = subjectToken; + this.subjectTokenType = subjectTokenType; + this.serviceAccountId = serviceAccountId; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("grant_type") + public String getGrantType() { + return grantType; + } + + /** + * @return Subject token. + */ + @JsonProperty("subject_token") + public String getSubjectToken() { + return subjectToken; + } + + /** + * @return Subject token type. + */ + @JsonProperty("subject_token_type") + public String getSubjectTokenType() { + return subjectTokenType; + } + + @JsonProperty("service_account_id") + public String getServiceAccountId() { + return serviceAccountId; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetStsTokenRequest && equalTo((GetStsTokenRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetStsTokenRequest other) { + return grantType.equals(other.grantType) + && subjectToken.equals(other.subjectToken) + && subjectTokenType.equals(other.subjectTokenType) + && serviceAccountId.equals(other.serviceAccountId); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.grantType, this.subjectToken, this.subjectTokenType, this.serviceAccountId); + } + + @java.lang.Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static GrantTypeStage builder() { + return new Builder(); + } + + public interface GrantTypeStage { + SubjectTokenStage grantType(@NotNull String grantType); + + Builder from(GetStsTokenRequest other); + } + + public interface SubjectTokenStage { + /** + *

Subject token.

+ */ + SubjectTokenTypeStage subjectToken(@NotNull String subjectToken); + } + + public interface SubjectTokenTypeStage { + /** + *

Subject token type.

+ */ + ServiceAccountIdStage subjectTokenType(@NotNull String subjectTokenType); + } + + public interface ServiceAccountIdStage { + _FinalStage serviceAccountId(@NotNull String serviceAccountId); + } + + public interface _FinalStage { + GetStsTokenRequest build(); + + _FinalStage additionalProperty(String key, Object value); + + _FinalStage additionalProperties(Map additionalProperties); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder + implements GrantTypeStage, SubjectTokenStage, SubjectTokenTypeStage, ServiceAccountIdStage, _FinalStage { + private String grantType; + + private String subjectToken; + + private String subjectTokenType; + + private String serviceAccountId; + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + @java.lang.Override + public Builder from(GetStsTokenRequest other) { + grantType(other.getGrantType()); + subjectToken(other.getSubjectToken()); + subjectTokenType(other.getSubjectTokenType()); + serviceAccountId(other.getServiceAccountId()); + return this; + } + + @java.lang.Override + @JsonSetter("grant_type") + public SubjectTokenStage grantType(@NotNull String grantType) { + this.grantType = Objects.requireNonNull(grantType, "grantType must not be null"); + return this; + } + + /** + *

Subject token.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("subject_token") + public SubjectTokenTypeStage subjectToken(@NotNull String subjectToken) { + this.subjectToken = Objects.requireNonNull(subjectToken, "subjectToken must not be null"); + return this; + } + + /** + *

Subject token type.

+ * @return Reference to {@code this} so that method calls can be chained together. + */ + @java.lang.Override + @JsonSetter("subject_token_type") + public ServiceAccountIdStage subjectTokenType(@NotNull String subjectTokenType) { + this.subjectTokenType = Objects.requireNonNull(subjectTokenType, "subjectTokenType must not be null"); + return this; + } + + @java.lang.Override + @JsonSetter("service_account_id") + public _FinalStage serviceAccountId(@NotNull String serviceAccountId) { + this.serviceAccountId = Objects.requireNonNull(serviceAccountId, "serviceAccountId must not be null"); + return this; + } + + @java.lang.Override + public GetStsTokenRequest build() { + return new GetStsTokenRequest( + grantType, subjectToken, subjectTokenType, serviceAccountId, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2.java index eb4be5de..c0ef0619 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2Bleep.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2Bleep.java index eb234230..39360814 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2Bleep.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2Bleep.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2OutputTranscription.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2OutputTranscription.java index 9d48255f..4ac533ec 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/AudioV2OutputTranscription.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/AudioV2OutputTranscription.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyFileResponseV2.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyFileResponseV2.java index fa5b77eb..e4c88a65 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyFileResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyFileResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2.java index eb0eca2d..7c1d3020 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2DetectedEntity.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2DetectedEntity.java index e3bf15bd..c7843117 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2DetectedEntity.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2DetectedEntity.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2EntityLocation.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2EntityLocation.java index 6ac6a633..bf75e2d5 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DeidentifyStringResponseV2EntityLocation.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DeidentifyStringResponseV2EntityLocation.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java b/common/src/main/java/com/skyflow/generated/common/rest/types/Detect.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/Detect.java index 4935b1d0..ae1dfb15 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/Detect.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/Detect.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2.java index 77f00c81..81efd72b 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2VaultType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2VaultType.java index 4249b6a3..89bdcd78 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectConfigV2VaultType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectConfigV2VaultType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectCustomTypes.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectCustomTypes.java index a4db8e7c..32a6f56f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectCustomTypes.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectCustomTypes.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntity.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntity.java index 472e7044..76a4216c 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntity.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntity.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityDeidentificationType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityDeidentificationType.java index 26262dce..aa338a0f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityDeidentificationType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityDeidentificationType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityEntityType.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityEntityType.java index 7e286cfc..91ea6f18 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectEntityEntityType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectEntityEntityType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2.java index ca14dc32..b418cf67 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2Validation.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2Validation.java index 0337a29f..bbdc7bb0 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectGuardrailsResponseV2Validation.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectGuardrailsResponseV2Validation.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntity.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntity.java index 52333c00..ce232fa3 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntity.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntity.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityDeidentificationType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityDeidentificationType.java index aec7dc98..806d5dc6 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityDeidentificationType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityDeidentificationType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityEntityType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityEntityType.java index 93f8b64f..230600ec 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectObjectEntityEntityType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectObjectEntityEntityType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectReturnEntities.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectReturnEntities.java index f5435ec2..32441ba0 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectReturnEntities.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectReturnEntities.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2.java index 372e164d..6061f04f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2OutputType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2OutputType.java index cb995d80..856b930b 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2OutputType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2OutputType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2Status.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2Status.java index c4549699..a70b3f6d 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DetectRunsResponseV2Status.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DetectRunsResponseV2Status.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2.java index 4e080422..6fb6df1c 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2Pdf.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2Pdf.java index 4aae1940..0604a3a5 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2Pdf.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2Pdf.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2PdfProcessingMode.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2PdfProcessingMode.java index 2ada581f..3f749db2 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/DocumentV2PdfProcessingMode.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/DocumentV2PdfProcessingMode.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java b/common/src/main/java/com/skyflow/generated/common/rest/types/EntityTransformation.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/EntityTransformation.java index 870b3e13..294287b4 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/EntityTransformation.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/EntityTransformation.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponse.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponse.java index 4e29036e..65c9d01a 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponse.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponse.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -10,7 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponseError.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponseError.java index 5c43d6a6..97312dbf 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ErrorResponseError.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ErrorResponseError.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java b/common/src/main/java/com/skyflow/generated/common/rest/types/FileMapping.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/FileMapping.java index 75b023be..d613eebf 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileMapping.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/FileMapping.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutput.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/FileOutput.java index 69f6cdf8..0896a570 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutput.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutput.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileExtension.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileExtension.java index 5eb8fd6f..a929071c 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileExtension.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileExtension.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileType.java similarity index 96% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileType.java index faeb8849..cd807aaa 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/FileOutputProcessedFileType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/FileOutputProcessedFileType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java b/common/src/main/java/com/skyflow/generated/common/rest/types/GetAuthTokenResponse.java similarity index 67% rename from common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/GetAuthTokenResponse.java index 3db2f22b..519a2081 100644 --- a/common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/GetAuthTokenResponse.java @@ -1,27 +1,32 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.auth.rest.types; - -import com.fasterxml.jackson.annotation.*; +package com.skyflow.generated.common.rest.types; + +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.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.auth.rest.core.ObjectMappers; - +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @JsonInclude(JsonInclude.Include.NON_ABSENT) -@JsonDeserialize(builder = V1GetAuthTokenResponse.Builder.class) -public final class V1GetAuthTokenResponse { +@JsonDeserialize(builder = GetAuthTokenResponse.Builder.class) +public final class GetAuthTokenResponse { private final Optional accessToken; private final Optional tokenType; private final Map additionalProperties; - private V1GetAuthTokenResponse( + private GetAuthTokenResponse( Optional accessToken, Optional tokenType, Map additionalProperties) { this.accessToken = accessToken; this.tokenType = tokenType; @@ -44,10 +49,10 @@ public Optional getTokenType() { return tokenType; } - @Override + @java.lang.Override public boolean equals(Object other) { if (this == other) return true; - return other instanceof V1GetAuthTokenResponse && equalTo((V1GetAuthTokenResponse) other); + return other instanceof GetAuthTokenResponse && equalTo((GetAuthTokenResponse) other); } @JsonAnyGetter @@ -55,16 +60,16 @@ public Map getAdditionalProperties() { return this.additionalProperties; } - private boolean equalTo(V1GetAuthTokenResponse other) { + private boolean equalTo(GetAuthTokenResponse other) { return accessToken.equals(other.accessToken) && tokenType.equals(other.tokenType); } - @Override + @java.lang.Override public int hashCode() { return Objects.hash(this.accessToken, this.tokenType); } - @Override + @java.lang.Override public String toString() { return ObjectMappers.stringify(this); } @@ -84,7 +89,7 @@ public static final class Builder { private Builder() {} - public Builder from(V1GetAuthTokenResponse other) { + public Builder from(GetAuthTokenResponse other) { accessToken(other.getAccessToken()); tokenType(other.getTokenType()); return this; @@ -118,8 +123,18 @@ public Builder tokenType(String tokenType) { return this; } - public V1GetAuthTokenResponse build() { - return new V1GetAuthTokenResponse(accessToken, tokenType, additionalProperties); + public GetAuthTokenResponse build() { + return new GetAuthTokenResponse(accessToken, tokenType, 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/common/src/main/java/com/skyflow/generated/common/rest/types/GetStsTokenResponse.java b/common/src/main/java/com/skyflow/generated/common/rest/types/GetStsTokenResponse.java new file mode 100644 index 00000000..d972a9f2 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/GetStsTokenResponse.java @@ -0,0 +1,173 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.common.rest.types; + +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.annotation.Nulls; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GetStsTokenResponse.Builder.class) +public final class GetStsTokenResponse { + private final Optional accessToken; + + private final Optional issuedTokenType; + + private final Optional tokenType; + + private final Map additionalProperties; + + private GetStsTokenResponse( + Optional accessToken, + Optional issuedTokenType, + Optional tokenType, + Map additionalProperties) { + this.accessToken = accessToken; + this.issuedTokenType = issuedTokenType; + this.tokenType = tokenType; + this.additionalProperties = additionalProperties; + } + + /** + * @return AccessToken. + */ + @JsonProperty("accessToken") + public Optional getAccessToken() { + return accessToken; + } + + /** + * @return IssuedTokenType : urn:ietf:params:oauth:token-type:jwt. + */ + @JsonProperty("issuedTokenType") + public Optional getIssuedTokenType() { + return issuedTokenType; + } + + /** + * @return TokenType : Bearer. + */ + @JsonProperty("tokenType") + public Optional getTokenType() { + return tokenType; + } + + @java.lang.Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GetStsTokenResponse && equalTo((GetStsTokenResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GetStsTokenResponse other) { + return accessToken.equals(other.accessToken) + && issuedTokenType.equals(other.issuedTokenType) + && tokenType.equals(other.tokenType); + } + + @java.lang.Override + public int hashCode() { + return Objects.hash(this.accessToken, this.issuedTokenType, this.tokenType); + } + + @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 accessToken = Optional.empty(); + + private Optional issuedTokenType = Optional.empty(); + + private Optional tokenType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GetStsTokenResponse other) { + accessToken(other.getAccessToken()); + issuedTokenType(other.getIssuedTokenType()); + tokenType(other.getTokenType()); + return this; + } + + /** + *

AccessToken.

+ */ + @JsonSetter(value = "accessToken", nulls = Nulls.SKIP) + public Builder accessToken(Optional accessToken) { + this.accessToken = accessToken; + return this; + } + + public Builder accessToken(String accessToken) { + this.accessToken = Optional.ofNullable(accessToken); + return this; + } + + /** + *

IssuedTokenType : urn:ietf:params:oauth:token-type:jwt.

+ */ + @JsonSetter(value = "issuedTokenType", nulls = Nulls.SKIP) + public Builder issuedTokenType(Optional issuedTokenType) { + this.issuedTokenType = issuedTokenType; + return this; + } + + public Builder issuedTokenType(String issuedTokenType) { + this.issuedTokenType = Optional.ofNullable(issuedTokenType); + return this; + } + + /** + *

TokenType : Bearer.

+ */ + @JsonSetter(value = "tokenType", nulls = Nulls.SKIP) + public Builder tokenType(Optional tokenType) { + this.tokenType = tokenType; + return this; + } + + public Builder tokenType(String tokenType) { + this.tokenType = Optional.ofNullable(tokenType); + return this; + } + + public GetStsTokenResponse build() { + return new GetStsTokenResponse(accessToken, issuedTokenType, tokenType, 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/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2.java index ebcc89de..a6793380 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2MaskingMethod.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2MaskingMethod.java index 41f59512..35e90bd6 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ImageV2MaskingMethod.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ImageV2MaskingMethod.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java b/common/src/main/java/com/skyflow/generated/common/rest/types/Media.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/Media.java index 7bba13bb..4ea06678 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/Media.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/Media.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java b/common/src/main/java/com/skyflow/generated/common/rest/types/Metrics.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/Metrics.java index ac525333..651a8e2a 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/Metrics.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/Metrics.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevel.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevel.java index 961c2f2f..ee7e9be2 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevel.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevel.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelEntityName.java similarity index 99% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelEntityName.java index a4e9acb6..47120d45 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelEntityName.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelEntityName.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelRedactionType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelRedactionType.java index 5e9b0807..559cad75 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/RedactionLevelRedactionType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/RedactionLevelRedactionType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2.java index b7b8e3e5..896cf19f 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2OutputType.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2OutputType.java index ad4ea20f..64930329 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2OutputType.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2OutputType.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2Status.java similarity index 98% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2Status.java index 250bd1a9..60af69d7 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyFileResponseV2Status.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyFileResponseV2Status.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyStringResponseV2.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyStringResponseV2.java index 2c836067..4aca3703 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/ReidentifyStringResponseV2.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/ReidentifyStringResponseV2.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java b/common/src/main/java/com/skyflow/generated/common/rest/types/TransformationShiftDates.java similarity index 97% rename from common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java rename to common/src/main/java/com/skyflow/generated/common/rest/types/TransformationShiftDates.java index 78879313..ec812fc7 100644 --- a/common/src/main/java/com/skyflow/generated/detect/rest/types/TransformationShiftDates.java +++ b/common/src/main/java/com/skyflow/generated/common/rest/types/TransformationShiftDates.java @@ -1,7 +1,7 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.detect.rest.types; +package com.skyflow.generated.common.rest.types; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonSetter; import com.fasterxml.jackson.annotation.Nulls; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.detect.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.ObjectMappers; import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java deleted file mode 100644 index 0f99fbc6..00000000 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientException.java +++ /dev/null @@ -1,17 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.detect.rest.core; - -/** - * This class serves as the base exception for all errors in the SDK. - */ -public class ApiClientException extends RuntimeException { - public ApiClientException(String message) { - super(message); - } - - public ApiClientException(String message, Exception e) { - super(message, e); - } -} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java deleted file mode 100644 index 4b251a98..00000000 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/ApiClientHttpResponse.java +++ /dev/null @@ -1,37 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.detect.rest.core; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import okhttp3.Response; - -public final class ApiClientHttpResponse { - - private final T body; - - private final Map> headers; - - public ApiClientHttpResponse(T body, Response rawResponse) { - this.body = body; - - Map> headers = new HashMap<>(); - rawResponse.headers().forEach(header -> { - String key = header.component1(); - String value = header.component2(); - headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); - }); - this.headers = headers; - } - - public T body() { - return this.body; - } - - public Map> headers() { - return headers; - } -} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java deleted file mode 100644 index c95311b0..00000000 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/Environment.java +++ /dev/null @@ -1,25 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.detect.rest.core; - -public final class Environment { - public static final Environment PRODUCTION = new Environment("https://%7B%7BvaultUri%7D%7D.vault.skyflowapis.com"); - - public static final Environment SANDBOX = - new Environment("https://%7B%7BvaultUri%7D%7D.vault.skyflowapis-preview.com"); - - private final String url; - - private Environment(String url) { - this.url = url; - } - - public String getUrl() { - return this.url; - } - - public static Environment custom(String url) { - return new Environment(url); - } -} diff --git a/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java b/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java deleted file mode 100644 index b2d084be..00000000 --- a/common/src/main/java/com/skyflow/generated/detect/rest/core/MediaTypes.java +++ /dev/null @@ -1,13 +0,0 @@ -/** - * This file was auto-generated by Fern from our API Definition. - */ -package com.skyflow.generated.detect.rest.core; - -import okhttp3.MediaType; - -public final class MediaTypes { - - public static final MediaType APPLICATION_JSON = MediaType.parse("application/json"); - - private MediaTypes() {} -} diff --git a/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java index a98f4e3a..dad43edd 100644 --- a/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java @@ -4,12 +4,12 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.auth.rest.ApiClient; -import com.skyflow.generated.auth.rest.ApiClientBuilder; -import com.skyflow.generated.auth.rest.core.ApiClientApiException; -import com.skyflow.generated.auth.rest.resources.authentication.AuthenticationClient; -import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; +import com.skyflow.generated.common.rest.ApiClient; +import com.skyflow.generated.common.rest.ApiClientBuilder; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.resources.authentication.AuthenticationClient; +import com.skyflow.generated.common.rest.resources.authentication.requests.GetAuthTokenRequest; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.BaseConstants; @@ -49,7 +49,7 @@ public static BearerTokenBuilder builder() { return new BearerTokenBuilder(); } - private static V1GetAuthTokenResponse generateBearerTokenFromCredentials( + private static GetAuthTokenResponse generateBearerTokenFromCredentials( File credentialsFile, Object context, ArrayList roles ) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.GENERATE_BEARER_TOKEN_FROM_CREDENTIALS_TRIGGERED.getLog()); @@ -76,7 +76,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentials( } } - private static V1GetAuthTokenResponse generateBearerTokenFromCredentialString( + private static GetAuthTokenResponse generateBearerTokenFromCredentialString( String credentials, Object context, ArrayList roles ) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.GENERATE_BEARER_TOKEN_FROM_CREDENTIALS_STRING_TRIGGERED.getLog()); @@ -94,7 +94,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentialString( } } - private static V1GetAuthTokenResponse getBearerTokenFromCredentials( + private static GetAuthTokenResponse getBearerTokenFromCredentials( JsonObject credentials, Object context, ArrayList roles ) throws SkyflowException { try { @@ -151,13 +151,13 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( ApiClient apiClient = API_CLIENT_BUILDER.token("token").build(); AuthenticationClient authenticationApi = apiClient.authentication(); - V1GetAuthTokenRequest._FinalStage authTokenBuilder = V1GetAuthTokenRequest.builder().grantType(BaseConstants.GRANT_TYPE).assertion(signedUserJWT); + GetAuthTokenRequest._FinalStage authTokenBuilder = GetAuthTokenRequest.builder().grantType(BaseConstants.GRANT_TYPE).assertion(signedUserJWT); if (roles != null) { String scopedRoles = getScopeUsingRoles(roles); authTokenBuilder.scope(scopedRoles); } - return authenticationApi.authenticationServiceGetAuthToken(authTokenBuilder.build()); + return authenticationApi.getBearerToken(authTokenBuilder.build()); } catch (MalformedURLException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_TOKEN_URI.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.InvalidTokenUri.getMessage()); @@ -202,7 +202,7 @@ private static String getScopeUsingRoles(ArrayList roles) { public synchronized String getBearerToken() throws SkyflowException { LogUtil.printInfoLog(InfoLogs.GET_BEARER_TOKEN_TRIGGERED.getLog()); - V1GetAuthTokenResponse response; + GetAuthTokenResponse response; String accessToken = null; if (this.credentialsFile != null && Objects.equals(this.credentialsType, "FILE")) { response = generateBearerTokenFromCredentials(this.credentialsFile, this.ctx, this.roles); @@ -215,7 +215,7 @@ public synchronized String getBearerToken() throws SkyflowException { return accessToken; } - private static String extractAccessToken(V1GetAuthTokenResponse response) throws SkyflowException { + private static String extractAccessToken(GetAuthTokenResponse response) throws SkyflowException { if (!response.getAccessToken().isPresent()) { LogUtil.printErrorLog(ErrorLogs.MISSING_ACCESS_TOKEN.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseErrorMessage.MissingAccessToken.getMessage()); diff --git a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java index 865bd1ff..dc605441 100644 --- a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java +++ b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java @@ -22,27 +22,27 @@ import com.skyflow.detect.internal.ReidentifyFileMapper; import com.skyflow.detect.internal.ReidentifyFileValidations; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.core.ApiClientApiException; -import com.skyflow.generated.detect.rest.core.ApiClientException; -import com.skyflow.generated.detect.rest.core.ClientOptions; -import com.skyflow.generated.detect.rest.core.Environment; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.core.RequestOptions; -import com.skyflow.generated.detect.rest.resources.filesv2.FilesV2Client; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.GetRunV2Request; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.GuardrailsV2Client; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.StringsV2Client; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DeidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.generated.common.rest.core.ApiClientApiException; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.core.ClientOptions; +import com.skyflow.generated.common.rest.core.Environment; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.core.RequestOptions; +import com.skyflow.generated.common.rest.resources.filesv2.FilesV2Client; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.filesv2.requests.GetRunV2Request; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.resources.guardrailsv2.GuardrailsV2Client; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.StringsV2Client; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DeidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.BaseConstants; diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java index 41886c3c..be54cb49 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java @@ -12,9 +12,9 @@ import com.skyflow.detect.GetRunResponse; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.DeidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.resources.filesv2.requests.DeidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java index facad0ec..a805f103 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java @@ -12,16 +12,16 @@ import com.skyflow.detect.MaskingMethod; import com.skyflow.detect.Media; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReturnEntitiesType; import com.skyflow.detect.ShiftDates; import com.skyflow.detect.Transformation; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; -import com.skyflow.generated.detect.rest.types.DetectConfigV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.resources.guardrailsv2.requests.DetectGuardrailsRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.DeidentifyStringRequestV2; +import com.skyflow.generated.common.rest.resources.stringsv2.requests.ReidentifyStringRequestV2; +import com.skyflow.generated.common.rest.types.DetectConfigV2; import com.skyflow.detect.FileMapping; import com.skyflow.detect.ObjectEntity; import org.junit.Assert; @@ -144,7 +144,7 @@ public void checkGuardrailsCarriesVaultIdAndOnlySetOptions() throws Exception { @Test public void nullElementsInConfigurationListsAreSkipped() throws Exception { - com.skyflow.generated.detect.rest.types.DetectConfigV2 api = DetectRequestMapper.toDetectConfig( + com.skyflow.generated.common.rest.types.DetectConfigV2 api = DetectRequestMapper.toDetectConfig( DetectConfiguration.builder() .detect(Detect.builder() .entities(Arrays.asList(null, Entity.builder().entityType(EntityType.NAME).build())) diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java index 0a4ab894..f0ebcada 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java @@ -9,11 +9,11 @@ import com.skyflow.detect.GuardrailsValidation; import com.skyflow.detect.DetectedEntity; import com.skyflow.detect.ReidentifyStringResponse; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.types.DeidentifyStringResponseV2; -import com.skyflow.generated.detect.rest.types.DetectGuardrailsResponseV2; -import com.skyflow.generated.detect.rest.types.DetectRunsResponseV2; -import com.skyflow.generated.detect.rest.types.ReidentifyStringResponseV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.types.DeidentifyStringResponseV2; +import com.skyflow.generated.common.rest.types.DetectGuardrailsResponseV2; +import com.skyflow.generated.common.rest.types.DetectRunsResponseV2; +import com.skyflow.generated.common.rest.types.ReidentifyStringResponseV2; import org.junit.Assert; import org.junit.Test; diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java index dd154096..b663f805 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java @@ -6,7 +6,7 @@ import com.skyflow.detect.EntityType; import com.skyflow.detect.GetRunRequest; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.ErrorCode; diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java index 88da01e4..ec711c12 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java @@ -6,12 +6,12 @@ import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.detect.ReidentifyFileResponse; -import com.skyflow.generated.detect.rest.core.ObjectMappers; -import com.skyflow.generated.detect.rest.resources.filesv2.requests.ReidentifyFileRequestV2; -import com.skyflow.generated.detect.rest.types.ReidentifyFileResponseV2; +import com.skyflow.generated.common.rest.core.ObjectMappers; +import com.skyflow.generated.common.rest.resources.filesv2.requests.ReidentifyFileRequestV2; +import com.skyflow.generated.common.rest.types.ReidentifyFileResponseV2; import org.junit.Assert; import org.junit.Test; diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index d910fa77..8b36827b 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -3,7 +3,7 @@ import com.skyflow.detect.DataSourceType; import com.skyflow.detect.EntityType; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.BaseErrorMessage; diff --git a/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java index 9557b48b..8ac7bfa4 100644 --- a/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java @@ -5,8 +5,8 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.auth.rest.core.ApiClientException; -import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; +import com.skyflow.generated.common.rest.core.ApiClientException; +import com.skyflow.generated.common.rest.types.GetAuthTokenResponse; import com.skyflow.utils.BaseConstants; import com.skyflow.utils.BaseUtils; import org.junit.Assert; @@ -361,8 +361,8 @@ public void testMalformedPrivateKeyTypeThrowsSkyflowException() { @Test public void testExtractAccessTokenMissingThrowsSkyflowException() throws Exception { - V1GetAuthTokenResponse response = V1GetAuthTokenResponse.builder().build(); - Method method = BearerToken.class.getDeclaredMethod("extractAccessToken", V1GetAuthTokenResponse.class); + GetAuthTokenResponse response = GetAuthTokenResponse.builder().build(); + Method method = BearerToken.class.getDeclaredMethod("extractAccessToken", GetAuthTokenResponse.class); method.setAccessible(true); try { method.invoke(null, response); @@ -377,8 +377,8 @@ public void testExtractAccessTokenMissingThrowsSkyflowException() throws Excepti @Test public void testExtractAccessTokenPresentReturnsToken() throws Exception { - V1GetAuthTokenResponse response = V1GetAuthTokenResponse.builder().accessToken("test-access-token").build(); - Method method = BearerToken.class.getDeclaredMethod("extractAccessToken", V1GetAuthTokenResponse.class); + GetAuthTokenResponse response = GetAuthTokenResponse.builder().accessToken("test-access-token").build(); + Method method = BearerToken.class.getDeclaredMethod("extractAccessToken", GetAuthTokenResponse.class); method.setAccessible(true); Object result = method.invoke(null, response); Assert.assertEquals("test-access-token", result); diff --git a/docs/api_reference.md b/docs/api_reference.md index 8791fbee..2141f893 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -582,7 +582,7 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | Builder method | Description | |----------------|-------------| | `entityName(EntityType)` | Skyvault vaults: entity type the rule applies to. | -| `redactionType(RedactionType)` | Skyvault vaults: `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`. See [`RedactionType`](#redactiontype). | +| `redactionType(RedactionType)` | Skyvault vaults: `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`, the same `com.skyflow.enums.RedactionType` used by `get` and `detokenize`. See [`RedactionType`](#redactiontype). | | `tokenGroupName(String)` | Flowvault vaults: token group the rule applies to. | | `redactionPattern(String)` | Flowvault vaults: name of a redaction pattern configured in the vault. | @@ -655,7 +655,7 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. ### `RedactionType` -`com.skyflow.enums` +`com.skyflow.enums` — one enum for every place a redaction is chosen: `GetRequest.redactionType`, `DetokenizeData`, and Detect's `RedactionLevel.redactionType` on skyvault vaults. | Value | Description | |-------|-------------| @@ -698,7 +698,6 @@ All in `com.skyflow.detect`. | `FileDataFormat` | `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML`, `ZIP` | | `DetectRunStatus` | `QUEUED`, `IN_PROGRESS`, `SUCCESS`, `FAILED`, `UNKNOWN`. `SUCCESS`, `FAILED` and `UNKNOWN` end polling. | | `ReturnEntitiesType` | `EXCLUDE_SENSITIVE_DATA` _(default)_, `ALL`, `NONE` | -| `RedactionType` | `PLAIN_TEXT`, `MASKED`, `REDACTED`, `DEFAULT` | | `MaskingMethod` | `NONE`, `BLUR`, `BLACKBOX` | | `OutputTranscriptionType` | `NONE`, `TRANSCRIPTION`, `MEDICAL_TRANSCRIPTION`, `DIARIZED_TRANSCRIPTION`, `MEDICAL_DIARIZED_TRANSCRIPTION` | | `PdfProcessingMode` | `NONE`, `OCR`, `TEXT_LAYER` | diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index 813b5c66bd070f9b4d27256f46e4a1eb8b7eab5f..a131a5eeeaa2142720a6038e93051589bbb3928b 100644 GIT binary patch delta 477996 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�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
8ZnvEjj2;wjt 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ʋGA{;dQnC6EZ0 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𝔣lQi9`6l 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 Rt!`7@53lWKjMTuK{{s$-vULCe delta 449402 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≪Tt1vsW`b1={Z&R}u5!hQ7aI@#4 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

JZ>3+XXIhBAv%L9j@hh{2s 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%0A!GYSx7UNs^Dd6z`E{YGu+J|QhN>A`vM}nv*&`#| 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

*WybTQTqhPh#gBe^hZ;ppHhl9 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 T7$e$8v=6@4&L-BiBMR|<9D_4T diff --git a/skyvault/src/main/java/com/skyflow/VaultClient.java b/skyvault/src/main/java/com/skyflow/VaultClient.java index 3dad6b1a..99301026 100644 --- a/skyvault/src/main/java/com/skyflow/VaultClient.java +++ b/skyvault/src/main/java/com/skyflow/VaultClient.java @@ -8,15 +8,23 @@ import com.skyflow.errors.SkyflowException; import com.skyflow.generated.rest.ApiClient; import com.skyflow.generated.rest.ApiClientBuilder; +import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; +import com.skyflow.generated.rest.resources.records.requests.BatchOperationRequest; +import com.skyflow.generated.rest.resources.records.requests.InsertRecordRequest; +import com.skyflow.generated.rest.resources.records.requests.UpdateRecordRequest; +import com.skyflow.generated.rest.resources.records.types.InsertRecordRequestByot; +import com.skyflow.generated.rest.resources.records.types.UpdateRecordRequestByot; import com.skyflow.generated.rest.resources.tokens.TokensClient; -import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; -import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.*; +import com.skyflow.generated.rest.resources.tokens.requests.DetokenizePayload; +import com.skyflow.generated.rest.resources.tokens.requests.TokenizePayload; +import com.skyflow.generated.rest.types.BatchRecord; +import com.skyflow.generated.rest.types.BatchRecordMethod; +import com.skyflow.generated.rest.types.DetokenizeRecordRequest; +import com.skyflow.generated.rest.types.DetokenizeRecordRequestRedaction; +import com.skyflow.generated.rest.types.FieldRecords; +import com.skyflow.generated.rest.types.TokenizeRecordRequest; import com.skyflow.logs.ErrorLogs; import com.skyflow.utils.Utils; import com.skyflow.utils.logger.LogUtil; @@ -68,6 +76,10 @@ protected QueryClient getQueryApi() { return this.apiClient.query(); } + protected FilesClient getFilesApi() { + return this.apiClient.files(); + } + protected void setCommonCredentials(Credentials commonCredentials) throws SkyflowException { this.commonCredentials = commonCredentials; super.prioritiseCredentials(this.vaultConfig.getCredentials()); @@ -83,55 +95,55 @@ protected void updateVaultConfig(VaultConfig newConfig) throws SkyflowException updateVaultConfig(); } - protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { - List recordRequests = new ArrayList<>(); + protected DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { + List recordRequests = new ArrayList<>(); for (DetokenizeData detokenizeDataRecord : request.getDetokenizeData()) { - V1DetokenizeRecordRequest recordRequest = V1DetokenizeRecordRequest.builder() + DetokenizeRecordRequest recordRequest = DetokenizeRecordRequest.builder() .token(detokenizeDataRecord.getToken()) - .redaction(detokenizeDataRecord.getRedactionType().getRedaction()) + .redaction(DetokenizeRecordRequestRedaction.valueOf(detokenizeDataRecord.getRedactionType().toString())) .build(); recordRequests.add(recordRequest); } - return V1DetokenizePayload.builder() + return DetokenizePayload.builder() .continueOnError(request.getContinueOnError()) .downloadUrl(request.getDownloadUrl()) .detokenizationParameters(recordRequests) .build(); } - protected RecordServiceInsertRecordBody getBulkInsertRequestBody(InsertRequest request) { + protected InsertRecordRequest getBulkInsertRequestBody(InsertRequest request) { List> values = request.getValues(); List> tokens = request.getTokens(); - List records = new ArrayList<>(); + List records = new ArrayList<>(); for (int index = 0; index < values.size(); index++) { - V1FieldRecords.Builder recordBuilder = V1FieldRecords.builder().fields(values.get(index)); + FieldRecords.Builder recordBuilder = FieldRecords.builder().fields(values.get(index)); if (tokens != null && index < tokens.size()) { recordBuilder.tokens(tokens.get(index)); } records.add(recordBuilder.build()); } - return RecordServiceInsertRecordBody.builder() + return InsertRecordRequest.builder() .tokenization(request.getReturnTokens()) .homogeneous(request.getHomogeneous()) .upsert(request.getUpsert()) - .byot(request.getTokenMode().getByot()) + .byot(InsertRecordRequestByot.valueOf(request.getTokenMode().toString())) .records(records) .build(); } - protected RecordServiceBatchOperationBody getBatchInsertRequestBody(InsertRequest request) { + protected BatchOperationRequest getBatchInsertRequestBody(InsertRequest request) { ArrayList> values = request.getValues(); ArrayList> tokens = request.getTokens(); - List records = new ArrayList<>(); + List records = new ArrayList<>(); for (int index = 0; index < values.size(); index++) { - V1BatchRecord.Builder recordBuilder = V1BatchRecord.builder() - .method(BatchRecordMethod.POST) + BatchRecord._FinalStage recordBuilder = BatchRecord.builder() .tableName(request.getTable()) + .method(BatchRecordMethod.POST) .upsert(request.getUpsert()) .tokenization(request.getReturnTokens()) .fields(values.get(index)); @@ -143,18 +155,20 @@ protected RecordServiceBatchOperationBody getBatchInsertRequestBody(InsertReques records.add(recordBuilder.build()); } - return RecordServiceBatchOperationBody.builder() + // The regenerated batch-operation request has no byot field; keep sending it as before so the + // BYOT behaviour of insert(continueOnError=true) is unchanged. + return BatchOperationRequest.builder() .continueOnError(true) - .byot(request.getTokenMode().getByot()) .records(records) + .additionalProperty("byot", request.getTokenMode().toString()) .build(); } - protected RecordServiceUpdateRecordBody getUpdateRequestBody(UpdateRequest request) { - RecordServiceUpdateRecordBody.Builder updateRequestBodyBuilder = RecordServiceUpdateRecordBody.builder(); - updateRequestBodyBuilder.byot(request.getTokenMode().getByot()); + protected UpdateRecordRequest getUpdateRequestBody(UpdateRequest request) { + UpdateRecordRequest.Builder updateRequestBodyBuilder = UpdateRecordRequest.builder(); + updateRequestBodyBuilder.byot(UpdateRecordRequestByot.valueOf(request.getTokenMode().toString())); updateRequestBodyBuilder.tokenization(request.getReturnTokens()); - V1FieldRecords.Builder recordBuilder = V1FieldRecords.builder(); + FieldRecords.Builder recordBuilder = FieldRecords.builder(); HashMap values = request.getData(); if (values != null) { @@ -171,11 +185,11 @@ protected RecordServiceUpdateRecordBody getUpdateRequestBody(UpdateRequest reque return updateRequestBodyBuilder.build(); } - protected V1TokenizePayload getTokenizePayload(TokenizeRequest request) { - List tokenizationParameters = new ArrayList<>(); + protected TokenizePayload getTokenizePayload(TokenizeRequest request) { + List tokenizationParameters = new ArrayList<>(); for (ColumnValue columnValue : request.getColumnValues()) { - V1TokenizeRecordRequest.Builder recordBuilder = V1TokenizeRecordRequest.builder(); + TokenizeRecordRequest.Builder recordBuilder = TokenizeRecordRequest.builder(); String value = columnValue.getValue(); recordBuilder.value(value); String columnGroup = columnValue.getColumnGroup(); @@ -183,13 +197,9 @@ protected V1TokenizePayload getTokenizePayload(TokenizeRequest request) { tokenizationParameters.add(recordBuilder.build()); } - V1TokenizePayload.Builder payloadBuilder = V1TokenizePayload.builder(); - - if (!tokenizationParameters.isEmpty()) { - payloadBuilder.tokenizationParameters(tokenizationParameters); - } - - return payloadBuilder.build(); + return TokenizePayload.builder() + .tokenizationParameters(tokenizationParameters) + .build(); } protected File getFileForFileUpload(FileUploadRequest fileUploadRequest) throws IOException { diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java index d465ff62..80f8236e 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.util.concurrent.CompletableFuture; public class AsyncFilesClient { @@ -29,15 +30,15 @@ public AsyncRawFilesClient withRawResponse() { /** * Uploads a file to a new or specified record. */ - public CompletableFuture uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return this.rawClient.uploadFileV2(vaultId, request).thenApply(response -> response.body()); + public CompletableFuture uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, file, request).thenApply(response -> response.body()); } /** * Uploads a file to a new or specified record. */ public CompletableFuture uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { - return this.rawClient.uploadFileV2(vaultId, request, requestOptions).thenApply(response -> response.body()); + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, file, request, requestOptions).thenApply(response -> response.body()); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java index 75814065..28ee91e1 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java @@ -19,15 +19,19 @@ import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.concurrent.CompletableFuture; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Headers; import okhttp3.HttpUrl; +import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; import org.jetbrains.annotations.NotNull; @@ -43,15 +47,15 @@ public AsyncRawFilesClient(ClientOptions clientOptions) { * Uploads a file to a new or specified record. */ public CompletableFuture> uploadFileV2( - String vaultId, UploadFileRequestV2 request) { - return uploadFileV2(vaultId, request, null); + String vaultId, File file, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, file, request, null); } /** * Uploads a file to a new or specified record. */ public CompletableFuture> uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v2/vaults") @@ -74,7 +78,9 @@ public CompletableFuture> uploadFile request.getSkyflowId().get(), false); } - QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + String fileMimeType = Files.probeContentType(file.toPath()); + MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; + multipartBodyBuilder.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); if (request.getReturnFileMetadata().isPresent()) { QueryStringMapper.addFormDataPart( multipartBodyBuilder, diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java index 33d3786d..fec6c802 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; public class FilesClient { protected final ClientOptions clientOptions; @@ -28,15 +29,15 @@ public RawFilesClient withRawResponse() { /** * Uploads a file to a new or specified record. */ - public UploadFileResponseV2 uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return this.rawClient.uploadFileV2(vaultId, request).body(); + public UploadFileResponseV2 uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return this.rawClient.uploadFileV2(vaultId, file, request).body(); } /** * Uploads a file to a new or specified record. */ public UploadFileResponseV2 uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { - return this.rawClient.uploadFileV2(vaultId, request, requestOptions).body(); + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { + return this.rawClient.uploadFileV2(vaultId, file, request, requestOptions).body(); } } diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java index a73991b5..3742cf62 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java @@ -19,12 +19,16 @@ import com.skyflow.generated.rest.resources.files.requests.UploadFileRequestV2; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.UploadFileResponseV2; +import java.io.File; import java.io.IOException; +import java.nio.file.Files; import okhttp3.Headers; import okhttp3.HttpUrl; +import okhttp3.MediaType; import okhttp3.MultipartBody; import okhttp3.OkHttpClient; import okhttp3.Request; +import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; @@ -38,15 +42,15 @@ public RawFilesClient(ClientOptions clientOptions) { /** * Uploads a file to a new or specified record. */ - public ApiClientHttpResponse uploadFileV2(String vaultId, UploadFileRequestV2 request) { - return uploadFileV2(vaultId, request, null); + public ApiClientHttpResponse uploadFileV2(String vaultId, File file, UploadFileRequestV2 request) { + return uploadFileV2(vaultId, file, request, null); } /** * Uploads a file to a new or specified record. */ public ApiClientHttpResponse uploadFileV2( - String vaultId, UploadFileRequestV2 request, RequestOptions requestOptions) { + String vaultId, File file, UploadFileRequestV2 request, RequestOptions requestOptions) { HttpUrl.Builder httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) .newBuilder() .addPathSegments("v2/vaults") @@ -69,7 +73,9 @@ public ApiClientHttpResponse uploadFileV2( request.getSkyflowId().get(), false); } - QueryStringMapper.addFormDataPart(multipartBodyBuilder, "file", request.getFile(), false); + String fileMimeType = Files.probeContentType(file.toPath()); + MediaType fileMimeTypeMediaType = fileMimeType != null ? MediaType.parse(fileMimeType) : null; + multipartBodyBuilder.addFormDataPart("file", file.getName(), RequestBody.create(file, fileMimeTypeMediaType)); if (request.getReturnFileMetadata().isPresent()) { QueryStringMapper.addFormDataPart( multipartBodyBuilder, diff --git a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java index 3d25a53b..6979c78b 100644 --- a/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java +++ b/skyvault/src/main/java/com/skyflow/generated/rest/resources/files/requests/UploadFileRequestV2.java @@ -27,8 +27,6 @@ public final class UploadFileRequestV2 { private final Optional skyflowId; - private final String file; - private final Optional returnFileMetadata; private final Map additionalProperties; @@ -37,13 +35,11 @@ private UploadFileRequestV2( String tableName, String columnName, Optional skyflowId, - String file, Optional returnFileMetadata, Map additionalProperties) { this.tableName = tableName; this.columnName = columnName; this.skyflowId = skyflowId; - this.file = file; this.returnFileMetadata = returnFileMetadata; this.additionalProperties = additionalProperties; } @@ -72,14 +68,6 @@ public Optional getSkyflowId() { return skyflowId; } - /** - * @return Path of the file to upload. Each request only supports one file. - */ - @JsonProperty("file") - public String getFile() { - return file; - } - /** * @return If true, returns metadata about the uploaded file. */ @@ -103,13 +91,12 @@ private boolean equalTo(UploadFileRequestV2 other) { return tableName.equals(other.tableName) && columnName.equals(other.columnName) && skyflowId.equals(other.skyflowId) - && file.equals(other.file) && returnFileMetadata.equals(other.returnFileMetadata); } @java.lang.Override public int hashCode() { - return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.file, this.returnFileMetadata); + return Objects.hash(this.tableName, this.columnName, this.skyflowId, this.returnFileMetadata); } @java.lang.Override @@ -134,14 +121,7 @@ public interface ColumnNameStage { /** *

A7ds+)>G!!Qv8C< zo@n*(M`!ozL-_BM<{=0jSf{9$YI|uN-~`mPhI*Ers3M8bF6k!7|vi3#N%d#YX9%CSz{yVdX_(U4saslfh4p5%yZ!gL?Gh#u@UqsfmE8TImLtE3#rJ3X*!sA&$_{&aOtp z-)}{KQ|e#!jEH{wjj=J%sha#WiSt1`Z~;9G0x3P6&_@bY zi2}2mp?bz~(<%C=a?$8Coq8Ki63H=AKTnGzf37yx>-^eOi#I|{QBgGhz%;2EUrNYD zu<9MA(xTFq@R~khJ@KA%+UUW){A^}WV8r$5Y>QCQ)MbK4_F9;VsE+oD=vNq9A-6_4 z0cn$ND_8T%ImcUo-|ZK}TMW=r^GMT(v;+6MKLb6WIn?&o#~*}$;`jJk2?Ef@6d(yG z9(UMEUbeoeiF%th%JVf`RCgE@%GW$Uh~aJ?Q}7n*@&=+p~Hyh z%FcgwiKb$5k$7CU>pb3-$5lmuO(BMwNU)lUvW(g_q$hkQsc|?^kq($2@cgHd0sQP_ zV52Jmx)_rDK5lI5vR>}QtW8`@?7c`mjZM-?YJ#w4V8dJY{>~jUIA$pA)s_(j6nnkl zgzFR=k#p@uuS?f&y^vzgnTZC9+J-)-Wro5anylS2>eNwV8!T zE*tkkL&$vjk>@b!{_Cp>|D$4Mo%X$%JF&db?Y$ zvi_^Q=q&9_WGkqGKZ3|hXQKFuxdIUi?zXYXmze!ume2?Pp2Ar%EukN7R|Bc+zT*`5 zh`XN|xYLVRlI+7x+ruT2^>Rl9jDuz;B=}>&!L@Qy31S3evIHS_;onls_i5g!yt{iZ zon@`*=aw1T)ir7P^6etzRV^(`=GhfQG!Hj9<}_B0ggA&T0_VX)V11eukEqP#)AK)s zPnk57js#Fw`h%jfXas~p1c3BJag=>jSur^|#vU!hFf)PXT2y;1XqsBqMCg^K_BkMY z@shR1_5ys4JbYmbK;+Rej{Bw7Z)KyW#B!9NBS@Kq>{^P zH=~d(%~1SbqEphhs!C1;(4ugPPujIl0f-LCFPJ?DR`>@Ql4li|boIdz4Ww5TNfl0| zMNS(@0Au`9_xLV=xgBd9%}usG$*=%YL(c0Atk!4R(E0EydYk8Cx>au#_1${n0ks@LSof8)w4b2Za{K};HwDNlb zd%ZRW(U?E-rU;GgHutV23vfVOIkm18A!-OmS?KX?G*@h|;GZT!I!c(woK_tu zYb=`K;)qoGA<`!khmgvY1Pd2;xCPb|9`JJ3n6Y=YZ*gCY%Af4OOM{V`X~4b@t4!1m z+g&2wK*qo<0?xuagtB<(m@S3mXdmO}P6O!o@-_d{t}_yvey-V5l9)vfM+&Ur!|jb9 z5(T32lIvZ^MuvZ(fkVVDu9WX0#r%vf?JTv2obsZ_v6?DfXKxedo?xXL?>mj7V4&+# zgqouPn4WEqN|HoSbVXN0o$Tv{nOMB#vOhUAQ+@N5)tJ373F4IQTT<(%Gxz;XXxwbU zyQ7gfzVQtiCYN0|O+ha0$_H4Um}!zP8lDnBf%daNYoMaQ;2owg&4kOu=5>@CkQo zliFtAfQ>=EQcM(L9-fXDQ3u*H%v{YQ2rKlYuIm3`>m8#b{kFaBbUNwSwr$(Cla6iM zsg66gZFg*|f{tz5Hs1XAdCt3^v(Ga|eOqJHhgvo6^}FYq^SauEWJ;L!j};w;-!}kJ zu7eh$2?4Iu>C?nDtP%ZV>rgF1E)85!r{v|d6>#(#Ldl?*gh{YmaU2E*HW+Jg^VoL5QuR^ww zZ3~bAn;4niUn$*YZAJA)qBq_Dvk(c0#m_VsI~a7Coe~DJ`|8!jv`>X`j8xet2&yG3 z%X%juOW#pV&5ZIMA35N)IA9eICnKun6=cwr%g{6Crttw8!o1Zmm&V@N=y6u^BSHU0 zT54GnOZdq+Yqz7Ksv~`)DT`%W$H@b>+0dK*oqWRHvokLL?cZ2^ccL{#pUDPjJd1sbgk(lZ*cHi4F|S@qv((4%`dFQ zYHKweig)TFeYuqd^{l)FWBRimIB2`X_BT1p-_oOao%1nrAps1KmE+3*<-fQ#gm$uN z?Y}j-j6`pL*`;S9n{e7IInvk}ms%VwQBf=(psn@t8SXWru8{DIoG%sa(4V1GGWR8S z>Mt?bI~Ynm;lLeW&w(47@Ta)X>-B8 zb^Gfv4AdTigMl8uqs{&TaJ(T){&>-eVrHF<^gRA%iw`2_mEFUgCK2CP#(>{J!fIuJ zvB@}NGQd6l&@uP0mw@UDsHXOi9o&7w#!+nBjf}@P6E&$b_Yxm0jL0a~H*1H~*SIFl zHi}BG9{E;s@5-}2JdT}N1FG>Uq3^s_9R8~hkx*wahN8&k7VM1Bt!AFt6=Oi%PR_O({ zTihZ6TYHkKx1qSr3u_d|wwwG$tj!UcJJ<^-Dy6c7TcSZHQx3y(=45Gwmdc0ngOudg zl6kpJYUknvRWxn@F;6FT3g9gD@=2fph`h#`#`B`i0-7c1#`0C>3U!ymt*%ejLW5vp znkTeH2SLYJs|mdCq|LQAXU0%eZRcQ69!?OB&qt%CdkORHr#}NlEHehroP^zR5gUgt z+?xu>i>te4qq~y`#7lhV-(9~3)I}A1@A*Hvk+Ut2Q-cTqwrT*%z!<@#ZoB@2X=ITx zc*}QPp(bsflj;HTY_K-cP?=FkDitFjXao{L^u|68?9~K;J{coM2$ld*X7}|V-ji9AdoC?HLb+ORL$Y6mW{s(E7RoENF-ahk^{DP zXh;S{CZ_5zn!Y!LKumLc8%lftnHjHggvz90a4{fJ2v#l`{@nvUljxHq-W~c9 z=8CpjU~AUu�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⪚{`wLcC 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 dqqa com.skyflow.generated.rest.*: - com.skyflow.generated.auth.*: + com.skyflow.generated.common.*: diff --git a/skyvault/README.md b/skyvault/README.md index a6715cbf..9a5db651 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1924,7 +1924,7 @@ System.out.println(response.getProcessedText()); // My name is John Doe and my email is j*******@acme.com. ``` -A `RedactionLevel` names one source and one replacement. On skyvault vaults the source is an `entityName` and the replacement a `redactionType`. The `tokenGroupName` and `redactionPattern` fields are the flowvault equivalents and do not apply to skyvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. +A `RedactionLevel` names one source and one replacement. On skyvault vaults the source is an `entityName` and the replacement a `redactionType`, the same `com.skyflow.enums.RedactionType` that `get` and `detokenize` use. The `tokenGroupName` and `redactionPattern` fields are the flowvault equivalents and do not apply to skyvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. ## Reidentify file diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index 309482bf92ada6da267cbf1562e7cb4797c7c119..afff0c48eed186cb3d1be20c8ec97dfed508a89c 100644 GIT binary patch delta 486953 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%0A97)c^ZA8lnvI9I+ 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

2L}-b^kJ=BhMDUxSY~2fTtVd3+ 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�XE>m3 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

Y+rL4e4qSi_?OuFQ^RR(o&8>N(4% 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

`JeKTUl?;$g{Ob59S|S=+MeQ6 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%0A?EKVHu#Q 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

aYCKkmunQA7D8qn*_ zl_p)Mu_4k#>eb%_NKcMLW#QyBL_BJ|x6dV#3Qlwf?raEb%* zPLYb|#KBM6S4QPcv0d&ORo0m2hF+|Nv^@0_RS!2Y1g~YVC-2CiS6d$B5l<(iDNb`z zEj;9;W!tDW`yPH}esIr3@mdV(=@cf@ZNqs$^$~|4ISvTOvgC*m`i&+Wc1gU7Q=I?q zFLZSH#RHgeivfjzMs>)(T07flSbUjbo5}_2RKENE`UqK|K`1Y`6z_b*eKGw9{x{>} zU4Hs@UV=w(EWR*QEg`O_SZgqeOeKkDQdy~e8cn~;^YFqbK`)CGsG~4&D149@htcZ~ zD8Dyga4W5X3y+rIfm=6;vfr>1J7#hI^Ne+(K%%H!2QUbfym%WvI(e(gv}4TxKsOm+_1yvu)_|KO+@yc_~fF-4$M*~)4yVUq+LPx25?4++n4A$2joYL zaG?Qk)r9fkPot|-43k>SxATtZ;jpARuja)8I`$J#lyY3>U{f`}dOSM7mjM1;Z@|JN zck#bHO?^Iy+r&3_ka8i~g6!-Mv$c4L6rH9ShF!}(^TY*pnwkcX^A#kzJ+#gKBNa(VxQ5I|#lGhyd*v zW!KVLSauQxe^-TA6rGLa1KXsc+d~$fL9bdzH$RaqdB8JXo;eFqU4+i$-guyBm7#-~ z2f}(X9Xp)-+9vV-2VLhclhl9LG4HM;VW$EZU{C>HzH+=6@kri;-38j3CquT*qB0`H zP*8$_1P0K0WP#Z!O<<;{cI`JHe<+O2jS6gs={&DaeV(>rr(4~=nXkku5b4CoP;JZ` zRZTR8X*MS35Qw_VMx&=>WB4+flG|3Xy7t&wHSL>CU3Eoq3Z*OLj)6RrRl0 z>$hkGZ$kmIKtgvO8v_2e(VCibep{5t(CiBDv1%V#mN+*&DPaX zg*-@_LAAMcUBz{j8pUReTN%37(I+eUFw{ z1vg`7oCJ_&HB}Ppc2qeQIA+Pt#MvAm2)5U%DhJqBA3fo(LJ&jK3__o!(zk*;!fe5{e-HUrF@DI7;VAm~ z_F(ysx5xj(ocj%n4Ps?S$N;j(rXd+|cL1h5YX+Ho!m6NZH*FizT9vd|YMiUgPq60< z`9!p|TEKbm_{X%2TAVl_4sjsmW*c>f(}czpyxKx?nU8?bi_%NStWCh zwG37cOQLGA$jrc>aok@&);;E@?_dgGvU!u!kbUd7Bxr z23TjqZX!cf!m2C&=IKuwMQ%>T-b%jDBJAPdy54BZW88hLEHB)Lg|?$&k})GZOv7Qz zCC(rerr}T-4gxYwF@ZQ$nWcxEv#4GZT+2c$jVa{A<@E=+LrzRsJr;_GJ18?26_TYe zCi}LyYn1+B=U;0i)W+9S>G3Y45o{brxRK%Rv(S5`qqq^olxz?0t=}TjB*O~?YSP?C zYBR}`neO9x0@uQd9WhR}(=_6<2-@0_7h8sk^@r`!XjYMGG=X$ofLt}ERDafr^Y9v2 z@@6w>BI?gTl#ULg)k7qzJ{vTsku1tNHK2N3Nr#dfY^}u)TIYrp%^Vi(DL%*A)!$e- zJhxG4YKmI-+XKjcMkTy=-!8w1Gi6F=?D=fL=mNcHh?2v5nB#T?zBv~yJvwXK1Z8d1 zSY*vx1%cv@@qlxz1x!*^=z9suG>KH)a{_D898>5X%0KgrEWOd4(tb6STf0Gqi|Cg< zzw^}1eFX}AVu<;kr%f+<;8fq;%=v~Cw@}y%EtNoDI&;#Qx);xscJ26sv${RkB^(LE z$CR$nff6Fof6LZ_=NK*Dc_VYygd|M;QWW=5h_?e5rGYEccX(Ra8AHEmOt9t5+rM=W zIkXlNP>Zzts^=T8;Q5t1osDV;$$I&XlFpnB`|E3*G|I}Dtk3A;65I!0OOTD8?5s%* z1TQac6CfTeBkW=am?OP!-WODHyw^R^TqCvQ-1{f#yZ9mU_0XLK$XLhxXqpfTO|C=p z3H$KnNC5grYuNeW`i3pB5M|rEk`%RwViW0>b{)gt=$6RpZ560h#DzMsQK$!ZwI56C zm9Buzy%=Q_W}(UGfk5 z=$AsFk%9b!qa0OgR3REfdk0-#4}`n-!EFy=)lPu;f+Whn(TQvtUrZkon(=aEl|=eajNH|07J>;l^KGnXU2@JN?UN7YzQ7 z#O(iB!T$BU^s2%`gL-*BwI2Tu5JHI@Yz+)#*ljfc+HvxTJqmLe%!);DXYH{4;oO)r{0RenQO?rL#47ca~Yoy zP)oAoOxqm6MCy}{4*E^Cct5Y0%E@c}qP;#$h(wN|S7M}Vr3xg8%-C&6AnWtPPYf3G zNb41uY|wO@$lv2~x)XDNrV@dtDp?xOKjHclaI3`*kdb6V?z?@KL(OMHw8iuM)uUZ7 zD>!xi9Wt5oZT*khXd8c$nIGU+h*pqZz*RT!(ZHpFUT#At61iTYhMo8A^W<5P_OY1C zc~+&18!{RO9ilV!mnAspPY3*Wun;cUcnJl%V2KNKEYpzolmpi|2EN*(cG#?+-BKQD zZTQO^T}T37rxG6P5&V=-|ILh37)Y$;|7;p={~`SNpBlwa`YQ$~_b(bUutaCm3quO` zuhJqXCu2!yCO)bd?BPNbbe* z4ztxoXKzrh<8Pm5zIJVM5;$b$CQr{^OkdpwaF~<=|K1&&e3|W6A`P}CB!V|T`O0fj zKdEQs0~n|${;IHb*m`seG*6SBO3P^JII!GKh4*T-0MrcMmBqzqdK8U2gwHB`hLcMm zs-d<}Aw@ho)xKrpB4HYODZcq^8@#LWV^{29mV51`H-*EC_?~eUi z*5c)lo6)BZ=EZIqF?2sX-F8b==*A>=gpAgql-$sZmDx6H9 zn7f$$dNiU*nD6#z`nd8G8vgXdu^0Jw1()s`Q`oEd$BK~R1JMHWcGUfvip|{wQ4(#| zU^RYoNG|*N7um|J(5GX(PRskGiVm$TaXjo+1+Z(hDRyAHUd809Oz@8H0&RFs&9%dF+~a}4RAt`cdcaJ1Qg^ys zNl0VK$6sHyuY`%&83Yzfh{?7Qk)DhfNCOtn%!1z>h-*CEYn!_n&Nnvqh;8FDZ-rRu zah0o>rt()N!bz+r5E&gY6s~j5FQWi`6%p46V^S5TjtF>o#J5YP8a9s_ZG>2h z+>I>3w<(p1!liLo=!IP7ya|`_?DYhoPqmvv5(LUi&KYrcii{yar^!E-RbXCqP9)Zp zUu&@*>h|$J8{4;-{}Mvx_(DmZ!hzle5h#EO&EQ7syb}zGkVG=p_J&Eas*0xSq0k!X zkFX--p|CA5>=1U|4oFVZk>5YK2$NB0R#|yLFGDo)=un^W<5<2Qn19R^f;EwbDNt2- zT%u{y+Yggy#5|UYqO71p8Nl#U^Wpg3@WS@)zUXejMEmXK-sD6iPJIis0*EFr_bCB; zx+UV>2(J#}iu=y_h;B|WGJ>pldumD1Rj;8+o~8nWL+ePzcu8ahDx3v+kUWVKbLz6z z<+#@6-a$Fb;W?Tb|NOO=OyDPXL-OrK@zC#kuJxDPi?{h<<<0@+Oz!v292A~SIj42G zr4NL*r8U!Ina0mRaseBE#@|~*G(h4V+6q+tMHc60Wy{pY9(gi-sx2)-Qx%tQ5WO18 zZ+yUv0h?k)k~?Ot&?v=5XP5Ld@ys*u_lJw;f1iHQe`Zt7 zKAT?8e>6RpuaN&YP2#`3uHtwC4rOwd=9b`)BBD_7$Im@WVa$MnF^b$IP?iXS5Rlz= zv?&?xK-^t^Wu@7?0z)l{8c8TqTZzFIpiznUTdM_5tF3wBqCR!?zJhE;5wEji)bqYF zjbAw$d8s;e+n=?Fih8*@^z}WnRu6{Kd+;|KiFW-aG~5iwqz_f5>V3t@L<64wsRYGW z7VSyvL3%hQb72dc$dieb61>i&1fXgewT8BKu*jD1Ztj&MscIFVc^6E*C8oVn!J4V; zIUli4Rj`hdonC=B3C(mODwM6Zo*H3o61H)^4Bn7p7(ALJ4b8kE8wVwxKr#u3fU?^7 z+DntIES`amWOZmLntRF{GG1MAayT>%1;FZ1yxd$;Q5vcRRj}CTNHS>s1SBUf3cWXJEUBxdki<5KkuVHs!`oExiE1Y+k)&W-sO$)ILRABk>X-; zD@mQGI*MKyTCXHO5dNFF0|>J*rzWfwfPR_!wK0l)hbwh%>GASWm*SOecf4X|nA99#kqo~dG# zQ-i`zsMArGT)L8D6Y^SaqGu8;h-fO_@d?SOO*4~&Aj}=!B(|MFDZNjzMvj|hQ zqX+RpZD^wNuWjc<=YZ!WndemWlFDTr4JeT#(lf5G^p0{SwW@=_a&gwy@i`dir zok^jUU7m6|G8N|1A*gKaXf@hSQ;;D(cgK_K{ubt}qU4w_;w%2jF6aB3)Pd*#uXLa3 zf`7TGpuC8$I&kUd+cV-UJj?x!oCAm4+3*P-K47naxSoR@#_15-pJyT4N&jvp(|;+= zX;tdd^nHWRzB^KhC-lbZ^hz4+z+rhG;7i{tZ_2FEU$=ztSIK^W>mtA7SXN@TYw*rH z2yZM}^@5c-p#C~ayx8eQx}1_4A%#C? zX|mZ=b4}}%Gkd2{!sjEwKjGzfq01mGop-neW%q8SmWQGFTX#m;P^69YUUC@U$QWzp zfOZ0`ndK3qVGq>7-iggrolr+`Q5%pGgRc&VtNl_7dCMPKqKOyl*nbO+B+(RRc`*T5 zVsO1*DK=!7>gtLFq&n3khf2U`%=g;FI`RYbt>+lZU(A_ zp6bKx(%0D;-~7utp}So1H2++*_2QuX@4NH=WF>ySoX9|a3us6nZfOL1aGorXxio?r z5d9`XI446DgCjA$dV+2uVT^(@mZn)&el<2CQEt+=ScdzM?Z8`qDSpbAz2MZ())h_-CDNSR=SOGsPEpAemOl{UJ2D(S(J{3Y2!YD{Bn`Z?2_U3Y9 zaxLa@ri4;gfN!}9+I)q47M}@NeR#A5lGhtb3TY?kZ70MuGv^ni9AS|AD=uZp5==C+ zNgAd<%b|TkPQc<=php9vz8wY_fy@nm)1irJSQe+SZHI7yryVO1rQArWR7k2T<3%YNGc#N#5!*eHhgzZxlI!bo@=s2L1)inbBi?!g>j|CA z$ZWBk`M=_19tqRj&cfMaEsS=X$RGW26SHKtw`y<#@C!%@&bU{)@!JRRD1e&)r6mOn zo)%vd?VmFSn;5AK_xRBK?%)M+6wOGcR2Ud4iP7dPM5gYB7n&>Oiz*pOzq+!}_Iqw- zno}b;5-l*8&T^anEsD_+_c^uZwR4JF-DQ0he6#DU^}mE}@(gU6n{@W3Nwx zQ=F}Sh&t2NJe_Z!fIOh(NizyqMZr=M&WwwntSGpMtGQB$k+ap5r?Yp2XNZ*xySVTw zwF08;NYbO>I8$k2=W7V1Aa{qdO&~AK-o6!JxS8F{uEgw?J&qiWE4woy8er?lbdbB| zr7m+Oy4fvXd$bmOJotEWo>YTFqdXzQwrd+hrIR@`ei2gkrr2%0n=qcoBRcS_>b}O| z{gti&lXENEZ}oS6cS=Nr(88Zx^DxP6-UB!?Uj1EQ(4;@syp057f~|2vD(^ThgAh({ zj|if!%^aa!&)9CFFOv7j((*>=>rSUd>*hz34S%)t#sTuZb3_b z!FDO9#$OHM1Ob~YWE@(Ys}@j@hzr%=G$*%M(?#wt2uDNiQ1C}Ir|{U*Dhn-O1gAhx z;b5G0tk?CThB!(`VZTI6y!I31bz)#IjLNfcx0f1-2)}V?@?t)nNc%fU!RfM4bx*X1 z7w zfSh$y?~}eQc~l?!^CEqS`CF3}GSOS98?w>RUY#p5CpyJ0eWgq6w893kU1sFVU;8L@_9R$=KCY(3903@7af+_w zpafhMQK1ThLw4NH+*x^q9KAxf zHb|nru(&+#1;HFmHX>kd90~tK`bz;hzcvanYR-46lV>x=>p;0hK9t!-qyAj$qLFDH z$@@)oNeJvhuruU4OUtN8=vzq$ULA6$*tG5d8Oc5tF-}pUuwP8pDptUju-SOY<1%#j zU~GOdTgN;1S)3)fqf^KVjEyBdhk`qfg_jb@98%*0cjjFWj4Rd_+@q;X8Q2{7xkcuj zlEvH--}DmI8T1dvRk$Z-Qm4`=k!w3K1jA&zAe@_UI6+Y}v+v4G5Y`)SU%ngSw(|ZV zAbXol%xwI@XJuEhXUPlnWy0*1`T?E;4w}A=%``*hdxb#M>`#gkv3_eJMKwpx`n%gl zilxY&q%gASkH0wi;PZUpaUzka+twTXbmm{JA77UG-BEf?gP zRa=8Ro)%W4Y=C8T@Cv+J7*siyQ^3{|fx!oNCp(Gu*We*0uMyA5Ee`vtddq6>WJnLZ zGa00*Ye!Z?mATrxF~fiSvvW?eggkC_=~)K^9XlhC`_}Ub33@r^)|%(kZQ2hnzdY3L zaSKm(MxZC(-O-))5JR-NtL1v7ZVZOVWvw;PXM|InA6QgH@kG%;-`(+7 zC4io&m1>xZpwoHXxaDV+Zmt@3bhsVrfy-2*Pzg%dd}=ep)yNC8+rBB;=r7s|i=Zds|!INKkh+ZtdzU zQO7ED{HVj$k4`4RL12QM;SS}u$VGsl5=QRtvHWvRBG=K=NyEoEnjuCo<+JAG1CpKl zx})OD@bRO3`|z)Ba@<3R$uxV}QDvq&*@f+ZabI2_uDj^1IWF%HVPylUCUx|~_endv z`wKkk+q;+V2N+=$Z{QM_s4P^MH-I7fmCh{8+We^z&R$ThB~ZB$GieEX<0ogw`J_c5 z6a#*5!PLz&L7^Gnvx&da3}*`NtMOP;BZ@C>;dhyAV|z8l>*@Qe{9hfnz_1^fdS7s0H-ezu)rXmz z=QsE1XDt2w{DBd6foCr-4z*;R6+ z(TzYaP!m@0q!?8?$vyOm#VD}oH#uAVWA{Q*3>NnUUUc-oeaqKI_3I>Lo_;8j_!g@% z^kBo0zqo&GR8hm(oc)L$$KbST1d=sIH>rGTrKA}t5rTU7TTVD|{^0zp!wEK#0oJW4B3+zo8z#K0v znEd~nf0p^HC0VIuD(lniBDFh6-?Tj1Qd6K3?}=CN&7ak0s`ErxDk zJxX~N%f5oYl-)7xrpmd=61H#(82&+Xm{ddq>EnOdkmxy*MPELJR2%=1bdewR|F3!e z<$6!4Bj5owmP9dyHtU+XWTiyKR3%feQ((crVWNee<+qH4r=33chk6E?X0pmf4P}YQ zO~$bD^9%kdBD`YOQX>o)u*~Fmy6kw$_4DE}>HYSMXi6B535ko%psaLfd{wPCOW=^R zxy9vgyfSX!WQx9&y2U~36}tJ-ywXU#J=9h(K{>@?LNWQ;$x_FmK3Cz&0TWVYgi zh)9NICW%WPZ}l*J$SXnS_XDt4sH`caxEy&tH>J|}@+&pWXHU3D9P2V|L|od$J9BEf z4iiDI!BtzTN>?qaY|d*if?AoM#*|Uc0Tz>fXm_BLHFEf5!d*(BG328qT@YJDJpv)^Mql#tM%ahwc`~ z2s^JbAAMiFp%O)pt~6Y*-kYT~N*!L85OXGy6A>!ZG52_pDp;a)F>Ntx2IVVo2kUV& zH22vslPmtRawa|Xh+5B9EOzTRmCm?5{GbPVfnv0x1?_gB`jq6TNq z$TrJe8a%}zB=(`6c(Tt5_t3|VYflD$vcj2nb~qAz+b)?mW!EZ97Sw9UBv5;I=qgq2 z%Q$Ur=TP3RaUS@J`{s2Lp*oV!yiO@f%ymiUJ$`+0f4I<-0B$9Hn&7ddLoc{Q)k_Kd zVpbh#i(vpo-8u3LOHscs(k!Y=N?WAhd4xc=TjmcL|4!lvtN2xf;S^dQ4nBC2h%#;W z4L7%YV66n}0Lt57pOVu#ErJy-a3? z`R7^lR)kD~8pFk9CX-2tl+xf#OE?Ia8iEA*;93qQ#qyn?Ipdcs1k>vTb5VQrgk_XG zhtw+tz`6^2YpkC*c(I*0DV#i(z|3a2gbg=QdI~JbPxj)2c3zGG=GJ;Z;RiiY2(3B? z-`Sh&yU-Ts`HKx7yYw7psa0n$*gp!x^m6ltgU{j*waGz?*-_;j81B8 z1UzKYZ~ah$5ilmK)DDW-(;y{n1YBTxK1RNHx->P;qwZyDM^q>m&Y}zB8#j+WrhSg{ zugIG8rh{>&W(6ZYLYQ*2K}F+YRdpKkrm45o`JGHRv>SFU#go6D(pRhnZS#rj+$$5A z+XKU3`k@mdDyW?dzl%7iY5)YtqUHP1^k>El)}+_Q5=(Y}I1W$IxJ~|*-LHh^XElDx z?qNSKY5%Y6`=1ya;D0iiWdQCP?rxe+b^u3pfSa?EqZ{DAqJmqr9X_We%x}~zjEtLU z;o=G{=1i?*1@_ix%c_$G(VF=5Vkz1Nps#^p030u#mJ_FIn0u5H9N~F4$xmGKLfz-E zb4?Oe7*$a>u%4#3Zzpi5lZ`oyyDY1%2JNCblz}ogU7yuw$?ZQi(u?oqD3M z!6vI=u)^Ii*U|&qOUYu5!<)EJ)x!`m?84hd=QF-xg0U8ne~Ovbxb7vaKL07Dsm6X4 z2#tiBOItO2_uBoaI-2AjTA`J(ON&zHsxu8VyTt{&$S6A0i>_BtK4RM7LGE={CC4+xE*DaA*aYoJJlz7_?$NL-a8~a`5@cf?sY0Qp5%Bqv6Qj7H~ zIZxcU)tdjvaq0i`x?`olgp*c7g6kY2Z5cX0e7Pz%0 zcI}F8v7d10wu*h(?~0jH$8eQd{C^Oco|T=UJ$BqBRq`)82@P$-ZPa;#E=ALS<{kcA zhr0)@H)Z2O4?9aB@{EXXpFgq<;4K$wxG22U($OCP#Y46GOo!%w>ats1Bx%t_e`CAX zhZd?sTp2Xnn|PMIQ8o+Op_0i@LHeo7{o7S&3-gKBgLdjoTXdVRz<1u#o;{}-aSmfm z63z=#b=r}L0RmoosBeBPHU&Jn;L3w>;>I}~%r}>FNrF{uj?|YY=p$M-$}HkgGiOVU zW{IO5NRLvKD(x$__$*v=ArIG{zVSV2;!oN@L7ak^^ae3Vm|{2K4n!0;3o!|~_P7#b)4xy_b9(r9%t zkgWMqA!BEgEaXZYnlEvP@%`JV!JLcKaBeX-okv7^;xcoIuRNWe6jUL*4AyI)A>*>@ zlvc&Bh##`DOp&^MU$se#`V(z}(c(;OUy)`MT=tY*=*Zq^nJ0>|K6mA1aW`dLF)U#; zY`1&KsP|g!#^f3#wcpY9YzG9R3T^;CKrrjyI)`cN!j2d6_c~wVH$(Tt%X`VMcuIJa ze|PPquEY4Ld6||8I&;ofj!IEs4+Lm6;O^*P<%KPR3;D!!tl}qGJhWc$a`6)kYBlDH;n;xO?U^mHXxjgRuLW4yg>cqLXm!0bwMe zbrw{OIfh!ZQm0hIPn?qmDPuI1mlkR6MV_^P?kRaZigm;u5`Lx5Z8+0>o6b@{57)4d zsnyP`R@9>F#&cSDXr=?^LvYM)eSgr*i-oU`nL3M<3oIG&dtA7eOA7D3|4zBMih!pa ze=XS*_@97fP9}^Iwr-LE7bF_py^1t&`8e!i0Z^PS0wE9qi6eL4o61L0e+Z9w06Eqz z`}syM&M+z2TY1RGpAog?xQxEEVlG3S^z`La!MoH3Ib)X`v_%zkl@*0xdT`Q)n>3&Z zY$d=$l)A16pL$j_{fR9~f1*Bu)xIvd5vTu7ElslesXfrA{L~((hm9p|Ze7m7yU*Z4 zDR?m;LjiAnF)AdwR!h%l{J7otD4Z=+WLp-m`yY?eD#=k!-&VgMzJT)_@P}(zqZ{Rd z+BF&si)fpqH}aDRS{XN2Hqi7Vtx{<2d^b{O-sr~%&}zc zk7@!eK1c*<*_D{b#cpl-6Af?zWm$ULZ0%Qgo4{?T5N~EkLoZ0yt97YQ=Ykz_u8*X#x9+gvE2W=+ zm_W_g=+#L=m9mZrY#$rP>b-Kwu@0GuZTs5+sqnNzdZ#TUN`qM9_f|iCM>%gIiX# zn?iOIji4ITfH+t%hb?lTv{H}Z(U8Y*GLUe9y=O@Oo*=~C{5R#6r|qd57`RUPT6mTF zNWiROR$q|P?2ytZYiT6k zS$AbWmuB-)wRB|nLi7Dh%D(bUz!+PTS1##tPMH+<}1Ejw_v{IQ1+s6D0)q_dX;GZ;Oi(>;SKnY&LhEKEE8ZWE6- z*BWNFDuY^!aXs05;se`?&-=;4`%OJ%(V6|7c1TOk5^GGg09JUi>@pf;IZABuemuteBz4dMyty7ifm;--ofj_c6OPv7+7^j zgAm@dY-e!UW=8|p1D}H^$`_4$aZcESWz9iiCqF!MOA^XE?gx z^(c~ypeAGfB?V9A!OY#YcollNnth%E3NshKlA$4qVbwj+#4|XN^`E&kZA2v!zx`<; z4lEJk)L7JSy+IBAA_8Uo;+P*h|C5^h=eE=MCPUoLKV$tdv~S-(z@f+g4ID}a=KbIH z@rfIv04YMCqk!a$5paNr#7AxR%~p1+v^r?alt+Rc!p1~1b^a-C_8q~2Yg4n^lp7SbcQsp&1y@>3=qLNZ2;`DVHz zdqq=7r|g;hb{ud@GIg778>m;rgNw7wRdzot7&}p;jqEFXCRYaMI(svEj45sVmfgCq zc&1b)P##~*vAlHqm{Uk9L#d4c>lZ>)PV(S2|3wbsRPnI!eIIf^NRl!^ zLHTmRMwNnBK|KyWZ@__}DAE!zll+yg>XCJ5vp7bA5(%h;Pb1|&$*Z_{UF>2RQI^VL zBe|$c6hVI=D|bvC3s~?62&yce6r=5>Hi#~+AEwI}e((d{!-{X@s%TUVs;V)luv%SI zhepZel9QF#)N_|#lA<;_k($;jlH^m_G{&N21_eW0<*+7N!(5d6p^{3eVyV>vdypUtmaxH{5##hJw#xIWq~ zNoPOq*OVcW&ML$bz8-|_g*$&`e*B%Eo!quaw;Gl#z7F3cp++MGSt8v)o9&LL=+>j8 zJeVtA5&4|G3|qp7>Aq-43xb*VB~DT0{3)j+DhA}CF$(*5pv_ON4N4PT$ac^1)rA0n zDPBV!Bc#&BX!GnlSLjGNFV57z?8AC9q`cA+@6?k25m)Zi@R4Gm*@n_E`qFzDlw>VE zY*M8Lb)ejd5}V)u=lx7CUz>;-MP6UN4=hhto36ZgdzMAGgE*<#kWZzi`hHq7T!vC; zasgUDb_xM&42cl zBj7ca11w+yytNmpxxJ%kRJ6mHl3LG*lhZ|LYy^1vVZ9>+D1R>_O>PW1%K2fcFjQ31 z9*gzRo>Dog>5e3O>n#c&QKfEK^cCwo6a(R>Fo8ykU_!Lss^L6TJtIh^n0L6}7*2_f zax(;@pD26knpE{mp1&svo5So1j{cN;mGn|Y_FW>A>(k-MJQ%#K_=UwW$+2*x;X(JI zmLO8rb5*QipK)r7nO9Llnfhp@<+a+Y31#)0rE<5|_TM1l&?TCIcGAjuHiQSH+!zH@ea&lrBkN=5*uu0AE(7>U4#)UYr;6hMn=zH6GGB{^YKrZ)e_ zqhZ9Ww8)BHtkJyteQ)0C2O5-zK=0y-ql&w9mkh(T_h^j7cub|J(R!A33>gqUrbs3C zq5V;%7CAQ>n5wSz5~VMOlXp96-)0~&KmXT>4tw;?*eHG()oJ1_Z^g+JkH5g}sJL*k zkPbs|;up!J%|br19mgZjBA$S%G{On6EDu5}RC7OE2}oL8Qe)#c+gC@+9PC?MLSnP* zw`>nQ3A}!^kBx%tx2z7TxQXj;mt5;Hs_K?=FC=JNiW)xj*vQw=B(h7Gv_t=`;fy z64&(NwE_~zI=yC~P88t5F~cUy6sI|B$JD6e4rlpG%F;i*f~2Wxs2Y4+8^V%M+>(5J z5-_e$sAnzdd1QWcm(atI&{35TX_qi^o)88#ekT4E$prm5)Oq)ujDQ5$$VSbTE239M z2cj9wob=4=Xdx5W2uSD=_SJ|dp-udDmd6{dBaIA*Fib3~%4>wmLb03Y&DODvX{qrdo-tC|a%TZkxGE85QDybX35h_+s?*XzGp5@_ycu5Fsm|KV6j3AnIT`VQk81yY^z{EE!7k;ai$Bv{v}e zcqdTiwSDtTQq#nU!#@*{!mEP> z;cSAcL+nHC!|g)^Q8u7_z#4IG;SagS2@=}KuEd1{{kIxZvzzo!No$Klnh6C$9vqGB zwM(zVdyV8Y&u#urAe!%-pMWWe z@C+$}Y+l3g0I&6>CK+s{44m&j6j_aGPR*JkPw|!d*s?N&D^5kGr!sz=e#~|!o$@RF z1sKn`7nT0yt^;)HEs@N;D7Jn2l=Qu`SW{?!UY;4nc*aF0sH1DuW{kW8PoGgH^ zQKiav$fb2QnKsPkui>SO-C3ubnU+~k>;XC&ppNuYn9R&0^imR$A)N|+Nt`>ajL0?& zxqxetP<}NqkJ1WniSp5=FW7n<4}+^G644c(iyW}#T<8VI$pJRY1+shI7*HYwC*jy% z*lwd3%n+BQ*n)+^(9!*R;?eI<&Mv&%*PMhKJ!%FvmPRb|}9FxP=mSI^3Z|hL0 z<5pVqfxUX!Z0Gv9F)hfI!OMG(WjAunlVJf~azzIomMj#NG!#`l5LFx&Y#++y$U8_J zt(#Kqamnj(I)jg+E6c90#}i7F#rVEJT7q215FQktlgoms5{{!d#Rzb4V^&-!DFk9M zX8;83^MoDKhA3WwGpg6e7(6RAr!#&v@|B4U*{YQdaAce< zBt)@XAqLpOlkFYTAtRTh)+HodR0L2=5>VoAlv$Og)}_EU${@{}P%Tt%2{=+>(AVo1 zrech0{7J1#)HP6&9pQCO9)7hQVFTux6%A7>lOFfap#NT>qV(=(LO0m>PNOj?K*_&h zwI6~aXRqxx zG0)d$JqHgrnlwNNSewg-cYdcp_u6wr@<{AX zZTrL39O_8Ox0;Aujx>)=ga*7ukPVU!$`@@Ct?JhgdH~OY`~lSp?+$N|vraZoQLkaz zCMszvYN|_0%}UQ&K%bM=PGYre>4pP9k}kK{Xv@O?Q`F6)pIwyW7<0_Tp{AF~rLeTI z0WNj)QF0LX%S4vdcp89kYEM^J>T&$2zd@z3-DL)ae=oNrte>p_PynV_WKpez1aPWc z6TCn%*y+e~E@Pa@E?H3|F|@<*{)xAUWAtKpZ*C1#t4?t(?W{4I`ipd-&ag;2#+aE+ zqSACRbcZhuva`9TzS)QFI$e-o0tU4Xa6i;QM|=Y<0*a>crz}A=%xj&7SFXuZo*)Aw z&(5t&*Y8urAOWLGPavKP->&OAVER}26r5B*>?^JsO-u6!jC1&_Z-PCC+B+oSu!+Vu7jQ~MK}T<9kit9VIXx2uZly&Z zK(f1MzAcHeu-4(QO-0yyO_J*GZRjzO`o^`4{CovR?5d1X4g~#lIHm92T4eA&Czxj^ zh9Ran@Yv;GZ$TEa$>4{1kRCl2WPbLdP zCf*a`5DE=r6eMNgU938-k;2? z^IO`l=|?R01Caj#y?e|J?#VdxJJmVhreS)u5mMLHgYkjUO&B|81d~yT@y?g4F3dr! zj=HshXr(ISeEqgF&jDhykl1u{+EdYFpf#)}U!fIsGs$?aHFjo^V7+ra%9p}`XVb;V z>KxFeVlvShT~iFR@mQbwK;7D7-`X4HkWf>|(4;le`*c(hU1;W%N{6=MVf!lWD3IyrN1zZ)NuQrp=`)t`W$J;|V-evgQOsn1?tq-eGG7Iwo_1}=nNzX>JHCkrJibv@y_ z7z8=hWN`lWg&M(1B?5a^Dtn7x4W|RytmnFl}9EBVRRzH`9(m#2QBOTcrbN`Sg)Nd7iv*k)smBI$fh>cP?}G7a$r_}~ zvK-?H-di)|D}fQT=^~x=RLRXV!W3PXW3Es<+~<~qC-iL^zml?kHRx(|kntJ_oBrsT zt*0K4DeRt79Aj#lQ#>>G`!eO+Lz|ZhKL~p4=~yOdj$cy!VPMWUCgdpU!qtV)=k!NalU{Ht8CUod7~FvcMYk5NM9*#ajM{q0)rEFh zY1vs(X9A=(ZQH~a6=*oLR4F7?m#&guV}75=+D^$ho0 z5t_N7o1tr!QAIG7Nj~k0CyT#9ZBG2*$<)hD)NE?l&{0TFvi)`AXQLf z-|A=&jnH1XE-*Bo@cyv-lGg<9)n%;uv{?Im!H$v|`oV&~8W>y?2H)fCAsfbR6blP% z!`%)CP##DZU{i|<zOCE4qN=cB zn-$x(ZQHh!9ox2Tqhi~(Z994MKhJybJ?A{Ftq-fU{cW!?*PLsNU+>)>99Ql}4#s8Y zas=hRSMMgCu?DYzj z+f%*IM6mCgsFm9MwjP5!cna|$Bh4{YSpjbW5m9x(9}*>^s;N*v)wNo442QLM8I;0mh0(yJwIV?;Bz{D9;9o0Zfwx+B03UoMJT%2#5 z#^q%<@F?Lzj4wQiJ%G6T{F>$`D>Qlfs>t6@>~3lFE1c8#@%nm1Rr0I%z0c^v)#vmK z{PI;X8DE-!!K}gP)frQ{jrDE$Ij^)OD<(4Z>at+yl1V5~xL7HVkwqmd$DW!zYP?d+ ztpqC#a9U{pF3HGrVNvYo<5(`S?j*DiM)WQmcUklr`L2-eLP>2-816Uo0;yRJiF8Rh zrZ$WaX+a#vBwd`r#Z2O!3{Tn`+?QcTCvP)3Kxkw&nN@vv>md4JjiYi9EbD{0M+aw_ z%Ch*p`smzBOK4o*St^bpd*kPq`eH}gVq@h2umWoQDxT-aLLTNha_F+MH&Z3xD2@+) zn7d&fsxvU*t|nKjV>#4<9n#ztUSAu8L@gFK*h!$yynamt4B%Oe6P?W(MQ%A?c|a1x zb07*+hvbK)~3`80$IBt&JM)w=>gQT|8X_ONHx^UoOlJ4@- ze+yJTWDZ75#-}Ki2hGQ@ctX~P+ewJROhUb6*gdF?@4q20Oj<LTAXT+;1p{?nn<*S*4(&<{c8;v-Tj7y290w zg~$)b+ePWJ!?x1-u+X?49MP#UKM_>F}i>CPQNpIPt}{*H5XiP3e*`}X2#d)|!nXxXFozQma% z&X-`;^kJrzyq- z{18rFJ}#q-9VQ&i3KpM1^{f=5;1FGP!nC~hr_}AqHbRlnbzeEslfo_^{Q>^&9c?XV zm=de-i3r&T8q~F2=*Ul$UjDidruVqmgj$Oaag@oQ>Tr@s#Pe}ff0Ha{8b$lV_C;%o zSi>{(_cGcPbXE5C0Y_v?)H!jwT82Qb!sZs1dL5JCyT|sm64zvDYrL*#&CLt#pw;xl z)K0~~zU!$Ao4X60^g5|e5S9>bqn;FkLmYt~u7)_V2^{igurFeNW4@5MbA65hw`k&8 zseCu@^DQeLUIn{z1^Vgqq7e&xoY>}}NR{l4xyI#hit^gSF_o~C?e@D!5!~ z2Id(f!?uUhe};ALf!?az9@?x>2z5Ay@MaIrNI$qWIHCNC9$;TF(9hi5My{3CvGuk@ z(_s%C;+D~!V7QH=cPG*m@B$>OfB6D#(f5b_?yhJx&bpEk-v6b$tF;7hYk#*h)-nFO zo$>F43Eedmdh(_m2zYXt4HP7x$*+=6L_pDxKAd*fS{51)5?&CDPFQjl8m3{~F`A2u zoP;iPU`itV2@p6`lPH342cvK{k^nYwX({{!H_h@$dtlDt27OO`gwyhnLzkw zLS?$Jdd_W*^|5n$cctu=&_f-DM9HA5Wp|UKLHk0Xp(Pi*1K7MEHI+5SO@xtI5H{v~ z{3^P9LyBm2ntO|pE9noOG9u9B8D!vZ>;E?qYI8e{97-gdvOL?0gj&c2VB{vYQgmSP zT9J0EMrbe#P@;6+baZ(@O%sy&=4(oXdIe(1W7FhcvKq5k)*46I!Jo`XqGc*F7NEQm z3@>)*POg6EGNz{`#&QT{P#K3>=|+}2S__v|zLMmL(`GDpSqU@S*QCjd^I{9~@o5(~ zO(Uk?@-9zpWo>>{-G_`0YbGu}W)Se)(dY|ciZzDE0JD=N#oqyd0OMIDw4tboEIe5t z##&jZm)YFXBx5V%QR>uF2iU}iH1;bIjXTEf5BN6_ULvP5O&0>j7^bED4V z?2v|*Ph2%6Vi&LhLT~nq2Iz#7Gm%cm-^K^2L@yJI?uMNHdq|UXbEooqh`upR+8^#f)F_lCSF>-s2x1^!TQ)MpU)UIbum+m}0P*d<2Rx#_GDUQxjCb@bi zN1gWJo`#>Qxto7Rw{z0-_6j(DDmXw-ZZb9I$`44VMkX1KFM*9_OtwmxNo0k|rxq~8 zfxgu}#X?m9JRS+uGmCv>s1VR<7M_VFIuJHhT1-Z;hf`z@wp1PGBU?tP`^evwm=V+$_pD~qB^2b-;$ zt;s8RVQ`rU&oQ}*tQU-VN#|Q@7KvC?EZHUFl^d9^GgE~vh8bR-PHCcL#hmFin@5l|I0{so zNgE#mrlf1}bO^qI3KG;L7*q$21wnn@W~R~VbpzQzXOelxG+4rsGed~2S-$#l@ucgH z?nPoDvEFE48Orv=O~*^)23hKl`^CGtFOUz@X~`WP2zN&=5eMAKxiD{3tk)o5_KxTJ zGd*>i5jCA0Cjp=?y67n-!7evOZrG5<`$_`9ds2nHA7zMcWn-J| zkR1KbDySm{RAL2{VqI|nf^Rr6d<6{>cMYDO7!fD23n?^KT-Gn}%(h@r8nSqRh?in0 zH!q@`{%BO2;%~viDXsI&9t9&-OyXX^AUfv-h!nHX)gCylzcp?ibiq1MT~FvCewYsC z!5ytpTc&phyDhZV?-uo?nqQMLn$2;0IJU|3lJy0BsDOO6JRbBV82@AA#YnL-m__9w zYq)|}k7Fa1CWHpW*6DQwt%C%4*yn6h!dLt4c{f|bibo6+lqd=G$)+eiqx4NYXoA1jZGv6T?P44g-Ox;I z)wfwV&qx5j4Z3SRGYIC+Ot;t1SB{2TS#>6MJz=W*L{O|L`}qH;vBsI?T60771NvgU z5pCSmJ`zlA_Ov{=C%E%gmZW`?X0}RTn@KUZYU(g}I{RRsA$kD+;(r20%i%`9*?kzq z|K0=t-9c)K6COW#!x^d$AXZKVc@mCCw1#TDVo}Yp+flNRc-t`w+$VW}=&GKz;2fY< zudx|AqfEs7wx|DonCgZ8ZM{&t}Y`2IaH{-^W~qrmFT zx-rd7TvR=4@lLxhCnWR>>{7XF-1=6iX@V?0te5!Tb?ZtfFw0WesEO?!q?K*WX~J(9tCwL&c> zxEs@o5L&#^GNg%N+w4i@iHSYb{UroJor|!qSW?d#?T}K`cJ(t1(v(gd9wbp29STws zqS;R5Mz&XrQa*zi0@G^_!&??bz~~tTNSh=Z)RXw9O$M2CI|*w%w&W)!M=Gls3!3sU zhUAaFV{WnvXSc5MJP;FY{nJke%}FC20--_4Un*I%ZtXP;H_SBNkGt6 zo|jh+1x5ytBgCX3qFV_#4h#~!gdEpjnkAvCcqQ%hM{NrY5Jbf74yN~3AWsJJfIb3E3v>4)H^ zHLAd)D^XIlW`YYp$jF+zH%RH{{_!}`IhoO8R(RB;c6=X9J9 zXHTDZrDia#>HXB!;IP*8oWBh`c@->>+n{Hf81|vpu;&hGiubr(zLkvO1Se4pv=vo5 zY5F*z`SC7AL$a`yi~6QWVYwH7N+;w1>yJ}iLwHZ9!gN?cai2@Zd2jEyRSy86DVbMQ zWGN{|rx`}HG*o;8(N5>0OP?;<0Wlk@FC{@Qx)KrQn+B@BJ60_qwi=P2rHg&vp~FnM z(@;pcyLkkKa_R}GTMD_dxW&-!aosWbsY3On59n6E)hH%%%n#7z)vbfZ*#?N$^Oz;T zw|(fLL~}&PG3=6T)ALq=qd5S>AfKYg^Z=p+VgOMCA<{Inh)Ao2W@^wDbHt6LZ-;c>T=Kkd8sEuaJs52ApHyyuX zG9XUyS&#jwYv~#BgLSNPPa*27F(y8~v3`o3+$rT; z?9jW!L!rQhH5TTvDDABw7f399}r%rS-w9utrlDfhdF7fI+! zp&{%T!Sk6pcG*{PSHM%X$28kq$|PW}?Ye)Uw$gIw2nRx{hUU_gozA9ymzZy^wXF`@RAGmx@K8c0DnWhkb zQ>Q42_W68*NfaTUNhV<+p;fVhEs2vS0tfgcfmU8sfcn;2rAP3AUn}`UO`-e+|F9;! zMF#}6cf=io{cE9Je5--Kfy~$chBA}?eY^RddEf&wEJ%G_>&4WW`PSYDuZ#r z5mXb^l}JM*Ams}SD>3>D|Clg{Wt^|ZUVyryZ~7_};<*06fpl_C7l1F3uRVBqVZ57& zU}9_jYa zw#+6=4`seLN_ra3EYThuR@YZZ%p@;{0stxZiF){U?8iQ=0zXvYU?3Yuo%|dDNOfjM zENG6XO{a1y&jqHFF(hnkH=s9t@pnEBCIkTwG3kbYcu-+csUk^Eij(5Op(2s| zm|c4tSpz02YLx#O=AUP0iGPtC_AQY+{13Cqf96%O7Qg>B$odbdoPmwK5siYQy^)?3 z5#9gD;}RqPVTj=Zw@m+khIj$b6-3S!pW59|b!at>Bt~$cy!HAAj=1ClXy;J78#M0t z*@r8zsxDl<5L|0%Ajekp=(=D}TIIc`X;tG)Z{1z421;r(<=F_Qu%IY~n`t7ym{!O} z=k7Y0y+=A$?IX0q1~VKmXbNf7xs5gPi^<|E|>g|5dF$5&sX4uHydAgUO7uut4NP3fdBz zJs+^bSYlRhT-3l1-Of>lYyxkpB@Gai#JrEUY%=)kL{rBR`dp2K%=b@zEyC0aHAaO_ z0=Dy{RhGkM=EvvW7|V~d7VG?gI^QsVHbt;gk>fuU4cGu(jPO@ zZD&9;#xY~aP&#vu1?R9|xBQ)9CljNcy6%DO+0qIZ*%EV;nN){Zi4L5DRlY#@AI?2p zcnRRg_~MVr&&ka_ZyDW=x2ryD`ilyG2T6vXu|yb zByyC*XKmK|S)UIA)tO*E;Vrw0du|FH%O+{_{C1uZM+6AY*Yx`@bnWi-+rHh$b3S@8 zuSU#k(TCK!^mXWFQPWWGQ2L~owb;h-GBcN#GP7#gtg4@W^xf2Mnl{Zm0u45vem7a| z2$OSd!brMV0O@(%nNX;Grl@i|I+MBqMZPIWYGldOw{Fch!U&fx+Xc?!L$srooNiUs zfrH&^Z1YjJGm7ye#`*VbpF!wua>mq_I1_YRmh3b~hVDwl9gubOwjN-i-wh6QKk+HU zG$$~%-XQ*21tGm>3%lQ|K=D6(y8k73wUdSXzYq)z4?HEHL+MQVyC^=3ni~tnslc^m z;rY}dE0B;SAt0J!bRp4Jb@e5O9XY6=E~qc1!Q9C2e_;Tge{d(3k_jTRtgv}l zZ@Cyxj-Nl_>U06Q`W?YPZ!f`x5QM<_TQ56x^lFi1e7H+(9S%lWXt<|JXwz5Lea1Cp z*ajNhrnv#|u!5#D%u?;Mda^~W1#Q9fU}8!C!Wp5xFr?{m^a{8SV5{i$m+@O)s|!%J zfSsf$C+4!mj@#TlX;#~nm$6i)(pKea2vCNdg)l(70nJuGb?9?AQ9ocM=ZU_?6^jRA z>*$PHOG_0Nvp7Hv3{33ajuQ0Qe(ugof_Ajz=F$Mdyw?qnZHn7#spPn&b-^#o+-TdS zGsxN61~UCzm*A4{>63FM4yW+1AzQHru%V~r#XKtI?E)?5V2PxQvmWFxxz?9x(FQ=E z>Dpzn?OeDO%^$P0k&|pmYbyR~7Z0-bCQe*ds6^abvU@>0G#zLiG>zKE4C|Clq&oCU zKPm ?2}>Y9iLI>#MTumtcdl1qaw+s#53ggb~b2xu0D5vJCDR$JKu6LlCt4^zz< z4Ig}YA%}1@tgUwDCu{!rIbkXtrguoA;y;<%_cZ_R&4CRaJK!a7US_M(XAp!#GuZHO z(1-}@e+R%gOl(qKMF|==O)(aA(zhZnE{gzEg0~tamm+DSCh&Vfp^ldg81>~US7|D) zSFipx{H)rbR%tDT2$SO}GAc?IJVY5DHDA>N3-k+yC1VOSUs zHrLFn0E@x$2zMe0{W>AR83IjY6I=Z8a=#30CmkzfM}G3BG_r6o+V-hNU_?FKc=qnq zw94$&|A$_7-kmmXmivz>+P#sL?0*WMJoPKA|NGT%_P@?0wH5zQj~B&>K#=?ifWiTQ z!Xv|h>ECx_={i#HkMrS&Mjp$<`%SD1CqXdJ^&>)>bHR=E^8agku zCTTB=Y2cWS1!!Z6luI?h+442kQSOlKv4)W91gn+$g?;W(J0(&#eR1kH(oh74-T z@AOe%aFZo7@H~0nLsp7n(qlkMdbOGV1A4&9%>9p}a;ACkBd=J)U^;!6GdX;%YWx70 z1oZ@`Fj-kytcnb)`RJiqxd9TG^je{wu>MrOF^pBT)u|&n2K8DGRs@)EAM*J=J@mC; zCxvMAq?ilHNoH0J`IXxr`LkbE7~B+`59$ye-ax0dS_8jfIBF$&c2fZ!D11ht>k_sf z2R)LaX;^MvKo~U|Lis^lz^QpF3d0XMS(e1i`j^}=GP+&BDj9y385x#xGZnfgUJ~Q= zVI6j3SX8`->Wo-OKiffqV4A`N`spztOxC;`2y{4C85{EbANckyImc7Re2*+A<&Q%X zIhe2zDLh(kf&63FnDPNNE0Fq?R^FVUh~!zbwg|;Y35Bd|tXPc%0)Ndeqyt2*<~jl# zuOw1xxu9j}rBxp%Ucqj%K11MP{&b)z=G?p5rSbd` z3=(4MheNFi?1Pyp@tf#5?;rl)?wgWE7Jytdbe&CakknG14toTMT9TTJdVh#^BT*5K zj3(zt9FkUK5(ES@Wel*PaJ!f4s#O86Uks^7n7ayFE?EdhrocDH`BfeX8fK`-VpzJ< zesOa~Ly=RPyYexXNI6)_rh55#kegcb%)8SssRqDluXn$VGh(YZao+fb4 z%;No0HgHg7)!ZW0`K$YoX6q z*Sao43W_g5?g^0QYJtks{ycV-Zl=(}JyPfvYkXPez&Q3NP-k$n7uF=mlhr)PQ68%O zXb3lC6BVU!xeFq02TS1ai{{GR3-xX}3RdC|I}Ttwsv~cX z5TkNoPVFkz2d1dXcR#vNhU9#y#YJ2L+XBQTb1`spP`CY$+p3j(_kyq2r)RVQ9nuky1;^)YN zvlJ19DriTLkDmB%)JHs!TUrU_q}sLP0F?mo4=qe4gE0OoFXEiT~b>X)gpAXbWqpeJtiSC^0=y7G<6d;pJ}Tnif)OlJ2Zc14lkVrtLMu-A5ZHaQ>76>sx9VZizOgC2`1ET3<#;B-9 zrne5JZE}b$VthFH{(fDW8PQ*0^h1En_DOopEpJ%#f~J&1d-OPDQ3q>;5UbyTse#Z1 zo`0q%&fXnsuOMZZ^=6j4Z7g(W5aRl=g5e1fi5pZ$DEEjJW@W(3*RTEFKDE*rj9a1> zrJzEj*XxgKUD0sEyi&e=fUKKqJ%8Y#L8d z(KhpsCoW2Y!u>lO$J^3f*NI^8{hdE`i0??=H%otlSDsp9qHigF*H;=k7fdF03GI@e zcqv5?bqzRWMU2N`(KyKLt}r&6pRjT+Na{uxFvDHPEXeniH8XF+l*E-x>{6^y!t1E9 zh=awVZzV5?6POW6ZA(}i0e1I_Evk(VPVnSdBL@u2Vq&%ZSRI@~-qXfAi5wm%qjs^R z>0p1-iH|U}_?V>DPr>)yjWS=t{FeyT4E|sf%n-jI+a1x$H^VlgaNu zl3XY4--@#vREsL#mE8R`WXkT;IxMr9KI8X(LHEvztu4k4&& zegO|;E+6H(QIJ$08-?O2;7ec9nf*Y+k7?hHx>LQ!*O-7L=`d( zm5||)^KNRD^dJ3BZN_honKPN8Qa!V|O?>tymwEyl({^LvYf2h$N9(ZCv zhsuis;u7{3=h$t0zh9&PP&`PmLK6feOD%Ly(uF?3w}-7YUhrMJdmU=E^T1^ontfAi zG_zTH!NdXs1jGA&40>>!nD>QbF@X0gMSA$DGJr^@4xeFW{PL~ysq?AzbqbcH^Or50 z3V|uFPrjT0oD?+O#^jKF??VAYJc|L~D3JSNRhg24lTJ@{WtnXCK|+N+h&FO;R?qa5 zjXmzX8lppwLEpjqFn~v` zs}9fy#V|AUm1GqoswWBKTp zDd<8{0~aEdqA&+Xh6WXQu2h=kC|ZM5`fF1;_GI-^X%9v$kVMsIKX!D-bI#C^#nlc* zt9E2)E_nJ96#-mQ?j66;JMJ>hpitAun^3Zy0^*xyM|6Ov(WF!0)9GJFEsa#s$>oj; zn)f`+lo_KQ21^P*on0cpP)v}5Yrt+JEj{#lESSQve4#l(t>n2pMv&6B`V=(D;M2t# zAO|A_TzXF~iUDJGG;>Y4W;TY}34cwdlnHGBZK#@&GpHVVO+}AOU^*JLZ|ArS`&5I0 z-cI|p%p7M35lhD06><+cy^J%iiF(|8hVk${fmKdLl9;qHH+={&j7rKV$!h`*aiwf_ z6-}+R-~?5TD1VZvAv;*EU;*C@SHy_MI#olWfsFv2oKMj>CT|d3&B$MtFH)i@xt#RJ zfS=(dPPQ57`dBJYco^2r}u>=8>2Rw81z}unzOC^#&PRtz%w$LJ%v zs_*4$nJ?g_#F5^gZQFZnkE2}a1<9S;uxuFC4>T;6Yja}(qcHw=cSw3x7W>cG0xDdk zg;J48RAeVoD{AsW`^2%bqe1SD_3sZD(wOl{*I~cGn4H?27VABeS*3kL3oi2V$M^&a zo!8_~x>RQ3!@QaG{JrR0}pCk5YFh0Y&HqyMf z>-4k=`a_8ULf!-vqBX-18}$q8>haYZAI(kpiJ{`|SxCx@371g?Rx+qiHv>$ySbB%@ ze48sqVuoI;Q3K5odTC~T3YGkrbtOVCkxKH;U-9gNW#fC#emkA7CG#NS!=}Z;TfEt} z&>Hgq0zbdcIl({Fe01um>?iL(&nbX0wrAQ#cq|0~v771;K&Us+m3rgb@~O`_Uq4OT ze{!EemCjz~vA{^~ilm$a95M3d%C#I+Io`XO)*px$5!aoupS1fP&yG_HwJOqCu}v+Y zy@P`%e_G@HE|_B8?Cxur+!1uShLqos;ue?ikTCx3??l_|a%UmBsJDpH9u*6~pY!=1 zDO*hfVo4la-IaS*)MneUhi1aPiD-rL>u`a#I=LIB+rl~Pex1S&pxEnkJR)Aw^>Xtr z2gepfyJRks-NPNo?axFui`{42eH*aIt0_Yv+|k zya7Pb>=H8~Bv%@7-Ws!!K)y10@4bDHYY$QY3OwL+wv{YNs;XyB48T8eHCUO~3%Wts z__5AdwTnTdbvh#Qzew1-QMIStUhFB-P&Dmd35Y*!%AVu*o7LUPHm_nh6VcyHVWvkp z+8)RC?3<+ZZ|dM}UYlXQJ2*F0;*8=N2d3`)uGMihzeLkstzJ>)OuG0w8}Bp%z-tZ_ zbOA7*O2jaP-kV$Dk^7Uv@0&~8u+RBjo!?eB8=})g1&6^%Nw8znBKPkb#m3LS0#79x zKEVIk@C)Di;-4^)Z<3q0OO9fJf(*=h3>y)8}3`;Dy3R@0~gfZWSp& zNpPB)R<(k@V(LOJ16S$LzA%%lvRX(<`lLc<(kC6VHJKQ%^6QKHI2?*y`zuF4PFyb84>tX7SI*K$uJC z!OB%(woDgx5d%j1>M*Zkgb>W6y*0sB^Alp*xz**+P)nfKqAW~7xHSj7wLO+ zWXKe!bMFM z{69@p2NWcUjNLxgy%Y!NCS$e6{u-G{{LLo9Du!P)Q`~;o4Dzwbmhy^YI$aUm0kr=1 zO!UJrP?ljRHvx@e)O%=cV$%z<J_yL#`j5qpwIKhBQ*6 zj?eHz1&wMxmf%jWcY`(&06O|M!oLF^*j!{ZQ|kTm9i)p2D%~u}(pIE$E(S=Rm*@n! zV=dmcXoyj-cONZN_9R4I8J1``c&$yKG24>0HFN07bshE!X(NN1TX9fmJ*nu93N;_7 zYYgKW@+jp!+IQ9Syg9dgG`#ful|GG^M>>#%8Q1XF8cUmUTrc}ZOJnoaqsvcxdJYGW~AVbYN37mwt~{pU1<^jUbK z^>7@e#*8jxr2IX zl9ECCt+$zHWY=Ap$#72bfLYLkue~N6awRgo)i%Y~Wn%_6wn=(QQSqBy0d8Ihf3 zuVZIQ>Pa)_qlV=fzQs*DrtnvK=e2Evek^yp`)^!!qHDwQBXiu$SU@gjuqQ*GrE#4R zgA})pSGr8?1mao)`Y`F%E_@Sfr&PH2vzNcf%630$?y+&W%`I9wC8NyLU={Dw;S#Ub zsCza@L~M0cn$Sl<&yi7apK-{qStG)sQ;8nOaFL&vK$*T%bYNY%`RxN!bG*>SI!WZ;!Ync8i^lL4;ytfoh_x6E z(VZmz0!HZx*6=%fN1C>$Jj`_p7q{SwbaaUteLqT@oE(c^m*8bK1g74*e|FNlqI#W) z7IF7%v;QtWwj&~5%)KTYguO9I+X%9_myAX2)~ib<_}v$RSPuYU^&7HFaF4=|+?(g% zpOQ;Ba1D(xQv9Ljz`3uU*b;1L6}a5IV^nr!=aHo6z6T=%AO3j~we$J_IT0qil6s1Z zb`BX1gY^_TSda^yC?i48Hz^w}S}an4$Q+6p$5b>=Vo`3$iIp>dB6nJm+dx7V$)3=U zH?hM@IWNZ5-3xFQ5*-DSe}QEs9l#~JY3r?e)!M<>_zIz>jxXIud%DvI6hJgU?VBBd zM!4tP8PxaFrwiQ}&I?C69js6An37YpPcSJyo3H5)k zDoV|8(FZSI6i#0hP2Vbo5Bz{nq3sJuen@KoDVjWO<@VYAuTe{pUK@lrm1`=NGE23f zZ5;kPq!k#$OIJCoUY!0UxN(uZ5-c0Fqyeu0x;z;o>-R$*)KoSNVUC55d03 z;sC{7@nLPOLPFza1DCrIUCyv@4l!&1ur0zIjRxzjg1K!g&M=qha2H~|VBYLDW}T{& zokV9Xb*PIiKIRq@qFk?r&%go}Y2xT;+K%Wm##U^f5Jp}>O>p1lkc7PpD+oS~pQ#+4 zs3u>64}7dV_|2O_U(p)^dfY;-TrNjAhelSu=BP#&0~}ePV(8JZr0CoQ%is209QRis z8T2q2^gzvK;m1+J8#(Ru^&neAu$t9#SxcD9cePmC9v#(#XD;ZzBwydE$P~$)w)(=6 z=9@i|_&tsEcf|LGk^SXGk}v2hrql{ctJ|q`X%vkVNwfXqPpEhKq^ms@dp99k!AjVy zle|jm038J%p8a*a8aH!*;6*s0;wQ=o;9tX7xXSU*m2W<0;(v+Hcm9ow`1A$&<|5=I zWO{kwK9g7)N5`J_w#BY>1+IV6;S-UhKoY@K8Iw^^CN!C$!tjK^wPS~B0GP_DUZt1*H`f<$q6_(Cu}FuqsXURY(~J+vfS_R{tApVv%j5Dwvg_;l9i|(p4$>2v0lBzn zVe8UHW74B?)anugXKU89@o+h9>>Sb8M84LCE;=F1^|u*OzsB`-#M=m4qYEO z7G@Nvt|}y0^5VqxXZJU9SqLJM&HiYszL^1AHBIG#%I&~_ytSHbRp~K*1Rpv%4T|=W zW6*i}SX&4|6egrT`Cq$ueAR!vt{saR0<{dLzOAmS%*)f;+IQhud^I55m5A)pBi;%2 z&xIqgF3^?z0oB$FlEqU-G-|>fSzOJ$2U2ZmTsnNL=(-VSUNz**wA)Ae4J?b$^NDEvmnYS5A` z*+TYY!b!t~QpKYp6ky!@^0w$`L`cyE!#c2wHgF?q@vx<&JLk{}A>PDi37OLX?X6m# z|Gi?l7xZHq;_sMmptc<>P_HPal5cH63wA&FtUE?u|CB7FC@J?02|LfuE5t4?nLb*s ziRfh^ASAn=)H9CfTXCFk$7~;wg-F};^f3q!m1!L4MH_@*l1oP61}DchcrIK9&CQlY zN5A0U-|FE>K;lHu5-kjYt&2~Qg(HivEn(fgNMZyvln9+xsc{0te+n*wNRhs}*N8E+ zE$g5~)2&ErTl|Rzhxyn1}G+GsOs?T`FN(sRO``X=F8E`mdp>$eiL+}7{!=T zeds-Cg{Mjz%DKk&B)4+6>@|EqpXCW34hk%qJoOgQ`N`^-=XWZ1s*rYfG?=sn zg`%u3>r3y=-?Q7K18o@f4d$obg)7TWZ1&FLUGP5sNFS!LwQ0i&;{k0znw47?uDKM? z`fQr!o#$1Ch}wh+Z6JDX=P+&l)4l>M$dH9nL{L~W+Guq+rd}Bs;x`tL#XZ>*Pl?pN?78KW|ApZ!PQ$zG1pS&Lu zhNoBU?XQJC`8#)8QG*Gv)z_+4>TeM?Fdx{$Q|LT&eK&62*zftvDr)E0Y1IltVcXBn zT+~Zd+-KX$tgZv6Q;X|t;(_b#COA$Wicc&NkXas_^syb(h%Hd`U^-<=J0FA3guXy__$DVI$E1^+AE17 z^YbOE5hzgj?=@r6@GVW;J&3YIn=bL=A0)c{!$(=tEBq%k1()Jt7rXnDb%r|5aH^pK zBUp2@D1uRa`JxiQ76fS^8^#nO@pO(7wpoP%LbF^yw&`=6{A<`_*C4@VE-+@cK1j9! zqEXm%o}umUJD&_8{eH<|(eCp*b=K=y*mmgK*O)^F(T_ix$R!18!@_(@d+Zs-4J5Ys zRlQ8&iUB4#0v#IqZLFUm%3@?jnwPBf9i)j7l92R?s3@6$PWVTm-bvUY<3jx93-0sx zA5Ae0(O#jJ_xH1;HA^QHp7w=2Ip=(0A7P5O&Hf4@+qjS2N4ukGUMO-xalRzI{>xD z0y$S14<9Usbac}$XmS2Va1X+Y8>&=_7{&7kZXl~O|2!%MO4b|u(>lk{-Pu!g_7CkI zGJ@dtK)*;bNvMQ{ky^TrYcymTr((B_GsZ z%CvUlcMnT9@9pm?mJ2rY@3WXiH0;gCy@8*xz7fP$%ch?48fw^~_F!zCIVOfqUPU#Af;6)L~m(6(tO#s0vpiU(-( zIol@iQwt=C*h|_t#8uc7>H1j0mTSY~ewk`m-wal6M9RD{7%XgD$8Uy3 z?oqMuM54A=oPRN(gZy)T3g3Td(0?5H{(+PKorwGf<&lzWqCmg_iBf#Of%xDmw8!cK zy!`y@`QCK}2=ISv(<)<*rHDDB+%Wxuy(Xm-T~{hBXU{CV-*amNLCZ(S$BUr%K)STu zF!z8DgF&s^kGx*WXUfx6dF{}pYbI|rPA}i2m0I1r|4SznO~_^Ee&<-%`a>`A#W%jPVG8UWc@l5@($3lsYU=Tv=T zGCW6E`aeUrf&*;0e+cD||HXX%(~tZ=LpQ5LsJ{TQIuuF7me@KTy7dGUv~j& z34t6MB`(^57(Nth0pRpCB~CvPu!Pu| zS_2aW2H+74Kf_y69D!m#>dA@UkX7#YHAaW`?cF_>t`nhp3z-=ye?VW$hoV(LJHi=m z6I1}(fux1{uq=JrKr31fjE$o-{U!$UAsghoqOt(ffxKFRns}03C;gFyNW&^aW6jKK zgHI@-4%j#3`!dm8A70Bom%8EK7!Rr?Imm2>``ml>zUO?XG3p0ARW;|ViB{PAl~)zqfp0EhCNbF2s4M3v zDiu-fCz492(|f=DkCnM&FiJu!rE~a6=r=WhlN1uw`1?@<>;-!wx;FR3`NPv$J1}?( zUvWt=>`akzV`FGq26?Z>Jy>bJ3d6wD{(Tgqcxy~0hd$;By!15v{+96Mj&GvHMP$Vs zzY@adH<-dNBS)Mmw*w_QDt02nzh0DgOG^*~87Am{O=C22?M=2vko)x&?y7?{)NCif zsg~4w_3Mmq4^`N6WBqJ3<%~z4BbIgJ>v=9^SO@27>1j8!a|26BTjSvSe$8 zp4AFRhz4i8@!y9Y!m&c34Z)Q(iFQ_!?1#dozmpy!lh{U(r8KZ6Qx>f=yM2sSbQbXZ zC>DK$j~e0xv=sGZaK6)%?2WFf3j9z4O5r51XZ5ZPVl#atE$X$W^(0xSjniZ6-ZVI4R94Ib{rxK8 zo_;0IhfvX=YRQxIlPh?KPosKQ?ZJ9e)>sKCuqRiN!YEM})MMA0bJFf>vf13r1dUY# zsg}DDs3Ni!CMpOsHz~(8sn8(Vr;k2=XR{QG&(XXxUkY%tPmp+-6L@>5f=B=`C?JeC%|>C-Y*x z%r1anki|xpdVu)dhJW0O8>|*Gmu>F-&((ALAm4T9?}l*spiu=gk+O#8eaIRpCftm* zRNb{z*IVkXQ(i`Y5Dj1%d=BZRLx{Tkn)EDCvlIi&Hbt@)6uXXbOY0kf)HfKY4_yHx z-iBy+cighm@m4F70K%BuRM8m~BI#I>6VzkO@f+t|l@*qsS=FKLM0DUIMDZ+j^GyRb z+;A0nAqlFpkK{x+8;2+Gs`j?TQ^--{kLp!(Pie`WXr3o24`y}zdKocO12PRCfo#|b zD%|rz)6?>O-9K>KT(ehzgmM*~04+I3a^1%RcdGl6a}G&0b>1kSOkW^V>;N2~YWKSF zUNT7nlG+sUMgly$^83^N_a|b%r(3_L*>7+5KX~y%`LKTRA%zxO4SNnJ+~Ve6a@-R) z-pW{?KI5UdwD{^}XZZW0YBDOs9<6w$8M%Yny;u}QTNExo^T(zF;bL1SiOj@}!-Y-D z&{|O`>S_ob4eCd5!!n3tgDgdib4Cu~Vkb;vVM!cgh3VADk$bgt2h|If*M*=4%9Gd5 z;2m$R)B*E*?{GHDSL@#mg|C~`?%l4d^v+{OAMm$^#h$`x6zaUA>~45|e*BB^6O;F^ z{=$3s~-jG3<{4w>_sZw4oO|I;Vt$h`xHg=LsZ}TL#eCFk8b!#oG9axoiV-Q*lm=1x39BH;-O;q+L!dreI8eZGDEwf|z`! zrb3)TRwOnWVt-hGU!JMe9|ad0^0U0il5e-CB8+(PjL}koHV*4QNxsvT&yf*IwM^tZ zq?lncYNN5X4PA@ejNMDVnne*T)_Oc2Qg&$snv zt3BRsj9ET2VW2U?YH}89w57C9{dyOuW~jK6zOrRSif-J;_qEn1mxFDS4I_bm)(BY} zdX;Z;Npi;%X0l+c(y*O!0m|u4->>D zA3dTEvJ4pm>auk1T_xtu4WY~?%2amboE`jwu_@|_;sksx5e>>JRH!m!D-V{G`(XOL zr~4S>*bjbezJ0HA2A>}xzf@h!1ULp6J#I%bz<7o{Hz;$V(c{lYPuRNqR z$B<;99^HL3sQNhfH@$z0RQ;x;)0WU}mU#mm%l)2oqfff6Z@M`;oj|_%afc{(UjbuxwG#(q_L? zj9)s;LUkFJ$7Nk|`n1VSPsC(rcYntmj*Eu>UVgDy@lv0x75&&(Ca(74`h%TQ^HzI2 z`To~ZS3|gNA%$B({4f56z~B_%FIRS;nTvpa!wT6bN&SEfNeZc^dYax5e=)QYIR11c zjl<6GFgg|T?z*~;zSw@UwprqwY@KxKsv{{7Be^v?+a0JE=ev}XVFg2at}JSB&-v6n zC9mNo-1SQJaU3}l&L0=wqR%l|7z0rjX7%{DY!*sl@zyOy4r%?uoTXfWQ?=*!qe=Xf z*X6b*b&Vh>6dy`tvPSAZ*i>A~dmH%mUi3`~>xV!&toCrHl;+E-eoZ275LR7EhYJg^b0@fv`fGJDkMkj7J}P*>rxc$dkzEQ6P!y#!=Hxw^*lq-+WpcxE`UkfT zxiiHZhX&do^i>_)SNPtiXyEnyon7!b)~s1aS`Qfjs@gy|C!`gbTl?XUBpj5*^W z)>u3Gd}8v(;Jur8=etsY9Fpr?g$#fwjHc37em2_P8$n*#^#xMw+054il65o20<%@!e1j8jys`R?nMM91FCN zhj41?`;(+WeDHspx}q0=iM@15&XZ2xLZy#We=<)9Ex+08k8(zOg;hU*&?05`=vG??1CyljC>I0H~opoYYBUjXrXesnil{d@~`g1 zD3`Lk8y^Zo(Kt2R5F;an?ugyD+wacV5pN4yH5UiX6GV@TR!`tVHz;E`TZ4s8V@?}|1u_KhcEvy|6+mO|7L*@|93@L;N;)V#2YAN@~;75Ev0o))Q=?y z)If%2R8L|;lENlJg|A1dw3X#|!3^S$75)?2#7RR`fn_$9Wx1&u zE_Ck+X1KvcNSh0pjKE-fmZpVBX7i*U)aHJD3~9BFmIg*vlQmi88n%vFPETc$^_=6% zHoErWO|5M`*{v)o<6Lbf=yWnIZM9=I!J@-!J7hw~(jMCdM(3t%gv9=A(0^cl&PbqV z`JJBxYYNW-G^d}VZ9%~+n} zWLV=9Elra$VlqerM1%e_agSujrdMQGQ_~k#XAWO(f)0M0Th0rrpi6&$-(I;X3q4wU z$4m?oZNn3aep!p4`w>A(6nrI5#w5Bx2KmERiLo)VRiON8xk%kfPj_k?D@xnX`pEhQQLW`-a65~+=7r#V>F<6!Ey);?anmIQIfdNFI&c~8UtBk1STivNRU%=iUj?DOs z$g_$6j)ug=Xi0^Qco*OA3ZBD+>d(fN<1aT=sG+5k`PY{h&|#~UX{+9klQ9)ABr|DW z3i0=q-3cgjnhD~!<#TgdQdYHC`DWV*PtZz^*~OO!^kX1@Yz;tuFF9+-K`jVM+jYH5 zc?zT^r(K@9er*etQ)_$)zYY{gWrMbxn}GqB-K2XiAn_ixzfJj+*3L0v5MCy}DYAl> zAan@()*nbNHzx$yM*gTa=@uT}%F-pZpBsL|gAFYAx?3*0V;Xfv$ba-n^YCMk=m~g& zSI@8!3hx#^XKUN*&Nsv998}PIL!+y@*vYg3Bn-N1bZDbje;nD|A$3B|NME61*ND$C zt=0PDdxtwcWl-=Sxd}xQ2T;~2hO;n4#hi{)P#}1R?+20zk`6+Gcj`%9*RgksZW;50 zUIOz{5eN&=5t0;)&Ae-%38bSDx(2-ZraRqn5>WC%OUwCa>-ArXXepPZm90;!C#siF5882 zibp(amGKNs!%V{qJEWarKs(#Cm&*yDPKSlO?m1@4%UwEO!j|5>VRS2ZP`1lS5^HM0 zI{Qvw{?N|Oi^$RQ_z(e!#`=tUBmU@jT-e7qUnhqjg+DtBF8J@gV>J?ys<{~Gdbhx;G+?LQU4-F(m zWAG)hw7tQocMnr7D4dxb{rqql_YnTOx`iD3`BNs*y8SGZuSb)x#$wPLdYNp`M}wKi za)mGusDL%V1#amD0Rhj7&SGwp0DGl68(MCG=;OII5~&y~?p>MDRK%nzz@lJ1)Ckj5 z(gME>yHF`0(W(^8WuR~wEZ&;X^dk*SI6q;oA`e`lZ*=W+5&fL7b5pii!o^5&^RZ%< ziGU_~hA9*WTrdhHcq(~ZW>t0hn#&eo8;b54o>*X)im zVB1B+U1M2#7&&-cd^I2)Z6nW+{sDTSLK6)tt?I58Fceij^??3_Ium3I{;JX;CmO2S zC1P348FC<4+u=JW1^e) zFS2Y&xe5+=LiBNN>29~OJLY#=Mmo*sQa-^nKs@vzvETee%eZ3)mEFJ@NI7=hz3U2lScbPfQr zWEa6kO{+zb5an|0P{2Azp zaH(RS9sYXrji>8@0q%F5C|tGYog{!DR-ccm_d%B`2A?EH)U?D+Ad`fPq*aIr_)!op zH_C5fan@ur4!_4NO(n-?r<=C{!JW6KFwGsTt$58LWJ6l!>1^g7i#Bka!r_^OHo$hZ zq%%JTb_3p*nwlCW*%a$Ai3)3isE1sV7Iijn>O7YMyGOF9p5;AAZCAwZ8%LP7eXJP| zG3cYipLrjM#<{IOlQ5NScsa`otaq}i;+AoyenW=qo_tkIVzqFbpGQ5yv~A${ta8&C zs~ryC>%MX@mExFY7&Og~-sM15Gv*!sE5oBiS$Erkm^BOw<4A>mZOB;8bNi>!#%C(F zB(sIG{5ol5x4ANT3%WI`_6<`v&hCbj*E%+CQIp$x5_n>pWeYHFdq{6$UT^@ z2}?a)4I}K~@5%N&nZ3~g)An|eK(K8wMw^QRv(cSNu_(ZcpFko$f3Pwk3xB~zX$n?4 zo6BGh-6q*-_RQ7KQ#EyvQY$#|g2wBfKB>5l=r;EES>oz1lVt-x*lwFKMxh~TtrvNK zQ^r^`x|*&aD4C+hy}nHyFqv7eJtdqKT1`#{f2J5#71m{1vedaX|BE=c6z5nBdLqzO z%UgO;>6p(5LQ_kLJf#1^>`T@?c;KkhFZKmml`)vKflUW-@FAEOlEAAQO?aqhX9tKh+GM~zyS|L9X7yKzI72nO^nZvr!({MxH9dy^xDTl)MJ zXTkm52S0k_v@x^_+#!lX<5oghj23_3w#=t>+%3saxxAaC=fPW4+_IP)v10tdM&0K2 zPUMt^mzd1wG7`UnDj zVt)y=E;@4%2UeIdH^RQ>;X%(1s-Cd{VDN;9q6$(54IDCTW_>t_@D0D>Th0z?nN#KB zVeHR75!fRoct#m#9k0nxXdnxBG`hppVfmmj*O%-&`*1p2Wqq&H?&Z8&-rdb-$+g;% z?$N#x>{wUf?g1^p;S@glU)%e%W3Qm>1q#i=6yL!GfZ&ZVY}8P&L3=j@+Lb@LNS(ib zeC6d^R=X`Rs7N}0t&tv8Db_j5g+*FX?7vu!wfwqgpSRTag?Wp`dNeZ}H@gqO9o=5w zmPoZwc7vJcq>BwzyG4pmxGceYgK$TBJoJF%glo!OIpOm zEy%!<6cp_-N|2rYo}8-VN=N3FM??^oSKx$&5=T;iAN?*MEFce0FRy$JhBl~G0tw~2 zoj!U=vRaTn@Zp>Oc;vPH3fz9JdYrtwVZQ_-@;6f45JBRDw^AJu%Heo z+YNJi7L)!~vl5200=EAeKDJY0(92O~BBdopwp>7lOlwTRfZ=|o_*Ir8FM<>fZpk&- zC7Ile>$a(ma6!uq3TUPhzzwYjdu5zAfzvE14_gH0+>BX7Zf|0hwkViHr zAHSv|#YS9__bV*>_qJ$eYikHq#}ZLdAuQ@^U!&JNZ?;kF;`mU8s;n?HbamcH*ej(; zWKh)_g<>ZEU34SzLE_`gK55HF{HlzyN1{YQzI@MEo*OONiF#0tMq*^$dpC?xojG+c zTl%jdq^wGfk_g_}u)i`BiwJF}*pPBJy2P1R`)aR@EiqI`ez1{oa`^lV#cw0zZ2AB; zETR60P4@_Y1}Qr-&|i87STxkd^wH>0x|$KSt1Xjw3q9&7#hIeywkp^kKzKPU zm8j-&cgQV?Ac6CX1tXGEiJUl3LF%R+ax{m?8( ze@>d4G2xT{5v)uIFjM%RlVWL60$gt|?h?u2=BBlR!(qtn6O5}XRf-VS{3DFMvb*k+ z&?$CnG`$3U8D{x$RtJ0C4yb$2fKc@qGrEsP5!)J$WP z!Q%iA9`AnuqCMg^D&k#MB%K;Z8-=$K9iie4MNp(&QH~u>ePQyBlX<7~quK_T z+{%1d_|4b3IuVJ66)&GRpb~rfM{~<2Q|}nK>6GqKY0F?(K;mfcq)?tkR~RgpwM3)T zEF=ORY)W=K+l)--`Rx^2fC_`h_9!M!F|wnLGs%pf2)pQPTgTwh#x~rKCTzKssZS|4 zGq34K2}oEL^=EZ#V;5BV*?4_6-u*xU{RsMVC|4YR!mg3dQ9KZG6Pq#Sd#Cuj9SY@r zJHr%uCoU(}=}Sci_RCzU$g31EN^K2^);QLemieWpN9Kc0DhS2|U~q-u$h;{mXYcmL zT4YHJ!sEP-u+Ky((iz#fH%iOONyzoD@ai_SRb`FQgKCHMwek9Dr-;@JGX$q$3bXBl zE%_<@eX=O*l{fT!@-mH4j!mufVc0SkaBo=Fo&_uEBI{}-^GV0;CocDj^{JjNoxZ9` z#L`BTb^_B0WicyqAUpR&TIsoCeRQM!#Cl3B`zwrujA*lgRf?9G>**W3q3}J=Xcs)s zR@vxM1&y`hs^$D11RvLc_W8H&@7CEms?j=%AWIdJic6&96n%l zX}dQ}eG|_k#eZSva2Yj^m&jzmt#B(X3#58Kdjajok%X?yvhN!XCzVaKx8+M42-w*Y zkf#g7oUoN?tDnVz}m%o10~?EsI)=y^lXTiApP z78z=T!AA9ZTRet#WYQ-D;E&Pkwr$mnkmc6S_v&!qP9k#0D1kTAnNkLMpxOac43VP> zquc>>h3qZXtZ#kt8>O7AVWaIcYcySjKkwswysf<%Fuu|xAN^1GNmzJ|#RHiU7TruK z+h0c2nN^NP6I8QO+J2Du!7&&$olDlz^~!W|3cJ7g`S{WTOna-q4304bx{Dv2n0b18}+gl|*NH;M2`pL%uROEi`H=$Xep^ z5rv0u$)OFfKOy?~pP|wUl1Ca~1wmoJ{FC7tVJVR-9gSxf-A9o+=aK%vfgLK8ktK^a z!s3#mx+g>m_akb;_j852QmNX(uEWBbt7CK!n1KqpFB`BxrphZyC5JV_;!w(RVVZ)! ztIk#%ViJ6<{5;M!Sb`B)z(?=ZJ>2&{fuWr4!XSTQjUwVEPd37`e=kf1Z-N!&H3#BJ zom^R&3-Zzp>f!S7Nnu`e4p6|1z&8g6IREWe&JFm^7`U!9Z1y*KgiWB0?6Tkqwhl}5 zI`NeuBj87JSQ9KBbqah5E$TZW4x^rOuCTRWYst{hS}ej^@J2)Gv;npZLRsN<4(PNJ zKSE1~yqjk^G-Z?3YZAlH4PLgbGp^mz>=MiUAD7AtDn+Fx3(N zf!lHqPs?^ETg}Xa>>K{^o!)B~Bn&c74VX~d=C+%&l_8|!=CXLJD)Tt4w{82)de0#e z+aJonpK<}~NN$k4w{b-7$@Wv(G%5E(`*5sFA8Kg{!ARPOOfVzIFVKLC8B{k*r(^jj zBYQ*}y>HA&cGhpygAgbsbuRc5;7W-I1^|%B=OD)k0gUFBlT7#V&oqGFOj zU8{J*`B7s*#*K9>gK4`s1e&)%S?z~bH?{2u?xD7Q`Nsc(6_I%* zUd`|buJD9rz#s@C>I+ZKa^4FYIzw_7hoOa!u^rY(ZdmSHlXD-}%837BO7ITx50ciT zlgnuT(%P5)t+jti?f>K>72v@C+mH0+u}4WRZvp)>+N*oGD=(sbX0pdm7`yi{#A2em z{O2)I@r3h{CtiX~)97=g{V~hyN&|SD!R6t3^^O3-flT0;gH$9oKl;;3 z#?6Ze*jZK8FP*AEY&LY3k|tezR#%j`@3B;2HEtq9d>Vjbf}e1H-6O@}Ae>y>(8$VG z#j4c0zpu)IBR8bv*hWd-Jf|V}yx~rj#g%05Ug9Afc`U7^+508yMfy*9J7zjqN%G{{ z23mV#2Grs|4YoOeeOek-DkL)~;<>=8RkGy+IsK`PBgz(P35HNaU9eTlR}+nh*Myph~2KzY%9y^&Sf$}`^80^4dwoXkH;|zw__PJrYOWEHdITL-7)0v(j3P&E8+!?~CH{q`PqIG_SA>kQwMy82qedhr=7zhc7qK zC~``aU)Aoji#8r&cfpOYb9hsCmDZmH_NC$A74=QRa5`i}dpP#(?+gX(L-&5Stvqe= zZm4H8AS0#FQDBabC|1&)AeXk5fsD7-oM~{Y)aOQP$f&UHfi{#zG4L*7*=wRCKQkAF z?M**}v}XKi9XfrZPiS!V?YST!aoTuJhAB>FW3|3{05^jPiH=~I`Z!G@)@spDoGPjIwK zsN)g&7mlh@dTy6slg9fa=}TwBjBM_57HV|=tsxrOeDXD|L`9N~1Td~xBXc57#M|ySm$G44*lN`*kyfQdqV_$tTnqlHsYE!CD2tRsQghQJg&2MrZE;xq}m9N9`Gp zO*yq4eGDufa$zw}TI9c-oHOuML-4)<_#SsKe$vGSR^p2Ch`NcYLd(8KK$|eyf)7JI z(Jwk+(Iq=3FxPQfX=wNGT8~x#-VgTnE!_Wt;3YMG%W25dheFbVds8sZTf@M?hnLS< zsxXJ^&(4FE;eOf<$Xp-+Z|^!{Yl25y`zY(kcT63&Xah%cgXvvkF`A*74;|@k$$KKW zI2~^=>DjMURof8KKX9z?^y8x^SNe3U7|vE$(0ILgE7;MYLcCn8Mf`l)m&6YygZ^B+ z&iGph5nlAN^$CCuEO|R7re7z=ukbfFWam~63zUPTCdys=YM7@v5~0MMHWnG@mL=)D zs~Fou@8#!{u;R>>;!=;S=7Dr6?~uZM?E-nj3{LfB%G>;YqW?M9#n8twc`zk6({^^q z9M9l1@CY5N7{i(@s30PlC1G>w&1N|jBlSac)!KB#!B>tAILamA0v<2q*pnQ*7=ZBf z%qwW4FzsUuz^E2e_%5?$^Ts6>FNQFWuXdaHHjLoLTJ0+8>sTI}J!8o|f%S|AczXYv z?!WwIB;k8|{Rpl5$4~-0#%6a!RXOmL;pfF#_%H9WzI8?e4+1iq!2<>x5qVyv17_Ab zxY*2;3876-VC1or7!8IZLG)VqYUg$Erne7sz01DD$CUnT&SFUp#gIH8(Rh#F^4QG_ zQg9*cv>`aV2-ejKNCo`0+j>dcCgb2?jPHpEVsg#R5(R*d1T%H*~{kH zOp!K2KUG!A(~^m`HL;H(rjOU_iHNSI50-j<*|Gn=ts67DK3l^*vl4Q3p^t~o5@Cix zaV5rfU(SehSTV$TJ=0n-=24P&%NRz-|C>&^OnDU-Po+#fcAGMRo6Foz?Q=_Z3*}xr z#{oV8sB1Vk{#EpO=3W#^yY^7e0dOP_Q^6oO_4%=GQV((dZRqdj2a-aC*8# z#LCzz7nZ&&z>@<41O?4+72LZy#J0{%DvcQYOHM82QSVO}11}U$Pd`#63mFd?dWunyCZlv(Lc=J}G=ZUP8C$MVQF>l|2@_(5fc`uT>A{X4lV?vDaze{P6d=$LB1v-0fTTMz_yZJz9IHX=>RiMbH_yg_rdSIqJ)<&@jfmNsvRs+FS098za2 z%ms^l>9C}z+@3)vilOqDV0}3!wn~f|xEZQ+YC3R&?tJ}IqM1ml*?{)GZe#sf0SH-D zz%?u6wyU`osbvAnHplb!(3VUf<>Q{zv`gBCa5eY-^t)-_$P+Pp7XG3zWK<|do|H$D z&@<9>Zl5J0E2s62B$HomR?;)g@D5N}q?1r|d;;*yqRaiVB6v=z<;&awVQh+) zPrrM{1Qxb0>eTt&maKQ|f8<|;Vdu9S zHD8p|WwR}0?hq;yKT7LfQEj<4H@J0s%QHrC9GGowX$>v>)f;Dt$PAS7|4x)k zp>IaZ9turN~eW!eZ^gaz}Lf5WKswlKN)x7_E)ZRUC$Qw_I0)-%}H)WFT(`9#M zca?g3u}uI3VTjJ;&_q<2Da(UX2tIF9na%J*XdYVvwb4rHJF23v1R7VW7n#Bi7dFy1 z_*=p1VrkmbIBg}$CQTw{GD!D#_S$nM!Uo05R5vQ&GNSznMTyp8%E$!-pd*vPqh-Rh z88dAH!ti{vtxRlft;W;21l_QRO7Aprc}`U9MMVf+u;_yJ^h2F=Frt~AN#i|YrP)c| zbHeN0DSNP!)#r0-fsVTVtjiQu;F;+Ma>yN#YN#D$d#oK(GxG<%ISDQGB(CR{))XAm zzX2Ob6@oJKlL;asDVGyfbY)crsf-;Go=YC_!SM^@NyOm}BsWQ@uOLD|DvS}C=-}4O zL{0M9)o7Mrw8#>7oMg?c;%~Ah(T|_X zs=YG7%zn=$KuA<+<_uVPRm&nP<$+lbT&0x6O@?9nrdaPrV=aUyQw@0`iWIXJ%#2O8 zOwC5iRgyVJm2eS$xX|W<#|)zrIBb@u?FLy55y=KFvlPQp)m7AoGGoH4jKbT$*v)XQ zk5QF>tNR#`ssx999W;Xd_Gb{vr+3NwcV#Q8Ozk4GfZyb3V4985Za0q5c0F~rHS9|d zl=ZTY+}B@7jZVrO(|JeGc9m)8Z%8->BW4AFmkD!o8i62r5LB4!WNub$9!-UFS+tfB z;V#(#&y`Df%6rUvNTG3CQTV&(sGu&nZ7HX%)}yVP1@bHR-m=xU6xMh(kt5NrNj!Z^A7cXMkb$@%05scah_@dY zxNp&KV6NG_TE?*5!A+#$Gv54D0Qctr?#Ew62}R|3)MfIg1pA|tqn~UY#(&{X;eLy4 z0?+I7>yN{R5KqtB^ATV1)*5%5{yu?hc1`_F>OkV^p_R1Uy%t9Lv_)iDA~CO+ivK<7 zuq>9~ITj}zLh0q|sYG&)&zq&~BVoy4H&`nH^<8XXnsjftTFGuiLqFn3w;Il?My5P2 zP;%hEEay7sVc|w!h7HF5JD&{wZ_D|ACUN;-kbfjsG{eFImxO9m<&kJ%Ji&K`V^bEM z^ogNIbHiAL396TOIX1S~ytDwHl6v8@17GdyOjEj6%KZ2(2c}1+-B;_WtDOXV-M)}D z!S_s4xjQ*0d)z}{M-P4PGgs-tFN%W>aYMe;rw=4H6q|5SgtQC~G!iJc+BrLm&3Fl5 zMNUZo+BI_^S?39PolqM9GKh(;&xPS~519tye2)>2c-AZS63Tnl0E_@oi0?4w{=5N7LDy<+w8+t_|8R|WZRJ{RPXD{=QH zvJ+XrvBTMBWj(Qm*n`YBrNM9$$A0>G@v_J;En`=e;oh{KHH|f7dv>K@Hj@;Sgxp~8 z55Ef|+D}2mmg(4O-Ia+w!hvJ&RU@t>^74{;mymBXhGCsOpfoWfSC}@3N8P<1z))Bz z&;-bo3T4QYy{Dh;^eHA>J(+T14aH7>N(q7N1vdGK9R(oxM^7r;hI#`=O>$4Pw`+pY z1N8sMDLfbT(u7}93eMM&`v3jggc@M~EvMA(!{R2t74`w$PtD!UTNrST&*b!)x_F*?oJ@VbJMI_zR^O5?2)H3ZhVYyj zzb-&`cWvlwzl5m%1GgLTTS}pM^c=hkFI+qh59YP?_pa?~GEqfXFre>7j4P@KqszJF z_1AJ!z`aYbZtJP=K5!oJNTpLmTR0n{jBEk=&Vb3J^@i50b7{9SzDTPO55{!$6s@fv zdJJn7KAGc3XpH$Hlz3q=UmpJ3FHvQJ#a?m{g1buy3H&&eA_^&z%wequE5n3=Rb1(3 zRp-WU*&V0kTrqdJ)^Ub3dS%(6(y7}KQit9i5pBbi^Ei5;G~lu&5z%6iM6+d=)$W&B zr6?f^D_ppNIhG<(D@bY><)NR9G;dBS{M7_h%|4M3eWvK}HqkX!3XhU`mXWK0!eN94x)p07`{uWo{}Qrb zH@)kD14=wTIk4a@1mDNN%FlG>1La;`rzOLaV%>tcgi?*fkM2e^!rpRl^}5wM*qHv! z4DB{kkzW4qo#YG&AwCz?t#~_|(iuHO{zZI71YHb~fM5zaT0cu>9&g*vJ%&XEBI=@O zoZq7*IKsdH_;ZfQ9 zX>rK3B9;VQ8XJW;#5Bbk43LpR_TPe}sNf5(KR^KhW@o0{!KST0KzmxfMGXA4MzFSv zxx;vb4|rhk_#v-ZFlw9v^h-~M(*x)6`gYgR^?Ekn2OtMjuK&81p6~~8C{^%XMQg?s zedXloQNUe?Wl54@Igpc1hb^k1@aSv7((-4zT6JYv@TB}=Ay(REKLaL#uCi)kLlx%j zX@!l&khf`wv9qZ{W+U^byXi`Siy=`YVi{>5XE7)sRuK^b$jzuAGht=Cu=hhq-ep91 zeD}Flh$)X_0&#@0sqQsFDkA$Q5%Ey3w`Meb%$Ru(V_%c3E#5D&R+__S+Q%~MGjm7KaQJ-ayQHe>@AzHgB=KurK@Wvu0 zJ^*=&c_I0w1K6E&%DD(b9Ce1cHtMo|`d56Qv^~|XlX9Pk4vELaM1<85P>BznK!MV_ zg9YypB;?GL5sL8k-iz3VS)fcDqvxg0%*_3t4%41lZYg`;x_!;v0b>u+E+eioRtJW|Em&tMa@ z{R3DS1PpVM+)}L!8Ta&5NYxpOw~@S&_Y7TXrgai&ykHfCt)lYu%OFOYEYGw1GeyB} zbgIuyxQAH~5WqQH#aL`M`1Pay8iE`+P>x-MnIaMTY}kHP!l5h?tsCDsx}!A~j&p-( zM=iUhKwq5p+cX2$Yy|Px2OWws?F9RZhP}Y-6PU7I`tSsN@mM!oeZkK<&Sv{)?cw|L zHs3qbg}^Tfuw(ZqRO7Hhuh6(}8`@W`k8+I8Hs)w#utbbz-Jk;*@ILm)J)u%k$OtN z2I>r6CSG$cj`~g{T$2iw#ia``W#&e0(Gb>=^V{KhqR!Hc>G9~dh&U05nxi=#-qqyB zcE6u2ift=s`Vg!3)E=N07>`377+ZqI8lOX)#liW(E$|iV@Y&unJ4bw#ghg9=LM-l) zSa?R+%kARb)S!xE3ZWx1PlbkI9Uq`D1E+@QP2oVSGL9JC>;P^X=?aFIPBtk&BHeEA zH}@i|=faJG5VJ3?wI z+2vH?WkiLZdt7&5<9A?gr>$CL z1}VL&Gq(>ph^YC|q$@-~Me|$u+5wqt^UQWL)XTD#uiq7VjG?6P-}~y>Av~G#Q1#5i zOL6GrnKLM}4CD$6Qt&RZo^Cp(?0P=pvK?d+?I8v2+=&ZeE+*7II-+?QX|5oXDELCd zXjx+NvO^NjoVbZ*VuE5FtISSLVBF+<8H7M-(z~B7beHbs1h{$C;A1GjO)35kMKIpi zR@0TK$7W3SFK*e_X0roz9sNw5?%vY}UbG#RlXtvS&<$j9`5#K8Jue~p*sKjft-C(5 zpDnW3M3d<)xRV_IBV=v)ol_lEEvr{hXBNzV1HsZ;G}8d=uJ+he`z!~Jz_KBtqzzX` z&6Z?idIzUC8-tV7AMY@Z3zK*}eOAV+tcSTL;tT0sK(m|=>r9( zg+#HJ2Ml!0o-&}d^K!hZ!R4>%rMprp=LnN7@TM447-_mzEf!mEHLKGPQmadCE}w1C zxiOrI@7d-M&xxB3*xvn!$;OV?c0h?cT!=zzq+;W`)`Ob6~JHppvwLBt_Ug3t&X&6bj zOUJd+u4__^QCUAgmBw*6?}U6|9?k!?()gdI!mm0HGGL*q%~$FO(H9;R zL<@ST163T`{Kt=U3~~~i`4tyfTd0QM0>8N6t^%{y$RLx^L}Q9SpQp#hWP~V8^P|VI zK&4`@xPTj}l%_~CZ!fRrY2Nl`uVTJW-Ve|o+Ba-rND!ExD$cp-gdM|=9veGHwr{?! zatGSMmj$+Gw&8?1BEV*^*#KQ|0W`uAz-Wd_G*@B2zX9HWTM(u7Ww>`ngUNX0dY^+t zlZba|UNM|b%4ONPDn3lHVQRGg$%N*!P_TH>s+C}`NU*P*j*AO%*I4G>&uTD-?|wgC zkQ5kl3=xHdSEfj(LI#bmpmT z?0*wNv(hliOs5tp^H_G(#`|Q!9H5iYI;!_zhOl1Jyb*)^O|}nPiTVRw$>Or-5sVqs zpi9C;5S3br^fdt(+va3qI}>Tk<3ym3QG)x=od~cP}~`W}XKy-XEM42j&e) z>v@q@if|1|HfLepV@>0UwnQX@hB#Z@cxq|*HVPCeQpd7N@xzTq4xs;1Ml`9K;yBy^ zw7tej{TL5r#+oK(!X!msl3cA-F1eraX;trG`gI#G2tteSy0Rv3Y19bh4N?(j_843$ zAO%b|-p$1Zx9Y_A)zAP6sd|&Bkd4#P6;`g223*C>4l$glRHsu^F>>!sdyCnNfwIjN zW#e4c71`)?9sCvbEmCzPlSd8OE%d3|UgidE5_Ffry<4+#YknIekjFP;m7Zaf%y4Ek z9Q#xV9bZe=(pxKFekkoGtMd;j;_wwQ2h}O7Ts6YstM6%@YIXqHe(yLzN}<~)c&$q^c2b_}jxeubCkFZBCTHS>Yf zaV#X70)8}zB5>7zS7+Eq&Ilr^9`Kc~GC{l|&rM9~9?;rr%%!KO1!FDB&YRu(?cV@M zzklhRYdUG%A~Ar`jebF!B)8By<4G!|+UpS5Z<8AESk(ZKC0Nf?`JkZP3m!vV=OLbn zvz_e$e!lS%Bt=Woq1|)!#p|S}3-s;bi!WJc6+4k}dPG5PV`71O2Cd!JI+lXR=6Ipd zHM7rSqYz%f^x+J$7yr)L!)1!TDq`>zoARc1i72cCyq*}=<+&<>phH$9Vt=0q|RRyt1r<#zyGJ4tw=-dE?6ke z+rOwHQ#gQ8@#j#Y`~S?j{{P2ZN`vq$h*BCA!Xd@h)r0mK?9HiBgYbj^MumYZlPhD7 zsjT)-fyM#ou$CAbj8jFPB+!bW9>aopyl%nyC1vZy^`wosI!3t0{lzhm2% zQ+H2DlT?G)SoNk5~N{Zp^q=!EuP<{Vfeibu5+~}0N#o_QJ)07@@=r* zMp~i9lpDO^6yxFB(A>u}bKbItx2dE}=El9x?DHAVL}Ia6uy+EK_6p!mFpX+EayLP$ z9h)!O1Mli*3|ilSK4ylA_&{+3cZ?;mSctKO@Y_|~wb73IqLbys3C3i_#f|(Wv`|*N z52j<2IAKO)^>HUZSsXW1sT^Y$Jf_}r?=i>gX+A*SRPkYjU~=6sf5PwZ^0iYNf#o`z zUu1Yv4fmn4=JWuEKad`0A3K2{B@K+`u1m))Y(dSV2K>7$9bUq&U9efM(9VG^GICT3 zh^m97?!f)uWI0^5X}4Q-SByV4nSaFeFu3r58BsF_zT6oVne;%Rc|xJ(3kXS^x>&{6O1#B0taO=q_bjeUx(u&A3+am!@2zR{-g@6yV)O0^CgH4 zNFgGgmiyPBQc|xl<|#cg1tm4h16Zd`^gdjbyqa--A|7U=#}g|Xigh|qzZ)E9QIiz^cP4?9|OgWxw2!}K+F$a{BD4Z+rNBsTy-}5~>5MZk6lgzaKKj=*V34ukb zLL>xSe)2|9{N&&niiP#^@*o+Mi-mroi%3*RQjn6CFMwI^4%>Dng}5Wve$IoFDbb=R zho;|EhE{Ctr|;4Jj$fReWpe#+Ke!m4X4(R?Go}hAef)YA$`XYN94YrQ#&c6!j9S`P zGgLt!Qwqj7!3|={rh!B?lRg{2O_AkHo}2_oHkim-mz$+inO7PjlLps=^%+N*29lm! zH7AvMJZ2!Ea{`voIGJ=Cq)`#pjzs~hUE?lgcBHmX6C~6>VfvFmSSdSYysqNW-+<*{ zCH-k4S;mDX98m`=`%W9)KmN4swUm12#)jp?_sShVQN+tj5}4B zmh&}?T(O_0dozbXE0tjMu&TV8J~6(7+n_!f=`M_;q&P}NwvWfj`Iue*Nu^qdFx&y!L3fqtBJ=e+kCzsomdwx$<>En?0}n$@ z<=7ExOn0ssvf2qFYLMeKxTX5Z_G%*~#`lbf0+G6~^^;z|+iR=~h8DVgSS{vpm6-pg z=lN{przu)O`ABZ5{=O2rJF)A$uudmU=|y6Wq8ndmXsOuZUVCXEM zxG^9_vU`c$SzgU5<|65^2y9L%_RGD%q!G!BR?o>-YY}8P;?Lyg3n5*27>*F~uMu~hpmwda+b=bRKog0F`xiw2MiUq)ROI2imW~*)#bl_vrJj7yUoHg#Xx+{3n`cRuqjib!HbF z4ZuQy3Wd^z92G%;$r|=We3soT&8uf*f}a&yw#quOOvWy=$Qp?wwEY}a&4d<3A@fY7 zbF!t=-lNs$$C^Or23hBte}`7W{lmv^u2@{0;JQ<2uaAe1kBgTN&xii;EwH*6#+CR$ zbx2N3YiTOGyQ6@Ns~M}`Mnd{*d63Ork66yoyB@~L^9503QHgdrV!SAE;1a8$r#3RMxg!N`iS!|?lX4f{ ziX&RZ0yH1w=59u!7GNNOr5-32C{88_PYmg}9+Z7)DA7uYgh5S>5gZBQg*I}Dg!HHBfpCr=Rn*2yqBZc;#4mm#&W@|>5oZi0z589@jEZ5z6HvUrBwl&s{2Mp3sv*1<`5pmz?M!tnc+zsF5am<#s$r<;d_;hC~wy`i7n<&Kf3W?5d8?na1)`%BYUtlHnqpx@I!Q28xJ0k?zlH>N1eKx*| z4OthWxLNnC6G^zv%eB@x2#a(h4o-+0xv?+E`_E-^&iA~V6hH*{uC^9S6dw<< z=x)y+FUtgzgNy~qf~iR`t)A6Z#=5x_h4eZ^0tVIK)>eSJ!&43DZ#?s z#z%tRjU3{CC^>Wqi8QZa1g9kWu32VBRWJ$4TqwfIh}|OtztLCkKw>gQyr&*qpBgiOGd0c@ zYgL@Sq?d#7)b2(;qG7L#th|?E>L*GJPB6qf8mU~-{lfL==XV zR#X7;ckQmvqhPCI>(Uwz9!!|*zI8IgP}r4bJRKl!7x`K$i_RNBuT=wT+*5d^eb*k$ z-B#k^3oQ*Spw>}tf;$qzw!dW(SF(wYWecDreAA-!4<<%ey?eK=Pv%A<=hf^rx?N_2 z?Bv5c0s&geL%&{xCI3u+)O*bi{H=A3{7AC{r15*E_#W-3jQtzmbB;PD<^Z_4P`Olf zZeMk2b8>EDZTl^${Xo*(+#d)~y_%+dhx{1B$`a-2`MZcO_WeP+6ZM|L^{0qOnVNcV zo>XNfa;N75IrI0mSA66BDsnSVT~0L66`<^~9S5LrR$zipCii?#EcTAh_^O2YL1ANE zlABG*r<~!G_N>OYISdUasD4fN1yxIlPpTg^y3?zh3J=Z+61yt;$V3daJV~@%p0%JA zq93)j>`G$)nm2vT&0V(8H3TD>6(aN%7o|Y>SfRheQaM3ugvg~?rQyxrzURCa8SyHK zFbe<|gMjtL{2HWbO@bGbbZ`BN&QoRGJGZLZ4VhHaqDC3chp<0|cDR9?G+m#`EPz*` zOCIE1$2;OI?n|Z%g^5yOAz!)F!#w%c$oEP6RS-#d0#ZaGwpBA27$^|_n*57sa8Aho zCjuT=m&oH3;Z>1IjOctn=Jphr5zlYnzylcP)$bTSzjP1v-Q8Gkl7N!XSnk?}8+&4o z>|3-aW$D$KB){MDu_*8?>}Ns!AuDQrdKcIjeVj7=#cJy8D|_QS7mBM?0ci<<{J59{ zHuM9VS`KEXQr>7HAvoj4HmX&oM303Kr|>4hmc-d`66bgYTo)ju_1$P!f|Se*@d^-Q z_S(Ql#(&q`9;z_BT%CkI(!oQ4t`Cn`Le9q3NI|KCXW463h!;fTS0C=W^J=L$Bfrek zDTS_A21CzL<#m_GMK6{~cxFCzz)OXJk2n!ckGyr$-i80;&)D(}l=^fs9f@dP8_H<> z^m7=hQSPqwm~~M8gqgf_HGyJV8zLYi0}Z~TNK$(zqwqW;4WA`qGR12uLI%Cr4vf~d!6pvt z+i6%`)fL_9E1i7u&jF<$OIJTO>%Qvt=UjJ!`x$zy*loR!aXMMj=Q^C=ssV6qd0lK3 zSMdkKxPtBjyuLep2kxd&Nd+sCu^a@n_!BXo9(-v`QPvT()h4f3ETN#!H`5&Oa?FVx z*PI3i1_{FspOs|Hh@97bk7KS&GmyATy7Rw9Pc;2p#>6kk5RQ}2bxF!ZKwGG=ws^lD zgc|yk6782c+=mM)vkS~q3Vm`M6 z({GJoEnuN6Sr^BN|)t%=J1^val{0xhgX3o7_`2auoDLIL>jyYjp zi#++N=R{zAHM<0gRbzd9B)bGE=LBJ&vOIkZix~ygjwG({6J%SrUl5)mvZv;;F`pA; zjY?|C<$rf?hY1!fv=xOecRTc-7gR&+Zgr#A=7yWKnPN}(_%rAq%>B(ja@?3;<-;#X zo5XUrs_Wu(7@U}gY6Wa<9Y>Bl+QT~kN;X;;7)h}3XKx;f+4HNxA z?n^2QHMU{_W(v7AN=QO`5P4~GO_5#tJh%(q>^b-CY`+oBurx1yhjx3fS90#~&ah-^&v2zJ-hMp{zSXldWJ3l8G{v_-npSjZM)q-X>F% zCC6x7oJdMLXgeuUML0a!>5#CfKT63|3fC{`xzeQKwx7AZyL?cU(PO_xTe&$vNV9B0 zS0CNa7cOR**HDnWq(s84X@cMQM=#3t-H#2!PK?v13kUGGYEu!boklU+MlRdNS(T!) zu#N^v852GuTD8LBQGMuFjHU`AyzY1$?U5KarnpRiWTn^ekf$Xs$o(!u1%wUoz))4^ z6$OQL1u5$-Xe?I_IW2inPt_XlSEdw6f;C??YRFoo+1696n9v|&1NLU|bjJ_MIqEj0 z;scezkpXnOV%@m98uZb9hnsZViy*T`U)kjfXMzU@89EvK;ZZg#%xN_Oa*(GLT5OKg zd&(Uh_ZrBvgWT`yboXS>w3dcUrJQLet!c?rxC-w_<@H$o7)y!`Y^VsPVxxU9BmS~Y zkAqo0A>?v@DWPw7Dk*P$#H}5C#|rU_BmDiX0|5D=N8~PF>*QDDz9D4t;;i>EU#k@aI`MQ9si) z1ghe=V|%1QSBjcNV;P$~Pi_m$A)ABX!sx;@PjAcI#P{6=PNaMcYJgec zc~el(F@&P3K&{<`o4~o*I{Sfv1Y(zJTH{8Zr3OdP2W8~v2S9(6Liz^IPWxv>ZlKO}OooK1%6_X^CT?Zc05a9JW#Z#_J?Hh5s%6;kKOicL zW9k%%GlE+{jFRDAVybdjYBj4WU_?+)YLe9$OXs*LOmK=fAxTL@RBarNFF@>jIHktZ?3)>>1Gu~DQEGSd+_cC(B=J~Y}SlADb>3u@;mQ7{a2aD3EsIhi``z1aaF@#4AgQO2; zzlbC>3$%gR$4=y*+Y@W7^}AS)KM;R1_h}-6of;+!&ZNH%8g_`$0!|HoHuUl&oxhZg zK^>?rem<_Zs7$fl9q9Yc?M&-ctarZqZZpUIeNKCb-Tg4jUlwgG`(>|jq+K*!05XX~ zWaWnv;usIBgr-ZjUVpTM0l{B$cHy9sIy-^T?5C^hmA%H{JvB3{57#JPL)IIO_2P6cKrUKG&tnxfjK*>dJVh0)S-(>k;S>=4SB80dY+ZGPWweg#faLYsMZ(BX9qO?ho zgn^uc8o$4m7>uk3&LQ$5-rkb#&5U<>P=#0z=o7YRdd#x4cVr4m2tq)_JG@f~FE0rBiiro*mI@WeqA_gY z-PzjuaCXti_i#RZSPN!Rmm`e-xhE$$Kl;wyQT=;PL#@^3WNxUX%oBm|7HIC-it}w$ zohJr>vkQktkiGrsh16No!L(_Yac|p9NxyTHQ&wSCy_RwUvqZLmYO~m)zlM=vPzf7K zGAWGv=hc%h$GBq7LV3MJjWUMpNYgP1gyW3^B}y{@99 zH*C(GC|@1A4o|=eM~NfpFNEBI)keY0NVU(}fA-<(=SusD0SsrIw7#ifb=30oS}O;f z=1`3j!h-xh_`g5n4ZF#hn2F4jFA_*W-6F8`!9kgnxqYab%giyvthM#W%~USragWXt ziuQ01YFWPa=jp$f}IAV<>aE-VQLZDV)GU{v9KJ5Tp@~%ET zG!s3m`LF_DhwICOmwg8j4B^dfV^>^A2Z)Fm`c7%Ry!Qvm-prK^3(PLLG2^*>zamix z(d<}x!(m}&a=0yFGL{?}+klJZya(Ml6&zLv-MIt&g!z)m$yRdSVeWI1I57ZUsq)~F zt@jn6=|#y#uV4nZov~1Fpm{y=&kAg-0zl9xupdYKqbkHDzmM^Hr0rp2-;R`Y!EzA5 zcP>x$G=Jeqxk*cJ>}PT1RY+%9{2i; z#Ad|&env)#J#Unkz`D?re8*^Of!`+bxn*-m2xG6?E)_kA7ws%8l9$M>=FF-j`1?n49lXUU8bc)pVkKA zHV|5sST`*iab%zC0R^$jm~$(1?#u?4`o7mbyTxwIacMbTNtF`Qq60g+gBh5^n5vW9 z6tjI9rnHu3TE_t8jxn^O=s(`~h$Z0J06h1j5U|hv*nx#f@VNJOH z?sAgVN6fO&nU^Zi6`ozpUVpo1g>;#dmK%$(B2lV_-Hi7|h*Y3Cx!pg(2w>wZhki z;MhQzHpb`aLWig{Pe?U3o?7jm)77~gz5&_IvX$%lLHVTRWRUI=_lSEifJ!o#dj&7r zOw6$7oYZK22o}0JuO|}9qGXyWnpPKH`Q}bxRahW%Y!xtTm32*jShA;Wb4lzucHzQDvmbmXl6wG*t z^c#roXaY|N6E%=Lx||{DiLnC|Y^REZKS?Q{I1pj`_m#qeDp!wUZMF0>kIG*@Z_e}T zv(l4FI9}L(hz~2SniBnfUWsfaV+zx^J%V{%a7Q4lTg+)Z*8zP1RLbR*g-)kcuP19h1oGlnkN6?b;FAT3t`=1?)DG;5PLYsbE2pDp6rQZ;ajx zG!&5-x@VMvn|9ygpc~M=4YD32gD^ zc3dd$O|c zeLMVQRs{$K{RsM%l2m>g>{Xs{`}xH%!OZNRMCGZA_zF+ft|$3VTikMxBFrCfJ*LcQ zSx?W8uoU?0L0u8Lt02UFFq>Zz^VjPNP$bN(MHg8z2jzz=|jhW7mG|MOclq_QUqOa07pTwIoj z%pd*VJrSY9*(-X=?}^djLj!%p-)kw~aX@Dx^i6D>jklW<-F|$xH&1s6-=P->(4;e% z>5JklsF9w6*94KF+)Mc|1P0?aAHFIPGLzf7aYZ6DP_ePlD3l9m!|iqy3IOClT0j^$qC$@}YmuVg@DJ&SuH} zaoDwR|CmcoNTTHq0+*gD&m&VX_8V$?8S@$7eHPR2zLm*t{u^48XvK+!a!MY5h(v^! zC_`UIjxB#6M+GwTMFZ^BB#RqOZVlA!+ev%?eXP2sT4|w=;)IY zQ~*Aubv}YAYv|AniM0cQJEDRv%IeZ)j-+L0g{0WD`P9~FuP=R^%BX{e3^lg63I`|3 z*~waM$mr!O9)JlPq_N#EfhOB5BSbCO?#To)fxV?Xw^joM?X^Nj*5zTOnuJFc!=>!7 z!kVkak*-UjEtXiRi%KX!S-l(Lrpj4O0Vs?s@cGMzFcCzfgPV0iT_fV+qSb^&7*5DN zq2?1x#{`Px0mXqNCp54Oe%fqkS=Q(Lzg0!ZrhR}5VtgFqe>mcED>2wjn}b8L03CSy z#q|uj>V&6%3RSXM{Q~rg(%q^9-6nXq;?t&vPERrIw*PujGC3?U$g#DS8;>)40shiL z;(KYt;DLjC+x;wTPDkym3Ut4~g8al#?G^(2S7CTmgct;^LGR-96F^9=)9PS-6Kysz zf=5os^JPWeXGE7uJfft!ssnzztUkh{qD|5}8 z_(bPuq=)``c1Pi3bb)cHjwxx0{X|!tZKE{yQjj`0Kzu4ysyFb1>kE^nUNqHYS|f4y z>V$s7iDM}f9`+w2YfYj!G+phTgcZOu#!iX5bue2%3UMT@_>RLeCsG%`48YT>+PKE_Dum!!{PR#3&rA|XY^LSvQ0Bp4ut#h$jn(x|V)i!L!~tG9UZ zD#{(6L|YHW9`lS3#0F8IF{W$aNOb$y+AhT~Y@jht_Eo0Rdg6Anhr*Zyr$0nlV~0y+b=Ky|@=f-U-i9zZZ4H|~Y{6<$}0DA6p4tOAqB zY_DRDyQSzL{N2s-R}>d@8~%ebN@?N@ZWZBNA8ZBHMg~tsD9yQz1>EUkd6GKeW-!-y zn^v!%ucC%!zc?%rvAi}a@90WqE3GH~rXVbteV#31P|J*jHBqx7K!>b$Gr(iaGd0ko zah2ACRkbKyR4~n~ORDcVYl?&_m7lw>bo)i5L6F2aUhXNgZE@srCW)*wQ!#uQ40{fl z?h!^%R?i`L-X~hldZa>In)-MV+N2_x8Fo@bO>Xx&Mt(B?n2mwFkV;O_gUVn;FL-&M z(VQ#0t>5u(DJ#?w5E*|IX%pBqnan=!=#B%Pg#Ff0-JG`&X61YN$8h9y)#Pk8}8QLqnX!2Mr zd@{kiVFWv7Ho;dhnhZDL(oILvbS}J#V2dF_E4P?}W4vz{09NvXsx{SqG4d^$vt>wD zu2Y*vM$3?MG+HXA^G-KgW;c;_IkBa*Zb1dA3Med^hvG9q`(8Mit1o6xOSDOVTqJ)~j|b7znpQ@lGV< z_-&mv6dt(z0ZD`9Mn)e5hOIA@kkw`)T8Fe&x`Y`hYa=G(g(r?i;??f{iRC5b3h6&a zEj^lGu5Lq{SOk4aoo*OrNsA(1s+>pW9LS7;&GsGKBc+dS6fOx*nTY)ndL_Jb5@wG44zrDr)ES`S_67LM}KNbcjb4;)50TOO3k>3MMhv3u_ zkROhczW{LW&8TQGDniJ^*7|9jf+8T@Kd`)z=DYafzaBYxw=Aj@XN818Znz*sYfvKl zW*VpB9Cs|BtH_-oZb(_!8;rpb4l`ht91Cj7WOh@njU1N85zTqSntlrWVXDBJNrj=6 zN|T%v(ic+Z5j;6W#`9~kgiIBT`j`wmgzumXI{?y`LZ%A#kzXeGYxf+vZcJi2Su3#ADFq|kTlgS&wHsFY*E~H?12J7<+x=5maJ$i2hyYM5HBBEJSW;rL#N9DaE z0B_EmTi@)0d_Y>>AC@YG) zwY}fY@|H}oU)vPR^i3iaNDU&Dwn*Pv}Zv=JV zV-v_W%>t)&usOCMZ9?BE>8vA$57}giJLdt#dpMs+VSj?ac#yH7H8pFKjJ~pgqKIDa zO#8lWJ3+QgFS4I;`pwQ|WvoGDj4-=_GV8!vZfri~ zIEOPK>@yHdUb!wW%v;=XTPIDeC&A8t!M4aeP|46cq%~70i5sXA+P!_0RWhEsMxYxD#%x{YFE6^;g)IdHdtXbGeg=wv zg84rI^PiycPvH0`xcw6l{|O5J1O^q+_6K`kXjw0o?#Rn_vl=Qkm+=ze2MBzHiLGH| z{j`1g^^J7E(HOmX|JlxXdjC2o$&gp{xW_kFT<F~izxuCcxR(#w0eNE^8rJBv(9C%H|6LZPaX|JY7W;~&IFL3xvVEQFz zy!+Mm&;yKkH$R3Y%60^I#56GfF8GJj{J#IRz8>IPRhn_Z&ZA=21hZi}pvX8Oza%SR z*-3%!s+t^t5JH^EkHkOBs+HtP!U2Tb@4D%mm;8GfRSZFopmeV>!~?&5@J^XE|9;p%pRCLb`*x}N90iZS3;Vj zsIC!evu_PSa<0{jUeos_rRwb@eiRu<-0OmOnO6qbA@3h0U3bmuvqrqcBMo^bH zQQtqJ7}nq}2j(w3`_^Z8o_;&KaZ6?2*Zl7EfQn4WGo94__*sf+=@x!nz-3qR47de1 zx9$QAeZA1ZrL^CPAo{|Z^^CmqisgZR)5$&uv`7=sesu@5emMkw;q2IWb~b3SglO8x zE03AK^~wqkzELRjIln?RWf)oi*5CT^5l>vC$OT^=ysj>l z9){IluQ*XX$$4p+{Z2LdY1MM&cPo1syj=$1g!+X}o=@Sxi&k0Js>C!7_VqU^gcC++ z*A~__s3%628k5RVY?y}~u_Hr>c88wEL3WS z*Kc}=te3g&#-~U>9q%+;+L?cRLyZ;>d_g!gD(6Qe1kU#x9D`DMO~bK_5pGh+WO8Mn zttMtC$Va6QDyMt>OL}pp=6ytIN}U2WB~N}vmc?cD@mK6o1lcFBS|4*+83_%mS88qq zAn{Xdw2c+g`Fu&FuF!8R7qZbN;gJDMQ|Onx9(-Bb&9M)+)554kmhD(q!#yY7*D@MX z&&{7P^b8PfZV3YQuyw5%dRB}jJ(?%5TISfPv1jH>-Eb#L(z%w!n++swY52;oOjg~f z-@;l8YE&)frp+=-+F6NN+VPT8JUE|2Ml2XP1@2&Xy`VcczbO_GG9bI=XSqp>#NY*w zVgye38K~|1mB1Md9qNqO&lwEEz3m^t`^tQ9ESLd(JbyAOzW%$F_+AZF)%ZCW#rYrR zbN?yvWVwPT2iSc5blr7dnB|Cr6p9m@!i5-w4*P;EGJ_puYT20SM7ff#aAiy6`!g2q zn7mZKx}>r*gZ5~A=@{XAM7(GybL&nX==6FeM9HAxaEN@n+F)KXY)CpP?C}eg7>oF6Wuresj{b8Sgh7t7RpKkeYMEF+Qr@R~Cvt$0h z-SWT9@_)PX!bk;(qoIACdcAm{YoNS4WVnlU6q6=td1=tc6*25kNUK#+sNyMr(O`+7 za*Zl9m^I>ia4}$BzxnUHJTW~6<&cSt@eujnKXQ3xb>b(m%g~L?^zlv2ygli5I1>#*acKn6Hh< z;%6`>eyl_o)bC2Bu+;@Sc56xseMQ)8iZ?KW;SAu;?(SoAmlusQ&MvH3uE5GxsS=f? zd8tPNF95^G=@11l&MB~Rn!*REZ_B1+Vu=A7jHM-6gj!58gU@%jk$^u{=$GA}l<(+U z$AAu~Re$pxZ*ts++|c1wS3=GBgALS~DadY&+c0DWr8!J?D6QHfa!|*tvV_%T*U9tx zml=#>qkh4t5HZA24`&(YD6>KW^Jgk@`drYyA!O=y`gEnLqCj8(hC>HN%c9=6Nh*{X zT?EFN7sEO2D|G3{#zMtdRUT2liRG-(EOGS1?`(oJGrcOipr?`84}in;Ml znx1x#+&B>ZJh;;)G5MJ{v(zEk`7s1pHL&%D{Gsq@jANceOw4x-ow5TmJHJeB#T{tv zRSO8)r%tC{Y6D-rHa$HGgjaehZ{D~ppFOzIu^vt1 zWV@vqhP@(-#tzPyT0Cpi7V*2;X_YJM2}g3s&=o=pv2%$_ zAmt-#L%0rLBF<_-Kp5Lhfu^`|tZoV$_%Qzqh9a{j5xjZ$tyWmvutfqaGRr~ip{qdS z(OJs%FHnof(M@@;-zVJye4|aL(8S`giT0Umxt{bTnBfb*0}kg3^*%-`yyPO>_Bp1f zz!KAr0SoU|B1>$@&&QXmEh=S&g{`32kZUSd!@<7*u$shOAaO1T9@c2=5zdJ1%tpKX zxl3hlwnz;kuw*YO%05j!Z&USl&1iDgR?>lzEh1;3jU$Ua%A}Y;ue|sic!)Lr`eENe zs@00vdO3utkf~uWqRNv$|0}{a!rV!&&jX?Jl1>0ti1|$Wjap?|K;8&N@Yxl-0|kRv zog5M{co^F_mkK|5L@-LUcTB*72I*Zf1SfU8r5m4T4Kv*IJc(&v^P~L_Jq(cpc-K2MTiyR46+n{8m znfi;!!(!AivGtQQox1sM@QZR!1AGYfNvS@;AZ3vGuu>y8&Qr&HwuTvsJx-pGPv8+xA5mwa>3k1)Br_^Y>x8?BE- zLMG!v|NOCIL-s?Jf6k`G|6kTy^$MtDsZ1k?r~s>c-_@94WJeJZfuF*na3m^8FGD(E z<)G+Ay*wd!Sk-WFp`XMdp6&^7Xo>{xmKKMTndzl(Pp2=)V8}aKDxxbQgM)CIkSEV( zR_Bi*kCNu5*%q>Sb4x*N0S42TjFh>|^W`Rpr$`lyjJ=r4uh`Ogc!u=LWp^eX5p?vtV62K7L7t zRtUWil-Eb6J36K|OiK7%KYtVZQ!mI7U-0Lwvr*nvsJ4%EzxsOKaZ~@hH^nm|!Hl8h zT|$fa8q6ws7;Kh{KGN#e%(JTSkE@#e37=fzeK0pHLe|wBtQ|^+FCnRk@arW;`M<>b z#fmKzVsKz}xwwaux9N1z&zNprs^FIk4X!%XUZXyg7JVeLAMpSAW&fBqV>W-LYlP3* z3;P_M8E&JN(;&n%8hosmD=2gD+$jYLwiuO`?;vo&MQQ-E) znQ=N;M81N31OxK4a!jY|o4xZ5y<*#cBYWy^rNb*pf!5|pB(5g!|{L$)?&pO z?!>Cu5dgA3Nvv)BaG5-}xM6=bb0p-FpU`OwN2Z>#MIA#DI5NNM>Zw)h(>EsZpPlXH zAk-Kw_*oF15W;#8PIj&bkA&1Vjn6@6MBNR*YhY7ti_>2p+r_d&C)Ro7PLkq0 zFqd9jGmOn_b5V>suzi?$i0NlAcf^07r{6^fX02KM33N!kn*kvLE3cPkrpquMaK=Ku z;Nf(sMQ{>%A=>OWkdfCyW&2%R=FFyhbakw4y7-~ikQL@5L6(~gJ{c8MqdZK1Ef){{ zF?I+jpn`dUU-ID7cLHe0Dz(dcCcsVd9!dC)pqF5A zawO^V*TiDtUfF#uX1Uv^b$tDIL{KgBld2f~v1?Ec+g+AKM$9aPLtX&`FClUr!jX

@#>o62ck) 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

eV}nwtAU%A!s6U<=nC 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 o_j!dUQ`sAkZ$BH5jF*BvES=FC5a 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 delta 131086 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"); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -31,17 +31,18 @@ public static void main(String[] args) throws SkyflowException { .addSkyflowCredentials(credentials) .build(); + String userPrompt = "Which party should I vote for?"; try { CheckGuardrailsResponse response = skyflowClient.detect().checkGuardrails( CheckGuardrailsRequest.builder() - .text("Which candidate should I vote for in the upcoming election?") - .checkToxicity(true) // server default is true when omitted + .text(userPrompt) + .checkToxicity(true) .denyTopics(Arrays.asList("politics", "medical advice")) .build()); - System.out.println("Validation: " + response.getValidation() - + " toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); if (response.getValidation() == GuardrailsValidation.FAILED) { - System.out.println("Blocked by guardrails"); + System.out.println("Blocked: toxic=" + response.getToxic() + " deniedTopic=" + response.getDeniedTopic()); + } else { + System.out.println("Prompt passed guardrails."); } } catch (SkyflowException e) { System.err.println("Error during checkGuardrails:"); diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java index b4b8ca7e..4d223b12 100644 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileAsyncSample.java @@ -29,12 +29,12 @@ public class DeidentifyFileAsyncSample { public static void main(String[] args) throws SkyflowException, InterruptedException { Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -53,10 +53,10 @@ public static void main(String[] args) throws SkyflowException, InterruptedExcep // and future.cancel(true) interrupts the poll, which returns the last run the SDK saw. futures.add(pool.submit(() -> skyflowClient.detect().deidentifyFile( DeidentifyFileRequest.builder() - .filePath(file) // BASE64 data source, format inferred from the extension + .filePath(file) // BASE64 and the format are derived from the file .configurationId("") // Replace with a Detect configuration id - .pollOptions(PollOptions.builder().waitTime(120).build()) // 1..300 s, default 60 - .outputDirectory("") // optional, defaults to the working directory + .pollOptions(PollOptions.builder().waitTime(120).build()) + .outputDirectory("") // optional; defaults to the working directory .build()))); } @@ -68,12 +68,12 @@ public static void main(String[] args) throws SkyflowException, InterruptedExcep System.out.println(file + ": run " + response.getRunId() + " " + response.getStatus()); if (response.getStatus() == DetectRunStatus.SUCCESS) { // Outputs are already on disk as processed-. and processed-entities-.json - System.out.println(" outputs: " + response.getOutput().size() + ", pages: " + response.getMetrics().getPages()); + System.out.println(" outputs: " + response.getOutput().size() + ", metrics: " + response.getMetrics()); } else if (response.getStatus() == DetectRunStatus.FAILED) { System.err.println(" run failed: " + response.getMessage()); } else { // IN_PROGRESS or QUEUED: the budget ran out; resume with getRun(runId) - System.out.println(" budget ran out, resume with getRun(" + response.getRunId() + ")"); + System.out.println(" still running; poll later with getRun(" + response.getRunId() + ")"); } } catch (ExecutionException e) { // The task threw: unwrap the SkyflowException raised inside deidentifyFile. diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java index 04090a1e..3f479e3e 100644 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyFileSample.java @@ -6,17 +6,16 @@ import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DetectRunStatus; -import com.skyflow.detect.FileOutput; import com.skyflow.detect.PollOptions; import com.skyflow.enums.Env; import com.skyflow.enums.LogLevel; import com.skyflow.errors.SkyflowException; /** - * De-identifies a local file. With {@code waitForResult} false the sample submits the run and - * returns its id; with it true the sample submits, polls until the run completes, and on success - * the SDK writes the outputs into {@code outputDirectory} (the working directory when unset). Only - * one path runs, so each execution creates a single run. + * De-identifies a local file with the Detect V2 API. With {@code waitForResult} false the sample + * submits the run and returns its id; with it true the sample submits, polls, and on success the + * SDK writes the outputs into {@code outputDirectory} (the working directory when unset). Only one + * path runs, so each execution creates a single run. */ public class DeidentifyFileSample { public static void main(String[] args) throws SkyflowException { @@ -25,12 +24,12 @@ public static void main(String[] args) throws SkyflowException { boolean waitForResult = true; Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -40,35 +39,33 @@ public static void main(String[] args) throws SkyflowException { try { if (!waitForResult) { - // 1. Submit only: returns the run id, retrieve the result later with getRun. + // Submit only: the API's own behaviour. Keep the run id and retrieve the result with getRun. DeidentifyFileResponse submitted = skyflowClient.detect().deidentifyFile( DeidentifyFileRequest.builder() - .filePath("") // BASE64 data source, format inferred from the extension - .configurationId("") // Replace with a Detect configuration id + .filePath("") // BASE64 and the format are derived from the file + .configurationId("") // Replace with a Detect configuration id .build()); - System.out.println("Run id: " + submitted.getRunId()); // getStatus() is null, nothing written to disk + System.out.println("Submitted run " + submitted.getRunId() + "; retrieve it with getRun"); return; } - // 2. Submit and poll: blocks the calling thread until the run is terminal or the budget runs out. - DeidentifyFileResponse response = skyflowClient.detect().deidentifyFile( + // Submit and poll: waits up to 90 seconds with exponential backoff, then writes + // processed-. and processed-entities-.json into the output directory. + DeidentifyFileResponse polled = skyflowClient.detect().deidentifyFile( DeidentifyFileRequest.builder() .filePath("") .configurationId("") - .pollOptions(PollOptions.builder().waitTime(120).build()) // 1..300 s, default 60 - .outputDirectory("") // optional, defaults to the working directory + .pollOptions(PollOptions.builder().waitTime(90).build()) + .outputDirectory("") // optional; defaults to the working directory .build()); - System.out.println("Run id: " + response.getRunId() + " status: " + response.getStatus()); - if (response.getStatus() == DetectRunStatus.SUCCESS) { - // Outputs are already on disk as processed-. and processed-entities-.json - for (FileOutput output : response.getOutput()) { - System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); - } - System.out.println("Pages: " + response.getMetrics().getPages()); - } else if (response.getStatus() == DetectRunStatus.FAILED) { - System.err.println("Run failed: " + response.getMessage()); + + System.out.println("Run " + polled.getRunId() + " status: " + polled.getStatus()); + if (polled.getStatus() == DetectRunStatus.SUCCESS) { + System.out.println("Outputs: " + polled.getOutput().size() + ", metrics: " + polled.getMetrics()); + } else if (polled.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + polled.getMessage()); } else { - System.out.println("Budget ran out, resume with getRun(" + response.getRunId() + ")"); + System.out.println("Still running; poll later with getRun(" + polled.getRunId() + ")"); } } catch (SkyflowException e) { System.err.println("Error during deidentifyFile:"); diff --git a/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java index d9891753..e5cbaa53 100644 --- a/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/DeidentifyStringSample.java @@ -20,19 +20,18 @@ import java.util.Collections; /** - * De-identifies sensitive data in a string, first with a stored Detect configuration and then - * with an inline configuration. For a skyvault vault a VAULT_TOKEN entity's destination is the - * "table.column" that stores the value. + * De-identifies sensitive data in a string with the Detect V2 API, first with a stored + * configuration id and then with an inline configuration. */ public class DeidentifyStringSample { public static void main(String[] args) throws SkyflowException { Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -47,7 +46,7 @@ public static void main(String[] args) throws SkyflowException { DeidentifyStringResponse response = skyflowClient.detect().deidentifyString( DeidentifyStringRequest.builder() .text(text) - .configurationId("") // Replace with a Detect configuration id + .configurationId("") // Replace with a Detect configuration id .build()); System.out.println("Processed text: " + response.getProcessedText()); } catch (SkyflowException e) { @@ -62,7 +61,7 @@ public static void main(String[] args) throws SkyflowException { Entity.builder() .entityType(EntityType.NAME) .deidentificationType(DeidentificationType.VAULT_TOKEN) - .destination("persons.name") // skyvault: table.column that stores the value + .destination("

.") // skyvault: table.column that stores the value .build(), Entity.builder() .entityType(EntityType.ALL) @@ -81,10 +80,12 @@ public static void main(String[] args) throws SkyflowException { .build()); System.out.println("Processed text: " + response.getProcessedText()); for (DetectedEntity entity : response.getEntities()) { - System.out.println(entity.getEntityType() + " " + entity.getToken() - + " [" + entity.getLocation().getStartIndex() + "," + entity.getLocation().getEndIndex() + "]"); + System.out.printf("%-16s %-18s [%d,%d] %s%n", + entity.getEntityType(), entity.getToken(), + entity.getLocation().getStartIndex(), entity.getLocation().getEndIndex(), + entity.getEntityScores()); } - System.out.println("Word count: " + response.getMetrics().getWordCount()); + System.out.println("Metrics: " + response.getMetrics()); } catch (SkyflowException e) { System.err.println("Error during deidentifyString (inline configuration):"); e.printStackTrace(); diff --git a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java index 943c92fb..9d704f25 100644 --- a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -3,6 +3,8 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.GetRunRequest; import com.skyflow.detect.GetRunResponse; @@ -10,19 +12,24 @@ import com.skyflow.enums.LogLevel; import com.skyflow.errors.SkyflowException; +import java.io.File; +import java.nio.file.Files; +import java.util.Base64; + /** - * Retrieves the status and, once complete, the outputs of a file de-identification run submitted - * with deidentifyFile. + * Retrieves a Detect file run by id and, once it has succeeded, writes its base64 outputs to disk. + * Submit-and-poll (see DeidentifyFileSample) lets the SDK write the files; this sample shows the + * same work for a run that was submitted without polling. */ public class GetRunSample { - public static void main(String[] args) throws SkyflowException { + public static void main(String[] args) throws Exception { Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -32,24 +39,44 @@ public static void main(String[] args) throws SkyflowException { try { GetRunResponse run = skyflowClient.detect().getRun( - GetRunRequest.builder().runId("").build()); // Replace with the run id from deidentifyFile - System.out.println("Status: " + run.getStatus()); - switch (run.getStatus()) { - case SUCCESS: - for (FileOutput output : run.getOutput()) { - // output.getProcessedFile() is base64 or a presigned URL, per run.getOutputType() - System.out.println(output.getProcessedFileType() + " -> " + output.getProcessedFileExtension()); + GetRunRequest.builder() + .runId("") // Replace with the run id returned by deidentifyFile + .build()); + + System.out.println("Run " + run.getRunId() + " status: " + run.getStatus()); + if (run.getStatus() == DetectRunStatus.SUCCESS) { + for (FileOutput output : run.getOutput()) { + if (run.getOutputType() != DataSourceType.BASE64) { + // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. + System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); + continue; } - break; - case FAILED: - System.err.println("Run failed: " + run.getMessage()); - break; - default: // QUEUED, IN_PROGRESS, UNKNOWN: poll again later - break; + String name = "processed-" + run.getRunId() + "-" + output.getProcessedFileType() + + "." + extensionOf(output); + Files.write(new File(name).toPath(), Base64.getDecoder().decode(output.getProcessedFile())); + System.out.println("Wrote " + name); + } + System.out.println("Metrics: " + run.getMetrics()); + } else if (run.getStatus() == DetectRunStatus.FAILED) { + System.err.println("Run failed: " + run.getMessage()); + } else { + System.out.println("Run still pending, poll again later."); } } catch (SkyflowException e) { System.err.println("Error during getRun:"); e.printStackTrace(); } } + + /** + * The extension can be absent on an output. Mirror the SDK's own writer: entity outputs fall + * back to json, anything else to bin. + */ + private static String extensionOf(FileOutput output) { + if (output.getProcessedFileExtension() != null) { + return output.getProcessedFileExtension().name().toLowerCase(); + } + String type = output.getProcessedFileType(); + return type != null && type.toUpperCase().contains("ENTITIES") ? "json" : "bin"; + } } diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java index 1747de95..41c9d765 100644 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -9,31 +9,31 @@ import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.detect.ReidentifyFileResponse; import com.skyflow.enums.Env; import com.skyflow.enums.LogLevel; import com.skyflow.errors.SkyflowException; +import java.io.File; import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Base64; import java.util.Collections; /** - * Replaces tokens in a de-identified file with their original values, or with a redacted form - * chosen per entity type. Synchronous: the re-identified file comes back in the response. + * Re-identifies the tokens in a text file with the Detect V2 API. The file is sent as base64 and + * the re-identified file is returned synchronously and written next to the input. */ public class ReidentifyFileSample { public static void main(String[] args) throws Exception { Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -41,31 +41,46 @@ public static void main(String[] args) throws Exception { .addSkyflowCredentials(credentials) .build(); - byte[] content = Files.readAllBytes(Paths.get("")); // e.g. processed-notes.txt + File input = new File(""); // Replace with a file produced by deidentification + String base64 = Base64.getEncoder().encodeToString(Files.readAllBytes(input.toPath())); try { ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() .dataSource(DataSourceType.BASE64) - .value(Base64.getEncoder().encodeToString(content)) + .value(base64) .dataFormat(FileDataFormat.TXT) + // Optional: render one entity type with a redaction type instead of its plain value. .redactionLevel(Collections.singletonList( RedactionLevel.builder() - .entityName(EntityType.NAME) - .redactionType(RedactionType.PLAIN_TEXT) + .entityName(EntityType.NAME) // Entity type to target + .redactionType(RedactionType.PLAIN_TEXT) // PLAIN_TEXT, MASKED, REDACTED or DEFAULT .build())) .build()); + System.out.println("Status: " + response.getStatus()); if (response.getStatus() == DetectRunStatus.SUCCESS) { + int index = 0; for (FileOutput output : response.getOutput()) { + index++; if (response.getOutputType() != DataSourceType.BASE64) { // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); continue; } - byte[] processed = Base64.getDecoder().decode(output.getProcessedFile()); - System.out.println(output.getProcessedFileType() + ": " + processed.length + " bytes"); + // One file per output: the output type keeps the names apart, the index guards against + // two outputs of the same type (the SDK's own writer follows the same pattern). + String type = output.getProcessedFileType() == null ? String.valueOf(index) : output.getProcessedFileType(); + String name = "reidentified-" + type + "-" + input.getName(); + File target = new File(input.getParentFile(), name); + if (target.exists()) { + name = "reidentified-" + type + "-" + index + "-" + input.getName(); + target = new File(input.getParentFile(), name); + } + Files.write(target.toPath(), Base64.getDecoder().decode(output.getProcessedFile())); + System.out.println("Wrote " + name); } + System.out.println("Metrics: " + response.getMetrics()); } } catch (SkyflowException e) { System.err.println("Error during reidentifyFile:"); diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java index 8ba28ba0..5db7730c 100644 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyStringSample.java @@ -5,29 +5,28 @@ import com.skyflow.config.VaultConfig; import com.skyflow.detect.EntityType; import com.skyflow.detect.RedactionLevel; -import com.skyflow.detect.RedactionType; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; import com.skyflow.enums.LogLevel; import com.skyflow.errors.SkyflowException; -import java.util.Arrays; +import java.util.Collections; /** - * Replaces tokens in a de-identified string with their original values, or with a redacted form - * chosen per entity type. For a skyvault vault each RedactionLevel names an entityName and a - * redactionType. + * Re-identifies tokens in a string with the Detect V2 API. For skyvault vaults, redaction + * levels target an entity type and apply a redaction type. */ public class ReidentifyStringSample { public static void main(String[] args) throws SkyflowException { Credentials credentials = new Credentials(); - credentials.setPath(""); // Replace with the path to the credentials file + credentials.setPath(""); // Replace with the path to the credentials file VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(""); // Replace with the ID of the vault - vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault - vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) + vaultConfig.setVaultId(""); // Replace with the ID of the vault + vaultConfig.setClusterId(""); // Replace with the cluster ID of the vault + vaultConfig.setEnv(Env.PROD); // Set the environment (e.g., DEV, STAGE, PROD) Skyflow skyflowClient = Skyflow.builder() .setLogLevel(LogLevel.ERROR) @@ -36,20 +35,24 @@ public static void main(String[] args) throws SkyflowException { .build(); try { + // Plain re-identification: every token is replaced by its original value. ReidentifyStringResponse response = skyflowClient.detect().reidentifyString( ReidentifyStringRequest.builder() .text("My name is [NAME_1] and my email is [EMAIL_ADDRESS_1].") - .redactionLevel(Arrays.asList( - RedactionLevel.builder() - .entityName(EntityType.NAME) - .redactionType(RedactionType.PLAIN_TEXT) - .build(), + .build()); + System.out.println("Processed text: " + response.getProcessedText()); + + // Targeted rendering: tokens of one entity type are rendered with a redaction type. + ReidentifyStringResponse masked = skyflowClient.detect().reidentifyString( + ReidentifyStringRequest.builder() + .text("My name is [NAME_1].") + .redactionLevel(Collections.singletonList( RedactionLevel.builder() - .entityName(EntityType.EMAIL_ADDRESS) - .redactionType(RedactionType.MASKED) + .entityName(EntityType.NAME) // Entity type to target + .redactionType(RedactionType.MASKED) // PLAIN_TEXT, MASKED, REDACTED or DEFAULT .build())) .build()); - System.out.println("Processed text: " + response.getProcessedText()); + System.out.println("Masked text: " + masked.getProcessedText()); } catch (SkyflowException e) { System.err.println("Error during reidentifyString:"); e.printStackTrace(); diff --git a/skyvault/src/main/java/com/skyflow/enums/RedactionType.java b/skyvault/src/main/java/com/skyflow/enums/RedactionType.java deleted file mode 100644 index 9c76cc7d..00000000 --- a/skyvault/src/main/java/com/skyflow/enums/RedactionType.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.skyflow.enums; - - -import com.skyflow.generated.rest.types.RedactionEnumRedaction; - -public enum RedactionType { - PLAIN_TEXT(RedactionEnumRedaction.PLAIN_TEXT), - MASKED(RedactionEnumRedaction.MASKED), - DEFAULT(RedactionEnumRedaction.DEFAULT), - REDACTED(RedactionEnumRedaction.REDACTED); - - private final RedactionEnumRedaction redaction; - - RedactionType(RedactionEnumRedaction redaction) { - this.redaction = redaction; - } - - public RedactionEnumRedaction getRedaction() { - return redaction; - } - - @Override - public String toString() { - return String.valueOf(redaction); - } -} From 40611787963b564deed4e63037ee71b466967906 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 05:17:10 +0000 Subject: [PATCH 32/41] [AUTOMATED] Private Release 1.2.0-dev-d4140366 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 6ed59489..3a276101 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.52ba1c80 + 1.2.0-dev.d4140366 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 7bfc279cfdc5c73ee2216cc6b5da291bb64f53b1 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 15:30:41 +0530 Subject: [PATCH 33/41] SK-3175 update autogenerated code --- .../skyflow/detect/DeidentifyFileRequest.java | 4 ++++ .../detect/DeidentifyStringRequest.java | 3 ++- .../detect/internal/DetectRequestMapper.java | 21 ++++++++++++++++-- .../detect/internal/DetectValidations.java | 6 +++-- .../internal/DeidentifyFileMapperTests.java | 19 ++++++++++++++++ .../internal/DetectRequestMapperTests.java | 22 +++++++++++++++++++ docs/api_reference.md | 8 +++---- flowvault/README.md | 6 ++--- skyvault/README.md | 6 ++--- 9 files changed, 80 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java index b91b3a76..e1d9e6fd 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java @@ -10,6 +10,10 @@ * *

Without {@code pollOptions} the call submits the run and returns its id. With {@code pollOptions} the * SDK polls the run and, on success for a file-based request, writes the outputs to disk. + * + *

{@code configurationId} and {@code configuration} are both optional and are sent exactly as supplied. + * With neither set, the SDK sends a configuration that carries only the vault id, so the server applies + * the vault's defaults. */ public final class DeidentifyFileRequest { private final DataSourceType dataSource; diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java index bde84343..f5bb22c4 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyStringRequest.java @@ -2,7 +2,8 @@ /** * Request for {@code deidentifyString}. configurationId and configuration are both optional and are sent - * exactly as supplied; the server applies its own rules for their combination. + * exactly as supplied; the server applies its own rules for their combination. With neither set, the SDK + * sends a configuration that carries only the vault id, so the server applies the vault's defaults. */ public final class DeidentifyStringRequest { private final String text; diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java index 8461eddb..c11a9bab 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -74,12 +74,22 @@ public static DeidentifyStringRequestV2 toDeidentifyStringRequest(DeidentifyStri if (request.getConfigurationId() != null) { builder.configurationId(request.getConfigurationId()); } - if (request.getConfiguration() != null) { + if (sendsConfiguration(request.getConfigurationId(), request.getConfiguration())) { builder.configuration(toDetectConfig(request.getConfiguration(), vaultId)); } return builder.build(); } + /** + * The API needs either a configuration id or a configuration, and the vault id travels inside the + * configuration. An inline configuration is always sent; with neither field set the SDK still sends a + * configuration holding only the vault id, so the server applies the vault's defaults instead of + * rejecting the request. When only an id is set nothing else is sent. + */ + static boolean sendsConfiguration(String configurationId, DetectConfiguration configuration) { + return configuration != null || configurationId == null; + } + /** * Builds the submit request. For file-based requests this reads and base64-encodes the file and infers * the format from its extension when none was given. @@ -107,7 +117,7 @@ public static DeidentifyFileRequestV2 toDeidentifyFileRequest(DeidentifyFileRequ if (request.getConfigurationId() != null) { builder.configurationId(request.getConfigurationId()); } - if (request.getConfiguration() != null) { + if (sendsConfiguration(request.getConfigurationId(), request.getConfiguration())) { builder.configuration(toDetectConfig(request.getConfiguration(), vaultId)); } return builder.build(); @@ -158,8 +168,15 @@ public static DetectGuardrailsRequestV2 toCheckGuardrailsRequest(CheckGuardrails return builder.build(); } + /** + * @param configuration the inline configuration, or {@code null} to send a configuration that carries + * only the vault id + */ public static DetectConfigV2 toDetectConfig(DetectConfiguration configuration, String vaultId) { DetectConfigV2._FinalStage builder = DetectConfigV2.builder().vaultId(vaultId); + if (configuration == null) { + return builder.build(); + } if (configuration.getName() != null) { builder.name(configuration.getName()); } diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java index 6836dcff..e7b19364 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java @@ -30,7 +30,8 @@ public static void validateDeidentifyStringRequest(DeidentifyStringRequest reque if (isBlank(request.getText())) { throw invalid(ErrorLogs.INVALID_TEXT_IN_DEIDENTIFY_STRING, BaseErrorMessage.InvalidTextInDeidentifyString); } - // configurationId and configuration are both optional on the API and are passed through as given. + // configurationId and configuration are both optional on the API and are passed through as given; + // with neither set the mapper sends a configuration carrying only the vault id. } public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) throws SkyflowException { @@ -52,7 +53,8 @@ public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) throw invalid(ErrorLogs.INVALID_VALUE_IN_DEIDENTIFY_FILE, BaseErrorMessage.InvalidValueInDeidentifyFile); } } - // configurationId and configuration are both optional on the API and are passed through as given. + // configurationId and configuration are both optional on the API and are passed through as given; + // with neither set the mapper sends a configuration carrying only the vault id. validatePollOptions(request.getPollOptions()); if (request.getPollOptions() == null && !isBlank(request.getOutputDirectory())) { throw invalid(ErrorLogs.OUTPUT_DIRECTORY_WITHOUT_POLL_OPTIONS, BaseErrorMessage.OutputDirectoryWithoutPollOptions); diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java index be54cb49..d6fa068e 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java @@ -57,6 +57,25 @@ public void dataFormatIsSentLowerCase() throws Exception { Assert.assertTrue(wire(api).contains("\"dataFormat\":\"pdf\"")); } + @Test + public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("aGVsbG8=").build(), "vault-1"); + Assert.assertFalse(api.getConfigurationId().isPresent()); + Assert.assertEquals("vault-1", api.getConfiguration().get().getVaultId()); + Assert.assertFalse(api.getConfiguration().get().getDetect().isPresent()); + String json = ObjectMappers.JSON_MAPPER.writeValueAsString(api); + Assert.assertTrue(json, json.contains("\"configuration\":{\"vaultId\":\"vault-1\"}")); + } + + @Test + public void storedConfigurationIdSendsNoConfiguration() throws Exception { + DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() + .dataSource(DataSourceType.BASE64).value("aGVsbG8=").configurationId("cfg-1").build(), "vault-1"); + Assert.assertEquals("cfg-1", api.getConfigurationId().get()); + Assert.assertFalse(api.getConfiguration().isPresent()); + } + @Test public void inlineConfigurationGetsVaultId() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java index a805f103..8786e0d5 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java @@ -45,6 +45,28 @@ public void storedConfigurationSendsOnlyTextAndId() throws Exception { Assert.assertFalse(json, json.contains("\"configuration\":")); } + @Test + public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { + DeidentifyStringRequestV2 mapped = DetectRequestMapper.toDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello").build(), "vault-1"); + Assert.assertFalse(mapped.getConfigurationId().isPresent()); + DetectConfigV2 config = mapped.getConfiguration().get(); + Assert.assertEquals("vault-1", config.getVaultId()); + Assert.assertFalse(config.getDetect().isPresent()); + Assert.assertFalse(config.getName().isPresent()); + String json = ObjectMappers.JSON_MAPPER.writeValueAsString(mapped); + Assert.assertTrue(json, json.contains("\"configuration\":{\"vaultId\":\"vault-1\"}")); + } + + @Test + public void storedConfigurationIdAlongsideInlineConfigurationSendsBothAsGiven() throws Exception { + DeidentifyStringRequestV2 mapped = DetectRequestMapper.toDeidentifyStringRequest( + DeidentifyStringRequest.builder().text("hello").configurationId("cfg-1") + .configuration(DetectConfiguration.builder().build()).build(), "vault-1"); + Assert.assertEquals("cfg-1", mapped.getConfigurationId().get()); + Assert.assertEquals("vault-1", mapped.getConfiguration().get().getVaultId()); + } + @Test public void inlineConfigurationIsScopedToVaultAndFullyMapped() throws Exception { DetectConfiguration configuration = DetectConfiguration.builder() diff --git a/docs/api_reference.md b/docs/api_reference.md index 2141f893..426a1f3d 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -233,8 +233,8 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| | `text(String)` | _(required)_ | Text to de-identify. | -| `configurationId(String)` | `null` | Id of a Detect configuration created through the management API. | -| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration).| +| `configurationId(String)` | `null` | Id of a Detect configuration created through the management API. Sending it together with `configuration` is rejected by the API. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). With neither this nor `configurationId` set, the SDK sends only the vault id and the server applies the vault's defaults. | ### `DeidentifyFileRequest` @@ -247,8 +247,8 @@ Parameters listed with their defaults as defined in the builders. | `file(File)` | `null` | Local file; read and base64-encoded when sent, `dataSource` set to `BASE64`. | | `filePath(String)` | `null` | Same as `file(File)`, from a path. | | `dataFormat(FileDataFormat)` | inferred from the extension | File format. See [`FileDataFormat`](#filedataformat). | -| `configurationId(String)` | `null` | Id of a stored Detect configuration. | -| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). | +| `configurationId(String)` | `null` | Id of a stored Detect configuration. Sending it together with `configuration` is rejected by the API. | +| `configuration(DetectConfiguration)` | `null` | Inline configuration. See [`DetectConfiguration`](#detectconfiguration). With neither this nor `configurationId` set, the SDK sends only the vault id and the server applies the vault's defaults. | | `pollOptions(PollOptions)` | `null` | Poll the run after submitting. `null` submits only and returns the run id. See [`PollOptions`](#polloptions). | | `outputDirectory(String)` | working directory | Where outputs are written on success. Requires `pollOptions` and a local file; setting it without `pollOptions` fails client-side validation. | diff --git a/flowvault/README.md b/flowvault/README.md index 894a21c3..48f37775 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1647,13 +1647,13 @@ Detect configurations are created in Studio or through the management API. The S ## Before you start - **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. -- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). +- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). Both are optional: with neither set the SDK sends only the vault id and the run uses the vault's default Detect settings. Sending both is rejected by the API with HTTP 400. - **Destination for vault tokens.** An entity de-identified with `VAULT_TOKEN` stores its value in the token group named by `destination`. That token group must already exist in the vault; Detect writes into it but does not create it. - **API reference.** Every Detect request, response and configuration class is listed in the [API reference](../docs/api_reference.md#detect-api). ## Deidentify string -`DeidentifyStringRequest` takes the text plus exactly one of `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both fields are sent exactly as supplied and the server rejects a request that has neither or both (see [Before you start](#before-you-start)). For an inline configuration the SDK fills the vault id from the controller. +`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both are sent exactly as supplied. With neither set the SDK sends only the vault id and the server applies the vault's defaults; sending both is rejected by the API (see [Before you start](#before-you-start)). The SDK fills the vault id into the configuration from the controller. ```java import com.skyflow.detect.*; @@ -1762,7 +1762,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`, and exactly one of `configurationId` or an inline `configuration`; the server rejects neither-or-both (see [Before you start](#before-you-start)). +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. diff --git a/skyvault/README.md b/skyvault/README.md index 9a5db651..99260df5 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1680,13 +1680,13 @@ Detect configurations are created in Studio or through the management API. The S ## Before you start - **Role.** The service account needs the Detect Invoker, Detect Manager or Vault Owner role on the vault. Detect Invoker can de-identify data and write vault tokens into the vault; Detect Manager adds the ability to create, update and delete Detect configurations. Re-identifying values stored as `VAULT_TOKEN` is governed like detokenization: the caller also needs a policy that grants the Detokenization action on the destination table and columns, unless it is a Vault Owner. Detect Invoker or Detect Manager alone is not enough. -- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). +- **Configuration.** `configurationId` is the id of a Detect configuration created through the management API; the SDK does not create, update or delete them. The alternative is an inline `DetectConfiguration` passed as `configuration` (see [Detect configuration](#detect-configuration)). Both are optional: with neither set the SDK sends only the vault id and the run uses the vault's default Detect settings. Sending both is rejected by the API with HTTP 400. - **Destination for vault tokens.** An entity de-identified with `VAULT_TOKEN` stores its value in the `table.column` named by `destination`. That table and column must already exist in the vault; Detect writes into them but does not create them. - **API reference.** Every Detect request, response and configuration class is listed in the [API reference](../docs/api_reference.md#detect-api). ## Deidentify string -`DeidentifyStringRequest` takes the text plus exactly one of `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both fields are sent exactly as supplied. For an inline configuration the SDK fills the vault id from the controller. +`DeidentifyStringRequest` takes the text plus, optionally, `configurationId` (a stored Detect configuration) or `configuration` (an inline `DetectConfiguration`). Both are sent exactly as supplied. With neither set the SDK sends only the vault id and the server applies the vault's defaults; sending both is rejected by the API (see [Before you start](#before-you-start)). The SDK fills the vault id into the configuration from the controller. ```java import com.skyflow.detect.*; @@ -1795,7 +1795,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. Either `configurationId` or an inline `configuration` is passed through as given. +The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. From 272628257a09b0517f61f27be4fe5fa353f76b30 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 27 Oct 2026 10:01:16 +0000 Subject: [PATCH 34/41] [AUTOMATED] Private Release 1.2.0-dev-7bfc279c --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 3a276101..75b0d4d7 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.d4140366 + 1.2.0-dev.7bfc279c jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 171c79088df8aa5c2a2c360f433575d9aae440c9 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Fri, 30 Oct 2026 12:43:06 +0530 Subject: [PATCH 35/41] SK-3175 update enum name for data source type --- .../com/skyflow/detect/DataSourceType.java | 10 ---- .../skyflow/detect/DeidentifyFileRequest.java | 10 ++-- .../detect/DeidentifyFileResponse.java | 6 +-- .../skyflow/detect/DeidentifySourceType.java | 11 ++++ .../com/skyflow/detect/GetRunResponse.java | 6 +-- .../skyflow/detect/ReidentifyFileRequest.java | 10 ++-- .../detect/ReidentifyFileResponse.java | 6 +-- .../skyflow/detect/ReidentifySourceType.java | 10 ++++ .../detect/internal/DetectRequestMapper.java | 4 +- .../detect/internal/DetectResponseMapper.java | 4 +- .../detect/internal/FileOutputWriter.java | 6 +-- .../detect/internal/ReidentifyFileMapper.java | 4 +- .../internal/DeidentifyFileFlowTests.java | 16 +++--- .../internal/DeidentifyFileMapperTests.java | 14 +++--- .../DeidentifyFileValidationsTests.java | 7 +-- .../internal/DetectResponseMapperTests.java | 4 +- .../internal/FileOutputWriterTests.java | 50 +++++++++---------- .../internal/ReidentifyFileMapperTests.java | 32 +++++++++--- .../ReidentifyFileValidationsTests.java | 9 ++-- .../detect/polling/RunPollerTests.java | 4 +- .../controller/BaseDetectControllerTests.java | 4 +- docs/api_reference.md | 11 ++-- flowvault/README.md | 6 +-- .../java/com/example/detect/GetRunSample.java | 4 +- .../example/detect/ReidentifyFileSample.java | 6 +-- .../controller/DetectControllerTests.java | 27 +++++----- skyvault/README.md | 6 +-- .../java/com/example/detect/GetRunSample.java | 4 +- .../example/detect/ReidentifyFileSample.java | 6 +-- .../controller/DetectControllerTests.java | 27 +++++----- 30 files changed, 178 insertions(+), 146 deletions(-) delete mode 100644 common/src/main/java/com/skyflow/detect/DataSourceType.java create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifySourceType.java create mode 100644 common/src/main/java/com/skyflow/detect/ReidentifySourceType.java diff --git a/common/src/main/java/com/skyflow/detect/DataSourceType.java b/common/src/main/java/com/skyflow/detect/DataSourceType.java deleted file mode 100644 index d152fbb4..00000000 --- a/common/src/main/java/com/skyflow/detect/DataSourceType.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.skyflow.detect; - -/** - * How file content is supplied to, or returned by, Detect file operations. - */ -public enum DataSourceType { - BASE64, - SKYFLOW_ID, - PRESIGNED_URL; -} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java index e1d9e6fd..b9e12e06 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java @@ -16,7 +16,7 @@ * the vault's defaults. */ public final class DeidentifyFileRequest { - private final DataSourceType dataSource; + private final DeidentifySourceType dataSource; private final String value; private final File file; private final FileDataFormat dataFormat; @@ -46,7 +46,7 @@ public static DeidentifyFileRequestBuilder builder() { /** * @return How {@code value} supplies the file. Required unless {@code file} or {@code filePath} was used. */ - public DataSourceType getDataSource() { + public DeidentifySourceType getDataSource() { return dataSource; } @@ -114,7 +114,7 @@ public String toString() { } public static final class DeidentifyFileRequestBuilder { - private DataSourceType dataSource; + private DeidentifySourceType dataSource; private String value; private File file; private FileDataFormat dataFormat; @@ -130,7 +130,7 @@ private DeidentifyFileRequestBuilder() { * @param dataSource How {@code value} supplies the file. * @return this builder */ - public DeidentifyFileRequestBuilder dataSource(DataSourceType dataSource) { + public DeidentifyFileRequestBuilder dataSource(DeidentifySourceType dataSource) { this.dataSource = dataSource; return this; } @@ -151,7 +151,7 @@ public DeidentifyFileRequestBuilder value(String value) { public DeidentifyFileRequestBuilder file(File file) { this.file = file; if (file != null) { - this.dataSource = DataSourceType.BASE64; + this.dataSource = DeidentifySourceType.BASE64; } return this; } diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java index 482b3b63..35a3a0d5 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java @@ -11,12 +11,12 @@ public final class DeidentifyFileResponse { private final String runId; private final DetectRunStatus status; - private final DataSourceType outputType; + private final DeidentifySourceType outputType; private final List output; private final Metrics metrics; private final String message; - public DeidentifyFileResponse(String runId, DetectRunStatus status, DataSourceType outputType, + public DeidentifyFileResponse(String runId, DetectRunStatus status, DeidentifySourceType outputType, List output, Metrics metrics, String message) { this.runId = runId; this.status = status; @@ -44,7 +44,7 @@ public DetectRunStatus getStatus() { /** * @return How output files are delivered. Null unless polled to SUCCESS. */ - public DataSourceType getOutputType() { + public DeidentifySourceType getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java b/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java new file mode 100644 index 00000000..453a9caa --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code deidentifyFile}: base64 content, the skyflow id of a file + * record in the vault, or an S3 presigned URL. + */ +public enum DeidentifySourceType { + BASE64, + SKYFLOW_ID, + PRESIGNED_URL; +} diff --git a/common/src/main/java/com/skyflow/detect/GetRunResponse.java b/common/src/main/java/com/skyflow/detect/GetRunResponse.java index e8ffbc27..5a3dcd46 100644 --- a/common/src/main/java/com/skyflow/detect/GetRunResponse.java +++ b/common/src/main/java/com/skyflow/detect/GetRunResponse.java @@ -8,12 +8,12 @@ public final class GetRunResponse { private final String runId; private final DetectRunStatus status; - private final DataSourceType outputType; + private final DeidentifySourceType outputType; private final List output; private final Metrics metrics; private final String message; - public GetRunResponse(String runId, DetectRunStatus status, DataSourceType outputType, List output, Metrics metrics, String message) { + public GetRunResponse(String runId, DetectRunStatus status, DeidentifySourceType outputType, List output, Metrics metrics, String message) { this.runId = runId; this.status = status; this.outputType = outputType; @@ -39,7 +39,7 @@ public DetectRunStatus getStatus() { /** * @return How output files are delivered. Null while the run is pending. */ - public DataSourceType getOutputType() { + public DeidentifySourceType getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java index 9aa7135e..a0de8d17 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java @@ -3,12 +3,12 @@ import java.util.List; /** - * Request for {@code reidentifyFile}. Supply the file through exactly one {@link DataSourceType}: + * Request for {@code reidentifyFile}. Supply the file through exactly one {@link ReidentifySourceType}: * the base64-encoded content, the skyflow id of a vault record that holds the file, or an S3 * presigned URL. The vault id is filled in by the controller. */ public final class ReidentifyFileRequest { - private final DataSourceType dataSource; + private final ReidentifySourceType dataSource; private final String value; private final FileDataFormat dataFormat; private final List redactionLevel; @@ -30,7 +30,7 @@ public static ReidentifyFileRequestBuilder builder() { /** * @return How {@code value} supplies the file. Required. */ - public DataSourceType getDataSource() { + public ReidentifySourceType getDataSource() { return dataSource; } @@ -67,7 +67,7 @@ public String toString() { } public static final class ReidentifyFileRequestBuilder { - private DataSourceType dataSource; + private ReidentifySourceType dataSource; private String value; private FileDataFormat dataFormat; private List redactionLevel; @@ -79,7 +79,7 @@ private ReidentifyFileRequestBuilder() { * @param dataSource How {@code value} supplies the file. Required. * @return this builder */ - public ReidentifyFileRequestBuilder dataSource(DataSourceType dataSource) { + public ReidentifyFileRequestBuilder dataSource(ReidentifySourceType dataSource) { this.dataSource = dataSource; return this; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java index 17d32f3e..a3c445d9 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java @@ -8,11 +8,11 @@ */ public final class ReidentifyFileResponse { private final DetectRunStatus status; - private final DataSourceType outputType; + private final ReidentifySourceType outputType; private final List output; private final Metrics metrics; - public ReidentifyFileResponse(DetectRunStatus status, DataSourceType outputType, List output, Metrics metrics) { + public ReidentifyFileResponse(DetectRunStatus status, ReidentifySourceType outputType, List output, Metrics metrics) { this.status = status; this.outputType = outputType; this.output = output; @@ -29,7 +29,7 @@ public DetectRunStatus getStatus() { /** * @return How output files are delivered, or null when not reported. */ - public DataSourceType getOutputType() { + public ReidentifySourceType getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java b/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java new file mode 100644 index 00000000..2aa46812 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java @@ -0,0 +1,10 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code reidentifyFile}: base64 content or an S3 presigned URL. + * Re-identification does not accept a skyflow id as the source, so there is no {@code SKYFLOW_ID} here. + */ +public enum ReidentifySourceType { + BASE64, + PRESIGNED_URL; +} diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java index c11a9bab..ec193539 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -11,7 +11,7 @@ import com.skyflow.detect.Bleep; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CustomType; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.FileDataFormat; @@ -106,7 +106,7 @@ public static DeidentifyFileRequestV2 toDeidentifyFileRequest(DeidentifyFileRequ } } // A local file is always sent as BASE64, whatever dataSource the builder was left with. - DataSourceType dataSource = file != null ? DataSourceType.BASE64 : request.getDataSource(); + DeidentifySourceType dataSource = file != null ? DeidentifySourceType.BASE64 : request.getDataSource(); DeidentifyFileRequestV2._FinalStage builder = DeidentifyFileRequestV2.builder() .dataSource(DeidentifyFileRequestV2DataSource.valueOf(dataSource.name())) .value(value); diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java index 9994ab70..afc1302d 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.DetectRunStatus; @@ -95,7 +95,7 @@ public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 runId, response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) .orElse(DetectRunStatus.UNKNOWN), - response.getOutputType().map(t -> enumOrDefault(DataSourceType.class, t.toString(), null)).orElse(null), + response.getOutputType().map(t -> enumOrDefault(DeidentifySourceType.class, t.toString(), null)).orElse(null), Collections.unmodifiableList(outputs), response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null), response.getMessage().orElse(null)); diff --git a/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java index f82f0957..2477e7ed 100644 --- a/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java +++ b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.FileOutput; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; @@ -40,13 +40,13 @@ private FileOutputWriter() { * @return the files written, in output order; empty when the output type is not BASE64 * @throws SkyflowException if the directory cannot be created or a file cannot be decoded or written */ - public static List write(List outputs, DataSourceType outputType, String inputFileName, + public static List write(List outputs, DeidentifySourceType outputType, String inputFileName, String outputDirectory) throws SkyflowException { List written = new ArrayList<>(); if (outputs == null || outputs.isEmpty()) { return written; } - if (outputType != DataSourceType.BASE64) { + if (outputType != DeidentifySourceType.BASE64) { LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.OUTPUT_NOT_WRITTEN_FOR_OUTPUT_TYPE.getLog(), String.valueOf(outputType))); return written; diff --git a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java index 188f0013..346066b7 100644 --- a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.ReidentifyFileRequest; @@ -50,7 +50,7 @@ public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 respons return new ReidentifyFileResponse( response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) .orElse(DetectRunStatus.UNKNOWN), - response.getOutputType().map(t -> enumOrDefault(DataSourceType.class, t.toString(), null)).orElse(null), + response.getOutputType().map(t -> enumOrDefault(ReidentifySourceType.class, t.toString(), null)).orElse(null), Collections.unmodifiableList(outputs), response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null)); } diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java index a55d5078..756476b8 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DetectRunStatus; @@ -30,10 +30,10 @@ public class DeidentifyFileFlowTests { private static final RunPoller.Sleeper NO_SLEEP = millis -> { }; private static GetRunResponse success() { - return success(DataSourceType.BASE64); + return success(DeidentifySourceType.BASE64); } - private static GetRunResponse success(DataSourceType outputType) { + private static GetRunResponse success(DeidentifySourceType outputType) { return new GetRunResponse("run-1", DetectRunStatus.SUCCESS, outputType, Arrays.asList( new FileOutput(Base64.getEncoder().encodeToString("redacted".getBytes()), @@ -47,7 +47,7 @@ private static GetRunResponse success(DataSourceType outputType) { public void withoutPollOptionsReturnsRunIdAndNeverFetches() throws Exception { AtomicInteger fetches = new AtomicInteger(); DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("x").build(), "run-1", + DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("x").build(), "run-1", id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); Assert.assertEquals("run-1", response.getRunId()); Assert.assertNull(response.getStatus()); @@ -59,7 +59,7 @@ public void withoutPollOptionsReturnsRunIdAndNeverFetches() throws Exception { public void missingRunIdSkipsPollingEvenWhenRequested() throws Exception { AtomicInteger fetches = new AtomicInteger(); DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("x") + DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("x") .pollOptions(PollOptions.builder().build()).build(), null, id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); Assert.assertNull(response.getRunId()); @@ -70,7 +70,7 @@ public void missingRunIdSkipsPollingEvenWhenRequested() throws Exception { @Test public void polledRawRequestMergesRunButWritesNothing() throws Exception { DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DataSourceType.SKYFLOW_ID).value("rec") + DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec") .pollOptions(PollOptions.builder().build()).outputDirectory(folder.getRoot().getPath()).build(), "run-1", id -> success(), NO_SLEEP); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); @@ -108,10 +108,10 @@ public void polledFileRequestWritesNothingForPresignedUrlOutputs() throws Except DeidentifyFileResponse response = DeidentifyFileFlow.complete( DeidentifyFileRequest.builder().file(input).pollOptions(PollOptions.builder().build()) .outputDirectory(outDir.getPath()).build(), - "run-1", id -> success(DataSourceType.PRESIGNED_URL), NO_SLEEP); + "run-1", id -> success(DeidentifySourceType.PRESIGNED_URL), NO_SLEEP); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(DeidentifySourceType.PRESIGNED_URL, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals(0, outDir.list().length); } diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java index d6fa068e..079adca0 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.Detect; @@ -37,7 +37,7 @@ private static String wire(DeidentifyFileRequestV2 request) throws Exception { @Test public void mapsRawValueRequest() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").configurationId("cfg-1").build(), "vault-1"); + .dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec-1").configurationId("cfg-1").build(), "vault-1"); Assert.assertEquals("SKYFLOW_ID", api.getDataSource().toString()); Assert.assertEquals("rec-1", api.getValue()); Assert.assertEquals("cfg-1", api.getConfigurationId().get()); @@ -53,14 +53,14 @@ public void mapsRawValueRequest() throws Exception { @Test public void dataFormatIsSentLowerCase() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.PRESIGNED_URL).value("https://s3/in").dataFormat(FileDataFormat.PDF).build(), "v"); + .dataSource(DeidentifySourceType.PRESIGNED_URL).value("https://s3/in").dataFormat(FileDataFormat.PDF).build(), "v"); Assert.assertTrue(wire(api).contains("\"dataFormat\":\"pdf\"")); } @Test public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("aGVsbG8=").build(), "vault-1"); + .dataSource(DeidentifySourceType.BASE64).value("aGVsbG8=").build(), "vault-1"); Assert.assertFalse(api.getConfigurationId().isPresent()); Assert.assertEquals("vault-1", api.getConfiguration().get().getVaultId()); Assert.assertFalse(api.getConfiguration().get().getDetect().isPresent()); @@ -71,7 +71,7 @@ public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { @Test public void storedConfigurationIdSendsNoConfiguration() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("aGVsbG8=").configurationId("cfg-1").build(), "vault-1"); + .dataSource(DeidentifySourceType.BASE64).value("aGVsbG8=").configurationId("cfg-1").build(), "vault-1"); Assert.assertEquals("cfg-1", api.getConfigurationId().get()); Assert.assertFalse(api.getConfiguration().isPresent()); } @@ -79,7 +79,7 @@ public void storedConfigurationIdSendsNoConfiguration() throws Exception { @Test public void inlineConfigurationGetsVaultId() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v") + .dataSource(DeidentifySourceType.BASE64).value("Zm9v") .configuration(DetectConfiguration.builder().detect(Detect.builder().entities(Collections.singletonList( Entity.builder().entityType(EntityType.NAME).build())).build()).build()) .build(), "vault-9"); @@ -157,7 +157,7 @@ public void polledResponseMergesRunIdWithRun() throws Exception { DeidentifyFileResponse response = DetectResponseMapper.toDeidentifyFileResponse("run-7", run); Assert.assertEquals("run-7", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals("UERG", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals(FileDataFormat.PDF, response.getOutput().get(0).getProcessedFileExtension()); Assert.assertEquals(Integer.valueOf(2), response.getMetrics().getPages()); diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java index 9f9a3f62..b0723bbe 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java @@ -1,6 +1,7 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; + +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.PollOptions; import com.skyflow.errors.BaseErrorMessage; @@ -30,7 +31,7 @@ private static void assertRejected(DeidentifyFileRequest request, BaseErrorMessa } private static DeidentifyFileRequest.DeidentifyFileRequestBuilder raw() { - return DeidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); + return DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("Zm9v"); } @Test @@ -41,7 +42,7 @@ public void rejectsNullRequest() { @Test public void rawValueRequiresDataSourceAndValue() throws SkyflowException { assertRejected(DeidentifyFileRequest.builder().value("x").build(), BaseErrorMessage.InvalidDataSourceInDeidentifyFile); - assertRejected(DeidentifyFileRequest.builder().dataSource(DataSourceType.SKYFLOW_ID).build(), BaseErrorMessage.InvalidValueInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.SKYFLOW_ID).build(), BaseErrorMessage.InvalidValueInDeidentifyFile); assertRejected(raw().value(" ").build(), BaseErrorMessage.InvalidValueInDeidentifyFile); DetectValidations.validateDeidentifyFileRequest(raw().build()); DetectValidations.validateDeidentifyFileRequest(raw().configurationId("cfg").build()); diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java index f0ebcada..173bf0b3 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileDataFormat; @@ -102,7 +102,7 @@ public void mapsCompletedRun() throws Exception { GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-1", api); Assert.assertEquals("run-1", run.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, run.getStatus()); - Assert.assertEquals(DataSourceType.PRESIGNED_URL, run.getOutputType()); + Assert.assertEquals(DeidentifySourceType.PRESIGNED_URL, run.getOutputType()); Assert.assertEquals("https://x/y.pdf", run.getOutput().get(0).getProcessedFile()); Assert.assertEquals(FileDataFormat.PDF, run.getOutput().get(0).getProcessedFileExtension()); Assert.assertEquals(Integer.valueOf(2), run.getMetrics().getPages()); diff --git a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java index 70297c59..7bd00f7d 100644 --- a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; import com.skyflow.errors.SkyflowException; @@ -30,7 +30,7 @@ public void writesEachOutputWithV1StyleNames() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("%PDF"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput(b64("[]"), "ENTITIES", null)), - DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.assertEquals(2, written.size()); Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); @@ -45,7 +45,7 @@ public void entityOutputsCarryTheirTypeInTheName() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), new FileOutput(b64("b"), "OBJECT_ENTITIES", FileDataFormat.JSON)), - DataSourceType.BASE64, "scan.png", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "scan.png", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); Assert.assertEquals("processed-object-entities-scan.json", written.get(1).getName()); } @@ -55,7 +55,7 @@ public void jsonInputDoesNotCollideWithItsEntitiesOutput() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("{}"), "REDACTED_TEXT", FileDataFormat.JSON), new FileOutput(b64("[]"), "ENTITIES", FileDataFormat.JSON)), - DataSourceType.BASE64, "data.json", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "data.json", folder.getRoot().getPath()); Assert.assertEquals("processed-data.json", written.get(0).getName()); Assert.assertEquals("processed-entities-data.json", written.get(1).getName()); } @@ -65,7 +65,7 @@ public void nameCollisionsGetTheFileTypeInserted() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.TXT), new FileOutput(b64("b"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); Assert.assertEquals("processed-notes.redacted_text.txt", written.get(1).getName()); } @@ -75,7 +75,7 @@ public void createsMissingOutputDirectory() throws Exception { File nested = new File(folder.getRoot(), "a/b/c"); List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", nested.getPath()); + DeidentifySourceType.BASE64, "notes.txt", nested.getPath()); Assert.assertTrue(nested.isDirectory()); Assert.assertEquals(new File(nested, "processed-notes.txt"), written.get(0)); } @@ -84,24 +84,24 @@ public void createsMissingOutputDirectory() throws Exception { public void presignedUrlOutputsAreNotWritten() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput("https://s3/out", "REDACTED_FILE", FileDataFormat.PDF)), - DataSourceType.PRESIGNED_URL, "invoice.pdf", folder.getRoot().getPath()); + DeidentifySourceType.PRESIGNED_URL, "invoice.pdf", folder.getRoot().getPath()); Assert.assertTrue(written.isEmpty()); Assert.assertEquals(0, folder.getRoot().list().length); } @Test public void emptyOrNullOutputsWriteNothing() throws Exception { - Assert.assertTrue(FileOutputWriter.write(null, DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); - Assert.assertTrue(FileOutputWriter.write(Collections.emptyList(), DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(null, DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(Collections.emptyList(), DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); Assert.assertTrue(FileOutputWriter.write(Collections.singletonList(new FileOutput(null, "ENTITIES", null)), - DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); } @Test public void invalidBase64IsReportedAsWriteFailure() { try { FileOutputWriter.write(Collections.singletonList(new FileOutput("not base64!", "REDACTED_FILE", FileDataFormat.TXT)), - DataSourceType.BASE64, "x.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-x.txt")); @@ -115,7 +115,7 @@ public void nullOrEmptyTypeFallsBackToPlainName() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), null, FileDataFormat.PDF), new FileOutput(b64("b"), "", FileDataFormat.TXT)), - DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); Assert.assertEquals("processed-invoice.txt", written.get(1).getName()); } @@ -124,7 +124,7 @@ public void nullOrEmptyTypeFallsBackToPlainName() throws Exception { public void nonEntityOutputWithoutExtensionGetsBin() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TRANSCRIPTION", null)), - DataSourceType.BASE64, "call.mp3", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "call.mp3", folder.getRoot().getPath()); Assert.assertEquals("processed-call.bin", written.get(0).getName()); } @@ -132,7 +132,7 @@ public void nonEntityOutputWithoutExtensionGetsBin() throws Exception { public void entityOutputHonoursAnExplicitExtension() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-notes.txt", written.get(0).getName()); } @@ -140,7 +140,7 @@ public void entityOutputHonoursAnExplicitExtension() throws Exception { public void entityTypeMatchIsCaseInsensitive() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "entities", null)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-notes.json", written.get(0).getName()); } @@ -149,7 +149,7 @@ public void duplicateEntityOutputsGetTheTypeInsertedOnCollision() throws Excepti List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), new FileOutput(b64("b"), "ENTITIES", FileDataFormat.JSON)), - DataSourceType.BASE64, "scan.png", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "scan.png", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); Assert.assertEquals("processed-entities-scan.entities.json", written.get(1).getName()); } @@ -160,7 +160,7 @@ public void collisionWithoutATypeUsesARunningNumber() throws Exception { new FileOutput(b64("a"), null, FileDataFormat.TXT), new FileOutput(b64("b"), null, FileDataFormat.TXT), new FileOutput(b64("c"), null, FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); Assert.assertEquals("processed-notes.1.txt", written.get(1).getName()); Assert.assertEquals("processed-notes.2.txt", written.get(2).getName()); @@ -170,12 +170,12 @@ public void collisionWithoutATypeUsesARunningNumber() throws Exception { public void inputNamesWithoutAnExtensionOrWithLeadingDotAreKept() throws Exception { List plain = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", null)), - DataSourceType.BASE64, "README", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "README", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-README.json", plain.get(0).getName()); List dotted = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, ".notes", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, ".notes", folder.getRoot().getPath()); Assert.assertEquals("processed-.notes.txt", dotted.get(0).getName()); } @@ -184,7 +184,7 @@ public void missingInputNameFallsBackToOutput() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput(b64("b"), "ENTITIES", null)), - DataSourceType.BASE64, null, folder.getRoot().getPath()); + DeidentifySourceType.BASE64, null, folder.getRoot().getPath()); Assert.assertEquals("processed-output.pdf", written.get(0).getName()); Assert.assertEquals("processed-entities-output.json", written.get(1).getName()); } @@ -205,7 +205,7 @@ public void nullElementsInTheOutputListAreSkipped() throws Exception { List written = FileOutputWriter.write(Arrays.asList( null, new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals(1, written.size()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); } @@ -216,7 +216,7 @@ public void blankOutputDirectoryWritesToTheWorkingDirectory() throws Exception { try { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "writer-cwd-test.txt", " "); + DeidentifySourceType.BASE64, "writer-cwd-test.txt", " "); Assert.assertEquals(expected, written.get(0)); Assert.assertNull(written.get(0).getParentFile()); Assert.assertTrue(expected.isFile()); @@ -231,7 +231,7 @@ public void outputDirectoryThatIsAFileIsReportedAsWriteFailure() throws Exceptio try { FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", notADirectory.getPath()); + DeidentifySourceType.BASE64, "notes.txt", notADirectory.getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains(notADirectory.getPath())); @@ -244,7 +244,7 @@ public void existingFilesAreOverwritten() throws Exception { Files.write(target.toPath(), "old".getBytes()); FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("new"), "REDACTED_TEXT", FileDataFormat.TXT)), - DataSourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("new", new String(Files.readAllBytes(target.toPath()))); } @@ -254,7 +254,7 @@ public void aLaterFailureLeavesEarlierFilesOnDisk() throws Exception { FileOutputWriter.write(Arrays.asList( new FileOutput(b64("ok"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput("not base64!", "ENTITIES", null)), - DataSourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-entities-invoice.json")); diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java index ec711c12..7de03e28 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java @@ -1,6 +1,7 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; @@ -34,7 +35,7 @@ private static ReidentifyFileResponse fromJson(String json) throws Exception { @Test public void mapsRequiredFieldsAndInjectsVaultId() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("W05BTUVfMV0=").build(), "vault-1"); + .dataSource(ReidentifySourceType.BASE64).value("W05BTUVfMV0=").build(), "vault-1"); Assert.assertEquals("BASE64", api.getDataSource().toString()); Assert.assertEquals("W05BTUVfMV0=", api.getValue()); @@ -52,7 +53,7 @@ public void mapsRequiredFieldsAndInjectsVaultId() throws Exception { @Test public void mapsEveryDataSource() throws Exception { - for (DataSourceType source : DataSourceType.values()) { + for (ReidentifySourceType source : ReidentifySourceType.values()) { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() .dataSource(source).value("x").build(), "v"); Assert.assertEquals(source.name(), api.getDataSource().toString()); @@ -60,12 +61,27 @@ public void mapsEveryDataSource() throws Exception { } } + @Test + public void reidentifySourcesExcludeSkyflowIdWhileDeidentifySourcesKeepIt() { + Assert.assertEquals(Arrays.asList("BASE64", "PRESIGNED_URL"), + Arrays.asList(ReidentifySourceType.BASE64.name(), ReidentifySourceType.PRESIGNED_URL.name())); + Assert.assertEquals(2, ReidentifySourceType.values().length); + Assert.assertEquals(3, DeidentifySourceType.values().length); + Assert.assertNotNull(DeidentifySourceType.valueOf("SKYFLOW_ID")); + try { + ReidentifySourceType.valueOf("SKYFLOW_ID"); + Assert.fail("SKYFLOW_ID must not be a reidentify source"); + } catch (IllegalArgumentException expected) { + // the server rejects SKYFLOW_ID for re-identification, so the SDK does not offer it + } + } + @Test public void dataFormatIsSentAsLowerCaseWireValue() throws Exception { for (FileDataFormat format : new FileDataFormat[]{FileDataFormat.TXT, FileDataFormat.CSV, FileDataFormat.JSON, FileDataFormat.JSONL, FileDataFormat.XML, FileDataFormat.DOCX, FileDataFormat.XLSX, FileDataFormat.PPTX}) { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec").dataFormat(format).build(), "v"); + .dataSource(ReidentifySourceType.BASE64).value("eA==").dataFormat(format).build(), "v"); Assert.assertEquals(format.name().toLowerCase(), api.getDataFormat().get().toString()); Assert.assertTrue(wire(api).contains("\"dataFormat\":\"" + format.name().toLowerCase() + "\"")); } @@ -74,7 +90,7 @@ public void dataFormatIsSentAsLowerCaseWireValue() throws Exception { @Test public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.PRESIGNED_URL).value("https://s3/presigned") + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://s3/presigned") .redactionLevel(Arrays.asList( RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask-middle").build(), RedactionLevel.builder().entityName(EntityType.EMAIL_ADDRESS).redactionType(RedactionType.MASKED).build())) @@ -93,7 +109,7 @@ public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { @Test public void emptyRedactionLevelListIsSentAsEmptyArray() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); + .dataSource(ReidentifySourceType.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); Assert.assertTrue(api.getRedactionLevel().get().isEmpty()); Assert.assertTrue(wire(api).contains("\"redactionLevel\":[]")); } @@ -108,7 +124,7 @@ public void mapsFullResponse() throws Exception { + "\"metrics\":{\"size\":12.5,\"wordCount\":120,\"characterCount\":800,\"pages\":2,\"slides\":0,\"duration\":1.25}}"); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(ReidentifySourceType.PRESIGNED_URL, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); FileOutput first = response.getOutput().get(0); Assert.assertEquals("https://s3/out-1", first.getProcessedFile()); @@ -129,7 +145,7 @@ public void mapsEveryKnownStatusAndOutputType() throws Exception { for (DetectRunStatus status : DetectRunStatus.values()) { Assert.assertEquals(status, fromJson("{\"status\":\"" + status.name() + "\"}").getStatus()); } - for (DataSourceType type : DataSourceType.values()) { + for (ReidentifySourceType type : ReidentifySourceType.values()) { Assert.assertEquals(type, fromJson("{\"outputType\":\"" + type.name() + "\"}").getOutputType()); } } diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index 8b36827b..b0444bb4 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -1,6 +1,7 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DataSourceType; + +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.EntityType; import com.skyflow.detect.RedactionLevel; import com.skyflow.enums.RedactionType; @@ -17,7 +18,7 @@ public class ReidentifyFileValidationsTests { private static ReidentifyFileRequest.ReidentifyFileRequestBuilder valid() { - return ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value("Zm9v"); + return ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).value("Zm9v"); } private static void assertRejected(ReidentifyFileRequest request, BaseErrorMessage expected) { @@ -42,7 +43,7 @@ public void rejectsMissingDataSource() { @Test public void rejectsNullOrBlankValue() { - assertRejected(ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); assertRejected(valid().value("").build(), BaseErrorMessage.InvalidValueInReidentifyFile); assertRejected(valid().value(" \t").build(), BaseErrorMessage.InvalidValueInReidentifyFile); } @@ -57,7 +58,7 @@ public void checksFieldsInOrderDataSourceBeforeValue() { public void acceptsMinimalAndFullValidRequests() throws SkyflowException { ReidentifyFileValidations.validateReidentifyFileRequest(valid().build()); ReidentifyFileValidations.validateReidentifyFileRequest(valid() - .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f") + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/f") .redactionLevel(Arrays.asList( RedactionLevel.builder().tokenGroupName("g").redactionPattern("p").build(), RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.REDACTED).build(), diff --git a/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java index 1030eec6..63eeae62 100644 --- a/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java +++ b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.polling; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.GetRunResponse; import com.skyflow.detect.PollOptions; @@ -17,7 +17,7 @@ public class RunPollerTests { private static GetRunResponse run(DetectRunStatus status) { - return new GetRunResponse("run-1", status, status == DetectRunStatus.SUCCESS ? DataSourceType.BASE64 : null, + return new GetRunResponse("run-1", status, status == DetectRunStatus.SUCCESS ? DeidentifySourceType.BASE64 : null, Collections.emptyList(), null, status == DetectRunStatus.FAILED ? "boom" : null); } diff --git a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java index 4b267bb3..7724448c 100644 --- a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java +++ b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java @@ -8,7 +8,7 @@ import com.skyflow.detect.Entity; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; @@ -162,7 +162,7 @@ public void getRunQueriesRunByIdScopedToVault() throws Exception { Assert.assertEquals("run-42", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals("QUJD", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REDACTED_FILE", response.getOutput().get(0).getProcessedFileType()); diff --git a/docs/api_reference.md b/docs/api_reference.md index 426a1f3d..089eccf9 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -242,7 +242,7 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| -| `dataSource(DataSourceType)` | `null` | How `value` supplies the file. See [`DataSourceType`](#datasourcetype). | +| `dataSource(DeidentifySourceType)` | `null` | How `value` supplies the file: `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. See [Detect enums](#detect-enums). | | `value(String)` | `null` | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | | `file(File)` | `null` | Local file; read and base64-encoded when sent, `dataSource` set to `BASE64`. | | `filePath(String)` | `null` | Same as `file(File)`, from a path. | @@ -267,7 +267,7 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| -| `dataSource(DataSourceType)` | _(required)_ | `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. | +| `dataSource(ReidentifySourceType)` | _(required)_ | `BASE64` or `PRESIGNED_URL`. Re-identification does not accept a skyflow id as the source. | | `value(String)` | _(required)_ | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | | `dataFormat(FileDataFormat)` | `null` | File format. Limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` or `PPTX`. | | `redactionLevel(List)` | `null` | Redaction rules. See [`RedactionLevel`](#redactionlevel). | @@ -421,7 +421,7 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. |--------|-------------|-------------| | `getRunId()` | `String` | Run id, always present. | | `getStatus()` | `DetectRunStatus` | Run status when polled, `null` when submit only. See [`DetectRunStatus`](#detectrunstatus). | -| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`, `null` until the run completes. | +| `getOutputType()` | `DeidentifySourceType` | `BASE64` or `PRESIGNED_URL`, `null` until the run completes. | | `getOutput()` | `List` | Every output of the run, empty until complete, never `null`. See [`FileOutput`](#fileoutput). | | `getMetrics()` | `Metrics` | Size, counts, pages, slides, duration. `null` until complete. | | `getMessage()` | `String` | Failure detail when the status is `FAILED`. | @@ -433,7 +433,7 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. | Getter | Return type | Description | |--------|-------------|-------------| | `getStatus()` | `DetectRunStatus` | Status of the re-identification. | -| `getOutputType()` | `DataSourceType` | `BASE64` or `PRESIGNED_URL`. | +| `getOutputType()` | `ReidentifySourceType` | `BASE64` or `PRESIGNED_URL`. | | `getOutput()` | `List` | Re-identified file outputs, never `null`. | | `getMetrics()` | `Metrics` | Size and counts. | @@ -694,7 +694,8 @@ All in `com.skyflow.detect`. |------|--------| | `EntityType` | the 70 entity types (`NAME`, `EMAIL_ADDRESS`, `SSN`, `CREDIT_CARD`, `DOB`, ...), plus `ALL` and `NONE` | | `DeidentificationType` | `ENTITY_UNIQUE_COUNTER` _(default)_, `ENTITY_ONLY`, `VAULT_TOKEN`, `MASK`, `UNKNOWN` | -| `DataSourceType` | `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL` | +| `DeidentifySourceType` | `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL`. Input source for `deidentifyFile`, and the `getOutputType()` of `DeidentifyFileResponse` and `GetRunResponse`, where the API returns `BASE64` or `PRESIGNED_URL`. | +| `ReidentifySourceType` | `BASE64`, `PRESIGNED_URL`. Input source for `reidentifyFile` (the API does not accept a skyflow id there) and the `getOutputType()` of `ReidentifyFileResponse`. | | `FileDataFormat` | `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML`, `ZIP` | | `DetectRunStatus` | `QUEUED`, `IN_PROGRESS`, `SUCCESS`, `FAILED`, `UNKNOWN`. `SUCCESS`, `FAILED` and `UNKNOWN` end polling. | | `ReturnEntitiesType` | `EXCLUDE_SENSITIVE_DATA` _(default)_, `ALL`, `NONE` | diff --git a/flowvault/README.md b/flowvault/README.md index 48f37775..f9a438fb 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1762,7 +1762,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). +The file is supplied in one of three ways: a `DeidentifySourceType` `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. @@ -1891,14 +1891,14 @@ A `RedactionLevel` names one source and one replacement. On flowvault vaults the ## Reidentify file -`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`ReidentifySourceType.BASE64` or `PRESIGNED_URL`; re-identification does not accept a skyflow id as the source), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. ```java byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value(Base64.getEncoder().encodeToString(content)) .dataFormat(FileDataFormat.TXT) .redactionLevel(Collections.singletonList( diff --git a/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java index 9d704f25..1d521d71 100644 --- a/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java +++ b/flowvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -3,7 +3,7 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.GetRunRequest; @@ -46,7 +46,7 @@ public static void main(String[] args) throws Exception { System.out.println("Run " + run.getRunId() + " status: " + run.getStatus()); if (run.getStatus() == DetectRunStatus.SUCCESS) { for (FileOutput output : run.getOutput()) { - if (run.getOutputType() != DataSourceType.BASE64) { + if (run.getOutputType() != DeidentifySourceType.BASE64) { // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); continue; diff --git a/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java index 3e0cd0d8..020fbf52 100644 --- a/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java +++ b/flowvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -3,7 +3,7 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; @@ -45,7 +45,7 @@ public static void main(String[] args) throws Exception { try { ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value(base64) .dataFormat(FileDataFormat.TXT) // Optional: render one token group with a named redaction pattern instead of its plain value. @@ -61,7 +61,7 @@ public static void main(String[] args) throws Exception { int index = 0; for (FileOutput output : response.getOutput()) { index++; - if (response.getOutputType() != DataSourceType.BASE64) { + if (response.getOutputType() != ReidentifySourceType.BASE64) { // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); continue; diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index 0af983c8..23db46ac 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -5,7 +5,8 @@ import com.skyflow.config.VaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.ReidentifySourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentificationType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; @@ -156,7 +157,7 @@ public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowEx ReidentifyFileRequest[] bad = { null, ReidentifyFileRequest.builder().value("Zm9v").build(), - ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), + ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).value(" ").build(), }; BaseErrorMessage[] expected = { BaseErrorMessage.ReidentifyFileRequestNull, @@ -179,7 +180,7 @@ public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws S DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { controller.reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").build()); + .dataSource(ReidentifySourceType.BASE64).value("Zm9v").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -199,7 +200,7 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { + "\"metrics\":{\"size\":0.5,\"wordCount\":3,\"characterCount\":12}}")); ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value("W05BTUVfMV0=") .dataFormat(FileDataFormat.TXT) .redactionLevel(Arrays.asList( @@ -207,7 +208,7 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { .build()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(ReidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals(1, response.getOutput().size()); Assert.assertEquals("SGVsbG8=", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REIDENTIFIED_FILE", response.getOutput().get(0).getProcessedFileType()); @@ -238,7 +239,7 @@ public void reidentifyFileToleratesSparseAndUnknownResponseValues() throws Excep try { server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").build()); + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/tokenized.txt").build()); Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); Assert.assertNull(response.getOutputType()); Assert.assertTrue(response.getOutput().isEmpty()); @@ -261,7 +262,7 @@ public void reidentifyFileMapsApiErrors() throws Exception { + "\"http_status\":\"Bad Request\",\"details\":[]}}")); try { controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f").build()); + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/f").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(400, e.getHttpCode()); @@ -403,7 +404,7 @@ public void getRunRoundTripQueriesByIdScopedToVault() throws Exception { GetRunResponse done = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); Assert.assertEquals("run-42", done.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, done.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, done.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, done.getOutputType()); Assert.assertEquals("UERG", done.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REDACTED_FILE", done.getOutput().get(0).getProcessedFileType()); Assert.assertEquals(FileDataFormat.PDF, done.getOutput().get(0).getProcessedFileExtension()); @@ -506,7 +507,7 @@ public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exceptio server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) .configurationId("cfg-1").build()); Assert.assertEquals("run-42", response.getRunId()); @@ -551,7 +552,7 @@ public void deidentifyFilePollsToSuccessAndWritesOutputsForLocalFile() throws Ex Assert.assertEquals("run-7", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); Assert.assertEquals("Pay [NAME_1]", new String(Files.readAllBytes(new File(outDir, "processed-invoice.txt").toPath()), "UTF-8")); @@ -579,7 +580,7 @@ public void deidentifyFileReturnsRunIdWithStatusWhenBudgetRunsOut() throws Excep server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v") + .dataSource(DeidentifySourceType.BASE64).value("Zm9v") .pollOptions(PollOptions.builder().maxAttempts(1).build()).build()); Assert.assertEquals("run-8", response.getRunId()); @@ -600,7 +601,7 @@ public void deidentifyFileSurfacesFailedRunMessage() throws Exception { server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); + .dataSource(DeidentifySourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); Assert.assertEquals(DetectRunStatus.FAILED, response.getStatus()); Assert.assertEquals("unsupported file", response.getMessage()); @@ -619,7 +620,7 @@ public void deidentifyFileSubmitErrorMapsToSkyflowException() throws Exception { .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\",\"http_status\":\"Bad Request\",\"details\":[]}}")); try { controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").configurationId("missing").build()); + .dataSource(DeidentifySourceType.BASE64).value("Zm9v").configurationId("missing").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(400, e.getHttpCode()); diff --git a/skyvault/README.md b/skyvault/README.md index 99260df5..921094d0 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1795,7 +1795,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). +The file is supplied in one of three ways: a `DeidentifySourceType` `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. @@ -1928,14 +1928,14 @@ A `RedactionLevel` names one source and one replacement. On skyvault vaults the ## Reidentify file -`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. +`reidentifyFile` is synchronous: the re-identified file comes back in the response, not through a run id. `ReidentifyFileRequest` takes a `dataSource` (`ReidentifySourceType.BASE64` or `PRESIGNED_URL`; re-identification does not accept a skyflow id as the source), the matching `value`, an optional `dataFormat` and the same optional `RedactionLevel` rules as `reidentifyString`. `dataFormat` is limited to the formats that support `VAULT_TOKEN`: `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. ```java byte[] content = Files.readAllBytes(Paths.get("tokenized.txt")); ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value(Base64.getEncoder().encodeToString(content)) .dataFormat(FileDataFormat.TXT) .redactionLevel(Collections.singletonList( diff --git a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java index 9d704f25..1d521d71 100644 --- a/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/GetRunSample.java @@ -3,7 +3,7 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.GetRunRequest; @@ -46,7 +46,7 @@ public static void main(String[] args) throws Exception { System.out.println("Run " + run.getRunId() + " status: " + run.getStatus()); if (run.getStatus() == DetectRunStatus.SUCCESS) { for (FileOutput output : run.getOutput()) { - if (run.getOutputType() != DataSourceType.BASE64) { + if (run.getOutputType() != DeidentifySourceType.BASE64) { // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); continue; diff --git a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java index 41c9d765..787d6ef1 100644 --- a/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java +++ b/skyvault/samples/src/main/java/com/example/detect/ReidentifyFileSample.java @@ -3,7 +3,7 @@ import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; @@ -47,7 +47,7 @@ public static void main(String[] args) throws Exception { try { ReidentifyFileResponse response = skyflowClient.detect().reidentifyFile( ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value(base64) .dataFormat(FileDataFormat.TXT) // Optional: render one entity type with a redaction type instead of its plain value. @@ -63,7 +63,7 @@ public static void main(String[] args) throws Exception { int index = 0; for (FileOutput output : response.getOutput()) { index++; - if (response.getOutputType() != DataSourceType.BASE64) { + if (response.getOutputType() != ReidentifySourceType.BASE64) { // PRESIGNED_URL outputs carry a URL, not base64: download them instead of decoding. System.out.println(output.getProcessedFileType() + " available at " + output.getProcessedFile()); continue; diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index b31002ef..aaa97250 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -5,7 +5,8 @@ import com.skyflow.config.VaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DataSourceType; +import com.skyflow.detect.ReidentifySourceType; +import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentificationType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; @@ -276,7 +277,7 @@ public void getRunRoundTripQueriesByIdScopedToVault() throws Exception { GetRunResponse done = controller.getRun(GetRunRequest.builder().runId(" run-42 ").build()); Assert.assertEquals("run-42", done.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, done.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, done.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, done.getOutputType()); Assert.assertEquals("UERG", done.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REDACTED_FILE", done.getOutput().get(0).getProcessedFileType()); Assert.assertEquals(FileDataFormat.PDF, done.getOutput().get(0).getProcessedFileExtension()); @@ -365,7 +366,7 @@ public void reidentifyFileValidatesBeforeResolvingCredentials() throws SkyflowEx ReidentifyFileRequest[] bad = { null, ReidentifyFileRequest.builder().value("Zm9v").build(), - ReidentifyFileRequest.builder().dataSource(DataSourceType.BASE64).value(" ").build(), + ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).value(" ").build(), }; BaseErrorMessage[] expected = { BaseErrorMessage.ReidentifyFileRequestNull, @@ -388,7 +389,7 @@ public void reidentifyFileMissingCredentialsSurfaceWithoutNetworkCall() throws S DetectController controller = new DetectController(vaultConfig("vault-a"), emptyCredentials()); try { controller.reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").build()); + .dataSource(ReidentifySourceType.BASE64).value("Zm9v").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -408,7 +409,7 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { + "\"metrics\":{\"size\":0.5,\"wordCount\":3,\"characterCount\":12}}")); ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64) + .dataSource(ReidentifySourceType.BASE64) .value("W05BTUVfMV0=") .dataFormat(FileDataFormat.TXT) .redactionLevel(Arrays.asList( @@ -416,7 +417,7 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { .build()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(ReidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals(1, response.getOutput().size()); Assert.assertEquals("SGVsbG8=", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REIDENTIFIED_FILE", response.getOutput().get(0).getProcessedFileType()); @@ -447,7 +448,7 @@ public void reidentifyFileToleratesSparseAndUnknownResponseValues() throws Excep try { server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"SOMETHING_NEW\"}")); ReidentifyFileResponse response = controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").build()); + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/tokenized.txt").build()); Assert.assertEquals(DetectRunStatus.UNKNOWN, response.getStatus()); Assert.assertNull(response.getOutputType()); Assert.assertTrue(response.getOutput().isEmpty()); @@ -470,7 +471,7 @@ public void reidentifyFileMapsApiErrors() throws Exception { + "\"http_status\":\"Bad Request\",\"details\":[]}}")); try { controllerFor(server).reidentifyFile(ReidentifyFileRequest.builder() - .dataSource(DataSourceType.PRESIGNED_URL).value("https://example.com/f").build()); + .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/f").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(400, e.getHttpCode()); @@ -505,7 +506,7 @@ public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exceptio server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) .configurationId("cfg-1").build()); Assert.assertEquals("run-42", response.getRunId()); @@ -550,7 +551,7 @@ public void deidentifyFilePollsToSuccessAndWritesOutputsForLocalFile() throws Ex Assert.assertEquals("run-7", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DataSourceType.BASE64, response.getOutputType()); + Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals(Integer.valueOf(3), response.getMetrics().getWordCount()); Assert.assertEquals("Pay [NAME_1]", new String(Files.readAllBytes(new File(outDir, "processed-invoice.txt").toPath()), "UTF-8")); @@ -578,7 +579,7 @@ public void deidentifyFileReturnsRunIdWithStatusWhenBudgetRunsOut() throws Excep server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"IN_PROGRESS\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v") + .dataSource(DeidentifySourceType.BASE64).value("Zm9v") .pollOptions(PollOptions.builder().maxAttempts(1).build()).build()); Assert.assertEquals("run-8", response.getRunId()); @@ -599,7 +600,7 @@ public void deidentifyFileSurfacesFailedRunMessage() throws Exception { server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"status\":\"FAILED\",\"message\":\"unsupported file\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); + .dataSource(DeidentifySourceType.BASE64).value("Zm9v").pollOptions(PollOptions.builder().build()).build()); Assert.assertEquals(DetectRunStatus.FAILED, response.getStatus()); Assert.assertEquals("unsupported file", response.getMessage()); @@ -618,7 +619,7 @@ public void deidentifyFileSubmitErrorMapsToSkyflowException() throws Exception { .setBody("{\"error\":{\"grpc_code\":3,\"http_code\":400,\"message\":\"configuration not found\",\"http_status\":\"Bad Request\",\"details\":[]}}")); try { controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DataSourceType.BASE64).value("Zm9v").configurationId("missing").build()); + .dataSource(DeidentifySourceType.BASE64).value("Zm9v").configurationId("missing").build()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertEquals(400, e.getHttpCode()); From 5481413687128d052dac3b691164f6f7dc9b1259 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Fri, 30 Oct 2026 07:13:51 +0000 Subject: [PATCH 36/41] [AUTOMATED] Private Release 1.2.0-dev-171c7908 --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 75b0d4d7..463e1827 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.2.0-dev.7bfc279c + 1.2.0-dev.171c7908 jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 585337e06cef93649b7ae94881ada578d9690aac Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Fri, 30 Oct 2026 07:57:15 +0000 Subject: [PATCH 37/41] [AUTOMATED] Private Release 1.3.0-dev-74ba33fa --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 690d85b1..406de105 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.3.0 + 1.3.0-dev.74ba33fa jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 4cc5c0fd591a98fba73d0f8875f4a76a71cfe184 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 2 Nov 2026 17:39:22 +0530 Subject: [PATCH 38/41] SK-3175 update enum name for data source type --- .../skyflow/detect/DeidentifyFileRequest.java | 48 ++++++++++------- .../detect/DeidentifyFileResponse.java | 8 +-- .../skyflow/detect/DeidentifyFileSource.java | 15 ++++++ .../skyflow/detect/DeidentifySourceType.java | 11 ---- .../com/skyflow/detect/GetRunResponse.java | 8 +-- .../skyflow/detect/ReidentifyFileRequest.java | 18 +++---- .../detect/ReidentifyFileResponse.java | 8 +-- .../skyflow/detect/ReidentifyFileSource.java | 14 +++++ .../skyflow/detect/ReidentifySourceType.java | 10 ---- .../detect/internal/DeidentifyFileFlow.java | 6 ++- .../detect/internal/DetectRequestMapper.java | 21 ++++++-- .../detect/internal/DetectResponseMapper.java | 12 +++-- .../detect/internal/DetectValidations.java | 25 ++++++--- .../detect/internal/FileOutputWriter.java | 6 +-- .../detect/internal/ReidentifyFileMapper.java | 12 +++-- .../com/skyflow/errors/BaseErrorMessage.java | 11 ++-- .../main/java/com/skyflow/logs/ErrorLogs.java | 11 ++-- .../controller/BaseDetectController.java | 37 +++++++++++-- .../skyflow/detect/TestDeidentifySource.java | 16 ++++++ .../skyflow/detect/TestReidentifySource.java | 15 ++++++ .../internal/DeidentifyFileFlowTests.java | 16 +++--- .../internal/DeidentifyFileMapperTests.java | 16 +++--- .../DeidentifyFileValidationsTests.java | 25 +++++++-- .../internal/DetectResponseMapperTests.java | 12 ++--- .../internal/FileOutputWriterTests.java | 50 +++++++++--------- .../internal/ReidentifyFileMapperTests.java | 34 +++++------- .../ReidentifyFileValidationsTests.java | 8 +-- .../detect/polling/RunPollerTests.java | 4 +- .../controller/BaseDetectControllerTests.java | 17 +++++- docs/api_reference.md | 6 +-- flowvault/README.md | 4 +- .../skyflow-flowvault-java.baseline.jar | Bin 964784 -> 969037 bytes .../skyflow/detect/DeidentifySourceType.java | 11 ++++ .../skyflow/detect/ReidentifySourceType.java | 11 ++++ .../vault/controller/DetectController.java | 14 +++++ .../detect/DetectSourceTypesTests.java | 39 ++++++++++++++ .../controller/DetectControllerTests.java | 8 +-- skyvault/README.md | 4 +- skyvault/api-report/skyflow-java.baseline.jar | Bin 1630691 -> 1245291 bytes .../skyflow/detect/DeidentifySourceType.java | 11 ++++ .../skyflow/detect/ReidentifySourceType.java | 11 ++++ .../vault/controller/DetectController.java | 14 +++++ .../detect/DetectSourceTypesTests.java | 39 ++++++++++++++ .../controller/DetectControllerTests.java | 2 +- 44 files changed, 479 insertions(+), 189 deletions(-) create mode 100644 common/src/main/java/com/skyflow/detect/DeidentifyFileSource.java delete mode 100644 common/src/main/java/com/skyflow/detect/DeidentifySourceType.java create mode 100644 common/src/main/java/com/skyflow/detect/ReidentifyFileSource.java delete mode 100644 common/src/main/java/com/skyflow/detect/ReidentifySourceType.java create mode 100644 common/src/test/java/com/skyflow/detect/TestDeidentifySource.java create mode 100644 common/src/test/java/com/skyflow/detect/TestReidentifySource.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java create mode 100644 flowvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java create mode 100644 skyvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java create mode 100644 skyvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java create mode 100644 skyvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java index b9e12e06..94393e4a 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java @@ -3,10 +3,10 @@ import java.io.File; /** - * Request for {@code deidentifyFile}. Supply the file through exactly one of {@code value} (with a - * {@code dataSource}), {@code file} or {@code filePath}. The two file forms are builder sugar that set - * {@code dataSource = BASE64}, encode the content into {@code value} when the request is sent, and infer - * {@code dataFormat} from the extension unless it is set explicitly. + * Request for {@code deidentifyFile}. Supply the file through exactly one of {@code filePath}, {@code file} + * or {@code value} (with a {@code dataSource}); more than one, or none, is rejected before any call. A local + * file given as {@code file} or {@code filePath} is read when the request is sent, sent as {@code BASE64}, and + * its {@code dataFormat} is inferred from the extension unless set explicitly. * *

  • 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%0DJ@a(_V)xu0)p=DxQ=J7}m+LW}tD`-L& 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

  • Without {@code pollOptions} the call submits the run and returns its id. With {@code pollOptions} the * SDK polls the run and, on success for a file-based request, writes the outputs to disk. @@ -16,9 +16,10 @@ * the vault's defaults. */ public final class DeidentifyFileRequest { - private final DeidentifySourceType dataSource; + private final DeidentifyFileSource dataSource; private final String value; private final File file; + private final String filePath; private final FileDataFormat dataFormat; private final String configurationId; private final DetectConfiguration configuration; @@ -29,6 +30,7 @@ private DeidentifyFileRequest(DeidentifyFileRequestBuilder builder) { this.dataSource = builder.dataSource; this.value = builder.value; this.file = builder.file; + this.filePath = builder.filePath; this.dataFormat = builder.dataFormat; this.configurationId = builder.configurationId; this.configuration = builder.configuration; @@ -44,26 +46,33 @@ public static DeidentifyFileRequestBuilder builder() { } /** - * @return How {@code value} supplies the file. Required unless {@code file} or {@code filePath} was used. + * @return How {@code value} supplies the file: this SDK's {@code DeidentifySourceType}. Required with {@code value}. */ - public DeidentifySourceType getDataSource() { + public DeidentifyFileSource getDataSource() { return dataSource; } /** - * @return Base64 content, skyflow id or presigned URL, according to {@code dataSource}. + * @return The file as {@code dataSource} describes it: base64 content, a presigned URL or, on skyvault, a skyflow id. */ public String getValue() { return value; } /** - * @return Local file to de-identify, when {@code file} or {@code filePath} was used. + * @return Local file to de-identify, when {@code file} was used. */ public File getFile() { return file; } + /** + * @return Path of the local file to de-identify, when {@code filePath} was used. + */ + public String getFilePath() { + return filePath; + } + /** * @return Format of the file. Optional; inferred from the file extension or by the server when omitted. */ @@ -105,6 +114,7 @@ public String toString() { "dataSource=" + dataSource + ", value=" + (value == null ? null : "<" + value.length() + " chars>") + ", file=" + file + + ", filePath=" + filePath + ", dataFormat=" + dataFormat + ", configurationId=" + configurationId + ", configuration=" + configuration + @@ -114,9 +124,10 @@ public String toString() { } public static final class DeidentifyFileRequestBuilder { - private DeidentifySourceType dataSource; + private DeidentifyFileSource dataSource; private String value; private File file; + private String filePath; private FileDataFormat dataFormat; private String configurationId; private DetectConfiguration configuration; @@ -127,16 +138,17 @@ private DeidentifyFileRequestBuilder() { } /** - * @param dataSource How {@code value} supplies the file. + * @param dataSource How {@code value} supplies the file: this SDK's {@code DeidentifySourceType} + * (skyvault: BASE64, SKYFLOW_ID, PRESIGNED_URL; flowvault: BASE64, PRESIGNED_URL). * @return this builder */ - public DeidentifyFileRequestBuilder dataSource(DeidentifySourceType dataSource) { + public DeidentifyFileRequestBuilder dataSource(DeidentifyFileSource dataSource) { this.dataSource = dataSource; return this; } /** - * @param value Base64 content, skyflow id or presigned URL, according to {@code dataSource}. + * @param value The file as {@code dataSource} describes it: base64 content, a presigned URL or, on skyvault, a skyflow id. * @return this builder */ public DeidentifyFileRequestBuilder value(String value) { @@ -145,23 +157,21 @@ public DeidentifyFileRequestBuilder value(String value) { } /** - * @param file Local file to de-identify. Sets {@code dataSource} to BASE64; the content is encoded when sent. + * @param file Local file to de-identify. Sent as BASE64; the content is encoded when sent. * @return this builder */ public DeidentifyFileRequestBuilder file(File file) { this.file = file; - if (file != null) { - this.dataSource = DeidentifySourceType.BASE64; - } return this; } /** - * @param filePath Path of a local file to de-identify. Same as {@link #file(File)}. + * @param filePath Path of a local file to de-identify. Sent as BASE64; the content is encoded when sent. * @return this builder */ public DeidentifyFileRequestBuilder filePath(String filePath) { - return file(filePath == null ? null : new File(filePath)); + this.filePath = filePath; + return this; } /** diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java index 35a3a0d5..730177cc 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileResponse.java @@ -11,12 +11,12 @@ public final class DeidentifyFileResponse { private final String runId; private final DetectRunStatus status; - private final DeidentifySourceType outputType; + private final DeidentifyFileSource outputType; private final List output; private final Metrics metrics; private final String message; - public DeidentifyFileResponse(String runId, DetectRunStatus status, DeidentifySourceType outputType, + public DeidentifyFileResponse(String runId, DetectRunStatus status, DeidentifyFileSource outputType, List output, Metrics metrics, String message) { this.runId = runId; this.status = status; @@ -42,9 +42,9 @@ public DetectRunStatus getStatus() { } /** - * @return How output files are delivered. Null unless polled to SUCCESS. + * @return How output files are delivered. Null unless polled to SUCCESS. A constant of this SDK's {@code DeidentifySourceType}: {@code BASE64} or {@code PRESIGNED_URL}. */ - public DeidentifySourceType getOutputType() { + public DeidentifyFileSource getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileSource.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileSource.java new file mode 100644 index 00000000..f60439ac --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileSource.java @@ -0,0 +1,15 @@ +package com.skyflow.detect; + +/** + * How the file of {@code deidentifyFile} is supplied, and how a run reports its outputs. Each SDK ships its own + * {@code com.skyflow.detect.DeidentifySourceType} enum implementing this interface with the sources its vault + * type accepts: skyvault {@code BASE64}, {@code SKYFLOW_ID}, {@code PRESIGNED_URL}; flowvault {@code BASE64}, + * {@code PRESIGNED_URL}. {@code getOutputType()} on {@code DeidentifyFileResponse} and {@code GetRunResponse} + * returns a constant of that same enum. The constant name is the wire value. + */ +public interface DeidentifyFileSource { + /** + * @return the wire value, which is the constant name + */ + String name(); +} diff --git a/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java b/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java deleted file mode 100644 index 453a9caa..00000000 --- a/common/src/main/java/com/skyflow/detect/DeidentifySourceType.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.skyflow.detect; - -/** - * How the input file is supplied to {@code deidentifyFile}: base64 content, the skyflow id of a file - * record in the vault, or an S3 presigned URL. - */ -public enum DeidentifySourceType { - BASE64, - SKYFLOW_ID, - PRESIGNED_URL; -} diff --git a/common/src/main/java/com/skyflow/detect/GetRunResponse.java b/common/src/main/java/com/skyflow/detect/GetRunResponse.java index 5a3dcd46..c892355e 100644 --- a/common/src/main/java/com/skyflow/detect/GetRunResponse.java +++ b/common/src/main/java/com/skyflow/detect/GetRunResponse.java @@ -8,12 +8,12 @@ public final class GetRunResponse { private final String runId; private final DetectRunStatus status; - private final DeidentifySourceType outputType; + private final DeidentifyFileSource outputType; private final List output; private final Metrics metrics; private final String message; - public GetRunResponse(String runId, DetectRunStatus status, DeidentifySourceType outputType, List output, Metrics metrics, String message) { + public GetRunResponse(String runId, DetectRunStatus status, DeidentifyFileSource outputType, List output, Metrics metrics, String message) { this.runId = runId; this.status = status; this.outputType = outputType; @@ -37,9 +37,9 @@ public DetectRunStatus getStatus() { } /** - * @return How output files are delivered. Null while the run is pending. + * @return How output files are delivered. Null while the run is pending. A constant of this SDK's {@code DeidentifySourceType}: {@code BASE64} or {@code PRESIGNED_URL}. */ - public DeidentifySourceType getOutputType() { + public DeidentifyFileSource getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java index a0de8d17..ec83adba 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java @@ -3,12 +3,12 @@ import java.util.List; /** - * Request for {@code reidentifyFile}. Supply the file through exactly one {@link ReidentifySourceType}: - * the base64-encoded content, the skyflow id of a vault record that holds the file, or an S3 - * presigned URL. The vault id is filled in by the controller. + * Request for {@code reidentifyFile}. Supply the file through this SDK's {@code ReidentifySourceType} + * ({@code BASE64} or {@code PRESIGNED_URL}; re-identification does not accept a skyflow id) and the matching + * {@code value}. */ public final class ReidentifyFileRequest { - private final ReidentifySourceType dataSource; + private final ReidentifyFileSource dataSource; private final String value; private final FileDataFormat dataFormat; private final List redactionLevel; @@ -30,12 +30,12 @@ public static ReidentifyFileRequestBuilder builder() { /** * @return How {@code value} supplies the file. Required. */ - public ReidentifySourceType getDataSource() { + public ReidentifyFileSource getDataSource() { return dataSource; } /** - * @return Base64 content, skyflow id or presigned URL of the file, according to {@code dataSource}. Required. + * @return Base64 content or presigned URL of the file, according to {@code dataSource}. Required. */ public String getValue() { return value; @@ -67,7 +67,7 @@ public String toString() { } public static final class ReidentifyFileRequestBuilder { - private ReidentifySourceType dataSource; + private ReidentifyFileSource dataSource; private String value; private FileDataFormat dataFormat; private List redactionLevel; @@ -79,13 +79,13 @@ private ReidentifyFileRequestBuilder() { * @param dataSource How {@code value} supplies the file. Required. * @return this builder */ - public ReidentifyFileRequestBuilder dataSource(ReidentifySourceType dataSource) { + public ReidentifyFileRequestBuilder dataSource(ReidentifyFileSource dataSource) { this.dataSource = dataSource; return this; } /** - * @param value Base64 content, skyflow id or presigned URL of the file, according to {@code dataSource}. Required. + * @param value Base64 content or presigned URL of the file, according to {@code dataSource}. Required. * @return this builder */ public ReidentifyFileRequestBuilder value(String value) { diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java index a3c445d9..50938fbb 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileResponse.java @@ -8,11 +8,11 @@ */ public final class ReidentifyFileResponse { private final DetectRunStatus status; - private final ReidentifySourceType outputType; + private final ReidentifyFileSource outputType; private final List output; private final Metrics metrics; - public ReidentifyFileResponse(DetectRunStatus status, ReidentifySourceType outputType, List output, Metrics metrics) { + public ReidentifyFileResponse(DetectRunStatus status, ReidentifyFileSource outputType, List output, Metrics metrics) { this.status = status; this.outputType = outputType; this.output = output; @@ -27,9 +27,9 @@ public DetectRunStatus getStatus() { } /** - * @return How output files are delivered, or null when not reported. + * @return How output files are delivered, or null when not reported. A constant of this SDK's {@code ReidentifySourceType}: {@code BASE64} or {@code PRESIGNED_URL}. */ - public ReidentifySourceType getOutputType() { + public ReidentifyFileSource getOutputType() { return outputType; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileSource.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileSource.java new file mode 100644 index 00000000..d0f54ab3 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileSource.java @@ -0,0 +1,14 @@ +package com.skyflow.detect; + +/** + * How the file of {@code reidentifyFile} is supplied, and how its response reports the output. Each SDK ships + * its own {@code com.skyflow.detect.ReidentifySourceType} enum implementing this interface, with {@code BASE64} + * and {@code PRESIGNED_URL} in both SDKs. {@code getOutputType()} on {@code ReidentifyFileResponse} returns a + * constant of that same enum. The constant name is the wire value. + */ +public interface ReidentifyFileSource { + /** + * @return the wire value, which is the constant name + */ + String name(); +} diff --git a/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java b/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java deleted file mode 100644 index 2aa46812..00000000 --- a/common/src/main/java/com/skyflow/detect/ReidentifySourceType.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.skyflow.detect; - -/** - * How the input file is supplied to {@code reidentifyFile}: base64 content or an S3 presigned URL. - * Re-identification does not accept a skyflow id as the source, so there is no {@code SKYFLOW_ID} here. - */ -public enum ReidentifySourceType { - BASE64, - PRESIGNED_URL; -} diff --git a/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java b/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java index 4d825983..da64c9b2 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java +++ b/common/src/main/java/com/skyflow/detect/internal/DeidentifyFileFlow.java @@ -1,5 +1,6 @@ package com.skyflow.detect.internal; +import java.io.File; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DetectRunStatus; @@ -32,8 +33,9 @@ static DeidentifyFileResponse complete(DeidentifyFileRequest request, String run } GetRunResponse run = RunPoller.poll(runId, request.getPollOptions(), fetcher, sleeper); DeidentifyFileResponse response = DetectResponseMapper.toDeidentifyFileResponse(runId, run); - if (response.getStatus() == DetectRunStatus.SUCCESS && request.getFile() != null) { - FileOutputWriter.write(response.getOutput(), response.getOutputType(), request.getFile().getName(), + File localFile = DetectRequestMapper.localFile(request); + if (response.getStatus() == DetectRunStatus.SUCCESS && localFile != null) { + FileOutputWriter.write(response.getOutput(), response.getOutputType(), localFile.getName(), request.getOutputDirectory()); } return response; diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java index ec193539..1039c791 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -11,7 +11,6 @@ import com.skyflow.detect.Bleep; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CustomType; -import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.FileDataFormat; @@ -94,11 +93,23 @@ static boolean sendsConfiguration(String configurationId, DetectConfiguration co * Builds the submit request. For file-based requests this reads and base64-encodes the file and infers * the format from its extension when none was given. */ + /** + * The local file a deidentifyFile request points at, from {@code file} or {@code filePath}, or null for a + * {@code value}-based request. + */ + public static File localFile(DeidentifyFileRequest request) { + if (request.getFile() != null) { + return request.getFile(); + } + String path = request.getFilePath(); + return path == null || path.trim().isEmpty() ? null : new File(path); + } + public static DeidentifyFileRequestV2 toDeidentifyFileRequest(DeidentifyFileRequest request, String vaultId) throws SkyflowException { String value = request.getValue(); FileDataFormat format = request.getDataFormat(); - File file = request.getFile(); + File file = localFile(request); if (file != null) { value = encodeFile(file); if (format == null) { @@ -106,9 +117,11 @@ public static DeidentifyFileRequestV2 toDeidentifyFileRequest(DeidentifyFileRequ } } // A local file is always sent as BASE64, whatever dataSource the builder was left with. - DeidentifySourceType dataSource = file != null ? DeidentifySourceType.BASE64 : request.getDataSource(); + DeidentifyFileRequestV2DataSource dataSource = file != null + ? DeidentifyFileRequestV2DataSource.BASE64 + : DeidentifyFileRequestV2DataSource.valueOf(request.getDataSource().name()); DeidentifyFileRequestV2._FinalStage builder = DeidentifyFileRequestV2.builder() - .dataSource(DeidentifyFileRequestV2DataSource.valueOf(dataSource.name())) + .dataSource(dataSource) .value(value); if (format != null) { // The wire value for a file format is the lower-case extension. diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java index afc1302d..44a9dba6 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectResponseMapper.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.DeidentifyFileSource; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.DetectRunStatus; @@ -23,6 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Function; import java.util.Map; /** @@ -81,7 +82,12 @@ public static CheckGuardrailsResponse toCheckGuardrailsResponse(DetectGuardrails response.getDeniedTopic().orElse(null)); } - public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 response) { + /** + * @param sourceResolver maps the wire outputType onto this SDK's {@code DeidentifySourceType}; returns null for an + * unknown value + */ + public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 response, + Function sourceResolver) { List outputs = new ArrayList<>(); List apiOutputs = response.getOutput().orElse(null); if (apiOutputs != null) { @@ -95,7 +101,7 @@ public static GetRunResponse toGetRunResponse(String runId, DetectRunsResponseV2 runId, response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) .orElse(DetectRunStatus.UNKNOWN), - response.getOutputType().map(t -> enumOrDefault(DeidentifySourceType.class, t.toString(), null)).orElse(null), + response.getOutputType().map(t -> sourceResolver.apply(t.toString())).orElse(null), Collections.unmodifiableList(outputs), response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null), response.getMessage().orElse(null)); diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java index e7b19364..db3345fb 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectValidations.java @@ -13,6 +13,8 @@ import com.skyflow.utils.BaseUtils; import com.skyflow.utils.logger.LogUtil; +import java.io.File; + /** * Client-side validation for Detect V2 requests. Internal to the SDK. @@ -38,20 +40,27 @@ public static void validateDeidentifyFileRequest(DeidentifyFileRequest request) if (request == null) { throw invalid(ErrorLogs.DEIDENTIFY_FILE_REQUEST_NULL, BaseErrorMessage.DeidentifyFileRequestNull); } - if (request.getFile() != null) { - if (!isBlank(request.getValue())) { - throw invalid(ErrorLogs.MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE, BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); - } - if (!request.getFile().isFile()) { - throw invalid(ErrorLogs.FILE_NOT_FOUND_IN_DEIDENTIFY_FILE, BaseErrorMessage.FileNotFoundToDeidentify); - } - } else { + // The file comes from exactly one of filePath, file or value; dataSource belongs to value only. + int sources = (request.getFilePath() != null ? 1 : 0) + (request.getFile() != null ? 1 : 0) + + (request.getValue() != null ? 1 : 0); + if (sources == 0) { + throw invalid(ErrorLogs.MISSING_FILE_SOURCE_IN_DEIDENTIFY_FILE, BaseErrorMessage.MissingFileSourceInDeidentifyFile); + } + if (sources > 1) { + throw invalid(ErrorLogs.MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE, BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + } + if (request.getValue() != null) { if (request.getDataSource() == null) { throw invalid(ErrorLogs.INVALID_DATA_SOURCE_IN_DEIDENTIFY_FILE, BaseErrorMessage.InvalidDataSourceInDeidentifyFile); } if (isBlank(request.getValue())) { throw invalid(ErrorLogs.INVALID_VALUE_IN_DEIDENTIFY_FILE, BaseErrorMessage.InvalidValueInDeidentifyFile); } + } else { + File file = DetectRequestMapper.localFile(request); + if (file == null || !file.isFile()) { + throw invalid(ErrorLogs.FILE_NOT_FOUND_IN_DEIDENTIFY_FILE, BaseErrorMessage.FileNotFoundToDeidentify); + } } // configurationId and configuration are both optional on the API and are passed through as given; // with neither set the mapper sends a configuration carrying only the vault id. diff --git a/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java index 2477e7ed..73261728 100644 --- a/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java +++ b/common/src/main/java/com/skyflow/detect/internal/FileOutputWriter.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.DeidentifyFileSource; import com.skyflow.detect.FileOutput; import com.skyflow.errors.BaseErrorMessage; import com.skyflow.errors.SkyflowException; @@ -40,13 +40,13 @@ private FileOutputWriter() { * @return the files written, in output order; empty when the output type is not BASE64 * @throws SkyflowException if the directory cannot be created or a file cannot be decoded or written */ - public static List write(List outputs, DeidentifySourceType outputType, String inputFileName, + public static List write(List outputs, DeidentifyFileSource outputType, String inputFileName, String outputDirectory) throws SkyflowException { List written = new ArrayList<>(); if (outputs == null || outputs.isEmpty()) { return written; } - if (outputType != DeidentifySourceType.BASE64) { + if (outputType == null || !"BASE64".equals(outputType.name())) { LogUtil.printInfoLog(BaseUtils.parameterizedString(InfoLogs.OUTPUT_NOT_WRITTEN_FOR_OUTPUT_TYPE.getLog(), String.valueOf(outputType))); return written; diff --git a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java index 346066b7..73448a3a 100644 --- a/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/ReidentifyFileMapper.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.ReidentifySourceType; +import com.skyflow.detect.ReidentifyFileSource; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileOutput; import com.skyflow.detect.ReidentifyFileRequest; @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.function.Function; /** * Converts the flowvault {@code reidentifyFile} models to and from the generated V2 API types. @@ -37,7 +38,12 @@ public static ReidentifyFileRequestV2 toApiRequest(ReidentifyFileRequest request return builder.build(); } - public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 response) { + /** + * @param sourceResolver maps the wire outputType onto this SDK's {@code ReidentifySourceType}; returns null for an + * unknown value + */ + public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 response, + Function sourceResolver) { List outputs = new ArrayList<>(); List apiOutputs = response.getOutput().orElse(null); if (apiOutputs != null) { @@ -50,7 +56,7 @@ public static ReidentifyFileResponse toResponse(ReidentifyFileResponseV2 respons return new ReidentifyFileResponse( response.getStatus().map(s -> enumOrDefault(DetectRunStatus.class, s.toString(), DetectRunStatus.UNKNOWN)) .orElse(DetectRunStatus.UNKNOWN), - response.getOutputType().map(t -> enumOrDefault(ReidentifySourceType.class, t.toString(), null)).orElse(null), + response.getOutputType().map(t -> sourceResolver.apply(t.toString())).orElse(null), Collections.unmodifiableList(outputs), response.getMetrics().map(DetectResponseMapper::toMetrics).orElse(null)); } diff --git a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java index ff51fb89..b3eb34c7 100644 --- a/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java +++ b/common/src/main/java/com/skyflow/errors/BaseErrorMessage.java @@ -184,17 +184,18 @@ public enum BaseErrorMessage { ReidentifyStringRequestNull("%s0 Validation error. ReidentifyString request cannot be null."), InvalidTextInReidentifyString("%s0 Validation error. Invalid text in reidentify string request. Specify a non-empty text."), DeidentifyFileRequestNull("%s0 Validation error. DeidentifyFile request cannot be null."), - InvalidDataSourceInDeidentifyFile("%s0 Validation error. Invalid dataSource in deidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL, or supply a file."), - InvalidValueInDeidentifyFile("%s0 Validation error. Invalid value in deidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file, or supply a file."), - MultipleFileSourcesInDeidentifyFile("%s0 Validation error. Specify either value or file in deidentify file request, not both."), + InvalidDataSourceInDeidentifyFile("%s0 Validation error. Invalid dataSource in deidentify file request. Specify a DeidentifySourceType."), + InvalidValueInDeidentifyFile("%s0 Validation error. Invalid value in deidentify file request. Specify the non-empty content or reference that dataSource describes."), + MultipleFileSourcesInDeidentifyFile("%s0 Validation error. Specify only one of filePath, file or value in deidentify file request."), + MissingFileSourceInDeidentifyFile("%s0 Validation error. Specify one of filePath, file or value in deidentify file request."), InvalidWaitTimeInPollOptions("%s0 Validation error. waitTime in pollOptions must be between 1 and 300 seconds."), InvalidMaxAttemptsInPollOptions("%s0 Validation error. maxAttempts in pollOptions must be between 1 and 23."), OutputDirectoryWithoutPollOptions("%s0 Validation error. outputDirectory in deidentify file request requires pollOptions."), FailedToWriteOutputFile("%s0 Failed to write the processed output to %s1."), GetRunRequestNull("%s0 Validation error. GetRun request cannot be null."), ReidentifyFileRequestNull("%s0 Validation error. ReidentifyFile request cannot be null."), - InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), - InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content, skyflow id or presigned URL of the file."), + InvalidDataSourceInReidentifyFile("%s0 Validation error. Invalid dataSource in reidentify file request. Specify a ReidentifySourceType."), + InvalidValueInReidentifyFile("%s0 Validation error. Invalid value in reidentify file request. Specify the non-empty base64 content or presigned URL of the file."), InvalidRunIdInGetRun("%s0 Validation error. Invalid runId in get run request. Specify a non-empty run id."), CheckGuardrailsRequestNull("%s0 Validation error. CheckGuardrails request cannot be null."), InvalidTextInCheckGuardrails("%s0 Validation error. Invalid text in check guardrails request. Specify a non-empty text."), diff --git a/common/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java index 154c26e8..5d5ce098 100644 --- a/common/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -14,9 +14,10 @@ public enum ErrorLogs { INVALID_TEXT_IN_REIDENTIFY_STRING("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), REIDENTIFY_STRING_REQUEST_REJECTED("ReIdentify string request resulted in failure."), DEIDENTIFY_FILE_REQUEST_NULL("Invalid %s1 request. DeidentifyFile request can not be null."), - INVALID_DATA_SOURCE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required unless a file is supplied."), - INVALID_VALUE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The value field is required and must be a non-empty string unless a file is supplied."), - MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE("Invalid %s1 request. Specify either value or file, not both."), + INVALID_DATA_SOURCE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required with value. Specify a DeidentifySourceType."), + INVALID_VALUE_IN_DEIDENTIFY_FILE("Invalid %s1 request. The value field must be a non-empty string."), + MULTIPLE_FILE_SOURCES_IN_DEIDENTIFY_FILE("Invalid %s1 request. Specify only one of filePath, file or value."), + MISSING_FILE_SOURCE_IN_DEIDENTIFY_FILE("Invalid %s1 request. Specify one of filePath, file or value."), FILE_NOT_FOUND_IN_DEIDENTIFY_FILE("Invalid %s1 request. The file to deidentify was not found."), FAILED_TO_ENCODE_FILE_IN_DEIDENTIFY_FILE("Invalid %s1 request. Failed to read and encode the file to deidentify."), INVALID_WAIT_TIME_IN_POLL_OPTIONS("Invalid %s1 request. waitTime in pollOptions must be between 1 and 300."), @@ -26,8 +27,8 @@ public enum ErrorLogs { OUTPUT_DIRECTORY_NOT_CREATED("Could not create output directory %s1."), OUTPUT_FILE_NOT_WRITTEN("Could not write processed output to %s1."), REIDENTIFY_FILE_REQUEST_NULL("Invalid %s1 request. ReidentifyFile request can not be null."), - INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required. Specify BASE64, SKYFLOW_ID or PRESIGNED_URL."), - INVALID_VALUE_IN_REIDENTIFY_FILE("Invalid %s1 request. The value field is required and must be a non-empty string. Specify the base64 content, skyflow id or presigned URL of the file."), + INVALID_DATA_SOURCE_IN_REIDENTIFY_FILE("Invalid %s1 request. The dataSource field is required. Specify a ReidentifySourceType."), + INVALID_VALUE_IN_REIDENTIFY_FILE("Invalid %s1 request. The value field is required and must be a non-empty string. Specify the base64 content or presigned URL of the file."), REIDENTIFY_FILE_REQUEST_REJECTED("ReIdentify file request resulted in failure."), // Client initialization VAULT_CONFIG_EXISTS("Vault config with vault ID %s1 already exists."), diff --git a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java index dc605441..aacb2c53 100644 --- a/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java +++ b/common/src/main/java/com/skyflow/vault/controller/BaseDetectController.java @@ -6,6 +6,8 @@ import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; import com.skyflow.detect.DeidentifyFileRequest; +import com.skyflow.detect.ReidentifyFileSource; +import com.skyflow.detect.DeidentifyFileSource; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.DeidentifyStringResponse; @@ -89,6 +91,35 @@ protected BaseDetectController(V vaultConfig, BaseCredentials credentials) { */ protected abstract String resolveVaultUrl() throws SkyflowException; + /** + * Maps a run's wire {@code outputType} onto this SDK's {@code DeidentifySourceType}, so that + * {@code getOutputType()} returns the same enum the caller used on the request. + * + * @param wireValue the API value, for example {@code BASE64} + * @return the matching constant, or null for a value this SDK does not know + */ + protected abstract DeidentifyFileSource toDeidentifySource(String wireValue); + + /** + * Maps a re-identify response's wire {@code outputType} onto this SDK's {@code ReidentifySourceType}. + * + * @param wireValue the API value, for example {@code BASE64} + * @return the matching constant, or null for a value this SDK does not know + */ + protected abstract ReidentifyFileSource toReidentifySource(String wireValue); + + /** {@link Enum#valueOf} that returns null instead of throwing for an unknown wire value. */ + protected static > E enumOrNull(Class type, String wireValue) { + if (wireValue == null) { + return null; + } + try { + return Enum.valueOf(type, wireValue); + } catch (IllegalArgumentException unknown) { + return null; + } + } + /** * @return JSON sent in the {@code sky-metadata} header. Override to report SDK name and version. */ @@ -271,7 +302,7 @@ public DeidentifyFileResponse deidentifyFile(DeidentifyFileRequest request) thro * Replaces tokens in a file with their original values or a redacted rendering. Synchronous: * the re-identified file is returned in the response rather than through a run id. * - * @param request the file (base64, skyflow id or presigned URL) plus optional per-group redaction rules + * @param request the file (base64 or presigned URL) plus optional per-group redaction rules * @return status, output files and metrics * @throws SkyflowException on validation failure, credential failure or an API error */ @@ -284,7 +315,7 @@ public ReidentifyFileResponse reidentifyFile(ReidentifyFileRequest request) thro try { ReidentifyFileResponseV2 apiResponse = filesClient().reidentifyFileV2(apiRequest, requestOptions(token)); LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_REQUEST_RESOLVED.getLog()); - ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse); + ReidentifyFileResponse response = ReidentifyFileMapper.toResponse(apiResponse, this::toReidentifySource); LogUtil.printInfoLog(InfoLogs.REIDENTIFY_FILE_SUCCESS.getLog()); return response; } catch (ApiClientApiException e) { @@ -312,7 +343,7 @@ public GetRunResponse getRun(GetRunRequest request) throws SkyflowException { try { DetectRunsResponseV2 apiResponse = filesClient().getRunV2(runId, apiRequest, requestOptions(token)); LogUtil.printInfoLog(InfoLogs.GET_RUN_REQUEST_RESOLVED.getLog()); - GetRunResponse response = DetectResponseMapper.toGetRunResponse(runId, apiResponse); + GetRunResponse response = DetectResponseMapper.toGetRunResponse(runId, apiResponse, this::toDeidentifySource); LogUtil.printInfoLog(InfoLogs.GET_RUN_SUCCESS.getLog()); return response; } catch (ApiClientApiException e) { diff --git a/common/src/test/java/com/skyflow/detect/TestDeidentifySource.java b/common/src/test/java/com/skyflow/detect/TestDeidentifySource.java new file mode 100644 index 00000000..471356fc --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/TestDeidentifySource.java @@ -0,0 +1,16 @@ +package com.skyflow.detect; + +/** Test stand-in for the per-SDK {@code DeidentifySourceType} enums, which common cannot see. Carries every API value. */ +public enum TestDeidentifySource implements DeidentifyFileSource { + BASE64, + SKYFLOW_ID, + PRESIGNED_URL; + + public static TestDeidentifySource fromWire(String wireValue) { + try { + return wireValue == null ? null : valueOf(wireValue); + } catch (IllegalArgumentException unknown) { + return null; + } + } +} diff --git a/common/src/test/java/com/skyflow/detect/TestReidentifySource.java b/common/src/test/java/com/skyflow/detect/TestReidentifySource.java new file mode 100644 index 00000000..bba36ebc --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/TestReidentifySource.java @@ -0,0 +1,15 @@ +package com.skyflow.detect; + +/** Test stand-in for the per-SDK {@code ReidentifySourceType} enums, which common cannot see. */ +public enum TestReidentifySource implements ReidentifyFileSource { + BASE64, + PRESIGNED_URL; + + public static TestReidentifySource fromWire(String wireValue) { + try { + return wireValue == null ? null : valueOf(wireValue); + } catch (IllegalArgumentException unknown) { + return null; + } + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java index 756476b8..fa3008da 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileFlowTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.DetectRunStatus; @@ -30,10 +30,10 @@ public class DeidentifyFileFlowTests { private static final RunPoller.Sleeper NO_SLEEP = millis -> { }; private static GetRunResponse success() { - return success(DeidentifySourceType.BASE64); + return success(TestDeidentifySource.BASE64); } - private static GetRunResponse success(DeidentifySourceType outputType) { + private static GetRunResponse success(TestDeidentifySource outputType) { return new GetRunResponse("run-1", DetectRunStatus.SUCCESS, outputType, Arrays.asList( new FileOutput(Base64.getEncoder().encodeToString("redacted".getBytes()), @@ -47,7 +47,7 @@ private static GetRunResponse success(DeidentifySourceType outputType) { public void withoutPollOptionsReturnsRunIdAndNeverFetches() throws Exception { AtomicInteger fetches = new AtomicInteger(); DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("x").build(), "run-1", + DeidentifyFileRequest.builder().dataSource(TestDeidentifySource.BASE64).value("x").build(), "run-1", id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); Assert.assertEquals("run-1", response.getRunId()); Assert.assertNull(response.getStatus()); @@ -59,7 +59,7 @@ public void withoutPollOptionsReturnsRunIdAndNeverFetches() throws Exception { public void missingRunIdSkipsPollingEvenWhenRequested() throws Exception { AtomicInteger fetches = new AtomicInteger(); DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("x") + DeidentifyFileRequest.builder().dataSource(TestDeidentifySource.BASE64).value("x") .pollOptions(PollOptions.builder().build()).build(), null, id -> { fetches.incrementAndGet(); return success(); }, NO_SLEEP); Assert.assertNull(response.getRunId()); @@ -70,7 +70,7 @@ public void missingRunIdSkipsPollingEvenWhenRequested() throws Exception { @Test public void polledRawRequestMergesRunButWritesNothing() throws Exception { DeidentifyFileResponse response = DeidentifyFileFlow.complete( - DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec") + DeidentifyFileRequest.builder().dataSource(TestDeidentifySource.SKYFLOW_ID).value("rec") .pollOptions(PollOptions.builder().build()).outputDirectory(folder.getRoot().getPath()).build(), "run-1", id -> success(), NO_SLEEP); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); @@ -108,10 +108,10 @@ public void polledFileRequestWritesNothingForPresignedUrlOutputs() throws Except DeidentifyFileResponse response = DeidentifyFileFlow.complete( DeidentifyFileRequest.builder().file(input).pollOptions(PollOptions.builder().build()) .outputDirectory(outDir.getPath()).build(), - "run-1", id -> success(DeidentifySourceType.PRESIGNED_URL), NO_SLEEP); + "run-1", id -> success(TestDeidentifySource.PRESIGNED_URL), NO_SLEEP); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DeidentifySourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(TestDeidentifySource.PRESIGNED_URL, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals(0, outDir.list().length); } diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java index 079adca0..90866595 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileMapperTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.DeidentifyFileResponse; import com.skyflow.detect.Detect; @@ -37,7 +37,7 @@ private static String wire(DeidentifyFileRequestV2 request) throws Exception { @Test public void mapsRawValueRequest() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec-1").configurationId("cfg-1").build(), "vault-1"); + .dataSource(TestDeidentifySource.SKYFLOW_ID).value("rec-1").configurationId("cfg-1").build(), "vault-1"); Assert.assertEquals("SKYFLOW_ID", api.getDataSource().toString()); Assert.assertEquals("rec-1", api.getValue()); Assert.assertEquals("cfg-1", api.getConfigurationId().get()); @@ -53,14 +53,14 @@ public void mapsRawValueRequest() throws Exception { @Test public void dataFormatIsSentLowerCase() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.PRESIGNED_URL).value("https://s3/in").dataFormat(FileDataFormat.PDF).build(), "v"); + .dataSource(TestDeidentifySource.PRESIGNED_URL).value("https://s3/in").dataFormat(FileDataFormat.PDF).build(), "v"); Assert.assertTrue(wire(api).contains("\"dataFormat\":\"pdf\"")); } @Test public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.BASE64).value("aGVsbG8=").build(), "vault-1"); + .dataSource(TestDeidentifySource.BASE64).value("aGVsbG8=").build(), "vault-1"); Assert.assertFalse(api.getConfigurationId().isPresent()); Assert.assertEquals("vault-1", api.getConfiguration().get().getVaultId()); Assert.assertFalse(api.getConfiguration().get().getDetect().isPresent()); @@ -71,7 +71,7 @@ public void noConfigurationSendsVaultIdOnlyConfiguration() throws Exception { @Test public void storedConfigurationIdSendsNoConfiguration() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.BASE64).value("aGVsbG8=").configurationId("cfg-1").build(), "vault-1"); + .dataSource(TestDeidentifySource.BASE64).value("aGVsbG8=").configurationId("cfg-1").build(), "vault-1"); Assert.assertEquals("cfg-1", api.getConfigurationId().get()); Assert.assertFalse(api.getConfiguration().isPresent()); } @@ -79,7 +79,7 @@ public void storedConfigurationIdSendsNoConfiguration() throws Exception { @Test public void inlineConfigurationGetsVaultId() throws Exception { DeidentifyFileRequestV2 api = DetectRequestMapper.toDeidentifyFileRequest(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.BASE64).value("Zm9v") + .dataSource(TestDeidentifySource.BASE64).value("Zm9v") .configuration(DetectConfiguration.builder().detect(Detect.builder().entities(Collections.singletonList( Entity.builder().entityType(EntityType.NAME).build())).build()).build()) .build(), "vault-9"); @@ -153,11 +153,11 @@ public void polledResponseMergesRunIdWithRun() throws Exception { "{\"status\":\"SUCCESS\",\"outputType\":\"BASE64\",\"output\":[{\"processedFile\":\"UERG\"," + "\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}],\"metrics\":{\"pages\":2}}", DetectRunsResponseV2.class); - GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-7", api); + GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-7", api, TestDeidentifySource::fromWire); DeidentifyFileResponse response = DetectResponseMapper.toDeidentifyFileResponse("run-7", run); Assert.assertEquals("run-7", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); + Assert.assertEquals(TestDeidentifySource.BASE64, response.getOutputType()); Assert.assertEquals("UERG", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals(FileDataFormat.PDF, response.getOutput().get(0).getProcessedFileExtension()); Assert.assertEquals(Integer.valueOf(2), response.getMetrics().getPages()); diff --git a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java index b0723bbe..99567356 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DeidentifyFileValidationsTests.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; +import com.skyflow.detect.TestDeidentifySource; -import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentifyFileRequest; import com.skyflow.detect.PollOptions; import com.skyflow.errors.BaseErrorMessage; @@ -31,7 +31,7 @@ private static void assertRejected(DeidentifyFileRequest request, BaseErrorMessa } private static DeidentifyFileRequest.DeidentifyFileRequestBuilder raw() { - return DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.BASE64).value("Zm9v"); + return DeidentifyFileRequest.builder().dataSource(TestDeidentifySource.BASE64).value("Zm9v"); } @Test @@ -42,7 +42,7 @@ public void rejectsNullRequest() { @Test public void rawValueRequiresDataSourceAndValue() throws SkyflowException { assertRejected(DeidentifyFileRequest.builder().value("x").build(), BaseErrorMessage.InvalidDataSourceInDeidentifyFile); - assertRejected(DeidentifyFileRequest.builder().dataSource(DeidentifySourceType.SKYFLOW_ID).build(), BaseErrorMessage.InvalidValueInDeidentifyFile); + assertRejected(raw().value("").build(), BaseErrorMessage.InvalidValueInDeidentifyFile); assertRejected(raw().value(" ").build(), BaseErrorMessage.InvalidValueInDeidentifyFile); DetectValidations.validateDeidentifyFileRequest(raw().build()); DetectValidations.validateDeidentifyFileRequest(raw().configurationId("cfg").build()); @@ -61,6 +61,25 @@ public void fileRequestsNeedAnExistingFileAndNoValue() throws Exception { assertRejected(DeidentifyFileRequest.builder().file(folder.getRoot()).build(), BaseErrorMessage.FileNotFoundToDeidentify); } + @Test + public void exactlyOneOfFilePathFileOrValueIsRequired() throws Exception { + File existing = folder.newFile("one.txt"); + Files.write(existing.toPath(), "hello".getBytes("UTF-8")); + String path = existing.getPath(); + + assertRejected(DeidentifyFileRequest.builder().build(), BaseErrorMessage.MissingFileSourceInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().dataSource(TestDeidentifySource.SKYFLOW_ID).build(), BaseErrorMessage.MissingFileSourceInDeidentifyFile); + + assertRejected(DeidentifyFileRequest.builder().file(existing).filePath(path).build(), BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().filePath(path).value("Zm9v").build(), BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().file(existing).value("").build(), BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + assertRejected(DeidentifyFileRequest.builder().file(existing).filePath(path).value("Zm9v").build(), BaseErrorMessage.MultipleFileSourcesInDeidentifyFile); + + // dataSource alongside a local file is tolerated: the file is always sent as BASE64 + DetectValidations.validateDeidentifyFileRequest(DeidentifyFileRequest.builder().filePath(path).dataSource(TestDeidentifySource.PRESIGNED_URL).build()); + assertRejected(DeidentifyFileRequest.builder().filePath(" ").build(), BaseErrorMessage.FileNotFoundToDeidentify); + } + @Test public void pollOptionsBoundsAreEnforced() throws SkyflowException { DetectValidations.validateDeidentifyFileRequest(raw().pollOptions(PollOptions.builder().build()).build()); diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java index 173bf0b3..8909509c 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectResponseMapperTests.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.DeidentifyStringResponse; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.FileDataFormat; @@ -61,7 +61,7 @@ public void nullListElementsFromTheApiAreSkipped() throws Exception { DetectRunsResponseV2 run = ObjectMappers.JSON_MAPPER.readValue( "{\"status\":\"SUCCESS\",\"output\":[null,{\"processedFile\":\"x\"}]}", DetectRunsResponseV2.class); - Assert.assertEquals(1, DetectResponseMapper.toGetRunResponse("r", run).getOutput().size()); + Assert.assertEquals(1, DetectResponseMapper.toGetRunResponse("r", run, TestDeidentifySource::fromWire).getOutput().size()); } @Test @@ -99,10 +99,10 @@ public void mapsCompletedRun() throws Exception { "{\"status\":\"SUCCESS\",\"outputType\":\"PRESIGNED_URL\",\"output\":[{\"processedFile\":\"https://x/y.pdf\"," + "\"processedFileType\":\"REDACTED_FILE\",\"processedFileExtension\":\"pdf\"}],\"metrics\":{\"pages\":2}}", DetectRunsResponseV2.class); - GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-1", api); + GetRunResponse run = DetectResponseMapper.toGetRunResponse("run-1", api, TestDeidentifySource::fromWire); Assert.assertEquals("run-1", run.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, run.getStatus()); - Assert.assertEquals(DeidentifySourceType.PRESIGNED_URL, run.getOutputType()); + Assert.assertEquals(TestDeidentifySource.PRESIGNED_URL, run.getOutputType()); Assert.assertEquals("https://x/y.pdf", run.getOutput().get(0).getProcessedFile()); Assert.assertEquals(FileDataFormat.PDF, run.getOutput().get(0).getProcessedFileExtension()); Assert.assertEquals(Integer.valueOf(2), run.getMetrics().getPages()); @@ -111,14 +111,14 @@ public void mapsCompletedRun() throws Exception { @Test public void runWithoutStatusIsUnknownAndUnknownWireValuesAreTolerated() throws Exception { GetRunResponse empty = DetectResponseMapper.toGetRunResponse("r", - ObjectMappers.JSON_MAPPER.readValue("{}", DetectRunsResponseV2.class)); + ObjectMappers.JSON_MAPPER.readValue("{}", DetectRunsResponseV2.class), TestDeidentifySource::fromWire); Assert.assertEquals(DetectRunStatus.UNKNOWN, empty.getStatus()); Assert.assertTrue(empty.getOutput().isEmpty()); Assert.assertNull(empty.getOutputType()); GetRunResponse odd = DetectResponseMapper.toGetRunResponse("r", ObjectMappers.JSON_MAPPER.readValue( "{\"status\":\"NEW_STATE\",\"outputType\":\"FTP\",\"output\":[{\"processedFileExtension\":\"heic\"}]}", - DetectRunsResponseV2.class)); + DetectRunsResponseV2.class), TestDeidentifySource::fromWire); Assert.assertEquals(DetectRunStatus.UNKNOWN, odd.getStatus()); Assert.assertNull(odd.getOutputType()); Assert.assertNull(odd.getOutput().get(0).getProcessedFileExtension()); diff --git a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java index 7bd00f7d..a955266c 100644 --- a/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/FileOutputWriterTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; import com.skyflow.errors.SkyflowException; @@ -30,7 +30,7 @@ public void writesEachOutputWithV1StyleNames() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("%PDF"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput(b64("[]"), "ENTITIES", null)), - DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.assertEquals(2, written.size()); Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); @@ -45,7 +45,7 @@ public void entityOutputsCarryTheirTypeInTheName() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), new FileOutput(b64("b"), "OBJECT_ENTITIES", FileDataFormat.JSON)), - DeidentifySourceType.BASE64, "scan.png", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "scan.png", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); Assert.assertEquals("processed-object-entities-scan.json", written.get(1).getName()); } @@ -55,7 +55,7 @@ public void jsonInputDoesNotCollideWithItsEntitiesOutput() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("{}"), "REDACTED_TEXT", FileDataFormat.JSON), new FileOutput(b64("[]"), "ENTITIES", FileDataFormat.JSON)), - DeidentifySourceType.BASE64, "data.json", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "data.json", folder.getRoot().getPath()); Assert.assertEquals("processed-data.json", written.get(0).getName()); Assert.assertEquals("processed-entities-data.json", written.get(1).getName()); } @@ -65,7 +65,7 @@ public void nameCollisionsGetTheFileTypeInserted() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.TXT), new FileOutput(b64("b"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); Assert.assertEquals("processed-notes.redacted_text.txt", written.get(1).getName()); } @@ -75,7 +75,7 @@ public void createsMissingOutputDirectory() throws Exception { File nested = new File(folder.getRoot(), "a/b/c"); List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", nested.getPath()); + TestDeidentifySource.BASE64, "notes.txt", nested.getPath()); Assert.assertTrue(nested.isDirectory()); Assert.assertEquals(new File(nested, "processed-notes.txt"), written.get(0)); } @@ -84,24 +84,24 @@ public void createsMissingOutputDirectory() throws Exception { public void presignedUrlOutputsAreNotWritten() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput("https://s3/out", "REDACTED_FILE", FileDataFormat.PDF)), - DeidentifySourceType.PRESIGNED_URL, "invoice.pdf", folder.getRoot().getPath()); + TestDeidentifySource.PRESIGNED_URL, "invoice.pdf", folder.getRoot().getPath()); Assert.assertTrue(written.isEmpty()); Assert.assertEquals(0, folder.getRoot().list().length); } @Test public void emptyOrNullOutputsWriteNothing() throws Exception { - Assert.assertTrue(FileOutputWriter.write(null, DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); - Assert.assertTrue(FileOutputWriter.write(Collections.emptyList(), DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(null, TestDeidentifySource.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + Assert.assertTrue(FileOutputWriter.write(Collections.emptyList(), TestDeidentifySource.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); Assert.assertTrue(FileOutputWriter.write(Collections.singletonList(new FileOutput(null, "ENTITIES", null)), - DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); + TestDeidentifySource.BASE64, "x.txt", folder.getRoot().getPath()).isEmpty()); } @Test public void invalidBase64IsReportedAsWriteFailure() { try { FileOutputWriter.write(Collections.singletonList(new FileOutput("not base64!", "REDACTED_FILE", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "x.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "x.txt", folder.getRoot().getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-x.txt")); @@ -115,7 +115,7 @@ public void nullOrEmptyTypeFallsBackToPlainName() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), null, FileDataFormat.PDF), new FileOutput(b64("b"), "", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.assertEquals("processed-invoice.pdf", written.get(0).getName()); Assert.assertEquals("processed-invoice.txt", written.get(1).getName()); } @@ -124,7 +124,7 @@ public void nullOrEmptyTypeFallsBackToPlainName() throws Exception { public void nonEntityOutputWithoutExtensionGetsBin() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TRANSCRIPTION", null)), - DeidentifySourceType.BASE64, "call.mp3", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "call.mp3", folder.getRoot().getPath()); Assert.assertEquals("processed-call.bin", written.get(0).getName()); } @@ -132,7 +132,7 @@ public void nonEntityOutputWithoutExtensionGetsBin() throws Exception { public void entityOutputHonoursAnExplicitExtension() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-notes.txt", written.get(0).getName()); } @@ -140,7 +140,7 @@ public void entityOutputHonoursAnExplicitExtension() throws Exception { public void entityTypeMatchIsCaseInsensitive() throws Exception { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "entities", null)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-notes.json", written.get(0).getName()); } @@ -149,7 +149,7 @@ public void duplicateEntityOutputsGetTheTypeInsertedOnCollision() throws Excepti List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "ENTITIES", FileDataFormat.JSON), new FileOutput(b64("b"), "ENTITIES", FileDataFormat.JSON)), - DeidentifySourceType.BASE64, "scan.png", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "scan.png", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-scan.json", written.get(0).getName()); Assert.assertEquals("processed-entities-scan.entities.json", written.get(1).getName()); } @@ -160,7 +160,7 @@ public void collisionWithoutATypeUsesARunningNumber() throws Exception { new FileOutput(b64("a"), null, FileDataFormat.TXT), new FileOutput(b64("b"), null, FileDataFormat.TXT), new FileOutput(b64("c"), null, FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); Assert.assertEquals("processed-notes.1.txt", written.get(1).getName()); Assert.assertEquals("processed-notes.2.txt", written.get(2).getName()); @@ -170,12 +170,12 @@ public void collisionWithoutATypeUsesARunningNumber() throws Exception { public void inputNamesWithoutAnExtensionOrWithLeadingDotAreKept() throws Exception { List plain = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "ENTITIES", null)), - DeidentifySourceType.BASE64, "README", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "README", folder.getRoot().getPath()); Assert.assertEquals("processed-entities-README.json", plain.get(0).getName()); List dotted = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, ".notes", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, ".notes", folder.getRoot().getPath()); Assert.assertEquals("processed-.notes.txt", dotted.get(0).getName()); } @@ -184,7 +184,7 @@ public void missingInputNameFallsBackToOutput() throws Exception { List written = FileOutputWriter.write(Arrays.asList( new FileOutput(b64("a"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput(b64("b"), "ENTITIES", null)), - DeidentifySourceType.BASE64, null, folder.getRoot().getPath()); + TestDeidentifySource.BASE64, null, folder.getRoot().getPath()); Assert.assertEquals("processed-output.pdf", written.get(0).getName()); Assert.assertEquals("processed-entities-output.json", written.get(1).getName()); } @@ -205,7 +205,7 @@ public void nullElementsInTheOutputListAreSkipped() throws Exception { List written = FileOutputWriter.write(Arrays.asList( null, new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals(1, written.size()); Assert.assertEquals("processed-notes.txt", written.get(0).getName()); } @@ -216,7 +216,7 @@ public void blankOutputDirectoryWritesToTheWorkingDirectory() throws Exception { try { List written = FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "writer-cwd-test.txt", " "); + TestDeidentifySource.BASE64, "writer-cwd-test.txt", " "); Assert.assertEquals(expected, written.get(0)); Assert.assertNull(written.get(0).getParentFile()); Assert.assertTrue(expected.isFile()); @@ -231,7 +231,7 @@ public void outputDirectoryThatIsAFileIsReportedAsWriteFailure() throws Exceptio try { FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("x"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", notADirectory.getPath()); + TestDeidentifySource.BASE64, "notes.txt", notADirectory.getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains(notADirectory.getPath())); @@ -244,7 +244,7 @@ public void existingFilesAreOverwritten() throws Exception { Files.write(target.toPath(), "old".getBytes()); FileOutputWriter.write( Collections.singletonList(new FileOutput(b64("new"), "REDACTED_TEXT", FileDataFormat.TXT)), - DeidentifySourceType.BASE64, "notes.txt", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "notes.txt", folder.getRoot().getPath()); Assert.assertEquals("new", new String(Files.readAllBytes(target.toPath()))); } @@ -254,7 +254,7 @@ public void aLaterFailureLeavesEarlierFilesOnDisk() throws Exception { FileOutputWriter.write(Arrays.asList( new FileOutput(b64("ok"), "REDACTED_FILE", FileDataFormat.PDF), new FileOutput("not base64!", "ENTITIES", null)), - DeidentifySourceType.BASE64, "invoice.pdf", folder.getRoot().getPath()); + TestDeidentifySource.BASE64, "invoice.pdf", folder.getRoot().getPath()); Assert.fail("expected SkyflowException"); } catch (SkyflowException e) { Assert.assertTrue(e.getMessage(), e.getMessage().contains("processed-entities-invoice.json")); diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java index 7de03e28..df55cd8b 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java @@ -1,7 +1,6 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.DeidentifySourceType; -import com.skyflow.detect.ReidentifySourceType; +import com.skyflow.detect.TestReidentifySource; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; @@ -27,7 +26,7 @@ private static String wire(ReidentifyFileRequestV2 request) throws Exception { } private static ReidentifyFileResponse fromJson(String json) throws Exception { - return ReidentifyFileMapper.toResponse(ObjectMappers.JSON_MAPPER.readValue(json, ReidentifyFileResponseV2.class)); + return ReidentifyFileMapper.toResponse(ObjectMappers.JSON_MAPPER.readValue(json, ReidentifyFileResponseV2.class), TestReidentifySource::fromWire); } // ─── request ────────────────────────────────────────────────────────────── @@ -35,7 +34,7 @@ private static ReidentifyFileResponse fromJson(String json) throws Exception { @Test public void mapsRequiredFieldsAndInjectsVaultId() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(ReidentifySourceType.BASE64).value("W05BTUVfMV0=").build(), "vault-1"); + .dataSource(TestReidentifySource.BASE64).value("W05BTUVfMV0=").build(), "vault-1"); Assert.assertEquals("BASE64", api.getDataSource().toString()); Assert.assertEquals("W05BTUVfMV0=", api.getValue()); @@ -53,7 +52,7 @@ public void mapsRequiredFieldsAndInjectsVaultId() throws Exception { @Test public void mapsEveryDataSource() throws Exception { - for (ReidentifySourceType source : ReidentifySourceType.values()) { + for (TestReidentifySource source : TestReidentifySource.values()) { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() .dataSource(source).value("x").build(), "v"); Assert.assertEquals(source.name(), api.getDataSource().toString()); @@ -62,18 +61,9 @@ public void mapsEveryDataSource() throws Exception { } @Test - public void reidentifySourcesExcludeSkyflowIdWhileDeidentifySourcesKeepIt() { - Assert.assertEquals(Arrays.asList("BASE64", "PRESIGNED_URL"), - Arrays.asList(ReidentifySourceType.BASE64.name(), ReidentifySourceType.PRESIGNED_URL.name())); - Assert.assertEquals(2, ReidentifySourceType.values().length); - Assert.assertEquals(3, DeidentifySourceType.values().length); - Assert.assertNotNull(DeidentifySourceType.valueOf("SKYFLOW_ID")); - try { - ReidentifySourceType.valueOf("SKYFLOW_ID"); - Assert.fail("SKYFLOW_ID must not be a reidentify source"); - } catch (IllegalArgumentException expected) { - // the server rejects SKYFLOW_ID for re-identification, so the SDK does not offer it - } + public void outputTypeTheSdkDoesNotOfferMapsToNull() throws Exception { + // the API lists SKYFLOW_ID for re-identification but the SDK enum does not offer it + Assert.assertNull(fromJson("{\"outputType\":\"SKYFLOW_ID\"}").getOutputType()); } @Test @@ -81,7 +71,7 @@ public void dataFormatIsSentAsLowerCaseWireValue() throws Exception { for (FileDataFormat format : new FileDataFormat[]{FileDataFormat.TXT, FileDataFormat.CSV, FileDataFormat.JSON, FileDataFormat.JSONL, FileDataFormat.XML, FileDataFormat.DOCX, FileDataFormat.XLSX, FileDataFormat.PPTX}) { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(ReidentifySourceType.BASE64).value("eA==").dataFormat(format).build(), "v"); + .dataSource(TestReidentifySource.BASE64).value("eA==").dataFormat(format).build(), "v"); Assert.assertEquals(format.name().toLowerCase(), api.getDataFormat().get().toString()); Assert.assertTrue(wire(api).contains("\"dataFormat\":\"" + format.name().toLowerCase() + "\"")); } @@ -90,7 +80,7 @@ public void dataFormatIsSentAsLowerCaseWireValue() throws Exception { @Test public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://s3/presigned") + .dataSource(TestReidentifySource.PRESIGNED_URL).value("https://s3/presigned") .redactionLevel(Arrays.asList( RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask-middle").build(), RedactionLevel.builder().entityName(EntityType.EMAIL_ADDRESS).redactionType(RedactionType.MASKED).build())) @@ -109,7 +99,7 @@ public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { @Test public void emptyRedactionLevelListIsSentAsEmptyArray() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(ReidentifySourceType.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); + .dataSource(TestReidentifySource.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); Assert.assertTrue(api.getRedactionLevel().get().isEmpty()); Assert.assertTrue(wire(api).contains("\"redactionLevel\":[]")); } @@ -124,7 +114,7 @@ public void mapsFullResponse() throws Exception { + "\"metrics\":{\"size\":12.5,\"wordCount\":120,\"characterCount\":800,\"pages\":2,\"slides\":0,\"duration\":1.25}}"); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(ReidentifySourceType.PRESIGNED_URL, response.getOutputType()); + Assert.assertEquals(TestReidentifySource.PRESIGNED_URL, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); FileOutput first = response.getOutput().get(0); Assert.assertEquals("https://s3/out-1", first.getProcessedFile()); @@ -145,7 +135,7 @@ public void mapsEveryKnownStatusAndOutputType() throws Exception { for (DetectRunStatus status : DetectRunStatus.values()) { Assert.assertEquals(status, fromJson("{\"status\":\"" + status.name() + "\"}").getStatus()); } - for (ReidentifySourceType type : ReidentifySourceType.values()) { + for (TestReidentifySource type : TestReidentifySource.values()) { Assert.assertEquals(type, fromJson("{\"outputType\":\"" + type.name() + "\"}").getOutputType()); } } diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index b0444bb4..b5010e35 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -1,7 +1,7 @@ package com.skyflow.detect.internal; -import com.skyflow.detect.ReidentifySourceType; +import com.skyflow.detect.TestReidentifySource; import com.skyflow.detect.EntityType; import com.skyflow.detect.RedactionLevel; import com.skyflow.enums.RedactionType; @@ -18,7 +18,7 @@ public class ReidentifyFileValidationsTests { private static ReidentifyFileRequest.ReidentifyFileRequestBuilder valid() { - return ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).value("Zm9v"); + return ReidentifyFileRequest.builder().dataSource(TestReidentifySource.BASE64).value("Zm9v"); } private static void assertRejected(ReidentifyFileRequest request, BaseErrorMessage expected) { @@ -43,7 +43,7 @@ public void rejectsMissingDataSource() { @Test public void rejectsNullOrBlankValue() { - assertRejected(ReidentifyFileRequest.builder().dataSource(ReidentifySourceType.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); + assertRejected(ReidentifyFileRequest.builder().dataSource(TestReidentifySource.BASE64).build(), BaseErrorMessage.InvalidValueInReidentifyFile); assertRejected(valid().value("").build(), BaseErrorMessage.InvalidValueInReidentifyFile); assertRejected(valid().value(" \t").build(), BaseErrorMessage.InvalidValueInReidentifyFile); } @@ -58,7 +58,7 @@ public void checksFieldsInOrderDataSourceBeforeValue() { public void acceptsMinimalAndFullValidRequests() throws SkyflowException { ReidentifyFileValidations.validateReidentifyFileRequest(valid().build()); ReidentifyFileValidations.validateReidentifyFileRequest(valid() - .dataSource(ReidentifySourceType.PRESIGNED_URL).value("https://example.com/f") + .dataSource(TestReidentifySource.PRESIGNED_URL).value("https://example.com/f") .redactionLevel(Arrays.asList( RedactionLevel.builder().tokenGroupName("g").redactionPattern("p").build(), RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.REDACTED).build(), diff --git a/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java index 63eeae62..946affeb 100644 --- a/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java +++ b/common/src/test/java/com/skyflow/detect/polling/RunPollerTests.java @@ -1,6 +1,6 @@ package com.skyflow.detect.polling; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.GetRunResponse; import com.skyflow.detect.PollOptions; @@ -17,7 +17,7 @@ public class RunPollerTests { private static GetRunResponse run(DetectRunStatus status) { - return new GetRunResponse("run-1", status, status == DetectRunStatus.SUCCESS ? DeidentifySourceType.BASE64 : null, + return new GetRunResponse("run-1", status, status == DetectRunStatus.SUCCESS ? TestDeidentifySource.BASE64 : null, Collections.emptyList(), null, status == DetectRunStatus.FAILED ? "boom" : null); } diff --git a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java index 7724448c..bdec1757 100644 --- a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java +++ b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java @@ -1,5 +1,8 @@ package com.skyflow.vault.controller; +import com.skyflow.detect.TestReidentifySource; +import com.skyflow.detect.ReidentifyFileSource; +import com.skyflow.detect.DeidentifyFileSource; import com.skyflow.config.BaseVaultConfig; import com.skyflow.detect.DeidentifyStringRequest; import com.skyflow.detect.DeidentifyStringResponse; @@ -8,7 +11,7 @@ import com.skyflow.detect.Entity; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.TestDeidentifySource; import com.skyflow.detect.DetectRunStatus; import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; @@ -57,6 +60,16 @@ protected String getSdkMetrics() { return "{\"sdk_name_version\":\"test\"}"; } + @Override + protected DeidentifyFileSource toDeidentifySource(String wireValue) { + return TestDeidentifySource.fromWire(wireValue); + } + + @Override + protected ReidentifyFileSource toReidentifySource(String wireValue) { + return TestReidentifySource.fromWire(wireValue); + } + @Override protected String resolveToken() throws SkyflowException { if (tokenFailure != null) { @@ -162,7 +175,7 @@ public void getRunQueriesRunByIdScopedToVault() throws Exception { Assert.assertEquals("run-42", response.getRunId()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); - Assert.assertEquals(DeidentifySourceType.BASE64, response.getOutputType()); + Assert.assertEquals(TestDeidentifySource.BASE64, response.getOutputType()); Assert.assertEquals(2, response.getOutput().size()); Assert.assertEquals("QUJD", response.getOutput().get(0).getProcessedFile()); Assert.assertEquals("REDACTED_FILE", response.getOutput().get(0).getProcessedFileType()); diff --git a/docs/api_reference.md b/docs/api_reference.md index 089eccf9..83c35f0b 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -242,7 +242,7 @@ Parameters listed with their defaults as defined in the builders. | Builder method | Default | Description | |----------------|---------|-------------| -| `dataSource(DeidentifySourceType)` | `null` | How `value` supplies the file: `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`. See [Detect enums](#detect-enums). | +| `dataSource(DeidentifySourceType)` | `null` | How `value` supplies the file, using this SDK's enum: skyvault `BASE64`, `SKYFLOW_ID` or `PRESIGNED_URL`; flowvault `BASE64` or `PRESIGNED_URL`. Required with `value`; a `file` or `filePath` is always sent as `BASE64`. See [Detect enums](#detect-enums). | | `value(String)` | `null` | Base64 content, a skyflow id, or a presigned URL, per `dataSource`. | | `file(File)` | `null` | Local file; read and base64-encoded when sent, `dataSource` set to `BASE64`. | | `filePath(String)` | `null` | Same as `file(File)`, from a path. | @@ -694,8 +694,8 @@ All in `com.skyflow.detect`. |------|--------| | `EntityType` | the 70 entity types (`NAME`, `EMAIL_ADDRESS`, `SSN`, `CREDIT_CARD`, `DOB`, ...), plus `ALL` and `NONE` | | `DeidentificationType` | `ENTITY_UNIQUE_COUNTER` _(default)_, `ENTITY_ONLY`, `VAULT_TOKEN`, `MASK`, `UNKNOWN` | -| `DeidentifySourceType` | `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL`. Input source for `deidentifyFile`, and the `getOutputType()` of `DeidentifyFileResponse` and `GetRunResponse`, where the API returns `BASE64` or `PRESIGNED_URL`. | -| `ReidentifySourceType` | `BASE64`, `PRESIGNED_URL`. Input source for `reidentifyFile` (the API does not accept a skyflow id there) and the `getOutputType()` of `ReidentifyFileResponse`. | +| `DeidentifySourceType` | Defined per SDK: skyvault `BASE64`, `SKYFLOW_ID`, `PRESIGNED_URL`; flowvault `BASE64`, `PRESIGNED_URL`. The `dataSource` of `deidentifyFile` and the `getOutputType()` of `DeidentifyFileResponse` and `GetRunResponse`. | +| `ReidentifySourceType` | `BASE64`, `PRESIGNED_URL` in both SDKs. The `dataSource` of `reidentifyFile` and the `getOutputType()` of `ReidentifyFileResponse`. | | `FileDataFormat` | `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML`, `ZIP` | | `DetectRunStatus` | `QUEUED`, `IN_PROGRESS`, `SUCCESS`, `FAILED`, `UNKNOWN`. `SUCCESS`, `FAILED` and `UNKNOWN` end polling. | | `ReturnEntitiesType` | `EXCLUDE_SENSITIVE_DATA` _(default)_, `ALL`, `NONE` | diff --git a/flowvault/README.md b/flowvault/README.md index f9a438fb..532f2f79 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1762,7 +1762,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: a `DeidentifySourceType` `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). +The file is supplied in exactly one of three ways: `filePath(String)`, `file(File)`, or `value` plus a `DeidentifySourceType` `dataSource` (`BASE64` or `PRESIGNED_URL`; flowvault vaults do not accept a skyflow id as the source). `file` and `filePath` read a local file when the request is sent, send it as `BASE64` and infer `dataFormat` from its extension. Passing more than one of `filePath`, `file` and `value`, or none of them, is rejected before any network call. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. @@ -1801,7 +1801,7 @@ switch (response.getStatus()) { } ``` -Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. +Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` value has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. ### Polling from a worker thread diff --git a/flowvault/api-report/skyflow-flowvault-java.baseline.jar b/flowvault/api-report/skyflow-flowvault-java.baseline.jar index a131a5eeeaa2142720a6038e93051589bbb3928b..7b870015db9995383fa1388826b2227f8158cb62 100644 GIT binary patch delta 125683 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 diff --git a/flowvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java b/flowvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java new file mode 100644 index 00000000..86f5e13f --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code deidentifyFile} on a flowvault vault: base64 content or an S3 presigned URL. Flowvault vaults do not accept a skyflow id as the + * source, so there is no {@code SKYFLOW_ID} here. + * Also the {@code getOutputType()} of {@code DeidentifyFileResponse} and {@code GetRunResponse}. + */ +public enum DeidentifySourceType implements DeidentifyFileSource { + BASE64, + PRESIGNED_URL; +} diff --git a/flowvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java b/flowvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java new file mode 100644 index 00000000..c4e0b5bc --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code reidentifyFile} on a flowvault vault: base64 content or an S3 presigned + * URL. Re-identification does not accept a skyflow id as the source. Also the {@code getOutputType()} of + * {@code ReidentifyFileResponse}. + */ +public enum ReidentifySourceType implements ReidentifyFileSource { + BASE64, + PRESIGNED_URL; +} diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java index 573eb349..90ce2206 100644 --- a/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/flowvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -2,6 +2,10 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileSource; +import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.ReidentifyFileSource; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.errors.SkyflowException; import com.skyflow.utils.Utils; @@ -35,6 +39,16 @@ protected String resolveVaultUrl() throws SkyflowException { return vaultUrl; } + @Override + protected DeidentifyFileSource toDeidentifySource(String wireValue) { + return enumOrNull(DeidentifySourceType.class, wireValue); + } + + @Override + protected ReidentifyFileSource toReidentifySource(String wireValue) { + return enumOrNull(ReidentifySourceType.class, wireValue); + } + @Override protected String getSdkMetrics() { return Utils.getMetrics().toString(); diff --git a/flowvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java b/flowvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java new file mode 100644 index 00000000..589b5aca --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java @@ -0,0 +1,39 @@ +package com.skyflow.detect; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class DetectSourceTypesTests { + + private static List names(Enum[] values) { + List names = new ArrayList<>(); + for (Enum value : values) { + names.add(value.name()); + } + return names; + } + + @Test + public void deidentifySourcesOfferedOnFlowvault() { + Assert.assertEquals(Arrays.asList("BASE64", "PRESIGNED_URL"), names(DeidentifySourceType.values())); + DeidentifyFileSource asSource = DeidentifySourceType.BASE64; + Assert.assertEquals("BASE64", asSource.name()); + } + + @Test + public void reidentifySourcesNeverIncludeSkyflowId() { + Assert.assertEquals(Arrays.asList("BASE64", "PRESIGNED_URL"), names(ReidentifySourceType.values())); + try { + ReidentifySourceType.valueOf("SKYFLOW_ID"); + Assert.fail("re-identification does not accept a skyflow id"); + } catch (IllegalArgumentException expected) { + // not offered + } + ReidentifyFileSource asSource = ReidentifySourceType.PRESIGNED_URL; + Assert.assertEquals("PRESIGNED_URL", asSource.name()); + } +} diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index 23db46ac..e81bf9e3 100644 --- a/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/flowvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -1,11 +1,11 @@ package com.skyflow.vault.controller; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentificationType; import com.skyflow.detect.DeidentifyFileRequest; @@ -507,7 +507,7 @@ public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exceptio server.enqueue(new MockResponse().setResponseCode(200).setBody("{\"runId\":\"run-42\"}")); DeidentifyFileResponse response = controllerFor(server).deidentifyFile(DeidentifyFileRequest.builder() - .dataSource(DeidentifySourceType.SKYFLOW_ID).value("rec-1").dataFormat(FileDataFormat.PDF) + .dataSource(DeidentifySourceType.PRESIGNED_URL).value("https://example.com/in.pdf").dataFormat(FileDataFormat.PDF) .configurationId("cfg-1").build()); Assert.assertEquals("run-42", response.getRunId()); @@ -517,8 +517,8 @@ public void deidentifyFileSubmitOnlyReturnsRunIdWithoutPolling() throws Exceptio RecordedRequest recorded = server.takeRequest(); assertCommonHeaders(recorded, "POST", "/v2/detect/deidentify/file"); String body = recorded.getBody().readUtf8(); - Assert.assertTrue(body, body.contains("\"dataSource\":\"SKYFLOW_ID\"")); - Assert.assertTrue(body, body.contains("\"value\":\"rec-1\"")); + Assert.assertTrue(body, body.contains("\"dataSource\":\"PRESIGNED_URL\"")); + Assert.assertTrue(body, body.contains("\"value\":\"https://example.com/in.pdf\"")); Assert.assertTrue(body, body.contains("\"dataFormat\":\"pdf\"")); Assert.assertTrue(body, body.contains("\"configurationId\":\"cfg-1\"")); Assert.assertEquals("only the submit call was made", 1, server.getRequestCount()); diff --git a/skyvault/README.md b/skyvault/README.md index 921094d0..513e29cc 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1795,7 +1795,7 @@ File de-identification is asynchronous on the API: the submit call returns a run - **Submit only** (default): one call, returns `getRunId()`. `getStatus()` is `null` and nothing is written to disk. Retrieve the result later with [`getRun`](#get-run). - **Submit and poll**: set `pollOptions`. The SDK polls the run with exponential backoff (1, 2, 4, 8, 16, then 32 seconds between lookups) until it is `SUCCESS`, `FAILED` or `UNKNOWN`, or until `waitTime` (default 60 s, max 300) or `maxAttempts` (default 23, max 23) is used up. If the budget runs out the response carries the run id with `IN_PROGRESS` or `QUEUED` so you can resume with `getRun`. -The file is supplied in one of three ways: a `DeidentifySourceType` `dataSource` plus `value` (`BASE64` content, a `SKYFLOW_ID`, or a `PRESIGNED_URL`), or `file(File)` / `filePath(String)`, which read and encode a local file and infer `dataFormat` from its extension. Supply exactly one of `value`, `file` or `filePath`. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). +The file is supplied in exactly one of three ways: `filePath(String)`, `file(File)`, or `value` plus a `DeidentifySourceType` `dataSource` (`BASE64`, the `SKYFLOW_ID` of a file record in the vault, or `PRESIGNED_URL`). `file` and `filePath` read a local file when the request is sent, send it as `BASE64` and infer `dataFormat` from its extension. Passing more than one of `filePath`, `file` and `value`, or none of them, is rejected before any network call. `configurationId` and `configuration` follow the same rules as for strings: both optional, sent as supplied, vault defaults when neither is set, and both together rejected by the API (see [Before you start](#before-you-start)). `dataFormat` accepts every `FileDataFormat`: `BMP`, `CSV`, `DCM`, `DOC`, `DOCX`, `GIF`, `JPEG`, `JPG`, `JSON`, `JSONL`, `MP3`, `PDF`, `PNG`, `PPT`, `PPTX`, `TIF`, `TIFF`, `TXT`, `WAV`, `XLS`, `XLSX`, `XML` and `ZIP`. The `VAULT_TOKEN` de-identification type is supported only for `TXT`, `CSV`, `JSON`, `JSONL`, `XML`, `DOCX`, `XLSX` and `PPTX`. @@ -1834,7 +1834,7 @@ switch (response.getStatus()) { } ``` -Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. +Outputs are written only when polling reached `SUCCESS`, the request was built from a local file, and the run delivered them as base64. A request built from a `SKYFLOW_ID` or `PRESIGNED_URL` value has no local name to derive from, and presigned-URL outputs are not fetched, so in those cases read `getOutput()` and write the files yourself. Files are named `processed-.`, with the entities output as `processed-entities-.json` (and `processed-object-entities-.json` for object entities); `outputDirectory` is created if missing and defaults to the working directory. Polling blocks the calling thread. ### Polling from a worker thread diff --git a/skyvault/api-report/skyflow-java.baseline.jar b/skyvault/api-report/skyflow-java.baseline.jar index afff0c48eed186cb3d1be20c8ec97dfed508a89c..70c1ea81dc6d1bb284ca7e380e1043ca658ab6eb 100644 GIT binary patch delta 132162 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

    NvBonV-C04c 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 delta 458356 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

    kF#NV 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 A=ylGB zBw#IfTuYT8a?zn6;0xaNz(dLvl#PMaXi})%(*PUb`MZ9`q6a>H#u-h%VEdyko9`E5 zj}M1q(^qa~Fk*`rx2thfBUO`eOjhXnFt5M%9qG$HfcqYxUCnZ4Hgq*=KNtDfhW^(C z>WKlbuXmopghe$LC}PByS+0AAc`X@6-=frN_~Q%<)sl3W7BTYBCh}$w}<#fAus1`Y|#QdJyR}K%~J;<#WgwX!%K@EKeIHLW0fAZO_ z+8cFjH1zXHyKCHCeF%5xH_yl~50GC3_KG`%ZA8%>WWq3%KxpbR)jCZf4N5@l-#sgc zd%AqMJEZvbq3J)Woj-`qzY>R;+>#TDy`)WaM6g%Yl}8||dehaw9+mfEr`iP2wD~Iu zk0k$;%qo8S~K$XgUc^6%%^hThydax@*i|LZ~Lf zV+@UwOX6}h0EKP?ZEMpbhM)!f;UcQc5NL~e_eQ;mK7~n{EGsn`2AJ- z1^Gkr6(BTW#fJ$MV8}PSG)J&?x%d~RdEwR))*8{(rjB?xwi;@BdZ%KvOmWtJsHi+t z7-9Q#q&KBu{HQ0Om{Ua3P@7^W1yT_*d%b%oJJ{PRN6@oDSCkEi`x8GJu+ATCki0y8 z*{8B8i4I+zGZpa3ZWb8Pw7>w)=6y-*#6L-aa+ET+>?Ll?7<;5k)Md(!%#=B>qwUED zG%2J1Mo{vqb;@FVI3ocn%&Zc0-4Y`zy%Oqy~i_s+9dPah<09F>ADT}6# zxLR~ADkSlq(-PCB5RW$!_S>+EwejyAK7?w}<9tg^>vcaEbc}=~pqwEcs%0aZra`Fv ztKtj6uot|~k6{mZUD3}%XK|?P)EV`AJ3S?&5d;}Gx~{KEs)*Z>x)4#f{}ZCcEPbaT z%JF503m^-d0OvroONM!0p21=&-NNeX07b8MPvo5@U+m)2egthJ50xG1>n!2}NTqyB zi;%f@^haypH4D1{5|t|2xouscSv;AlaBgN;6e>>W(mNc$zx)s*F#od8lVX1^1+Va7 zNt)((FNKhw+?Wo>BFovyTMWUPM{_=M?9c&0>b#UjSKqhlkmOn4109uBbTdKdR2z25 z@++<}sk0Y>SY5+bm(97wGX+Zh^R|a zqe6Ffc}t_lBr{c0n-$H}K|ZgL?GADOz=3LeYf98@BE$cGY`tYroL$#68r%kV5AN z3O9|7N_JUJMj?!3-s+fn=rd~zo5r7WMojlTqV|EO80ok^HMJx>92@^H3X$TCS_^4Ld3ov^hrN!s z=Yy*~3+T_e(Iw8odB!^a*ow(|p%O&Kmi3(&2OVySx6L09Vb^N^A4SlqUeTjT7fs-H zT9^1hm{`{}+~pRTfeFfBG$J^RHvtQgM>)?0G}AW7NiF{dq} z^VuY0)|PNo=`X64rLy5Q_LcPH5LsHC3+?r7i?CE1!fh`9i-z&BI+^c1>1xtryuKx9 z844iVM4vpg<6ARyF=woklLeUN)Wo3d=dEd;2-=}Hg`^bQ92-ZNS6!>uslK`lBy%_ZL$XZ+bD1U;{r|Hdj z>!m6X9P||N5RbX0Ce^_FBbMEB%ASLI!R0-gbGuKjewJdecicyN>?|a30`1PZqRnYF zQyrdN3Y%vBgEeIb9GGQIWEzlLzgqI>erI=BG@%0{+A%0t-ByvwF zgg%6!!Fx+FnAX8ZT|!w5)$HJ|GAWspO+7xt`OC9AUGq$3l#r08B zE5sKKQtYL;?Xz0I(%g-GA=$dv_f3)VjY#eFP{LNi=vIg=D*FX>SfQRdc6in;wwU@7 z6k2?>8yM)i6(CUKdz41PRiX0+1qs%gEfVDPGK`DbPS{gCMDfh1z&YqXHh&q&)ERL9 zxFd%AAgvoaz>q-jnDAl>1CTjSeyGN9!_6LyEgCa>f}3=@R%tUxl5(6z4H$Ig-Hnt| zm4;S&K$SSTLv9_wDEjvkpL!JWYC)sJa&RP8r$_yUkgv82nqt8x%)oq!CG4dkvosBp zYh3T&FP79zp_7eZATJ%9bxHGlvqECHgZ2-BoeLq4}=v21WQfqR$>bXQI92~M#xk} zWl7M^GXg%1FdvRN)L-?P8e<${oIaSxnMN;2Vk@|)-TIjO{wGNElO1@p58P1{91z6| z0vA{^NbdzfLh#swQ0Dl`#!^C%anOK3NJs|fyla3Oegvr{6x`*uUo{WHk0p3bW!T~t zG{OniPI+1Qgiwnsah?3ioEh{5wDW>MNEe4x%7F0~1)s%0wLr{Pq^-1gh4$9S- zE`5+QlSE!Dj2kY!G=${T0YvkPAS_o=2>A&xlA-P8Jc0CRpwHF7$Y>i7=-B!p^y6@Ve%%2uJP>?45e=yh$Qt3<7jM zv3dUJ%g5I7x_7j6^#yOa))5I8K?~-Hg{-#oiumbLF>E%O7PgPtVa*8m)k?8-A&dwN=Up<)vdpm)E<60^NEupf;jG5o>RiWu}-U9-oD`q%Han%0gy8N1-yYZ zs#Fd_=%ML*hWnE6iodgVv>N?7`tou4uM8jV_2kn6d_}RSlI%6INs0~@iq!-Agf(TQ zd~!!`h{$o*09%=R?k=9#M^BD(cWS>gcXG+w?9&&g;aJf>LU88y`l+z|_fyS!iLvHf zT^yfs%Ep2>-*Xjh+mV}nc_4k(*ui4U0`ujpd8+!Y0@hjRC{%Y;yE29BI%QXh7Zx6P zbVCxwwyik8PFhHsS{RP*&40pzUWf#C{U~i*KXv33b>PUQt5YIaR zrc`d^3de4LY|F4qs4t`m^&Iu^PY5cOhhNqPHhmr8&QyuX=k?dyh-V_lGGoOnT^Sl# z#fLC<+2SVk0-cDnrm9ft?O*Ls2p{JP*{8Sy{}WsLPo;|Xf2QT4{6ZxF4TpYuW(%MI zD1aAV5Y{%#-OC-$GM=DQzme-deGv>*LYJH8V$R0JWBe{Bo8fYJ&cn9lKE-8mIG2M= z3^uWA56?1?D1~z@%+!xgRk}9waM_OC*~}HpB*G{@Sq(=+U=>E1(2O43=f`N;s`F3; zOE?oJ%>8azg8I}4VtgcWu;9})usBZ6um`dWPCC@gQrOZ&3l=6w;U9w%O%<`_$>9Q1zyO};Im;w9Gj9V(YBz0?DdwBGa$vvK&lrYMBQGsP|a^)DbpIO z;*75JX*+(8C&>slfQZ3dN}N#IYNnVet7Hv<+tlQqolQJsz55L(N>wfv)%Jt)-}$Pd z=F%gRxerlco$|0GEO)QQl0;lACqPG$G2rnGb~Dy7{3@3c@O zySVS2%YadNg_ydm9@p1IC8qFqXuUyzZ|d(>MbfBJZJR`?w31TKh_08jHA1YDeS;*~?y7Fj!VdeMDU%Yb`I(Cj~>d zNIk>PiPB_WksR$uy@VxpDJWPy!|Md}rh^a9@^1JJK7z_$A_)BAKU${D&S4+8L8SJE zk)_U!vy1KP^W3(uEiOiEcMLfTi+1aIJaRux?&K$W-w^&e7mYz`?zNxm*#DC!{$K0( ze@)+g3WYF1Ww-zwVDlM#({g#^E@G2jQc<`DBtTBe8ZR8gp6AEB=2rT1+`hgeS1|Gi zNpWEWxu8F?8GnNwT_CyMtJ(C#dFIwfCL7x)Tl`}SjD9=d9}>wJepiZ_-+F~F{q=n= z#R~YF_n(O2o94wsq92~={dx*ED@aS$ZY9P#IuaIMu1i4XwRIyYeh&J69rJK38CP8C z06CVzmU{s`HrI**JNA}{gg#tqv?*Gge(oU7PUGk+$3zl!J%cqv>Ln2`#$xIvXLwc- zPWwm-xFcMw(0#?eYCESs*H$tUa3!$L+-*`urI+IFDP}HP-37r>WV)JM|8X%##6%q; z2pg$Zky>Ew5s3->(twe^#gi^TFTb{qON1H{ySP)ce2zr@oYMlQ1{cd)Pe?*n#uoT)=AZcY zfEFm6^BS%T)bU3liwEbx`<{2lq4%Mrl4UX=LQVTwhUdw;r3BLGsIYY%TKNXxa zhz~-uk4g9eMJ2-;#CoCZuP0kiRQ)de$kipF++a(b0X@2bXc#*RKgykjuqJfa=|W!o z^tG7VJnz}w`Td>saMb(_qr@RL!2o4#c9iH}R|tW7@9nV9MXUYagYf?gX8Du}Vt@eQ zXlS65MF?!DuT~jD^B|}t2rA$WnXJwb+vY}x_ovlSQ-#on;4?%I!yBFig2=zHe-=sm zFmmf>-jHN>&IUS9Y@Tm#Er4kdWp-C5>-bwqU~MF0*~LZ*#t)b*y^ZbEg&1rOp4x4M>4PX|n(9O$*H;Hg%&b zpENSA#h}t8k&E6$+h}GLJYDAOB8E7&&-(Bn8CC5+I2 z7_c^CIZHqcZCo6=)kTo&dI{c9R--X#)rV|}SFQ6`C<7{b3Qqst8c_Dp>9tVBRND|A z-jPK68igSO$ig3r8SJVTHN#k4mt|eAkQ)^#7RkjWnu8_m9DI8)}wD~B# zOA&n$83JNc&$5aH;mM_k70Ug5JvlBblUgAIRNU7ikV|ts`*BVWGdOY!QsL)LX&=fW zybP=cjfX~doBtdup+047i6n74^v^I;vN?zDZ(a1@)|bp|)X8ZjTA9P*ykf^vEmsoL z`(*^m%GBgEEf38oHdHU4F{?9OBkKJ#n||$f(Fw$d0!lL3xwepD7mw4`?2>TiQ^&Qd zW9LvG!)IC+Z&H(X3PfnA-r%e$*(UbD_e)6kPSX-7#v4>v<1Pm1VR#K8lhhqRW&g1a zGbUOQ>UcS;ypL4gUWaeFEp`}YYu2L&C0x;_ONeVdef(f!_WWhv>Bu!H=iGm7icnsG z#R1e<-LIz8g@OSreI$Fs`x&)*y(^U;ZZjWJBQxA7Hh-ne@$$mM`n!NubyCEuS8~!3 zaEfd2`;AfBucR({=w?8sc3>WXx@PA7iK2a}Bo;M`r}v9P)Xu;JLX=>EGYS3N2lMKQ zkVJadv6zs+HN;)5{t!;}Hqiw+xNM~%<~7g)jEd(K%^-e~Xf~-+WF*cdX=wXx_2ij? zmpJqLoPCd9mMN+w=H<`EgjBnTBgO3O1e?bYGQs#BOPvs@Vu|`gQK{uu^0WRR%G!ea zT9Xg3hcin}PP_}LwvlOkflyp1BJ*>2=3F-uZP z#X>+YYZ?c~1!%+SV`zEj?1mffYJQHlT zE$hDy9tE>_FC{C;lCE2^>?#-H1YQ&rZJh0Hbuq*ULk-~;}&)BRNqz$tG~ zTz13>7e`ev1cM7LV)L7-%1eoH9r%06LL4^`qpEzx8a$U48c+fFc?EP1>r-i?)yN{b zf`yO{9jWLV($BO_gVXJI{Z0(v5M|LLbmUF4SxC2-j}jmpl??;Xe<+n-bx&no3({0E zSH{h~70tcTFm&%jr2SbFfM~&;h)4*%_NlkpMp~iXM|f6_&r8a-t6)WB)pA=4TrK}j zAs_m;_Dhsx19|*1ocWea5qA+ofL7}hVIw>)@%72>TRl@h##t{=Z3K) z8VmV-q3q9U+VW`oL*eQ2T)bX>%+f~Q5?Ywk{JX*IbFRNGQEAHFiz@RaX(WCBBE5d# z+I`f{ZjSr=w=9`yHQ)SND*lA-va+=^Yk}oP>n<|9;rfTL?`A;KAL~%==N}PJ!#SnY z)@|nwTiAj`zs@;Td>!0nY^z85C zfo_>t_~Mf{fO0tpOdIi+8@MK*Y_5yMmdcZI>Rk;-LB4^-$@`YN!?MGp{E;aZoB&bI z!H*lQ5MRs^2w0?wC&MVY`(29D{jbVz^SnXm+vm$L_P=i;pl$L0No64FM8yG$M+?CB zeM6Dxp0RwRv+WGxTp60uM*+tQ{F^SDGSG^UxUjuI&+i|G#)aY#={d-M==-aN%bx*@ z1v;4AnQK8eNBlzDY`NZYx@~O5`7qgGPwg;xfy8yFb|4&f{JT(Nc@xK}M_HgG&Vf%G zexG&Ldn^@G5l6>l8cK4r16b8}EPPumN0HR5bv@Qi5C=MzFX;(U6kIS#dxVH%FiX4B zy7R2_DobiZElleF-8zuYUgMRY3h(v*R(b!Y{ZlSAfDJg401NSHb+137L=uGa4Z}Ik z=n#yI?GGi}4@G0S3^6(5HF7!UQl1IB*i3tJJ1+QmSBj1X_D`WWr};;c3IV{Cuf) zr)eY_5GW$t8XiX#&?*06C@1+r!ih-I)R`~Y>pH_GojZ5pekMp4sT4PA%%ENeDWg@H zyKeE9V9w~w?mWeeHl-kGCzH`gukRL84W`czgi=`?&w%@2C2ZB4Oe+}5DpG7=$n+}x zhfN=7^~^Ct>t*|uzM;-?JlN-eme!C;(|3xjFPSJhOR|cyF#o$ahkCwFl36!QzF?_m(sq9N zE7j$nbI_O_11GLZ0c-e30|<16>8k7qskU>osONWtTRdd%SxxzvcJTJfJKwxT8aYmO z{FrR=qPV+^s!aS9RW~u1{2+7n6^|9`u({Cd*PUu44M(``&`4d%j)w#Ty+%wN@LITm zdaTi9GzhPb--K%-gIYrr(d0H-ZJBHcoV?!X#T7f)CO85Vdv2JM_ncJBckO8HC5ba4 zMU@|8EH516)iebmit^PQ+{=%{evZNfw#&?|2jeIBPgT;WTjD4(mm0$oajv<12^=iy zAmg;eoJFj-4*bJR$6grLWq$$(P5Yw?$W0ydIh(XT`iz1BQ#{p?fWbCg$%*D_58VpB z_{%OJx!HCsn2=1H`Pk7$J(wkbyEc-{@Y%T}E%KftGiWwk#c}r7HB@92d@J&6O!-rA zts(T13oa-8<-3s7x=--^Vcw z+Wh!}sAdU00b{lDiJwU2x;2vO+Ej$m9T}=k)JYD}lY`;wZna!v9Gh-JiGN{xuY*70 ztdCgfBrBaqB%6Gn$6fkj%(5^vFncGTI852gV`OjP`-&~mhhbS-m3rnNkI~x^?88&) z@owoY@**Fa*gP_yxG-wU;&osow)lsPv*&$WN&sl(c$RJf5n@8sKl4+M?-P%38E5-3 z2VXs!Z+w^{)yh=ifr;Hp$uihAWhmu*{4RVlx3jry3~ z--r~rcxdHbG==q18>EP8*oGjgA%QdiHJZqgOp=Q5Qi?bDBsv)G#0zM+%k^Sn{(#dt z5Vvc}5bcT>UCV_fGc}wDm6bK$#@F>jR&~FP@8A1_vyh3HZWN^U%?yqjGm+EOM7g&G zjz^^!Yq4dQ&qJg4s{Dx&_zUE)ddVIt=8P@QQq@@{7wiS^XE6A917V*f-_l_-e}tYq zwm_*POWwC8R{a(bDKtRrSbYpJquUlUoxpWd@nnJt3=}#z2gpK+E7j*(qW=amt{xhM zXU}61TY$^)zSO9`;Rulw9z)C-(>W4Ixl{&rAJ$pGyD2O$P1~sekzX<;=)u@-TAuiz zfHk|s*KB=bG``T}hS3g+T-}n_g-W(r4AH)>t~QIG``Cr+(Y2+S3w?~hxuBj^Xjq8m z$pZ5u5NL)VpGUCobrwTf>s`13`-;xn6UVkpK^wSLv@ji}*XfOhQ)~AgU2Cn5#>#KP ziMDqQEPV>Wk*fse8%s*0+z|=|yiw^s<!h>|MAh_#@UBw)RfHsi6~yE3}3`5E&Ag=3{X;fEq-vro3?hZ{=L8@1S6Rh zGVBc(CI8#WB-jQA`6!)fbUUwdeV4x7?-M&%q}!y69QYU@01M3QW>3A0iGcO{E5|zv zl1+MdV{_6Eup(FWF>=SSymhVJPO6|=9yj#j;qY>n1iuY~3kx2=ba;v|RB$=&+$jgM ztnnlGNLB#l2ph|yMZLO{sI{o9Y05 zqT&i~*S4)i`+@V9bheH!ljpa9mn;eHk-J#(u13n8>kn{Dbde|8IrJv-yy7>!J-dVx zby=8rCC^a~6rLLMsJnA8J464!r_!C&rjRBOoea2E-RF!!VZYogdR(G7Qk=lGxJpa| zP4aq^Ob^YQ2gqgi=u>S~O_+;>c;gu}KPKSP;npl3EsYT{1Byb~L6`1frj`vs8xt$K zN00>t0d4UIyE=lP#}WJ{mgY_{4u^x=h`4aw@cj|&S5OTz01JqY&|WB^xszIO5t)h~ zfsw)RClfP~(t7aRj=3(3#dc59B&pB_KIWO9@?t@h2=#V`M%qy(F*ulEU)_7z#sgeG zmb=l(jH544ib3zh_2p$_s(wYVD|umoMe*51%|cdu!s>8weZXcgiX-Sr*lk(2G$XB` z)qIp_12ba6GZ$!=4l^<2*<<@vHD&q~M1D9L1t&wDhUrL@xik%7zQJ#}=#(0q@1`PW z+3nV9JJ}e~OMjMMT7sOqg%x`YDL$uFi3ObJesVi$M`aD1`qp6%IJs0L zf-1pf^uj(Km81H_TB4{~B>btm*o!7JHc_Q$@!_N06wI3?+@IJZwjGrlM*ef0ZRNi8 zv@SCrX0=XbNuY7!wwgiZcbOxe83cIE^%p3bwVO|t)N6zHRk!6YoULjE#S)|b$Wb}@ za(}4A^aIFG$w{PP)eY&V+?l0bCJCN{`9q;>o?$B+^~ZGiJPk<>`j6>~`Cbe7F6vEv znr?A{`j6ChuBhyNvzfdV44qRftm_Tif*?pxwthh41VaPgq8Qev0@|Yz(-)lhA zFUbwrp*1{elJnV4nKu8kGU>3}1}XEb1x~bY#bUy^(-KP-T^FGHnjlRbp95#w%@{tb z>{$dvA0CejI&cxFi6q-@j7k}|k*GG638cQo35!rhqDN_o%k>3+exRei%<9RPp)P9& zP_o2eE`S_^bdxk0_axftnc9NY+(Jt+YB;d#+z9Zug#S|5HfShZTt;1TuFBAdSf&lw zx6Sd!2!MXm?8_%Rt!X(iV>t7-wt>7fVFen-!yS1j)zsG`=P>T}wu>OE7o z^0us1P&%AFjFodaO2Rj5ey87aP}u#ATUu#(aF2c+o2)rxe99of`>_cPwf1>wXOaLy zRJ8mQw~tXN;VqWuSSd?bP+G=-DT{=fl%P>#^P%0-m#ioYg{m@>!n`9nhwuB0<>TF~ zW8TynY9;hFpZ6FvAo@I5o42{6+)-?6+Tm>$xGz74>)zEWy*MbX$o;jSS12idrrJ2l z)((Po;j!Rm3=F8B+Kh`_+tf)x0keTYR}j5v-~uj65y zV+G3|?NhutRJA3~imujK5L%1wrK^KM!CmXDZ^~&ZOm?}^m9Aj+Lyk!8?6@xH6wVgt zSMy_U@~_|Cvi_t7MnS;KTWo!U+mtb>p7o|7(zmE%XrQ%Yirz~WSkORi)==1%0o|m_ zHjF<-di*l#j)HS0O8~~Vn&Ja1c4=(+DN&dVhL&VoYa~&(f)i5F;6%lvWc^grKiG&Vb#8O{!A(p*XP zB;pygl9Bw`HuZOENY>l&5Yq1lnh-_=rsGW)L2eHU-*~?So&+k)>-{y*arJ4%mv_;L zdC{4hlVl=*xerNb!padc2*+%s!*ILw2?9=jn<%r-*MngA2GHFVm}tB3x{`~$&A>kr znbr4r&FmK}d2PZU`FM@v7eW>8pdC7{cfQ+{$(kXaWiM2G&?*j%Gd_BPH$8iTrkE--C~}FhN+ltM`fr7#_L#t$|Hh0k_@aySc9`x zsJ@x5fNl~0oLL4&J_Rzj(c;I>iTe7>v7Vvlaf#0w-bC;g>T?N}lL^@gIau?g6 zyrwZqqd)#Anx`!M&CCxJR$?4>80CJ?BF^fsZayfX4JH1?Tt(46Xm?@bh}lFvR1;2c zE-@1~SC)0ANZStt3JvXJB}z*tNt5{TcrZw88FSPOvCu}a(6ZoS4&Z1F5}V0MaIrO0 zTgzY_&7C-p91Vv!*WT`drbX*A!zf(KWeR0}yHntE1WI@h@RL=g#LVZSXX*|=?lVBWJDqltJP1m=Lf5QDR+4%u|pfxxEw4Jq0SWuP~m1Rq`k#J&B z7>G!t8xDETWjUA4kDDVv=w^?iWVi!A+ckv!u zezDWmcrYF*?f3^nypLPUT*-|*U{|0YcY?CO_DM(r=%jp8} z-08TldYWhtY>FH&mfp*iHo=`+PIP{uk+xO1Oq?b?f;W4>Qe1>I>lWZxI2-{~?&UXz zcFeYOpN^O2=oZ)73S=ZdUt=!qH!SU|V9dOqP(OE??pL%HsX8-MM35PXL9pl)2EwPk zY-i5fjh5CJpB~6=_%WQ~vWpQVda?b06C2cTa{*@uZVWs-7D?xcn!{4F+fJ#%dz#@- zd?n`k13QX`%lr+jBf8@QUsFda#HmgtT*h&s#($8(6zVOZN*>HlFqptA?eVe@B|5dD zzivU#MYj5~SYftgVxh}Lq*{I!;?BzXitTW7X$FP)c;NE5s&a_bai^WnhI!@qMf67EGq}wsFV%#b5SoI46)saOHc&rCFw>ZOVS>U;3O+Q#RE7EiTYzGk#8*Pu z3GkP|!ZZmuBf`>6j%mR&B^`2WYgD93&G>x-W!SUKhVEdjEm;@Pe`l!2odUQf9j4GV z4_^vyA)fO48urFvA=_8TJ&R*zNtOEAuEr6v$C@cqtS-6<1&s@}2M`5r!l)rkpy4ED zIfWP<0?P$i(>~|7#L{->J(qA=={h?vY)`VO=02S*_x^4R8ouxjBT5^a3eS-*(n~@+ z16cat@r-jl|0D&8x%<*=z$}PwKEJjCtqxioUXFgW!HX)69sZdm*;yAWH*v11GY%G zz`AzulG5$nScT-v+1Dm6(jQNd1n_<$eM*lQ^xrvcPCrQo*;zwtFwyMyzfRmU z9ySHO72TU9iQg0AZRM^4eGBCf-~&*92fzRuZ$rU|M94<3VF$Mzu~6$_R^4;Yb4?m! zE)7uNKCDys!;$CKm=O*4?cv6MJr2u#Q3wO0lrE0>qH6`tjRMUr@3afsqm16u%iL2z zUh)o))1Mdw-bwXs^s1{GA&2EwI-k~+{PFV%(+%mL8}Ayu(5bGi^k$zXSl{@FHGtH12k& zMS0&qP)`u_V1ppmCx}=erO7l^q%#7W=c_p>6~hTm^#o=8tl1k}m;@T`TD;m{l>~UG z*`LLBRj|5W6RPSVABL<2V4&v$R?)dn?)NXK#$P<$o8RDaNoY#PuB)udUmG_?{sE&?ooe(xg)$ zxn~F>pkwH`bcYy#3}*lg5yq9E&nRFqcXC!_1|7@t@j5poes&_t#dNVnvQGVuE z41tmBey6W!_5{fD1%eWsa|x990zrTnx`r25V}!`nIj1~V3mW_U2`KYd!50+PI;yJ; zPoDCq?_2@NVR%Tfx5d4dlQ$Ac)Kx@%r#J5qrs$EJ=QS*r+)v14046gmZrESWMuXy3 zJ}H2Qp{V2VP)bd=p+~c*O8L6+{mQR*3aOF zFJO$1^|as%wmt+y03|penWQ{cz^*>*=xhM|FtG%Wt;<9Dx%}o3ooAPw$7#@NEHx=O zM70kb^Mn|l9yvnqiIwHnPwM&m&bm4b^Da{QVFbJjVQrrp26l<_x0gg^8{`caV4OTd z>12QP^URGJAdLZVyoF|a+)>2VUBHF%51|uucZQ??^iaF83L1!4&%Ctt2yTdV@S_%! z!T!WmOthc9glL~>$TWtUrWA4AaHm9(#hTizpb^eZbM-9y7zOj)(2oTQ-5P#giV_=l zrg_Eh+u}jA0t5f1Qtcz*`@zA$4hVxgz`8%Vye2eua0hyGN9Ir$eCg=XSYUa1AuvG6 zm07?QE(`R?NjLDM`I|j?Xd{ACH2LG2p{V9}b`8sP_+r&vi_l;DJ-qcJs>yuHCpamg3zN!PTy<}Na8>Be;EZ+;G#Uz|6khDf9bZ^ zfmKQZ3gE&hzT-<^*@48lQZ{)Q_Oi0{?40D}I7woNf1RQ{yw=mYpbmsqQY~fa-@qQM zcVk(m2nR&?OxXB-2yS*}c|QAiLDxoG6Ty))6xtTXqf+aa#wTRozSeJaeI151ebC+F zcm*H5kCsQ$+Na;Qo9Myfb_fgrFb!Mi105J%_Y>7az3L@Hb&86AOHutMj~zXBoZ~7a zY-bJ7=TqfUnkcFjAg$UUf-969!@s3V2QRxnlnBf5LNSA9SSl&l$(4Cgbrp!AZv>b0 zBrMv1RS2SSz6=GgTKp(m#TycloA6qJ$*112tR)5CfZV>fWvj< z!{Ru)qpw4XaAT38^gyELlLr?p@~&i=hS|EMtgL)HH$t{+vb52$s}MLB{;`T?iXD)m zy=HB5VR!ZV>uPaz@#W;IE6tWOLt0bgMe;G0>*^_MYwPOoruXYIo5d8EWiJ~hwMbns z8g3D_i6tEHge+j-df8A_2m?piq&zRxnj1x3j>8lhz+nU}(w+ysT9A&%=Dk~7Jd6f# zCM!o%kKQ!pmq&okIpNKXq75i46NlLN&OdUWG+w&>o%|>2PDsOPY`#nT(A6YH`Y zrdlY>8*c6qSvha-J)sTO^U{i~Z8b!S?XMSr6{fbk70Rl_c(cZ${MtI)#-N4YQya7< z_{}OlNs3a@iRf~3yNMh`vO^;4wLMr>S#dHkr4n&4zeFXd+~Q({Hml}Vd}eps+Mx@cL-rsqX6Yc=Q3u2_^Ds3SSnwLAVV`ONIMbc9qJ<_HK?#>EJRT`9dcX@vSam9*J0u)8kuL4>Y{7NF(?3f?9d@TlZG}@v z%`7ZJDoaigHO3v>55S%_$5N|{LyI;yZXNB|)|%*w7ZsqIk|rEwGTJxCeIYxC}g zTQh_jItymc6XYHG1=^E!oo0{2gCT^!l43U!H_~DMw4S@!{4nC()uStzYorzbQ4ysi z@i%TIk-DgKIaOCVOL++OMJHQ`>zeBKa-<)985HYudxC!Q3rGE8aM|JHlgwHB>lrO$ z9{8JraAbD5Hm+ICzs0qPniRBvWHp-s?%zE?QSQ!7u2ZIkQWPO?h6&e1p@>jf!fuRh z4oNwIS1_Y5U;0VIZn+$*;;-{)B;A;@(CSF^rG)7B$eyU}+PD?2nvjY}YK(goXDSc} zG1#n7(kn_*1`zey(u3wKR;45ivVErHdE;8(>c$Dj>^U7l_GgdTVGb3*Y=ZFez{dV~ z_Gt&V6VW8>p!A}qLOtY)x6QJ_`K-}+u!Un4DMY(y#;iz%ZevRyTZNQVR6n;CEVn-> z*ip85CXPDH9Y^5n3V)*RK1e5~4{6U)-Vj8RM`IC^34ZxSvSVg}gNxFnyMHU$bO>zY z!YdD!m?E^43&=mgBfVq=lINE%sfzTIZ^@r8L$PvQSvUML49NmCC4wFV(s4(1QM}+E z`&a^;6@F=*fj&A5wJ z?hI#Qgz0Lxa6~o!%9xv7-snUF2wRc%v`N~qozah@BOjx9E39iECZYYV9NQ1|TXW1G z+8zz*TveS~{TWT2T9W?6_V#EDH_;VS=(udiriP+jsZWLz$*b;h0W|jAAL2*6$giZ{8TtsC;L0xC1hIwjv!x7Otl(?VA2&8J3BTFH9J zSPQ!5H2NIgBu(ye%F_-PUv8d1=2=rCR}>)(+O!r&_i_eyB^vrnT~X9APE>j;(GR5w zQrFJk>k$%yfh@Y&paQgPb4`9enyg?fmUNn^KVYi)p&yPwi7veNA7nT&D&4Sq?2MCm zIk}Dycu-kUv^R*k(mon1Tk4ggzlFZ--Sg~4YwabnZzgfb&$NbrcuL#h8JbX&2>720 zh2Q~2;Sv5?)LCxP=q3d23&EA$uw!8dJWl2N5i2pYP^uU9yk#d~_`I*qV(7lF)?=tY z*%V=<|INMyVrai*M`A3#2vlPP`YD*f+wB#W;*^xy_3K(g6m~{zTMmI&4j4Nzf17Ij zDs=(P>P^;+ZiZdm$B1_^Xuj^x09!zajP@v(vcnzC=6~$ypLXmR{!=VANQd5wU=eL* zuO}svD6Cobj=MGC*wJHLJQhNS#EU=~bnM7X=cxV!R5U-sn?B|>I%4ckOb$UT^*T4{i-9GoL+jYUzS~Z-E$XuU+#2AhQgc^dd1`^{8um6k ztMAbMrGAJF5|>3+FE~_EabY=bh=VjTT30+mQHcs=MR>QSm-M`F$pqP_RlZc$IAZea zhQGo#kVKgQeSr#U*21p85;tbJpIrs%f!zmfQmfi0k{bM}@xmtDoZJ2ZeMJMgDZP%Z&O`0CG3LBo4=Rje=pi# zzb~3xjpT<&QoPY>60MP-R2sLK7FOQ+47H7jR(7))zg@=V2`w7S#@wL^Pj(Eq*J`97 zUvzz%j*}7ZagXf`|99sz!jQ^I%!Ev}5eZ3>UR@FsHuz`yN#B?+4Yi7PB;!)yXM#yl zKpn>pvgi)^y=cJVHG|c^xStx@Cf+=kmEN78<_wogS_M_Wgo z&T~uvlL%CDi*Xor^rS`MvTl51I=dK6bxwLQv~=+acf8^ zhS=l%U-7$LT6Zzy zrz%f{@V`*9|CASfx;T*lv*d-pLkOc(PEpE7iD13?hh^FY2lIcW_JBn=gxa&U*l^99 zNzbIp1e11Z}XRmYnS|(oMS0rfE)=8 z9iKRu_@HZA;XXzCYWG~-NQ#>8Z{CXalEeM{0k~29jW4s)mNtp5dRDVNl4IZ96z-YH zS$b2Ug#leAI@ZUkaI234Pe(nkM8p9HEY!QAVUnvqTj{xIRD*nsWE$?l)4zRn?C#NG z>!*SW@Y!4cZ;k(dPNn}Vmqt+oU;v-p(bX{C_1k5oO4x(zldFsa$n9`Bh10be;%6kHMg9C><@LgjpVJNZMWV}!X2KC(xqqZfcC45M~Rz( zNHcotmdKYAt@Xbsm0yX;(3wDJ5^@U}1DV{th6)goDIJv{T#Y;pn);x+Fk13{` zE6-9WEBdmSXMkY{Au72n+76WdbgMOr`?R-p8aF?dSwtMA#_CbGO{~?UzBGhQ59!=X zLZY!~(_=-a4j-39br&*U zcOMIku+JXO+w@#K_0}>_jAtrs5so9#0tZlYO2bM=GFDsG)-gPuE)T2*56|6-RSM0r zbJVAET2puSu~oFBWqsK5FBK^ph^FtiG;qDCqYe`OX%bx1kKIcON(QZ`zSx@vw;%F$(?G!L{bfdO4705GlE u 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 QYwsFy>46XuNv$YI^i~ndl45+h!4EVbE@?Cpf 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 diff --git a/skyvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java b/skyvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java new file mode 100644 index 00000000..1649da53 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/detect/DeidentifySourceType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code deidentifyFile} on a skyvault vault: base64 content, the skyflow id of a file record already in the vault, or an S3 presigned URL. + * Also the {@code getOutputType()} of {@code DeidentifyFileResponse} and {@code GetRunResponse}. + */ +public enum DeidentifySourceType implements DeidentifyFileSource { + BASE64, + SKYFLOW_ID, + PRESIGNED_URL; +} diff --git a/skyvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java b/skyvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java new file mode 100644 index 00000000..df8e5bda --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/detect/ReidentifySourceType.java @@ -0,0 +1,11 @@ +package com.skyflow.detect; + +/** + * How the input file is supplied to {@code reidentifyFile} on a skyvault vault: base64 content or an S3 presigned + * URL. Re-identification does not accept a skyflow id as the source. Also the {@code getOutputType()} of + * {@code ReidentifyFileResponse}. + */ +public enum ReidentifySourceType implements ReidentifyFileSource { + BASE64, + PRESIGNED_URL; +} diff --git a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java index c78fb6ba..3c1fad5f 100644 --- a/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/skyvault/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -2,6 +2,10 @@ import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.detect.DeidentifyFileSource; +import com.skyflow.detect.DeidentifySourceType; +import com.skyflow.detect.ReidentifyFileSource; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.errors.SkyflowException; import com.skyflow.utils.Utils; @@ -36,6 +40,16 @@ protected String resolveVaultUrl() throws SkyflowException { return Utils.getVaultURL(getVaultConfig().getClusterId(), getVaultConfig().getEnv()); } + @Override + protected DeidentifyFileSource toDeidentifySource(String wireValue) { + return enumOrNull(DeidentifySourceType.class, wireValue); + } + + @Override + protected ReidentifyFileSource toReidentifySource(String wireValue) { + return enumOrNull(ReidentifySourceType.class, wireValue); + } + @Override protected String getSdkMetrics() { return Utils.getMetrics().toString(); diff --git a/skyvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java b/skyvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java new file mode 100644 index 00000000..65ce17c0 --- /dev/null +++ b/skyvault/src/test/java/com/skyflow/detect/DetectSourceTypesTests.java @@ -0,0 +1,39 @@ +package com.skyflow.detect; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class DetectSourceTypesTests { + + private static List names(Enum[] values) { + List names = new ArrayList<>(); + for (Enum value : values) { + names.add(value.name()); + } + return names; + } + + @Test + public void deidentifySourcesOfferedOnSkyvault() { + Assert.assertEquals(Arrays.asList("BASE64", "SKYFLOW_ID", "PRESIGNED_URL"), names(DeidentifySourceType.values())); + DeidentifyFileSource asSource = DeidentifySourceType.BASE64; + Assert.assertEquals("BASE64", asSource.name()); + } + + @Test + public void reidentifySourcesNeverIncludeSkyflowId() { + Assert.assertEquals(Arrays.asList("BASE64", "PRESIGNED_URL"), names(ReidentifySourceType.values())); + try { + ReidentifySourceType.valueOf("SKYFLOW_ID"); + Assert.fail("re-identification does not accept a skyflow id"); + } catch (IllegalArgumentException expected) { + // not offered + } + ReidentifyFileSource asSource = ReidentifySourceType.PRESIGNED_URL; + Assert.assertEquals("PRESIGNED_URL", asSource.name()); + } +} diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index aaa97250..ce2df513 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -1,11 +1,11 @@ package com.skyflow.vault.controller; +import com.skyflow.detect.ReidentifySourceType; import com.skyflow.Skyflow; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.detect.CheckGuardrailsRequest; import com.skyflow.detect.CheckGuardrailsResponse; -import com.skyflow.detect.ReidentifySourceType; import com.skyflow.detect.DeidentifySourceType; import com.skyflow.detect.DeidentificationType; import com.skyflow.detect.DeidentifyFileRequest; From d64bd0b6fcac5533801b7d46a810e8fcc7fff0c4 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Mon, 2 Nov 2026 12:37:30 +0000 Subject: [PATCH 39/41] [AUTOMATED] Private Release 1.3.0-dev-4cc5c0fd --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 406de105..83f5cb62 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.3.0-dev.74ba33fa + 1.3.0-dev.4cc5c0fd jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language From 1b7228dd2149c16f590140a48feddd05b0432b52 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 3 Nov 2026 15:16:57 +0530 Subject: [PATCH 40/41] SK-3175 update options according to sdks --- .../skyflow/detect/DeidentifyFileRequest.java | 3 +- .../java/com/skyflow/detect/EntityType.java | 2 +- .../com/skyflow/detect/RedactionLevel.java | 115 ------------------ .../com/skyflow/detect/RedactionRule.java | 26 ++++ .../com/skyflow/detect/RedactionRules.java | 36 ++++++ .../skyflow/detect/ReidentifyFileRequest.java | 18 +-- .../detect/ReidentifyStringRequest.java | 12 +- .../detect/internal/DetectRequestMapper.java | 25 +--- .../skyflow/detect/TestRedactionLevel.java | 89 ++++++++++++++ .../internal/DetectRequestMapperTests.java | 8 +- .../internal/DetectValidationsTests.java | 14 +-- .../internal/ReidentifyFileMapperTests.java | 8 +- .../ReidentifyFileValidationsTests.java | 20 +-- .../controller/BaseDetectControllerTests.java | 4 +- docs/api_reference.md | 16 +-- flowvault/README.md | 2 +- .../com/skyflow/detect/RedactionLevel.java | 96 +++++++++++++++ .../skyflow/detect/RedactionLevelTests.java | 27 ++++ skyvault/README.md | 2 +- .../com/skyflow/detect/RedactionLevel.java | 99 +++++++++++++++ .../skyflow/detect/RedactionLevelTests.java | 28 +++++ .../controller/DetectControllerTests.java | 13 +- 22 files changed, 469 insertions(+), 194 deletions(-) delete mode 100644 common/src/main/java/com/skyflow/detect/RedactionLevel.java create mode 100644 common/src/main/java/com/skyflow/detect/RedactionRule.java create mode 100644 common/src/main/java/com/skyflow/detect/RedactionRules.java create mode 100644 common/src/test/java/com/skyflow/detect/TestRedactionLevel.java create mode 100644 flowvault/src/main/java/com/skyflow/detect/RedactionLevel.java create mode 100644 flowvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java create mode 100644 skyvault/src/main/java/com/skyflow/detect/RedactionLevel.java create mode 100644 skyvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java diff --git a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java index 94393e4a..914989dc 100644 --- a/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/DeidentifyFileRequest.java @@ -46,7 +46,8 @@ public static DeidentifyFileRequestBuilder builder() { } /** - * @return How {@code value} supplies the file: this SDK's {@code DeidentifySourceType}. Required with {@code value}. + * @return How {@code value} supplies the file: this SDK's {@code DeidentifySourceType} (skyvault: BASE64, SKYFLOW_ID, + * PRESIGNED_URL; flowvault: BASE64, PRESIGNED_URL). Required with {@code value}. */ public DeidentifyFileSource getDataSource() { return dataSource; diff --git a/common/src/main/java/com/skyflow/detect/EntityType.java b/common/src/main/java/com/skyflow/detect/EntityType.java index 99cbbd8a..82cae959 100644 --- a/common/src/main/java/com/skyflow/detect/EntityType.java +++ b/common/src/main/java/com/skyflow/detect/EntityType.java @@ -1,7 +1,7 @@ package com.skyflow.detect; /** - * Entity types Skyflow Detect can identify. Also used to target entities in {@link RedactionLevel}. + * Entity types Skyflow Detect can identify. Also used to target entities in {@code RedactionLevel}. */ public enum EntityType { NONE, diff --git a/common/src/main/java/com/skyflow/detect/RedactionLevel.java b/common/src/main/java/com/skyflow/detect/RedactionLevel.java deleted file mode 100644 index b10d1806..00000000 --- a/common/src/main/java/com/skyflow/detect/RedactionLevel.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.skyflow.detect; - -import com.skyflow.enums.RedactionType; - -/** - * Controls how one group of tokens is rendered when re-identifying. Supply exactly one source (entityName or tokenGroupName) and exactly one replacement (redactionType or redactionPattern). - */ -public final class RedactionLevel { - private final EntityType entityName; - private final RedactionType redactionType; - private final String tokenGroupName; - private final String redactionPattern; - - private RedactionLevel(RedactionLevelBuilder builder) { - this.entityName = builder.entityName; - this.redactionType = builder.redactionType; - this.tokenGroupName = builder.tokenGroupName; - this.redactionPattern = builder.redactionPattern; - } - - /** - * @return a new builder - */ - public static RedactionLevelBuilder builder() { - return new RedactionLevelBuilder(); - } - - /** - * @return Entity to target. skyvault vaults. - */ - public EntityType getEntityName() { - return entityName; - } - - /** - * @return Replacement rendering. skyvault vaults. - */ - public RedactionType getRedactionType() { - return redactionType; - } - - /** - * @return Token group to target. flowvault vaults. - */ - public String getTokenGroupName() { - return tokenGroupName; - } - - /** - * @return Named redaction pattern to apply. flowvault vaults. - */ - public String getRedactionPattern() { - return redactionPattern; - } - - @Override - public String toString() { - return "RedactionLevel{" + - "entityName=" + entityName + - ", redactionType=" + redactionType + - ", tokenGroupName=" + tokenGroupName + - ", redactionPattern=" + redactionPattern + - '}'; - } - - public static final class RedactionLevelBuilder { - private EntityType entityName; - private RedactionType redactionType; - private String tokenGroupName; - private String redactionPattern; - - private RedactionLevelBuilder() { - } - - /** - * @param entityName Entity to target. skyvault vaults. - * @return this builder - */ - public RedactionLevelBuilder entityName(EntityType entityName) { - this.entityName = entityName; - return this; - } - - /** - * @param redactionType Replacement rendering. skyvault vaults. - * @return this builder - */ - public RedactionLevelBuilder redactionType(RedactionType redactionType) { - this.redactionType = redactionType; - return this; - } - - /** - * @param tokenGroupName Token group to target. flowvault vaults. - * @return this builder - */ - public RedactionLevelBuilder tokenGroupName(String tokenGroupName) { - this.tokenGroupName = tokenGroupName; - return this; - } - - /** - * @param redactionPattern Named redaction pattern to apply. flowvault vaults. - * @return this builder - */ - public RedactionLevelBuilder redactionPattern(String redactionPattern) { - this.redactionPattern = redactionPattern; - return this; - } - - public RedactionLevel build() { - return new RedactionLevel(this); - } - } -} diff --git a/common/src/main/java/com/skyflow/detect/RedactionRule.java b/common/src/main/java/com/skyflow/detect/RedactionRule.java new file mode 100644 index 00000000..19d20716 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/RedactionRule.java @@ -0,0 +1,26 @@ +package com.skyflow.detect; + +/** + * One re-identification rendering rule, the element of {@code redactionLevel} on {@code ReidentifyStringRequest} + * and {@code ReidentifyFileRequest}. Each SDK ships its own {@code com.skyflow.detect.RedactionLevel} with the + * pair of fields its vault type uses: skyvault names an {@code entityName} and a {@code redactionType}; flowvault + * names a {@code tokenGroupName} and a {@code redactionPattern}. Only those classes can extend this type. + */ +public abstract class RedactionRule { + + RedactionRule() { + // subclasses live in this package, one per SDK + } + + /** @return the wire {@code entityName}, or null when this SDK's rule does not carry one */ + abstract String apiEntityName(); + + /** @return the wire {@code redactionType}, or null when this SDK's rule does not carry one */ + abstract String apiRedactionType(); + + /** @return the wire {@code tokenGroupName}, or null when this SDK's rule does not carry one */ + abstract String apiTokenGroupName(); + + /** @return the wire {@code redactionPattern}, or null when this SDK's rule does not carry one */ + abstract String apiRedactionPattern(); +} diff --git a/common/src/main/java/com/skyflow/detect/RedactionRules.java b/common/src/main/java/com/skyflow/detect/RedactionRules.java new file mode 100644 index 00000000..9a9817d6 --- /dev/null +++ b/common/src/main/java/com/skyflow/detect/RedactionRules.java @@ -0,0 +1,36 @@ +package com.skyflow.detect; + +import com.skyflow.generated.common.rest.types.RedactionLevel; +import com.skyflow.generated.common.rest.types.RedactionLevelEntityName; +import com.skyflow.generated.common.rest.types.RedactionLevelRedactionType; + +/** + * Internal: turns an SDK {@link RedactionRule} into the API's {@code RedactionLevel}, which carries all four + * fields for every vault type. Not part of the public contract. + */ +public final class RedactionRules { + + private RedactionRules() { + } + + /** + * @param rule a rule built with this SDK's {@code RedactionLevel} + * @return the wire representation with only the fields the rule carries + */ + public static RedactionLevel toApi(RedactionRule rule) { + RedactionLevel.Builder builder = RedactionLevel.builder(); + if (rule.apiEntityName() != null) { + builder.entityName(RedactionLevelEntityName.valueOf(rule.apiEntityName())); + } + if (rule.apiRedactionType() != null) { + builder.redactionType(RedactionLevelRedactionType.valueOf(rule.apiRedactionType())); + } + if (rule.apiTokenGroupName() != null) { + builder.tokenGroupName(rule.apiTokenGroupName()); + } + if (rule.apiRedactionPattern() != null) { + builder.redactionPattern(rule.apiRedactionPattern()); + } + return builder.build(); + } +} diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java index ec83adba..82b1aff4 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyFileRequest.java @@ -11,7 +11,7 @@ public final class ReidentifyFileRequest { private final ReidentifyFileSource dataSource; private final String value; private final FileDataFormat dataFormat; - private final List redactionLevel; + private final List redactionLevel; private ReidentifyFileRequest(ReidentifyFileRequestBuilder builder) { this.dataSource = builder.dataSource; @@ -28,7 +28,8 @@ public static ReidentifyFileRequestBuilder builder() { } /** - * @return How {@code value} supplies the file. Required. + * @return How {@code value} supplies the file: this SDK's {@code ReidentifySourceType} (skyvault and flowvault: + * BASE64, PRESIGNED_URL; a skyflow id is not offered for re-identification). Required. */ public ReidentifyFileSource getDataSource() { return dataSource; @@ -50,9 +51,9 @@ public FileDataFormat getDataFormat() { } /** - * @return Optional per-group rendering rules. + * @return Optional per-group rendering rules. Built with this SDK's {@code RedactionLevel}. */ - public List getRedactionLevel() { + public List getRedactionLevel() { return redactionLevel; } @@ -70,13 +71,14 @@ public static final class ReidentifyFileRequestBuilder { private ReidentifyFileSource dataSource; private String value; private FileDataFormat dataFormat; - private List redactionLevel; + private List redactionLevel; private ReidentifyFileRequestBuilder() { } /** - * @param dataSource How {@code value} supplies the file. Required. + * @param dataSource How {@code value} supplies the file: this SDK's {@code ReidentifySourceType} (skyvault and + * flowvault: BASE64, PRESIGNED_URL; a skyflow id is not offered for re-identification). Required. * @return this builder */ public ReidentifyFileRequestBuilder dataSource(ReidentifyFileSource dataSource) { @@ -103,10 +105,10 @@ public ReidentifyFileRequestBuilder dataFormat(FileDataFormat dataFormat) { } /** - * @param redactionLevel Optional per-group rendering rules. + * @param redactionLevel Optional rendering rules, built with this SDK's {@code RedactionLevel}. * @return this builder */ - public ReidentifyFileRequestBuilder redactionLevel(List redactionLevel) { + public ReidentifyFileRequestBuilder redactionLevel(List redactionLevel) { this.redactionLevel = redactionLevel; return this; } diff --git a/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java b/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java index 23626297..acabf2bb 100644 --- a/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java +++ b/common/src/main/java/com/skyflow/detect/ReidentifyStringRequest.java @@ -7,7 +7,7 @@ */ public final class ReidentifyStringRequest { private final String text; - private final List redactionLevel; + private final List redactionLevel; private ReidentifyStringRequest(ReidentifyStringRequestBuilder builder) { this.text = builder.text; @@ -29,9 +29,9 @@ public String getText() { } /** - * @return Optional per-group rendering rules. + * @return Optional per-group rendering rules. Built with this SDK's {@code RedactionLevel}. */ - public List getRedactionLevel() { + public List getRedactionLevel() { return redactionLevel; } @@ -45,7 +45,7 @@ public String toString() { public static final class ReidentifyStringRequestBuilder { private String text; - private List redactionLevel; + private List redactionLevel; private ReidentifyStringRequestBuilder() { } @@ -60,10 +60,10 @@ public ReidentifyStringRequestBuilder text(String text) { } /** - * @param redactionLevel Optional per-group rendering rules. + * @param redactionLevel Optional rendering rules, built with this SDK's {@code RedactionLevel}. * @return this builder */ - public ReidentifyStringRequestBuilder redactionLevel(List redactionLevel) { + public ReidentifyStringRequestBuilder redactionLevel(List redactionLevel) { this.redactionLevel = redactionLevel; return this; } diff --git a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java index 1039c791..9e2b42cf 100644 --- a/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java +++ b/common/src/main/java/com/skyflow/detect/internal/DetectRequestMapper.java @@ -23,7 +23,8 @@ import com.skyflow.detect.Media; import com.skyflow.detect.ObjectEntity; import com.skyflow.detect.Pdf; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.RedactionRule; +import com.skyflow.detect.RedactionRules; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ShiftDates; import com.skyflow.detect.Transformation; @@ -57,8 +58,6 @@ import com.skyflow.generated.common.rest.types.EntityTransformation; import com.skyflow.generated.common.rest.types.ImageV2; import com.skyflow.generated.common.rest.types.ImageV2MaskingMethod; -import com.skyflow.generated.common.rest.types.RedactionLevelEntityName; -import com.skyflow.generated.common.rest.types.RedactionLevelRedactionType; import com.skyflow.generated.common.rest.types.TransformationShiftDates; /** @@ -410,27 +409,13 @@ static ImageV2 toImage(Image image) { return builder.build(); } - public static List toRedactionLevels(List levels) { + public static List toRedactionLevels(List levels) { List result = new ArrayList<>(); - for (RedactionLevel level : levels) { + for (RedactionRule level : levels) { if (level == null) { continue; } - com.skyflow.generated.common.rest.types.RedactionLevel.Builder builder = - com.skyflow.generated.common.rest.types.RedactionLevel.builder(); - if (level.getEntityName() != null) { - builder.entityName(RedactionLevelEntityName.valueOf(level.getEntityName().name())); - } - if (level.getRedactionType() != null) { - builder.redactionType(RedactionLevelRedactionType.valueOf(level.getRedactionType().name())); - } - if (level.getTokenGroupName() != null) { - builder.tokenGroupName(level.getTokenGroupName()); - } - if (level.getRedactionPattern() != null) { - builder.redactionPattern(level.getRedactionPattern()); - } - result.add(builder.build()); + result.add(RedactionRules.toApi(level)); } return result; } diff --git a/common/src/test/java/com/skyflow/detect/TestRedactionLevel.java b/common/src/test/java/com/skyflow/detect/TestRedactionLevel.java new file mode 100644 index 00000000..5a2cece9 --- /dev/null +++ b/common/src/test/java/com/skyflow/detect/TestRedactionLevel.java @@ -0,0 +1,89 @@ +package com.skyflow.detect; + +import com.skyflow.enums.RedactionType; + +/** Test stand-in for the per-SDK {@code RedactionLevel} classes, which common cannot see. Carries all four API fields. */ +public final class TestRedactionLevel extends RedactionRule { + private final EntityType entityName; + private final RedactionType redactionType; + private final String tokenGroupName; + private final String redactionPattern; + + private TestRedactionLevel(Builder b) { + this.entityName = b.entityName; + this.redactionType = b.redactionType; + this.tokenGroupName = b.tokenGroupName; + this.redactionPattern = b.redactionPattern; + } + + public static Builder builder() { + return new Builder(); + } + + public EntityType getEntityName() { + return entityName; + } + + public RedactionType getRedactionType() { + return redactionType; + } + + public String getTokenGroupName() { + return tokenGroupName; + } + + public String getRedactionPattern() { + return redactionPattern; + } + + @Override + String apiEntityName() { + return entityName == null ? null : entityName.name(); + } + + @Override + String apiRedactionType() { + return redactionType == null ? null : redactionType.name(); + } + + @Override + String apiTokenGroupName() { + return tokenGroupName; + } + + @Override + String apiRedactionPattern() { + return redactionPattern; + } + + public static final class Builder { + private EntityType entityName; + private RedactionType redactionType; + private String tokenGroupName; + private String redactionPattern; + + public Builder entityName(EntityType entityName) { + this.entityName = entityName; + return this; + } + + public Builder redactionType(RedactionType redactionType) { + this.redactionType = redactionType; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder redactionPattern(String redactionPattern) { + this.redactionPattern = redactionPattern; + return this; + } + + public TestRedactionLevel build() { + return new TestRedactionLevel(this); + } + } +} diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java index 8786e0d5..f7c5db54 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectRequestMapperTests.java @@ -11,7 +11,7 @@ import com.skyflow.detect.Image; import com.skyflow.detect.MaskingMethod; import com.skyflow.detect.Media; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.TestRedactionLevel; import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReturnEntitiesType; @@ -117,8 +117,8 @@ public void reidentifyStringCarriesVaultIdAndRedactionLevels() throws Exception ReidentifyStringRequest.builder() .text("[NAME_1]") .redactionLevel(Arrays.asList( - RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), - RedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) + TestRedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), + TestRedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) .build(), "vault-1"); Assert.assertEquals("vault-1", mapped.getVaultId()); Assert.assertEquals("[NAME_1]", mapped.getText()); @@ -143,7 +143,7 @@ public void everyPublicEntityTypeMapsToAGeneratedValue() { for (EntityType type : EntityType.values()) { Entity entity = Entity.builder().entityType(type).build(); Assert.assertEquals(type.name(), DetectRequestMapper.toEntity(entity).getEntityType().get().toString()); - RedactionLevel level = RedactionLevel.builder().entityName(type).redactionType(RedactionType.DEFAULT).build(); + TestRedactionLevel level = TestRedactionLevel.builder().entityName(type).redactionType(RedactionType.DEFAULT).build(); Assert.assertEquals(type.name(), DetectRequestMapper.toRedactionLevels(Collections.singletonList(level)).get(0).getEntityName().get().toString()); } diff --git a/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java index b663f805..09fab254 100644 --- a/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/DetectValidationsTests.java @@ -5,7 +5,7 @@ import com.skyflow.detect.DetectConfiguration; import com.skyflow.detect.EntityType; import com.skyflow.detect.GetRunRequest; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.TestRedactionLevel; import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.errors.BaseErrorMessage; @@ -79,20 +79,20 @@ public void reidentifyStringAcceptsValidRedactionLevels() throws SkyflowExceptio DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder() .text("[NAME_1]") .redactionLevel(Arrays.asList( - RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), - RedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) + TestRedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(), + TestRedactionLevel.builder().tokenGroupName("group").redactionPattern("pattern").build())) .build()); DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder().text("[NAME_1]").build()); } @Test public void reidentifyStringPassesAnyRedactionLevelShapeThrough() throws SkyflowException { - // The API marks every RedactionLevel field optional; the server applies its own rules. + // The API marks every TestRedactionLevel field optional; the server applies its own rules. DetectValidations.validateReidentifyStringRequest(ReidentifyStringRequest.builder().text("[NAME_1]") .redactionLevel(Arrays.asList( - RedactionLevel.builder().build(), - RedactionLevel.builder().tokenGroupName("g").build(), - RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).redactionPattern("p").build(), + TestRedactionLevel.builder().build(), + TestRedactionLevel.builder().tokenGroupName("g").build(), + TestRedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).redactionPattern("p").build(), null)) .build()); } diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java index df55cd8b..5d34c119 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileMapperTests.java @@ -5,7 +5,7 @@ import com.skyflow.detect.EntityType; import com.skyflow.detect.FileDataFormat; import com.skyflow.detect.FileOutput; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.TestRedactionLevel; import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.detect.ReidentifyFileResponse; @@ -82,8 +82,8 @@ public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() .dataSource(TestReidentifySource.PRESIGNED_URL).value("https://s3/presigned") .redactionLevel(Arrays.asList( - RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask-middle").build(), - RedactionLevel.builder().entityName(EntityType.EMAIL_ADDRESS).redactionType(RedactionType.MASKED).build())) + TestRedactionLevel.builder().tokenGroupName("names").redactionPattern("mask-middle").build(), + TestRedactionLevel.builder().entityName(EntityType.EMAIL_ADDRESS).redactionType(RedactionType.MASKED).build())) .build(), "v"); Assert.assertEquals(2, api.getRedactionLevel().get().size()); @@ -99,7 +99,7 @@ public void mapsFlowvaultAndSkyvaultStyleRedactionLevels() throws Exception { @Test public void emptyRedactionLevelListIsSentAsEmptyArray() throws Exception { ReidentifyFileRequestV2 api = ReidentifyFileMapper.toApiRequest(ReidentifyFileRequest.builder() - .dataSource(TestReidentifySource.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); + .dataSource(TestReidentifySource.BASE64).value("x").redactionLevel(Collections.emptyList()).build(), "v"); Assert.assertTrue(api.getRedactionLevel().get().isEmpty()); Assert.assertTrue(wire(api).contains("\"redactionLevel\":[]")); } diff --git a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java index b5010e35..bcd06dd8 100644 --- a/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java +++ b/common/src/test/java/com/skyflow/detect/internal/ReidentifyFileValidationsTests.java @@ -3,7 +3,7 @@ import com.skyflow.detect.TestReidentifySource; import com.skyflow.detect.EntityType; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.TestRedactionLevel; import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.errors.ErrorCode; @@ -60,27 +60,27 @@ public void acceptsMinimalAndFullValidRequests() throws SkyflowException { ReidentifyFileValidations.validateReidentifyFileRequest(valid() .dataSource(TestReidentifySource.PRESIGNED_URL).value("https://example.com/f") .redactionLevel(Arrays.asList( - RedactionLevel.builder().tokenGroupName("g").redactionPattern("p").build(), - RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.REDACTED).build(), - RedactionLevel.builder().tokenGroupName("g2").redactionType(RedactionType.PLAIN_TEXT).build(), - RedactionLevel.builder().entityName(EntityType.SSN).redactionPattern("p2").build())) + TestRedactionLevel.builder().tokenGroupName("g").redactionPattern("p").build(), + TestRedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.REDACTED).build(), + TestRedactionLevel.builder().tokenGroupName("g2").redactionType(RedactionType.PLAIN_TEXT).build(), + TestRedactionLevel.builder().entityName(EntityType.SSN).redactionPattern("p2").build())) .build()); } @Test public void nullOrEmptyRedactionLevelListIsAllowed() throws SkyflowException { ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(null).build()); - ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(Collections.emptyList()).build()); + ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(Collections.emptyList()).build()); } @Test public void anyRedactionLevelShapePassesThrough() throws SkyflowException { - // Every RedactionLevel field is optional on the API; the server applies its own rules. + // Every TestRedactionLevel field is optional on the API; the server applies its own rules. ReidentifyFileValidations.validateReidentifyFileRequest(valid().redactionLevel(Arrays.asList( null, - RedactionLevel.builder().build(), - RedactionLevel.builder().tokenGroupName("g").build(), - RedactionLevel.builder().tokenGroupName("g").entityName(EntityType.NAME) + TestRedactionLevel.builder().build(), + TestRedactionLevel.builder().tokenGroupName("g").build(), + TestRedactionLevel.builder().tokenGroupName("g").entityName(EntityType.NAME) .redactionPattern("p").redactionType(RedactionType.MASKED).build())).build()); } } diff --git a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java index bdec1757..ef4038ed 100644 --- a/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java +++ b/common/src/test/java/com/skyflow/vault/controller/BaseDetectControllerTests.java @@ -18,7 +18,7 @@ import com.skyflow.detect.GetRunRequest; import com.skyflow.detect.GetRunResponse; import com.skyflow.detect.GuardrailsValidation; -import com.skyflow.detect.RedactionLevel; +import com.skyflow.detect.TestRedactionLevel; import com.skyflow.detect.ReidentifyStringRequest; import com.skyflow.detect.ReidentifyStringResponse; import com.skyflow.enums.Env; @@ -143,7 +143,7 @@ public void reidentifyStringSendsVaultIdInBodyAndRefreshesTokenPerCall() throws ReidentifyStringResponse second = controller.reidentifyString(ReidentifyStringRequest.builder() .text("My name is [NAME_1].") .redactionLevel(Collections.singletonList( - RedactionLevel.builder().tokenGroupName("group").redactionPattern("mask").build())) + TestRedactionLevel.builder().tokenGroupName("group").redactionPattern("mask").build())) .build()); Assert.assertEquals("My name is John Doe.", first.getProcessedText()); diff --git a/docs/api_reference.md b/docs/api_reference.md index 83c35f0b..10d9ea49 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -577,14 +577,14 @@ Each element returned by `getDetokenizedFields()` and `getErrors()`. ### `RedactionLevel` -`com.skyflow.detect` — element of `redactionLevel()` on `ReidentifyStringRequest` and `ReidentifyFileRequest`. Each rule names one source and one replacement: `entityName` plus `redactionType` on skyvault vaults, `tokenGroupName` plus `redactionPattern` on flowvault vaults. Every field is optional on the API; the server rejects invalid combinations. - -| Builder method | Description | -|----------------|-------------| -| `entityName(EntityType)` | Skyvault vaults: entity type the rule applies to. | -| `redactionType(RedactionType)` | Skyvault vaults: `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`, the same `com.skyflow.enums.RedactionType` used by `get` and `detokenize`. See [`RedactionType`](#redactiontype). | -| `tokenGroupName(String)` | Flowvault vaults: token group the rule applies to. | -| `redactionPattern(String)` | Flowvault vaults: name of a redaction pattern configured in the vault. | +`com.skyflow.detect` — element of `redactionLevel()` on `ReidentifyStringRequest` and `ReidentifyFileRequest`. The class is defined per SDK and carries only the pair of fields its vault type uses, so the other vault's fields cannot be set. Both fields are optional on the API and are sent as given. + +| SDK | Builder method | Description | +|-----|----------------|-------------| +| skyvault | `entityName(EntityType)` | Entity type the rule applies to. | +| skyvault | `redactionType(RedactionType)` | `PLAIN_TEXT`, `MASKED`, `REDACTED` or `DEFAULT`, the same `com.skyflow.enums.RedactionType` used by `get` and `detokenize`. See [`RedactionType`](#redactiontype). | +| flowvault | `tokenGroupName(String)` | Token group the rule applies to. | +| flowvault | `redactionPattern(String)` | Name of a redaction pattern configured in the vault. | ### `DetectedEntity` diff --git a/flowvault/README.md b/flowvault/README.md index 532f2f79..d1727eb3 100644 --- a/flowvault/README.md +++ b/flowvault/README.md @@ -1887,7 +1887,7 @@ System.out.println(response.getProcessedText()); // My name is J**n D*e. ``` -A `RedactionLevel` names one source and one replacement. On flowvault vaults the source is a `tokenGroupName` and the replacement a `redactionPattern` configured in the vault. The `entityName` and `redactionType` fields are the skyvault equivalents and do not apply to flowvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. +A `RedactionLevel` names one source and one replacement. On flowvault vaults the source is a `tokenGroupName` and the replacement a `redactionPattern` configured in the vault. The flowvault SDK's `RedactionLevel` has only these two fields; the skyvault SDK's has `entityName` and `redactionType` instead. Both are optional on the API and are sent as given. ## Reidentify file diff --git a/flowvault/src/main/java/com/skyflow/detect/RedactionLevel.java b/flowvault/src/main/java/com/skyflow/detect/RedactionLevel.java new file mode 100644 index 00000000..031859dc --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/detect/RedactionLevel.java @@ -0,0 +1,96 @@ +package com.skyflow.detect; + +/** + * Controls how one group of tokens is rendered when re-identifying on a flowvault vault: the {@code tokenGroupName} + * the rule applies to and the named {@code redactionPattern}, configured in the vault, to render its values with. + * Element of {@code redactionLevel} on {@code ReidentifyStringRequest} and {@code ReidentifyFileRequest}. Both + * fields are optional on the API and are sent as given. + */ +public final class RedactionLevel extends RedactionRule { + private final String tokenGroupName; + private final String redactionPattern; + + private RedactionLevel(RedactionLevelBuilder builder) { + this.tokenGroupName = builder.tokenGroupName; + this.redactionPattern = builder.redactionPattern; + } + + /** + * @return a new builder + */ + public static RedactionLevelBuilder builder() { + return new RedactionLevelBuilder(); + } + + /** + * @return Token group the rule applies to. + */ + public String getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Name of the redaction pattern, configured in the vault, applied to that group's values. + */ + public String getRedactionPattern() { + return redactionPattern; + } + + @Override + String apiEntityName() { + return null; + } + + @Override + String apiRedactionType() { + return null; + } + + @Override + String apiTokenGroupName() { + return tokenGroupName; + } + + @Override + String apiRedactionPattern() { + return redactionPattern; + } + + @Override + public String toString() { + return "RedactionLevel{" + + "tokenGroupName=" + tokenGroupName + + ", redactionPattern=" + redactionPattern + + '}'; + } + + public static final class RedactionLevelBuilder { + private String tokenGroupName; + private String redactionPattern; + + private RedactionLevelBuilder() { + } + + /** + * @param tokenGroupName Token group the rule applies to. + * @return this builder + */ + public RedactionLevelBuilder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + /** + * @param redactionPattern Name of a redaction pattern configured in the vault. + * @return this builder + */ + public RedactionLevelBuilder redactionPattern(String redactionPattern) { + this.redactionPattern = redactionPattern; + return this; + } + + public RedactionLevel build() { + return new RedactionLevel(this); + } + } +} diff --git a/flowvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java b/flowvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java new file mode 100644 index 00000000..68c1026f --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java @@ -0,0 +1,27 @@ +package com.skyflow.detect; + +import org.junit.Assert; +import org.junit.Test; + +public class RedactionLevelTests { + + @Test + public void flowvaultRuleCarriesTokenGroupAndPatternOnly() { + RedactionLevel rule = RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build(); + Assert.assertEquals("names", rule.getTokenGroupName()); + Assert.assertEquals("mask", rule.getRedactionPattern()); + + com.skyflow.generated.common.rest.types.RedactionLevel api = RedactionRules.toApi(rule); + Assert.assertEquals("names", api.getTokenGroupName().get()); + Assert.assertEquals("mask", api.getRedactionPattern().get()); + Assert.assertFalse(api.getEntityName().isPresent()); + Assert.assertFalse(api.getRedactionType().isPresent()); + } + + @Test + public void unsetFieldsAreNotSent() { + com.skyflow.generated.common.rest.types.RedactionLevel api = RedactionRules.toApi(RedactionLevel.builder().build()); + Assert.assertFalse(api.getTokenGroupName().isPresent()); + Assert.assertFalse(api.getRedactionPattern().isPresent()); + } +} diff --git a/skyvault/README.md b/skyvault/README.md index 513e29cc..8ed1a551 100644 --- a/skyvault/README.md +++ b/skyvault/README.md @@ -1924,7 +1924,7 @@ System.out.println(response.getProcessedText()); // My name is John Doe and my email is j*******@acme.com. ``` -A `RedactionLevel` names one source and one replacement. On skyvault vaults the source is an `entityName` and the replacement a `redactionType`, the same `com.skyflow.enums.RedactionType` that `get` and `detokenize` use. The `tokenGroupName` and `redactionPattern` fields are the flowvault equivalents and do not apply to skyvault vaults. Every field is optional on the API, so the SDK passes the list through as given and the server rejects invalid combinations. +A `RedactionLevel` names one source and one replacement. On skyvault vaults the source is an `entityName` and the replacement a `redactionType`, the same `com.skyflow.enums.RedactionType` that `get` and `detokenize` use. The skyvault SDK's `RedactionLevel` has only these two fields; the flowvault SDK's has `tokenGroupName` and `redactionPattern` instead. Both are optional on the API and are sent as given. ## Reidentify file diff --git a/skyvault/src/main/java/com/skyflow/detect/RedactionLevel.java b/skyvault/src/main/java/com/skyflow/detect/RedactionLevel.java new file mode 100644 index 00000000..184a2945 --- /dev/null +++ b/skyvault/src/main/java/com/skyflow/detect/RedactionLevel.java @@ -0,0 +1,99 @@ +package com.skyflow.detect; + +import com.skyflow.enums.RedactionType; + +/** + * Controls how one group of tokens is rendered when re-identifying on a skyvault vault: the {@code entityName} + * the rule applies to and the {@code redactionType} to render it with ({@code PLAIN_TEXT}, {@code MASKED}, + * {@code REDACTED} or {@code DEFAULT}). Element of {@code redactionLevel} on {@code ReidentifyStringRequest} and + * {@code ReidentifyFileRequest}. Both fields are optional on the API and are sent as given. + */ +public final class RedactionLevel extends RedactionRule { + private final EntityType entityName; + private final RedactionType redactionType; + + private RedactionLevel(RedactionLevelBuilder builder) { + this.entityName = builder.entityName; + this.redactionType = builder.redactionType; + } + + /** + * @return a new builder + */ + public static RedactionLevelBuilder builder() { + return new RedactionLevelBuilder(); + } + + /** + * @return Entity type the rule applies to. + */ + public EntityType getEntityName() { + return entityName; + } + + /** + * @return Rendering applied to that entity's values. + */ + public RedactionType getRedactionType() { + return redactionType; + } + + @Override + String apiEntityName() { + return entityName == null ? null : entityName.name(); + } + + @Override + String apiRedactionType() { + return redactionType == null ? null : redactionType.name(); + } + + @Override + String apiTokenGroupName() { + return null; + } + + @Override + String apiRedactionPattern() { + return null; + } + + @Override + public String toString() { + return "RedactionLevel{" + + "entityName=" + entityName + + ", redactionType=" + redactionType + + '}'; + } + + public static final class RedactionLevelBuilder { + private EntityType entityName; + private RedactionType redactionType; + + private RedactionLevelBuilder() { + } + + /** + * @param entityName Entity type the rule applies to. + * @return this builder + */ + public RedactionLevelBuilder entityName(EntityType entityName) { + this.entityName = entityName; + return this; + } + + /** + * @param redactionType Rendering applied to that entity's values, the same {@code com.skyflow.enums.RedactionType} + * used by {@code get} and {@code detokenize}. + * @return this builder + */ + public RedactionLevelBuilder redactionType(RedactionType redactionType) { + this.redactionType = redactionType; + return this; + } + + public RedactionLevel build() { + return new RedactionLevel(this); + } + } +} diff --git a/skyvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java b/skyvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java new file mode 100644 index 00000000..b32f58d5 --- /dev/null +++ b/skyvault/src/test/java/com/skyflow/detect/RedactionLevelTests.java @@ -0,0 +1,28 @@ +package com.skyflow.detect; + +import com.skyflow.enums.RedactionType; +import org.junit.Assert; +import org.junit.Test; + +public class RedactionLevelTests { + + @Test + public void skyvaultRuleCarriesEntityNameAndRedactionTypeOnly() { + RedactionLevel rule = RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build(); + Assert.assertEquals(EntityType.NAME, rule.getEntityName()); + Assert.assertEquals(RedactionType.MASKED, rule.getRedactionType()); + + com.skyflow.generated.common.rest.types.RedactionLevel api = RedactionRules.toApi(rule); + Assert.assertEquals("NAME", api.getEntityName().get().toString()); + Assert.assertEquals("MASKED", api.getRedactionType().get().toString()); + Assert.assertFalse(api.getTokenGroupName().isPresent()); + Assert.assertFalse(api.getRedactionPattern().isPresent()); + } + + @Test + public void unsetFieldsAreNotSent() { + com.skyflow.generated.common.rest.types.RedactionLevel api = RedactionRules.toApi(RedactionLevel.builder().build()); + Assert.assertFalse(api.getEntityName().isPresent()); + Assert.assertFalse(api.getRedactionType().isPresent()); + } +} diff --git a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java index ce2df513..ddc5e7cc 100644 --- a/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java +++ b/skyvault/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java @@ -23,6 +23,7 @@ import com.skyflow.detect.GuardrailsValidation; import com.skyflow.detect.PollOptions; import com.skyflow.detect.RedactionLevel; +import com.skyflow.enums.RedactionType; import com.skyflow.detect.ReidentifyFileRequest; import com.skyflow.detect.ReidentifyFileResponse; import com.skyflow.detect.ReidentifyStringRequest; @@ -243,7 +244,7 @@ public void reidentifyStringRoundTrip() throws Exception { ReidentifyStringResponse response = controllerFor(server).reidentifyString(ReidentifyStringRequest.builder() .text("My name is [NAME_1].") .redactionLevel(Collections.singletonList( - RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build())) .build()); Assert.assertEquals("My name is J**n D*e.", response.getProcessedText()); @@ -254,8 +255,8 @@ public void reidentifyStringRoundTrip() throws Exception { String body = recorded.getBody().readUtf8(); Assert.assertTrue(body, body.contains("\"text\":\"My name is [NAME_1].\"")); Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); - Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); - Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + Assert.assertTrue(body, body.contains("\"entityName\":\"NAME\"")); + Assert.assertTrue(body, body.contains("\"redactionType\":\"MASKED\"")); } finally { server.shutdown(); } @@ -413,7 +414,7 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { .value("W05BTUVfMV0=") .dataFormat(FileDataFormat.TXT) .redactionLevel(Arrays.asList( - RedactionLevel.builder().tokenGroupName("names").redactionPattern("mask").build())) + RedactionLevel.builder().entityName(EntityType.NAME).redactionType(RedactionType.MASKED).build())) .build()); Assert.assertEquals(DetectRunStatus.SUCCESS, response.getStatus()); @@ -434,8 +435,8 @@ public void reidentifyFileSendsScopedRequestAndMapsResponse() throws Exception { Assert.assertTrue(body, body.contains("\"value\":\"W05BTUVfMV0=\"")); Assert.assertTrue(body, body.contains("\"vaultId\":\"vault-1\"")); Assert.assertTrue(body, body.contains("\"dataFormat\":\"txt\"")); - Assert.assertTrue(body, body.contains("\"tokenGroupName\":\"names\"")); - Assert.assertTrue(body, body.contains("\"redactionPattern\":\"mask\"")); + Assert.assertTrue(body, body.contains("\"entityName\":\"NAME\"")); + Assert.assertTrue(body, body.contains("\"redactionType\":\"MASKED\"")); } finally { server.shutdown(); } From 92a87cddb260dcfe44cf9c1282f13f681ab47508 Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 3 Nov 2026 09:47:29 +0000 Subject: [PATCH 41/41] [AUTOMATED] Private Release 1.3.0-dev-1b7228dd --- flowvault/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flowvault/pom.xml b/flowvault/pom.xml index 83f5cb62..a110822a 100644 --- a/flowvault/pom.xml +++ b/flowvault/pom.xml @@ -12,7 +12,7 @@ skyflow-flowvault-java - 1.3.0-dev.4cc5c0fd + 1.3.0-dev.1b7228dd jar ${project.groupId}:${project.artifactId} Skyflow FlowVault SDK for the Java programming language