Skip to content

Commit ca1cfb4

Browse files
SK-2967 add interfaces
1 parent 678704e commit ca1cfb4

20 files changed

Lines changed: 2571 additions & 22 deletions

File tree

common/src/main/java/com/skyflow/BaseSkyflow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.util.Map;
1717

1818

19-
abstract class BaseSkyflow<Self, V extends BaseVaultConfig, VC> implements ISkyflow<Self, V, Credentials, VC> {
19+
abstract class BaseSkyflow<Self extends BaseSkyflow, V extends BaseVaultConfig, VC> implements ISkyflow<Self, V, Credentials, VC> {
2020
protected final BaseSkyflowClientBuilder<V, VC> builder;
2121

2222
protected BaseSkyflow(BaseSkyflowClientBuilder<V, VC> builder) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ public enum ErrorLogs {
127127
EMPTY_DELETE_TOKENS_DATA("Invalid %s1 request. Delete tokens data can not be empty."),
128128
EMPTY_OR_NULL_TOKEN_IN_DELETE_TOKENS_DATA("Invalid %s1 request. Token can not be null or empty in delete tokens data at index %s2."),
129129
DELETE_TOKENS_SIZE_EXCEED("Maximum number of tokens exceeded. The limit is 10000."),
130+
DELETE_TOKENS_REQUEST_REJECTED("DeleteTokens request resulted in failure."),
130131

131132
// invoke connection interface
132133
INVOKE_CONNECTION_INVALID_CONNECTION_URL("Invalid %s1 request. Connection URL is not a valid URL."),

common/src/main/java/com/skyflow/logs/WarningLogs.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ public enum WarningLogs {
44
INVALID_BATCH_SIZE_PROVIDED("Invalid value for batch size provided, switching to default value."),
55
INVALID_CONCURRENCY_LIMIT_PROVIDED("Invalid value for concurrency limit provided, switching to default value."),
66
BATCH_SIZE_EXCEEDS_MAX_LIMIT("Provided batch size exceeds the maximum limit, switching to max limit."),
7-
CONCURRENCY_EXCEEDS_MAX_LIMIT("Provided concurrency limit exceeds the maximum limit, switching to max limit.")
7+
CONCURRENCY_EXCEEDS_MAX_LIMIT("Provided concurrency limit exceeds the maximum limit, switching to max limit."),
8+
EMPTY_DELETE_TOKENS_RESPONSE("DeleteTokens response did not include any token results."),
9+
INCOMPLETE_DELETE_TOKENS_RESPONSE("DeleteTokens response did not account for all requested tokens."),
10+
EMPTY_TOKENIZE_RESPONSE("Tokenize response did not include any record results."),
11+
INCOMPLETE_TOKENIZE_RESPONSE("Tokenize response did not account for all requested records.")
812
;
913

1014
private final String log;

common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentials(
6565
} finally {
6666
try { reader.close(); } catch (IOException ignored) {}
6767
}
68-
} catch (JsonSyntaxException e) {
68+
} catch (JsonSyntaxException | IllegalStateException e) {
6969
LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE_FORMAT.getLog());
7070
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString(
7171
ErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath()));
@@ -87,7 +87,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentialString(
8787
}
8888
JsonObject serviceAccountCredentials = JsonParser.parseString(credentials).getAsJsonObject();
8989
return getBearerTokenFromCredentials(serviceAccountCredentials, context, roles);
90-
} catch (JsonSyntaxException e) {
90+
} catch (JsonSyntaxException | IllegalStateException e) {
9191
LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING_FORMAT.getLog());
9292
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(),
9393
ErrorMessage.CredentialsStringInvalidJson.getMessage());

flowvault/src/main/java/com/skyflow/utils/Utils.java

Lines changed: 98 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.skyflow.generated.rest.types.*;
1515
import com.skyflow.logs.ErrorLogs;
1616
import com.skyflow.logs.InfoLogs;
17+
import com.skyflow.logs.WarningLogs;
1718
import com.skyflow.serviceaccount.util.BearerToken;
1819
import com.skyflow.serviceaccount.util.Token;
1920
import com.skyflow.utils.logger.LogUtil;
@@ -165,7 +166,7 @@ public static InsertResponse buildInsertResponse(V1InsertResponse res) {
165166
ArrayList<HashMap<String, Object>> insertedFields = new ArrayList<>();
166167
ArrayList<HashMap<String, Object>> errors = new ArrayList<>();
167168

168-
if (res.getRecords().isPresent()) {
169+
if (res != null && res.getRecords().isPresent()) {
169170
for (V1RecordResponseObject record : res.getRecords().get()) {
170171
if (record.getError().isPresent()) {
171172
HashMap<String, Object> errorRecord = new HashMap<>();
@@ -215,7 +216,7 @@ public static DetokenizeResponse buildDetokenizeResponse(V1FlowDetokenizeRespons
215216
ArrayList<DetokenizeRecordResponse> detokenizedFields = new ArrayList<>();
216217
ArrayList<DetokenizeRecordResponse> errors = new ArrayList<>();
217218

218-
if (res.getResponse().isPresent()) {
219+
if (res != null && res.getResponse().isPresent()) {
219220
for (V1FlowDetokenizeResponseObject record : res.getResponse().get()) {
220221
String token = record.getToken().orElse(null);
221222
String tokenGroupName = record.getTokenGroupName().orElse(null);
@@ -230,4 +231,99 @@ public static DetokenizeResponse buildDetokenizeResponse(V1FlowDetokenizeRespons
230231
}
231232
return new DetokenizeResponse(detokenizedFields, errors);
232233
}
234+
235+
public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest getDeleteTokensRequestBody(DeleteTokensRequest request, String vaultid) {
236+
return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder()
237+
.vaultId(vaultid)
238+
.tokens(request.getTokens())
239+
.build();
240+
}
241+
private static String extractRequestId(Map<String, List<String>> headers) {
242+
if (headers == null) return null;
243+
List<String> ids = headers.get(BaseConstants.REQUEST_ID_HEADER_KEY);
244+
return (ids == null || ids.isEmpty()) ? null : ids.get(0);
245+
}
246+
247+
public static DeleteTokensResponse buildDeleteTokensResponse(V1FlowDeleteTokenResponse res, Map<String, List<String>> headers, int requestedTokenCount) {
248+
ArrayList<String> deletedTokens = new ArrayList<>();
249+
ArrayList<HashMap<String, Object>> errors = new ArrayList<>();
250+
String requestId = extractRequestId(headers);
251+
if (res != null && res.getTokens().isPresent()) {
252+
for (V1DeleteTokenResponseObject record : res.getTokens().get()) {
253+
if (record.getError().isPresent()) {
254+
HashMap<String, Object> errorRecord = new HashMap<>();
255+
errorRecord.put("error", record.getError().get());
256+
record.getHttpCode().ifPresent(httpCode -> errorRecord.put("httpCode", httpCode));
257+
errorRecord.put("requestId", requestId);
258+
errors.add(errorRecord);
259+
} else {
260+
record.getValue().ifPresent(deletedTokens::add);
261+
}
262+
}
263+
if (deletedTokens.size() + errors.size() != requestedTokenCount) {
264+
LogUtil.printWarningLog(WarningLogs.INCOMPLETE_DELETE_TOKENS_RESPONSE.getLog());
265+
}
266+
} else {
267+
LogUtil.printWarningLog(WarningLogs.EMPTY_DELETE_TOKENS_RESPONSE.getLog());
268+
}
269+
return new DeleteTokensResponse(deletedTokens, errors);
270+
}
271+
272+
public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest getTokenizeRequestBody(TokenizeRequest request, String vaultid) {
273+
List<V1FlowTokenizeRequestObject> dataList = new ArrayList<>();
274+
for (TokenizeRecord record : request.getData()) {
275+
V1FlowTokenizeRequestObject obj = V1FlowTokenizeRequestObject.builder()
276+
.value(record.getValue())
277+
.tokenGroupNames(record.getTokenGroupNames())
278+
.build();
279+
dataList.add(obj);
280+
}
281+
return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest.builder()
282+
.vaultId(vaultid)
283+
.data(dataList)
284+
.build();
285+
}
286+
287+
public static TokenizeResponse buildTokenizeResponse(V1FlowTokenizeResponse res, Map<String, List<String>> headers, int requestedRecordCount) {
288+
List<TokenizeData> tokenizedData = new ArrayList<>();
289+
ArrayList<HashMap<String, Object>> errors = new ArrayList<>();
290+
String requestId = extractRequestId(headers);
291+
if (res != null && res.getResponse().isPresent()) {
292+
List<V1FlowTokenizeResponseObject> records = res.getResponse().get();
293+
int indexNumber = 0;
294+
for (V1FlowTokenizeResponseObject record : records) {
295+
Object value = record.getValue().orElse(null);
296+
TokenizeData tokenizeData = new TokenizeData(value, indexNumber);
297+
boolean hasAnySuccess = false;
298+
if (record.getTokens().isPresent()) {
299+
for (FlowTokenizeResponseObjectToken tokenObj : record.getTokens().get()) {
300+
if (tokenObj.getError().isPresent()) {
301+
HashMap<String, Object> errorRecord = new HashMap<>();
302+
errorRecord.put("error", tokenObj.getError().get());
303+
tokenObj.getHttpCode().ifPresent(httpCode -> errorRecord.put("httpCode", httpCode));
304+
tokenObj.getTokenGroupName().ifPresent(name -> errorRecord.put("tokenGroupName", name));
305+
errorRecord.put("index", indexNumber);
306+
errorRecord.put("requestId", requestId);
307+
errors.add(errorRecord);
308+
} else if (tokenObj.getTokenGroupName().isPresent() && tokenObj.getToken().isPresent()) {
309+
tokenizeData.addToken(tokenObj.getTokenGroupName().get(), tokenObj.getToken().get());
310+
hasAnySuccess = true;
311+
}
312+
}
313+
}
314+
if (hasAnySuccess) {
315+
tokenizedData.add(tokenizeData);
316+
}
317+
indexNumber++;
318+
}
319+
if (indexNumber != requestedRecordCount) {
320+
LogUtil.printWarningLog(WarningLogs.INCOMPLETE_TOKENIZE_RESPONSE.getLog());
321+
}
322+
} else {
323+
LogUtil.printWarningLog(WarningLogs.EMPTY_TOKENIZE_RESPONSE.getLog());
324+
}
325+
TokenizeResponse tokenizeResponse = new TokenizeResponse(errors);
326+
tokenizeResponse.setTokenizedData(tokenizedData);
327+
return tokenizeResponse;
328+
}
233329
}

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

Lines changed: 80 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,7 @@ public static void validateInsertRequest(InsertRequest insertRequest) throws Sky
165165
));
166166
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRecords.getMessage());
167167
}
168-
// else if (records.size() > 10000) {
169-
// LogUtil.printErrorLog(ErrorLogs.RECORD_SIZE_EXCEED.getLog());
170-
// throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.RecordSizeExceedError.getMessage());
171-
// }
168+
172169
for (InsertRecord record : records) {
173170
if(record == null){
174171
LogUtil.printErrorLog(Utils.parameterizedString(
@@ -273,13 +270,10 @@ public static void validateDetokenizeRequest(DetokenizeRequest request) throws S
273270
));
274271
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage());
275272
}
276-
// if (tokens.size() > 10000) {
277-
// LogUtil.printErrorLog(ErrorLogs.TOKENS_SIZE_EXCEED.getLog());
278-
// throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensSizeExceedError.getMessage());
279-
// }
273+
280274
for (int index = 0; index < tokens.size(); index++) {
281275
DetokenizeData token = tokens.get(index);
282-
if (token != null && token.getToken().isEmpty() && token.getToken().trim().isEmpty()) {
276+
if (token == null || token.getToken() == null || token.getToken().trim().isEmpty()) {
283277
LogUtil.printErrorLog(Utils.parameterizedString(
284278
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(),
285279
InterfaceName.DETOKENIZE.getName(),
@@ -307,7 +301,84 @@ public static void validateDetokenizeRequest(DetokenizeRequest request) throws S
307301
}
308302
}
309303
}
304+
310305
}
311306

307+
public static void validateDeleteTokensRequest(DeleteTokensRequest request) throws SkyflowException {
308+
if (request == null) {
309+
LogUtil.printErrorLog(Utils.parameterizedString(
310+
ErrorLogs.DELETE_TOKENS_REQUEST_NULL.getLog(), InterfaceName.DELETE.getName()
311+
));
312+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeleteTokensRequestNull.getMessage());
313+
}
314+
List<String> tokens = request.getTokens();
315+
if (tokens == null || tokens.isEmpty()) {
316+
LogUtil.printErrorLog(Utils.parameterizedString(
317+
ErrorLogs.EMPTY_DELETE_TOKENS_DATA.getLog(), InterfaceName.DELETE.getName()
318+
));
319+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDeleteTokensData.getMessage());
320+
}
321+
322+
for (int index = 0; index < tokens.size(); index++) {
323+
String token = tokens.get(index);
324+
if (token == null || token.trim().isEmpty()) {
325+
LogUtil.printErrorLog(Utils.parameterizedString(
326+
ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DELETE_TOKENS_DATA.getLog(),
327+
InterfaceName.DELETE.getName(),
328+
String.valueOf(index)));
329+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDeleteTokensData.getMessage());
330+
}
331+
}
332+
}
333+
334+
public static void validateTokenizeRequest(TokenizeRequest request) throws SkyflowException {
335+
if (request == null) {
336+
LogUtil.printErrorLog(Utils.parameterizedString(
337+
ErrorLogs.TOKENIZE_REQUEST_NULL.getLog(), InterfaceName.TOKENIZE.getName()
338+
));
339+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRequestNull.getMessage());
340+
}
341+
ArrayList<TokenizeRecord> data = request.getData();
342+
if (data == null || data.isEmpty()) {
343+
LogUtil.printErrorLog(Utils.parameterizedString(
344+
ErrorLogs.EMPTY_TOKENIZE_DATA.getLog(), InterfaceName.TOKENIZE.getName()
345+
));
346+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenizeData.getMessage());
347+
}
348+
for (int index = 0; index < data.size(); index++) {
349+
TokenizeRecord record = data.get(index);
350+
if (record == null) {
351+
LogUtil.printErrorLog(Utils.parameterizedString(
352+
ErrorLogs.TOKENIZE_RECORD_NULL.getLog(), InterfaceName.TOKENIZE.getName()
353+
));
354+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRecordNull.getMessage());
355+
}
356+
Object value = record.getValue();
357+
boolean isInvalidValue = value == null || (value instanceof String && ((String) value).trim().isEmpty());
358+
if (isInvalidValue) {
359+
LogUtil.printErrorLog(Utils.parameterizedString(
360+
ErrorLogs.EMPTY_VALUE_IN_TOKENIZE_RECORD.getLog(), InterfaceName.TOKENIZE.getName()
361+
));
362+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInTokenizeRecord.getMessage());
363+
}
364+
List<String> tokenGroupNames = record.getTokenGroupNames();
365+
if (tokenGroupNames == null || tokenGroupNames.isEmpty()) {
366+
LogUtil.printErrorLog(Utils.parameterizedString(
367+
ErrorLogs.EMPTY_TOKEN_GROUP_NAMES_IN_TOKENIZE_RECORD.getLog(), InterfaceName.TOKENIZE.getName()
368+
));
369+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenGroupNamesInTokenizeRecord.getMessage());
370+
}
371+
for (int groupIndex = 0; groupIndex < tokenGroupNames.size(); groupIndex++) {
372+
String groupName = tokenGroupNames.get(groupIndex);
373+
if (groupName == null || groupName.trim().isEmpty()) {
374+
LogUtil.printErrorLog(Utils.parameterizedString(
375+
ErrorLogs.EMPTY_TOKEN_GROUP_NAME_IN_TOKENIZE_RECORD.getLog(),
376+
InterfaceName.TOKENIZE.getName(),
377+
String.valueOf(groupIndex)));
378+
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenGroupNameInTokenizeRecord.getMessage());
379+
}
380+
}
381+
}
382+
}
312383

313384
}

0 commit comments

Comments
 (0)