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
11 changes: 10 additions & 1 deletion .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,16 @@
"servname",
"nodename",
"flowdb",
"unrenamed"
"unrenamed",
"wordprocessingml",
"spreadsheetml",
"presentationml",
"msvideo",
"matroska",
"okio",
"LOPM",
"Ghvd",
"résumé"
],
"languageSettings": [
{
Expand Down
34 changes: 34 additions & 0 deletions common/src/main/java/com/skyflow/errors/ErrorMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,40 @@ 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."),

// Get Tokens
GetTokensRequestNull("%s0 Validation error. GetTokensRequest object is null. Specify a valid GetTokensRequest object."),
EmptyGetTokensRecords("%s0 Validation error. 'records' can't be empty. Specify at least one GetTokensRequestRecord."),
GetTokensRecordNull("%s0 Validation error. GetTokensRequestRecord in the list is null. Specify a valid GetTokensRequestRecord object."),
EmptyValueInGetTokensRecord("%s0 Validation error. 'value' in GetTokensRequestRecord is null or empty. Specify a valid value."),
EmptyTokenGroupNameInGetTokensRecord("%s0 Validation error. 'tokenGroupName' in GetTokensRequestRecord is null or empty. Specify a valid token group name."),

// Upload Files
UploadFilesRequestNull("%s0 Validation error. UploadFilesRequest object is null. Specify a valid UploadFilesRequest object."),
EmptyUploadFilesRecords("%s0 Validation error. 'records' can't be empty. Specify at least one UploadFilesRequestRecord."),
UploadFilesRecordNull("%s0 Validation error. UploadFilesRequestRecord in the list is null. Specify a valid UploadFilesRequestRecord object."),
EmptyTableNameInUploadFilesRecord("%s0 Validation error. 'tableName' in UploadFilesRequestRecord is null or empty. Specify a valid table name."),
EmptySkyflowIdInUploadFilesRecord("%s0 Validation error. 'skyflowId' in UploadFilesRequestRecord is empty. Specify a valid skyflow ID, or omit it to create a new record."),
EmptyUploadFilesColumns("%s0 Validation error. 'columns' in UploadFilesRequestRecord can't be empty. Specify at least one UploadFilesRequestColumn."),
UploadFilesColumnNull("%s0 Validation error. UploadFilesRequestColumn in the list is null. Specify a valid UploadFilesRequestColumn object."),
EmptyColumnInUploadFilesColumn("%s0 Validation error. 'column' in UploadFilesRequestColumn is null or empty. Specify a valid column name."),
DuplicateColumnInUploadFilesRecord("%s0 Validation error. 'columns' in UploadFilesRequestRecord contains a duplicate column name. Specify each column only once."),
MissingFileSourceInUploadFilesColumn("%s0 Validation error. UploadFilesRequestColumn has no file. Provide one of filePath, base64, or fileObject."),
MultipleFileSourcesInUploadFilesColumn("%s0 Validation error. UploadFilesRequestColumn has more than one file. Provide exactly one of filePath, base64, or fileObject."),
InvalidFilePathInUploadFilesColumn("%s0 Validation error. No readable file at 'filePath' in UploadFilesRequestColumn. Specify the path of an existing file."),
InvalidBase64InUploadFilesColumn("%s0 Validation error. 'base64' in UploadFilesRequestColumn is not a valid base64 string. Specify valid base64-encoded content."),
FileNameRequiredWithBase64InUploadFilesColumn("%s0 Validation error. 'fileName' is required in UploadFilesRequestColumn when 'base64' is used. Specify a file name."),
InvalidFileObjectInUploadFilesColumn("%s0 Validation error. 'fileObject' in UploadFilesRequestColumn is not an existing file. Specify a valid file object."),

// Delete Files
DeleteFilesRequestNull("%s0 Validation error. DeleteFilesRequest object is null. Specify a valid DeleteFilesRequest object."),
EmptyDeleteFilesRecords("%s0 Validation error. 'records' can't be empty. Specify at least one DeleteFilesRequestRecord."),
DeleteFilesRecordNull("%s0 Validation error. DeleteFilesRequestRecord in the list is null. Specify a valid DeleteFilesRequestRecord object."),
EmptyTableNameInDeleteFilesRecord("%s0 Validation error. 'tableName' in DeleteFilesRequestRecord is null or empty. Specify a valid table name."),
EmptyDeleteFilesColumns("%s0 Validation error. 'columns' in DeleteFilesRequestRecord can't be empty. Specify at least one file column."),
EmptyColumnInDeleteFilesColumns("%s0 Validation error. 'columns' in DeleteFilesRequestRecord contains a null or empty column name. Specify valid column names."),
DuplicateColumnInDeleteFilesColumns("%s0 Validation error. 'columns' in DeleteFilesRequestRecord contains a duplicate column name. Specify each column only once."),
InvalidIdOrUniqueValuesInDeleteFilesRecord("%s0 Validation error. DeleteFilesRequestRecord must set exactly one of 'skyflowId' or 'uniqueValues'. Specify one of them."),

// Connection
InvalidRequestHeaders("%s0 Validation error. Request headers aren't valid. Specify valid request headers."),
EmptyRequestHeaders("%s0 Validation error. Request headers are empty. Specify valid request headers."),
Expand Down
32 changes: 32 additions & 0 deletions common/src/main/java/com/skyflow/logs/ErrorLogs.java
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,38 @@ public enum ErrorLogs {
TOKENIZE_DATA_SIZE_EXCEED("Maximum number of tokenize records exceeded. The limit is 100000."),
MISSING_INDEX_IN_BULK_TOKENIZE_RECORD("Invalid %s1 request. Index in BulkTokenizeRequestRecord can not be null at position %s2."),
DUPLICATE_INDEX_IN_BULK_TOKENIZE_RECORD("Invalid %s1 request. Duplicate index %s2 in BulkTokenizeRequestRecord."),
GET_TOKENS_REQUEST_REJECTED("Get tokens request resulted in failure."),
GET_TOKENS_REQUEST_NULL("Invalid %s1 request. Get tokens request can not be null."),
EMPTY_GET_TOKENS_RECORDS("Invalid %s1 request. Records can not be null or empty."),
GET_TOKENS_RECORD_NULL("Invalid %s1 request. GetTokensRequestRecord can not be null at index %s2."),
EMPTY_VALUE_IN_GET_TOKENS_RECORD("Invalid %s1 request. Value in GetTokensRequestRecord can not be null or empty at index %s2."),
EMPTY_TOKEN_GROUP_NAME_IN_GET_TOKENS_RECORD("Invalid %s1 request. Token group name in GetTokensRequestRecord can not be null or empty at index %s2."),
UPLOAD_FILES_REQUEST_REJECTED("Upload files request resulted in failure."),
UPLOAD_FILES_REQUEST_NULL("Invalid %s1 request. Upload files request can not be null."),
EMPTY_UPLOAD_FILES_RECORDS("Invalid %s1 request. Records can not be null or empty."),
UPLOAD_FILES_RECORD_NULL("Invalid %s1 request. UploadFilesRequestRecord can not be null at index %s2."),
EMPTY_TABLE_NAME_IN_UPLOAD_FILES_RECORD("Invalid %s1 request. Table name in UploadFilesRequestRecord can not be null or empty at index %s2."),
EMPTY_SKYFLOW_ID_IN_UPLOAD_FILES_RECORD("Invalid %s1 request. Skyflow ID in UploadFilesRequestRecord can not be empty at index %s2."),
EMPTY_UPLOAD_FILES_COLUMNS("Invalid %s1 request. Columns in UploadFilesRequestRecord can not be null or empty at index %s2."),
UPLOAD_FILES_COLUMN_NULL("Invalid %s1 request. UploadFilesRequestColumn can not be null in record at index %s2."),
EMPTY_COLUMN_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. Column name in UploadFilesRequestColumn can not be null or empty in record at index %s2."),
DUPLICATE_COLUMN_IN_UPLOAD_FILES_RECORD("Invalid %s1 request. Column name in UploadFilesRequestRecord can not be repeated in record at index %s2."),
MISSING_FILE_SOURCE_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. UploadFilesRequestColumn has no filePath, base64 or fileObject in record at index %s2."),
MULTIPLE_FILE_SOURCES_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. UploadFilesRequestColumn sets more than one of filePath, base64 and fileObject in record at index %s2."),
INVALID_FILE_PATH_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. File path in UploadFilesRequestColumn does not point to a readable file in record at index %s2."),
INVALID_BASE64_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. Base64 content in UploadFilesRequestColumn is invalid in record at index %s2."),
FILE_NAME_REQUIRED_WITH_BASE64_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. File name is required with base64 content in UploadFilesRequestColumn in record at index %s2."),
INVALID_FILE_OBJECT_IN_UPLOAD_FILES_COLUMN("Invalid %s1 request. File object in UploadFilesRequestColumn is not an existing file in record at index %s2."),
SIGNED_URL_UPLOAD_FAILED("Upload of a file to its signed URL failed for column %s1."),
DELETE_FILES_REQUEST_REJECTED("Delete files request resulted in failure."),
DELETE_FILES_REQUEST_NULL("Invalid %s1 request. Delete files request can not be null."),
EMPTY_DELETE_FILES_RECORDS("Invalid %s1 request. Records can not be null or empty."),
DELETE_FILES_RECORD_NULL("Invalid %s1 request. DeleteFilesRequestRecord can not be null at index %s2."),
EMPTY_TABLE_NAME_IN_DELETE_FILES_RECORD("Invalid %s1 request. Table name in DeleteFilesRequestRecord can not be null or empty at index %s2."),
EMPTY_DELETE_FILES_COLUMNS("Invalid %s1 request. Columns in DeleteFilesRequestRecord can not be null or empty at index %s2."),
EMPTY_COLUMN_IN_DELETE_FILES_COLUMNS("Invalid %s1 request. Column name in DeleteFilesRequestRecord can not be null or empty at index %s2."),
DUPLICATE_COLUMN_IN_DELETE_FILES_COLUMNS("Invalid %s1 request. Column name in DeleteFilesRequestRecord can not be repeated at index %s2."),
INVALID_ID_OR_UNIQUE_VALUES_IN_DELETE_FILES_RECORD("Invalid %s1 request. DeleteFilesRequestRecord must set exactly one of skyflow ID or unique values at index %s2."),
DELETE_REQUEST_NULL("Invalid %s1 request. Delete request can not be null."),
DELETE_REQUEST_REJECTED("Delete request resulted in failure."),
DELETE_TOKENS_REQUEST_NULL("Invalid %s1 request. DeleteTokens request can not be null."),
Expand Down
16 changes: 16 additions & 0 deletions common/src/main/java/com/skyflow/logs/InfoLogs.java
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,22 @@ public enum InfoLogs {
TOKENIZE_REQUEST_RESOLVED("Tokenize request resolved."),
TOKENIZE_SUCCESS("Data tokenized."),

// Get tokens interface
GET_TOKENS_TRIGGERED("Get tokens method triggered."),
VALIDATING_GET_TOKENS_REQUEST("Validating get tokens request."),
GET_TOKENS_REQUEST_RESOLVED("Get tokens request resolved."),

// Upload files interface
UPLOAD_FILES_TRIGGERED("Upload files method triggered."),
VALIDATING_UPLOAD_FILES_REQUEST("Validating upload files request."),
UPLOADING_FILES_TO_SIGNED_URLS("Signed upload URLs received. Uploading files."),
UPLOAD_FILES_REQUEST_RESOLVED("Upload files request resolved."),

// Delete files interface
DELETE_FILES_TRIGGERED("Delete files method triggered."),
VALIDATING_DELETE_FILES_REQUEST("Validating delete files request."),
DELETE_FILES_REQUEST_RESOLVED("Delete files request resolved."),


// Invoke connection interface
INVOKE_CONNECTION_TRIGGERED("Invoke connection method triggered."),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.skyflow.vault.data;

public class BaseDeleteFilesRequest {
protected BaseDeleteFilesRequest(BaseDeleteFilesRequestBuilder builder) {
}

static class BaseDeleteFilesRequestBuilder {
protected BaseDeleteFilesRequestBuilder() {
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.skyflow.vault.data;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.HashMap;

public class BaseDeleteFilesResponse {
private final ArrayList<HashMap<String, Object>> records;

public BaseDeleteFilesResponse(ArrayList<HashMap<String, Object>> records) {
this.records = records;
}

/**
* Returns one record map per resolved record. A record addressed by uniqueValues can resolve to
* several records, so there may be more entries than input records. Each map carries the
* skyflowId, table, the deleted columns (null on a failed record) and the per-record
* status/error.
*/
public ArrayList<HashMap<String, Object>> getRecords() {
return records;
}

@Override
public String toString() {
Gson gson = new Gson().newBuilder().serializeNulls().create();
return gson.toJson(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.skyflow.vault.data;

public class BaseGetTokensRequest {
protected BaseGetTokensRequest(BaseGetTokensRequestBuilder builder) {
}

static class BaseGetTokensRequestBuilder {
protected BaseGetTokensRequestBuilder() {
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.skyflow.vault.data;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.HashMap;

public class BaseGetTokensResponse {
private final ArrayList<HashMap<String, Object>> records;

public BaseGetTokensResponse(ArrayList<HashMap<String, Object>> records) {
this.records = records;
}

/**
* Returns one record map per input entry, in request order. Each map carries the looked-up
* value, its token group, the token (or "" when there is none), and the per-record status/error.
*/
public ArrayList<HashMap<String, Object>> getRecords() {
return records;
}

@Override
public String toString() {
Gson gson = new Gson().newBuilder().serializeNulls().create();
return gson.toJson(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.skyflow.vault.data;

public class BaseUploadFilesRequest {
protected BaseUploadFilesRequest(BaseUploadFilesRequestBuilder builder) {
}

static class BaseUploadFilesRequestBuilder {
protected BaseUploadFilesRequestBuilder() {
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.skyflow.vault.data;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.HashMap;

public class BaseUploadFilesResponse {
private final ArrayList<HashMap<String, Object>> records;

public BaseUploadFilesResponse(ArrayList<HashMap<String, Object>> records) {
this.records = records;
}

/**
* Returns one record map per input record, in request order. Each map carries the record's
* skyflowId and table, the upload status of every requested column, and the per-record
* status/error.
*/
public ArrayList<HashMap<String, Object>> getRecords() {
return records;
}

@Override
public String toString() {
Gson gson = new Gson().newBuilder().serializeNulls().create();
return gson.toJson(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.skyflow.vault.data;

import org.junit.Assert;
import org.junit.Test;

public class BaseDeleteFilesRequestTests {

@Test
public void testInstantiationDoesNotThrow() {
BaseDeleteFilesRequest request = new BaseDeleteFilesRequest(new BaseDeleteFilesRequest.BaseDeleteFilesRequestBuilder());

Assert.assertNotNull(request);
}

@Test
public void testUsableAsExtensionPointForSubclasses() {
// BaseDeleteFilesRequest carries no state of its own; it exists so module-specific
// DeleteFilesRequest classes share a supertype and builder. Verify the subtype relationship holds.
BaseDeleteFilesRequest.BaseDeleteFilesRequestBuilder builder = new BaseDeleteFilesRequest.BaseDeleteFilesRequestBuilder() {
};
BaseDeleteFilesRequest request = new BaseDeleteFilesRequest(builder) {
};

Assert.assertTrue(request instanceof BaseDeleteFilesRequest);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.skyflow.vault.data;

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class BaseDeleteFilesResponseTests {

@Test
public void testGetRecordsReturnsConstructorValue() {
HashMap<String, Object> record = new HashMap<>();
record.put("skyflowId", "sky-1");
ArrayList<HashMap<String, Object>> records = new ArrayList<>(Collections.singletonList(record));

BaseDeleteFilesResponse response = new BaseDeleteFilesResponse(records);

Assert.assertSame(records, response.getRecords());
}

@Test
public void testNullRecordsAllowed() {
BaseDeleteFilesResponse response = new BaseDeleteFilesResponse(null);

Assert.assertNull(response.getRecords());
}

@Test
public void testToStringSerializesNulls() {
HashMap<String, Object> record = new HashMap<>();
record.put("columns", null);
record.put("error", "Invalid request. skyflowID is invalid.");
BaseDeleteFilesResponse response = new BaseDeleteFilesResponse(new ArrayList<>(Collections.singletonList(record)));

String json = response.toString();

Assert.assertTrue(json, json.contains("\"columns\":null"));
Assert.assertTrue(json, json.contains("\"error\":\"Invalid request. skyflowID is invalid.\""));
}

@Test
public void testToStringWithNullRecords() {
Assert.assertEquals("{\"records\":null}", new BaseDeleteFilesResponse(null).toString());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.skyflow.vault.data;

import org.junit.Assert;
import org.junit.Test;

public class BaseGetTokensRequestTests {

@Test
public void testInstantiationDoesNotThrow() {
BaseGetTokensRequest request = new BaseGetTokensRequest(new BaseGetTokensRequest.BaseGetTokensRequestBuilder());

Assert.assertNotNull(request);
}

@Test
public void testUsableAsExtensionPointForSubclasses() {
// BaseGetTokensRequest carries no state of its own; it exists so module-specific
// GetTokensRequest classes share a supertype and builder. Verify the subtype relationship holds.
BaseGetTokensRequest.BaseGetTokensRequestBuilder builder = new BaseGetTokensRequest.BaseGetTokensRequestBuilder() {
};
BaseGetTokensRequest request = new BaseGetTokensRequest(builder) {
};

Assert.assertTrue(request instanceof BaseGetTokensRequest);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.skyflow.vault.data;

import org.junit.Assert;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class BaseGetTokensResponseTests {

@Test
public void testGetRecordsReturnsConstructorValue() {
HashMap<String, Object> record = new HashMap<>();
record.put("token", "tok-1");
ArrayList<HashMap<String, Object>> records = new ArrayList<>(Collections.singletonList(record));

BaseGetTokensResponse response = new BaseGetTokensResponse(records);

Assert.assertSame(records, response.getRecords());
}

@Test
public void testNullRecordsAllowed() {
BaseGetTokensResponse response = new BaseGetTokensResponse(null);

Assert.assertNull(response.getRecords());
}

@Test
public void testToStringSerializesNulls() {
HashMap<String, Object> record = new HashMap<>();
record.put("token", null);
record.put("error", "Token not found.");
BaseGetTokensResponse response = new BaseGetTokensResponse(new ArrayList<>(Collections.singletonList(record)));

String json = response.toString();

Assert.assertTrue(json, json.contains("\"token\":null"));
Assert.assertTrue(json, json.contains("\"error\":\"Token not found.\""));
}

@Test
public void testToStringWithNullRecords() {
Assert.assertEquals("{\"records\":null}", new BaseGetTokensResponse(null).toString());
}
}
Loading
Loading