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
18 changes: 18 additions & 0 deletions v3/src/main/java/com/skyflow/enums/CustomHeaderKey.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.skyflow.enums;

public enum CustomHeaderKey {
SkyflowAccountID("x-skyflow-account-id"),
SkyflowAccountName("x-skyflow-account-name"),
RequestIDHeader("x-request-id");

private final String value;

CustomHeaderKey(String value) {
this.value = value;
}

@Override
public String toString() {
return this.value;
}
}
142 changes: 113 additions & 29 deletions v3/src/main/java/com/skyflow/utils/Utils.java

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions v3/src/main/java/com/skyflow/utils/validations/Validations.java
Original file line number Diff line number Diff line change
Expand Up @@ -140,15 +140,15 @@ public static void validateDetokenizeRequest(DetokenizeRequest request) throws S
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DetokenizeRequestNull.getMessage());
}
List<String> tokens = request.getTokens();
if (tokens.size() > 10000) {
LogUtil.printErrorLog(ErrorLogs.TOKENS_SIZE_EXCEED.getLog());
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensSizeExceedError.getMessage());
}
if (tokens == null || tokens.isEmpty()) {
LogUtil.printErrorLog(Utils.parameterizedString(
ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName()
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage());
));
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage());
}
if (tokens.size() > 10000) {
LogUtil.printErrorLog(ErrorLogs.TOKENS_SIZE_EXCEED.getLog());
throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokensSizeExceedError.getMessage());
}
for (int index = 0; index < tokens.size(); index++) {
String token = tokens.get(index);
Expand Down
393 changes: 242 additions & 151 deletions v3/src/main/java/com/skyflow/vault/controller/VaultController.java

Large diffs are not rendered by default.

30 changes: 30 additions & 0 deletions v3/src/main/java/com/skyflow/vault/data/DeleteTokensOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.skyflow.vault.data;

public final class DeleteTokensOptions {
private final RequestInterceptor interceptor;

private DeleteTokensOptions(Builder builder) {
this.interceptor = builder.interceptor;
}

public RequestInterceptor getInterceptor() {
return interceptor;
}

public static Builder builder() {
return new Builder();
}

public static final class Builder {
private RequestInterceptor interceptor;

public Builder interceptor(RequestInterceptor interceptor) {
this.interceptor = interceptor;
return this;
}

public DeleteTokensOptions build() {
return new DeleteTokensOptions(this);
}
}
}
30 changes: 30 additions & 0 deletions v3/src/main/java/com/skyflow/vault/data/DetokenizeOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.skyflow.vault.data;

public final class DetokenizeOptions {
private final RequestInterceptor interceptor;

private DetokenizeOptions(Builder builder) {
this.interceptor = builder.interceptor;
}

public RequestInterceptor getInterceptor() {
return interceptor;
}

public static Builder builder() {
return new Builder();
}

public static final class Builder {
private RequestInterceptor interceptor;

public Builder interceptor(RequestInterceptor interceptor) {
this.interceptor = interceptor;
return this;
}

public DetokenizeOptions build() {
return new DetokenizeOptions(this);
}
}
}
16 changes: 14 additions & 2 deletions v3/src/main/java/com/skyflow/vault/data/ErrorRecord.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,22 @@ public class ErrorRecord {
private String error;
@Expose(serialize = true)
private int code;
// public ErrorRecord() {
// }
@Expose(serialize = true)
private String requestId;

public ErrorRecord(int index, String error, int code) {
this.index = index;
this.error = error;
this.code = code;
}

public ErrorRecord(int index, String error, int code, String requestId) {
this.index = index;
this.error = error;
this.code = code;
this.requestId = requestId;
}

public String getError() {
return error;
}
Expand All @@ -30,6 +38,10 @@ public int getIndex() {
return index;
}

public String getRequestId() {
return requestId;
}


@Override
public String toString() {
Expand Down
30 changes: 30 additions & 0 deletions v3/src/main/java/com/skyflow/vault/data/InsertOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.skyflow.vault.data;

public final class InsertOptions {
private final RequestInterceptor interceptor;

private InsertOptions(Builder builder) {
this.interceptor = builder.interceptor;
}

public RequestInterceptor getInterceptor() {
return interceptor;
}

public static Builder builder() {
return new Builder();
}

public static final class Builder {
private RequestInterceptor interceptor;

public Builder interceptor(RequestInterceptor interceptor) {
this.interceptor = interceptor;
return this;
}

public InsertOptions build() {
return new InsertOptions(this);
}
}
}
32 changes: 32 additions & 0 deletions v3/src/main/java/com/skyflow/vault/data/RequestContext.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.skyflow.vault.data;

import com.skyflow.enums.CustomHeaderKey;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public final class RequestContext {
private final String operation;
private final int batchIndex;
private final int totalBatches;
private final Map<CustomHeaderKey, String> headers = new HashMap<>();

public RequestContext(String operation, int batchIndex, int totalBatches) {
this.operation = operation;
this.batchIndex = batchIndex;
this.totalBatches = totalBatches;
}

public String getOperation() { return operation; }
public int getBatchIndex() { return batchIndex; }
public int getTotalBatches() { return totalBatches; }

public void addHeader(CustomHeaderKey key, String value) {
headers.put(key, value);
}

public Map<CustomHeaderKey, String> getHeaders() {
return Collections.unmodifiableMap(headers);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.skyflow.vault.data;

@FunctionalInterface
public interface RequestInterceptor {
void intercept(RequestContext context);
}
30 changes: 30 additions & 0 deletions v3/src/main/java/com/skyflow/vault/data/TokenizeOptions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.skyflow.vault.data;

public final class TokenizeOptions {
private final RequestInterceptor interceptor;

private TokenizeOptions(Builder builder) {
this.interceptor = builder.interceptor;
}

public RequestInterceptor getInterceptor() {
return interceptor;
}

public static Builder builder() {
return new Builder();
}

public static final class Builder {
private RequestInterceptor interceptor;

public Builder interceptor(RequestInterceptor interceptor) {
this.interceptor = interceptor;
return this;
}

public TokenizeOptions build() {
return new TokenizeOptions(this);
}
}
}
133 changes: 133 additions & 0 deletions v3/src/test/java/com/skyflow/SkyflowTests.java
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,139 @@ public void testSetLogLevelReturnsBuilder() {
}
}

@Test
public void testSetLogLevelNullDefaultsToError() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Skyflow skyflow = Skyflow.builder()
.setLogLevel(null)
.addVaultConfig(config)
.build();

Assert.assertEquals(LogLevel.ERROR, skyflow.getLogLevel());
} catch (Exception e) {
Assert.fail("Unexpected exception: " + e.getMessage());
}
}

@Test
public void testAddSkyflowCredentials_invalidCredentials_throws() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Credentials badCreds = new Credentials();
badCreds.setToken(""); // empty token — invalid

Skyflow.builder()
.addVaultConfig(config)
.addSkyflowCredentials(badCreds);
Assert.fail(EXCEPTION_NOT_THROWN);
} catch (SkyflowException e) {
Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode());
Assert.assertEquals(ErrorMessage.EmptyToken.getMessage(), e.getMessage());
}
}

@Test
public void testAddSkyflowCredentials_propagatesToVaultController() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Credentials creds = new Credentials();
creds.setToken(token);

Skyflow skyflow = Skyflow.builder()
.addVaultConfig(config)
.addSkyflowCredentials(creds)
.build();

VaultController controller = skyflow.vault();
Assert.assertNotNull(controller);

// verify that common credentials were propagated — the controller should
// hold the credentials we passed, not null
Object builder = getField(skyflow, "builder");
Credentials storedCreds = (Credentials) getField(builder.getClass().getSuperclass(), builder, "skyflowCredentials");
Assert.assertEquals(token, storedCreds.getToken());
} catch (Exception e) {
Assert.fail("Unexpected exception: " + e.getMessage());
}
}

@Test
public void testAddSkyflowCredentials_returnsBuilderForChaining() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Credentials creds = new Credentials();
creds.setToken(token);

Skyflow.SkyflowClientBuilder builder = Skyflow.builder().addVaultConfig(config);
Skyflow.SkyflowClientBuilder returned = builder.addSkyflowCredentials(creds);
Assert.assertSame(builder, returned);
} catch (Exception e) {
Assert.fail("Unexpected exception: " + e.getMessage());
}
}

@Test
public void testGetVaultConfig_returnsStoredConfig() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Skyflow skyflow = Skyflow.builder().addVaultConfig(config).build();
VaultConfig stored = skyflow.getVaultConfig();

Assert.assertNotNull(stored);
Assert.assertEquals(vaultID, stored.getVaultId());
Assert.assertEquals(clusterID, stored.getClusterId());
Assert.assertEquals(Env.SANDBOX, stored.getEnv());
} catch (Exception e) {
Assert.fail("Unexpected exception: " + e.getMessage());
}
}

@Test
public void testGetVaultConfig_returnsCloneNotOriginal() {
try {
VaultConfig config = new VaultConfig();
config.setVaultId(vaultID);
config.setClusterId(clusterID);
config.setEnv(Env.SANDBOX);

Skyflow skyflow = Skyflow.builder().addVaultConfig(config).build();
VaultConfig stored = skyflow.getVaultConfig();

// The stored config must be a different object from the one passed in
Assert.assertNotSame(config, stored);
} catch (Exception e) {
Assert.fail("Unexpected exception: " + e.getMessage());
}
}

@Test
public void testBuilderReturnsNewInstanceEachCall() {
Skyflow.SkyflowClientBuilder b1 = Skyflow.builder();
Skyflow.SkyflowClientBuilder b2 = Skyflow.builder();
Assert.assertNotSame(b1, b2);
}

private Object getField(Object instance, String fieldName) throws Exception {
Field f = instance.getClass().getDeclaredField(fieldName);
f.setAccessible(true);
Expand Down
Loading
Loading