Skip to content

Commit 301f0a4

Browse files
Merge pull request #169 from skyflowapi/release/25.2.1
Release/25.2.1
2 parents a69c8f8 + 7c12079 commit 301f0a4

17 files changed

Lines changed: 1546 additions & 856 deletions

File tree

README.md

Lines changed: 1343 additions & 758 deletions
Large diffs are not rendered by default.

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>com.skyflow</groupId>
88
<artifactId>skyflow-java</artifactId>
9-
<version>2.0.0-beta.1</version>
9+
<version>2.0.0-beta.1-dev.9f386ac</version>
1010
<packaging>jar</packaging>
1111

1212
<name>${project.groupId}:${project.artifactId}</name>

samples/src/main/java/com/example/vault/DetokenizeExample.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.skyflow.enums.Env;
77
import com.skyflow.enums.LogLevel;
88
import com.skyflow.errors.SkyflowException;
9+
import com.skyflow.vault.tokens.DetokenizeData;
910
import com.skyflow.vault.tokens.DetokenizeRequest;
1011
import com.skyflow.vault.tokens.DetokenizeResponse;
1112

@@ -45,17 +46,40 @@ public static void main(String[] args) throws SkyflowException {
4546

4647
// Step 5: Detokenize tokens from the first vault
4748
try {
48-
ArrayList<String> tokens = new ArrayList<>();
49-
tokens.add("<YOUR_TOKEN_VALUE_1>"); // Replace with the first token to detokenize
50-
tokens.add("<YOUR_TOKEN_VALUE_2>"); // Replace with the second token to detokenize
49+
ArrayList<DetokenizeData> detokenizeData1 = new ArrayList<>();
50+
DetokenizeData detokenizeDataRecord1 = new DetokenizeData("<YOUR_TOKEN_VALUE_1>", RedactionType.MASKED); // Replace with a token to detokenize with MASKED redaction
51+
DetokenizeData detokenizeDataRecord2 = new DetokenizeData("<YOUR_TOKEN_VALUE_2>"); // Replace with another token to detokenize with PLAIN_TEXT redaction
52+
detokenizeData1.add(detokenizeDataRecord1);
53+
detokenizeData1.add(detokenizeDataRecord2);
5154

52-
DetokenizeRequest detokenizeRequest = DetokenizeRequest.builder()
53-
.tokens(tokens) // Specify the tokens to detokenize
54-
.continueOnError(true) // Continue processing even if an error occurs for some tokens
55+
DetokenizeRequest detokenizeRequest1 = DetokenizeRequest.builder()
56+
.detokenizeData(detokenizeData1) // Specify the tokens to detokenize with specified redaction types
57+
.continueOnError(true) // Continue processing even if an error occurs for some tokens
5558
.build();
5659

57-
DetokenizeResponse detokenizeResponse = skyflowClient.vault().detokenize(detokenizeRequest); // Perform detokenization
58-
System.out.println("Detokenize Response: " + detokenizeResponse);
60+
DetokenizeResponse detokenizeResponse1 = skyflowClient.vault().detokenize(detokenizeRequest1); // Perform detokenization
61+
System.out.println("Detokenize Response (Vault 1): " + detokenizeResponse1);
62+
} catch (SkyflowException e) {
63+
System.out.println("Error during detokenization in Vault 1:");
64+
e.printStackTrace();
65+
}
66+
67+
// Example 2: Detokenize tokens from the second vault
68+
try {
69+
ArrayList<DetokenizeData> detokenizeData2 = new ArrayList<>();
70+
DetokenizeData detokenizeDataRecord3 = new DetokenizeData("<YOUR_TOKEN_VALUE_3>", RedactionType.DEFAULT); // Replace with a token to detokenize
71+
DetokenizeData detokenizeDataRecord4 = new DetokenizeData("<YOUR_TOKEN_VALUE_4>"); // Replace with another token to detokenize
72+
detokenizeData2.add(detokenizeDataRecord3);
73+
detokenizeData2.add(detokenizeDataRecord4);
74+
75+
DetokenizeRequest detokenizeRequest2 = DetokenizeRequest.builder()
76+
.detokenizeData(detokenizeData2) // Specify the tokens to detokenize with specified redaction types
77+
.continueOnError(false) // Stop processing on the first error
78+
.downloadURL(true) // Specify whether to return URLs for file data type
79+
.build();
80+
81+
DetokenizeResponse detokenizeResponse2 = skyflowClient.vault("<YOUR_VAULT_ID_2>").detokenize(detokenizeRequest2); // Perform detokenization
82+
System.out.println("Detokenize Response (Vault 2): " + detokenizeResponse2);
5983
} catch (SkyflowException e) {
6084
System.out.println("Error during detokenization in Vault: " + e);
6185
}

src/main/java/com/skyflow/VaultClient.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.skyflow.vault.data.InsertRequest;
2121
import com.skyflow.vault.data.UpdateRequest;
2222
import com.skyflow.vault.tokens.ColumnValue;
23+
import com.skyflow.vault.tokens.DetokenizeData;
2324
import com.skyflow.vault.tokens.DetokenizeRequest;
2425
import com.skyflow.vault.tokens.TokenizeRequest;
2526
import io.github.cdimascio.dotenv.Dotenv;
@@ -85,10 +86,11 @@ protected void updateVaultConfig() throws SkyflowException {
8586
protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) {
8687
V1DetokenizePayload payload = new V1DetokenizePayload();
8788
payload.setContinueOnError(request.getContinueOnError());
88-
for (String token : request.getTokens()) {
89+
payload.setDownloadURL(request.getDownloadURL());
90+
for (DetokenizeData detokenizeDataRecord : request.getDetokenizeData()) {
8991
V1DetokenizeRecordRequest recordRequest = new V1DetokenizeRecordRequest();
90-
recordRequest.setToken(token);
91-
recordRequest.setRedaction(request.getRedactionType().getRedaction());
92+
recordRequest.setToken(detokenizeDataRecord.getToken());
93+
recordRequest.setRedaction(detokenizeDataRecord.getRedactionType().getRedaction());
9294
payload.addDetokenizationParametersItem(recordRequest);
9395
}
9496
return payload;

src/main/java/com/skyflow/errors/ErrorMessage.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,9 @@ public enum ErrorMessage {
7373
BatchInsertFailure("%s0 Insert operation failed."),
7474

7575
// detokenize
76-
InvalidDataTokens("%s0 Validation error. Invalid data tokens. Specify valid data tokens."),
77-
EmptyDataTokens("%s0 Validation error. Invalid data tokens. Specify at least one data token."),
78-
EmptyTokenInDataTokens("%s0 Validation error. Invalid data tokens. Specify a valid data token."),
76+
InvalidDetokenizeData("%s0 Validation error. Invalid detokenize data. Specify valid detokenize data."),
77+
EmptyDetokenizeData("%s0 Validation error. Invalid data tokens. Specify at least one data token."),
78+
EmptyTokenInDetokenizeData("%s0 Validation error. Invalid data tokens. Specify a valid data token."),
7979

8080
// get interface
8181
IdsKeyError("%s0 Validation error. 'ids' key is missing from the payload. Specify an 'ids' key."),

src/main/java/com/skyflow/errors/SkyflowException.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,18 @@ public SkyflowException(int httpCode, Throwable cause, Map<String, List<String>>
4141
super(cause);
4242
this.httpCode = httpCode;
4343
setRequestId(responseHeaders);
44-
setResponseBody(responseBody);
44+
setResponseBody(responseBody, responseHeaders);
4545
}
4646

47-
private void setResponseBody(String responseBody) {
47+
private void setResponseBody(String responseBody, Map<String, List<String>> responseHeaders) {
4848
try {
4949
if (responseBody != null) {
5050
this.responseBody = JsonParser.parseString(responseBody).getAsJsonObject();
5151
if (this.responseBody.get("error") != null) {
5252
setGrpcCode();
5353
setHttpStatus();
5454
setMessage();
55-
setDetails();
55+
setDetails(responseHeaders);
5656
}
5757
}
5858
} catch (JsonSyntaxException e) {
@@ -86,9 +86,19 @@ private void setHttpStatus() {
8686
this.httpStatus = statusElement == null ? null : statusElement.getAsString();
8787
}
8888

89-
private void setDetails() {
89+
private void setDetails(Map<String, List<String>> responseHeaders) {
9090
JsonElement detailsElement = ((JsonObject) responseBody.get("error")).get("details");
91-
this.details = detailsElement == null ? null : detailsElement.getAsJsonArray();
91+
List<String> errorFromClientHeader = responseHeaders.get("error-from-client");
92+
if (detailsElement != null) {
93+
this.details = detailsElement.getAsJsonArray();
94+
}
95+
if (errorFromClientHeader != null) {
96+
this.details = this.details == null ? new JsonArray() : this.details;
97+
String errorFromClient = errorFromClientHeader.get(0);
98+
JsonObject detailObject = new JsonObject();
99+
detailObject.addProperty("errorFromClient", errorFromClient);
100+
this.details.add(detailObject);
101+
}
92102
}
93103

94104
public int getHttpCode() {

src/main/java/com/skyflow/logs/ErrorLogs.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,9 @@ public enum ErrorLogs {
6161
INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT("Invalid %s1 request. For tokenMode as ENABLE_STRICT, tokens should be passed for all fields."),
6262
MISMATCH_OF_FIELDS_AND_TOKENS("Invalid %s1 request. Keys for values and tokens are not matching."),
6363
INSERT_RECORDS_REJECTED("Insert request resulted in failure."),
64-
TOKENS_REQUIRED("Invalid %s1 request. Tokens are required."),
65-
EMPTY_OR_NULL_TOKEN_IN_TOKENS("Invalid %s1 request. Token can not be null or empty in tokens at index %s2."),
64+
DETOKENIZE_DATA_REQUIRED("Invalid %s1 request. Detokenize data is required."),
65+
EMPTY_DETOKENIZE_DATA("Invalid %s1 request. Detokenize data can not be empty."),
66+
EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA("Invalid %s1 request. Token can not be null or empty in detokenize data at index %s2."),
6667
REDACTION_IS_REQUIRED("Invalid %s1 request. Redaction is required."),
6768
DETOKENIZE_REQUEST_REJECTED("Detokenize request resulted in failure."),
6869
IDS_IS_REQUIRED("Invalid %s1 request. Ids are required."),

src/main/java/com/skyflow/utils/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,5 @@ public final class Constants {
2424
public static final String SDK_METRIC_RUNTIME_DETAILS_PREFIX = "Java@";
2525
public static final String SDK_AUTH_HEADER_KEY = "x-skyflow-authorization";
2626
public static final String SDK_METRICS_HEADER_KEY = "sky-metadata";
27+
public static final String REQUEST_ID_HEADER_KEY = "x-request-id";
2728
}

src/main/java/com/skyflow/utils/validations/Validations.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import com.skyflow.vault.connection.InvokeConnectionRequest;
1919
import com.skyflow.vault.data.*;
2020
import com.skyflow.vault.tokens.ColumnValue;
21+
import com.skyflow.vault.tokens.DetokenizeData;
2122
import com.skyflow.vault.tokens.DetokenizeRequest;
2223
import com.skyflow.vault.tokens.TokenizeRequest;
2324

@@ -212,26 +213,26 @@ public static void validateCredentials(Credentials credentials) throws SkyflowEx
212213
}
213214

214215
public static void validateDetokenizeRequest(DetokenizeRequest detokenizeRequest) throws SkyflowException {
215-
ArrayList<String> tokens = detokenizeRequest.getTokens();
216-
if (tokens == null) {
216+
ArrayList<DetokenizeData> detokenizeData = detokenizeRequest.getDetokenizeData();
217+
if (detokenizeData == null) {
217218
LogUtil.printErrorLog(Utils.parameterizedString(
218-
ErrorLogs.TOKENS_REQUIRED.getLog(), InterfaceName.DETOKENIZE.getName()
219+
ErrorLogs.DETOKENIZE_DATA_REQUIRED.getLog(), InterfaceName.DETOKENIZE.getName()
219220
));
220-
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidDataTokens.getMessage());
221-
} else if (tokens.isEmpty()) {
221+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidDetokenizeData.getMessage());
222+
} else if (detokenizeData.isEmpty()) {
222223
LogUtil.printErrorLog(Utils.parameterizedString(
223-
ErrorLogs.EMPTY_TOKENS.getLog(), InterfaceName.DETOKENIZE.getName()
224+
ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName()
224225
));
225-
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDataTokens.getMessage());
226+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage());
226227
} else {
227-
for (int index = 0; index < tokens.size(); index++) {
228-
String token = tokens.get(index);
228+
for (int index = 0; index < detokenizeData.size(); index++) {
229+
String token = detokenizeData.get(index).getToken();
229230
if (token == null || token.trim().isEmpty()) {
230231
LogUtil.printErrorLog(Utils.parameterizedString(
231-
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_TOKENS.getLog(),
232+
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(),
232233
InterfaceName.DETOKENIZE.getName(), Integer.toString(index)
233234
));
234-
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDataTokens.getMessage());
235+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDetokenizeData.getMessage());
235236
}
236237
}
237238
}

src/main/java/com/skyflow/vault/controller/VaultController.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
import com.skyflow.enums.RedactionType;
88
import com.skyflow.errors.SkyflowException;
99
import com.skyflow.generated.rest.ApiException;
10+
import com.skyflow.generated.rest.ApiResponse;
1011
import com.skyflow.generated.rest.models.*;
1112
import com.skyflow.logs.ErrorLogs;
1213
import com.skyflow.logs.InfoLogs;
14+
import com.skyflow.utils.Constants;
1315
import com.skyflow.utils.logger.LogUtil;
1416
import com.skyflow.utils.validations.Validations;
1517
import com.skyflow.vault.data.*;
@@ -18,6 +20,7 @@
1820
import java.util.ArrayList;
1921
import java.util.HashMap;
2022
import java.util.List;
23+
import java.util.Map;
2124

2225
public final class VaultController extends VaultClient {
2326
private static final Gson gson = new GsonBuilder().serializeNulls().create();
@@ -111,7 +114,7 @@ private static synchronized HashMap<String, Object> getFormattedQueryRecord(V1Fi
111114
public InsertResponse insert(InsertRequest insertRequest) throws SkyflowException {
112115
LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog());
113116
V1InsertRecordResponse bulkInsertResult = null;
114-
V1BatchOperationResponse batchInsertResult = null;
117+
ApiResponse<V1BatchOperationResponse> batchInsertResult = null;
115118
ArrayList<HashMap<String, Object>> insertedFields = new ArrayList<>();
116119
ArrayList<HashMap<String, Object>> errorFields = new ArrayList<>();
117120
Boolean continueOnError = insertRequest.getContinueOnError();
@@ -121,15 +124,18 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio
121124
setBearerToken();
122125
if (continueOnError) {
123126
RecordServiceBatchOperationBody insertBody = super.getBatchInsertRequestBody(insertRequest);
124-
batchInsertResult = super.getRecordsApi().recordServiceBatchOperation(super.getVaultConfig().getVaultId(), insertBody);
127+
batchInsertResult = super.getRecordsApi().recordServiceBatchOperationWithHttpInfo(super.getVaultConfig().getVaultId(), insertBody);
125128
LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog());
126-
List<Object> records = batchInsertResult.getResponses();
129+
Map<String, List<String>> responseHeaders = batchInsertResult.getHeaders();
130+
String requestId = responseHeaders.get(Constants.REQUEST_ID_HEADER_KEY).get(0);
131+
List<Object> records = batchInsertResult.getData().getResponses();
127132
for (int index = 0; index < records.size(); index++) {
128133
Object record = records.get(index);
129134
HashMap<String, Object> insertRecord = getFormattedBatchInsertRecord(record, index);
130135
if (insertRecord.containsKey("skyflowId")) {
131136
insertedFields.add(insertRecord);
132137
} else {
138+
insertRecord.put("requestId", requestId);
133139
errorFields.add(insertRecord);
134140
}
135141
}
@@ -156,23 +162,27 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio
156162

157163
public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws SkyflowException {
158164
LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog());
159-
V1DetokenizeResponse result = null;
165+
ApiResponse<V1DetokenizeResponse> result = null;
160166
ArrayList<DetokenizeRecordResponse> detokenizedFields = new ArrayList<>();
161167
ArrayList<DetokenizeRecordResponse> errorRecords = new ArrayList<>();
162168
try {
163169
LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog());
164170
Validations.validateDetokenizeRequest(detokenizeRequest);
165171
setBearerToken();
166172
V1DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest);
167-
result = super.getTokensApi().recordServiceDetokenize(super.getVaultConfig().getVaultId(), payload);
173+
result = super.getTokensApi().recordServiceDetokenizeWithHttpInfo(super.getVaultConfig().getVaultId(), payload);
168174
LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog());
169-
List<V1DetokenizeRecordResponse> records = result.getRecords();
175+
Map<String, List<String>> responseHeaders = result.getHeaders();
176+
String requestId = responseHeaders.get(Constants.REQUEST_ID_HEADER_KEY).get(0);
177+
List<V1DetokenizeRecordResponse> records = result.getData().getRecords();
178+
170179
if (records != null) {
171180
for (V1DetokenizeRecordResponse record : records) {
172-
DetokenizeRecordResponse recordResponse = new DetokenizeRecordResponse(record);
173181
if (record.getError() != null) {
182+
DetokenizeRecordResponse recordResponse = new DetokenizeRecordResponse(record, requestId);
174183
errorRecords.add(recordResponse);
175184
} else {
185+
DetokenizeRecordResponse recordResponse = new DetokenizeRecordResponse(record);
176186
detokenizedFields.add(recordResponse);
177187
}
178188
}

0 commit comments

Comments
 (0)