Skip to content

Commit e742fed

Browse files
Merge pull request #81 from skyflowapi/release/23.6.1
SK-340/Release/23.6.1
2 parents b0fa33c + b01d735 commit e742fed

File tree

13 files changed

+189
-27
lines changed

13 files changed

+189
-27
lines changed

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>1.8.2</version>
9+
<version>1.9.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>${project.groupId}:${project.artifactId}</name>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.skyflow.common.utils;
2+
3+
public class Constants {
4+
5+
public static final String SDK_METRICS_HEADER_KEY = "sky-metadata";
6+
public static final String SDK_VERSION = "1.9.0";
7+
8+
}

src/main/java/com/skyflow/common/utils/Helpers.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,5 +333,42 @@ public static PrivateKey parsePkcs8PrivateKey(byte[] pkcs8Bytes) throws SkyflowE
333333
}
334334
return privateKey;
335335
}
336+
public static JSONObject getMetrics(){
337+
JSONObject details = new JSONObject();
338+
339+
String sdkVersion = Constants.SDK_VERSION;
340+
String deviceModel = "";
341+
String osDetails = "";
342+
String javaVersion = "";
343+
344+
details.put("sdk_name_version", "skyflow-java@" + sdkVersion);
345+
346+
// Retrieve device model
347+
try {
348+
deviceModel = System.getProperty("os.name");
349+
} catch (Exception e) {
350+
deviceModel = "";
351+
}
352+
details.put("sdk_client_device_model", deviceModel);
353+
354+
// Retrieve OS details
355+
try {
356+
osDetails = System.getProperty("os.version");
357+
} catch (Exception e) {
358+
osDetails = "";
359+
}
360+
details.put("sdk_client_os_details", osDetails);
361+
362+
// Retrieve Java version details
363+
try {
364+
javaVersion = System.getProperty("java.version");
365+
} catch (Exception e) {
366+
javaVersion = "";
367+
}
368+
details.put("sdk_runtime_details", "Java@" + javaVersion);
369+
370+
return details;
371+
}
372+
336373

337374
}

src/main/java/com/skyflow/entities/DetokenizeRecord.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
public class DetokenizeRecord {
77
private String token;
8+
private RedactionType redaction = RedactionType.PLAIN_TEXT;
89

910
public String getToken() {
1011
return token;
@@ -13,4 +14,12 @@ public String getToken() {
1314
void setToken(String token) {
1415
this.token = token;
1516
}
17+
18+
public RedactionType getRedaction() {
19+
return redaction;
20+
}
21+
22+
public void setRedaction(RedactionType redaction) {
23+
this.redaction = redaction;
24+
}
1625
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public enum ErrorLogs {
4545
InvalidColumnInUpsertOption("Invalid column in upsert object, non empty string is required."),
4646
InvalidUpsertObjectType("upsert option cannot be null, should be an UpsertOption object."),
4747
InvalidSkyflowId("Skyflow Id is missing"),
48-
InvalidField("Fields missing");
48+
InvalidField("Fields missing"),
49+
InvalidToken("Invalid Token value");
4950

5051
private final String log;
5152

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package com.skyflow.serviceaccount.util;
55

66
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import com.skyflow.common.utils.Constants;
78
import com.skyflow.common.utils.Helpers;
89
import com.skyflow.common.utils.HttpUtility;
910
import com.skyflow.common.utils.LogUtil;
@@ -23,6 +24,8 @@
2324
import java.net.URL;
2425
import java.security.PrivateKey;
2526
import java.util.Date;
27+
import java.util.HashMap;
28+
import java.util.Map;
2629
import java.util.Objects;
2730

2831
public class BearerToken {
@@ -175,6 +178,9 @@ private static ResponseToken getBearerTokenFromCreds(JSONObject creds, String co
175178

176179
String signedUserJWT = getSignedToken(clientID, keyID, tokenURI, pvtKey, context);
177180

181+
Map<String, String> headers = new HashMap<>();
182+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
183+
178184
JSONObject parameters = new JSONObject();
179185
parameters.put("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer");
180186
parameters.put("assertion", signedUserJWT);
@@ -183,7 +189,7 @@ private static ResponseToken getBearerTokenFromCreds(JSONObject creds, String co
183189
parameters.put("scope", scopedRoles);
184190
}
185191

186-
String response = HttpUtility.sendRequest("POST", new URL(tokenURI), parameters, null);
192+
String response = HttpUtility.sendRequest("POST", new URL(tokenURI), parameters, headers);
187193

188194
responseToken = new ObjectMapper().readValue(response, ResponseToken.class);
189195

src/main/java/com/skyflow/serviceaccount/util/Token.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import com.fasterxml.jackson.core.JsonParseException;
77
import com.fasterxml.jackson.databind.JsonMappingException;
88
import com.fasterxml.jackson.databind.ObjectMapper;
9-
import com.skyflow.common.utils.Helpers;
10-
import com.skyflow.common.utils.HttpUtility;
11-
import com.skyflow.common.utils.LogUtil;
12-
import com.skyflow.common.utils.TokenUtils;
9+
import com.skyflow.common.utils.*;
1310
import com.skyflow.entities.ResponseToken;
1411
import com.skyflow.errors.ErrorCode;
1512
import com.skyflow.errors.SkyflowException;
@@ -30,6 +27,8 @@
3027
import java.nio.file.Paths;
3128
import java.security.PrivateKey;
3229
import java.util.Date;
30+
import java.util.HashMap;
31+
import java.util.Map;
3332

3433
public final class Token {
3534

@@ -130,6 +129,8 @@ private static ResponseToken getSATokenFromCredsFile(JSONObject creds) throws Sk
130129
LogUtil.printErrorLog(ErrorLogs.InvalidTokenURI.getLog());
131130
throw new SkyflowException(ErrorCode.InvalidTokenURI);
132131
}
132+
Map<String, String> headers = new HashMap<>();
133+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
133134

134135
PrivateKey pvtKey = Helpers.getPrivateKeyFromPem((String) creds.get("privateKey"));
135136

@@ -139,7 +140,7 @@ private static ResponseToken getSATokenFromCredsFile(JSONObject creds) throws Sk
139140
parameters.put("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer");
140141
parameters.put("assertion", signedUserJWT);
141142

142-
String response = HttpUtility.sendRequest("POST", new URL(tokenURI), parameters, null);
143+
String response = HttpUtility.sendRequest("POST", new URL(tokenURI), parameters, headers);
143144

144145
responseToken = new ObjectMapper().readValue(response, ResponseToken.class);
145146

src/main/java/com/skyflow/vault/Detokenize.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,20 @@ public String call() throws SkyflowException {
3636

3737
try {
3838
if (record.getToken() == null || record.getToken().isEmpty()) {
39-
LogUtil.printErrorLog(ErrorLogs.InvalidBearerToken.getLog());
39+
LogUtil.printErrorLog(ErrorLogs.InvalidToken.getLog());
4040
throw new SkyflowException(ErrorCode.InvalidToken);
41+
} else if (record.getRedaction() == null || record.getRedaction().toString().isEmpty()) {
42+
LogUtil.printErrorLog(ErrorLogs.InvalidDetokenizeInput.getLog());
43+
throw new SkyflowException(ErrorCode.InvalidDetokenizeInput);
4144
}
42-
JSONObject bodyJson = new JSONObject();
43-
JSONArray tokensArray = new JSONArray();
44-
JSONObject token = new JSONObject();
45-
token.put("token", record.getToken());
46-
tokensArray.add(token);
47-
bodyJson.put("detokenizationParameters", tokensArray);
4845

46+
JSONObject bodyJson = new JSONObject();
47+
JSONArray detokenizationParameters = new JSONArray();
48+
JSONObject parameterObject = new JSONObject();
49+
parameterObject.put("token", record.getToken());
50+
parameterObject.put("redaction", record.getRedaction().toString());
51+
detokenizationParameters.add(parameterObject);
52+
bodyJson.put("detokenizationParameters", detokenizationParameters);
4953

5054
String apiResponse = HttpUtility.sendRequest("POST", new URL(endPointURL), bodyJson, headers);
5155
JSONParser parser = new JSONParser();
@@ -78,7 +82,7 @@ private String parseDetokenizeError(SkyflowException exception) {
7882
JSONParser parser = new JSONParser();
7983
JSONObject errorJson = (JSONObject) parser.parse(exceptionMessage);
8084
JSONObject error = (JSONObject) errorJson.get("error");
81-
if(error != null) {
85+
if (error != null) {
8286
errorData.put("code", error.get("http_code"));
8387
errorData.put("description", error.get("message"));
8488
errorObject.put("error", errorData);

src/main/java/com/skyflow/vault/Skyflow.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public JSONObject insert(JSONObject records, InsertOptions insertOptions) throws
6262

6363
Map<String, String> headers = new HashMap<>();
6464
headers.put("Authorization", "Bearer " + TokenUtils.getBearerToken(configuration.getTokenProvider()));
65-
65+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
6666
String response = HttpUtility.sendRequest("POST", new URL(url), requestBody, headers);
6767
insertResponse = (JSONObject) new JSONParser().parse(response);
6868
LogUtil.printInfoLog(InfoLogs.ConstructInsertResponse.getLog());
@@ -93,10 +93,10 @@ public JSONObject detokenize(JSONObject records) throws SkyflowException {
9393
if (inputRecords == null || inputRecords.length == 0) {
9494
throw new SkyflowException(ErrorCode.EmptyRecords);
9595
}
96-
9796
String apiEndpointURL = this.configuration.getVaultURL() + "/v1/vaults/" + this.configuration.getVaultID() + "/detokenize";
9897
Map<String, String> headers = new HashMap<>();
9998
headers.put("Authorization", "Bearer " + TokenUtils.getBearerToken(configuration.getTokenProvider()));
99+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
100100

101101
FutureTask[] futureTasks = new FutureTask[inputRecords.length];
102102
for (int index = 0; index < inputRecords.length; index++) {
@@ -159,6 +159,7 @@ public JSONObject getById(JSONObject getByIdInput) throws SkyflowException {
159159

160160
Map<String, String> headers = new HashMap<>();
161161
headers.put("Authorization", "Bearer " + TokenUtils.getBearerToken(configuration.getTokenProvider()));
162+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
162163

163164
FutureTask[] futureTasks = new FutureTask[recordInputs.length];
164165
for (int i = 0; i < recordInputs.length; i++) {
@@ -227,6 +228,7 @@ public JSONObject get(JSONObject getInput) throws SkyflowException {
227228

228229
Map<String, String> headers = new HashMap<>();
229230
headers.put("Authorization", "Bearer " + TokenUtils.getBearerToken(configuration.getTokenProvider()));
231+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
230232

231233
FutureTask[] futureTasks = new FutureTask[recordInputs.length];
232234
for (int i = 0; i < recordInputs.length; i++) {
@@ -296,6 +298,7 @@ public JSONObject update(JSONObject records, UpdateOptions updateOptions) throws
296298

297299
Map<String, String> headers = new HashMap<>();
298300
headers.put("Authorization", "Bearer " + TokenUtils.getBearerToken(configuration.getTokenProvider()));
301+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
299302

300303
FutureTask[] futureTasks = new FutureTask[recordInputs.length];
301304
for (int i = 0; i < recordInputs.length; i++) {
@@ -356,7 +359,7 @@ public JSONObject invokeConnection(JSONObject connectionConfig) throws SkyflowEx
356359
if (!headers.containsKey("x-skyflow-authorization")) {
357360
headers.put("x-skyflow-authorization", TokenUtils.getBearerToken(configuration.getTokenProvider()));
358361
}
359-
362+
headers.put(Constants.SDK_METRICS_HEADER_KEY, Helpers.getMetrics().toJSONString());
360363
String requestMethod = connectionConfig.get("methodName").toString();
361364
JSONObject requestBody = null;
362365
if (connectionConfig.containsKey("requestBody")) {

src/test/java/com/skyflow/common/utils/HelpersTest.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@
88
import com.skyflow.errors.ErrorCode;
99
import com.skyflow.errors.SkyflowException;
1010
import static org.junit.Assert.assertEquals;
11+
import static org.junit.Assert.assertNotNull;
12+
import static org.powermock.api.mockito.PowerMockito.mock;
13+
import static org.powermock.api.mockito.PowerMockito.when;
14+
1115
import java.security.PrivateKey;
1216
import org.json.simple.JSONObject;
1317
import org.junit.Test;
18+
import org.mockito.Mockito;
19+
import org.powermock.api.mockito.PowerMockito;
1420

1521

1622
public class HelpersTest {
@@ -72,4 +78,49 @@ public void testInvalidKeySpec(){
7278
assertEquals(exception.getMessage(), ErrorCode.InvalidKeySpec.getDescription());
7379
}
7480
}
81+
@Test
82+
public void testGetMetrics() {
83+
JSONObject metrics = Helpers.getMetrics();
84+
assertEquals(true, metrics.containsKey("sdk_name_version"));
85+
assertEquals(true, metrics.containsKey("sdk_client_device_model"));
86+
assertEquals(true, metrics.containsKey("sdk_client_os_details"));
87+
assertEquals(true, metrics.containsKey("sdk_runtime_details"));
88+
89+
assertEquals("skyflow-java@"+ Constants.SDK_VERSION, metrics.get("sdk_name_version"));
90+
assertNotNull(metrics.get("sdk_client_device_model"));
91+
92+
assertNotNull(metrics.get("sdk_client_os_details"));
93+
assertNotNull(metrics.get("sdk_runtime_details"));
94+
assertNotNull(metrics.get("sdk_client_device_model"));
95+
96+
String runtimeDetails = (String) metrics.get("sdk_runtime_details");
97+
assertEquals(true, runtimeDetails.startsWith("Java@"));
98+
99+
}
100+
@Test
101+
public void testGetMetricsWithException() {
102+
// Arrange
103+
String expectedSdkVersion = Constants.SDK_VERSION;
104+
String expectedDeviceModel = "";
105+
String expectedOsDetails = "";
106+
String expectedJavaVersion = "";
107+
108+
// Mocking the System.getProperty() method to throw an exception
109+
System.setProperty("os.name", "");
110+
System.setProperty("os.version", "");
111+
System.setProperty("java.version", "");
112+
113+
// Act
114+
JSONObject metrics = Helpers.getMetrics();
115+
assertEquals(true, metrics.containsKey("sdk_name_version"));
116+
assertEquals(true, metrics.containsKey("sdk_client_device_model"));
117+
assertEquals(true, metrics.containsKey("sdk_client_os_details"));
118+
assertEquals(true, metrics.containsKey("sdk_runtime_details"));
119+
// Assert
120+
assertEquals("skyflow-java@" + expectedSdkVersion, metrics.get("sdk_name_version"));
121+
assertEquals(expectedDeviceModel, metrics.get("sdk_client_device_model"));
122+
assertEquals(expectedOsDetails, metrics.get("sdk_client_os_details"));
123+
assertEquals("Java@" + expectedJavaVersion, metrics.get("sdk_runtime_details"));
124+
}
75125
}
126+

0 commit comments

Comments
 (0)