From 749c1771a8a99a0166bfdb6ecd81d4bbd1a180ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:16:53 +0800 Subject: [PATCH 01/28] remove jersey --- hugegraph-common/pom.xml | 111 +-- .../hugegraph/rest/AbstractRestClient.java | 727 +++++++----------- .../rest/OkhttpBasicAuthInterceptor.java | 45 ++ .../apache/hugegraph/rest/OkhttpConfig.java | 37 + .../rest/OkhttpTokenInterceptor.java | 44 ++ .../org/apache/hugegraph/rest/RestClient.java | 18 +- .../org/apache/hugegraph/rest/RestResult.java | 46 +- .../org/apache/hugegraph/util/JsonUtil.java | 62 ++ .../hugegraph/unit/rest/RestClientTest.java | 327 ++++---- .../hugegraph/unit/rest/RestResultTest.java | 43 +- .../org.mockito.plugins.MockMaker | 17 + 11 files changed, 764 insertions(+), 713 deletions(-) create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/util/JsonUtil.java create mode 100644 hugegraph-common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/hugegraph-common/pom.xml b/hugegraph-common/pom.xml index 01bf29b1..20d0b3cc 100644 --- a/hugegraph-common/pom.xml +++ b/hugegraph-common/pom.xml @@ -37,6 +37,8 @@ + 1.18.8 + 4.10.0 @@ -196,76 +198,17 @@ ${jackson.version} - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - - - org.glassfish.jersey.media - jersey-media-json-jackson - ${jersey.version} - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-base - - - com.fasterxml.jackson.jaxrs - jackson-jaxrs-json-provider - - - jackson-annotations - com.fasterxml.jackson.core - - - jackson-databind - com.fasterxml.jackson.core - - - jackson-module-jaxb-annotations - com.fasterxml.jackson.module - - - - - org.glassfish.jersey.connectors - jersey-apache-connector - ${jersey.version} - - - commons-codec - commons-codec - - - commons-logging - commons-logging - - - - - org.glassfish.jersey.inject - jersey-hk2 - ${jersey.hk2.version} - - - javassist - org.javassist - - - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta.xml.version} - - - jakarta.activation-api - jakarta.activation - - - + + + + + + + + + + + com.sun.xml.bind jaxb-impl @@ -278,8 +221,36 @@ + + + com.squareup.okhttp3 + okhttp + + + com.squareup.okhttp3 + logging-interceptor + + + + org.projectlombok + lombok + ${lombok.version} + true + + + + + com.squareup.okhttp3 + okhttp-bom + ${okhttp.version} + pom + import + + + + diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index ea7e923e..c834ea1a 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -17,188 +17,175 @@ package org.apache.hugegraph.rest; +import com.google.common.collect.ImmutableMap; +import lombok.SneakyThrows; +import okhttp3.*; +import okio.BufferedSink; +import okio.GzipSink; +import okio.Okio; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.util.JsonUtil; +import org.jetbrains.annotations.NotNull; + +import javax.net.ssl.*; +import java.io.FileInputStream; +import java.io.IOException; import java.net.URI; -import java.security.KeyManagementException; -import java.security.SecureRandom; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; +import java.security.KeyStore; +import java.util.Arrays; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import org.apache.http.HttpHeaders; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.pool.PoolStats; -import org.apache.hugegraph.util.E; -import org.apache.hugegraph.util.ExecutorUtil; -import org.glassfish.jersey.SslConfigurator; -import org.glassfish.jersey.apache.connector.ApacheClientProperties; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.client.ClientProperties; -import org.glassfish.jersey.client.JerseyClientBuilder; -import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; -import org.glassfish.jersey.internal.util.collection.Ref; -import org.glassfish.jersey.internal.util.collection.Refs; -import org.glassfish.jersey.message.GZipEncoder; -import org.glassfish.jersey.uri.UriComponent; - -import com.google.common.collect.ImmutableMap; - -import jakarta.ws.rs.client.Client; -import jakarta.ws.rs.client.ClientRequestContext; -import jakarta.ws.rs.client.ClientRequestFilter; -import jakarta.ws.rs.client.Entity; -import jakarta.ws.rs.client.Invocation.Builder; -import jakarta.ws.rs.client.WebTarget; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; -import jakarta.ws.rs.core.Variant; - public abstract class AbstractRestClient implements RestClient { - // Time unit: hours - private static final long TTL = 24L; - // Time unit: ms - private static final long IDLE_TIME = 40L * 1000L; + private OkHttpClient client; - private static final String TOKEN_KEY = "tokenKey"; + private String baseUrl; - private final Client client; - private final WebTarget target; - - private PoolingHttpClientConnectionManager pool; - private ScheduledExecutorService cleanExecutor; + private Request.Builder requestBuilder = new Request.Builder(); public AbstractRestClient(String url, int timeout) { - this(url, new ConfigBuilder().configTimeout(timeout).build()); + this(url, OkhttpConfig.builder() + .timeout(timeout) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configUser(user, password) - .build()); + Integer timeout) { + this(url, OkhttpConfig.builder() + .user(user).password(password) + .timeout(timeout) + .build()); } public AbstractRestClient(String url, int timeout, - int maxTotal, int maxPerRoute) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configPool(maxTotal, maxPerRoute) - .build()); + int maxTotal, int maxPerRoute) { + this(url, null, null, timeout, maxTotal, maxPerRoute); } public AbstractRestClient(String url, int timeout, int idleTime, - int maxTotal, int maxPerRoute) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configIdleTime(idleTime) - .configPool(maxTotal, maxPerRoute) - .build()); + int maxTotal, int maxPerRoute) { + this(url, OkhttpConfig.builder() + .idleTime(idleTime) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configUser(user, password) - .configPool(maxTotal, maxPerRoute) - .build()); + int timeout, int maxTotal, int maxPerRoute) { + this(url, OkhttpConfig.builder() + .user(user).password(password) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, - String trustStoreFile, - String trustStorePassword) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configUser(user, password) - .configPool(maxTotal, maxPerRoute) - .configSSL(trustStoreFile, - trustStorePassword) - .build()); - } - - public AbstractRestClient(String url, String token, int timeout) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configToken(token) - .build()); - } - - public AbstractRestClient(String url, String token, int timeout, - int maxTotal, int maxPerRoute) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configToken(token) - .configPool(maxTotal, maxPerRoute) - .build()); - } - - public AbstractRestClient(String url, String token, int timeout, - int maxTotal, int maxPerRoute, - String trustStoreFile, - String trustStorePassword) { - this(url, new ConfigBuilder().configTimeout(timeout) - .configToken(token) - .configPool(maxTotal, maxPerRoute) - .configSSL(trustStoreFile, - trustStorePassword) - .build()); - } - - public AbstractRestClient(String url, ClientConfig config) { - configConnectionManager(url, config); - - this.client = JerseyClientBuilder.newClient(config); - this.client.register(GZipEncoder.class); - this.target = this.client.target(url); - this.pool = (PoolingHttpClientConnectionManager) config.getProperty( - ApacheClientProperties.CONNECTION_MANAGER); - if (this.pool != null) { - this.cleanExecutor = ExecutorUtil.newScheduledThreadPool( - "conn-clean-worker-%d"); - Number idleTimeProp = (Number) config.getProperty("idleTime"); - final long idleTime = idleTimeProp == null ? - IDLE_TIME : idleTimeProp.longValue(); - final long checkPeriod = idleTime / 2L; - this.cleanExecutor.scheduleWithFixedDelay(() -> { - PoolStats stats = this.pool.getTotalStats(); - int using = stats.getLeased() + stats.getPending(); - if (using > 0) { - // Do clean only when all connections are idle - return; - } - // Release connections when all clients are inactive - this.pool.closeIdleConnections(idleTime, TimeUnit.MILLISECONDS); - this.pool.closeExpiredConnections(); - }, checkPeriod, checkPeriod, TimeUnit.MILLISECONDS); + int timeout, int maxTotal, int maxPerRoute, + String trustStoreFile, + String trustStorePassword) { + this(url, OkhttpConfig.builder() + .user(user).password(password) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); + } + + public AbstractRestClient(String url, String token, Integer timeout) { + this(url, OkhttpConfig.builder() + .token(token) + .timeout(timeout) + .build()); + } + + public AbstractRestClient(String url, String token, Integer timeout, + Integer maxTotal, Integer maxPerRoute) { + this(url,OkhttpConfig.builder() + .token(token) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); + } + + public AbstractRestClient(String url, String token, Integer timeout, + Integer maxTotal, Integer maxPerRoute, + String trustStoreFile, + String trustStorePassword) { + this(url,OkhttpConfig.builder() + .token(token) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); + } + + public AbstractRestClient(String url, OkhttpConfig okhttpConfig) { + this.baseUrl = url; + this.client = getOkhttpClient(okhttpConfig); + } + + private OkHttpClient getOkhttpClient(OkhttpConfig okhttpConfig) { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + + if(okhttpConfig.getTimeout()!=null) { + builder.connectTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS); } - } - protected abstract void checkStatus(Response response, - Response.Status... statuses); + if(okhttpConfig.getIdleTime()!=null) { + ConnectionPool connectionPool = new ConnectionPool(5, okhttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); + builder.connectionPool(connectionPool); + } - protected Response request(Callable method) { - try { - return method.call(); - } catch (Exception e) { - throw new ClientException("Failed to do request", e); + + //auth + if(StringUtils.isNotBlank(okhttpConfig.getUser()) && StringUtils.isNotBlank(okhttpConfig.getPassword())) { + builder.addInterceptor(new OkhttpBasicAuthInterceptor(okhttpConfig.getUser(), okhttpConfig.getPassword())); } + if(StringUtils.isNotBlank(okhttpConfig.getToken())) { + builder.addInterceptor(new OkhttpTokenInterceptor(okhttpConfig.getToken())); + } + + //ssl + configSsl(builder, baseUrl, okhttpConfig.getTrustStoreFile(), okhttpConfig.getTrustStorePassword()); + + OkHttpClient okHttpClient = builder.build(); + + if(okhttpConfig.getMaxTotal()!=null) { + okHttpClient.dispatcher().setMaxRequests(okhttpConfig.getMaxTotal()); + } + + if(okhttpConfig.getMaxPerRoute()!=null) { + okHttpClient.dispatcher().setMaxRequestsPerHost(okhttpConfig.getMaxPerRoute()); + } + + return okHttpClient; + } + + @SneakyThrows + private void configSsl(OkHttpClient.Builder builder, String url, String trustStoreFile, String trustStorePass) { + if(StringUtils.isBlank(trustStoreFile) || StringUtils.isBlank(trustStorePass)) { + return; + } + + X509TrustManager trustManager = trustManagerForCertificates(trustStoreFile, trustStorePass); + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, new TrustManager[]{trustManager}, null); + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + builder.sslSocketFactory(sslSocketFactory, trustManager) + .hostnameVerifier(new HostNameVerifier(url)); } @Override @@ -207,31 +194,100 @@ public RestResult post(String path, Object object) { } @Override - public RestResult post(String path, Object object, - MultivaluedMap headers) { + public RestResult post(String path, Object object, Headers headers) { return this.post(path, object, headers, null); } @Override - public RestResult post(String path, Object object, - Map params) { + public RestResult post(String path, Object object, Map params) { return this.post(path, object, null, params); } + private Request.Builder getRequestBuilder(String path, String id, Headers headers, Map params ) { + HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder() + .addPathSegments(path); + if(id!=null) { + urlBuilder.addPathSegment(id); + } + + if(params!=null) { + params.forEach((name, value) -> { + if(value==null){ + return; + } + + if(value instanceof Collection) { + for (Object i : (Collection) value) { + urlBuilder.addQueryParameter(name, String.valueOf(i)); + } + } else { + urlBuilder.addQueryParameter(name, String.valueOf(value)); + } + }); + } + + Request.Builder builder = requestBuilder + .url(urlBuilder.build()); + + if(headers!=null) { + builder.headers(headers); + } + + this.attachAuthToRequest(builder); + + return builder; + } + + private static RequestBody getRequestBody(Object object, Headers headers) { + String contentType = parseContentType(headers); + String bodyContent; + if("application/json".equals(contentType)) { + if(object == null) { + bodyContent = "{}"; + } else { + bodyContent = JsonUtil.toJson(object); + } + } else { + bodyContent = String.valueOf(object); + } + RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); + + if(headers!=null && "gzip".equals(headers.get("Content-Encoding"))) { + requestBody = gzip(requestBody); + } + return requestBody; + } + + private static RequestBody gzip(final RequestBody body) { + return new RequestBody() { + @Override public MediaType contentType() { + return body.contentType(); + } + + @Override public long contentLength() { + return -1; // We don't know the compressed length in advance! + } + + @Override public void writeTo(BufferedSink sink) throws IOException { + BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); + body.writeTo(gzipSink); + gzipSink.close(); + } + }; + } + + @SneakyThrows @Override public RestResult post(String path, Object object, - MultivaluedMap headers, - Map params) { - Pair> pair = this.buildRequest(path, null, object, - headers, params); - Response response = this.request(() -> { - // pair.getLeft() is builder, pair.getRight() is entity (http body) - return pair.getLeft().post(pair.getRight()); - }); - // If check status failed, throw client exception. - checkStatus(response, Response.Status.CREATED, - Response.Status.OK, Response.Status.ACCEPTED); - return new RestResult(response); + Headers headers, + Map params) { + Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); + requestBuilder.post(getRequestBody(object, headers)); + + try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + checkStatus(response, 200, 201, 202); + return new RestResult(response); + } } @Override @@ -241,29 +297,38 @@ public RestResult put(String path, String id, Object object) { @Override public RestResult put(String path, String id, Object object, - MultivaluedMap headers) { + Headers headers) { return this.put(path, id, object, headers, null); } @Override public RestResult put(String path, String id, Object object, - Map params) { + Map params) { return this.put(path, id, object, null, params); } + @SneakyThrows @Override public RestResult put(String path, String id, Object object, - MultivaluedMap headers, - Map params) { - Pair> pair = this.buildRequest(path, id, object, - headers, params); - Response response = this.request(() -> { - // pair.getLeft() is builder, pair.getRight() is entity (http body) - return pair.getLeft().put(pair.getRight()); - }); - // If check status failed, throw client exception. - checkStatus(response, Response.Status.OK, Response.Status.ACCEPTED); - return new RestResult(response); + Headers headers, + Map params) { + Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); + requestBuilder.put(getRequestBody(object, headers)); + + try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + checkStatus(response, 200, 202); + return new RestResult(response); + } + } + + private static String parseContentType(Headers headers) { + if(headers!=null) { + String contentType = headers.get("Content-Type"); + if(contentType!=null) { + return contentType; + } + } + return "application/json"; } @Override @@ -281,31 +346,17 @@ public RestResult get(String path, String id) { return this.get(path, id, ImmutableMap.of()); } + @SneakyThrows private RestResult get(String path, String id, Map params) { - Ref target = Refs.of(this.target); - for (String key : params.keySet()) { - Object value = params.get(key); - if (value instanceof Collection) { - for (Object i : (Collection) value) { - target.set(target.get().queryParam(key, i)); - } - } else { - target.set(target.get().queryParam(key, value)); - } - } - - Response response = this.request(() -> { - WebTarget webTarget = target.get(); - Builder builder = id == null ? webTarget.path(path).request() : - webTarget.path(path).path(encode(id)).request(); - this.attachAuthToRequest(builder); - return builder.get(); - }); + Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); - checkStatus(response, Response.Status.OK); - return new RestResult(response); + try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + checkStatus(response, 200); + return new RestResult(response); + } } + @Override public RestResult delete(String path, Map params) { return this.delete(path, null, params); @@ -316,37 +367,42 @@ public RestResult delete(String path, String id) { return this.delete(path, id, ImmutableMap.of()); } + @SneakyThrows private RestResult delete(String path, String id, - Map params) { - Ref target = Refs.of(this.target); - for (String key : params.keySet()) { - target.set(target.get().queryParam(key, params.get(key))); + Map params) { + Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); + requestBuilder.delete(); + + try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + checkStatus(response, 204, 202); + return new RestResult(response); } + } - Response response = this.request(() -> { - WebTarget webTarget = target.get(); - Builder builder = id == null ? webTarget.path(path).request() : - webTarget.path(path).path(encode(id)).request(); - this.attachAuthToRequest(builder); - return builder.delete(); - }); + protected abstract void checkStatus(Response response, int... statuses); - checkStatus(response, Response.Status.NO_CONTENT, - Response.Status.ACCEPTED); - return new RestResult(response); + protected Response request(Callable method) { + try { + return method.call(); + } catch (Exception e) { + throw new ClientException("Failed to do request", e); + } } + @SneakyThrows @Override public void close() { - if (this.pool != null) { - this.pool.close(); - this.cleanExecutor.shutdownNow(); + if(client!=null) { + client.dispatcher().executorService().shutdown(); + client.connectionPool().evictAll(); + if(client.cache()!=null) { + client.cache().close(); + } } - this.client.close(); } private final ThreadLocal authContext = - new InheritableThreadLocal<>(); + new InheritableThreadLocal<>(); public void setAuthContext(String auth) { this.authContext.set(auth); @@ -360,136 +416,36 @@ public String getAuthContext() { return this.authContext.get(); } - private void attachAuthToRequest(Builder builder) { + private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); if (StringUtils.isNotEmpty(auth)) { - builder.header(HttpHeaders.AUTHORIZATION, auth); + builder.addHeader("Authorization", auth); } } - private Pair> buildRequest( - String path, String id, Object object, - MultivaluedMap headers, - Map params) { - WebTarget target = this.target; - if (params != null && !params.isEmpty()) { - for (Map.Entry param : params.entrySet()) { - target = target.queryParam(param.getKey(), param.getValue()); - } - } - - Builder builder = id == null ? target.path(path).request() : - target.path(path).path(encode(id)).request(); + @SneakyThrows + private X509TrustManager trustManagerForCertificates(String trustStoreFile, String trustStorePass){ + char[] password = trustStorePass.toCharArray(); - String encoding = null; - if (headers != null && !headers.isEmpty()) { - // Add headers - builder = builder.headers(headers); - encoding = (String) headers.getFirst("Content-Encoding"); + //load keyStore + KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); + try(FileInputStream in = new FileInputStream(trustStoreFile)) { + keyStore.load(in, password); } - // Add auth header - this.attachAuthToRequest(builder); - /* - * We should specify the encoding of the entity object manually, - * because Entity.json() method will reset "content encoding = - * null" that has been set up by headers before. - */ - MediaType customContentType = parseCustomContentType(headers); - Entity entity; - if (encoding == null) { - entity = Entity.entity(object, customContentType); - } else { - Variant variant = new Variant(customContentType, - (String) null, encoding); - entity = Entity.entity(object, variant); - } - return Pair.of(builder, entity); - } - - /** - * parse user custom content-type, returns MediaType.APPLICATION_JSON_TYPE default. - * @param headers custom http header - */ - private static MediaType parseCustomContentType(MultivaluedMap headers) { - String customContentType = null; - if (MapUtils.isNotEmpty(headers) && headers.get("Content-Type") != null) { - List contentTypeObj = headers.get("Content-Type"); - if (contentTypeObj != null && !contentTypeObj.isEmpty()) { - customContentType = contentTypeObj.get(0).toString(); - } - return MediaType.valueOf(customContentType); - } - return MediaType.APPLICATION_JSON_TYPE; - } - - private static void configConnectionManager(String url, ClientConfig conf) { - /* - * Using httpclient with connection pooling, and configuring the - * jersey connector. But the jersey that has been released in the maven central - * repository seems to have a bug: https://github.com/jersey/jersey/pull/3752 - */ - PoolingHttpClientConnectionManager pool = connectionManager(url, conf); - Object maxTotal = conf.getProperty("maxTotal"); - Object maxPerRoute = conf.getProperty("maxPerRoute"); - if (maxTotal != null) { - pool.setMaxTotal((int) maxTotal); - } - if (maxPerRoute != null) { - pool.setDefaultMaxPerRoute((int) maxPerRoute); - } - conf.property(ApacheClientProperties.CONNECTION_MANAGER, pool); - conf.connectorProvider(new ApacheConnectorProvider()); - } + TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + trustManagerFactory.init(keyStore); - private static PoolingHttpClientConnectionManager connectionManager( - String url, - ClientConfig conf) { - String protocol = (String) conf.getProperty("protocol"); - if (protocol == null || "http".equals(protocol)) { - return new PoolingHttpClientConnectionManager(TTL, TimeUnit.HOURS); + TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); + if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { + throw new IllegalStateException("Unexpected default trust managers:" + + Arrays.toString(trustManagers)); } - - assert "https".equals(protocol); - String trustStoreFile = (String) conf.getProperty("trustStoreFile"); - E.checkArgument(trustStoreFile != null && !trustStoreFile.isEmpty(), - "The trust store file must be set when use https"); - String trustStorePass = (String) conf.getProperty("trustStorePassword"); - E.checkArgument(trustStorePass != null, - "The trust store password must be set when use https"); - SSLContext context = SslConfigurator.newInstance() - .trustStoreFile(trustStoreFile) - .trustStorePassword(trustStorePass) - .securityProtocol("SSL") - .createSSLContext(); - TrustManager[] trustAllManager = NoCheckTrustManager.create(); - try { - context.init(null, trustAllManager, new SecureRandom()); - } catch (KeyManagementException e) { - throw new ClientException("Failed to init security management", e); - } - - HostnameVerifier verifier = new HostNameVerifier(url); - ConnectionSocketFactory httpSocketFactory, httpsSocketFactory; - httpSocketFactory = PlainConnectionSocketFactory.getSocketFactory(); - httpsSocketFactory = new SSLConnectionSocketFactory(context, verifier); - Registry registry = - RegistryBuilder.create() - .register("http", httpSocketFactory) - .register("https", httpsSocketFactory) - .build(); - return new PoolingHttpClientConnectionManager(registry, null, - null, null, TTL, - TimeUnit.HOURS); - } - - public static String encode(String raw) { - return UriComponent.encode(raw, UriComponent.Type.PATH_SEGMENT); + return (X509TrustManager) trustManagers[0]; } public static class HostNameVerifier implements HostnameVerifier { - private final String url; public HostNameVerifier(String url) { @@ -505,107 +461,10 @@ public boolean verify(String hostname, SSLSession session) { if (!this.url.isEmpty() && this.url.endsWith(hostname)) { return true; } else { - HostnameVerifier verifier = HttpsURLConnection - .getDefaultHostnameVerifier(); + HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier(); return verifier.verify(hostname, session); } } } - private static class NoCheckTrustManager implements X509TrustManager { - - @Override - public void checkClientTrusted(X509Certificate[] chain, String authType) - throws CertificateException { - } - - @Override - public void checkServerTrusted(X509Certificate[] chain, String authType) - throws CertificateException { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } - - public static TrustManager[] create() { - return new TrustManager[]{new NoCheckTrustManager()}; - } - } - - private static class ConfigBuilder { - - private final ClientConfig config; - - ConfigBuilder() { - this.config = new ClientConfig(); - } - - public ConfigBuilder configTimeout(int timeout) { - this.config.property(ClientProperties.CONNECT_TIMEOUT, timeout); - this.config.property(ClientProperties.READ_TIMEOUT, timeout); - return this; - } - - public ConfigBuilder configUser(String username, String password) { - /* - * NOTE: don't use non-preemptive mode - * In non-preemptive mode the authentication information is added - * only when server refuses the request with 401 status code and - * then the request is repeated. - * Non-preemptive has negative impact on the performance. The - * advantage is it doesn't send credentials when they are not needed - * https://jersey.github.io/documentation/latest/client.html#d0e5461 - */ - this.config.register(HttpAuthenticationFeature.basic(username, - password)); - return this; - } - - public ConfigBuilder configToken(String token) { - this.config.property(TOKEN_KEY, token); - this.config.register(BearerRequestFilter.class); - return this; - } - - public ConfigBuilder configPool(int maxTotal, int maxPerRoute) { - this.config.property("maxTotal", maxTotal); - this.config.property("maxPerRoute", maxPerRoute); - return this; - } - - public ConfigBuilder configIdleTime(int idleTime) { - this.config.property("idleTime", idleTime); - return this; - } - - public ConfigBuilder configSSL(String trustStoreFile, - String trustStorePassword) { - if (trustStoreFile == null || trustStoreFile.isEmpty() || - trustStorePassword == null) { - this.config.property("protocol", "http"); - } else { - this.config.property("protocol", "https"); - } - this.config.property("trustStoreFile", trustStoreFile); - this.config.property("trustStorePassword", trustStorePassword); - return this; - } - - public ClientConfig build() { - return this.config; - } - } - - public static class BearerRequestFilter implements ClientRequestFilter { - - @Override - public void filter(ClientRequestContext context) { - String token = context.getClient().getConfiguration() - .getProperty(TOKEN_KEY).toString(); - context.getHeaders().add(HttpHeaders.AUTHORIZATION, - "Bearer " + token); - } - } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java new file mode 100644 index 00000000..7a0e6969 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +import okhttp3.Credentials; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class OkhttpBasicAuthInterceptor implements Interceptor { + + private String credentials; + + public OkhttpBasicAuthInterceptor(String user, String password) { + this.credentials = Credentials.basic(user, password); + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + if(request.header("Authorization")==null) { + Request authenticatedRequest = request.newBuilder() + .header("Authorization", credentials).build(); + return chain.proceed(authenticatedRequest); + } + return chain.proceed(request); + } +} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java new file mode 100644 index 00000000..5d5c62da --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +@Builder +@Getter +@Setter +public class OkhttpConfig { + private String user; + private String password; + private String token; + private Integer timeout; + private Integer maxTotal; + private Integer maxPerRoute; + private Integer idleTime; + private String trustStoreFile; + private String trustStorePassword; +} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java new file mode 100644 index 00000000..8a3be283 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class OkhttpTokenInterceptor implements Interceptor { + + private String token; + + public OkhttpTokenInterceptor(String token) { + this.token = token; + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request(); + if(request.header("Authorization")==null) { + Request authenticatedRequest = request.newBuilder() + .header("Authorization", "Bearer "+token).build(); + return chain.proceed(authenticatedRequest); + } + return chain.proceed(request); + } +} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java index dc3b7b74..43be1f92 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java @@ -17,9 +17,9 @@ package org.apache.hugegraph.rest; -import java.util.Map; +import okhttp3.Headers; -import jakarta.ws.rs.core.MultivaluedMap; +import java.util.Map; public interface RestClient { /** @@ -27,24 +27,22 @@ public interface RestClient { */ RestResult post(String path, Object object); - RestResult post(String path, Object object, MultivaluedMap headers); - + RestResult post(String path, Object object, Headers headers); RestResult post(String path, Object object, Map params); - RestResult post(String path, Object object, MultivaluedMap headers, - Map params); + RestResult post(String path, Object object, Headers headers, + Map params); /** * Put method */ RestResult put(String path, String id, Object object); - - RestResult put(String path, String id, Object object, MultivaluedMap headers); + RestResult put(String path, String id, Object object, Headers headers); RestResult put(String path, String id, Object object, Map params); - RestResult put(String path, String id, Object object, MultivaluedMap headers, - Map params); + RestResult put(String path, String id, Object object, Headers headers, + Map params); /** * Get method diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index 82b7f39a..9ddcb011 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -17,33 +17,37 @@ package org.apache.hugegraph.rest; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; - import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.SneakyThrows; +import okhttp3.Headers; +import okhttp3.Response; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; public class RestResult { private static final ObjectMapper MAPPER = new ObjectMapper(); private final int status; - private final MultivaluedMap headers; + private final Headers headers; private final String content; public RestResult(Response response) { - this(response.getStatus(), response.readEntity(String.class), - response.getHeaders()); + this(response.code(), getResponseContent(response), response.headers()); + } + + @SneakyThrows + private static String getResponseContent(Response response) { + return response.body().string(); } public RestResult(int status, String content, - MultivaluedMap headers) { + Headers headers) { this.status = status; this.headers = headers; this.content = content; @@ -53,7 +57,7 @@ public int status() { return this.status; } - public MultivaluedMap headers() { + public Headers headers() { return this.headers; } @@ -66,7 +70,7 @@ public T readObject(Class clazz) { return MAPPER.readValue(this.content, clazz); } catch (Exception e) { throw new SerializeException( - "Failed to deserialize: %s", e, this.content); + "Failed to deserialize: %s", e, this.content); } } @@ -77,35 +81,35 @@ public List readList(String key, Class clazz) { JsonNode element = root.get(key); if (element == null) { throw new SerializeException( - "Can't find value of the key: %s in json.", key); + "Can't find value of the key: %s in json.", key); } JavaType type = MAPPER.getTypeFactory() - .constructParametrizedType(ArrayList.class, - List.class, clazz); + .constructParametrizedType(ArrayList.class, + List.class, clazz); return MAPPER.convertValue(element, type); } catch (IOException e) { throw new SerializeException( - "Failed to deserialize %s", e, this.content); + "Failed to deserialize %s", e, this.content); } } @SuppressWarnings("deprecation") public List readList(Class clazz) { JavaType type = MAPPER.getTypeFactory() - .constructParametrizedType(ArrayList.class, - List.class, clazz); + .constructParametrizedType(ArrayList.class, + List.class, clazz); try { return MAPPER.readValue(this.content, type); } catch (IOException e) { throw new SerializeException( - "Failed to deserialize %s", e, this.content); + "Failed to deserialize %s", e, this.content); } } @Override public String toString() { return String.format("{status=%s, headers=%s, content=%s}", - this.status, this.headers, this.content); + this.status, this.headers, this.content); } public static void registerModule(Module module) { diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/util/JsonUtil.java b/hugegraph-common/src/main/java/org/apache/hugegraph/util/JsonUtil.java new file mode 100644 index 00000000..fc9586b3 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/util/JsonUtil.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.Module; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.hugegraph.rest.SerializeException; + +import java.io.IOException; + +public final class JsonUtil { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + public static void registerModule(Module module) { + MAPPER.registerModule(module); + } + + public static String toJson(Object object) { + try { + return MAPPER.writeValueAsString(object); + } catch (JsonProcessingException e) { + throw new SerializeException("Failed to serialize object '%s'", + e, object); + } + } + + public static T fromJson(String json, Class clazz) { + try { + return MAPPER.readValue(json, clazz); + } catch (IOException e) { + throw new SerializeException("Failed to deserialize json '%s'", + e, json); + } + } + + public static T convertValue(JsonNode node, Class clazz) { + try { + return MAPPER.convertValue(node, clazz); + } catch (IllegalArgumentException e) { + throw new SerializeException("Failed to deserialize json node '%s'", + e, node); + } + } +} diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index eb9c7c29..818f39db 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -31,26 +31,20 @@ import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSessionContext; -import jakarta.ws.rs.client.Invocation.Builder; -import jakarta.ws.rs.client.WebTarget; -import jakarta.ws.rs.core.MultivaluedHashMap; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; +import com.google.common.net.HttpHeaders; +import lombok.SneakyThrows; +import okhttp3.*; import org.apache.hugegraph.unit.BaseUnitTest; +import org.junit.BeforeClass; import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.glassfish.jersey.internal.util.collection.ImmutableMultivaluedMap; -import org.apache.http.HttpClientConnection; -import org.apache.http.HttpHeaders; -import org.apache.http.HttpHost; -import org.apache.http.conn.routing.HttpRoute; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.pool.PoolStats; import org.apache.hugegraph.rest.AbstractRestClient; import org.apache.hugegraph.rest.ClientException; @@ -61,17 +55,36 @@ public class RestClientTest { + private static final Request.Builder requestBuilder = Mockito.mock(Request.Builder.class, Mockito.RETURNS_DEEP_STUBS); + + @BeforeClass + public static void setUp() { + HttpUrl.Builder httpUrlBuilder = Mockito.mock(HttpUrl.Builder.class, Mockito.RETURNS_DEEP_STUBS); + HttpUrl httpUrl = Mockito.mock(HttpUrl.class); + + MockedStatic httpUrlMockedStatic = Mockito.mockStatic(HttpUrl.class); + httpUrlMockedStatic.when(() -> HttpUrl.parse("/test")).thenReturn(httpUrl); + Mockito.when(httpUrl.newBuilder()).thenReturn(httpUrlBuilder); + + Mockito.when(httpUrlBuilder.addPathSegments("test")).thenReturn(httpUrlBuilder); + Mockito.when(httpUrlBuilder.addPathSegments("test") + .addPathSegment("id")) + .thenReturn(httpUrlBuilder); + Mockito.when(requestBuilder.url(httpUrlBuilder.addPathSegments("test").addPathSegment("id").build())) + .thenReturn(requestBuilder); + } + private static class RestClientImpl extends AbstractRestClient { private final int status; - private final MultivaluedMap headers; + private final Headers headers; private final String content; public RestClientImpl(String url, int timeout, int idleTime, int maxTotal, int maxPerRoute, int status) { super(url, timeout, idleTime, maxTotal, maxPerRoute); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -79,7 +92,7 @@ public RestClientImpl(String url, int timeout, int maxTotal, int maxPerRoute, int status) { super(url, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -87,7 +100,7 @@ public RestClientImpl(String url, String user, String password, int timeout, int status) { super(url, user, password, timeout); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -96,7 +109,7 @@ public RestClientImpl(String url, String user, String password, int status) { super(url, user, password, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -107,7 +120,7 @@ public RestClientImpl(String url, String user, String password, super(url, user, password, timeout, maxTotal, maxPerRoute, trustStoreFile, trustStorePassword); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -115,7 +128,7 @@ public RestClientImpl(String url, String token, int timeout, int status) { super(url, token, timeout); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -123,7 +136,7 @@ public RestClientImpl(String url, String token, int timeout, int maxTotal, int maxPerRoute, int status) { super(url, token, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } @@ -134,16 +147,16 @@ public RestClientImpl(String url, String token, int timeout, super(url, token, timeout, maxTotal, maxPerRoute, trustStoreFile, trustStorePassword); this.status = status; - this.headers = ImmutableMultivaluedMap.empty(); + this.headers = new Headers.Builder().build(); this.content = ""; } public RestClientImpl(String url, int timeout, int status) { - this(url, timeout, status, ImmutableMultivaluedMap.empty(), ""); + this(url, timeout, status, new Headers.Builder().build(), ""); } public RestClientImpl(String url, int timeout, int status, - MultivaluedMap headers, + Headers headers, String content) { super(url, timeout); this.status = status; @@ -151,22 +164,23 @@ public RestClientImpl(String url, int timeout, int status, this.content = content; } + @SneakyThrows @Override protected Response request(Callable method) { - Response response = Mockito.mock(Response.class); - Mockito.when(response.getStatus()).thenReturn(this.status); - Mockito.when(response.getHeaders()).thenReturn(this.headers); - Mockito.when(response.readEntity(String.class)) + Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(response.code()).thenReturn(this.status); + Mockito.when(response.headers()).thenReturn(this.headers); + Mockito.when(response.body().string()) .thenReturn(this.content); return response; } @Override protected void checkStatus(Response response, - Response.Status... statuses) { + int ... statuses) { boolean match = false; - for (Response.Status status : statuses) { - if (status.getStatusCode() == response.getStatus()) { + for (int status : statuses) { + if (status == response.code()) { match = true; break; } @@ -192,51 +206,54 @@ public void testPostWithMaxTotalAndPerRoute() { Assert.assertEquals(200, restResult.status()); } - @Test - public void testCleanExecutor() throws Exception { - // Modify IDLE_TIME 100ms to speed test - int newIdleTime = 100; - int newCheckPeriod = newIdleTime + 20; - - RestClient client = new RestClientImpl("/test", 1000, newIdleTime, - 10, 5, 200); - - PoolingHttpClientConnectionManager pool; - pool = Whitebox.getInternalState(client, "pool"); - pool = Mockito.spy(pool); - Whitebox.setInternalState(client, "pool", pool); - HttpRoute route = new HttpRoute(HttpHost.create( - "http://127.0.0.1:8080")); - // Create a connection manually, it will be put into leased list - HttpClientConnection conn = pool.requestConnection(route, null) - .get(1L, TimeUnit.SECONDS); - PoolStats stats = pool.getTotalStats(); - int usingConns = stats.getLeased() + stats.getPending(); - Assert.assertGte(1, usingConns); - - // Sleep more than two check periods for busy connection - Thread.sleep(newCheckPeriod); - Mockito.verify(pool, Mockito.never()).closeExpiredConnections(); - stats = pool.getTotalStats(); - usingConns = stats.getLeased() + stats.getPending(); - Assert.assertGte(1, usingConns); - - // The connection will be put into available list - pool.releaseConnection(conn, null, 0, TimeUnit.SECONDS); - - stats = pool.getTotalStats(); - usingConns = stats.getLeased() + stats.getPending(); - Assert.assertEquals(0, usingConns); - /* - * Sleep more than two check periods for free connection, - * ensure connection has been closed - */ - Thread.sleep(newCheckPeriod); - Mockito.verify(pool, Mockito.atLeastOnce()) - .closeExpiredConnections(); - Mockito.verify(pool, Mockito.atLeastOnce()) - .closeIdleConnections(newIdleTime, TimeUnit.MILLISECONDS); - } + /** + * okhttp does not need to manually clean Executor + */ +// @Test +// public void testCleanExecutor() throws Exception { +// // Modify IDLE_TIME 100ms to speed test +// int newIdleTime = 100; +// int newCheckPeriod = newIdleTime + 20; +// +// RestClient client = new RestClientImpl("/test", 1000, newIdleTime, +// 10, 5, 200); +// +// PoolingHttpClientConnectionManager pool; +// pool = Whitebox.getInternalState(client, "pool"); +// pool = Mockito.spy(pool); +// Whitebox.setInternalState(client, "pool", pool); +// HttpRoute route = new HttpRoute(HttpHost.create( +// "http://127.0.0.1:8080")); +// // Create a connection manually, it will be put into leased list +// HttpClientConnection conn = pool.requestConnection(route, null) +// .get(1L, TimeUnit.SECONDS); +// PoolStats stats = pool.getTotalStats(); +// int usingConns = stats.getLeased() + stats.getPending(); +// Assert.assertGte(1, usingConns); +// +// // Sleep more than two check periods for busy connection +// Thread.sleep(newCheckPeriod); +// Mockito.verify(pool, Mockito.never()).closeExpiredConnections(); +// stats = pool.getTotalStats(); +// usingConns = stats.getLeased() + stats.getPending(); +// Assert.assertGte(1, usingConns); +// +// // The connection will be put into available list +// pool.releaseConnection(conn, null, 0, TimeUnit.SECONDS); +// +// stats = pool.getTotalStats(); +// usingConns = stats.getLeased() + stats.getPending(); +// Assert.assertEquals(0, usingConns); +// /* +// * Sleep more than two check periods for free connection, +// * ensure connection has been closed +// */ +// Thread.sleep(newCheckPeriod); +// Mockito.verify(pool, Mockito.atLeastOnce()) +// .closeExpiredConnections(); +// Mockito.verify(pool, Mockito.atLeastOnce()) +// .closeIdleConnections(newIdleTime, TimeUnit.MILLISECONDS); +// } @Test public void testPostWithUserAndPassword() { @@ -327,10 +344,11 @@ public void testHostNameVerifier() { @Test public void testPostWithHeaderAndContent() { - MultivaluedMap headers = new MultivaluedHashMap<>(); - headers.add("key1", "value1-1"); - headers.add("key1", "value1-2"); - headers.add("Content-Encoding", "gzip"); + Headers.Builder headersBuilder = new Headers.Builder(); + headersBuilder.add("key1", "value1-1"); + headersBuilder.add("key1", "value1-2"); + headersBuilder.add("Content-Encoding", "gzip"); + Headers headers = headersBuilder.build(); String content = "{\"names\": [\"marko\", \"josh\", \"lop\"]}"; RestClient client = new RestClientImpl("/test", 1000, 200, headers, content); @@ -353,7 +371,7 @@ public void testPostWithException() { @Test public void testPostWithParams() { RestClient client = new RestClientImpl("/test", 1000, 200); - MultivaluedMap headers = ImmutableMultivaluedMap.empty(); + Headers headers = new Headers.Builder().build(); Map params = ImmutableMap.of("param1", "value1"); RestResult restResult = client.post("path", "body", headers, params); @@ -370,11 +388,11 @@ public void testPut() { @Test public void testPutWithHeaders() { RestClient client = new RestClientImpl("/test", 1000, 200); - MultivaluedMap headers = new MultivaluedHashMap<>(); - headers.add("key1", "value1-1"); - headers.add("key1", "value1-2"); - headers.add("Content-Encoding", "gzip"); - RestResult restResult = client.put("path", "id1", "body", headers); + Headers.Builder headersBuilder = new Headers.Builder(); + headersBuilder.add("key1", "value1-1"); + headersBuilder.add("key1", "value1-2"); + headersBuilder.add("Content-Encoding", "gzip"); + RestResult restResult = client.put("path", "id1", "body", headersBuilder.build()); Assert.assertEquals(200, restResult.status()); } @@ -449,28 +467,31 @@ public void testDeleteWithException() { }); } - @Test - public void testClose() { - RestClient client = new RestClientImpl("/test", 1000, 10, 5, 200); - RestResult restResult = client.post("path", "body"); - Assert.assertEquals(200, restResult.status()); - - client.close(); - Assert.assertThrows(IllegalStateException.class, () -> { - client.post("path", "body"); - }); - - PoolingHttpClientConnectionManager pool; - pool = Whitebox.getInternalState(client, "pool"); - Assert.assertNotNull(pool); - AtomicBoolean isShutDown = Whitebox.getInternalState(pool, "isShutDown"); - Assert.assertTrue(isShutDown.get()); - - ScheduledExecutorService cleanExecutor; - cleanExecutor = Whitebox.getInternalState(client, "cleanExecutor"); - Assert.assertNotNull(cleanExecutor); - Assert.assertTrue(cleanExecutor.isShutdown()); - } + /** + * okhttp does not need to manually close connection pool + */ +// @Test +// public void testClose() { +// RestClient client = new RestClientImpl("/test", 1000, 10, 5, 200); +// RestResult restResult = client.post("path", "body"); +// Assert.assertEquals(200, restResult.status()); +// +// client.close(); +// Assert.assertThrows(IllegalStateException.class, () -> { +// client.post("path", "body"); +// }); +// +// PoolingHttpClientConnectionManager pool; +// pool = Whitebox.getInternalState(client, "pool"); +// Assert.assertNotNull(pool); +// AtomicBoolean isShutDown = Whitebox.getInternalState(pool, "isShutDown"); +// Assert.assertTrue(isShutDown.get()); +// +// ScheduledExecutorService cleanExecutor; +// cleanExecutor = Whitebox.getInternalState(client, "cleanExecutor"); +// Assert.assertNotNull(cleanExecutor); +// Assert.assertTrue(cleanExecutor.isShutdown()); +// } @Test public void testAuthContext() { @@ -493,40 +514,32 @@ public MockRestClientImpl(String url, int timeout) { @Override protected void checkStatus(Response response, - Response.Status... statuses) { + int... statuses) { // pass } } + @SneakyThrows @Test public void testRequest() { - MockRestClientImpl client = new MockRestClientImpl("test", 1000); - - WebTarget target = Mockito.mock(WebTarget.class); - Builder builder = Mockito.mock(Builder.class); - - Mockito.when(target.path("test")).thenReturn(target); - Mockito.when(target.path("test") - .path(AbstractRestClient.encode("id"))) - .thenReturn(target); - Mockito.when(target.path("test").request()).thenReturn(builder); - Mockito.when(target.path("test") - .path(AbstractRestClient.encode("id")) - .request()) - .thenReturn(builder); - - Response response = Mockito.mock(Response.class); - Mockito.when(response.getStatus()).thenReturn(200); - Mockito.when(response.getHeaders()) - .thenReturn(new MultivaluedHashMap<>()); - Mockito.when(response.readEntity(String.class)).thenReturn("content"); - - Mockito.when(builder.delete()).thenReturn(response); - Mockito.when(builder.get()).thenReturn(response); - Mockito.when(builder.put(Mockito.any())).thenReturn(response); - Mockito.when(builder.post(Mockito.any())).thenReturn(response); - - Whitebox.setInternalState(client, "target", target); + MockRestClientImpl client = new MockRestClientImpl("/test", 1000); + + Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(response.code()).thenReturn(200); + Mockito.when(response.headers()) + .thenReturn(new Headers.Builder().build()); + Mockito.when(response.body().string()).thenReturn("content"); + + Mockito.when(requestBuilder.delete()).thenReturn(requestBuilder); + Mockito.when(requestBuilder.get()).thenReturn(requestBuilder); + Mockito.when(requestBuilder.put(Mockito.any())).thenReturn(requestBuilder); + Mockito.when(requestBuilder.post(Mockito.any())).thenReturn(requestBuilder); + + OkHttpClient okHttpClient = Mockito.mock(OkHttpClient.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(okHttpClient.newCall(Mockito.any()).execute()).thenReturn(response); + + Whitebox.setInternalState(client, "client", okHttpClient); + Whitebox.setInternalState(client, "requestBuilder", requestBuilder); RestResult result; @@ -534,14 +547,15 @@ public void testRequest() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader("Authorization", "token1"); + client.resetAuthContext(); client.setAuthContext("token2"); result = client.delete("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token2"); client.resetAuthContext(); @@ -549,81 +563,82 @@ public void testRequest() { client.setAuthContext("token3"); result = client.get("test"); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token3"); client.resetAuthContext(); client.setAuthContext("token4"); result = client.get("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token4"); client.resetAuthContext(); client.setAuthContext("token5"); result = client.get("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token5"); client.resetAuthContext(); // Test put client.setAuthContext("token6"); - result = client.post("test", new Object()); +// result = client.post("test", new Object()); //why use new Object() as args here? + result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token6"); client.resetAuthContext(); client.setAuthContext("token7"); - result = client.post("test", new Object(), new MultivaluedHashMap<>()); + result = client.post("test", null, new Headers.Builder().build()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token7"); client.resetAuthContext(); client.setAuthContext("token8"); - result = client.post("test", new Object(), ImmutableMap.of()); + result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token8"); client.resetAuthContext(); client.setAuthContext("token9"); - result = client.post("test", new Object(), new MultivaluedHashMap<>(), + result = client.post("test", null, new Headers.Builder().build(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token9"); client.resetAuthContext(); // Test post client.setAuthContext("token10"); - result = client.post("test", new Object()); + result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token10"); client.resetAuthContext(); client.setAuthContext("token11"); - result = client.post("test", new Object(), new MultivaluedHashMap<>()); + result = client.post("test", null, new Headers.Builder().build()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token11"); client.resetAuthContext(); client.setAuthContext("token12"); - result = client.post("test", new Object(), ImmutableMap.of()); + result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token12"); client.resetAuthContext(); client.setAuthContext("token13"); - result = client.post("test", new Object(), new MultivaluedHashMap<>(), + result = client.post("test", null, new Headers.Builder().build(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(builder).header(HttpHeaders.AUTHORIZATION, + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token13"); client.resetAuthContext(); } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java index 2ae9a4ee..4cee058e 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java @@ -17,21 +17,18 @@ package org.apache.hugegraph.unit.rest; -import java.util.Map; - -import jakarta.ws.rs.core.MultivaluedHashMap; -import jakarta.ws.rs.core.MultivaluedMap; -import jakarta.ws.rs.core.Response; -import org.glassfish.jersey.internal.util.collection.ImmutableMultivaluedMap; -import org.junit.Test; -import org.mockito.Mockito; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; - +import lombok.SneakyThrows; +import okhttp3.Headers; +import okhttp3.Response; import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.rest.SerializeException; import org.apache.hugegraph.testutil.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.Map; public class RestResultTest { @@ -43,10 +40,11 @@ public void testStatus() { @Test public void testHeaders() { - MultivaluedMap headers = new MultivaluedHashMap<>(); - headers.add("key1", "value1-1"); - headers.add("key1", "value1-2"); - headers.add("key2", "value2"); + Headers.Builder headersBuilder = new Headers.Builder(); + headersBuilder.add("key1", "value1-1"); + headersBuilder.add("key1", "value1-2"); + headersBuilder.add("key2", "value2"); + Headers headers = headersBuilder.build(); RestResult result = newRestResult(200, headers); Assert.assertEquals(200, result.status()); Assert.assertEquals(headers, result.headers()); @@ -118,24 +116,25 @@ public void testContentListWithException() { } private static RestResult newRestResult(int status) { - return newRestResult(status, "", ImmutableMultivaluedMap.empty()); + return newRestResult(status, "", new Headers.Builder().build()); } private static RestResult newRestResult(int status, String content) { - return newRestResult(status, content, ImmutableMultivaluedMap.empty()); + return newRestResult(status, content, new Headers.Builder().build()); } private static RestResult newRestResult(int status, - MultivaluedMap h) { + Headers h) { return newRestResult(status, "", h); } + @SneakyThrows private static RestResult newRestResult(int status, String content, - MultivaluedMap h) { - Response response = Mockito.mock(Response.class); - Mockito.when(response.getStatus()).thenReturn(status); - Mockito.when(response.getHeaders()).thenReturn(h); - Mockito.when(response.readEntity(String.class)) + Headers h) { + Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(response.code()).thenReturn(status); + Mockito.when(response.headers()).thenReturn(h); + Mockito.when(response.body().string()) .thenReturn(content); return new RestResult(response); } diff --git a/hugegraph-common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/hugegraph-common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker new file mode 100644 index 00000000..a76010b2 --- /dev/null +++ b/hugegraph-common/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker @@ -0,0 +1,17 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with this +# work for additional information regarding copyright ownership. The ASF +# licenses this file to You under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +mock-maker-inline From 79b04ccba230b1b3440ecdfb7256798d359d8a11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:21:22 +0800 Subject: [PATCH 02/28] add workflow_dispatch --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0616bf88..cc0cd1aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,7 @@ name: "hugegraph-commons ci" on: + workflow_dispatch: push: branches: - master From ebb0331e0210f6a60be6e7c11b4017600c6d3921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:21:47 +0800 Subject: [PATCH 03/28] add workflow_dispatch --- .github/workflows/license-checker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/license-checker.yml b/.github/workflows/license-checker.yml index 9c74ed0a..0485bd1b 100644 --- a/.github/workflows/license-checker.yml +++ b/.github/workflows/license-checker.yml @@ -1,6 +1,7 @@ name: "license checker" on: + workflow_dispatch: push: branches: - master From c79ac13cb6c4e537ea44086f6a0442e43711f656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:29:29 +0800 Subject: [PATCH 04/28] Empty-Commit From befd4dadbb7c7fe247e8a8f0a52aec2426e8a0dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:30:17 +0800 Subject: [PATCH 05/28] Empty-Commit From ddadd35be898436a1cd877a9698ee43573f00127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 00:32:44 +0800 Subject: [PATCH 06/28] Update ci.yml workflow_dispatch --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0616bf88..cc0cd1aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,7 @@ name: "hugegraph-commons ci" on: + workflow_dispatch: push: branches: - master From 0d44db7fc6470aa9b3b4be18a0942f52b1c61cce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 01:11:22 +0800 Subject: [PATCH 07/28] fix error --- .../java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java index 510d1454..5ab86e32 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java @@ -94,7 +94,7 @@ public void testClasses() throws IOException { @SuppressWarnings("unchecked") List classes = IteratorUtils.toList(ReflectionUtil.classes( "org.apache.hugegraph.util")); - Assert.assertEquals(17, classes.size()); + Assert.assertEquals(18, classes.size()); classes.sort(Comparator.comparing(ClassInfo::getName)); Assert.assertEquals("org.apache.hugegraph.util.Bytes", classes.get(0).getName()); From b77745b83bdff95881ce1f4aad319381c1680d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 28 Aug 2023 01:20:43 +0800 Subject: [PATCH 08/28] fix error --- .../java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java index 5ab86e32..c83b2ad9 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/util/ReflectionUtilTest.java @@ -103,7 +103,7 @@ public void testClasses() throws IOException { Assert.assertEquals("org.apache.hugegraph.util.CollectionUtil", classes.get(2).getName()); Assert.assertEquals("org.apache.hugegraph.util.VersionUtil", - classes.get(16).getName()); + classes.get(17).getName()); } @Test From 5198676f325438e047b77e514cfe7156d06eac03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sun, 3 Sep 2023 23:03:29 +0800 Subject: [PATCH 09/28] chore: reformat code --- .../hugegraph/rest/AbstractRestClient.java | 347 ++++++++++-------- .../rest/OkhttpBasicAuthInterceptor.java | 10 +- .../rest/OkhttpTokenInterceptor.java | 11 +- .../org/apache/hugegraph/rest/RestClient.java | 10 +- .../org/apache/hugegraph/rest/RestResult.java | 37 +- .../hugegraph/unit/rest/RestResultTest.java | 62 ++-- 6 files changed, 255 insertions(+), 222 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index c834ea1a..4b95ab81 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -17,17 +17,6 @@ package org.apache.hugegraph.rest; -import com.google.common.collect.ImmutableMap; -import lombok.SneakyThrows; -import okhttp3.*; -import okio.BufferedSink; -import okio.GzipSink; -import okio.Okio; -import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.util.JsonUtil; -import org.jetbrains.annotations.NotNull; - -import javax.net.ssl.*; import java.io.FileInputStream; import java.io.IOException; import java.net.URI; @@ -38,96 +27,123 @@ import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; -public abstract class AbstractRestClient implements RestClient { +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; - private OkHttpClient client; +import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.util.JsonUtil; - private String baseUrl; +import com.google.common.collect.ImmutableMap; - private Request.Builder requestBuilder = new Request.Builder(); +import lombok.SneakyThrows; +import okhttp3.ConnectionPool; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.MediaType; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okio.BufferedSink; +import okio.GzipSink; +import okio.Okio; + +public abstract class AbstractRestClient implements RestClient { + + private final ThreadLocal authContext = + new InheritableThreadLocal<>(); + private final OkHttpClient client; + private final String baseUrl; + private final Request.Builder requestBuilder = new Request.Builder(); public AbstractRestClient(String url, int timeout) { this(url, OkhttpConfig.builder() - .timeout(timeout) - .build()); + .timeout(timeout) + .build()); } public AbstractRestClient(String url, String user, String password, - Integer timeout) { + Integer timeout) { this(url, OkhttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .build()); + .user(user).password(password) + .timeout(timeout) + .build()); } public AbstractRestClient(String url, int timeout, - int maxTotal, int maxPerRoute) { + int maxTotal, int maxPerRoute) { this(url, null, null, timeout, maxTotal, maxPerRoute); } public AbstractRestClient(String url, int timeout, int idleTime, - int maxTotal, int maxPerRoute) { + int maxTotal, int maxPerRoute) { this(url, OkhttpConfig.builder() - .idleTime(idleTime) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); + .idleTime(idleTime) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute) { + int timeout, int maxTotal, int maxPerRoute) { this(url, OkhttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); + .user(user).password(password) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, - String trustStoreFile, - String trustStorePassword) { + int timeout, int maxTotal, int maxPerRoute, + String trustStoreFile, + String trustStorePassword) { this(url, OkhttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .trustStoreFile(trustStoreFile) - .trustStorePassword(trustStorePassword) - .build()); + .user(user).password(password) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); } public AbstractRestClient(String url, String token, Integer timeout) { this(url, OkhttpConfig.builder() - .token(token) - .timeout(timeout) - .build()); + .token(token) + .timeout(timeout) + .build()); } public AbstractRestClient(String url, String token, Integer timeout, - Integer maxTotal, Integer maxPerRoute) { - this(url,OkhttpConfig.builder() - .token(token) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); + Integer maxTotal, Integer maxPerRoute) { + this(url, OkhttpConfig.builder() + .token(token) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .build()); } public AbstractRestClient(String url, String token, Integer timeout, - Integer maxTotal, Integer maxPerRoute, - String trustStoreFile, - String trustStorePassword) { - this(url,OkhttpConfig.builder() - .token(token) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .trustStoreFile(trustStoreFile) - .trustStorePassword(trustStorePassword) - .build()); + Integer maxTotal, Integer maxPerRoute, + String trustStoreFile, + String trustStorePassword) { + this(url, OkhttpConfig.builder() + .token(token) + .timeout(timeout) + .maxTotal(maxTotal) + .maxPerRoute(maxPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); } public AbstractRestClient(String url, OkhttpConfig okhttpConfig) { @@ -135,38 +151,93 @@ public AbstractRestClient(String url, OkhttpConfig okhttpConfig) { this.client = getOkhttpClient(okhttpConfig); } + private static RequestBody getRequestBody(Object object, Headers headers) { + String contentType = parseContentType(headers); + String bodyContent; + if ("application/json".equals(contentType)) { + if (object == null) { + bodyContent = "{}"; + } else { + bodyContent = JsonUtil.toJson(object); + } + } else { + bodyContent = String.valueOf(object); + } + RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); + + if (headers != null && "gzip".equals(headers.get("Content-Encoding"))) { + requestBody = gzip(requestBody); + } + return requestBody; + } + + private static RequestBody gzip(final RequestBody body) { + return new RequestBody() { + @Override + public MediaType contentType() { + return body.contentType(); + } + + @Override + public long contentLength() { + return -1; // We don't know the compressed length in advance! + } + + @Override + public void writeTo(BufferedSink sink) throws IOException { + BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); + body.writeTo(gzipSink); + gzipSink.close(); + } + }; + } + + private static String parseContentType(Headers headers) { + if (headers != null) { + String contentType = headers.get("Content-Type"); + if (contentType != null) { + return contentType; + } + } + return "application/json"; + } + private OkHttpClient getOkhttpClient(OkhttpConfig okhttpConfig) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - if(okhttpConfig.getTimeout()!=null) { + if (okhttpConfig.getTimeout() != null) { builder.connectTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS) - .readTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS); + .readTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS); } - if(okhttpConfig.getIdleTime()!=null) { - ConnectionPool connectionPool = new ConnectionPool(5, okhttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); + if (okhttpConfig.getIdleTime() != null) { + ConnectionPool connectionPool = + new ConnectionPool(5, okhttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); builder.connectionPool(connectionPool); } - //auth - if(StringUtils.isNotBlank(okhttpConfig.getUser()) && StringUtils.isNotBlank(okhttpConfig.getPassword())) { - builder.addInterceptor(new OkhttpBasicAuthInterceptor(okhttpConfig.getUser(), okhttpConfig.getPassword())); + // auth header interceptor + if (StringUtils.isNotBlank(okhttpConfig.getUser()) && + StringUtils.isNotBlank(okhttpConfig.getPassword())) { + builder.addInterceptor(new OkhttpBasicAuthInterceptor(okhttpConfig.getUser(), + okhttpConfig.getPassword())); } - if(StringUtils.isNotBlank(okhttpConfig.getToken())) { + if (StringUtils.isNotBlank(okhttpConfig.getToken())) { builder.addInterceptor(new OkhttpTokenInterceptor(okhttpConfig.getToken())); } - //ssl - configSsl(builder, baseUrl, okhttpConfig.getTrustStoreFile(), okhttpConfig.getTrustStorePassword()); + // ssl + configSsl(builder, baseUrl, okhttpConfig.getTrustStoreFile(), + okhttpConfig.getTrustStorePassword()); OkHttpClient okHttpClient = builder.build(); - if(okhttpConfig.getMaxTotal()!=null) { + if (okhttpConfig.getMaxTotal() != null) { okHttpClient.dispatcher().setMaxRequests(okhttpConfig.getMaxTotal()); } - if(okhttpConfig.getMaxPerRoute()!=null) { + if (okhttpConfig.getMaxPerRoute() != null) { okHttpClient.dispatcher().setMaxRequestsPerHost(okhttpConfig.getMaxPerRoute()); } @@ -174,8 +245,9 @@ private OkHttpClient getOkhttpClient(OkhttpConfig okhttpConfig) { } @SneakyThrows - private void configSsl(OkHttpClient.Builder builder, String url, String trustStoreFile, String trustStorePass) { - if(StringUtils.isBlank(trustStoreFile) || StringUtils.isBlank(trustStorePass)) { + private void configSsl(OkHttpClient.Builder builder, String url, String trustStoreFile, + String trustStorePass) { + if (StringUtils.isBlank(trustStoreFile) || StringUtils.isBlank(trustStorePass)) { return; } @@ -185,7 +257,7 @@ private void configSsl(OkHttpClient.Builder builder, String url, String trustSto SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); builder.sslSocketFactory(sslSocketFactory, trustManager) - .hostnameVerifier(new HostNameVerifier(url)); + .hostnameVerifier(new HostNameVerifier(url)); } @Override @@ -203,20 +275,21 @@ public RestResult post(String path, Object object, Map params) { return this.post(path, object, null, params); } - private Request.Builder getRequestBuilder(String path, String id, Headers headers, Map params ) { + private Request.Builder getRequestBuilder(String path, String id, Headers headers, + Map params) { HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder() - .addPathSegments(path); - if(id!=null) { + .addPathSegments(path); + if (id != null) { urlBuilder.addPathSegment(id); } - if(params!=null) { + if (params != null) { params.forEach((name, value) -> { - if(value==null){ + if (value == null) { return; } - if(value instanceof Collection) { + if (value instanceof Collection) { for (Object i : (Collection) value) { urlBuilder.addQueryParameter(name, String.valueOf(i)); } @@ -229,7 +302,7 @@ private Request.Builder getRequestBuilder(String path, String id, Headers header Request.Builder builder = requestBuilder .url(urlBuilder.build()); - if(headers!=null) { + if (headers != null) { builder.headers(headers); } @@ -238,53 +311,16 @@ private Request.Builder getRequestBuilder(String path, String id, Headers header return builder; } - private static RequestBody getRequestBody(Object object, Headers headers) { - String contentType = parseContentType(headers); - String bodyContent; - if("application/json".equals(contentType)) { - if(object == null) { - bodyContent = "{}"; - } else { - bodyContent = JsonUtil.toJson(object); - } - } else { - bodyContent = String.valueOf(object); - } - RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); - - if(headers!=null && "gzip".equals(headers.get("Content-Encoding"))) { - requestBody = gzip(requestBody); - } - return requestBody; - } - - private static RequestBody gzip(final RequestBody body) { - return new RequestBody() { - @Override public MediaType contentType() { - return body.contentType(); - } - - @Override public long contentLength() { - return -1; // We don't know the compressed length in advance! - } - - @Override public void writeTo(BufferedSink sink) throws IOException { - BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); - body.writeTo(gzipSink); - gzipSink.close(); - } - }; - } - @SneakyThrows @Override public RestResult post(String path, Object object, - Headers headers, - Map params) { + Headers headers, + Map params) { Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); requestBuilder.post(getRequestBody(object, headers)); - try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = this.request( + () -> client.newCall(requestBuilder.build()).execute())) { checkStatus(response, 200, 201, 202); return new RestResult(response); } @@ -297,40 +333,31 @@ public RestResult put(String path, String id, Object object) { @Override public RestResult put(String path, String id, Object object, - Headers headers) { + Headers headers) { return this.put(path, id, object, headers, null); } @Override public RestResult put(String path, String id, Object object, - Map params) { + Map params) { return this.put(path, id, object, null, params); } @SneakyThrows @Override public RestResult put(String path, String id, Object object, - Headers headers, - Map params) { + Headers headers, + Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); requestBuilder.put(getRequestBody(object, headers)); - try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = this.request( + () -> client.newCall(requestBuilder.build()).execute())) { checkStatus(response, 200, 202); return new RestResult(response); } } - private static String parseContentType(Headers headers) { - if(headers!=null) { - String contentType = headers.get("Content-Type"); - if(contentType!=null) { - return contentType; - } - } - return "application/json"; - } - @Override public RestResult get(String path) { return this.get(path, null, ImmutableMap.of()); @@ -350,13 +377,13 @@ public RestResult get(String path, String id) { private RestResult get(String path, String id, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); - try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = this.request( + () -> client.newCall(requestBuilder.build()).execute())) { checkStatus(response, 200); return new RestResult(response); } } - @Override public RestResult delete(String path, Map params) { return this.delete(path, null, params); @@ -369,11 +396,12 @@ public RestResult delete(String path, String id) { @SneakyThrows private RestResult delete(String path, String id, - Map params) { + Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); requestBuilder.delete(); - try (Response response = this.request(() -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = this.request( + () -> client.newCall(requestBuilder.build()).execute())) { checkStatus(response, 204, 202); return new RestResult(response); } @@ -392,22 +420,15 @@ protected Response request(Callable method) { @SneakyThrows @Override public void close() { - if(client!=null) { + if (client != null) { client.dispatcher().executorService().shutdown(); client.connectionPool().evictAll(); - if(client.cache()!=null) { + if (client.cache() != null) { client.cache().close(); } } } - private final ThreadLocal authContext = - new InheritableThreadLocal<>(); - - public void setAuthContext(String auth) { - this.authContext.set(auth); - } - public void resetAuthContext() { this.authContext.remove(); } @@ -416,6 +437,10 @@ public String getAuthContext() { return this.authContext.get(); } + public void setAuthContext(String auth) { + this.authContext.set(auth); + } + private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); @@ -425,22 +450,24 @@ private void attachAuthToRequest(Request.Builder builder) { } @SneakyThrows - private X509TrustManager trustManagerForCertificates(String trustStoreFile, String trustStorePass){ + private X509TrustManager trustManagerForCertificates(String trustStoreFile, + String trustStorePass) { char[] password = trustStorePass.toCharArray(); //load keyStore KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); - try(FileInputStream in = new FileInputStream(trustStoreFile)) { + try (FileInputStream in = new FileInputStream(trustStoreFile)) { keyStore.load(in, password); } - TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); + TrustManagerFactory trustManagerFactory = + TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); trustManagerFactory.init(keyStore); TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { throw new IllegalStateException("Unexpected default trust managers:" - + Arrays.toString(trustManagers)); + + Arrays.toString(trustManagers)); } return (X509TrustManager) trustManagers[0]; } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java index 7a0e6969..a4b402c5 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java @@ -17,16 +17,16 @@ package org.apache.hugegraph.rest; +import java.io.IOException; + import okhttp3.Credentials; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; -import java.io.IOException; - public class OkhttpBasicAuthInterceptor implements Interceptor { - private String credentials; + private final String credentials; public OkhttpBasicAuthInterceptor(String user, String password) { this.credentials = Credentials.basic(user, password); @@ -35,9 +35,9 @@ public OkhttpBasicAuthInterceptor(String user, String password) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if(request.header("Authorization")==null) { + if (request.header("Authorization") == null) { Request authenticatedRequest = request.newBuilder() - .header("Authorization", credentials).build(); + .header("Authorization", credentials).build(); return chain.proceed(authenticatedRequest); } return chain.proceed(request); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java index 8a3be283..9b8e35c3 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -17,15 +17,15 @@ package org.apache.hugegraph.rest; +import java.io.IOException; + import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; -import java.io.IOException; - public class OkhttpTokenInterceptor implements Interceptor { - private String token; + private final String token; public OkhttpTokenInterceptor(String token) { this.token = token; @@ -34,9 +34,10 @@ public OkhttpTokenInterceptor(String token) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if(request.header("Authorization")==null) { + if (request.header("Authorization") == null) { Request authenticatedRequest = request.newBuilder() - .header("Authorization", "Bearer "+token).build(); + .header("Authorization", "Bearer " + token) + .build(); return chain.proceed(authenticatedRequest); } return chain.proceed(request); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java index 43be1f92..f0c415df 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java @@ -17,10 +17,10 @@ package org.apache.hugegraph.rest; -import okhttp3.Headers; - import java.util.Map; +import okhttp3.Headers; + public interface RestClient { /** * Post method @@ -28,21 +28,23 @@ public interface RestClient { RestResult post(String path, Object object); RestResult post(String path, Object object, Headers headers); + RestResult post(String path, Object object, Map params); RestResult post(String path, Object object, Headers headers, - Map params); + Map params); /** * Put method */ RestResult put(String path, String id, Object object); + RestResult put(String path, String id, Object object, Headers headers); RestResult put(String path, String id, Object object, Map params); RestResult put(String path, String id, Object object, Headers headers, - Map params); + Map params); /** * Get method diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index 9ddcb011..833093f4 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -17,18 +17,19 @@ package org.apache.hugegraph.rest; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; + import lombok.SneakyThrows; import okhttp3.Headers; import okhttp3.Response; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - public class RestResult { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -41,16 +42,20 @@ public RestResult(Response response) { this(response.code(), getResponseContent(response), response.headers()); } + public RestResult(int status, String content, + Headers headers) { + this.status = status; + this.headers = headers; + this.content = content; + } + @SneakyThrows private static String getResponseContent(Response response) { return response.body().string(); } - public RestResult(int status, String content, - Headers headers) { - this.status = status; - this.headers = headers; - this.content = content; + public static void registerModule(Module module) { + MAPPER.registerModule(module); } public int status() { @@ -84,8 +89,8 @@ public List readList(String key, Class clazz) { "Can't find value of the key: %s in json.", key); } JavaType type = MAPPER.getTypeFactory() - .constructParametrizedType(ArrayList.class, - List.class, clazz); + .constructParametrizedType(ArrayList.class, + List.class, clazz); return MAPPER.convertValue(element, type); } catch (IOException e) { throw new SerializeException( @@ -96,8 +101,8 @@ public List readList(String key, Class clazz) { @SuppressWarnings("deprecation") public List readList(Class clazz) { JavaType type = MAPPER.getTypeFactory() - .constructParametrizedType(ArrayList.class, - List.class, clazz); + .constructParametrizedType(ArrayList.class, + List.class, clazz); try { return MAPPER.readValue(this.content, type); } catch (IOException e) { @@ -109,10 +114,6 @@ public List readList(Class clazz) { @Override public String toString() { return String.format("{status=%s, headers=%s, content=%s}", - this.status, this.headers, this.content); - } - - public static void registerModule(Module module) { - MAPPER.registerModule(module); + this.status, this.headers, this.content); } } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java index 4cee058e..2bf85f8f 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java @@ -17,21 +17,47 @@ package org.apache.hugegraph.unit.rest; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import lombok.SneakyThrows; -import okhttp3.Headers; -import okhttp3.Response; +import java.util.Map; + import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.rest.SerializeException; import org.apache.hugegraph.testutil.Assert; import org.junit.Test; import org.mockito.Mockito; -import java.util.Map; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; + +import lombok.SneakyThrows; +import okhttp3.Headers; +import okhttp3.Response; public class RestResultTest { + private static RestResult newRestResult(int status) { + return newRestResult(status, "", new Headers.Builder().build()); + } + + private static RestResult newRestResult(int status, String content) { + return newRestResult(status, content, new Headers.Builder().build()); + } + + private static RestResult newRestResult(int status, + Headers h) { + return newRestResult(status, "", h); + } + + @SneakyThrows + private static RestResult newRestResult(int status, String content, + Headers h) { + Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(response.code()).thenReturn(status); + Mockito.when(response.headers()).thenReturn(h); + Mockito.when(response.body().string()) + .thenReturn(content); + return new RestResult(response); + } + @Test public void testStatus() { RestResult result = newRestResult(200); @@ -114,28 +140,4 @@ public void testContentListWithException() { result3.readList(String.class); }); } - - private static RestResult newRestResult(int status) { - return newRestResult(status, "", new Headers.Builder().build()); - } - - private static RestResult newRestResult(int status, String content) { - return newRestResult(status, content, new Headers.Builder().build()); - } - - private static RestResult newRestResult(int status, - Headers h) { - return newRestResult(status, "", h); - } - - @SneakyThrows - private static RestResult newRestResult(int status, String content, - Headers h) { - Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); - Mockito.when(response.code()).thenReturn(status); - Mockito.when(response.headers()).thenReturn(h); - Mockito.when(response.body().string()) - .thenReturn(content); - return new RestResult(response); - } } From 79457183e3b8df5bee1edfbc7c2e7e459c8517f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 19 Oct 2023 20:50:13 +0800 Subject: [PATCH 10/28] refact: replace params okhttp3.Headers to internal RestHeaders --- .../hugegraph/rest/AbstractRestClient.java | 17 ++-- .../org/apache/hugegraph/rest/RestClient.java | 10 +-- .../apache/hugegraph/rest/RestHeaders.java | 47 +++++++++++ .../hugegraph/unit/rest/RestClientTest.java | 78 ++++++++++--------- 4 files changed, 99 insertions(+), 53 deletions(-) create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 4b95ab81..25695edd 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -43,7 +43,6 @@ import lombok.SneakyThrows; import okhttp3.ConnectionPool; -import okhttp3.Headers; import okhttp3.HttpUrl; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -151,7 +150,7 @@ public AbstractRestClient(String url, OkhttpConfig okhttpConfig) { this.client = getOkhttpClient(okhttpConfig); } - private static RequestBody getRequestBody(Object object, Headers headers) { + private static RequestBody getRequestBody(Object object, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; if ("application/json".equals(contentType)) { @@ -192,7 +191,7 @@ public void writeTo(BufferedSink sink) throws IOException { }; } - private static String parseContentType(Headers headers) { + private static String parseContentType(RestHeaders headers) { if (headers != null) { String contentType = headers.get("Content-Type"); if (contentType != null) { @@ -266,7 +265,7 @@ public RestResult post(String path, Object object) { } @Override - public RestResult post(String path, Object object, Headers headers) { + public RestResult post(String path, Object object, RestHeaders headers) { return this.post(path, object, headers, null); } @@ -275,7 +274,7 @@ public RestResult post(String path, Object object, Map params) { return this.post(path, object, null, params); } - private Request.Builder getRequestBuilder(String path, String id, Headers headers, + private Request.Builder getRequestBuilder(String path, String id, RestHeaders headers, Map params) { HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder() .addPathSegments(path); @@ -303,7 +302,7 @@ private Request.Builder getRequestBuilder(String path, String id, Headers header .url(urlBuilder.build()); if (headers != null) { - builder.headers(headers); + builder.headers(headers.toOkhttpHeader()); } this.attachAuthToRequest(builder); @@ -314,7 +313,7 @@ private Request.Builder getRequestBuilder(String path, String id, Headers header @SneakyThrows @Override public RestResult post(String path, Object object, - Headers headers, + RestHeaders headers, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); requestBuilder.post(getRequestBody(object, headers)); @@ -333,7 +332,7 @@ public RestResult put(String path, String id, Object object) { @Override public RestResult put(String path, String id, Object object, - Headers headers) { + RestHeaders headers) { return this.put(path, id, object, headers, null); } @@ -346,7 +345,7 @@ public RestResult put(String path, String id, Object object, @SneakyThrows @Override public RestResult put(String path, String id, Object object, - Headers headers, + RestHeaders headers, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); requestBuilder.put(getRequestBody(object, headers)); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java index f0c415df..26e2ec51 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java @@ -19,19 +19,17 @@ import java.util.Map; -import okhttp3.Headers; - public interface RestClient { /** * Post method */ RestResult post(String path, Object object); - RestResult post(String path, Object object, Headers headers); + RestResult post(String path, Object object, RestHeaders headers); RestResult post(String path, Object object, Map params); - RestResult post(String path, Object object, Headers headers, + RestResult post(String path, Object object, RestHeaders headers, Map params); /** @@ -39,11 +37,11 @@ RestResult post(String path, Object object, Headers headers, */ RestResult put(String path, String id, Object object); - RestResult put(String path, String id, Object object, Headers headers); + RestResult put(String path, String id, Object object, RestHeaders headers); RestResult put(String path, String id, Object object, Map params); - RestResult put(String path, String id, Object object, Headers headers, + RestResult put(String path, String id, Object object, RestHeaders headers, Map params); /** diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java new file mode 100644 index 00000000..42990676 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -0,0 +1,47 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +import java.util.Date; + +public class RestHeaders { + private final okhttp3.Headers.Builder headersBuilder = new okhttp3.Headers.Builder(); + + public String get(String key) { + return headersBuilder.get(key); + } + + public Date getDate(String key) { + return headersBuilder.build().getDate(key); + } + + public RestHeaders add(String key, String value) { + headersBuilder.add(key, value); + return this; + } + + public RestHeaders add(String key, Date value) { + headersBuilder.add(key, value); + return this; + } + + public okhttp3.Headers toOkhttpHeader() { + return headersBuilder.build(); + } + +} diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 818f39db..d9905e99 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -22,36 +22,35 @@ import java.util.Map; import java.util.UUID; import java.util.concurrent.Callable; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiFunction; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.SSLSessionContext; - -import com.google.common.net.HttpHeaders; -import lombok.SneakyThrows; -import okhttp3.*; +import org.apache.hugegraph.rest.AbstractRestClient; +import org.apache.hugegraph.rest.ClientException; +import org.apache.hugegraph.rest.RestClient; +import org.apache.hugegraph.rest.RestHeaders; +import org.apache.hugegraph.rest.RestResult; +import org.apache.hugegraph.testutil.Assert; +import org.apache.hugegraph.testutil.Whitebox; import org.apache.hugegraph.unit.BaseUnitTest; import org.junit.BeforeClass; import org.junit.Test; -import org.mockito.Mock; import org.mockito.MockedStatic; import org.mockito.Mockito; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.net.HttpHeaders; - -import org.apache.hugegraph.rest.AbstractRestClient; -import org.apache.hugegraph.rest.ClientException; -import org.apache.hugegraph.rest.RestClient; -import org.apache.hugegraph.rest.RestResult; -import org.apache.hugegraph.testutil.Assert; -import org.apache.hugegraph.testutil.Whitebox; +import lombok.SneakyThrows; +import okhttp3.Headers; +import okhttp3.HttpUrl; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; public class RestClientTest { @@ -77,14 +76,14 @@ public static void setUp() { private static class RestClientImpl extends AbstractRestClient { private final int status; - private final Headers headers; + private final RestHeaders headers; private final String content; public RestClientImpl(String url, int timeout, int idleTime, int maxTotal, int maxPerRoute, int status) { super(url, timeout, idleTime, maxTotal, maxPerRoute); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -92,7 +91,7 @@ public RestClientImpl(String url, int timeout, int maxTotal, int maxPerRoute, int status) { super(url, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -100,7 +99,7 @@ public RestClientImpl(String url, String user, String password, int timeout, int status) { super(url, user, password, timeout); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -109,7 +108,7 @@ public RestClientImpl(String url, String user, String password, int status) { super(url, user, password, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -120,7 +119,7 @@ public RestClientImpl(String url, String user, String password, super(url, user, password, timeout, maxTotal, maxPerRoute, trustStoreFile, trustStorePassword); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -128,7 +127,7 @@ public RestClientImpl(String url, String token, int timeout, int status) { super(url, token, timeout); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -136,7 +135,7 @@ public RestClientImpl(String url, String token, int timeout, int maxTotal, int maxPerRoute, int status) { super(url, token, timeout, maxTotal, maxPerRoute); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -147,7 +146,7 @@ public RestClientImpl(String url, String token, int timeout, super(url, token, timeout, maxTotal, maxPerRoute, trustStoreFile, trustStorePassword); this.status = status; - this.headers = new Headers.Builder().build(); + this.headers = new RestHeaders(); this.content = ""; } @@ -160,7 +159,7 @@ public RestClientImpl(String url, int timeout, int status, String content) { super(url, timeout); this.status = status; - this.headers = headers; + this.headers = new RestHeaders(); this.content = content; } @@ -169,7 +168,7 @@ public RestClientImpl(String url, int timeout, int status, protected Response request(Callable method) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(this.status); - Mockito.when(response.headers()).thenReturn(this.headers); + Mockito.when(response.headers()).thenReturn(this.headers.toOkhttpHeader()); Mockito.when(response.body().string()) .thenReturn(this.content); return response; @@ -371,7 +370,8 @@ public void testPostWithException() { @Test public void testPostWithParams() { RestClient client = new RestClientImpl("/test", 1000, 200); - Headers headers = new Headers.Builder().build(); + RestHeaders headers = new RestHeaders(); + Map params = ImmutableMap.of("param1", "value1"); RestResult restResult = client.post("path", "body", headers, params); @@ -388,11 +388,13 @@ public void testPut() { @Test public void testPutWithHeaders() { RestClient client = new RestClientImpl("/test", 1000, 200); - Headers.Builder headersBuilder = new Headers.Builder(); - headersBuilder.add("key1", "value1-1"); - headersBuilder.add("key1", "value1-2"); - headersBuilder.add("Content-Encoding", "gzip"); - RestResult restResult = client.put("path", "id1", "body", headersBuilder.build()); + RestHeaders headers = + new RestHeaders().add("key1", "value1-1").add("key2", + "value1-2").add("Content-Encoding", "gzip"); + //headersBuilder.add("key1", "value1-1"); + //headersBuilder.add("key1", "value1-2"); + //headersBuilder.add("Content-Encoding", "gzip"); + RestResult restResult = client.put("path", "id1", "body",headers); Assert.assertEquals(200, restResult.status()); } @@ -556,7 +558,7 @@ public void testRequest() { result = client.delete("test", "id"); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token2"); + "token2"); client.resetAuthContext(); // Test get @@ -571,7 +573,7 @@ public void testRequest() { result = client.get("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token4"); + "token4"); client.resetAuthContext(); client.setAuthContext("token5"); @@ -591,7 +593,7 @@ public void testRequest() { client.resetAuthContext(); client.setAuthContext("token7"); - result = client.post("test", null, new Headers.Builder().build()); + result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token7"); @@ -605,7 +607,7 @@ public void testRequest() { client.resetAuthContext(); client.setAuthContext("token9"); - result = client.post("test", null, new Headers.Builder().build(), + result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, @@ -621,7 +623,7 @@ public void testRequest() { client.resetAuthContext(); client.setAuthContext("token11"); - result = client.post("test", null, new Headers.Builder().build()); + result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token11"); @@ -635,7 +637,7 @@ public void testRequest() { client.resetAuthContext(); client.setAuthContext("token13"); - result = client.post("test", null, new Headers.Builder().build(), + result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, From 1ea7905c674fcc3d86975c7407639ef37b371fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 19 Oct 2023 21:33:45 +0800 Subject: [PATCH 11/28] fix: licence dependency --- .../scripts/dependency/known-dependencies.txt | 29 +++++++------------ 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/hugegraph-dist/scripts/dependency/known-dependencies.txt b/hugegraph-dist/scripts/dependency/known-dependencies.txt index c6de269c..53b4567d 100644 --- a/hugegraph-dist/scripts/dependency/known-dependencies.txt +++ b/hugegraph-dist/scripts/dependency/known-dependencies.txt @@ -1,6 +1,6 @@ animal-sniffer-annotations-1.18.jar annotations-4.1.1.4.jar -aopalliance-repackaged-3.0.1.jar +annotations-13.0.jar bolt-1.6.2.jar checker-qual-3.5.0.jar commons-beanutils-1.9.4.jar @@ -27,11 +27,6 @@ gson-2.8.6.jar guava-30.0-jre.jar hamcrest-core-1.3.jar hessian-3.3.7.jar -hk2-api-3.0.1.jar -hk2-locator-3.0.1.jar -hk2-utils-3.0.1.jar -httpclient-4.5.13.jar -httpcore-4.4.13.jar j2objc-annotations-1.3.jar jackson-annotations-2.14.0-rc1.jar jackson-core-2.14.0-rc1.jar @@ -42,22 +37,10 @@ jackson-jaxrs-json-provider-2.14.0-rc1.jar jackson-module-jaxb-annotations-2.14.0-rc1.jar jakarta.activation-2.0.1.jar jakarta.activation-api-1.2.2.jar -jakarta.annotation-api-2.0.0.jar -jakarta.inject-api-2.0.0.jar -jakarta.ws.rs-api-3.0.0.jar -jakarta.xml.bind-api-4.0.0-RC2.jar javassist-3.28.0-GA.jar -javax.activation-api-1.2.0.jar javax.json-1.0.jar -jaxb-api-2.3.1.jar jaxb-core-3.0.2.jar jaxb-impl-3.0.2.jar -jersey-apache-connector-3.0.3.jar -jersey-client-3.0.3.jar -jersey-common-3.0.3.jar -jersey-entity-filtering-3.0.3.jar -jersey-hk2-3.0.3.jar -jersey-media-json-jackson-3.0.3.jar joda-time-2.10.8.jar jsr305-3.0.1.jar junit-4.13.1.jar @@ -71,7 +54,6 @@ opentracing-api-0.22.0.jar opentracing-mock-0.22.0.jar opentracing-noop-0.22.0.jar opentracing-util-0.22.0.jar -osgi-resource-locator-1.0.3.jar perfmark-api-0.19.0.jar proto-google-common-protos-1.17.0.jar protobuf-java-3.11.0.jar @@ -84,3 +66,12 @@ swagger-core-1.5.18.jar swagger-models-1.5.18.jar tracer-core-3.0.8.jar validation-api-1.1.0.Final.jar +kotlin-stdlib-1.6.20.jar +kotlin-stdlib-common-1.5.31.jar +kotlin-stdlib-jdk7-1.6.10.jar +kotlin-stdlib-jdk8-1.6.10.jar +logging-interceptor-4.10.0.jar +lombok-1.18.8.jar +okhttp-4.10.0.jar +okio-jvm-3.0.0.jar + From cf260c941759d8e421e00cf5cdf0042ff12a2d5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 19 Oct 2023 22:32:13 +0800 Subject: [PATCH 12/28] fix: test error --- .../hugegraph/unit/rest/RestClientTest.java | 318 +++++++++--------- 1 file changed, 158 insertions(+), 160 deletions(-) diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index d9905e99..09d60bc5 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -54,11 +54,13 @@ public class RestClientTest { - private static final Request.Builder requestBuilder = Mockito.mock(Request.Builder.class, Mockito.RETURNS_DEEP_STUBS); + private static final Request.Builder requestBuilder = + Mockito.mock(Request.Builder.class, Mockito.RETURNS_DEEP_STUBS); @BeforeClass public static void setUp() { - HttpUrl.Builder httpUrlBuilder = Mockito.mock(HttpUrl.Builder.class, Mockito.RETURNS_DEEP_STUBS); + HttpUrl.Builder httpUrlBuilder = + Mockito.mock(HttpUrl.Builder.class, Mockito.RETURNS_DEEP_STUBS); HttpUrl httpUrl = Mockito.mock(HttpUrl.class); MockedStatic httpUrlMockedStatic = Mockito.mockStatic(HttpUrl.class); @@ -67,127 +69,11 @@ public static void setUp() { Mockito.when(httpUrlBuilder.addPathSegments("test")).thenReturn(httpUrlBuilder); Mockito.when(httpUrlBuilder.addPathSegments("test") - .addPathSegment("id")) - .thenReturn(httpUrlBuilder); - Mockito.when(requestBuilder.url(httpUrlBuilder.addPathSegments("test").addPathSegment("id").build())) - .thenReturn(requestBuilder); - } - - private static class RestClientImpl extends AbstractRestClient { - - private final int status; - private final RestHeaders headers; - private final String content; - - public RestClientImpl(String url, int timeout, int idleTime, - int maxTotal, int maxPerRoute, int status) { - super(url, timeout, idleTime, maxTotal, maxPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, int timeout, - int maxTotal, int maxPerRoute, int status) { - super(url, timeout, maxTotal, maxPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String user, String password, - int timeout, int status) { - super(url, user, password, timeout); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, - int status) { - super(url, user, password, timeout, maxTotal, maxPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, - String trustStoreFile, String trustStorePassword, - int status) { - super(url, user, password, timeout, maxTotal, maxPerRoute, - trustStoreFile, trustStorePassword); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, - int timeout, int status) { - super(url, token, timeout); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, int timeout, - int maxTotal, int maxPerRoute, int status) { - super(url, token, timeout, maxTotal, maxPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, int timeout, - int maxTotal, int maxPerRoute, - String trustStoreFile, - String trustStorePassword, int status) { - super(url, token, timeout, maxTotal, maxPerRoute, - trustStoreFile, trustStorePassword); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, int timeout, int status) { - this(url, timeout, status, new Headers.Builder().build(), ""); - } - - public RestClientImpl(String url, int timeout, int status, - Headers headers, - String content) { - super(url, timeout); - this.status = status; - this.headers = new RestHeaders(); - this.content = content; - } - - @SneakyThrows - @Override - protected Response request(Callable method) { - Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); - Mockito.when(response.code()).thenReturn(this.status); - Mockito.when(response.headers()).thenReturn(this.headers.toOkhttpHeader()); - Mockito.when(response.body().string()) - .thenReturn(this.content); - return response; - } - - @Override - protected void checkStatus(Response response, - int ... statuses) { - boolean match = false; - for (int status : statuses) { - if (status == response.code()) { - match = true; - break; - } - } - if (!match) { - throw new ClientException("Invalid response '%s'", response); - } - } + .addPathSegment("id")) + .thenReturn(httpUrlBuilder); + Mockito.when(requestBuilder.url( + httpUrlBuilder.addPathSegments("test").addPathSegment("id").build())) + .thenReturn(requestBuilder); } @Test @@ -253,7 +139,6 @@ public void testPostWithMaxTotalAndPerRoute() { // Mockito.verify(pool, Mockito.atLeastOnce()) // .closeIdleConnections(newIdleTime, TimeUnit.MILLISECONDS); // } - @Test public void testPostWithUserAndPassword() { RestClient client = new RestClientImpl("/test", "user", "", 1000, 200); @@ -343,17 +228,16 @@ public void testHostNameVerifier() { @Test public void testPostWithHeaderAndContent() { - Headers.Builder headersBuilder = new Headers.Builder(); - headersBuilder.add("key1", "value1-1"); - headersBuilder.add("key1", "value1-2"); - headersBuilder.add("Content-Encoding", "gzip"); - Headers headers = headersBuilder.build(); + RestHeaders headers = new RestHeaders() + .add("key1", "value1-1") + .add("key1", "value1-2") + .add("Content-Encoding", "gzip"); String content = "{\"names\": [\"marko\", \"josh\", \"lop\"]}"; RestClient client = new RestClientImpl("/test", 1000, 200, headers, content); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); - Assert.assertEquals(headers, restResult.headers()); + Assert.assertEquals(headers.toOkhttpHeader(), restResult.headers()); Assert.assertEquals(content, restResult.content()); Assert.assertEquals(ImmutableList.of("marko", "josh", "lop"), restResult.readList("names", String.class)); @@ -390,11 +274,9 @@ public void testPutWithHeaders() { RestClient client = new RestClientImpl("/test", 1000, 200); RestHeaders headers = new RestHeaders().add("key1", "value1-1").add("key2", - "value1-2").add("Content-Encoding", "gzip"); - //headersBuilder.add("key1", "value1-1"); - //headersBuilder.add("key1", "value1-2"); - //headersBuilder.add("Content-Encoding", "gzip"); - RestResult restResult = client.put("path", "id1", "body",headers); + "value1-2") + .add("Content-Encoding", "gzip"); + RestResult restResult = client.put("path", "id1", "body", headers); Assert.assertEquals(200, restResult.status()); } @@ -494,7 +376,6 @@ public void testDeleteWithException() { // Assert.assertNotNull(cleanExecutor); // Assert.assertTrue(cleanExecutor.isShutdown()); // } - @Test public void testAuthContext() { RestClientImpl client = new RestClientImpl("/test", 1000, 10, 5, 200); @@ -508,19 +389,6 @@ public void testAuthContext() { Assert.assertNull(client.getAuthContext()); } - private static class MockRestClientImpl extends AbstractRestClient { - - public MockRestClientImpl(String url, int timeout) { - super(url, timeout); - } - - @Override - protected void checkStatus(Response response, - int... statuses) { - // pass - } - } - @SneakyThrows @Test public void testRequest() { @@ -550,7 +418,7 @@ public void testRequest() { result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader("Authorization", - "token1"); + "token1"); client.resetAuthContext(); @@ -566,7 +434,7 @@ public void testRequest() { result = client.get("test"); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token3"); + "token3"); client.resetAuthContext(); client.setAuthContext("token4"); @@ -580,7 +448,7 @@ public void testRequest() { result = client.get("test", "id"); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token5"); + "token5"); client.resetAuthContext(); // Test put @@ -589,21 +457,21 @@ public void testRequest() { result = client.post("test", null); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token6"); + "token6"); client.resetAuthContext(); client.setAuthContext("token7"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token7"); + "token7"); client.resetAuthContext(); client.setAuthContext("token8"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token8"); + "token8"); client.resetAuthContext(); client.setAuthContext("token9"); @@ -611,7 +479,7 @@ public void testRequest() { ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token9"); + "token9"); client.resetAuthContext(); // Test post @@ -619,21 +487,21 @@ public void testRequest() { result = client.post("test", null); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token10"); + "token10"); client.resetAuthContext(); client.setAuthContext("token11"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token11"); + "token11"); client.resetAuthContext(); client.setAuthContext("token12"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token12"); + "token12"); client.resetAuthContext(); client.setAuthContext("token13"); @@ -641,7 +509,137 @@ public void testRequest() { ImmutableMap.of()); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token13"); + "token13"); client.resetAuthContext(); } + + private static class RestClientImpl extends AbstractRestClient { + + private final int status; + private final RestHeaders headers; + private final String content; + + public RestClientImpl(String url, int timeout, int idleTime, + int maxTotal, int maxPerRoute, int status) { + super(url, timeout, idleTime, maxTotal, maxPerRoute); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, int timeout, + int maxTotal, int maxPerRoute, int status) { + super(url, timeout, maxTotal, maxPerRoute); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String user, String password, + int timeout, int status) { + super(url, user, password, timeout); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String user, String password, + int timeout, int maxTotal, int maxPerRoute, + int status) { + super(url, user, password, timeout, maxTotal, maxPerRoute); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String user, String password, + int timeout, int maxTotal, int maxPerRoute, + String trustStoreFile, String trustStorePassword, + int status) { + super(url, user, password, timeout, maxTotal, maxPerRoute, + trustStoreFile, trustStorePassword); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String token, + int timeout, int status) { + super(url, token, timeout); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String token, int timeout, + int maxTotal, int maxPerRoute, int status) { + super(url, token, timeout, maxTotal, maxPerRoute); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, String token, int timeout, + int maxTotal, int maxPerRoute, + String trustStoreFile, + String trustStorePassword, int status) { + super(url, token, timeout, maxTotal, maxPerRoute, + trustStoreFile, trustStorePassword); + this.status = status; + this.headers = new RestHeaders(); + this.content = ""; + } + + public RestClientImpl(String url, int timeout, int status) { + this(url, timeout, status, new RestHeaders(), ""); + } + + public RestClientImpl(String url, int timeout, int status, + RestHeaders headers, + String content) { + super(url, timeout); + this.status = status; + this.headers = headers; + this.content = content; + } + + @SneakyThrows + @Override + protected Response request(Callable method) { + Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); + Mockito.when(response.code()).thenReturn(this.status); + Mockito.when(response.headers()).thenReturn(this.headers.toOkhttpHeader()); + Mockito.when(response.body().string()) + .thenReturn(this.content); + return response; + } + + @Override + protected void checkStatus(Response response, + int... statuses) { + boolean match = false; + for (int status : statuses) { + if (status == response.code()) { + match = true; + break; + } + } + if (!match) { + throw new ClientException("Invalid response '%s'", response); + } + } + } + + private static class MockRestClientImpl extends AbstractRestClient { + + public MockRestClientImpl(String url, int timeout) { + super(url, timeout); + } + + @Override + protected void checkStatus(Response response, + int... statuses) { + // pass + } + } } From f7f45f424737732984b911290575efc5911c86b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Fri, 27 Oct 2023 23:24:38 +0800 Subject: [PATCH 13/28] fix: code format issue --- hugegraph-common/pom.xml | 18 +--- .../hugegraph/rest/AbstractRestClient.java | 83 +++++++++-------- .../{OkhttpConfig.java => OkHttpConfig.java} | 3 +- .../rest/OkhttpTokenInterceptor.java | 2 +- .../org/apache/hugegraph/rest/RestClient.java | 3 +- .../apache/hugegraph/rest/RestHeaders.java | 40 +++++++-- .../org/apache/hugegraph/rest/RestResult.java | 10 +-- .../hugegraph/unit/rest/RestClientTest.java | 89 ++----------------- .../hugegraph/unit/rest/RestResultTest.java | 9 +- 9 files changed, 98 insertions(+), 159 deletions(-) rename hugegraph-common/src/main/java/org/apache/hugegraph/rest/{OkhttpConfig.java => OkHttpConfig.java} (97%) diff --git a/hugegraph-common/pom.xml b/hugegraph-common/pom.xml index 20d0b3cc..2010869b 100644 --- a/hugegraph-common/pom.xml +++ b/hugegraph-common/pom.xml @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. --> - 4.0.0 @@ -32,7 +32,8 @@ hugegraph-common is a common module for HugeGraph and its peripheral components. hugegraph-common encapsulates locks, configurations, events, iterators, rest and some - numeric or collection util classes to simplify the development of HugeGraph and its components. + numeric or collection util classes to simplify the development of HugeGraph and its + components. @@ -198,17 +199,6 @@ ${jackson.version} - - - - - - - - - - - com.sun.xml.bind jaxb-impl diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 25695edd..2815a6fd 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -55,21 +55,20 @@ public abstract class AbstractRestClient implements RestClient { - private final ThreadLocal authContext = - new InheritableThreadLocal<>(); + private final ThreadLocal authContext = new InheritableThreadLocal<>(); private final OkHttpClient client; private final String baseUrl; private final Request.Builder requestBuilder = new Request.Builder(); public AbstractRestClient(String url, int timeout) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .timeout(timeout) .build()); } public AbstractRestClient(String url, String user, String password, Integer timeout) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .user(user).password(password) .timeout(timeout) .build()); @@ -82,7 +81,7 @@ public AbstractRestClient(String url, int timeout, public AbstractRestClient(String url, int timeout, int idleTime, int maxTotal, int maxPerRoute) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .idleTime(idleTime) .timeout(timeout) .maxTotal(maxTotal) @@ -92,7 +91,7 @@ public AbstractRestClient(String url, int timeout, int idleTime, public AbstractRestClient(String url, String user, String password, int timeout, int maxTotal, int maxPerRoute) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .user(user).password(password) .timeout(timeout) .maxTotal(maxTotal) @@ -104,7 +103,7 @@ public AbstractRestClient(String url, String user, String password, int timeout, int maxTotal, int maxPerRoute, String trustStoreFile, String trustStorePassword) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .user(user).password(password) .timeout(timeout) .maxTotal(maxTotal) @@ -115,7 +114,7 @@ public AbstractRestClient(String url, String user, String password, } public AbstractRestClient(String url, String token, Integer timeout) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .token(token) .timeout(timeout) .build()); @@ -123,7 +122,7 @@ public AbstractRestClient(String url, String token, Integer timeout) { public AbstractRestClient(String url, String token, Integer timeout, Integer maxTotal, Integer maxPerRoute) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .token(token) .timeout(timeout) .maxTotal(maxTotal) @@ -135,7 +134,7 @@ public AbstractRestClient(String url, String token, Integer timeout, Integer maxTotal, Integer maxPerRoute, String trustStoreFile, String trustStorePassword) { - this(url, OkhttpConfig.builder() + this(url, OkHttpConfig.builder() .token(token) .timeout(timeout) .maxTotal(maxTotal) @@ -145,22 +144,22 @@ public AbstractRestClient(String url, String token, Integer timeout, .build()); } - public AbstractRestClient(String url, OkhttpConfig okhttpConfig) { + public AbstractRestClient(String url, OkHttpConfig okhttpConfig) { this.baseUrl = url; - this.client = getOkhttpClient(okhttpConfig); + this.client = buildOkHttpClient(okhttpConfig); } - private static RequestBody getRequestBody(Object object, RestHeaders headers) { + private static RequestBody buildRequestBody(Object body, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; if ("application/json".equals(contentType)) { - if (object == null) { + if (body == null) { bodyContent = "{}"; } else { - bodyContent = JsonUtil.toJson(object); + bodyContent = JsonUtil.toJson(body); } } else { - bodyContent = String.valueOf(object); + bodyContent = String.valueOf(body); } RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); @@ -201,43 +200,42 @@ private static String parseContentType(RestHeaders headers) { return "application/json"; } - private OkHttpClient getOkhttpClient(OkhttpConfig okhttpConfig) { + private OkHttpClient buildOkHttpClient(OkHttpConfig okHttpConfig) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - if (okhttpConfig.getTimeout() != null) { - builder.connectTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS) - .readTimeout(okhttpConfig.getTimeout(), TimeUnit.MILLISECONDS); + if (okHttpConfig.getTimeout() != null) { + builder.connectTimeout(okHttpConfig.getTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(okHttpConfig.getTimeout(), TimeUnit.MILLISECONDS); } - if (okhttpConfig.getIdleTime() != null) { + if (okHttpConfig.getIdleTime() != null) { ConnectionPool connectionPool = - new ConnectionPool(5, okhttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); + new ConnectionPool(5, okHttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); builder.connectionPool(connectionPool); } - // auth header interceptor - if (StringUtils.isNotBlank(okhttpConfig.getUser()) && - StringUtils.isNotBlank(okhttpConfig.getPassword())) { - builder.addInterceptor(new OkhttpBasicAuthInterceptor(okhttpConfig.getUser(), - okhttpConfig.getPassword())); + if (StringUtils.isNotBlank(okHttpConfig.getUser()) && + StringUtils.isNotBlank(okHttpConfig.getPassword())) { + builder.addInterceptor(new OkhttpBasicAuthInterceptor(okHttpConfig.getUser(), + okHttpConfig.getPassword())); } - if (StringUtils.isNotBlank(okhttpConfig.getToken())) { - builder.addInterceptor(new OkhttpTokenInterceptor(okhttpConfig.getToken())); + if (StringUtils.isNotBlank(okHttpConfig.getToken())) { + builder.addInterceptor(new OkhttpTokenInterceptor(okHttpConfig.getToken())); } // ssl - configSsl(builder, baseUrl, okhttpConfig.getTrustStoreFile(), - okhttpConfig.getTrustStorePassword()); + configSsl(builder, this.baseUrl, okHttpConfig.getTrustStoreFile(), + okHttpConfig.getTrustStorePassword()); OkHttpClient okHttpClient = builder.build(); - if (okhttpConfig.getMaxTotal() != null) { - okHttpClient.dispatcher().setMaxRequests(okhttpConfig.getMaxTotal()); + if (okHttpConfig.getMaxTotal() != null) { + okHttpClient.dispatcher().setMaxRequests(okHttpConfig.getMaxTotal()); } - if (okhttpConfig.getMaxPerRoute() != null) { - okHttpClient.dispatcher().setMaxRequestsPerHost(okhttpConfig.getMaxPerRoute()); + if (okHttpConfig.getMaxPerRoute() != null) { + okHttpClient.dispatcher().setMaxRequestsPerHost(okHttpConfig.getMaxPerRoute()); } return okHttpClient; @@ -276,7 +274,7 @@ public RestResult post(String path, Object object, Map params) { private Request.Builder getRequestBuilder(String path, String id, RestHeaders headers, Map params) { - HttpUrl.Builder urlBuilder = HttpUrl.parse(baseUrl).newBuilder() + HttpUrl.Builder urlBuilder = HttpUrl.parse(this.baseUrl).newBuilder() .addPathSegments(path); if (id != null) { urlBuilder.addPathSegment(id); @@ -298,8 +296,7 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he }); } - Request.Builder builder = requestBuilder - .url(urlBuilder.build()); + Request.Builder builder = requestBuilder.url(urlBuilder.build()); if (headers != null) { builder.headers(headers.toOkhttpHeader()); @@ -312,11 +309,10 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he @SneakyThrows @Override - public RestResult post(String path, Object object, - RestHeaders headers, + public RestResult post(String path, Object object, RestHeaders headers, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); - requestBuilder.post(getRequestBody(object, headers)); + requestBuilder.post(buildRequestBody(object, headers)); try (Response response = this.request( () -> client.newCall(requestBuilder.build()).execute())) { @@ -348,7 +344,7 @@ public RestResult put(String path, String id, Object object, RestHeaders headers, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); - requestBuilder.put(getRequestBody(object, headers)); + requestBuilder.put(buildRequestBody(object, headers)); try (Response response = this.request( () -> client.newCall(requestBuilder.build()).execute())) { @@ -453,7 +449,7 @@ private X509TrustManager trustManagerForCertificates(String trustStoreFile, String trustStorePass) { char[] password = trustStorePass.toCharArray(); - //load keyStore + // load keyStore KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); try (FileInputStream in = new FileInputStream(trustStoreFile)) { keyStore.load(in, password); @@ -472,6 +468,7 @@ private X509TrustManager trustManagerForCertificates(String trustStoreFile, } public static class HostNameVerifier implements HostnameVerifier { + private final String url; public HostNameVerifier(String url) { diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java similarity index 97% rename from hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java rename to hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java index 5d5c62da..1e4091a3 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpConfig.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java @@ -24,7 +24,8 @@ @Builder @Getter @Setter -public class OkhttpConfig { +public class OkHttpConfig { + private String user; private String password; private String token; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java index 9b8e35c3..258bedec 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -36,7 +36,7 @@ public Response intercept(Chain chain) throws IOException { Request request = chain.request(); if (request.header("Authorization") == null) { Request authenticatedRequest = request.newBuilder() - .header("Authorization", "Bearer " + token) + .header("Authorization", "Bearer " + this.token) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java index 26e2ec51..d5b58d9f 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClient.java @@ -29,8 +29,7 @@ public interface RestClient { RestResult post(String path, Object object, Map params); - RestResult post(String path, Object object, RestHeaders headers, - Map params); + RestResult post(String path, Object object, RestHeaders headers, Map params); /** * Put method diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index 42990676..243e5d55 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -18,30 +18,60 @@ package org.apache.hugegraph.rest; import java.util.Date; +import java.util.Iterator; + +import kotlin.Pair; +import okhttp3.Headers; public class RestHeaders { + private final okhttp3.Headers.Builder headersBuilder = new okhttp3.Headers.Builder(); public String get(String key) { - return headersBuilder.get(key); + return this.headersBuilder.get(key); } public Date getDate(String key) { - return headersBuilder.build().getDate(key); + return this.headersBuilder.build().getDate(key); } public RestHeaders add(String key, String value) { - headersBuilder.add(key, value); + this.headersBuilder.add(key, value); return this; } public RestHeaders add(String key, Date value) { - headersBuilder.add(key, value); + this.headersBuilder.add(key, value); return this; } + @Override + public int hashCode() { + return this.toOkhttpHeader().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof RestHeaders) { + return this.toOkhttpHeader().equals(((RestHeaders)obj).toOkhttpHeader()); + } + return false; + } + public okhttp3.Headers toOkhttpHeader() { - return headersBuilder.build(); + return this.headersBuilder.build(); } + public static RestHeaders convertRestHeaders(Headers headers) { + RestHeaders restHeaders = new RestHeaders(); + + if(headers != null) { + Iterator> iter = headers.iterator(); + while(iter.hasNext()) { + Pair pair = iter.next(); + restHeaders.add(pair.getFirst(), pair.getSecond()); + } + } + return restHeaders; + } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index 833093f4..13db0ab9 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -27,7 +27,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import lombok.SneakyThrows; -import okhttp3.Headers; import okhttp3.Response; public class RestResult { @@ -35,15 +34,14 @@ public class RestResult { private static final ObjectMapper MAPPER = new ObjectMapper(); private final int status; - private final Headers headers; + private final RestHeaders headers; private final String content; public RestResult(Response response) { - this(response.code(), getResponseContent(response), response.headers()); + this(response.code(), getResponseContent(response), RestHeaders.convertRestHeaders(response.headers())); } - public RestResult(int status, String content, - Headers headers) { + public RestResult(int status, String content, RestHeaders headers) { this.status = status; this.headers = headers; this.content = content; @@ -62,7 +60,7 @@ public int status() { return this.status; } - public Headers headers() { + public RestHeaders headers() { return this.headers; } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 09d60bc5..c1bce95b 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -91,54 +91,6 @@ public void testPostWithMaxTotalAndPerRoute() { Assert.assertEquals(200, restResult.status()); } - /** - * okhttp does not need to manually clean Executor - */ -// @Test -// public void testCleanExecutor() throws Exception { -// // Modify IDLE_TIME 100ms to speed test -// int newIdleTime = 100; -// int newCheckPeriod = newIdleTime + 20; -// -// RestClient client = new RestClientImpl("/test", 1000, newIdleTime, -// 10, 5, 200); -// -// PoolingHttpClientConnectionManager pool; -// pool = Whitebox.getInternalState(client, "pool"); -// pool = Mockito.spy(pool); -// Whitebox.setInternalState(client, "pool", pool); -// HttpRoute route = new HttpRoute(HttpHost.create( -// "http://127.0.0.1:8080")); -// // Create a connection manually, it will be put into leased list -// HttpClientConnection conn = pool.requestConnection(route, null) -// .get(1L, TimeUnit.SECONDS); -// PoolStats stats = pool.getTotalStats(); -// int usingConns = stats.getLeased() + stats.getPending(); -// Assert.assertGte(1, usingConns); -// -// // Sleep more than two check periods for busy connection -// Thread.sleep(newCheckPeriod); -// Mockito.verify(pool, Mockito.never()).closeExpiredConnections(); -// stats = pool.getTotalStats(); -// usingConns = stats.getLeased() + stats.getPending(); -// Assert.assertGte(1, usingConns); -// -// // The connection will be put into available list -// pool.releaseConnection(conn, null, 0, TimeUnit.SECONDS); -// -// stats = pool.getTotalStats(); -// usingConns = stats.getLeased() + stats.getPending(); -// Assert.assertEquals(0, usingConns); -// /* -// * Sleep more than two check periods for free connection, -// * ensure connection has been closed -// */ -// Thread.sleep(newCheckPeriod); -// Mockito.verify(pool, Mockito.atLeastOnce()) -// .closeExpiredConnections(); -// Mockito.verify(pool, Mockito.atLeastOnce()) -// .closeIdleConnections(newIdleTime, TimeUnit.MILLISECONDS); -// } @Test public void testPostWithUserAndPassword() { RestClient client = new RestClientImpl("/test", "user", "", 1000, 200); @@ -228,16 +180,15 @@ public void testHostNameVerifier() { @Test public void testPostWithHeaderAndContent() { - RestHeaders headers = new RestHeaders() - .add("key1", "value1-1") - .add("key1", "value1-2") - .add("Content-Encoding", "gzip"); + RestHeaders headers = new RestHeaders().add("key1", "value1-1") + .add("key1", "value1-2") + .add("Content-Encoding", "gzip"); String content = "{\"names\": [\"marko\", \"josh\", \"lop\"]}"; RestClient client = new RestClientImpl("/test", 1000, 200, headers, content); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); - Assert.assertEquals(headers.toOkhttpHeader(), restResult.headers()); + Assert.assertEquals(headers, restResult.headers()); Assert.assertEquals(content, restResult.content()); Assert.assertEquals(ImmutableList.of("marko", "josh", "lop"), restResult.readList("names", String.class)); @@ -272,10 +223,9 @@ public void testPut() { @Test public void testPutWithHeaders() { RestClient client = new RestClientImpl("/test", 1000, 200); - RestHeaders headers = - new RestHeaders().add("key1", "value1-1").add("key2", - "value1-2") - .add("Content-Encoding", "gzip"); + RestHeaders headers = new RestHeaders().add("key1", "value1-1") + .add("key2", "value1-2") + .add("Content-Encoding", "gzip"); RestResult restResult = client.put("path", "id1", "body", headers); Assert.assertEquals(200, restResult.status()); } @@ -351,31 +301,6 @@ public void testDeleteWithException() { }); } - /** - * okhttp does not need to manually close connection pool - */ -// @Test -// public void testClose() { -// RestClient client = new RestClientImpl("/test", 1000, 10, 5, 200); -// RestResult restResult = client.post("path", "body"); -// Assert.assertEquals(200, restResult.status()); -// -// client.close(); -// Assert.assertThrows(IllegalStateException.class, () -> { -// client.post("path", "body"); -// }); -// -// PoolingHttpClientConnectionManager pool; -// pool = Whitebox.getInternalState(client, "pool"); -// Assert.assertNotNull(pool); -// AtomicBoolean isShutDown = Whitebox.getInternalState(pool, "isShutDown"); -// Assert.assertTrue(isShutDown.get()); -// -// ScheduledExecutorService cleanExecutor; -// cleanExecutor = Whitebox.getInternalState(client, "cleanExecutor"); -// Assert.assertNotNull(cleanExecutor); -// Assert.assertTrue(cleanExecutor.isShutdown()); -// } @Test public void testAuthContext() { RestClientImpl client = new RestClientImpl("/test", 1000, 10, 5, 200); diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java index 2bf85f8f..d1e73129 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java @@ -42,17 +42,16 @@ private static RestResult newRestResult(int status, String content) { return newRestResult(status, content, new Headers.Builder().build()); } - private static RestResult newRestResult(int status, - Headers h) { - return newRestResult(status, "", h); + private static RestResult newRestResult(int status, Headers headers) { + return newRestResult(status, "", headers); } @SneakyThrows private static RestResult newRestResult(int status, String content, - Headers h) { + Headers headers) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(status); - Mockito.when(response.headers()).thenReturn(h); + Mockito.when(response.headers()).thenReturn(headers); Mockito.when(response.body().string()) .thenReturn(content); return new RestResult(response); From 53b57fa9e4fb3cf88a517e2c7670e97b949c8274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sat, 28 Oct 2023 00:21:25 +0800 Subject: [PATCH 14/28] fix: unit test error --- .../hugegraph/unit/rest/RestClientTest.java | 3 +-- .../hugegraph/unit/rest/RestResultTest.java | 21 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index c1bce95b..2d5339c0 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -46,7 +46,6 @@ import com.google.common.net.HttpHeaders; import lombok.SneakyThrows; -import okhttp3.Headers; import okhttp3.HttpUrl; import okhttp3.OkHttpClient; import okhttp3.Request; @@ -322,7 +321,7 @@ public void testRequest() { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(200); Mockito.when(response.headers()) - .thenReturn(new Headers.Builder().build()); + .thenReturn(new RestHeaders().toOkhttpHeader()); Mockito.when(response.body().string()).thenReturn("content"); Mockito.when(requestBuilder.delete()).thenReturn(requestBuilder); diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java index d1e73129..0600bca0 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java @@ -19,6 +19,7 @@ import java.util.Map; +import org.apache.hugegraph.rest.RestHeaders; import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.rest.SerializeException; import org.apache.hugegraph.testutil.Assert; @@ -29,29 +30,28 @@ import com.google.common.collect.ImmutableMap; import lombok.SneakyThrows; -import okhttp3.Headers; import okhttp3.Response; public class RestResultTest { private static RestResult newRestResult(int status) { - return newRestResult(status, "", new Headers.Builder().build()); + return newRestResult(status, "", new RestHeaders()); } private static RestResult newRestResult(int status, String content) { - return newRestResult(status, content, new Headers.Builder().build()); + return newRestResult(status, content, new RestHeaders()); } - private static RestResult newRestResult(int status, Headers headers) { + private static RestResult newRestResult(int status, RestHeaders headers) { return newRestResult(status, "", headers); } @SneakyThrows private static RestResult newRestResult(int status, String content, - Headers headers) { + RestHeaders headers) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(status); - Mockito.when(response.headers()).thenReturn(headers); + Mockito.when(response.headers()).thenReturn(headers.toOkhttpHeader()); Mockito.when(response.body().string()) .thenReturn(content); return new RestResult(response); @@ -65,11 +65,10 @@ public void testStatus() { @Test public void testHeaders() { - Headers.Builder headersBuilder = new Headers.Builder(); - headersBuilder.add("key1", "value1-1"); - headersBuilder.add("key1", "value1-2"); - headersBuilder.add("key2", "value2"); - Headers headers = headersBuilder.build(); + RestHeaders headers = new RestHeaders(); + headers.add("key1", "value1-1"); + headers.add("key1", "value1-2"); + headers.add("key2", "value2"); RestResult result = newRestResult(200, headers); Assert.assertEquals(200, result.status()); Assert.assertEquals(headers, result.headers()); From 945005a97b66d809eb219c3931db4172213a8459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sun, 29 Oct 2023 22:00:18 +0800 Subject: [PATCH 15/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 24 +++++----- .../rest/OkhttpBasicAuthInterceptor.java | 5 ++- .../rest/OkhttpTokenInterceptor.java | 4 +- .../apache/hugegraph/rest/RequestHeaders.java | 26 +++++++++++ .../apache/hugegraph/rest/RestHeaders.java | 41 +++++++++-------- .../org/apache/hugegraph/rest/RestResult.java | 3 +- .../hugegraph/unit/rest/RestClientTest.java | 44 +++++++------------ .../hugegraph/unit/rest/RestResultTest.java | 2 +- 8 files changed, 84 insertions(+), 65 deletions(-) create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 2815a6fd..4aa009b1 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -55,10 +55,10 @@ public abstract class AbstractRestClient implements RestClient { - private final ThreadLocal authContext = new InheritableThreadLocal<>(); + private final ThreadLocal authContext; private final OkHttpClient client; private final String baseUrl; - private final Request.Builder requestBuilder = new Request.Builder(); + private final Request.Builder requestBuilder; public AbstractRestClient(String url, int timeout) { this(url, OkHttpConfig.builder() @@ -147,12 +147,14 @@ public AbstractRestClient(String url, String token, Integer timeout, public AbstractRestClient(String url, OkHttpConfig okhttpConfig) { this.baseUrl = url; this.client = buildOkHttpClient(okhttpConfig); + this.requestBuilder = new Request.Builder(); + this.authContext = new InheritableThreadLocal<>(); } private static RequestBody buildRequestBody(Object body, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; - if ("application/json".equals(contentType)) { + if (RequestHeaders.APPLICATION_JSON.equals(contentType)) { if (body == null) { bodyContent = "{}"; } else { @@ -163,7 +165,7 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { } RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); - if (headers != null && "gzip".equals(headers.get("Content-Encoding"))) { + if (headers != null && "gzip".equals(headers.get(RequestHeaders.CONTENT_ENCODING))) { requestBody = gzip(requestBody); } return requestBody; @@ -192,12 +194,12 @@ public void writeTo(BufferedSink sink) throws IOException { private static String parseContentType(RestHeaders headers) { if (headers != null) { - String contentType = headers.get("Content-Type"); + String contentType = headers.get(RequestHeaders.CONTENT_TYPE); if (contentType != null) { return contentType; } } - return "application/json"; + return RequestHeaders.APPLICATION_JSON; } private OkHttpClient buildOkHttpClient(OkHttpConfig okHttpConfig) { @@ -299,7 +301,7 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he Request.Builder builder = requestBuilder.url(urlBuilder.build()); if (headers != null) { - builder.headers(headers.toOkhttpHeader()); + builder.headers(headers.toOkHttpHeader()); } this.attachAuthToRequest(builder); @@ -327,14 +329,12 @@ public RestResult put(String path, String id, Object object) { } @Override - public RestResult put(String path, String id, Object object, - RestHeaders headers) { + public RestResult put(String path, String id, Object object, RestHeaders headers) { return this.put(path, id, object, headers, null); } @Override - public RestResult put(String path, String id, Object object, - Map params) { + public RestResult put(String path, String id, Object object, Map params) { return this.put(path, id, object, null, params); } @@ -440,7 +440,7 @@ private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); if (StringUtils.isNotEmpty(auth)) { - builder.addHeader("Authorization", auth); + builder.addHeader(RequestHeaders.AUTHORIZATION, auth); } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java index a4b402c5..c4c6e1a6 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java @@ -35,9 +35,10 @@ public OkhttpBasicAuthInterceptor(String user, String password) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header("Authorization") == null) { + if (request.header(RequestHeaders.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header("Authorization", credentials).build(); + .header(RequestHeaders.AUTHORIZATION, credentials) + .build(); return chain.proceed(authenticatedRequest); } return chain.proceed(request); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java index 258bedec..a9ab54f4 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -34,9 +34,9 @@ public OkhttpTokenInterceptor(String token) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header("Authorization") == null) { + if (request.header(RequestHeaders.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header("Authorization", "Bearer " + this.token) + .header(RequestHeaders.AUTHORIZATION, "Bearer " + this.token) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java new file mode 100644 index 00000000..044e17f7 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +public class RequestHeaders { + + public static final String CONTENT_TYPE = "Content-Type"; + public static final String CONTENT_ENCODING = "Content-Encoding"; + public static final String APPLICATION_JSON = "application/json"; + public static final String AUTHORIZATION = "Authorization"; +} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index 243e5d55..c59b7141 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -21,11 +21,27 @@ import java.util.Iterator; import kotlin.Pair; -import okhttp3.Headers; public class RestHeaders { - private final okhttp3.Headers.Builder headersBuilder = new okhttp3.Headers.Builder(); + private final okhttp3.Headers.Builder headersBuilder; + + public RestHeaders() { + this.headersBuilder = new okhttp3.Headers.Builder(); + } + + public static RestHeaders convertToRestHeaders(okhttp3.Headers headers) { + RestHeaders restHeaders = new RestHeaders(); + + if (headers != null) { + Iterator> iter = headers.iterator(); + while (iter.hasNext()) { + Pair pair = iter.next(); + restHeaders.add(pair.getFirst(), pair.getSecond()); + } + } + return restHeaders; + } public String get(String key) { return this.headersBuilder.get(key); @@ -47,31 +63,18 @@ public RestHeaders add(String key, Date value) { @Override public int hashCode() { - return this.toOkhttpHeader().hashCode(); + return this.toOkHttpHeader().hashCode(); } @Override public boolean equals(Object obj) { - if(obj instanceof RestHeaders) { - return this.toOkhttpHeader().equals(((RestHeaders)obj).toOkhttpHeader()); + if (obj instanceof RestHeaders) { + return this.toOkHttpHeader().equals(((RestHeaders) obj).toOkHttpHeader()); } return false; } - public okhttp3.Headers toOkhttpHeader() { + public okhttp3.Headers toOkHttpHeader() { return this.headersBuilder.build(); } - - public static RestHeaders convertRestHeaders(Headers headers) { - RestHeaders restHeaders = new RestHeaders(); - - if(headers != null) { - Iterator> iter = headers.iterator(); - while(iter.hasNext()) { - Pair pair = iter.next(); - restHeaders.add(pair.getFirst(), pair.getSecond()); - } - } - return restHeaders; - } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index 13db0ab9..896a6763 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -38,7 +38,8 @@ public class RestResult { private final String content; public RestResult(Response response) { - this(response.code(), getResponseContent(response), RestHeaders.convertRestHeaders(response.headers())); + this(response.code(), getResponseContent(response), + RestHeaders.convertToRestHeaders(response.headers())); } public RestResult(int status, String content, RestHeaders headers) { diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 2d5339c0..8426c664 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -30,6 +30,7 @@ import org.apache.hugegraph.rest.AbstractRestClient; import org.apache.hugegraph.rest.ClientException; +import org.apache.hugegraph.rest.RequestHeaders; import org.apache.hugegraph.rest.RestClient; import org.apache.hugegraph.rest.RestHeaders; import org.apache.hugegraph.rest.RestResult; @@ -321,7 +322,7 @@ public void testRequest() { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(200); Mockito.when(response.headers()) - .thenReturn(new RestHeaders().toOkhttpHeader()); + .thenReturn(new RestHeaders().toOkHttpHeader()); Mockito.when(response.body().string()).thenReturn("content"); Mockito.when(requestBuilder.delete()).thenReturn(requestBuilder); @@ -341,38 +342,33 @@ public void testRequest() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader("Authorization", - "token1"); + Mockito.verify(requestBuilder).addHeader(RequestHeaders.AUTHORIZATION,"token1"); client.resetAuthContext(); client.setAuthContext("token2"); result = client.delete("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token2"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token2"); client.resetAuthContext(); // Test get client.setAuthContext("token3"); result = client.get("test"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token3"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token3"); client.resetAuthContext(); client.setAuthContext("token4"); result = client.get("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token4"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token4"); client.resetAuthContext(); client.setAuthContext("token5"); result = client.get("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token5"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token5"); client.resetAuthContext(); // Test put @@ -380,60 +376,52 @@ public void testRequest() { // result = client.post("test", new Object()); //why use new Object() as args here? result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token6"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token6"); client.resetAuthContext(); client.setAuthContext("token7"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token7"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token7"); client.resetAuthContext(); client.setAuthContext("token8"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token8"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token8"); client.resetAuthContext(); client.setAuthContext("token9"); result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token9"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token9"); client.resetAuthContext(); // Test post client.setAuthContext("token10"); result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token10"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token10"); client.resetAuthContext(); client.setAuthContext("token11"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token11"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token11"); client.resetAuthContext(); client.setAuthContext("token12"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token12"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token12"); client.resetAuthContext(); client.setAuthContext("token13"); result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, - "token13"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token13"); client.resetAuthContext(); } @@ -532,7 +520,7 @@ public RestClientImpl(String url, int timeout, int status, protected Response request(Callable method) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(this.status); - Mockito.when(response.headers()).thenReturn(this.headers.toOkhttpHeader()); + Mockito.when(response.headers()).thenReturn(this.headers.toOkHttpHeader()); Mockito.when(response.body().string()) .thenReturn(this.content); return response; diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java index 0600bca0..06eb03a1 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestResultTest.java @@ -51,7 +51,7 @@ private static RestResult newRestResult(int status, String content, RestHeaders headers) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(status); - Mockito.when(response.headers()).thenReturn(headers.toOkhttpHeader()); + Mockito.when(response.headers()).thenReturn(headers.toOkHttpHeader()); Mockito.when(response.body().string()) .thenReturn(content); return new RestResult(response); From 24a7dbfc56df30e1a2e862b846b081f7058de9d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 30 Oct 2023 23:27:56 +0800 Subject: [PATCH 16/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 22 +++++--------- .../hugegraph/unit/rest/RestClientTest.java | 29 +++++++++---------- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 4aa009b1..b2ea96e7 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -24,7 +24,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Map; -import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; @@ -316,8 +315,7 @@ public RestResult post(String path, Object object, RestHeaders headers, Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); requestBuilder.post(buildRequestBody(object, headers)); - try (Response response = this.request( - () -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = request(requestBuilder)) { checkStatus(response, 200, 201, 202); return new RestResult(response); } @@ -346,8 +344,7 @@ public RestResult put(String path, String id, Object object, Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); requestBuilder.put(buildRequestBody(object, headers)); - try (Response response = this.request( - () -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = request(requestBuilder)) { checkStatus(response, 200, 202); return new RestResult(response); } @@ -372,8 +369,7 @@ public RestResult get(String path, String id) { private RestResult get(String path, String id, Map params) { Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); - try (Response response = this.request( - () -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = request(requestBuilder)) { checkStatus(response, 200); return new RestResult(response); } @@ -395,8 +391,7 @@ private RestResult delete(String path, String id, Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); requestBuilder.delete(); - try (Response response = this.request( - () -> client.newCall(requestBuilder.build()).execute())) { + try (Response response = request(requestBuilder)) { checkStatus(response, 204, 202); return new RestResult(response); } @@ -404,12 +399,9 @@ private RestResult delete(String path, String id, protected abstract void checkStatus(Response response, int... statuses); - protected Response request(Callable method) { - try { - return method.call(); - } catch (Exception e) { - throw new ClientException("Failed to do request", e); - } + @SneakyThrows + protected Response request(Request.Builder requestBuilder) { + return client.newCall(requestBuilder.build()).execute(); } @SneakyThrows diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 8426c664..0fa654a6 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -21,7 +21,6 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -import java.util.concurrent.Callable; import java.util.function.BiFunction; import javax.net.ssl.SSLContext; @@ -342,33 +341,33 @@ public void testRequest() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(RequestHeaders.AUTHORIZATION,"token1"); + Mockito.verify(requestBuilder).addHeader(RequestHeaders.AUTHORIZATION, "token1"); client.resetAuthContext(); client.setAuthContext("token2"); result = client.delete("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token2"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token2"); client.resetAuthContext(); // Test get client.setAuthContext("token3"); result = client.get("test"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token3"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token3"); client.resetAuthContext(); client.setAuthContext("token4"); result = client.get("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token4"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token4"); client.resetAuthContext(); client.setAuthContext("token5"); result = client.get("test", "id"); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token5"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token5"); client.resetAuthContext(); // Test put @@ -376,52 +375,52 @@ public void testRequest() { // result = client.post("test", new Object()); //why use new Object() as args here? result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token6"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token6"); client.resetAuthContext(); client.setAuthContext("token7"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token7"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token7"); client.resetAuthContext(); client.setAuthContext("token8"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token8"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token8"); client.resetAuthContext(); client.setAuthContext("token9"); result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token9"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token9"); client.resetAuthContext(); // Test post client.setAuthContext("token10"); result = client.post("test", null); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token10"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token10"); client.resetAuthContext(); client.setAuthContext("token11"); result = client.post("test", null, new RestHeaders()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token11"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token11"); client.resetAuthContext(); client.setAuthContext("token12"); result = client.post("test", null, ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token12"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token12"); client.resetAuthContext(); client.setAuthContext("token13"); result = client.post("test", null, new RestHeaders(), ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION,"token13"); + Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token13"); client.resetAuthContext(); } @@ -517,7 +516,7 @@ public RestClientImpl(String url, int timeout, int status, @SneakyThrows @Override - protected Response request(Callable method) { + protected Response request(Request.Builder requestBuilder) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(this.status); Mockito.when(response.headers()).thenReturn(this.headers.toOkHttpHeader()); From 2cce7f4808fc335a8b96ac02172713c1d303ffd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sun, 5 Nov 2023 18:52:46 +0800 Subject: [PATCH 17/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 26 +++++++++---------- .../rest/OkhttpBasicAuthInterceptor.java | 5 ++-- .../rest/OkhttpTokenInterceptor.java | 5 ++-- .../apache/hugegraph/rest/RequestHeaders.java | 26 ------------------- .../apache/hugegraph/rest/RestHeaders.java | 5 ++++ .../org/apache/hugegraph/rest/RestResult.java | 3 +-- .../hugegraph/unit/rest/RestClientTest.java | 3 +-- 7 files changed, 26 insertions(+), 47 deletions(-) delete mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index b2ea96e7..be62afd1 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -153,7 +153,7 @@ public AbstractRestClient(String url, OkHttpConfig okhttpConfig) { private static RequestBody buildRequestBody(Object body, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; - if (RequestHeaders.APPLICATION_JSON.equals(contentType)) { + if (RestHeaders.APPLICATION_JSON.equals(contentType)) { if (body == null) { bodyContent = "{}"; } else { @@ -164,7 +164,7 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { } RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); - if (headers != null && "gzip".equals(headers.get(RequestHeaders.CONTENT_ENCODING))) { + if (headers != null && "gzip".equals(headers.get(RestHeaders.CONTENT_ENCODING))) { requestBody = gzip(requestBody); } return requestBody; @@ -193,12 +193,12 @@ public void writeTo(BufferedSink sink) throws IOException { private static String parseContentType(RestHeaders headers) { if (headers != null) { - String contentType = headers.get(RequestHeaders.CONTENT_TYPE); + String contentType = headers.get(RestHeaders.CONTENT_TYPE); if (contentType != null) { return contentType; } } - return RequestHeaders.APPLICATION_JSON; + return RestHeaders.APPLICATION_JSON; } private OkHttpClient buildOkHttpClient(OkHttpConfig okHttpConfig) { @@ -401,17 +401,17 @@ private RestResult delete(String path, String id, @SneakyThrows protected Response request(Request.Builder requestBuilder) { - return client.newCall(requestBuilder.build()).execute(); + return this.client.newCall(requestBuilder.build()).execute(); } @SneakyThrows @Override public void close() { - if (client != null) { - client.dispatcher().executorService().shutdown(); - client.connectionPool().evictAll(); - if (client.cache() != null) { - client.cache().close(); + if (this.client != null) { + this.client.dispatcher().executorService().shutdown(); + this.client.connectionPool().evictAll(); + if (this.client.cache() != null) { + this.client.cache().close(); } } } @@ -432,7 +432,7 @@ private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); if (StringUtils.isNotEmpty(auth)) { - builder.addHeader(RequestHeaders.AUTHORIZATION, auth); + builder.addHeader(RestHeaders.AUTHORIZATION, auth); } } @@ -453,8 +453,8 @@ private X509TrustManager trustManagerForCertificates(String trustStoreFile, TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { - throw new IllegalStateException("Unexpected default trust managers:" - + Arrays.toString(trustManagers)); + throw new IllegalStateException("Unexpected default trust managers:" + + Arrays.toString(trustManagers)); } return (X509TrustManager) trustManagers[0]; } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java index c4c6e1a6..5f234318 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java @@ -35,9 +35,10 @@ public OkhttpBasicAuthInterceptor(String user, String password) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(RequestHeaders.AUTHORIZATION) == null) { + if (request.header(RestHeaders.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(RequestHeaders.AUTHORIZATION, credentials) + .header(RestHeaders.AUTHORIZATION, + this.credentials) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java index a9ab54f4..19a6e966 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -34,9 +34,10 @@ public OkhttpTokenInterceptor(String token) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(RequestHeaders.AUTHORIZATION) == null) { + if (request.header(RestHeaders.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(RequestHeaders.AUTHORIZATION, "Bearer " + this.token) + .header(RestHeaders.AUTHORIZATION, + "Bearer " + this.token) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java deleted file mode 100644 index 044e17f7..00000000 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RequestHeaders.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package org.apache.hugegraph.rest; - -public class RequestHeaders { - - public static final String CONTENT_TYPE = "Content-Type"; - public static final String CONTENT_ENCODING = "Content-Encoding"; - public static final String APPLICATION_JSON = "application/json"; - public static final String AUTHORIZATION = "Authorization"; -} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index c59b7141..e9cf3395 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -24,6 +24,11 @@ public class RestHeaders { + public static final String CONTENT_TYPE = "Content-Type"; + public static final String CONTENT_ENCODING = "Content-Encoding"; + public static final String APPLICATION_JSON = "application/json"; + public static final String AUTHORIZATION = "Authorization"; + private final okhttp3.Headers.Builder headersBuilder; public RestHeaders() { diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index 896a6763..ed137a1a 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -73,8 +73,7 @@ public T readObject(Class clazz) { try { return MAPPER.readValue(this.content, clazz); } catch (Exception e) { - throw new SerializeException( - "Failed to deserialize: %s", e, this.content); + throw new SerializeException("Failed to deserialize: %s", e, this.content); } } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 0fa654a6..82096ae9 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -29,7 +29,6 @@ import org.apache.hugegraph.rest.AbstractRestClient; import org.apache.hugegraph.rest.ClientException; -import org.apache.hugegraph.rest.RequestHeaders; import org.apache.hugegraph.rest.RestClient; import org.apache.hugegraph.rest.RestHeaders; import org.apache.hugegraph.rest.RestResult; @@ -341,7 +340,7 @@ public void testRequest() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(RequestHeaders.AUTHORIZATION, "token1"); + Mockito.verify(requestBuilder).addHeader(RestHeaders.AUTHORIZATION, "token1"); client.resetAuthContext(); From cfb8daacff925b425678d78cbe3a3820a9a22bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sun, 5 Nov 2023 19:39:27 +0800 Subject: [PATCH 18/28] fix: code issue --- .../main/java/org/apache/hugegraph/rest/RestResult.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index ed137a1a..a516f589 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -37,8 +37,9 @@ public class RestResult { private final RestHeaders headers; private final String content; + @SneakyThrows public RestResult(Response response) { - this(response.code(), getResponseContent(response), + this(response.code(), response.body().string(), RestHeaders.convertToRestHeaders(response.headers())); } @@ -48,11 +49,6 @@ public RestResult(int status, String content, RestHeaders headers) { this.content = content; } - @SneakyThrows - private static String getResponseContent(Response response) { - return response.body().string(); - } - public static void registerModule(Module module) { MAPPER.registerModule(module); } From e662b64123a5d26d191d948020c99396b449ac7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 6 Nov 2023 20:09:28 +0800 Subject: [PATCH 19/28] fix: code issue --- .../main/java/org/apache/hugegraph/rest/RestResult.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index a516f589..ed137a1a 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -37,9 +37,8 @@ public class RestResult { private final RestHeaders headers; private final String content; - @SneakyThrows public RestResult(Response response) { - this(response.code(), response.body().string(), + this(response.code(), getResponseContent(response), RestHeaders.convertToRestHeaders(response.headers())); } @@ -49,6 +48,11 @@ public RestResult(int status, String content, RestHeaders headers) { this.content = content; } + @SneakyThrows + private static String getResponseContent(Response response) { + return response.body().string(); + } + public static void registerModule(Module module) { MAPPER.registerModule(module); } From e8fb6f39884b7e10543f2b2e2e81c744958d062d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 9 Nov 2023 19:40:49 +0800 Subject: [PATCH 20/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 10 +++---- .../hugegraph/rest/HttpHeadersConstant.java | 26 +++++++++++++++++++ .../rest/OkhttpBasicAuthInterceptor.java | 4 +-- .../rest/OkhttpTokenInterceptor.java | 4 +-- .../apache/hugegraph/rest/RestHeaders.java | 5 ---- .../org/apache/hugegraph/rest/RestResult.java | 13 ++++------ .../hugegraph/unit/rest/RestClientTest.java | 3 ++- 7 files changed, 42 insertions(+), 23 deletions(-) create mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index be62afd1..6acc266d 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -153,7 +153,7 @@ public AbstractRestClient(String url, OkHttpConfig okhttpConfig) { private static RequestBody buildRequestBody(Object body, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; - if (RestHeaders.APPLICATION_JSON.equals(contentType)) { + if (HttpHeadersConstant.APPLICATION_JSON.equals(contentType)) { if (body == null) { bodyContent = "{}"; } else { @@ -164,7 +164,7 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { } RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); - if (headers != null && "gzip".equals(headers.get(RestHeaders.CONTENT_ENCODING))) { + if (headers != null && "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { requestBody = gzip(requestBody); } return requestBody; @@ -193,12 +193,12 @@ public void writeTo(BufferedSink sink) throws IOException { private static String parseContentType(RestHeaders headers) { if (headers != null) { - String contentType = headers.get(RestHeaders.CONTENT_TYPE); + String contentType = headers.get(HttpHeadersConstant.CONTENT_TYPE); if (contentType != null) { return contentType; } } - return RestHeaders.APPLICATION_JSON; + return HttpHeadersConstant.APPLICATION_JSON; } private OkHttpClient buildOkHttpClient(OkHttpConfig okHttpConfig) { @@ -432,7 +432,7 @@ private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); if (StringUtils.isNotEmpty(auth)) { - builder.addHeader(RestHeaders.AUTHORIZATION, auth); + builder.addHeader(HttpHeadersConstant.AUTHORIZATION, auth); } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java new file mode 100644 index 00000000..52ae7526 --- /dev/null +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package org.apache.hugegraph.rest; + +public class HttpHeadersConstant { + public static final String CONTENT_TYPE = "Content-Type"; + public static final String CONTENT_ENCODING = "Content-Encoding"; + public static final String AUTHORIZATION = "Authorization"; + public static final String APPLICATION_JSON = "application/json"; + +} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java index 5f234318..27fd2d26 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java @@ -35,9 +35,9 @@ public OkhttpBasicAuthInterceptor(String user, String password) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(RestHeaders.AUTHORIZATION) == null) { + if (request.header(HttpHeadersConstant.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(RestHeaders.AUTHORIZATION, + .header(HttpHeadersConstant.AUTHORIZATION, this.credentials) .build(); return chain.proceed(authenticatedRequest); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java index 19a6e966..f69e24f5 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java @@ -34,9 +34,9 @@ public OkhttpTokenInterceptor(String token) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(RestHeaders.AUTHORIZATION) == null) { + if (request.header(HttpHeadersConstant.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(RestHeaders.AUTHORIZATION, + .header(HttpHeadersConstant.AUTHORIZATION, "Bearer " + this.token) .build(); return chain.proceed(authenticatedRequest); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index e9cf3395..c59b7141 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -24,11 +24,6 @@ public class RestHeaders { - public static final String CONTENT_TYPE = "Content-Type"; - public static final String CONTENT_ENCODING = "Content-Encoding"; - public static final String APPLICATION_JSON = "application/json"; - public static final String AUTHORIZATION = "Authorization"; - private final okhttp3.Headers.Builder headersBuilder; public RestHeaders() { diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java index ed137a1a..0aa482b0 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestResult.java @@ -83,16 +83,14 @@ public List readList(String key, Class clazz) { JsonNode root = MAPPER.readTree(this.content); JsonNode element = root.get(key); if (element == null) { - throw new SerializeException( - "Can't find value of the key: %s in json.", key); + throw new SerializeException("Can't find value of the key: %s in json.", key); } JavaType type = MAPPER.getTypeFactory() .constructParametrizedType(ArrayList.class, List.class, clazz); return MAPPER.convertValue(element, type); } catch (IOException e) { - throw new SerializeException( - "Failed to deserialize %s", e, this.content); + throw new SerializeException("Failed to deserialize %s", e, this.content); } } @@ -104,14 +102,13 @@ public List readList(Class clazz) { try { return MAPPER.readValue(this.content, type); } catch (IOException e) { - throw new SerializeException( - "Failed to deserialize %s", e, this.content); + throw new SerializeException("Failed to deserialize %s", e, this.content); } } @Override public String toString() { - return String.format("{status=%s, headers=%s, content=%s}", - this.status, this.headers, this.content); + return String.format("{status=%s, headers=%s, content=%s}", this.status, this.headers, + this.content); } } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 82096ae9..a5051471 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -29,6 +29,7 @@ import org.apache.hugegraph.rest.AbstractRestClient; import org.apache.hugegraph.rest.ClientException; +import org.apache.hugegraph.rest.HttpHeadersConstant; import org.apache.hugegraph.rest.RestClient; import org.apache.hugegraph.rest.RestHeaders; import org.apache.hugegraph.rest.RestResult; @@ -340,7 +341,7 @@ public void testRequest() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(RestHeaders.AUTHORIZATION, "token1"); + Mockito.verify(requestBuilder).addHeader(HttpHeadersConstant.AUTHORIZATION, "token1"); client.resetAuthContext(); From ff91e8a2e4f04c07aef457da20bdb18dfea2dd9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 9 Nov 2023 22:31:47 +0800 Subject: [PATCH 21/28] version 1.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8f2e39bb..2b8a4866 100644 --- a/pom.xml +++ b/pom.xml @@ -90,7 +90,7 @@ - 1.0.1 + 1.2.0 UTF-8 ${project.basedir}/.. 1.8 From a6b22fd69c0c60deb300423e28b91f5577b6c3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Fri, 10 Nov 2023 23:50:51 +0800 Subject: [PATCH 22/28] fix: version error --- .../main/java/org/apache/hugegraph/version/CommonVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/version/CommonVersion.java b/hugegraph-common/src/main/java/org/apache/hugegraph/version/CommonVersion.java index bcdad926..a049ff44 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/version/CommonVersion.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/version/CommonVersion.java @@ -24,5 +24,5 @@ public class CommonVersion { public static final String NAME = "hugegraph-common"; // The second parameter of Version.of() is for all-in-one JAR - public static final Version VERSION = Version.of(CommonVersion.class, "1.0.1"); + public static final Version VERSION = Version.of(CommonVersion.class, "1.2.0"); } From d717f6ddc71111a773b6c179c4078c65782bfa05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sat, 11 Nov 2023 00:21:03 +0800 Subject: [PATCH 23/28] fix: version error --- .../src/main/java/org/apache/hugegraph/version/RpcVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hugegraph-rpc/src/main/java/org/apache/hugegraph/version/RpcVersion.java b/hugegraph-rpc/src/main/java/org/apache/hugegraph/version/RpcVersion.java index f3cf926a..c7ab4052 100644 --- a/hugegraph-rpc/src/main/java/org/apache/hugegraph/version/RpcVersion.java +++ b/hugegraph-rpc/src/main/java/org/apache/hugegraph/version/RpcVersion.java @@ -24,5 +24,5 @@ public class RpcVersion { public static final String NAME = "hugegraph-rpc"; // The second parameter of Version.of() is for all-in-one JAR - public static final Version VERSION = Version.of(RpcVersion.class, "1.0.1"); + public static final Version VERSION = Version.of(RpcVersion.class, "1.2.0"); } From bbc5ec1a763d0013bc7500e5278bb4063a366c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Sun, 12 Nov 2023 13:52:30 +0800 Subject: [PATCH 24/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 169 +++++++++--------- .../hugegraph/rest/HttpHeadersConstant.java | 8 + ...r.java => OkHttpBasicAuthInterceptor.java} | 4 +- ...eptor.java => OkHttpTokenInterceptor.java} | 15 +- ...kHttpConfig.java => RestClientConfig.java} | 9 +- .../hugegraph/unit/rest/RestClientTest.java | 26 +-- 6 files changed, 123 insertions(+), 108 deletions(-) rename hugegraph-common/src/main/java/org/apache/hugegraph/rest/{OkhttpBasicAuthInterceptor.java => OkHttpBasicAuthInterceptor.java} (92%) rename hugegraph-common/src/main/java/org/apache/hugegraph/rest/{OkhttpTokenInterceptor.java => OkHttpTokenInterceptor.java} (71%) rename hugegraph-common/src/main/java/org/apache/hugegraph/rest/{OkHttpConfig.java => RestClientConfig.java} (86%) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 6acc266d..88e9b0d4 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -60,92 +60,92 @@ public abstract class AbstractRestClient implements RestClient { private final Request.Builder requestBuilder; public AbstractRestClient(String url, int timeout) { - this(url, OkHttpConfig.builder() - .timeout(timeout) - .build()); + this(url, RestClientConfig.builder().timeout(timeout).build()); } public AbstractRestClient(String url, String user, String password, - Integer timeout) { - this(url, OkHttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .build()); + int timeout) { + this(url, RestClientConfig.builder() + .user(user) + .password(password) + .timeout(timeout) + .build()); } public AbstractRestClient(String url, int timeout, - int maxTotal, int maxPerRoute) { - this(url, null, null, timeout, maxTotal, maxPerRoute); + int maxConns, int maxConnsPerRoute) { + this(url, null, null, timeout, maxConns, maxConnsPerRoute); } public AbstractRestClient(String url, int timeout, int idleTime, - int maxTotal, int maxPerRoute) { - this(url, OkHttpConfig.builder() - .idleTime(idleTime) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); + int maxConns, int maxConnsPerRoute) { + this(url, RestClientConfig.builder() + .idleTime(idleTime) + .timeout(timeout) + .maxConns(maxConns) + .maxConnsPerRoute(maxConnsPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute) { - this(url, OkHttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); + int timeout, int maxConns, int maxConnsPerRoute) { + this(url, RestClientConfig.builder() + .user(user) + .password(password) + .timeout(timeout) + .maxConns(maxConns) + .maxConnsPerRoute(maxConnsPerRoute) + .build()); } public AbstractRestClient(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, + int timeout, int maxConns, int maxConnsPerRoute, String trustStoreFile, String trustStorePassword) { - this(url, OkHttpConfig.builder() - .user(user).password(password) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .trustStoreFile(trustStoreFile) - .trustStorePassword(trustStorePassword) - .build()); - } - - public AbstractRestClient(String url, String token, Integer timeout) { - this(url, OkHttpConfig.builder() - .token(token) - .timeout(timeout) - .build()); - } - - public AbstractRestClient(String url, String token, Integer timeout, - Integer maxTotal, Integer maxPerRoute) { - this(url, OkHttpConfig.builder() - .token(token) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .build()); - } - - public AbstractRestClient(String url, String token, Integer timeout, - Integer maxTotal, Integer maxPerRoute, + this(url, RestClientConfig.builder() + .user(user).password(password) + .timeout(timeout) + .maxConns(maxConns) + .maxConnsPerRoute(maxConnsPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); + } + + public AbstractRestClient(String url, String token, int timeout) { + this(url, RestClientConfig.builder() + .token(token) + .timeout(timeout) + .build()); + } + + public AbstractRestClient(String url, String token, int timeout, + int maxConns, int maxConnsPerRoute) { + this(url, RestClientConfig.builder() + .token(token) + .timeout(timeout) + .maxConns(maxConns) + .maxConnsPerRoute(maxConnsPerRoute) + .build()); + } + + public AbstractRestClient(String url, String token, int timeout, + int maxConns, int maxConnsPerRoute, String trustStoreFile, String trustStorePassword) { - this(url, OkHttpConfig.builder() - .token(token) - .timeout(timeout) - .maxTotal(maxTotal) - .maxPerRoute(maxPerRoute) - .trustStoreFile(trustStoreFile) - .trustStorePassword(trustStorePassword) - .build()); + this(url, RestClientConfig.builder() + .token(token) + .timeout(timeout) + .maxConns(maxConns) + .maxConnsPerRoute(maxConnsPerRoute) + .trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword) + .build()); } - public AbstractRestClient(String url, OkHttpConfig okhttpConfig) { + public AbstractRestClient(String url, RestClientConfig config) { this.baseUrl = url; - this.client = buildOkHttpClient(okhttpConfig); + this.client = buildOkHttpClient(config); this.requestBuilder = new Request.Builder(); this.authContext = new InheritableThreadLocal<>(); } @@ -165,12 +165,12 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); if (headers != null && "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { - requestBody = gzip(requestBody); + requestBody = gzipBody(requestBody); } return requestBody; } - private static RequestBody gzip(final RequestBody body) { + private static RequestBody gzipBody(final RequestBody body) { return new RequestBody() { @Override public MediaType contentType() { @@ -201,42 +201,43 @@ private static String parseContentType(RestHeaders headers) { return HttpHeadersConstant.APPLICATION_JSON; } - private OkHttpClient buildOkHttpClient(OkHttpConfig okHttpConfig) { + private OkHttpClient buildOkHttpClient(RestClientConfig config) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); - if (okHttpConfig.getTimeout() != null) { - builder.connectTimeout(okHttpConfig.getTimeout(), TimeUnit.MILLISECONDS) - .readTimeout(okHttpConfig.getTimeout(), TimeUnit.MILLISECONDS); + if (config.getTimeout() != null) { + builder.connectTimeout(config.getTimeout(), TimeUnit.MILLISECONDS) + .readTimeout(config.getTimeout(), TimeUnit.MILLISECONDS); } - if (okHttpConfig.getIdleTime() != null) { + if (config.getMaxIdleConnections() != null || config.getIdleTime() != null) { ConnectionPool connectionPool = - new ConnectionPool(5, okHttpConfig.getIdleTime(), TimeUnit.MILLISECONDS); + new ConnectionPool(config.getMaxIdleConnections(), config.getIdleTime(), + TimeUnit.MILLISECONDS); builder.connectionPool(connectionPool); } // auth header interceptor - if (StringUtils.isNotBlank(okHttpConfig.getUser()) && - StringUtils.isNotBlank(okHttpConfig.getPassword())) { - builder.addInterceptor(new OkhttpBasicAuthInterceptor(okHttpConfig.getUser(), - okHttpConfig.getPassword())); + if (StringUtils.isNotBlank(config.getUser()) && + StringUtils.isNotBlank(config.getPassword())) { + builder.addInterceptor(new OkHttpBasicAuthInterceptor(config.getUser(), + config.getPassword())); } - if (StringUtils.isNotBlank(okHttpConfig.getToken())) { - builder.addInterceptor(new OkhttpTokenInterceptor(okHttpConfig.getToken())); + if (StringUtils.isNotBlank(config.getToken())) { + builder.addInterceptor(new OkHttpTokenInterceptor(config.getToken())); } // ssl - configSsl(builder, this.baseUrl, okHttpConfig.getTrustStoreFile(), - okHttpConfig.getTrustStorePassword()); + configSsl(builder, this.baseUrl, config.getTrustStoreFile(), + config.getTrustStorePassword()); OkHttpClient okHttpClient = builder.build(); - if (okHttpConfig.getMaxTotal() != null) { - okHttpClient.dispatcher().setMaxRequests(okHttpConfig.getMaxTotal()); + if (config.getMaxConns() != null) { + okHttpClient.dispatcher().setMaxRequests(config.getMaxConns()); } - if (okHttpConfig.getMaxPerRoute() != null) { - okHttpClient.dispatcher().setMaxRequestsPerHost(okHttpConfig.getMaxPerRoute()); + if (config.getMaxConnsPerRoute() != null) { + okHttpClient.dispatcher().setMaxRequestsPerHost(config.getMaxConnsPerRoute()); } return okHttpClient; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java index 52ae7526..0ac1fa1b 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java @@ -18,9 +18,17 @@ package org.apache.hugegraph.rest; public class HttpHeadersConstant { + public static final String CONTENT_TYPE = "Content-Type"; + public static final String CONTENT_ENCODING = "Content-Encoding"; + public static final String AUTHORIZATION = "Authorization"; + public static final String APPLICATION_JSON = "application/json"; + public static final String BEARER = "Bearer"; + + public static final String SPACE = " "; + } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java similarity index 92% rename from hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java rename to hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java index 27fd2d26..36c275e5 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java @@ -24,11 +24,11 @@ import okhttp3.Request; import okhttp3.Response; -public class OkhttpBasicAuthInterceptor implements Interceptor { +public class OkHttpBasicAuthInterceptor implements Interceptor { private final String credentials; - public OkhttpBasicAuthInterceptor(String user, String password) { + public OkHttpBasicAuthInterceptor(String user, String password) { this.credentials = Credentials.basic(user, password); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java similarity index 71% rename from hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java rename to hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java index f69e24f5..d24bccc3 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkhttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java @@ -17,27 +17,32 @@ package org.apache.hugegraph.rest; +import static org.apache.hugegraph.rest.HttpHeadersConstant.AUTHORIZATION; +import static org.apache.hugegraph.rest.HttpHeadersConstant.BEARER; +import static org.apache.hugegraph.rest.HttpHeadersConstant.SPACE; + import java.io.IOException; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; -public class OkhttpTokenInterceptor implements Interceptor { + +public class OkHttpTokenInterceptor implements Interceptor { private final String token; - public OkhttpTokenInterceptor(String token) { + public OkHttpTokenInterceptor(String token) { this.token = token; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(HttpHeadersConstant.AUTHORIZATION) == null) { + if (request.header(AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(HttpHeadersConstant.AUTHORIZATION, - "Bearer " + this.token) + .header(AUTHORIZATION, + BEARER + SPACE + this.token) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java similarity index 86% rename from hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java rename to hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java index 1e4091a3..1459ded7 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpConfig.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java @@ -24,15 +24,16 @@ @Builder @Getter @Setter -public class OkHttpConfig { +public class RestClientConfig { private String user; private String password; private String token; private Integer timeout; - private Integer maxTotal; - private Integer maxPerRoute; - private Integer idleTime; + private Integer maxConns; + private Integer maxConnsPerRoute; + private Integer idleTime = 5; + private Integer maxIdleConnections = 5; private String trustStoreFile; private String trustStorePassword; } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index a5051471..bd8bcc6e 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -84,7 +84,7 @@ public void testPost() { @Test // TODO: How to verify it? - public void testPostWithMaxTotalAndPerRoute() { + public void testPostWithmaxConnsAndPerRoute() { RestClient client = new RestClientImpl("/test", 1000, 10, 5, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); @@ -431,16 +431,16 @@ private static class RestClientImpl extends AbstractRestClient { private final String content; public RestClientImpl(String url, int timeout, int idleTime, - int maxTotal, int maxPerRoute, int status) { - super(url, timeout, idleTime, maxTotal, maxPerRoute); + int maxConns, int maxConnsPerRoute, int status) { + super(url, timeout, idleTime, maxConns, maxConnsPerRoute); this.status = status; this.headers = new RestHeaders(); this.content = ""; } public RestClientImpl(String url, int timeout, - int maxTotal, int maxPerRoute, int status) { - super(url, timeout, maxTotal, maxPerRoute); + int maxConns, int maxConnsPerRoute, int status) { + super(url, timeout, maxConns, maxConnsPerRoute); this.status = status; this.headers = new RestHeaders(); this.content = ""; @@ -455,19 +455,19 @@ public RestClientImpl(String url, String user, String password, } public RestClientImpl(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, + int timeout, int maxConns, int maxConnsPerRoute, int status) { - super(url, user, password, timeout, maxTotal, maxPerRoute); + super(url, user, password, timeout, maxConns, maxConnsPerRoute); this.status = status; this.headers = new RestHeaders(); this.content = ""; } public RestClientImpl(String url, String user, String password, - int timeout, int maxTotal, int maxPerRoute, + int timeout, int maxConns, int maxConnsPerRoute, String trustStoreFile, String trustStorePassword, int status) { - super(url, user, password, timeout, maxTotal, maxPerRoute, + super(url, user, password, timeout, maxConns, maxConnsPerRoute, trustStoreFile, trustStorePassword); this.status = status; this.headers = new RestHeaders(); @@ -483,18 +483,18 @@ public RestClientImpl(String url, String token, } public RestClientImpl(String url, String token, int timeout, - int maxTotal, int maxPerRoute, int status) { - super(url, token, timeout, maxTotal, maxPerRoute); + int maxConns, int maxConnsPerRoute, int status) { + super(url, token, timeout, maxConns, maxConnsPerRoute); this.status = status; this.headers = new RestHeaders(); this.content = ""; } public RestClientImpl(String url, String token, int timeout, - int maxTotal, int maxPerRoute, + int maxConns, int maxConnsPerRoute, String trustStoreFile, String trustStorePassword, int status) { - super(url, token, timeout, maxTotal, maxPerRoute, + super(url, token, timeout, maxConns, maxConnsPerRoute, trustStoreFile, trustStorePassword); this.status = status; this.headers = new RestHeaders(); From e85169472fcbbb7136660d6f1941c4681b692ae9 Mon Sep 17 00:00:00 2001 From: imbajin Date: Wed, 15 Nov 2023 15:50:30 +0800 Subject: [PATCH 25/28] tiny improve --- .../hugegraph/rest/AbstractRestClient.java | 31 +++++++++++-------- .../hugegraph/unit/rest/RestClientTest.java | 22 +++++-------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 88e9b0d4..b56633ce 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -24,6 +24,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Map; +import java.util.Objects; import java.util.concurrent.TimeUnit; import javax.net.ssl.HostnameVerifier; @@ -37,6 +38,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.hugegraph.util.JsonUtil; +import org.jetbrains.annotations.NotNull; import com.google.common.collect.ImmutableMap; @@ -52,6 +54,11 @@ import okio.GzipSink; import okio.Okio; +/** + * This class provides an abstract implementation of the RestClient interface. + * It provides methods for making HTTP requests (GET, POST, PUT, DELETE) to a REST API. + * Note: It uses the OkHttp library to make these requests for now. + */ public abstract class AbstractRestClient implements RestClient { private final ThreadLocal authContext; @@ -63,8 +70,7 @@ public AbstractRestClient(String url, int timeout) { this(url, RestClientConfig.builder().timeout(timeout).build()); } - public AbstractRestClient(String url, String user, String password, - int timeout) { + public AbstractRestClient(String url, String user, String password, int timeout) { this(url, RestClientConfig.builder() .user(user) .password(password) @@ -72,8 +78,7 @@ public AbstractRestClient(String url, String user, String password, .build()); } - public AbstractRestClient(String url, int timeout, - int maxConns, int maxConnsPerRoute) { + public AbstractRestClient(String url, int timeout, int maxConns, int maxConnsPerRoute) { this(url, null, null, timeout, maxConns, maxConnsPerRoute); } @@ -131,8 +136,7 @@ public AbstractRestClient(String url, String token, int timeout, public AbstractRestClient(String url, String token, int timeout, int maxConns, int maxConnsPerRoute, - String trustStoreFile, - String trustStorePassword) { + String trustStoreFile, String trustStorePassword) { this(url, RestClientConfig.builder() .token(token) .timeout(timeout) @@ -162,7 +166,8 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { } else { bodyContent = String.valueOf(body); } - RequestBody requestBody = RequestBody.create(MediaType.parse(contentType), bodyContent); + RequestBody requestBody = RequestBody.create(bodyContent.getBytes(), + MediaType.parse(contentType)); if (headers != null && "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { requestBody = gzipBody(requestBody); @@ -183,7 +188,7 @@ public long contentLength() { } @Override - public void writeTo(BufferedSink sink) throws IOException { + public void writeTo(@NotNull BufferedSink sink) throws IOException { BufferedSink gzipSink = Okio.buffer(new GzipSink(sink)); body.writeTo(gzipSink); gzipSink.close(); @@ -210,9 +215,9 @@ private OkHttpClient buildOkHttpClient(RestClientConfig config) { } if (config.getMaxIdleConnections() != null || config.getIdleTime() != null) { - ConnectionPool connectionPool = - new ConnectionPool(config.getMaxIdleConnections(), config.getIdleTime(), - TimeUnit.MILLISECONDS); + ConnectionPool connectionPool = new ConnectionPool(config.getMaxIdleConnections(), + config.getIdleTime(), + TimeUnit.MILLISECONDS); builder.connectionPool(connectionPool); } @@ -276,7 +281,8 @@ public RestResult post(String path, Object object, Map params) { private Request.Builder getRequestBuilder(String path, String id, RestHeaders headers, Map params) { - HttpUrl.Builder urlBuilder = HttpUrl.parse(this.baseUrl).newBuilder() + HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(this.baseUrl)) + .newBuilder() .addPathSegments(path); if (id != null) { urlBuilder.addPathSegment(id); @@ -482,5 +488,4 @@ public boolean verify(String hostname, SSLSession session) { } } } - } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index bd8bcc6e..7f61df6b 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -70,8 +70,8 @@ public static void setUp() { Mockito.when(httpUrlBuilder.addPathSegments("test") .addPathSegment("id")) .thenReturn(httpUrlBuilder); - Mockito.when(requestBuilder.url( - httpUrlBuilder.addPathSegments("test").addPathSegment("id").build())) + Mockito.when(requestBuilder.url(httpUrlBuilder.addPathSegments("test") + .addPathSegment("id").build())) .thenReturn(requestBuilder); } @@ -474,8 +474,7 @@ public RestClientImpl(String url, String user, String password, this.content = ""; } - public RestClientImpl(String url, String token, - int timeout, int status) { + public RestClientImpl(String url, String token, int timeout, int status) { super(url, token, timeout); this.status = status; this.headers = new RestHeaders(); @@ -492,8 +491,7 @@ public RestClientImpl(String url, String token, int timeout, public RestClientImpl(String url, String token, int timeout, int maxConns, int maxConnsPerRoute, - String trustStoreFile, - String trustStorePassword, int status) { + String trustStoreFile, String trustStorePassword, int status) { super(url, token, timeout, maxConns, maxConnsPerRoute, trustStoreFile, trustStorePassword); this.status = status; @@ -506,8 +504,7 @@ public RestClientImpl(String url, int timeout, int status) { } public RestClientImpl(String url, int timeout, int status, - RestHeaders headers, - String content) { + RestHeaders headers, String content) { super(url, timeout); this.status = status; this.headers = headers; @@ -520,14 +517,12 @@ protected Response request(Request.Builder requestBuilder) { Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(this.status); Mockito.when(response.headers()).thenReturn(this.headers.toOkHttpHeader()); - Mockito.when(response.body().string()) - .thenReturn(this.content); + Mockito.when(response.body().string()).thenReturn(this.content); return response; } @Override - protected void checkStatus(Response response, - int... statuses) { + protected void checkStatus(Response response, int... statuses) { boolean match = false; for (int status : statuses) { if (status == response.code()) { @@ -548,8 +543,7 @@ public MockRestClientImpl(String url, int timeout) { } @Override - protected void checkStatus(Response response, - int... statuses) { + protected void checkStatus(Response response, int... statuses) { // pass } } From 5aecb313e0b4485d96a584c82d1c4711199bba73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Thu, 16 Nov 2023 00:01:07 +0800 Subject: [PATCH 26/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 63 ++---- .../hugegraph/rest/HttpHeadersConstant.java | 5 +- .../rest/OkHttpTokenInterceptor.java | 5 +- .../hugegraph/rest/RestClientConfig.java | 5 +- .../hugegraph/unit/rest/RestClientTest.java | 208 +++++++----------- 5 files changed, 101 insertions(+), 185 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index b56633ce..37ec77f0 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -62,9 +62,10 @@ public abstract class AbstractRestClient implements RestClient { private final ThreadLocal authContext; + private final OkHttpClient client; + private final String baseUrl; - private final Request.Builder requestBuilder; public AbstractRestClient(String url, int timeout) { this(url, RestClientConfig.builder().timeout(timeout).build()); @@ -78,12 +79,8 @@ public AbstractRestClient(String url, String user, String password, int timeout) .build()); } - public AbstractRestClient(String url, int timeout, int maxConns, int maxConnsPerRoute) { - this(url, null, null, timeout, maxConns, maxConnsPerRoute); - } - - public AbstractRestClient(String url, int timeout, int idleTime, - int maxConns, int maxConnsPerRoute) { + public AbstractRestClient(String url, int timeout, int idleTime, int maxConns, + int maxConnsPerRoute) { this(url, RestClientConfig.builder() .idleTime(idleTime) .timeout(timeout) @@ -92,20 +89,8 @@ public AbstractRestClient(String url, int timeout, int idleTime, .build()); } - public AbstractRestClient(String url, String user, String password, - int timeout, int maxConns, int maxConnsPerRoute) { - this(url, RestClientConfig.builder() - .user(user) - .password(password) - .timeout(timeout) - .maxConns(maxConns) - .maxConnsPerRoute(maxConnsPerRoute) - .build()); - } - - public AbstractRestClient(String url, String user, String password, - int timeout, int maxConns, int maxConnsPerRoute, - String trustStoreFile, + public AbstractRestClient(String url, String user, String password, int timeout, int maxConns, + int maxConnsPerRoute, String trustStoreFile, String trustStorePassword) { this(url, RestClientConfig.builder() .user(user).password(password) @@ -117,26 +102,9 @@ public AbstractRestClient(String url, String user, String password, .build()); } - public AbstractRestClient(String url, String token, int timeout) { - this(url, RestClientConfig.builder() - .token(token) - .timeout(timeout) - .build()); - } - - public AbstractRestClient(String url, String token, int timeout, - int maxConns, int maxConnsPerRoute) { - this(url, RestClientConfig.builder() - .token(token) - .timeout(timeout) - .maxConns(maxConns) - .maxConnsPerRoute(maxConnsPerRoute) - .build()); - } - - public AbstractRestClient(String url, String token, int timeout, - int maxConns, int maxConnsPerRoute, - String trustStoreFile, String trustStorePassword) { + public AbstractRestClient(String url, String token, int timeout, int maxConns, + int maxConnsPerRoute, String trustStoreFile, + String trustStorePassword) { this(url, RestClientConfig.builder() .token(token) .timeout(timeout) @@ -150,7 +118,6 @@ public AbstractRestClient(String url, String token, int timeout, public AbstractRestClient(String url, RestClientConfig config) { this.baseUrl = url; this.client = buildOkHttpClient(config); - this.requestBuilder = new Request.Builder(); this.authContext = new InheritableThreadLocal<>(); } @@ -214,10 +181,10 @@ private OkHttpClient buildOkHttpClient(RestClientConfig config) { .readTimeout(config.getTimeout(), TimeUnit.MILLISECONDS); } - if (config.getMaxIdleConnections() != null || config.getIdleTime() != null) { - ConnectionPool connectionPool = new ConnectionPool(config.getMaxIdleConnections(), + if (config.getMaxIdleConns() != null || config.getIdleTime() != null) { + ConnectionPool connectionPool = new ConnectionPool(config.getMaxIdleConns(), config.getIdleTime(), - TimeUnit.MILLISECONDS); + TimeUnit.MINUTES); builder.connectionPool(connectionPool); } @@ -304,7 +271,7 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he }); } - Request.Builder builder = requestBuilder.url(urlBuilder.build()); + Request.Builder builder = newRequestBuilder().url(urlBuilder.build()); if (headers != null) { builder.headers(headers.toOkHttpHeader()); @@ -315,6 +282,10 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he return builder; } + protected Request.Builder newRequestBuilder() { + return new Request.Builder(); + } + @SneakyThrows @Override public RestResult post(String path, Object object, RestHeaders headers, diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java index 0ac1fa1b..5bd8ca68 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java @@ -18,7 +18,7 @@ package org.apache.hugegraph.rest; public class HttpHeadersConstant { - + public static final String CONTENT_TYPE = "Content-Type"; public static final String CONTENT_ENCODING = "Content-Encoding"; @@ -27,8 +27,7 @@ public class HttpHeadersConstant { public static final String APPLICATION_JSON = "application/json"; - public static final String BEARER = "Bearer"; + public static final String BEARER_PREFIX = "Bearer "; - public static final String SPACE = " "; } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java index d24bccc3..63d80698 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java @@ -18,8 +18,7 @@ package org.apache.hugegraph.rest; import static org.apache.hugegraph.rest.HttpHeadersConstant.AUTHORIZATION; -import static org.apache.hugegraph.rest.HttpHeadersConstant.BEARER; -import static org.apache.hugegraph.rest.HttpHeadersConstant.SPACE; +import static org.apache.hugegraph.rest.HttpHeadersConstant.BEARER_PREFIX; import java.io.IOException; @@ -42,7 +41,7 @@ public Response intercept(Chain chain) throws IOException { if (request.header(AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() .header(AUTHORIZATION, - BEARER + SPACE + this.token) + BEARER_PREFIX + this.token) .build(); return chain.proceed(authenticatedRequest); } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java index 1459ded7..12286504 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java @@ -17,6 +17,8 @@ package org.apache.hugegraph.rest; +import java.util.concurrent.TimeUnit; + import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -33,7 +35,8 @@ public class RestClientConfig { private Integer maxConns; private Integer maxConnsPerRoute; private Integer idleTime = 5; - private Integer maxIdleConnections = 5; + private TimeUnit idleTimeUnit = TimeUnit.MINUTES; + private Integer maxIdleConns = 5; private String trustStoreFile; private String trustStorePassword; } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 7f61df6b..7a8f9ba1 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -31,14 +31,13 @@ import org.apache.hugegraph.rest.ClientException; import org.apache.hugegraph.rest.HttpHeadersConstant; import org.apache.hugegraph.rest.RestClient; +import org.apache.hugegraph.rest.RestClientConfig; import org.apache.hugegraph.rest.RestHeaders; import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.testutil.Assert; import org.apache.hugegraph.testutil.Whitebox; import org.apache.hugegraph.unit.BaseUnitTest; -import org.junit.BeforeClass; import org.junit.Test; -import org.mockito.MockedStatic; import org.mockito.Mockito; import com.google.common.collect.ImmutableList; @@ -53,69 +52,60 @@ public class RestClientTest { - private static final Request.Builder requestBuilder = - Mockito.mock(Request.Builder.class, Mockito.RETURNS_DEEP_STUBS); - - @BeforeClass - public static void setUp() { - HttpUrl.Builder httpUrlBuilder = - Mockito.mock(HttpUrl.Builder.class, Mockito.RETURNS_DEEP_STUBS); - HttpUrl httpUrl = Mockito.mock(HttpUrl.class); - - MockedStatic httpUrlMockedStatic = Mockito.mockStatic(HttpUrl.class); - httpUrlMockedStatic.when(() -> HttpUrl.parse("/test")).thenReturn(httpUrl); - Mockito.when(httpUrl.newBuilder()).thenReturn(httpUrlBuilder); - - Mockito.when(httpUrlBuilder.addPathSegments("test")).thenReturn(httpUrlBuilder); - Mockito.when(httpUrlBuilder.addPathSegments("test") - .addPathSegment("id")) - .thenReturn(httpUrlBuilder); - Mockito.when(requestBuilder.url(httpUrlBuilder.addPathSegments("test") - .addPathSegment("id").build())) - .thenReturn(requestBuilder); - } + private static final String TEST_URL = "http://localhost:8080"; @Test public void testPost() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @Test // TODO: How to verify it? - public void testPostWithmaxConnsAndPerRoute() { - RestClient client = new RestClientImpl("/test", 1000, 10, 5, 200); + public void testPostWithMaxConnsAndPerRoute() { + RestClientConfig restClientConfig = + RestClientConfig.builder().timeout(1000).maxConns(10).maxConnsPerRoute(5).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @Test public void testPostWithUserAndPassword() { - RestClient client = new RestClientImpl("/test", "user", "", 1000, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().user("user").password("").timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @Test public void testPostWithToken() { - RestClient client = new RestClientImpl("/test", "token", 1000, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().token("token").timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @Test public void testPostWithAllParams() { - RestClient client = new RestClientImpl("/test", "user", "", 1000, - 10, 5, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().user("user").password("").timeout(1000).maxConns(10) + .maxConnsPerRoute(5).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @Test public void testPostWithTokenAndAllParams() { - RestClient client = new RestClientImpl("/test", "token", 1000, - 10, 5, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().token("token").timeout(1000).maxConns(10) + .maxConnsPerRoute(5).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @@ -128,9 +118,11 @@ public void testPostHttpsWithAllParams() { BaseUnitTest.downloadFileByUrl(url, trustStoreFile); String trustStorePassword = "changeit"; - RestClient client = new RestClientImpl("/test", "user", "", 1000, - 10, 5, trustStoreFile, - trustStorePassword, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().user("user").password("").timeout(1000).maxConns(10) + .maxConnsPerRoute(5).trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @@ -143,9 +135,11 @@ public void testPostHttpsWithTokenAndAllParams() { BaseUnitTest.downloadFileByUrl(url, trustStoreFile); String trustStorePassword = "changeit"; - RestClient client = new RestClientImpl("/test", "token", 1000, - 10, 5, trustStoreFile, - trustStorePassword, 200); + RestClientConfig restClientConfig = + RestClientConfig.builder().token("token").timeout(1000).maxConns(10) + .maxConnsPerRoute(5).trustStoreFile(trustStoreFile) + .trustStorePassword(trustStorePassword).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); } @@ -183,8 +177,8 @@ public void testPostWithHeaderAndContent() { .add("key1", "value1-2") .add("Content-Encoding", "gzip"); String content = "{\"names\": [\"marko\", \"josh\", \"lop\"]}"; - RestClient client = new RestClientImpl("/test", 1000, 200, - headers, content); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200, headers, content); RestResult restResult = client.post("path", "body"); Assert.assertEquals(200, restResult.status()); Assert.assertEquals(headers, restResult.headers()); @@ -195,7 +189,8 @@ public void testPostWithHeaderAndContent() { @Test public void testPostWithException() { - RestClient client = new RestClientImpl("/test", 1000, 400); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 400); Assert.assertThrows(ClientException.class, () -> { client.post("path", "body"); }); @@ -203,7 +198,8 @@ public void testPostWithException() { @Test public void testPostWithParams() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestHeaders headers = new RestHeaders(); Map params = ImmutableMap.of("param1", "value1"); @@ -214,14 +210,16 @@ public void testPostWithParams() { @Test public void testPut() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.put("path", "id1", "body"); Assert.assertEquals(200, restResult.status()); } @Test public void testPutWithHeaders() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestHeaders headers = new RestHeaders().add("key1", "value1-1") .add("key2", "value1-2") .add("Content-Encoding", "gzip"); @@ -231,7 +229,8 @@ public void testPutWithHeaders() { @Test public void testPutWithParams() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); Map params = ImmutableMap.of("param1", "value1"); RestResult restResult = client.put("path", "id1", "body", params); Assert.assertEquals(200, restResult.status()); @@ -239,7 +238,8 @@ public void testPutWithParams() { @Test public void testPutWithException() { - RestClient client = new RestClientImpl("/test", 1000, 400); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 400); Assert.assertThrows(ClientException.class, () -> { client.put("path", "id1", "body"); }); @@ -247,21 +247,24 @@ public void testPutWithException() { @Test public void testGet() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.get("path"); Assert.assertEquals(200, restResult.status()); } @Test public void testGetWithId() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); RestResult restResult = client.get("path", "id1"); Assert.assertEquals(200, restResult.status()); } @Test public void testGetWithParams() { - RestClient client = new RestClientImpl("/test", 1000, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 200); Map params = new HashMap<>(); params.put("key1", ImmutableList.of("value1-1", "value1-2")); params.put("key2", "value2"); @@ -271,7 +274,8 @@ public void testGetWithParams() { @Test public void testGetWithException() { - RestClient client = new RestClientImpl("/test", 1000, 400); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 400); Assert.assertThrows(ClientException.class, () -> { client.get("path", "id1"); }); @@ -279,14 +283,16 @@ public void testGetWithException() { @Test public void testDeleteWithId() { - RestClient client = new RestClientImpl("/test", 1000, 204); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 204); RestResult restResult = client.delete("path", "id1"); Assert.assertEquals(204, restResult.status()); } @Test public void testDeleteWithParams() { - RestClient client = new RestClientImpl("/test", 1000, 204); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 204); Map params = ImmutableMap.of("param1", "value1"); RestResult restResult = client.delete("path", params); Assert.assertEquals(204, restResult.status()); @@ -294,7 +300,8 @@ public void testDeleteWithParams() { @Test public void testDeleteWithException() { - RestClient client = new RestClientImpl("/test", 1000, 400); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClient client = new RestClientImpl(TEST_URL, restClientConfig, 400); Assert.assertThrows(ClientException.class, () -> { client.delete("path", "id1"); }); @@ -302,7 +309,8 @@ public void testDeleteWithException() { @Test public void testAuthContext() { - RestClientImpl client = new RestClientImpl("/test", 1000, 10, 5, 200); + RestClientConfig restClientConfig = RestClientConfig.builder().timeout(1000).build(); + RestClientImpl client = new RestClientImpl(TEST_URL, restClientConfig, 200); Assert.assertNull(client.getAuthContext()); String token = UUID.randomUUID().toString(); @@ -316,24 +324,30 @@ public void testAuthContext() { @SneakyThrows @Test public void testRequest() { - MockRestClientImpl client = new MockRestClientImpl("/test", 1000); - Response response = Mockito.mock(Response.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(response.code()).thenReturn(200); Mockito.when(response.headers()) .thenReturn(new RestHeaders().toOkHttpHeader()); Mockito.when(response.body().string()).thenReturn("content"); + Request.Builder requestBuilder = Mockito.mock(Request.Builder.class, + Mockito.RETURNS_DEEP_STUBS); Mockito.when(requestBuilder.delete()).thenReturn(requestBuilder); Mockito.when(requestBuilder.get()).thenReturn(requestBuilder); Mockito.when(requestBuilder.put(Mockito.any())).thenReturn(requestBuilder); Mockito.when(requestBuilder.post(Mockito.any())).thenReturn(requestBuilder); + Mockito.when(requestBuilder.url((HttpUrl) Mockito.any())).thenReturn(requestBuilder); + MockRestClientImpl client = new MockRestClientImpl(TEST_URL, 1000) { + @Override + protected Request.Builder newRequestBuilder() { + return requestBuilder; + } + }; OkHttpClient okHttpClient = Mockito.mock(OkHttpClient.class, Mockito.RETURNS_DEEP_STUBS); Mockito.when(okHttpClient.newCall(Mockito.any()).execute()).thenReturn(response); Whitebox.setInternalState(client, "client", okHttpClient); - Whitebox.setInternalState(client, "requestBuilder", requestBuilder); RestResult result; @@ -372,7 +386,6 @@ public void testRequest() { // Test put client.setAuthContext("token6"); -// result = client.post("test", new Object()); //why use new Object() as args here? result = client.post("test", null); Assert.assertEquals(200, result.status()); Mockito.verify(requestBuilder).addHeader(HttpHeaders.AUTHORIZATION, "token6"); @@ -430,82 +443,13 @@ private static class RestClientImpl extends AbstractRestClient { private final RestHeaders headers; private final String content; - public RestClientImpl(String url, int timeout, int idleTime, - int maxConns, int maxConnsPerRoute, int status) { - super(url, timeout, idleTime, maxConns, maxConnsPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, int timeout, - int maxConns, int maxConnsPerRoute, int status) { - super(url, timeout, maxConns, maxConnsPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; + public RestClientImpl(String url, RestClientConfig config, int status) { + this(url, config, status, new RestHeaders(), ""); } - public RestClientImpl(String url, String user, String password, - int timeout, int status) { - super(url, user, password, timeout); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String user, String password, - int timeout, int maxConns, int maxConnsPerRoute, - int status) { - super(url, user, password, timeout, maxConns, maxConnsPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String user, String password, - int timeout, int maxConns, int maxConnsPerRoute, - String trustStoreFile, String trustStorePassword, - int status) { - super(url, user, password, timeout, maxConns, maxConnsPerRoute, - trustStoreFile, trustStorePassword); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, int timeout, int status) { - super(url, token, timeout); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, int timeout, - int maxConns, int maxConnsPerRoute, int status) { - super(url, token, timeout, maxConns, maxConnsPerRoute); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, String token, int timeout, - int maxConns, int maxConnsPerRoute, - String trustStoreFile, String trustStorePassword, int status) { - super(url, token, timeout, maxConns, maxConnsPerRoute, - trustStoreFile, trustStorePassword); - this.status = status; - this.headers = new RestHeaders(); - this.content = ""; - } - - public RestClientImpl(String url, int timeout, int status) { - this(url, timeout, status, new RestHeaders(), ""); - } - - public RestClientImpl(String url, int timeout, int status, - RestHeaders headers, String content) { - super(url, timeout); + public RestClientImpl(String url, RestClientConfig config, int status, RestHeaders headers, + String content) { + super(url, config); this.status = status; this.headers = headers; this.content = content; From 1a1435eb6313d622dbf5a854491cde32524050bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Mon, 20 Nov 2023 22:35:26 +0800 Subject: [PATCH 27/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 35 +++++++++++-------- .../hugegraph/rest/HttpHeadersConstant.java | 33 ----------------- .../rest/OkHttpBasicAuthInterceptor.java | 2 ++ .../rest/OkHttpTokenInterceptor.java | 4 +-- .../hugegraph/rest/RestClientConfig.java | 4 +-- .../apache/hugegraph/rest/RestHeaders.java | 14 ++++++++ .../hugegraph/unit/rest/RestClientTest.java | 2 +- 7 files changed, 41 insertions(+), 53 deletions(-) delete mode 100644 hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 37ec77f0..0161b851 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -37,6 +37,7 @@ import javax.net.ssl.X509TrustManager; import org.apache.commons.lang3.StringUtils; +import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; import org.apache.hugegraph.util.JsonUtil; import org.jetbrains.annotations.NotNull; @@ -79,8 +80,8 @@ public AbstractRestClient(String url, String user, String password, int timeout) .build()); } - public AbstractRestClient(String url, int timeout, int idleTime, int maxConns, - int maxConnsPerRoute) { + public AbstractRestClient(String url, int timeout, int idleTime, + int maxConns, int maxConnsPerRoute) { this(url, RestClientConfig.builder() .idleTime(idleTime) .timeout(timeout) @@ -89,9 +90,9 @@ public AbstractRestClient(String url, int timeout, int idleTime, int maxConns, .build()); } - public AbstractRestClient(String url, String user, String password, int timeout, int maxConns, - int maxConnsPerRoute, String trustStoreFile, - String trustStorePassword) { + public AbstractRestClient(String url, String user, String password, int timeout, + int maxConns, int maxConnsPerRoute, + String trustStoreFile, String trustStorePassword) { this(url, RestClientConfig.builder() .user(user).password(password) .timeout(timeout) @@ -102,9 +103,9 @@ public AbstractRestClient(String url, String user, String password, int timeout, .build()); } - public AbstractRestClient(String url, String token, int timeout, int maxConns, - int maxConnsPerRoute, String trustStoreFile, - String trustStorePassword) { + public AbstractRestClient(String url, String token, int timeout, + int maxConns, int maxConnsPerRoute, + String trustStoreFile, String trustStorePassword) { this(url, RestClientConfig.builder() .token(token) .timeout(timeout) @@ -136,7 +137,8 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { RequestBody requestBody = RequestBody.create(bodyContent.getBytes(), MediaType.parse(contentType)); - if (headers != null && "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { + if (headers != null && + "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { requestBody = gzipBody(requestBody); } return requestBody; @@ -184,7 +186,7 @@ private OkHttpClient buildOkHttpClient(RestClientConfig config) { if (config.getMaxIdleConns() != null || config.getIdleTime() != null) { ConnectionPool connectionPool = new ConnectionPool(config.getMaxIdleConns(), config.getIdleTime(), - TimeUnit.MINUTES); + config.getIdleTimeUnit()); builder.connectionPool(connectionPool); } @@ -246,7 +248,7 @@ public RestResult post(String path, Object object, Map params) { return this.post(path, object, null, params); } - private Request.Builder getRequestBuilder(String path, String id, RestHeaders headers, + private Request.Builder genRequestBuilder(String path, String id, RestHeaders headers, Map params) { HttpUrl.Builder urlBuilder = Objects.requireNonNull(HttpUrl.parse(this.baseUrl)) .newBuilder() @@ -282,6 +284,9 @@ private Request.Builder getRequestBuilder(String path, String id, RestHeaders he return builder; } + /** + * In order to provide subclasses with overloading opportunities + */ protected Request.Builder newRequestBuilder() { return new Request.Builder(); } @@ -290,7 +295,7 @@ protected Request.Builder newRequestBuilder() { @Override public RestResult post(String path, Object object, RestHeaders headers, Map params) { - Request.Builder requestBuilder = getRequestBuilder(path, null, headers, params); + Request.Builder requestBuilder = genRequestBuilder(path, null, headers, params); requestBuilder.post(buildRequestBody(object, headers)); try (Response response = request(requestBuilder)) { @@ -319,7 +324,7 @@ public RestResult put(String path, String id, Object object, Map public RestResult put(String path, String id, Object object, RestHeaders headers, Map params) { - Request.Builder requestBuilder = getRequestBuilder(path, id, headers, params); + Request.Builder requestBuilder = genRequestBuilder(path, id, headers, params); requestBuilder.put(buildRequestBody(object, headers)); try (Response response = request(requestBuilder)) { @@ -345,7 +350,7 @@ public RestResult get(String path, String id) { @SneakyThrows private RestResult get(String path, String id, Map params) { - Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); + Request.Builder requestBuilder = genRequestBuilder(path, id, null, params); try (Response response = request(requestBuilder)) { checkStatus(response, 200); @@ -366,7 +371,7 @@ public RestResult delete(String path, String id) { @SneakyThrows private RestResult delete(String path, String id, Map params) { - Request.Builder requestBuilder = getRequestBuilder(path, id, null, params); + Request.Builder requestBuilder = genRequestBuilder(path, id, null, params); requestBuilder.delete(); try (Response response = request(requestBuilder)) { diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java deleted file mode 100644 index 5bd8ca68..00000000 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/HttpHeadersConstant.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with this - * work for additional information regarding copyright ownership. The ASF - * licenses this file to You under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -package org.apache.hugegraph.rest; - -public class HttpHeadersConstant { - - public static final String CONTENT_TYPE = "Content-Type"; - - public static final String CONTENT_ENCODING = "Content-Encoding"; - - public static final String AUTHORIZATION = "Authorization"; - - public static final String APPLICATION_JSON = "application/json"; - - public static final String BEARER_PREFIX = "Bearer "; - - -} diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java index 36c275e5..0d73766e 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java @@ -19,6 +19,8 @@ import java.io.IOException; +import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; + import okhttp3.Credentials; import okhttp3.Interceptor; import okhttp3.Request; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java index 63d80698..6d977369 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java @@ -17,8 +17,8 @@ package org.apache.hugegraph.rest; -import static org.apache.hugegraph.rest.HttpHeadersConstant.AUTHORIZATION; -import static org.apache.hugegraph.rest.HttpHeadersConstant.BEARER_PREFIX; +import static org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant.AUTHORIZATION; +import static org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant.BEARER_PREFIX; import java.io.IOException; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java index 12286504..abc5640f 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java @@ -34,8 +34,8 @@ public class RestClientConfig { private Integer timeout; private Integer maxConns; private Integer maxConnsPerRoute; - private Integer idleTime = 5; - private TimeUnit idleTimeUnit = TimeUnit.MINUTES; + private Integer idleTime = 30; + private TimeUnit idleTimeUnit = TimeUnit.SECONDS; private Integer maxIdleConns = 5; private String trustStoreFile; private String trustStorePassword; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index c59b7141..5ac13a53 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -77,4 +77,18 @@ public boolean equals(Object obj) { public okhttp3.Headers toOkHttpHeader() { return this.headersBuilder.build(); } + + public static class HttpHeadersConstant { + + public static final String CONTENT_TYPE = "Content-Type"; + + public static final String CONTENT_ENCODING = "Content-Encoding"; + + public static final String AUTHORIZATION = "Authorization"; + + public static final String APPLICATION_JSON = "application/json"; + + public static final String BEARER_PREFIX = "Bearer "; + } + } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 7a8f9ba1..2ffc5f42 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -29,10 +29,10 @@ import org.apache.hugegraph.rest.AbstractRestClient; import org.apache.hugegraph.rest.ClientException; -import org.apache.hugegraph.rest.HttpHeadersConstant; import org.apache.hugegraph.rest.RestClient; import org.apache.hugegraph.rest.RestClientConfig; import org.apache.hugegraph.rest.RestHeaders; +import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.testutil.Assert; import org.apache.hugegraph.testutil.Whitebox; From 81aa7ca8b0c41962487a0a358bfaa91b0e2f7006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=AE=87?= <940643974@qq.com> Date: Tue, 21 Nov 2023 19:22:38 +0800 Subject: [PATCH 28/28] fix: code issue --- .../hugegraph/rest/AbstractRestClient.java | 13 +++++----- .../rest/OkHttpBasicAuthInterceptor.java | 6 ++--- .../rest/OkHttpTokenInterceptor.java | 4 ++-- .../hugegraph/rest/RestClientConfig.java | 5 ++-- .../apache/hugegraph/rest/RestHeaders.java | 24 ++++++++----------- .../hugegraph/unit/rest/RestClientTest.java | 3 +-- 6 files changed, 23 insertions(+), 32 deletions(-) diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java index 0161b851..27d9add5 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/AbstractRestClient.java @@ -37,7 +37,6 @@ import javax.net.ssl.X509TrustManager; import org.apache.commons.lang3.StringUtils; -import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; import org.apache.hugegraph.util.JsonUtil; import org.jetbrains.annotations.NotNull; @@ -125,7 +124,7 @@ public AbstractRestClient(String url, RestClientConfig config) { private static RequestBody buildRequestBody(Object body, RestHeaders headers) { String contentType = parseContentType(headers); String bodyContent; - if (HttpHeadersConstant.APPLICATION_JSON.equals(contentType)) { + if (RestHeaders.APPLICATION_JSON.equals(contentType)) { if (body == null) { bodyContent = "{}"; } else { @@ -138,7 +137,7 @@ private static RequestBody buildRequestBody(Object body, RestHeaders headers) { MediaType.parse(contentType)); if (headers != null && - "gzip".equals(headers.get(HttpHeadersConstant.CONTENT_ENCODING))) { + "gzip".equals(headers.get(RestHeaders.CONTENT_ENCODING))) { requestBody = gzipBody(requestBody); } return requestBody; @@ -167,12 +166,12 @@ public void writeTo(@NotNull BufferedSink sink) throws IOException { private static String parseContentType(RestHeaders headers) { if (headers != null) { - String contentType = headers.get(HttpHeadersConstant.CONTENT_TYPE); + String contentType = headers.get(RestHeaders.CONTENT_TYPE); if (contentType != null) { return contentType; } } - return HttpHeadersConstant.APPLICATION_JSON; + return RestHeaders.APPLICATION_JSON; } private OkHttpClient buildOkHttpClient(RestClientConfig config) { @@ -186,7 +185,7 @@ private OkHttpClient buildOkHttpClient(RestClientConfig config) { if (config.getMaxIdleConns() != null || config.getIdleTime() != null) { ConnectionPool connectionPool = new ConnectionPool(config.getMaxIdleConns(), config.getIdleTime(), - config.getIdleTimeUnit()); + TimeUnit.SECONDS); builder.connectionPool(connectionPool); } @@ -415,7 +414,7 @@ private void attachAuthToRequest(Request.Builder builder) { // Add auth header String auth = this.getAuthContext(); if (StringUtils.isNotEmpty(auth)) { - builder.addHeader(HttpHeadersConstant.AUTHORIZATION, auth); + builder.addHeader(RestHeaders.AUTHORIZATION, auth); } } diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java index 0d73766e..f7b1509f 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpBasicAuthInterceptor.java @@ -19,8 +19,6 @@ import java.io.IOException; -import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; - import okhttp3.Credentials; import okhttp3.Interceptor; import okhttp3.Request; @@ -37,9 +35,9 @@ public OkHttpBasicAuthInterceptor(String user, String password) { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - if (request.header(HttpHeadersConstant.AUTHORIZATION) == null) { + if (request.header(RestHeaders.AUTHORIZATION) == null) { Request authenticatedRequest = request.newBuilder() - .header(HttpHeadersConstant.AUTHORIZATION, + .header(RestHeaders.AUTHORIZATION, this.credentials) .build(); return chain.proceed(authenticatedRequest); diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java index 6d977369..f5640332 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/OkHttpTokenInterceptor.java @@ -17,8 +17,8 @@ package org.apache.hugegraph.rest; -import static org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant.AUTHORIZATION; -import static org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant.BEARER_PREFIX; +import static org.apache.hugegraph.rest.RestHeaders.AUTHORIZATION; +import static org.apache.hugegraph.rest.RestHeaders.BEARER_PREFIX; import java.io.IOException; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java index abc5640f..ef3e9b0e 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestClientConfig.java @@ -17,8 +17,6 @@ package org.apache.hugegraph.rest; -import java.util.concurrent.TimeUnit; - import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -31,11 +29,12 @@ public class RestClientConfig { private String user; private String password; private String token; + // unit in milliseconds private Integer timeout; private Integer maxConns; private Integer maxConnsPerRoute; + // unit in seconds private Integer idleTime = 30; - private TimeUnit idleTimeUnit = TimeUnit.SECONDS; private Integer maxIdleConns = 5; private String trustStoreFile; private String trustStorePassword; diff --git a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java index 5ac13a53..03c082ed 100644 --- a/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java +++ b/hugegraph-common/src/main/java/org/apache/hugegraph/rest/RestHeaders.java @@ -24,6 +24,16 @@ public class RestHeaders { + public static final String CONTENT_TYPE = "Content-Type"; + + public static final String CONTENT_ENCODING = "Content-Encoding"; + + public static final String AUTHORIZATION = "Authorization"; + + public static final String APPLICATION_JSON = "application/json"; + + public static final String BEARER_PREFIX = "Bearer "; + private final okhttp3.Headers.Builder headersBuilder; public RestHeaders() { @@ -77,18 +87,4 @@ public boolean equals(Object obj) { public okhttp3.Headers toOkHttpHeader() { return this.headersBuilder.build(); } - - public static class HttpHeadersConstant { - - public static final String CONTENT_TYPE = "Content-Type"; - - public static final String CONTENT_ENCODING = "Content-Encoding"; - - public static final String AUTHORIZATION = "Authorization"; - - public static final String APPLICATION_JSON = "application/json"; - - public static final String BEARER_PREFIX = "Bearer "; - } - } diff --git a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java index 2ffc5f42..f7b998df 100644 --- a/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java +++ b/hugegraph-common/src/test/java/org/apache/hugegraph/unit/rest/RestClientTest.java @@ -32,7 +32,6 @@ import org.apache.hugegraph.rest.RestClient; import org.apache.hugegraph.rest.RestClientConfig; import org.apache.hugegraph.rest.RestHeaders; -import org.apache.hugegraph.rest.RestHeaders.HttpHeadersConstant; import org.apache.hugegraph.rest.RestResult; import org.apache.hugegraph.testutil.Assert; import org.apache.hugegraph.testutil.Whitebox; @@ -355,7 +354,7 @@ protected Request.Builder newRequestBuilder() { client.setAuthContext("token1"); result = client.delete("test", ImmutableMap.of()); Assert.assertEquals(200, result.status()); - Mockito.verify(requestBuilder).addHeader(HttpHeadersConstant.AUTHORIZATION, "token1"); + Mockito.verify(requestBuilder).addHeader(RestHeaders.AUTHORIZATION, "token1"); client.resetAuthContext();