Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
31 changes: 25 additions & 6 deletions .github/workflows/java.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,35 @@ name: Java CI
on: [push]

jobs:
build:
build-java11:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
- name: Set up JDK 11
uses: actions/setup-java@v3
uses: actions/setup-java@v5
with:
java-version: '11'
distribution: 'temurin'
cache: maven
- name: Build with Maven
run: sh setup.sh && mvn --batch-mode --quiet package
- name: Install tiles
run: cd support && mvn -f pom-tiles.xml install
- name: Install support composites
run: mvn install
build-java21:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
cache: maven
- name: Install tiles
run: cd support && mvn -f pom-tiles.xml install
- name: All other things
run: mvn install
- name: java17+ only
working-directory: v17-and-above
run: mvn install

1 change: 1 addition & 0 deletions .mvn/jvm.config
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
408 changes: 352 additions & 56 deletions README.adoc

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions build_alL_and_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#!/bin/sh
set -x
MAVEN_OPTS=${MVN_OPTS}
echo "cd support && mvn -f pom-tiles.xml install && mvn install && cd .. && mvn $MAVEN_OPTS clean install"
cd support && mvn -f pom-tiles.xml install && mvn install && cd .. && mvn $MAVEN_OPTS clean install

4 changes: 4 additions & 0 deletions build_only.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/bin/sh
set -x
cd support && mvn -DskipTests=true -f pom-tiles.xml install && mvn install && cd .. && mvn -T4C -DskipTests=true clean install

Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
<modelVersion>4.0.0</modelVersion>

<groupId>io.featurehub.sdk</groupId>
<artifactId>java-client-jersey</artifactId>
<version>2.8-SNAPSHOT</version>
<name>java-client-jersey</name>
<artifactId>java-client-jersey2</artifactId>
<version>3.1-SNAPSHOT</version>
<name>java-client-jersey2</name>

<description>
Jersey client for featurehub
Expand Down Expand Up @@ -44,21 +44,21 @@
</scm>

<properties>
<jersey.version>2.28</jersey.version>
<jersey.version>2.36</jersey.version>
</properties>

<dependencies>
<!-- required for the test api -->
<dependency>
<groupId>cd.connect.openapi.gensupport</groupId>
<artifactId>openapi-generator-support</artifactId>
<version>1.4</version>
<version>1.5</version>
</dependency>

<dependency>
<groupId>io.featurehub.sdk</groupId>
<artifactId>java-client-core</artifactId>
<version>[3, 4)</version>
<version>[4, 5)</version>
</dependency>

<!-- required in general for the jersey client -->
Expand All @@ -68,54 +68,57 @@
<version>[1.1, 2)</version>
</dependency>

<dependency>
<groupId>io.featurehub.sdk.common</groupId>
<artifactId>common-jacksonv2</artifactId>
<version>[1, 2]</version>
</dependency>

<dependency>
<groupId>io.featurehub.sdk.composites</groupId>
<artifactId>sdk-composite-test</artifactId>
<version>[1.1, 2)</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>io.featurehub.sdk.common</groupId>
<artifactId>common-jacksonv2</artifactId>
<version>[1.1-SNAPSHOT, 2]</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.glassfish.jersey.test-framework</groupId>
<artifactId>jersey-test-framework-core</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<!-- pull the defined API and unzip it -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>extract-sse-edge-components</id>
<phase>initialize</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>io.featurehub.sdk</groupId>
<artifactId>java-client-api</artifactId>
<version>3.2</version>
<classifier>api</classifier>
<type>yaml</type>
<outputDirectory>${project.basedir}/target</outputDirectory>
<destFileName>sse.yaml</destFileName>
</artifactItem>
</artifactItems>
<overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.openapitools</groupId>
<artifactId>openapi-generator-maven-plugin</artifactId>
<version>5.2.1</version>
<version>6.0.1</version>
<dependencies>
<dependency>
<groupId>cd.connect.openapi</groupId>
<artifactId>connect-openapi-jersey3</artifactId>
<version>7.15</version>
<version>8.8</version>
</dependency>
</dependencies>
<executions>
Expand All @@ -129,7 +132,7 @@
<output>${project.basedir}/target/generated-sources/api</output>
<apiPackage>io.featurehub.sse.api</apiPackage>
<modelPackage>io.featurehub.sse.model</modelPackage>
<inputSpec>${project.basedir}/target/sse.yaml</inputSpec>
<inputSpec>https://api.dev.featurehub.io/edge/1.1.5.yaml</inputSpec>
<generatorName>jersey3-api</generatorName>
<generateApis>true</generateApis>
<generateModels>true</generateModels>
Expand Down Expand Up @@ -165,12 +168,12 @@
<plugin>
<groupId>io.repaint.maven</groupId>
<artifactId>tiles-maven-plugin</artifactId>
<version>2.23</version>
<version>2.32</version>
<extensions>true</extensions>
<configuration>
<filtering>false</filtering>
<tiles>
<tile>io.featurehub.sdk.tiles:tile-java8:[1.1,2)</tile>
<tile>io.featurehub.sdk.tiles:tile-java11:[1.1,2)</tile>
<tile>io.featurehub.sdk.tiles:tile-release:[1.1,2)</tile>
<tile>io.featurehub.sdk.tiles:tile-sdk:[1.1-SNAPSHOT,2)</tile>
</tiles>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.featurehub.client.jersey;

import cd.connect.openapi.support.ApiResponse;
import io.featurehub.sse.model.FeatureEnvironmentCollection;
import io.featurehub.sse.model.FeatureStateUpdate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Map;

public interface FeatureService {
@NotNull ApiResponse<List<FeatureEnvironmentCollection>> getFeatureStates(@NotNull List<String> apiKey,
@Nullable String contextSha,
@Nullable Map<String, String> extraHeaders);
int setFeatureState(@NotNull String apiKey,
@NotNull String featureKey,
@NotNull FeatureStateUpdate featureStateUpdate,
@Nullable Map<String, String> extraHeaders);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package io.featurehub.client.jersey;

import cd.connect.openapi.support.ApiClient;
import cd.connect.openapi.support.ApiResponse;
import cd.connect.openapi.support.Pair;
import io.featurehub.sse.model.FeatureEnvironmentCollection;
import io.featurehub.sse.model.FeatureStateUpdate;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import javax.ws.rs.core.GenericType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FeatureServiceImpl implements FeatureService {
private final ApiClient apiClient;

public FeatureServiceImpl(ApiClient apiClient) {
this.apiClient = apiClient;
}

public @NotNull ApiResponse<List<FeatureEnvironmentCollection>> getFeatureStates(@NotNull List<String> apiKey,
@Nullable String contextSha,
@Nullable Map<String, String> extraHeaders) {
Object localVarPostBody = new Object();

// create path and map variables /features/
String localVarPath = "/features/";

// query params
List<Pair> localVarQueryParams = new ArrayList<>();
Map<String, String> localVarHeaderParams = new HashMap<>();
Map<String, Object> localVarFormParams = new HashMap<>();

if (extraHeaders != null) {
localVarHeaderParams.putAll(extraHeaders);
}

localVarQueryParams.addAll(apiClient.parameterToPairs("multi", "apiKey", apiKey));
localVarQueryParams.addAll(apiClient.parameterToPairs("", "contextSha", contextSha));

final String[] localVarAccepts = {
"application/json"
};
final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);

final String[] localVarContentTypes = {

};
final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);

String[] localVarAuthNames = new String[] { };

GenericType<List<FeatureEnvironmentCollection>> localVarReturnType = new GenericType<List<FeatureEnvironmentCollection>>() {};
return apiClient.invokeAPI(localVarPath, "GET", localVarQueryParams, localVarPostBody, localVarHeaderParams,
localVarFormParams, localVarAccept, localVarContentType, localVarAuthNames, localVarReturnType);

}

public int setFeatureState(@NotNull String apiKey,
@NotNull String featureKey,
@NotNull FeatureStateUpdate featureStateUpdate,
@Nullable Map<String, String> extraHeaders) {
// create path and map variables /{apiKey}/{featureKey}
String localVarPath = String.format("/features/%s/%s", apiKey, featureKey);

// query params
Map<String, String> localVarHeaderParams = new HashMap<String, String>();
Map<String, Object> localVarFormParams = new HashMap<String, Object>();

if (extraHeaders != null) {
localVarHeaderParams.putAll(extraHeaders);
}

final String[] localVarAccepts = {
"application/json"
};
final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);

final String[] localVarContentTypes = {
"application/json"
};
final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);

String[] localVarAuthNames = new String[]{};

GenericType<Object> localVarReturnType = new GenericType<Object>() {};

return apiClient.invokeAPI(localVarPath, "PUT", null, featureStateUpdate, localVarHeaderParams,
localVarFormParams, localVarAccept, localVarContentType, localVarAuthNames, localVarReturnType).getStatusCode();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package io.featurehub.client.jersey;

import io.featurehub.client.EdgeService;
import io.featurehub.client.FeatureHubClientFactory;
import io.featurehub.client.FeatureHubConfig;
import io.featurehub.client.InternalFeatureRepository;
import io.featurehub.client.TestApi;
import io.featurehub.client.edge.EdgeRetryer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.function.Supplier;

public class JerseyFeatureHubClientFactory implements FeatureHubClientFactory {
@Override
@NotNull
public Supplier<EdgeService> createSSEEdge(@NotNull FeatureHubConfig config,
@Nullable InternalFeatureRepository repository) {
return () -> new JerseySSEClient(repository, config, EdgeRetryer.EdgeRetryerBuilder.anEdgeRetrier().sse().build());
}

@Override
@NotNull
public Supplier<EdgeService> createSSEEdge(@NotNull FeatureHubConfig config) {
return createSSEEdge(config, null);
}

@Override
@NotNull
public Supplier<EdgeService> createRestEdge(@NotNull FeatureHubConfig config,
@Nullable InternalFeatureRepository repository, int timeoutInSeconds, boolean amPollingDelegate) {
return () -> new RestClient(repository, null, config,
EdgeRetryer.EdgeRetryerBuilder.anEdgeRetrier().rest().build(), timeoutInSeconds, amPollingDelegate);
}

@Override
@NotNull
public Supplier<EdgeService> createRestEdge(@NotNull FeatureHubConfig config, int timeoutInSeconds, boolean amPollingDelegate) {
return createRestEdge(config, null, timeoutInSeconds, amPollingDelegate);
}

@Override
@NotNull
public Supplier<TestApi> createTestApi(@NotNull FeatureHubConfig config) {
return () -> new TestSDKClient(config);
}
}
Loading