This is an automated email from the ASF dual-hosted git repository.

andreapatricelli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new d7618ab736 Ensure CXF WebClient to use async conduit (#664)
d7618ab736 is described below

commit d7618ab7369b04098c2bca9318474238d6ec9829
Author: Andrea Patricelli <andreapatrice...@apache.org>
AuthorDate: Thu Mar 28 11:06:16 2024 +0100

    Ensure CXF WebClient to use async conduit (#664)
---
 .../apache/syncope/client/console/pages/WA.java    |  8 ++--
 .../client/console/rest/AMSessionRestClient.java   | 12 ++---
 .../client/console/rest/SRASessionRestClient.java  | 11 ++---
 .../console/rest/SRAStatisticsRestClient.java      |  8 ++--
 .../client/console/rest/WASessionRestClient.java   |  8 ++--
 .../client/console/rest/ConnectorRestClient.java   |  4 +-
 .../client/console/rest/ResourceRestClient.java    |  4 +-
 .../client/console/rest/LoggerConfRestClient.java  | 26 +++++------
 .../syncope/client/lib/SyncopeAnonymousClient.java |  2 +-
 .../syncope/client/lib/WebClientBuilder.java       | 53 ++++++++++++++++++++++
 common/keymaster/self/client-self/pom.xml          |  4 ++
 .../keymaster/client/self/SelfKeymasterOps.java    |  2 +
 12 files changed, 97 insertions(+), 45 deletions(-)

diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
index aaea9e5c87..43a9c9397d 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/pages/WA.java
@@ -29,7 +29,6 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.BookmarkablePageLinkBuilder;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.SyncopeWebApplication;
@@ -49,6 +48,7 @@ import 
org.apache.syncope.client.console.rest.AuthProfileRestClient;
 import org.apache.syncope.client.console.rest.WAConfigRestClient;
 import org.apache.syncope.client.console.rest.WASessionRestClient;
 import 
org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.lib.types.AMEntitlement;
@@ -128,12 +128,10 @@ public class WA extends BasePage {
         if (!instances.isEmpty()) {
             String actuatorEndpoint = 
StringUtils.appendIfMissing(instances.get(0).getAddress(), "/") + 
"actuator/env";
             try {
-                Response response = WebClient.create(
-                        actuatorEndpoint,
+                Response response = WebClientBuilder.build(actuatorEndpoint,
                         SyncopeWebApplication.get().getAnonymousUser(),
                         SyncopeWebApplication.get().getAnonymousKey(),
-                        null).
-                        accept(MediaType.APPLICATION_JSON_TYPE).get();
+                        
List.of()).accept(MediaType.APPLICATION_JSON_TYPE).get();
                 if (response.getStatus() == 
Response.Status.OK.getStatusCode()) {
                     JsonNode env = MAPPER.readTree((InputStream) 
response.getEntity());
                     if (env.has("propertySources")) {
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
index 60b3a4cbf2..9d188054c7 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/AMSessionRestClient.java
@@ -23,8 +23,8 @@ import 
com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import java.util.List;
-import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.client.ui.commons.rest.RestClient;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.lib.AMSession;
@@ -56,13 +56,13 @@ public abstract class AMSessionRestClient implements 
RestClient {
         SyncopeClientException sce = 
SyncopeClientException.build(ClientExceptionType.Unknown);
 
         try {
-            Response response = WebClient.create(
-                    getActuatorEndpoint(),
+            Response response = WebClientBuilder.build(getActuatorEndpoint(),
                     SyncopeWebApplication.get().getAnonymousUser(),
                     SyncopeWebApplication.get().getAnonymousKey(),
-                    null).
-                    path(key).
-                    
accept(MediaType.APPLICATION_JSON_TYPE).type(MediaType.APPLICATION_JSON_TYPE).delete();
+                    List.of()).
+                    accept(MediaType.APPLICATION_JSON_TYPE).
+                    type(MediaType.APPLICATION_JSON_TYPE).
+                    path(key).delete();
             if (response.getStatus() != Response.Status.OK.getStatusCode()
                     && response.getStatus() != 
Response.Status.NO_CONTENT.getStatusCode()) {
 
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
index 3d0341e109..81dcc44ad3 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRASessionRestClient.java
@@ -22,8 +22,8 @@ import jakarta.ws.rs.core.GenericType;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import java.util.List;
-import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.lib.AMSession;
 
@@ -43,15 +43,10 @@ public final class SRASessionRestClient extends 
AMSessionRestClient {
     @Override
     public List<AMSession> list() {
         try {
-            WebClient client = WebClient.create(
-                    getActuatorEndpoint(),
-                    JAX_RS_PROVIDERS,
+            Response response = WebClientBuilder.build(getActuatorEndpoint(),
                     SyncopeWebApplication.get().getAnonymousUser(),
                     SyncopeWebApplication.get().getAnonymousKey(),
-                    null).
-                    accept(MediaType.APPLICATION_JSON_TYPE);
-
-            Response response = client.get();
+                    
JAX_RS_PROVIDERS).accept(MediaType.APPLICATION_JSON_TYPE).get();
             if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                 return response.readEntity(new GenericType<>() {
                 });
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
index 9af194022c..6bb8896f36 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/SRAStatisticsRestClient.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,13 +44,10 @@ public final class SRAStatisticsRestClient {
 
     public SRAStatistics get(final List<NetworkService> instances, final 
List<Pair<String, String>> selected) {
         try {
-            WebClient client = WebClient.create(
-                    getActuatorEndpoint(instances),
-                    JAX_RS_PROVIDERS,
+            WebClient client = 
WebClientBuilder.build(getActuatorEndpoint(instances),
                     SyncopeWebApplication.get().getAnonymousUser(),
                     SyncopeWebApplication.get().getAnonymousKey(),
-                    null).
-                    accept(MediaType.APPLICATION_JSON_TYPE);
+                    JAX_RS_PROVIDERS).accept(MediaType.APPLICATION_JSON_TYPE);
 
             if (!selected.isEmpty()) {
                 client.query("tag", selected.stream().map(s -> s.getKey() + 
":" + s.getValue()).toArray());
diff --git 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
index 71b3f6817e..e1dbab7c48 100644
--- 
a/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
+++ 
b/client/am/console/src/main/java/org/apache/syncope/client/console/rest/WASessionRestClient.java
@@ -26,8 +26,8 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import java.io.InputStream;
 import java.util.List;
-import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.lib.AMSession;
 
@@ -50,12 +50,10 @@ public final class WASessionRestClient extends 
AMSessionRestClient {
     @Override
     public List<AMSession> list() {
         try {
-            Response response = WebClient.create(
-                    getActuatorEndpoint(),
+            Response response = WebClientBuilder.build(getActuatorEndpoint(),
                     SyncopeWebApplication.get().getAnonymousUser(),
                     SyncopeWebApplication.get().getAnonymousKey(),
-                    null).
-                    accept(MediaType.APPLICATION_JSON_TYPE).get();
+                    List.of()).accept(MediaType.APPLICATION_JSON_TYPE).get();
             if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                 JsonNode node = MAPPER.readTree((InputStream) 
response.getEntity());
                 if (node.has("activeSsoSessions")) {
diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index bc69f0bc1d..99623f8935 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -32,6 +32,7 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnIdBundle;
 import org.apache.syncope.common.lib.to.ConnIdObjectClass;
@@ -173,7 +174,8 @@ public class ConnectorRestClient extends BaseRestClient {
     public boolean check(final String coreAddress, final String domain, final 
String jwt, final String key)
             throws IOException {
 
-        WebClient client = WebClient.create(coreAddress).path("connectors").
+        WebClient client = WebClientBuilder.build(coreAddress).
+                path("connectors").
                 accept(MediaType.APPLICATION_JSON_TYPE).
                 type(MediaType.APPLICATION_JSON_TYPE).
                 header(RESTHeaders.DOMAIN, domain).
diff --git 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index abd44b179a..c2db75abde 100644
--- 
a/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ 
b/client/idm/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -29,6 +29,7 @@ import java.util.List;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.common.lib.to.ConnObject;
 import org.apache.syncope.common.lib.to.PagedConnObjectResult;
 import org.apache.syncope.common.lib.to.ResourceTO;
@@ -47,7 +48,8 @@ public class ResourceRestClient extends BaseRestClient {
     public boolean check(final String coreAddress, final String domain, final 
String jwt, final String key)
             throws IOException {
 
-        WebClient client = WebClient.create(coreAddress).path("resources").
+        WebClient client = WebClientBuilder.build(coreAddress).
+                path("resources").
                 accept(MediaType.APPLICATION_JSON_TYPE).
                 type(MediaType.APPLICATION_JSON_TYPE).
                 header(RESTHeaders.DOMAIN, domain).
diff --git 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java
 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java
index 38c0d68e10..00f108b25e 100644
--- 
a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java
+++ 
b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/rest/LoggerConfRestClient.java
@@ -30,8 +30,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.syncope.client.console.SyncopeWebApplication;
+import org.apache.syncope.client.lib.WebClientBuilder;
 import org.apache.syncope.client.ui.commons.rest.RestClient;
 import org.apache.syncope.common.keymaster.client.api.model.Domain;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
@@ -67,22 +67,15 @@ public class LoggerConfRestClient implements RestClient, 
LoggerConfOp {
         return address + "actuator/loggers";
     }
 
-    protected WebClient webClient(final NetworkService instance) {
-        return WebClient.create(
-                getActuatorEndpoint(instance),
-                SyncopeWebApplication.get().getAnonymousUser(),
-                SyncopeWebApplication.get().getAnonymousKey(),
-                null).
-                accept(MediaType.APPLICATION_JSON_TYPE).
-                type(MediaType.APPLICATION_JSON_TYPE);
-    }
-
     @Override
     public List<LoggerConf> list() {
         List<LoggerConf> loggerConfs = new ArrayList<>();
 
         try {
-            Response response = webClient(instances.get(0)).get();
+            Response response = 
WebClientBuilder.build(getActuatorEndpoint(instances.get(0)),
+                    SyncopeWebApplication.get().getAnonymousUser(),
+                    SyncopeWebApplication.get().getAnonymousKey(),
+                    List.of()).accept(MediaType.APPLICATION_JSON_TYPE).get();
             if (response.getStatus() == Response.Status.OK.getStatusCode()) {
                 JsonNode node = MAPPER.readTree((InputStream) 
response.getEntity());
                 if (node.has("loggers")) {
@@ -114,6 +107,13 @@ public class LoggerConfRestClient implements RestClient, 
LoggerConfOp {
 
     @Override
     public void setLevel(final String key, final LogLevel level) {
-        instances.forEach(i -> 
webClient(i).path(key).post("{\"configuredLevel\": \"" + level.name() + "\"}"));
+        instances.forEach(i -> WebClientBuilder.build(getActuatorEndpoint(i),
+                        SyncopeWebApplication.get().getAnonymousUser(),
+                        SyncopeWebApplication.get().getAnonymousKey(),
+                        List.of())
+                .accept(MediaType.APPLICATION_JSON_TYPE)
+                .type(MediaType.APPLICATION_JSON_TYPE)
+                .path(key)
+                .post("{\"configuredLevel\": \"" + level.name() + "\"}"));
     }
 }
diff --git 
a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeAnonymousClient.java
 
b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeAnonymousClient.java
index 74acf7c22a..cb2febbd4e 100644
--- 
a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeAnonymousClient.java
+++ 
b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/SyncopeAnonymousClient.java
@@ -60,7 +60,7 @@ public class SyncopeAnonymousClient extends SyncopeClient {
     }
 
     public JsonNode info() throws IOException {
-        WebClient webClient = WebClient.create(
+        WebClient webClient = WebClientBuilder.build(
                 
StringUtils.removeEnd(restClientFactory.getAddress().replace("/rest", 
"/actuator/info"), "/")).
                 accept(MediaType.APPLICATION_JSON_TYPE).
                 header(RESTHeaders.DOMAIN, getDomain()).
diff --git 
a/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/WebClientBuilder.java
 
b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/WebClientBuilder.java
new file mode 100644
index 0000000000..003a467134
--- /dev/null
+++ 
b/client/idrepo/lib/src/main/java/org/apache/syncope/client/lib/WebClientBuilder.java
@@ -0,0 +1,53 @@
+/*
+ * 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.syncope.client.lib;
+
+import java.net.URI;
+import java.util.List;
+import org.apache.cxf.jaxrs.client.ClientConfiguration;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit;
+
+public final class WebClientBuilder {
+
+    private WebClientBuilder() {
+    }
+
+    public static WebClient build(final String address,
+            final String username,
+            final String password,
+            final List<?> providers) {
+        return setAsync(WebClient.create(address, providers, username, 
password, null));
+    }
+
+    public static WebClient build(final String address) {
+        return setAsync(WebClient.create(address));
+    }
+
+    public static WebClient build(final URI uri) {
+        return setAsync(WebClient.create(uri));
+    }
+
+    protected static WebClient setAsync(final WebClient webClient) {
+        ClientConfiguration config = WebClient.getConfig(webClient);
+        config.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, 
Boolean.TRUE);
+
+        return webClient;
+    }
+}
diff --git a/common/keymaster/self/client-self/pom.xml 
b/common/keymaster/self/client-self/pom.xml
index 21c0cdaac1..bd07a65755 100644
--- a/common/keymaster/self/client-self/pom.xml
+++ b/common/keymaster/self/client-self/pom.xml
@@ -58,6 +58,10 @@ under the License.
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-features-logging</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-rt-transports-http-hc</artifactId>
+    </dependency>
 
     <dependency>
       <groupId>com.fasterxml.jackson.jakarta.rs</groupId>
diff --git 
a/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterOps.java
 
b/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterOps.java
index 6cc5ec259b..8b98c77e90 100644
--- 
a/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterOps.java
+++ 
b/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterOps.java
@@ -31,6 +31,7 @@ import org.apache.cxf.jaxrs.client.WebClient;
 import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
 import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor;
 import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit;
 import org.apache.cxf.transports.http.configuration.ConnectionType;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 
@@ -66,6 +67,7 @@ abstract class SelfKeymasterOps {
             
client.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON);
 
             ClientConfiguration config = WebClient.getConfig(client);
+            config.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, 
Boolean.TRUE);
             config.getInInterceptors().add(new GZIPInInterceptor());
             config.getOutInterceptors().add(new GZIPOutInterceptor());
 

Reply via email to