From 969eaacb92ad923b96b8c1687e549f0b21aa5e86 Mon Sep 17 00:00:00 2001 From: saileshwar-skyflow <156889717+saileshwar-skyflow@users.noreply.github.com> Date: Mon, 20 Jul 2026 12:44:16 +0530 Subject: [PATCH 1/3] Fix release branch resolution picking stale feature branches (#359) git branch -r --contains matches any branch that has the tag commit as an ancestor, not just the branch it was cut from. Long-lived or merged branches keep that ancestry indefinitely, so alphabetical head -n 1 could select the wrong branch (e.g. a stale feature branch instead of main), which then made the checkout in the Commit changes step collide with the uncommitted pom.xml version bump. Switch to git for-each-ref --points-at to match only the branch whose tip is exactly the tag commit. Co-authored-by: Claude Sonnet 5 --- .github/workflows/shared-build-and-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/shared-build-and-deploy.yml b/.github/workflows/shared-build-and-deploy.yml index 13fd1b5b..29fa4b2d 100644 --- a/.github/workflows/shared-build-and-deploy.yml +++ b/.github/workflows/shared-build-and-deploy.yml @@ -67,7 +67,7 @@ jobs: if: ${{ inputs.tag == 'beta' || inputs.tag == 'public' }} run: | TAG_COMMIT=$(git rev-list -n 1 ${{ github.ref_name }}) - BRANCH_NAME=$(git branch -r --contains $TAG_COMMIT | grep -o 'origin/.*' | sed 's|origin/||' | head -n 1) + BRANCH_NAME=$(git for-each-ref --points-at="$TAG_COMMIT" --format='%(refname:short)' refs/remotes/origin | grep -v '/HEAD$' | sed 's#^origin/##' | head -n 1) if [ -z "$BRANCH_NAME" ]; then echo "Error: Could not resolve branch for the tag." exit 1 From 86a8f9583d2c72d90685532a4da143ccc8b681ff Mon Sep 17 00:00:00 2001 From: saileshwar-skyflow Date: Mon, 20 Jul 2026 07:16:42 +0000 Subject: [PATCH 2/3] [AUTOMATED] Public Release - 2.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e38beafa..205b5067 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.skyflow skyflow-java - 1.15.1-dev.758a994 + 2.1.1 jar ${project.groupId}:${project.artifactId} From 30628cf0553a37c0698ab046415d0ff27a0b9c1d Mon Sep 17 00:00:00 2001 From: skyflow-bharti Date: Tue, 21 Jul 2026 09:37:56 +0530 Subject: [PATCH 3/3] SK-2967 improve the issues --- .../main/java/com/skyflow/BaseSkyflow.java | 19 +- .../java/com/skyflow/BaseVaultClient.java | 4 +- .../src/main/java/com/skyflow/ISkyflow.java | 2 +- .../com/skyflow/config/BaseCredentials.java | 11 +- .../java/com/skyflow/errors/ErrorMessage.java | 1 + .../com/skyflow/errors/SkyflowException.java | 2 +- .../main/java/com/skyflow/logs/ErrorLogs.java | 1 + .../java/com/skyflow/utils/BaseUtils.java | 9 +- .../java/com/skyflow/BaseSkyflowTests.java | 2 +- flowvault/dependency-reduced-pom.xml | 195 ++++++++++++++++++ .../main/java/com/skyflow/VaultClient.java | 2 +- .../main/java/com/skyflow/utils/Utils.java | 4 +- .../utils/validations/Validations.java | 12 ++ .../vault/controller/VaultController.java | 32 +-- v2/src/main/java/com/skyflow/Skyflow.java | 2 +- v2/src/main/java/com/skyflow/VaultClient.java | 5 + 16 files changed, 270 insertions(+), 33 deletions(-) create mode 100644 flowvault/dependency-reduced-pom.xml diff --git a/common/src/main/java/com/skyflow/BaseSkyflow.java b/common/src/main/java/com/skyflow/BaseSkyflow.java index 7475012d..a60dc02b 100644 --- a/common/src/main/java/com/skyflow/BaseSkyflow.java +++ b/common/src/main/java/com/skyflow/BaseSkyflow.java @@ -16,7 +16,7 @@ import java.util.Map; -abstract class BaseSkyflow implements ISkyflow { +abstract class BaseSkyflow, V extends BaseVaultConfig> implements ISkyflow { protected final BaseSkyflowClientBuilder builder; protected BaseSkyflow(BaseSkyflowClientBuilder builder) { @@ -124,8 +124,8 @@ protected final void addVaultConfigTemplate(V vaultConfig) throws SkyflowExcepti throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdAlreadyInConfigList.getMessage()); } - this.vaultConfigMap.put(vaultId, vaultConfigCopy); onVaultConfigAdded(vaultConfigCopy); + this.vaultConfigMap.put(vaultId, vaultConfigCopy); } protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowException { @@ -139,8 +139,9 @@ protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowExce throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); } V previousConfig = this.vaultConfigMap.get(vaultId); - V merged = mergeVaultConfig(vaultConfig, previousConfig); + V merged = mergeVaultConfig(vaultConfig, cloneVaultConfig(previousConfig)); onVaultConfigUpdated(merged); + this.vaultConfigMap.put(vaultId, merged); } protected final void removeVaultConfigTemplate(String vaultId) throws SkyflowException { @@ -158,10 +159,10 @@ protected final void addSkyflowCredentialsTemplate(Credentials credentials) thro try { credentialsCopy = (Credentials) credentials.clone(); } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); + throw new SkyflowException(e.getMessage(), e); } - this.skyflowCredentials = credentialsCopy; onCredentialsUpdated(credentialsCopy); + this.skyflowCredentials = credentialsCopy; } protected abstract void validateVaultConfig(V vaultConfig) throws SkyflowException; @@ -169,11 +170,11 @@ protected final void addSkyflowCredentialsTemplate(Credentials credentials) thro protected abstract boolean hasVaultClient(String vaultId); @SuppressWarnings("unchecked") - protected final V cloneVaultConfig(V vaultConfig) { + protected final V cloneVaultConfig(V vaultConfig) throws SkyflowException { try { return (V) vaultConfig.clone(); } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); + throw new SkyflowException(e.getMessage(), e); } } @@ -181,7 +182,7 @@ protected final String extractVaultId(V vaultConfig) { return vaultConfig.getVaultId(); } - protected final V mergeVaultConfig(V incoming, V existing) { + protected final V mergeVaultConfig(V incoming, V existing) throws SkyflowException { if (incoming.getEnv() != null) { existing.setEnv(incoming.getEnv()); } @@ -192,7 +193,7 @@ protected final V mergeVaultConfig(V incoming, V existing) { try { existing.setCredentials((Credentials) incoming.getCredentials().clone()); } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); + throw new SkyflowException(e.getMessage(), e); } } return existing; diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java index fa648611..3d5b0d32 100644 --- a/common/src/main/java/com/skyflow/BaseVaultClient.java +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -55,7 +55,7 @@ protected OkHttpClient buildSharedHttpClient(Supplier tokenSupplier) { .build(); } - protected void prioritiseCredentials(BaseCredentials vaultSpecificCredentials) throws SkyflowException { + protected synchronized void prioritiseCredentials(BaseCredentials vaultSpecificCredentials) throws SkyflowException { try { BaseCredentials original = this.finalCredentials; if (vaultSpecificCredentials != null) { @@ -88,7 +88,7 @@ protected void prioritiseCredentials(BaseCredentials vaultSpecificCredentials) t } } - protected void setBearerToken(BaseCredentials vaultSpecificCredentials) throws SkyflowException { + protected synchronized void setBearerToken(BaseCredentials vaultSpecificCredentials) throws SkyflowException { prioritiseCredentials(vaultSpecificCredentials); BaseValidations.validateCredentials(this.finalCredentials); if (this.finalCredentials.getApiKey() != null) { diff --git a/common/src/main/java/com/skyflow/ISkyflow.java b/common/src/main/java/com/skyflow/ISkyflow.java index ac5fd747..1c29b780 100644 --- a/common/src/main/java/com/skyflow/ISkyflow.java +++ b/common/src/main/java/com/skyflow/ISkyflow.java @@ -5,7 +5,7 @@ import com.skyflow.enums.LogLevel; import com.skyflow.errors.SkyflowException; -public interface ISkyflow { +public interface ISkyflow, V extends BaseVaultConfig, C extends BaseCredentials> { Self addVaultConfig(V vaultConfig) throws SkyflowException; Self updateVaultConfig(V vaultConfig) throws SkyflowException; diff --git a/common/src/main/java/com/skyflow/config/BaseCredentials.java b/common/src/main/java/com/skyflow/config/BaseCredentials.java index 34b2c117..48ab70dc 100644 --- a/common/src/main/java/com/skyflow/config/BaseCredentials.java +++ b/common/src/main/java/com/skyflow/config/BaseCredentials.java @@ -1,6 +1,7 @@ package com.skyflow.config; import java.util.ArrayList; +import java.util.HashMap; import java.util.Map; public class BaseCredentials implements Cloneable { @@ -69,7 +70,15 @@ public void setContext(Map context) { } @Override + @SuppressWarnings("unchecked") public Object clone() throws CloneNotSupportedException { - return super.clone(); + BaseCredentials copy = (BaseCredentials) super.clone(); + if (this.roles != null) { + copy.roles = new ArrayList<>(this.roles); + } + if (this.context instanceof Map) { + copy.context = new HashMap<>((Map) this.context); + } + return copy; } } diff --git a/common/src/main/java/com/skyflow/errors/ErrorMessage.java b/common/src/main/java/com/skyflow/errors/ErrorMessage.java index e3b5924b..1e4d9178 100644 --- a/common/src/main/java/com/skyflow/errors/ErrorMessage.java +++ b/common/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -63,6 +63,7 @@ public enum ErrorMessage { BearerTokenExpired("%s0 Validation error. Bearer token is invalid or expired. Please provide a valid bearer token."), // Insert + InsertRequestNull("%s0 Validation error. InsertRequest object is null. Specify a valid InsertRequest object."), 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."), diff --git a/common/src/main/java/com/skyflow/errors/SkyflowException.java b/common/src/main/java/com/skyflow/errors/SkyflowException.java index 138fcc68..676bdd74 100644 --- a/common/src/main/java/com/skyflow/errors/SkyflowException.java +++ b/common/src/main/java/com/skyflow/errors/SkyflowException.java @@ -90,7 +90,7 @@ private void setHttpStatus() { } public int getHttpCode() { - return httpCode; + return httpCode == null ? 0 : httpCode; } public JsonArray getDetails() { diff --git a/common/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java index b77eee2c..bbb96fce 100644 --- a/common/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -54,6 +54,7 @@ public enum ErrorLogs { EMPTY_TABLE_NAME("Invalid %s1 request. Table name can not be empty."), VALUES_IS_REQUIRED("Invalid %s1 request. Values are required."), EMPTY_VALUES("Invalid %s1 request. Values can not be empty."), + INSERT_REQUEST_NULL("Invalid %s1 request. Insert request can not be null."), RECORDS_IS_REQUIRED("Invalid %s1 request. Records are required."), EMPTY_RECORDS("Invalid %s1 request. Records can not be empty."), INVALID_RECORD("Invalid %s1 request. Invalid record. Specify a valid record."), diff --git a/common/src/main/java/com/skyflow/utils/BaseUtils.java b/common/src/main/java/com/skyflow/utils/BaseUtils.java index c4a7b6f3..e536c111 100644 --- a/common/src/main/java/com/skyflow/utils/BaseUtils.java +++ b/common/src/main/java/com/skyflow/utils/BaseUtils.java @@ -81,9 +81,14 @@ public static PrivateKey getPrivateKeyFromPem(String pemKey) throws SkyflowExcep if (pemKey.contains(PKCS8PrivateHeader)) { privateKeyContent = privateKeyContent.replace(PKCS8PrivateHeader, ""); privateKeyContent = privateKeyContent.replace(PKCS8PrivateFooter, ""); - privateKeyContent = privateKeyContent.replace("\n", ""); privateKeyContent = privateKeyContent.replace("\r\n", ""); - privateKey = parsePkcs8PrivateKey(Base64.getDecoder().decode(privateKeyContent)); + privateKeyContent = privateKeyContent.replace("\n", ""); + try { + 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()); + } } else { LogUtil.printErrorLog(ErrorLogs.JWT_INVALID_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtInvalidFormat.getMessage()); diff --git a/common/src/test/java/com/skyflow/BaseSkyflowTests.java b/common/src/test/java/com/skyflow/BaseSkyflowTests.java index 12ae256c..2e18a1ea 100644 --- a/common/src/test/java/com/skyflow/BaseSkyflowTests.java +++ b/common/src/test/java/com/skyflow/BaseSkyflowTests.java @@ -250,7 +250,7 @@ public Env getEnv() { } @Test - public void testMergeVaultConfigWithNullClusterIdFallsBackToPreviousClusterId() { + public void testMergeVaultConfigWithNullClusterIdFallsBackToPreviousClusterId() throws SkyflowException { BaseVaultConfig existing = newConfig(vaultID, clusterID, Env.DEV); BaseVaultConfig incoming = new BaseVaultConfig(); incoming.setVaultId(vaultID); diff --git a/flowvault/dependency-reduced-pom.xml b/flowvault/dependency-reduced-pom.xml new file mode 100644 index 00000000..92fc11f2 --- /dev/null +++ b/flowvault/dependency-reduced-pom.xml @@ -0,0 +1,195 @@ + + + + skyflow + com.skyflow + 1.0.0 + + 4.0.0 + skyflow-flowvault-java + ${project.groupId}:${project.artifactId} + 1.0.0 + Skyflow V3 SDK for the Java programming language + https://github.com/skyflowapi/skyflow-java/tree/main + + + skyflow + skyflow + + + + + The MIT License (MIT) + https://github.com/skyflowapi/skyflow-java/blob/main/LICENSE + + + + + + true + src/main/resources + + + + + maven-shade-plugin + 3.6.0 + + + package + + shade + + + + + com.skyflow:common + + + + + + + + + + + jfrog + + + central + prekarilabs.jfrog.io-releases + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + snapshots + prekarilabs.jfrog.io-snapshots + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + + + maven-central + + + + org.sonatype.central + central-publishing-maven-plugin + 0.4.0 + true + + central + true + true + + + + + + + central + https://central.sonatype.com/api/v1/publisher/upload + + + central-snapshots + https://central.sonatype.com/api/v1/publisher/upload + + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.17.2 + compile + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + 2.18.6 + compile + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.18.6 + compile + + + io.github.cdimascio + dotenv-java + 2.2.0 + compile + + + com.google.code.gson + gson + 2.10.1 + compile + + + com.squareup.okhttp3 + okhttp + 4.12.0 + compile + + + io.jsonwebtoken + jjwt + 0.12.6 + compile + + + junit + junit + 4.13.2 + test + + + hamcrest-core + org.hamcrest + + + + + org.powermock + powermock-module-junit4 + 2.0.9 + test + + + powermock-module-junit4-common + org.powermock + + + hamcrest-core + org.hamcrest + + + + + org.powermock + powermock-api-mockito2 + 2.0.9 + test + + + powermock-api-support + org.powermock + + + mockito-core + org.mockito + + + + + + UTF-8 + 8 + false + 8 + ${project.version} + + diff --git a/flowvault/src/main/java/com/skyflow/VaultClient.java b/flowvault/src/main/java/com/skyflow/VaultClient.java index c8843f3e..9f326349 100644 --- a/flowvault/src/main/java/com/skyflow/VaultClient.java +++ b/flowvault/src/main/java/com/skyflow/VaultClient.java @@ -28,7 +28,7 @@ protected void setCommonCredentials(Credentials commonCredentials) throws Skyflo super.prioritiseCredentials(this.vaultConfig.getCredentials()); } - protected void setBearerToken() throws SkyflowException { + protected synchronized void setBearerToken() throws SkyflowException { super.setBearerToken(this.vaultConfig.getCredentials()); if (apiClient == null) { updateExecutorInHTTP(); diff --git a/flowvault/src/main/java/com/skyflow/utils/Utils.java b/flowvault/src/main/java/com/skyflow/utils/Utils.java index db2d00bd..5880344b 100644 --- a/flowvault/src/main/java/com/skyflow/utils/Utils.java +++ b/flowvault/src/main/java/com/skyflow/utils/Utils.java @@ -738,11 +738,11 @@ public static BulkInsertResponse formatBulkInsertResponse(V1InsertResponse respo BulkInsertResponse formattedResponse = null; List successRecords = new ArrayList<>(); List errorRecords = new ArrayList<>(); - if (response != null) { + if (response != null && response.getRecords().isPresent()) { String requestId = extractRequestId(headers); List record = response.getRecords().get(); int indexNumber = batch * batchSize; - int recordsSize = response.getRecords().get().size(); + int recordsSize = record.size(); for (int index = 0; index < recordsSize; index++) { if (record.get(index).getError().isPresent()) { ErrorRecord errorRecord = new ErrorRecord(indexNumber, record.get(index).getError().get(), record.get(index).getHttpCode().orElse(500), requestId); 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 c835cc78..1d0228ed 100644 --- a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -152,6 +152,12 @@ public static void validateVaultConfiguration(VaultConfig vaultConfig) throws Sk public static void validateInsertRequest(InsertRequest insertRequest) throws SkyflowException { + if (insertRequest == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INSERT_REQUEST_NULL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InsertRequestNull.getMessage()); + } String table = insertRequest.getTable(); ArrayList records = insertRequest.getRecords(); if (records == null) { @@ -384,6 +390,12 @@ public static void validateTokenizeRequest(TokenizeRequest request) throws Skyfl // ── Bulk (batched/concurrent) request validations ──────────────────────── public static void validateBulkInsertRequest(BulkInsertRequest insertRequest) throws SkyflowException { + if (insertRequest == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INSERT_REQUEST_NULL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InsertRequestNull.getMessage()); + } String table = insertRequest.getTable(); ArrayList records = insertRequest.getRecords(); if (records == null) { diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java index bf6abc42..476ce9d5 100644 --- a/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java +++ b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -884,25 +884,33 @@ private BulkInsertResponse processBulkInsertSync( ArrayList originalPayload, RequestInterceptor interceptor, BatchConfig cfg - ) throws ExecutionException, InterruptedException { + ) throws ExecutionException, InterruptedException, SkyflowException { LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); List successRecords = new ArrayList<>(); List errorRecords = Collections.synchronizedList(new ArrayList<>()); List> futures = this.insertBatchFutures(insertRequest, errorRecords, interceptor, cfg); - CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); - allFutures.join(); - - for (CompletableFuture future : futures) { - BulkInsertResponse futureResponse = future.get(); - if (futureResponse != null) { - if (futureResponse.getSuccess() != null) { - successRecords.addAll(futureResponse.getSuccess()); - } - if (futureResponse.getErrors() != null) { - errorRecords.addAll(futureResponse.getErrors()); + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + try { + allFutures.join(); + } catch (Exception e) { + // individual batch errors are already captured + } + for (CompletableFuture future : futures) { + BulkInsertResponse futureResponse = future.get(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorRecords.addAll(futureResponse.getErrors()); + } } } + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); } BulkInsertResponse response = new BulkInsertResponse(successRecords, errorRecords, originalPayload); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); diff --git a/v2/src/main/java/com/skyflow/Skyflow.java b/v2/src/main/java/com/skyflow/Skyflow.java index 2daf9b27..66640f0e 100644 --- a/v2/src/main/java/com/skyflow/Skyflow.java +++ b/v2/src/main/java/com/skyflow/Skyflow.java @@ -106,7 +106,7 @@ protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowExcepti @Override protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowException { - this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(); + this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(updatedConfig); } @Override diff --git a/v2/src/main/java/com/skyflow/VaultClient.java b/v2/src/main/java/com/skyflow/VaultClient.java index a24ef8d2..84289e8f 100644 --- a/v2/src/main/java/com/skyflow/VaultClient.java +++ b/v2/src/main/java/com/skyflow/VaultClient.java @@ -85,6 +85,11 @@ protected void updateVaultConfig() throws SkyflowException { super.prioritiseCredentials(this.vaultConfig.getCredentials()); } + protected void updateVaultConfig(VaultConfig newConfig) throws SkyflowException { + this.vaultConfig = newConfig; + updateVaultConfig(); + } + protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { List recordRequests = new ArrayList<>();