From 658471f126a11954b20249cbd9b0ecd97f14091e Mon Sep 17 00:00:00 2001 From: Jim Hahn Date: Fri, 31 Jan 2020 09:42:04 -0500 Subject: Add async support to HttpClient Issue-ID: POLICY-1625 Signed-off-by: Jim Hahn Change-Id: I0123b98e89b734efd264dd62080bb23573a7a3e6 --- .../common/endpoints/http/client/HttpClient.java | 63 ++++++++++++++++++++-- .../http/client/internal/JerseyClient.java | 35 +++++++++++- 2 files changed, 94 insertions(+), 4 deletions(-) (limited to 'policy-endpoints/src/main/java/org/onap') diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java index 2fe46fb3..ebed1d7e 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/HttpClient.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,14 +21,16 @@ package org.onap.policy.common.endpoints.http.client; import java.util.Map; - +import java.util.concurrent.Future; import javax.ws.rs.client.Entity; +import javax.ws.rs.client.InvocationCallback; import javax.ws.rs.core.Response; import org.onap.policy.common.capabilities.Startable; /** - * Http Client interface. + * Http Client interface. Supports both synchronous and asynchronous operations. + * */ public interface HttpClient extends Startable { @@ -47,6 +49,24 @@ public interface HttpClient extends Startable { */ Response get(); + /** + * Asynchronous GET request. + * + * @param callback callback to be invoked, asynchronously, when the request completes + * @param path context uri path. + * + * @return future that can be used to cancel the request or await the response + */ + Future get(InvocationCallback callback, String path); + + /** + * Asynchronous GET request. + * + * @param callback callback to be invoked, asynchronously, when the request completes + * @return future that can be used to cancel the request or await the response + */ + Future get(InvocationCallback callback); + /** * PUT request. * @@ -58,6 +78,19 @@ public interface HttpClient extends Startable { */ Response put(String path, Entity entity, Map headers); + /** + * Asynchronous PUT request. + * + * @param callback callback to be invoked, asynchronously, when the request completes + * @param path context uri path + * @param entity body + * @param headers headers + * + * @return future that can be used to cancel the request or await the response + */ + Future put(InvocationCallback callback, String path, Entity entity, + Map headers); + /** * POST request. * @@ -69,6 +102,19 @@ public interface HttpClient extends Startable { */ Response post(String path, Entity entity, Map headers); + /** + * Asynchronous POST request. + * + * @param callback callback to be invoked, asynchronously, when the request completes + * @param path context uri path + * @param entity body + * @param headers headers + * + * @return future that can be used to cancel the request or await the response + */ + Future post(InvocationCallback callback, String path, Entity entity, + Map headers); + /** * DELETE request. * @@ -79,6 +125,17 @@ public interface HttpClient extends Startable { */ Response delete(String path, Map headers); + /** + * Asynchronous DELETE request. + * + * @param callback callback to be invoked, asynchronously, when the request completes + * @param path context uri path + * @param headers headers + * + * @return future that can be used to cancel the request or await the response + */ + Future delete(InvocationCallback callback, String path, Map headers); + /** * Retrieve the body from the HTTP transaction. * diff --git a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/internal/JerseyClient.java b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/internal/JerseyClient.java index 8a717712..1a822ff2 100644 --- a/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/internal/JerseyClient.java +++ b/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/http/client/internal/JerseyClient.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP * ================================================================================ - * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved. * Modifications Copyright (C) 2018 Samsung Electronics Co., Ltd. * Modifications Copyright (C) 2019 Nordix Foundation. * ================================================================================ @@ -28,11 +28,13 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.Future; import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation.Builder; +import javax.ws.rs.client.InvocationCallback; import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.glassfish.jersey.client.ClientProperties; @@ -168,21 +170,52 @@ public class JerseyClient implements HttpClient { return this.client.target(this.baseUrl).request().get(); } + @Override + public Future get(InvocationCallback callback, String path) { + if (!StringUtils.isBlank(path)) { + return this.client.target(this.baseUrl).path(path).request().async().get(callback); + } else { + return this.client.target(this.baseUrl).request().async().get(callback); + } + } + + @Override + public Future get(InvocationCallback callback) { + return this.client.target(this.baseUrl).request().async().get(callback); + } + @Override public Response put(String path, Entity entity, Map headers) { return getBuilder(path, headers).put(entity); } + @Override + public Future put(InvocationCallback callback, String path, Entity entity, + Map headers) { + return getBuilder(path, headers).async().put(entity, callback); + } + @Override public Response post(String path, Entity entity, Map headers) { return getBuilder(path, headers).post(entity); } + @Override + public Future post(InvocationCallback callback, String path, Entity entity, + Map headers) { + return getBuilder(path, headers).async().post(entity, callback); + } + @Override public Response delete(String path, Map headers) { return getBuilder(path, headers).delete(); } + @Override + public Future delete(InvocationCallback callback, String path, Map headers) { + return getBuilder(path, headers).async().delete(callback); + } + @Override public boolean start() { return alive; -- cgit 1.2.3-korg