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
17 changes: 9 additions & 8 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ signing {
sign configurations.archives
}

group = 'com.devcycle'
group = "com.devcycle"
archivesBaseName = "java-server-sdk"
version = '1.0.7.1'
version = "1.1.0"

uploadArchives {
repositories {
Expand Down Expand Up @@ -104,12 +104,13 @@ task execute(type:JavaExec) {
ext {
retrofit_version = "2.9.0"
jackson_version = "2.13.3"
swagger_annotations_version = '2.2.0'
lombok_version = '1.18.24'
swagger_annotations_version = "2.2.0"
lombok_version = "1.18.24"
okhttp_version = "4.9.3"
wasmtime_version = "0.11.0"

junit_version = "4.13.2"
mockito_core_version = '4.6.1'
mockito_core_version = "4.6.1"
}

dependencies {
Expand All @@ -118,15 +119,15 @@ dependencies {
implementation("com.squareup.okhttp3:okhttp:$okhttp_version")

implementation("com.squareup.retrofit2:retrofit:$retrofit_version") {
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
exclude group: "com.squareup.okhttp3", module: "okhttp"
}
implementation("com.squareup.retrofit2:converter-jackson:$retrofit_version") {
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
exclude group: "com.squareup.okhttp3", module: "okhttp"
}
api("com.fasterxml.jackson.core:jackson-databind:$jackson_version")
implementation("io.swagger.core.v3:swagger-annotations:$swagger_annotations_version")

implementation ('io.github.kawamuray.wasmtime:wasmtime-java:0.11.0')
implementation ("io.github.kawamuray.wasmtime:wasmtime-java:$wasmtime_version")

compileOnly("org.projectlombok:lombok:$lombok_version")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.devcycle.example.java.sdk.app.controller;

import com.devcycle.sdk.server.cloud.DVCCloudClient;
import com.devcycle.sdk.server.local.DVCLocalClient;
import com.devcycle.sdk.server.cloud.api.DVCCloudClient;
import com.devcycle.sdk.server.local.api.DVCLocalClient;
import com.devcycle.sdk.server.common.model.User;
import com.devcycle.sdk.server.common.model.Variable;
import org.springframework.beans.factory.annotation.Qualifier;
Expand Down
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,11 @@
<artifactId>lombok</artifactId>
<version>${lombok-version}</version>
</dependency>
<dependency>
<groupId>io.github.kawamuray.wasmtime</groupId>
<artifactId>wasmtime-java</artifactId>
<version>${wasmtime-version}</version>
</dependency>

<!-- test dependencies -->
<dependency>
Expand All @@ -204,6 +209,7 @@
<swagger-core-version>2.2.0</swagger-core-version>
<retrofit-version>2.9.0</retrofit-version>
<lombok-version>1.18.24</lombok-version>
<wasmtime-version>0.11.0</wasmtime-version>
<jackson-version>2.13.3</jackson-version>
<junit-version>4.13.2</junit-version>
<mockito-core-version>4.6.1</mockito-core-version>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.devcycle.sdk.server.cloud.api;

import com.devcycle.sdk.server.cloud.model.DVCCloudOptions;
import com.devcycle.sdk.server.common.api.IDVCApi;
import com.devcycle.sdk.server.common.interceptor.AuthorizationHeaderInterceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonInclude;

import okhttp3.*;
import retrofit2.Retrofit;
import retrofit2.converter.jackson.JacksonConverterFactory;

import java.util.Objects;

public final class DVCCloudApiClient {

private final OkHttpClient.Builder okBuilder;
private final Retrofit.Builder adapterBuilder;

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

private static final String BUCKETING_URL = "https://bucketing-api.devcycle.com/";


private DVCCloudApiClient(DVCCloudOptions options) {
String url;

String bucketingApiUrl = System.getenv("BUCKETING_API_URL");
OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
okBuilder = new OkHttpClient.Builder();

url = checkIfStringNullOrEmpty(bucketingApiUrl) ? BUCKETING_URL : bucketingApiUrl;

adapterBuilder = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(JacksonConverterFactory.create());
}

public DVCCloudApiClient(String apiKey, DVCCloudOptions options) {
this(options);
okBuilder.addInterceptor(new AuthorizationHeaderInterceptor(apiKey));
}

public IDVCApi initialize() {
return adapterBuilder
.client(okBuilder.build())
.build()
.create(IDVCApi.class);
}

private Boolean checkIfStringNullOrEmpty(String stringToCheck) {
return Objects.isNull(stringToCheck) || Objects.equals(stringToCheck, "");
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.devcycle.sdk.server.cloud;
package com.devcycle.sdk.server.cloud.api;

import com.devcycle.sdk.server.common.api.DVCApi;
import com.devcycle.sdk.server.common.api.DVCApiClient;
import com.devcycle.sdk.server.cloud.model.DVCCloudOptions;
import com.devcycle.sdk.server.common.api.IDVCApi;
import com.devcycle.sdk.server.common.exception.DVCException;
import com.devcycle.sdk.server.common.model.*;
import com.fasterxml.jackson.annotation.JsonInclude;
Expand All @@ -13,25 +13,21 @@
import java.io.IOException;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;

public final class DVCCloudClient {

private final DVCApi api;
private final DVCOptions dvcOptions;
private final IDVCApi api;
private final DVCCloudOptions dvcOptions;

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

public DVCCloudClient(String serverKey) {
this(serverKey, DVCOptions.builder().enableCloudBucketing(true).build());
this(serverKey, DVCCloudOptions.builder().build());
}

public DVCCloudClient(String serverKey, DVCOptions options) {
if (!options.getEnableCloudBucketing()) {
options.setEnableCloudBucketing(true);
}
api = new DVCApiClient(serverKey, options).initialize();
public DVCCloudClient(String serverKey, DVCCloudOptions options) {
this.dvcOptions = options;
api = new DVCCloudApiClient(serverKey, options).initialize();
OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.devcycle.sdk.server.cloud.model;

import com.devcycle.sdk.server.common.model.IDVCOptions;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class DVCCloudOptions {
@Builder.Default
private Boolean enableEdgeDB = false;

public static class DVCCloudOptionsBuilder implements IDVCOptions { }
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.util.Map;

public interface DVCApi {
public interface IDVCApi {
/**
* Get all features by key for user data
*
Expand Down
19 changes: 0 additions & 19 deletions src/main/java/com/devcycle/sdk/server/common/model/DVCOptions.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.devcycle.sdk.server.common.model;

public interface IDVCOptions { }
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.devcycle.sdk.server.common.api;
package com.devcycle.sdk.server.local.api;

import com.devcycle.sdk.server.common.interceptor.AuthorizationHeaderInterceptor;
import com.devcycle.sdk.server.common.model.DVCOptions;
import com.devcycle.sdk.server.common.api.IDVCApi;
import com.devcycle.sdk.server.local.model.DVCLocalOptions;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonInclude;

Expand All @@ -12,62 +12,49 @@
import java.util.Objects;
import java.util.concurrent.TimeUnit;

public final class DVCApiClient {
public final class DVCLocalApiClient {

private final OkHttpClient.Builder okBuilder;
private final Retrofit.Builder adapterBuilder;

private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

private static final String BUCKETING_URL = "https://bucketing-api.devcycle.com/";
private static final String CONFIG_URL = "https://config-cdn.devcycle.com/";
private static final int DEFAULT_TIMEOUT_MS = 10000;
private static final int MIN_INTERVALS_MS = 1000;

private Boolean cloudBucketing = false;
private String configUrl;
private int requestTimeoutMs;

private DVCApiClient(DVCOptions options) {
private DVCLocalApiClient(DVCLocalOptions options) {
String url;

String bucketingApiUrl = System.getenv("BUCKETING_API_URL");
OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
okBuilder = new OkHttpClient.Builder();

String cdnUrlFromOptions = options.getConfigCdnBaseUrl();
Boolean enableCloudBucketing = options.getEnableCloudBucketing();
int configRequestTimeoutMs = options.getConfigRequestTimeoutMs();

this.cloudBucketing = Objects.isNull(enableCloudBucketing) ? false : enableCloudBucketing;

if (this.cloudBucketing) {
url = checkIfStringNullOrEmpty(bucketingApiUrl) ? BUCKETING_URL : bucketingApiUrl;
} else {
configUrl = checkIfStringNullOrEmpty(cdnUrlFromOptions) ? CONFIG_URL : cdnUrlFromOptions;
requestTimeoutMs = configRequestTimeoutMs >= MIN_INTERVALS_MS ? configRequestTimeoutMs : DEFAULT_TIMEOUT_MS;

url = this.configUrl;
okBuilder.callTimeout(this.requestTimeoutMs, TimeUnit.MILLISECONDS);
}
configUrl = checkIfStringNullOrEmpty(cdnUrlFromOptions) ? CONFIG_URL : cdnUrlFromOptions;
requestTimeoutMs = configRequestTimeoutMs >= MIN_INTERVALS_MS ? configRequestTimeoutMs : DEFAULT_TIMEOUT_MS;

url = this.configUrl;
okBuilder.callTimeout(this.requestTimeoutMs, TimeUnit.MILLISECONDS);

adapterBuilder = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(JacksonConverterFactory.create());
}

public DVCApiClient(String apiKey, DVCOptions options) {
public DVCLocalApiClient(String apiKey, DVCLocalOptions options) {
this(options);
if (this.cloudBucketing) {
okBuilder.addInterceptor(new AuthorizationHeaderInterceptor(apiKey));
}
}

public DVCApi initialize() {
public IDVCApi initialize() {
return adapterBuilder
.client(okBuilder.build())
.build()
.create(DVCApi.class);
.create(IDVCApi.class);
}

private Boolean checkIfStringNullOrEmpty(String stringToCheck) {
Expand Down
Loading