This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new c5af1c2 JUNEAU-182 Add a RestCallHandler interface to the RestClient
API
c5af1c2 is described below
commit c5af1c2832f67966359258c89e2db7072e53abdf
Author: JamesBognar <[email protected]>
AuthorDate: Wed Jan 22 12:15:19 2020 -0500
JUNEAU-182 Add a RestCallHandler interface to the RestClient API
---
juneau-doc/docs/ReleaseNotes/8.1.4.html | 45 +++++++++++++++
.../apache/juneau/rest/client/RestCallHandler.java | 65 ++++++++++++++++++++++
.../org/apache/juneau/rest/client/RestClient.java | 49 ++++++++++++++--
.../juneau/rest/client/RestClientBuilder.java | 38 +++++++++++++
4 files changed, 192 insertions(+), 5 deletions(-)
diff --git a/juneau-doc/docs/ReleaseNotes/8.1.4.html
b/juneau-doc/docs/ReleaseNotes/8.1.4.html
new file mode 100644
index 0000000..4615401
--- /dev/null
+++ b/juneau-doc/docs/ReleaseNotes/8.1.4.html
@@ -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.
+
***************************************************************************************************************************/
+ -->
+
+8.1.4 (TBD)
+
+<p>
+</p>
+
+<h5 class='topic w800'>juneau-marshall</h5>
+<ul class='spaced-list'>
+</ul>
+
+<h5 class='topic w800'>juneau-rest-server</h5>
+<ul class='spaced-list'>
+</ul>
+
+<h5 class='topic w800'>juneau-rest-server-springboot</h5>
+<ul class='spaced-list'>
+ <li>
+ {@link oajr.springboot.JuneauRestInitializer} now provides a
no-arg constructor so that it can be used in
+ the
<c><ja>@ConfigurationContext</ja>(initializers=JuneauRestInitializer.<jk>class</jk>)</c>
when unit testing
+ using <ja>@SpringBootTest</ja>.
+</ul>
+
+<h5 class='topic w800'>juneau-rest-client</h5>
+<ul class='spaced-list'>
+ <li>
+ New {@link oajrc.RestCallHandler} interface for custom handling
of HTTP requests.
+</ul>
+
+<h5 class='topic w800'>juneau-doc</h5>
+<ul class='spaced-list'>
+</ul>
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallHandler.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallHandler.java
new file mode 100644
index 0000000..15cf54d
--- /dev/null
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCallHandler.java
@@ -0,0 +1,65 @@
+//
***************************************************************************************************************************
+// * 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.juneau.rest.client;
+
+import java.io.*;
+
+import org.apache.http.*;
+import org.apache.http.client.*;
+import org.apache.http.client.methods.*;
+
+/**
+ * Interface that allows you to override the handling of HTTP requests.
+ *
+ * <p>
+ * Providing this implementation is the equivalent to overriding the {@link
RestClient#execute(HttpEntityEnclosingRequestBase)}
+ * and {@link RestClient#execute(HttpRequestBase)} methods.
+ *
+ * <p>
+ * This can also be accomplished by providing your own {@link
RestClientBuilder#connectionManager(org.apache.http.conn.HttpClientConnectionManager)},
+ * but this provides a simpler way of handling the requests yourself.
+ *
+ * <ul class='seealso'>
+ * <li class='jf'>{@link RestClient#RESTCLIENT_callHandler}
+ * <li class='jf'>{@link RestClientBuilder#callHandler(Class)}
+ * <li class='jf'>{@link RestClientBuilder#callHandler(RestCallHandler)}
+ * </ul>
+ */
+public interface RestCallHandler {
+
+ /**
+ * Execute the specified body request (e.g. POST/PUT).
+ *
+ * <p>
+ * Subclasses can override this method to provide specialized handling.
+ *
+ * @param req The HTTP request.
+ * @return The HTTP response.
+ * @throws IOException Stream exception occurred.
+ * @throws ClientProtocolException Signals an error in the HTTP
protocol.
+ */
+ HttpResponse execute(HttpEntityEnclosingRequestBase req) throws
ClientProtocolException, IOException;
+
+ /**
+ * Execute the specified no-body request (e.g. GET/DELETE).
+ *
+ * <p>
+ * Subclasses can override this method to provide specialized handling.
+ *
+ * @param req The HTTP request.
+ * @return The HTTP response.
+ * @throws IOException Stream exception occurred.
+ * @throws ClientProtocolException Signals an error in the HTTP
protocol.
+ */
+ HttpResponse execute(HttpRequestBase req) throws
ClientProtocolException, IOException;
+}
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index 6642c9b..947d772 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -81,6 +81,28 @@ public class RestClient extends BeanContext implements
Closeable {
private static final String PREFIX = "RestClient.";
/**
+ * Configuration property: REST call handler.
+ *
+ * <h5 class='section'>Property:</h5>
+ * <ul class='spaced-list'>
+ * <li><b>ID:</b> {@link
org.apache.juneau.rest.client.RestClient#RESTCLIENT_callHandler
RESTCLIENT_callHandler}
+ * <li><b>Name:</b> <js>"RestClient.callHandler.o"</js>
+ * <li><b>Data type:</b> {@link RestCallHandler}
+ * <li><b>Default:</b> <c><jk>null</jk></c>
+ * <li><b>Methods:</b>
+ * <ul>
+ * <li class='jm'>{@link
org.apache.juneau.rest.client.RestClientBuilder#callHandler(Class)}
+ * <li class='jm'>{@link
org.apache.juneau.rest.client.RestClientBuilder#callHandler(RestCallHandler)}
+ * </ul>
+ * </ul>
+ *
+ * <h5 class='section'>Description:</h5>
+ * <p>
+ * Allows you to provide a custom handler for making HTTP calls.
+ */
+ public static final String RESTCLIENT_callHandler = PREFIX +
"callHandler.o";
+
+ /**
* Configuration property: Debug.
*
* <h5 class='section'>Property:</h5>
@@ -467,11 +489,12 @@ public class RestClient extends BeanContext implements
Closeable {
private final Map<String,String> headers, query;
private final HttpClientBuilder httpClientBuilder;
- private final CloseableHttpClient httpClient;
+ final CloseableHttpClient httpClient;
private final boolean keepHttpClientOpen, debug;
private final UrlEncodingSerializer urlEncodingSerializer; // Used for
form posts only.
private final HttpPartSerializer partSerializer;
private final HttpPartParser partParser;
+ private final RestCallHandler callHandler;
private final String rootUrl;
private volatile boolean isClosed = false;
private final StackTraceElement[] creationStack;
@@ -575,6 +598,22 @@ public class RestClient extends BeanContext implements
Closeable {
this.partParser = getInstanceProperty(RESTCLIENT_partParser,
HttpPartParser.class, OpenApiParser.class, ResourceResolver.FUZZY, ps);
this.executorService =
getInstanceProperty(RESTCLIENT_executorService, ExecutorService.class, null);
+ RestCallHandler callHandler =
getInstanceProperty(RESTCLIENT_callHandler, RestCallHandler.class, null);
+ if (callHandler == null) {
+ callHandler = new RestCallHandler() {
+ @Override
+ public HttpResponse
execute(HttpEntityEnclosingRequestBase req) throws ClientProtocolException,
IOException {
+ return
RestClient.this.httpClient.execute(req);
+ }
+
+ @Override
+ public HttpResponse execute(HttpRequestBase
req) throws ClientProtocolException, IOException {
+ return
RestClient.this.httpClient.execute(req);
+ }
+ };
+ }
+ this.callHandler = callHandler;
+
RestCallInterceptor[] rci =
getInstanceArrayProperty(RESTCLIENT_interceptors, RestCallInterceptor.class,
new RestCallInterceptor[0]);
if (debug)
rci = ArrayUtils.append(rci, RestCallLogger.DEFAULT);
@@ -641,10 +680,10 @@ public class RestClient extends BeanContext implements
Closeable {
* @param req The HTTP request.
* @return The HTTP response.
* @throws IOException Stream exception occurred.
- * @throws ClientProtocolException ignals an error in the HTTP protocol.
+ * @throws ClientProtocolException Signals an error in the HTTP
protocol.
*/
protected HttpResponse execute(HttpRequestBase req) throws
ClientProtocolException, IOException {
- return httpClient.execute(req);
+ return callHandler.execute(req);
}
/**
@@ -656,10 +695,10 @@ public class RestClient extends BeanContext implements
Closeable {
* @param req The HTTP request.
* @return The HTTP response.
* @throws IOException Stream exception occurred.
- * @throws ClientProtocolException ignals an error in the HTTP protocol.
+ * @throws ClientProtocolException Signals an error in the HTTP
protocol.
*/
protected HttpResponse execute(HttpEntityEnclosingRequestBase req)
throws ClientProtocolException, IOException {
- return httpClient.execute(req);
+ return callHandler.execute(req);
}
/**
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
index 3d2c582..87529e0 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClientBuilder.java
@@ -1137,6 +1137,44 @@ public class RestClientBuilder extends
BeanContextBuilder {
//-----------------------------------------------------------------------------------------------------------------
/**
+ * Configuration property: REST call handler.
+ *
+ * <p>
+ * Allows you to provide a custom handler for making HTTP calls.
+ *
+ * <ul class='seealso'>
+ * <li class='jf'>{@link RestClient#RESTCLIENT_callHandler}
+ * </ul>
+ *
+ * @param value
+ * The new value for this setting.
+ * <br>The default value is <jk>null</jk>.
+ * @return This object (for method chaining).
+ */
+ public RestClientBuilder callHandler(Class<? extends RestCallHandler>
value) {
+ return set(RESTCLIENT_callHandler, value);
+ }
+
+ /**
+ * Configuration property: REST call handler.
+ *
+ * <p>
+ * Allows you to provide a custom handler for making HTTP calls.
+ *
+ * <ul class='seealso'>
+ * <li class='jf'>{@link RestClient#RESTCLIENT_callHandler}
+ * </ul>
+ *
+ * @param value
+ * The new value for this setting.
+ * <br>The default value is <jk>null</jk>.
+ * @return This object (for method chaining).
+ */
+ public RestClientBuilder callHandler(RestCallHandler value) {
+ return set(RESTCLIENT_callHandler, value);
+ }
+
+ /**
* Configuration property: Executor service.
*
* <p>