commit 206e48c13e53d4800723c6cd945ef4080e76aa75 Author: Brian M. Long Date: Tue Jan 4 15:01:21 2022 -0500 initial checkin diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e9ac923 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Maven +pom.xml.versionsBackup +target + +# Eclipse +.project +.classpath +.settings + +# Visual Studio Code +.factorypath + diff --git a/polygon-public-rest-api/pom.xml b/polygon-public-rest-api/pom.xml new file mode 100644 index 0000000..cd529cf --- /dev/null +++ b/polygon-public-rest-api/pom.xml @@ -0,0 +1,64 @@ + + 4.0.0 + com.inteligr8.polygon + polygon-public-rest-api + 1.0-SNAPSHOT + Polygon.IO ReST API for Java + + + utf-8 + 8 + 8 + + + + + jakarta.ws.rs + jakarta.ws.rs-api + 2.1.6 + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + 2.12.2 + + + + + + + maven-javadoc-plugin + + + javadoc + package + jar + + public + + + + + + + + + + inteligr8-public + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + + + + inteligr8-releases + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + inteligr8-snapshots + https://repos.inteligr8.com/nexus/repository/inteligr8-snapshots + + + diff --git a/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/PolygonPublicRestApi.java b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/PolygonPublicRestApi.java new file mode 100644 index 0000000..48f7831 --- /dev/null +++ b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/PolygonPublicRestApi.java @@ -0,0 +1,15 @@ +package com.inteligr8.polygon; + +import com.inteligr8.polygon.api.StocksApiV1; + +/** + * This interface consolidates the JAX-RS APIs available in the Polygon.IO + * Public ReST API. + * + * @author brian@inteligr8.com + */ +public interface PolygonPublicRestApi { + + StocksApiV1 getStocksApi(); + +} diff --git a/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/api/StocksApiV1.java b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/api/StocksApiV1.java new file mode 100644 index 0000000..bb1eb46 --- /dev/null +++ b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/api/StocksApiV1.java @@ -0,0 +1,33 @@ +package com.inteligr8.polygon.api; + +import java.time.LocalDate; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.inteligr8.polygon.model.StockDateSummary; + +@Path("/v1") +public interface StocksApiV1 { + + @GET + @Path("/open-close/{stocksTicker}/{date}") + @Produces({ MediaType.APPLICATION_JSON }) + public StockDateSummary getStockSummaryOnDate( + @PathParam("stocksTicker") String stockTicker, + @PathParam("date") @JsonFormat(pattern = "yyyy-MM-dd") LocalDate date); + + @GET + @Path("/open-close/{stocksTicker}/{date}") + @Produces({ MediaType.APPLICATION_JSON }) + public StockDateSummary getStockSummaryOnDate( + @PathParam("stocksTicker") String stockTicker, + @PathParam("date") @JsonFormat(pattern = "yyyy-MM-dd") LocalDate date, + @QueryParam("adjusted") boolean adjusted); + +} diff --git a/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/BaseResponse.java b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/BaseResponse.java new file mode 100644 index 0000000..b8768b0 --- /dev/null +++ b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/BaseResponse.java @@ -0,0 +1,25 @@ +package com.inteligr8.polygon.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public class BaseResponse { + + public enum Status { + @JsonProperty("OK") + Ok + } + + @JsonProperty + private Status status; + + + + public Status getStatus() { + return this.status; + } + + public void setStatus(Status status) { + this.status = status; + } + +} diff --git a/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/StockDateSummary.java b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/StockDateSummary.java new file mode 100644 index 0000000..0703fe2 --- /dev/null +++ b/polygon-public-rest-api/src/main/java/com/inteligr8/polygon/model/StockDateSummary.java @@ -0,0 +1,117 @@ +package com.inteligr8.polygon.model; + +import java.time.LocalDate; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author brian@inteligr8.com + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class StockDateSummary extends BaseResponse { + + @JsonProperty + private String symbol; + + @JsonProperty + private Double preMarket; + + @JsonProperty + private Double open; + + @JsonProperty + private Double high; + + @JsonProperty + private Double low; + + @JsonProperty + private Double close; + + @JsonProperty + private Long volume; + + @JsonProperty + private Double afterHours; + + @JsonProperty + @JsonFormat(pattern = "yyyy-MM-dd") + private LocalDate from; + + + + public String getSymbol() { + return this.symbol; + } + + public void setSymbol(String symbol) { + this.symbol = symbol; + } + + public Double getPreMarket() { + return this.preMarket; + } + + public void setPreMarket(Double preMarket) { + this.preMarket = preMarket; + } + + public Double getOpen() { + return this.open; + } + + public void setOpen(Double open) { + this.open = open; + } + + public Double getHigh() { + return this.high; + } + + public void setHigh(Double high) { + this.high = high; + } + + public Double getLow() { + return this.low; + } + + public void setLow(Double low) { + this.low = low; + } + + public Double getClose() { + return this.close; + } + + public void setClose(Double close) { + this.close = close; + } + + public Long getVolume() { + return this.volume; + } + + public void setVolume(Long volume) { + this.volume = volume; + } + + public Double getAfterHours() { + return this.afterHours; + } + + public void setAfterHours(Double afterHours) { + this.afterHours = afterHours; + } + + public LocalDate getFrom() { + return this.from; + } + + public void setFrom(LocalDate from) { + this.from = from; + } + +} diff --git a/polygon-public-rest-client/.gitignore b/polygon-public-rest-client/.gitignore new file mode 100644 index 0000000..7fb7a11 --- /dev/null +++ b/polygon-public-rest-client/.gitignore @@ -0,0 +1,3 @@ +# Personal +polygon-personal.properties + diff --git a/polygon-public-rest-client/pom.xml b/polygon-public-rest-client/pom.xml new file mode 100644 index 0000000..72c2963 --- /dev/null +++ b/polygon-public-rest-client/pom.xml @@ -0,0 +1,205 @@ + + 4.0.0 + com.inteligr8.polygon + polygon-public-rest-client + 1.0-SNAPSHOT + Polygon.IO ReST Client for Java + + + utf-8 + 8 + 8 + + jersey + + 5.7.2 + 5.2.14.RELEASE + + false + + + + + com.inteligr8 + common-rest-api + 1.1-SNAPSHOT + + + com.inteligr8.polygon + polygon-public-rest-api + 1.0-SNAPSHOT + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.12.2 + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.springframework + spring-test + ${spring.version} + test + + + org.apache.httpcomponents + httpclient + 4.5.9 + test + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.2.0 + + + add-jaxrs-src + add-source + + + src/main/${jaxrs.impl} + + + + + add-test-src + add-test-source + + + src/test/${jaxrs.impl} + + + + + + + maven-jar-plugin + + ${jaxrs.impl} + + + + maven-surefire-plugin + 3.0.0-M5 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + maven-failsafe-plugin + 3.0.0-M5 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + + + + + + + + + jersey-impl + + true + + jaxrs.impl + jersey + + + + jersey + 2.34 + + + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + provided + + + org.glassfish.jersey.ext + jersey-proxy-client + ${jersey.version} + test + + + org.glassfish.jersey.inject + jersey-hk2 + ${jersey.version} + test + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + test + + + + + cxf-impl + + + jaxrs.impl + cxf + + + + cxf + 3.3.2 + + + + org.apache.cxf + cxf-rt-rs-client + ${cxf.version} + provided + + + + + + + + inteligr8-public + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + + + + inteligr8-public + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + + + + inteligr8-releases + https://repos.inteligr8.com/nexus/repository/inteligr8-public + + + inteligr8-snapshots + https://repos.inteligr8.com/nexus/repository/inteligr8-snapshots + + + diff --git a/polygon-public-rest-client/src/main/cxf/com/inteligr8/polygon/PolygonClientCxfImpl.java b/polygon-public-rest-client/src/main/cxf/com/inteligr8/polygon/PolygonClientCxfImpl.java new file mode 100644 index 0000000..393463a --- /dev/null +++ b/polygon-public-rest-client/src/main/cxf/com/inteligr8/polygon/PolygonClientCxfImpl.java @@ -0,0 +1,52 @@ +package com.inteligr8.polygon; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.inteligr8.rs.ClientCxfConfiguration; +import com.inteligr8.rs.ClientCxfImpl; + +/** + * This class provides a POJO & Spring-based implementation of the Apache + * CXF client. You can use it outside of the Spring context, but you will need + * the spring-context and spring-beans libraries in your non-Spring + * application. + * + * @author brian@inteligr8.com + */ +@Component("polygon.client") +@Lazy +public class PolygonClientCxfImpl extends ClientCxfImpl { + + @Autowired + private PolygonClientConfiguration config; + + private final PolygonPublicRestApi api; + + /** + * This constructor is for Spring use. + */ + protected PolygonClientCxfImpl() { + this.api = new PolygonPublicRestApiImpl(this); + } + + /** + * This constructor is for POJO use. + * @param config + */ + public PolygonClientCxfImpl(PolygonClientConfiguration config) { + this.config = config; + this.api = new PolygonPublicRestApiImpl(this); + } + + @Override + protected ClientCxfConfiguration getConfig() { + return this.config; + } + + public PolygonPublicRestApi getApi() { + return this.api; + } + +} diff --git a/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonAuthorizationFilter.java b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonAuthorizationFilter.java new file mode 100644 index 0000000..4bfed7c --- /dev/null +++ b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonAuthorizationFilter.java @@ -0,0 +1,35 @@ +package com.inteligr8.polygon; + +import java.io.IOException; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.UriBuilder; + +import com.inteligr8.rs.AuthorizationFilter; + +public class PolygonAuthorizationFilter implements AuthorizationFilter { + + private String apiKey; + + public PolygonAuthorizationFilter(String apiKey) { + this.apiKey = apiKey; + } + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + this.authWithHeader(requestContext); + } + + protected void authWithHeader(ClientRequestContext requestContext) { + requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + this.apiKey); + } + + protected void authWithQueryParam(ClientRequestContext requestContext) { + requestContext.setUri( + UriBuilder.fromUri(requestContext.getUri()) + .queryParam("apiKey", this.apiKey) + .build()); + } + +} diff --git a/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonClientConfiguration.java b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonClientConfiguration.java new file mode 100644 index 0000000..d2ef1ac --- /dev/null +++ b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonClientConfiguration.java @@ -0,0 +1,74 @@ +package com.inteligr8.polygon; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +import com.inteligr8.rs.AuthorizationFilter; +import com.inteligr8.rs.ClientCxfConfiguration; +import com.inteligr8.rs.ClientJerseyConfiguration; + +/** + * This class provides a POJO & Spring-based implementation of the + * ClientConfiguration interface. You can use it outside of the Spring + * context, but you will need the spring-context and spring-beans libraries in + * your non-Spring application. + * + * @author brian@inteligr8.com + */ +@Configuration +@ComponentScan +public class PolygonClientConfiguration implements ClientCxfConfiguration, ClientJerseyConfiguration { + + @Value("${polygon.service.baseUrl:https://api.polygon.io}") + private String baseUrl; + + @Value("${polygon.service.security.auth.apiKey}") + private String apiKey; + + @Value("${polygon.service.cxf.defaultBusEnabled:true}") + private boolean defaultBusEnabled; + + @Value("${polygon.service.jersey.putBodyRequired:true}") + private boolean putBodyRequired; + + public String getBaseUrl() { + return this.baseUrl; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + + public String getApiKey() { + return this.apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + + public boolean isDefaultBusEnabled() { + return this.defaultBusEnabled; + } + + public void setDefaultBusEnabled(boolean defaultBusEnabled) { + this.defaultBusEnabled = defaultBusEnabled; + } + + public boolean isPutBodyRequired() { + return this.putBodyRequired; + } + + public void setPutBodyRequired(boolean putBodyRequired) { + this.putBodyRequired = putBodyRequired; + } + + + + @Override + public AuthorizationFilter createAuthorizationFilter() { + return new PolygonAuthorizationFilter(this.getApiKey()); + } + +} diff --git a/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonPublicRestApiImpl.java b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonPublicRestApiImpl.java new file mode 100644 index 0000000..9446f93 --- /dev/null +++ b/polygon-public-rest-client/src/main/java/com/inteligr8/polygon/PolygonPublicRestApiImpl.java @@ -0,0 +1,28 @@ +package com.inteligr8.polygon; + +import com.inteligr8.polygon.api.StocksApiV1; +import com.inteligr8.rs.Client; + +/** + * This class serves as the entrypoint to the JAX-RS API for the Polygon.IO + * Public ReST API. + * + * @author brian@inteligr8.com + */ +public class PolygonPublicRestApiImpl implements PolygonPublicRestApi { + + private final Client client; + + public PolygonPublicRestApiImpl(Client client) { + this.client = client; + } + + protected final T getApi(Class apiClass) { + return this.client.getApi(apiClass); + } + + public StocksApiV1 getStocksApi() { + return this.getApi(StocksApiV1.class); + } + +} diff --git a/polygon-public-rest-client/src/main/jersey/com/inteligr8/polygon/PolygonClientJerseyImpl.java b/polygon-public-rest-client/src/main/jersey/com/inteligr8/polygon/PolygonClientJerseyImpl.java new file mode 100644 index 0000000..7a67f1c --- /dev/null +++ b/polygon-public-rest-client/src/main/jersey/com/inteligr8/polygon/PolygonClientJerseyImpl.java @@ -0,0 +1,51 @@ +package com.inteligr8.polygon; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Component; + +import com.inteligr8.rs.ClientJerseyConfiguration; +import com.inteligr8.rs.ClientJerseyImpl; + +/** + * This class provides a POJO & Spring-based implementation of the Jersey + * client. You can use it outside of the Spring context, but you will need the + * spring-context and spring-beans libraries in your non-Spring application. + * + * @author brian@inteligr8.com + */ +@Component("polygon.client") +@Lazy +public class PolygonClientJerseyImpl extends ClientJerseyImpl { + + @Autowired + private PolygonClientConfiguration config; + + private final PolygonPublicRestApi api; + + /** + * This constructor is for Spring use. + */ + protected PolygonClientJerseyImpl() { + this.api = new PolygonPublicRestApiImpl(this); + } + + /** + * This constructor is for POJO use. + * @param config + */ + public PolygonClientJerseyImpl(PolygonClientConfiguration config) { + this.config = config; + this.api = new PolygonPublicRestApiImpl(this); + } + + @Override + protected ClientJerseyConfiguration getConfig() { + return this.config; + } + + public PolygonPublicRestApi getApi() { + return this.api; + } + +} diff --git a/polygon-public-rest-client/src/test/cxf/com/inteligr8/polygon/ConnectionCxfClientIT.java b/polygon-public-rest-client/src/test/cxf/com/inteligr8/polygon/ConnectionCxfClientIT.java new file mode 100644 index 0000000..1072a5a --- /dev/null +++ b/polygon-public-rest-client/src/test/cxf/com/inteligr8/polygon/ConnectionCxfClientIT.java @@ -0,0 +1,26 @@ +package com.inteligr8.polygon; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +import com.inteligr8.rs.ClientConfiguration; + +@TestPropertySource(locations = {"/polygon-personal.properties"}) +@SpringJUnitConfig(classes = {PolygonClientConfiguration.class, PolygonClientCxfImpl.class}) +public class ConnectionCxfClientIT extends ConnectionClientIT { + + @Autowired + private PolygonClientCxfImpl client; + + @Override + public PolygonPublicRestApi getClient() { + return this.client.getApi(); + } + + @Override + public ClientConfiguration getConfiguration() { + return this.client.getConfig(); + } + +} diff --git a/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConditionalIT.java b/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConditionalIT.java new file mode 100644 index 0000000..5461a7d --- /dev/null +++ b/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConditionalIT.java @@ -0,0 +1,38 @@ +package com.inteligr8.polygon; + +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.client.methods.RequestBuilder; +import org.apache.http.impl.client.DefaultRedirectStrategy; +import org.apache.http.impl.client.HttpClientBuilder; + +import com.inteligr8.rs.ClientConfiguration; + +public abstract class ConditionalIT { + + public abstract ClientConfiguration getConfiguration(); + + public boolean hostExists() { + String uri = this.getConfiguration().getBaseUrl(); + + HttpUriRequest request = RequestBuilder.get() + .setUri(uri) + .build(); + + HttpClient client = HttpClientBuilder.create() + .setRedirectStrategy(DefaultRedirectStrategy.INSTANCE) + .build(); + + try { + HttpResponse response = client.execute(request); + return response.getStatusLine().getStatusCode() < 300 || + response.getStatusLine().getStatusCode() == Status.NOT_FOUND.getStatusCode(); + } catch (Exception e) { + return false; + } + } + +} diff --git a/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConnectionClientIT.java b/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConnectionClientIT.java new file mode 100644 index 0000000..b6da9da --- /dev/null +++ b/polygon-public-rest-client/src/test/java/com/inteligr8/polygon/ConnectionClientIT.java @@ -0,0 +1,86 @@ +package com.inteligr8.polygon; + +import java.time.LocalDate; + +import javax.ws.rs.BadRequestException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIf; +import org.junit.jupiter.api.function.Executable; + +import com.inteligr8.polygon.api.StocksApiV1; +import com.inteligr8.polygon.model.StockDateSummary; + +public abstract class ConnectionClientIT extends ConditionalIT { + + public abstract PolygonPublicRestApi getClient(); + + private StocksApiV1 api; + + public boolean fullTest() { + return false; + //return this.hostExists(); + } + + @BeforeEach + public void getApi() { + this.api = this.getClient().getStocksApi(); + } + + @Test + @EnabledIf("fullTest") + public void testValidTickerToday() { + Assertions.assertThrows(BadRequestException.class, new Executable() { + @Override + public void execute() { + api.getStockSummaryOnDate("AAPL", LocalDate.now()); + } + }); + } + + @Test + @EnabledIf("fullText") + public void testValidTicketTomorrow() { + Assertions.assertThrows(BadRequestException.class, new Executable() { + @Override + public void execute() { + api.getStockSummaryOnDate("AAPL", LocalDate.now().plusDays(1L)); + } + }); + } + + @Test + @EnabledIf("fullTest") + public void testValidTickerYesterday() { + StockDateSummary summary = this.api.getStockSummaryOnDate("AAPL", LocalDate.now().minusDays(1L)); + this.assertStockDateSummary(summary); + } + + @Test + @EnabledIf("fullTest") + public void testInvalidTicker() { + Assertions.assertThrows(BadRequestException.class, new Executable() { + @Override + public void execute() { + api.getStockSummaryOnDate("NOT-A-TICKER", LocalDate.now().plusDays(1L)); + } + }); + } + + private void assertStockDateSummary(StockDateSummary summary) { + Assertions.assertNotNull(summary); + Assertions.assertEquals("AAPL", summary.getSymbol()); + Assertions.assertNotNull(summary.getOpen()); + Assertions.assertNotNull(summary.getHigh()); + Assertions.assertNotNull(summary.getLow()); + Assertions.assertNotNull(summary.getClose()); + Assertions.assertTrue(summary.getLow() <= summary.getHigh()); + Assertions.assertTrue(summary.getLow() <= summary.getClose()); + Assertions.assertTrue(summary.getLow() <= summary.getOpen()); + Assertions.assertTrue(summary.getClose() <= summary.getHigh()); + Assertions.assertTrue(summary.getOpen() <= summary.getHigh()); + } + +} diff --git a/polygon-public-rest-client/src/test/jersey/com/inteligr8/polygon/ConnectionJerseyClientIT.java b/polygon-public-rest-client/src/test/jersey/com/inteligr8/polygon/ConnectionJerseyClientIT.java new file mode 100644 index 0000000..6cfa8f3 --- /dev/null +++ b/polygon-public-rest-client/src/test/jersey/com/inteligr8/polygon/ConnectionJerseyClientIT.java @@ -0,0 +1,26 @@ +package com.inteligr8.polygon; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +import com.inteligr8.rs.ClientConfiguration; + +@TestPropertySource(locations = {"/polygon-personal.properties"}) +@SpringJUnitConfig(classes = {PolygonClientConfiguration.class, PolygonClientJerseyImpl.class}) +public class ConnectionJerseyClientIT extends ConnectionClientIT { + + @Autowired + private PolygonClientJerseyImpl client; + + @Override + public PolygonPublicRestApi getClient() { + return this.client.getApi(); + } + + @Override + public ClientConfiguration getConfiguration() { + return this.client.getConfig(); + } + +}