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();