From d86f5f905ba7d4001a1afa6c5a905a35279f4c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivar=20Conradi=20=C3=98sthus?= Date: Fri, 24 Oct 2014 12:08:35 +0200 Subject: [PATCH] Implemented a simple fethcer to replace httpclient --- unleash-client-java/pom.xml | 4 +- .../unleash/repository/HttpToggleFetcher.java | 64 +++++++++++++++++++ .../unleash/repository/JsonToggleParser.java | 6 ++ .../unleash/repository/ToggleException.java | 4 ++ .../unleash/repository/ToggleFetcher.java | 5 ++ .../unleash/repository/ToggleResponse.java | 30 +++++++++ .../repository/HttpToggleFetcherTest.java | 23 +++++++ unleash-server/lib/eventMock.js | 53 --------------- 8 files changed, 134 insertions(+), 55 deletions(-) create mode 100644 unleash-client-java/src/main/no/finn/unleash/repository/HttpToggleFetcher.java create mode 100644 unleash-client-java/src/main/no/finn/unleash/repository/ToggleFetcher.java create mode 100644 unleash-client-java/src/main/no/finn/unleash/repository/ToggleResponse.java create mode 100644 unleash-client-java/src/test/no/finn/unleash/repository/HttpToggleFetcherTest.java delete mode 100644 unleash-server/lib/eventMock.js diff --git a/unleash-client-java/pom.xml b/unleash-client-java/pom.xml index f43b1dea18..07b19f0fa8 100644 --- a/unleash-client-java/pom.xml +++ b/unleash-client-java/pom.xml @@ -67,8 +67,8 @@ maven-compiler-plugin 3.1 - 1.7 - 1.7 + 1.8 + 1.8 diff --git a/unleash-client-java/src/main/no/finn/unleash/repository/HttpToggleFetcher.java b/unleash-client-java/src/main/no/finn/unleash/repository/HttpToggleFetcher.java new file mode 100644 index 0000000000..df9abcc8c5 --- /dev/null +++ b/unleash-client-java/src/main/no/finn/unleash/repository/HttpToggleFetcher.java @@ -0,0 +1,64 @@ +package no.finn.unleash.repository; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import no.finn.unleash.Toggle; + +public final class HttpToggleFetcher implements ToggleFetcher { + public static final int CONNECT_TIMEOUT = 10000; + private String etag = null; + + private final URL toggleUrl; + + public HttpToggleFetcher(URI repo) { + try { + toggleUrl = repo.toURL(); + } catch (MalformedURLException ex) { + throw new IllegalArgumentException("Invalid repo uri", ex); + } + } + + @Override + public ToggleResponse fetchToggles() throws ToggleException { + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) toggleUrl.openConnection(); + connection.setConnectTimeout(CONNECT_TIMEOUT); + connection.setReadTimeout(CONNECT_TIMEOUT); + connection.setRequestProperty("If-None-Match", etag); + connection.connect(); + + int responseCode = connection.getResponseCode(); + if(responseCode < 300) { + return getToggleResponse(connection); + } else { + return new ToggleResponse(ToggleResponse.Status.NOT_CHANGED); + } + } catch (IOException e) { + throw new ToggleException("Could not fetch toggles", e); + } finally { + if(connection != null) { + connection.disconnect(); + } + } + } + + private ToggleResponse getToggleResponse(HttpURLConnection request) throws IOException { + etag = request.getHeaderField("ETag"); + + try(BufferedReader reader = new BufferedReader( + new InputStreamReader((InputStream) request.getContent(), StandardCharsets.UTF_8))) { + + Collection toggles = JsonToggleParser.fromJson(reader); + return new ToggleResponse(ToggleResponse.Status.CHANGED, toggles); + } + } +} diff --git a/unleash-client-java/src/main/no/finn/unleash/repository/JsonToggleParser.java b/unleash-client-java/src/main/no/finn/unleash/repository/JsonToggleParser.java index 67ccb536c6..9f905bce00 100644 --- a/unleash-client-java/src/main/no/finn/unleash/repository/JsonToggleParser.java +++ b/unleash-client-java/src/main/no/finn/unleash/repository/JsonToggleParser.java @@ -1,5 +1,6 @@ package no.finn.unleash.repository; +import java.io.Reader; import java.util.Collection; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -22,4 +23,9 @@ public final class JsonToggleParser { Gson gson = new GsonBuilder().create(); return gson.fromJson(jsonString,ToggleCollection.class).getFeatures(); } + + public static Collection fromJson(Reader reader) { + Gson gson = new GsonBuilder().create(); + return gson.fromJson(reader,ToggleCollection.class).getFeatures(); + } } diff --git a/unleash-client-java/src/main/no/finn/unleash/repository/ToggleException.java b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleException.java index 531fcbcca6..95cb07aa99 100644 --- a/unleash-client-java/src/main/no/finn/unleash/repository/ToggleException.java +++ b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleException.java @@ -4,4 +4,8 @@ public class ToggleException extends RuntimeException { public ToggleException(String message) { super(message); } + + public ToggleException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/unleash-client-java/src/main/no/finn/unleash/repository/ToggleFetcher.java b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleFetcher.java new file mode 100644 index 0000000000..bec57b7bae --- /dev/null +++ b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleFetcher.java @@ -0,0 +1,5 @@ +package no.finn.unleash.repository; + +public interface ToggleFetcher { + ToggleResponse fetchToggles() throws ToggleException; +} diff --git a/unleash-client-java/src/main/no/finn/unleash/repository/ToggleResponse.java b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleResponse.java new file mode 100644 index 0000000000..13d060f3c5 --- /dev/null +++ b/unleash-client-java/src/main/no/finn/unleash/repository/ToggleResponse.java @@ -0,0 +1,30 @@ +package no.finn.unleash.repository; + +import java.util.Collection; +import java.util.Collections; +import no.finn.unleash.Toggle; + +public final class ToggleResponse { + enum Status {NOT_CHANGED, CHANGED} + + private final Status status; + private final Collection getToggles; + + public ToggleResponse(Status status, Collection getToggles) { + this.status = status; + this.getToggles = getToggles; + } + + public ToggleResponse(Status status) { + this.status = status; + this.getToggles = Collections.emptyList(); + } + + public Status getStatus() { + return status; + } + + public Collection getGetToggles() { + return getToggles; + } +} diff --git a/unleash-client-java/src/test/no/finn/unleash/repository/HttpToggleFetcherTest.java b/unleash-client-java/src/test/no/finn/unleash/repository/HttpToggleFetcherTest.java new file mode 100644 index 0000000000..7a0ee51447 --- /dev/null +++ b/unleash-client-java/src/test/no/finn/unleash/repository/HttpToggleFetcherTest.java @@ -0,0 +1,23 @@ +package no.finn.unleash.repository; + +import java.net.URI; +import org.junit.Ignore; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class HttpToggleFetcherTest { + + + @Test + @Ignore + public void explore() { + HttpToggleFetcher httpToggleFetcher = new HttpToggleFetcher(URI.create("http://localhost:4242/features")); + + ToggleResponse toggleResponse = httpToggleFetcher.fetchToggles(); + toggleResponse = httpToggleFetcher.fetchToggles(); + System.out.println("toggleResponse = " + toggleResponse); + + } + +} \ No newline at end of file diff --git a/unleash-server/lib/eventMock.js b/unleash-server/lib/eventMock.js deleted file mode 100644 index 5fac2c1945..0000000000 --- a/unleash-server/lib/eventMock.js +++ /dev/null @@ -1,53 +0,0 @@ -module.exports = [ - { - "id": 1, - "created": "2014-08-01 12:22:00", - "type": "feature-create", - "user": "John, Doe", - "comment": "Optional comment", - "data": { - "name": "com.example.feature", - "status": "off", - "strategy": "default", - "description": "Feature description" - } - }, - { - "id": 2, - "created": "2014-09-02 15:23:11", - "type": "feature-update", - "user": "User name", - "comment": "Optional comment", - "data": { - "name": "com.example.feature", - "status": "on" - } - }, - { - "id": 3, - "created": "1970-01-01 00:00:00", - "type": "strategy-create", - "user": "User name", - "comment": "Optional comment", - "data": { - "name": "strategyA", - "parameters_template": { - "users": "example values", - "target_age": "number" - } - } - }, - { - "id": 4, - "created": "1970-01-01 00:00:00", - "type": "strategy-update", - "user": "localhost.localdomain", - "comment": "commit message goes here", - "data": { - "name": "strategyA", - "parameters_template": { - "users": "new default example values" - } - } - } -]; \ No newline at end of file