Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions samples/src/main/java/com/example/vault/DetokenizeExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.skyflow.enums.LogLevel;
import com.skyflow.enums.RedactionType;
import com.skyflow.errors.SkyflowException;
import com.skyflow.vault.tokens.DetokenizeData;
import com.skyflow.vault.tokens.DetokenizeRequest;
import com.skyflow.vault.tokens.DetokenizeResponse;

Expand Down Expand Up @@ -52,13 +53,15 @@ public static void main(String[] args) throws SkyflowException {

// Example 1: Detokenize tokens from the first vault
try {
ArrayList<String> tokens1 = new ArrayList<>();
tokens1.add("<YOUR_TOKEN_VALUE_1>"); // Replace with the first token to detokenize
tokens1.add("<YOUR_TOKEN_VALUE_2>"); // Replace with the second token to detokenize
ArrayList<DetokenizeData> detokenizeData1 = new ArrayList<>();
DetokenizeData detokenizeDataRecord1 = new DetokenizeData("<YOUR_TOKEN_VALUE_1>", RedactionType.MASKED); // Replace with a token to detokenize with MASKED redaction
DetokenizeData detokenizeDataRecord2 = new DetokenizeData("<YOUR_TOKEN_VALUE_2>"); // Replace with another token to detokenize with PLAIN_TEXT redaction
detokenizeData1.add(detokenizeDataRecord1);
detokenizeData1.add(detokenizeDataRecord2);

DetokenizeRequest detokenizeRequest1 = DetokenizeRequest.builder()
.tokens(tokens1) // Specify the tokens to detokenize
.continueOnError(true) // Continue processing even if an error occurs for some tokens
.detokenizeData(detokenizeData1) // Specify the tokens to detokenize with specified redaction types
.continueOnError(true) // Continue processing even if an error occurs for some tokens
.build();

DetokenizeResponse detokenizeResponse1 = skyflowClient.vault().detokenize(detokenizeRequest1); // Perform detokenization
Expand All @@ -70,14 +73,16 @@ public static void main(String[] args) throws SkyflowException {

// Example 2: Detokenize tokens from the second vault
try {
ArrayList<String> tokens2 = new ArrayList<>();
tokens2.add("<YOUR_TOKEN_VALUE_1>"); // Replace with the first token to detokenize
tokens2.add("<YOUR_TOKEN_VALUE_2>"); // Replace with the second token to detokenize
ArrayList<DetokenizeData> detokenizeData2 = new ArrayList<>();
DetokenizeData detokenizeDataRecord3 = new DetokenizeData("<YOUR_TOKEN_VALUE_3>", RedactionType.DEFAULT); // Replace with a token to detokenize
DetokenizeData detokenizeDataRecord4 = new DetokenizeData("<YOUR_TOKEN_VALUE_4>"); // Replace with another token to detokenize
detokenizeData2.add(detokenizeDataRecord3);
detokenizeData2.add(detokenizeDataRecord4);

DetokenizeRequest detokenizeRequest2 = DetokenizeRequest.builder()
.tokens(tokens2) // Specify the tokens to detokenize
.continueOnError(false) // Stop processing on the first error
.redactionType(RedactionType.DEFAULT) // Use the default redaction type for detokenization
.detokenizeData(detokenizeData2) // Specify the tokens to detokenize with specified redaction types
.continueOnError(false) // Stop processing on the first error
.downloadURL(true) // Specify whether to return URLs for file data type
.build();

DetokenizeResponse detokenizeResponse2 = skyflowClient.vault("<YOUR_VAULT_ID_2>").detokenize(detokenizeRequest2); // Perform detokenization
Expand Down
8 changes: 5 additions & 3 deletions src/main/java/com/skyflow/VaultClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.skyflow.vault.data.InsertRequest;
import com.skyflow.vault.data.UpdateRequest;
import com.skyflow.vault.tokens.ColumnValue;
import com.skyflow.vault.tokens.DetokenizeData;
import com.skyflow.vault.tokens.DetokenizeRequest;
import com.skyflow.vault.tokens.TokenizeRequest;
import io.github.cdimascio.dotenv.Dotenv;
Expand Down Expand Up @@ -85,10 +86,11 @@ protected void updateVaultConfig() throws SkyflowException {
protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) {
V1DetokenizePayload payload = new V1DetokenizePayload();
payload.setContinueOnError(request.getContinueOnError());
for (String token : request.getTokens()) {
payload.setDownloadURL(request.getDownloadURL());
for (DetokenizeData detokenizeDataRecord : request.getDetokenizeData()) {
V1DetokenizeRecordRequest recordRequest = new V1DetokenizeRecordRequest();
recordRequest.setToken(token);
recordRequest.setRedaction(request.getRedactionType().getRedaction());
recordRequest.setToken(detokenizeDataRecord.getToken());
recordRequest.setRedaction(detokenizeDataRecord.getRedactionType().getRedaction());
payload.addDetokenizationParametersItem(recordRequest);
}
return payload;
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/com/skyflow/errors/ErrorMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,9 @@ public enum ErrorMessage {
BatchInsertFailure("%s0 Insert operation failed."),

// detokenize
InvalidDataTokens("%s0 Validation error. Invalid data tokens. Specify valid data tokens."),
EmptyDataTokens("%s0 Validation error. Invalid data tokens. Specify at least one data token."),
EmptyTokenInDataTokens("%s0 Validation error. Invalid data tokens. Specify a valid data token."),
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."),

// get interface
IdsKeyError("%s0 Validation error. 'ids' key is missing from the payload. Specify an 'ids' key."),
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/skyflow/logs/ErrorLogs.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,9 @@ public enum ErrorLogs {
INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT("Invalid %s1 request. For tokenMode as ENABLE_STRICT, tokens should be passed for all fields."),
MISMATCH_OF_FIELDS_AND_TOKENS("Invalid %s1 request. Keys for values and tokens are not matching."),
INSERT_RECORDS_REJECTED("Insert request resulted in failure."),
TOKENS_REQUIRED("Invalid %s1 request. Tokens are required."),
EMPTY_OR_NULL_TOKEN_IN_TOKENS("Invalid %s1 request. Token can not be null or empty in tokens at index %s2."),
DETOKENIZE_DATA_REQUIRED("Invalid %s1 request. Detokenize data is required."),
EMPTY_DETOKENIZE_DATA("Invalid %s1 request. Detokenize data can not be empty."),
EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA("Invalid %s1 request. Token can not be null or empty in detokenize data at index %s2."),
REDACTION_IS_REQUIRED("Invalid %s1 request. Redaction is required."),
DETOKENIZE_REQUEST_REJECTED("Detokenize request resulted in failure."),
IDS_IS_REQUIRED("Invalid %s1 request. Ids are required."),
Expand Down
23 changes: 12 additions & 11 deletions src/main/java/com/skyflow/utils/validations/Validations.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.skyflow.vault.connection.InvokeConnectionRequest;
import com.skyflow.vault.data.*;
import com.skyflow.vault.tokens.ColumnValue;
import com.skyflow.vault.tokens.DetokenizeData;
import com.skyflow.vault.tokens.DetokenizeRequest;
import com.skyflow.vault.tokens.TokenizeRequest;

Expand Down Expand Up @@ -212,26 +213,26 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx
}

public static void validateDetokenizeRequest(DetokenizeRequest detokenizeRequest) throws SkyflowException {
ArrayList<String> tokens = detokenizeRequest.getTokens();
if (tokens == null) {
ArrayList<DetokenizeData> detokenizeData = detokenizeRequest.getDetokenizeData();
if (detokenizeData == null) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.TOKENS_REQUIRED.getLog(), InterfaceName.DETOKENIZE.getName()
ErrorLogs.DETOKENIZE_DATA_REQUIRED.getLog(), InterfaceName.DETOKENIZE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidDataTokens.getMessage());
} else if (tokens.isEmpty()) {
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidDetokenizeData.getMessage());
} else if (detokenizeData.isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.DETOKENIZE.getName()
ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDataTokens.getMessage());
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage());
} else {
for (int index = 0; index < tokens.size(); index++) {
String token = tokens.get(index);
for (int index = 0; index < detokenizeData.size(); index++) {
String token = detokenizeData.get(index).getToken();
if (token == null || token.trim().isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_TOKENS.getLog(),
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(),
InterfaceName.DETOKENIZE.getName(), Integer.toString(index)
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDataTokens.getMessage());
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDetokenizeData.getMessage());
}
}
}
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/com/skyflow/vault/tokens/DetokenizeData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.skyflow.vault.tokens;

import com.skyflow.enums.RedactionType;

public class DetokenizeData {
private final String token;
private final RedactionType redactionType;

public DetokenizeData(String token) {
this.token = token;
this.redactionType = RedactionType.PLAIN_TEXT;
}

public DetokenizeData(String token, RedactionType redactionType) {
this.token = token;
this.redactionType = redactionType == null ? RedactionType.PLAIN_TEXT : redactionType;
}

public String getToken() {
return this.token;
}

public RedactionType getRedactionType() {
return this.redactionType;
}
}
32 changes: 15 additions & 17 deletions src/main/java/com/skyflow/vault/tokens/DetokenizeRequest.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package com.skyflow.vault.tokens;

import com.skyflow.enums.RedactionType;

import java.util.ArrayList;

public class DetokenizeRequest {
Expand All @@ -15,40 +13,40 @@ public static DetokenizeRequestBuilder builder() {
return new DetokenizeRequestBuilder();
}

public ArrayList<String> getTokens() {
return this.builder.tokens;
}

public RedactionType getRedactionType() {
return this.builder.redactionType;
public ArrayList<DetokenizeData> getDetokenizeData() {
return this.builder.detokenizeData;
}

public Boolean getContinueOnError() {
return this.builder.continueOnError;
}

public Boolean getDownloadURL() {
return this.builder.downloadURL;
}

public static final class DetokenizeRequestBuilder {
private ArrayList<String> tokens;
private RedactionType redactionType;
private ArrayList<DetokenizeData> detokenizeData;
private Boolean continueOnError;
private Boolean downloadURL;

private DetokenizeRequestBuilder() {
this.redactionType = RedactionType.PLAIN_TEXT;
this.continueOnError = false;
this.downloadURL = false;
}

public DetokenizeRequestBuilder tokens(ArrayList<String> tokens) {
this.tokens = tokens;
public DetokenizeRequestBuilder detokenizeData(ArrayList<DetokenizeData> detokenizeData) {
this.detokenizeData = detokenizeData;
return this;
}

public DetokenizeRequestBuilder redactionType(RedactionType redactionType) {
this.redactionType = redactionType == null ? RedactionType.PLAIN_TEXT : redactionType;
public DetokenizeRequestBuilder continueOnError(Boolean continueOnError) {
this.continueOnError = continueOnError != null && continueOnError;
return this;
}

public DetokenizeRequestBuilder continueOnError(Boolean continueOnError) {
this.continueOnError = continueOnError != null && continueOnError;
public DetokenizeRequestBuilder downloadURL(Boolean downloadURL) {
this.downloadURL = downloadURL;
return this;
}

Expand Down
15 changes: 10 additions & 5 deletions src/test/java/com/skyflow/VaultClientTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.skyflow.vault.data.InsertRequest;
import com.skyflow.vault.data.UpdateRequest;
import com.skyflow.vault.tokens.ColumnValue;
import com.skyflow.vault.tokens.DetokenizeData;
import com.skyflow.vault.tokens.DetokenizeRequest;
import com.skyflow.vault.tokens.TokenizeRequest;
import io.github.cdimascio.dotenv.Dotenv;
Expand All @@ -31,7 +32,7 @@ public class VaultClientTests {
private static String value = null;
private static String columnGroup = null;
private static String apiKey = null;
private static ArrayList<String> tokens = null;
private static ArrayList<DetokenizeData> detokenizeData = null;
private static ArrayList<HashMap<String, Object>> insertValues = null;
private static ArrayList<HashMap<String, Object>> insertTokens = null;
private static HashMap<String, Object> valueMap = null;
Expand All @@ -43,7 +44,7 @@ public static void setup() {
vaultID = "vault123";
clusterID = "cluster123";
token = "test_token";
tokens = new ArrayList<>();
detokenizeData = new ArrayList<>();
table = "test_table";
value = "test_value";
columnGroup = "test_column_group";
Expand Down Expand Up @@ -115,11 +116,15 @@ public void testVaultClientGetVaultConfig() {
@Test
public void testGetDetokenizePayload() {
try {
tokens.add(token);
tokens.add(token);
DetokenizeRequest detokenizeRequest = DetokenizeRequest.builder().tokens(tokens).build();
DetokenizeData detokenizeDataRecord1 = new DetokenizeData(token);
DetokenizeData detokenizeDataRecord2 = new DetokenizeData(token);
detokenizeData.add(detokenizeDataRecord1);
detokenizeData.add(detokenizeDataRecord2);
DetokenizeRequest detokenizeRequest = DetokenizeRequest.builder()
.detokenizeData(detokenizeData).downloadURL(true).build();
V1DetokenizePayload payload = vaultClient.getDetokenizePayload(detokenizeRequest);
Assert.assertFalse(payload.getContinueOnError());
Assert.assertTrue(payload.getDownloadURL());
Assert.assertEquals(2, payload.getDetokenizationParameters().size());
} catch (Exception e) {
Assert.fail(INVALID_EXCEPTION_THROWN);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void testInvalidRequestInDetokenizeMethod() {
} catch (SkyflowException e) {
Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode());
Assert.assertEquals(
Utils.parameterizedString(ErrorMessage.InvalidDataTokens.getMessage(), Constants.SDK_PREFIX),
Utils.parameterizedString(ErrorMessage.InvalidDetokenizeData.getMessage(), Constants.SDK_PREFIX),
e.getMessage()
);
}
Expand Down
Loading
Loading