From b6d3c20fe17b2ad57491c64ba97db1ed3f4a31e2 Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Wed, 12 Jun 2024 16:40:47 +0200
Subject: [PATCH] Split constructor code from factory code of ScimClient

---
 .../java/sh/libre/scim/core/ScimClient.java   | 98 +++++++++----------
 .../sh/libre/scim/core/ScimDispatcher.java    |  2 +-
 2 files changed, 49 insertions(+), 51 deletions(-)

diff --git a/src/main/java/sh/libre/scim/core/ScimClient.java b/src/main/java/sh/libre/scim/core/ScimClient.java
index 99f992b..bb3655a 100644
--- a/src/main/java/sh/libre/scim/core/ScimClient.java
+++ b/src/main/java/sh/libre/scim/core/ScimClient.java
@@ -23,74 +23,72 @@ import org.keycloak.models.RoleMapperModel;
 import org.keycloak.storage.user.SynchronizationResult;
 import sh.libre.scim.jpa.ScimResource;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
 
 public class ScimClient {
-    protected final Logger LOGGER = Logger.getLogger(ScimClient.class);
-    protected final ScimRequestBuilder scimRequestBuilder;
-    protected final RetryRegistry registry;
-    protected final KeycloakSession session;
-    protected final String contentType;
-    protected final ComponentModel model;
-    protected final String scimApplicationBaseUrl;
-    protected final Map<String, String> defaultHeaders;
-    protected final Map<String, String> expectedResponseHeaders;
-
-    public ScimClient(ComponentModel model, KeycloakSession session) {
-        this.model = model;
-        this.contentType = model.get("content-type");
-        this.session = session;
-        this.scimApplicationBaseUrl = model.get("endpoint");
-        this.defaultHeaders = new HashMap<>();
-        this.expectedResponseHeaders = new HashMap<>();
-
-        switch (model.get("auth-mode")) {
-            case "BEARER":
-                defaultHeaders.put(HttpHeaders.AUTHORIZATION,
-                        BearerAuthentication());
-                break;
-            case "BASIC_AUTH":
-                defaultHeaders.put(HttpHeaders.AUTHORIZATION,
-                        BasicAuthentication());
-                break;
-        }
 
-        defaultHeaders.put(HttpHeaders.CONTENT_TYPE, contentType);
+    private static final Logger LOGGER = Logger.getLogger(ScimClient.class);
 
-        scimRequestBuilder = new ScimRequestBuilder(scimApplicationBaseUrl, genScimClientConfig());
+    private final ScimRequestBuilder scimRequestBuilder;
 
-        RetryConfig retryConfig = RetryConfig.custom()
-                .maxAttempts(10)
-                .intervalFunction(IntervalFunction.ofExponentialBackoff())
-                .retryExceptions(ProcessingException.class)
-                .build();
+    private final RetryRegistry registry;
 
-        registry = RetryRegistry.of(retryConfig);
-    }
+    private final KeycloakSession session;
 
-    protected String BasicAuthentication() {
-        return BasicAuth.builder()
-                .username(model.get("auth-user"))
-                .password(model.get("auth-pass"))
-                .build()
-                .getAuthorizationHeaderValue();
+    private final ComponentModel model;
+
+    private ScimClient(ScimRequestBuilder scimRequestBuilder, RetryRegistry registry, KeycloakSession session, ComponentModel model) {
+        this.scimRequestBuilder = scimRequestBuilder;
+        this.registry = registry;
+        this.session = session;
+        this.model = model;
     }
 
-    protected ScimClientConfig genScimClientConfig() {
-        return ScimClientConfig.builder()
-                .httpHeaders(defaultHeaders)
+    public static ScimClient newScimClient(ComponentModel model, KeycloakSession session) {
+        String authMode = model.get("auth-mode");
+        String authorizationHeaderValue = switch (authMode) {
+            case "BEARER" -> "Bearer " + model.get("auth-pass");
+            case "BASIC_AUTH" -> {
+                BasicAuth basicAuth = BasicAuth.builder()
+                        .username(model.get("auth-user"))
+                        .password(model.get("auth-pass"))
+                        .build();
+                yield basicAuth.getAuthorizationHeaderValue();
+            }
+            default -> throw new IllegalArgumentException("authMode " + authMode + " is not supported");
+        };
+
+        Map<String, String> httpHeaders = new HashMap<>();
+        httpHeaders.put(HttpHeaders.AUTHORIZATION, authorizationHeaderValue);
+        httpHeaders.put(HttpHeaders.CONTENT_TYPE, model.get("content-type"));
+
+        ScimClientConfig scimClientConfig = ScimClientConfig.builder()
+                .httpHeaders(httpHeaders)
                 .connectTimeout(5)
                 .requestTimeout(5)
                 .socketTimeout(5)
-                .expectedHttpResponseHeaders(expectedResponseHeaders)
+                .expectedHttpResponseHeaders(Collections.emptyMap()) // strange, useful?
                 .hostnameVerifier((s, sslSession) -> true)
                 .build();
-    }
 
-    protected String BearerAuthentication() {
-        return "Bearer " + model.get("auth-pass");
+        String scimApplicationBaseUrl = model.get("endpoint");
+        ScimRequestBuilder scimRequestBuilder =
+                new ScimRequestBuilder(
+                        scimApplicationBaseUrl,
+                        scimClientConfig
+                );
+
+        RetryConfig retryConfig = RetryConfig.custom()
+                .maxAttempts(10)
+                .intervalFunction(IntervalFunction.ofExponentialBackoff())
+                .retryExceptions(ProcessingException.class)
+                .build();
+
+        RetryRegistry retryRegistry = RetryRegistry.of(retryConfig);
+        return new ScimClient(scimRequestBuilder, retryRegistry, session, model);
     }
 
     protected EntityManager getEM() {
diff --git a/src/main/java/sh/libre/scim/core/ScimDispatcher.java b/src/main/java/sh/libre/scim/core/ScimDispatcher.java
index 98437c1..bf7757d 100644
--- a/src/main/java/sh/libre/scim/core/ScimDispatcher.java
+++ b/src/main/java/sh/libre/scim/core/ScimDispatcher.java
@@ -33,7 +33,7 @@ public class ScimDispatcher {
 
     public void runOne(ComponentModel m, Consumer<ScimClient> f) {
         LOGGER.infof("%s %s %s %s", m.getId(), m.getName(), m.getProviderId(), m.getProviderType());
-        ScimClient client = new ScimClient(m, session);
+        ScimClient client = ScimClient.newScimClient(m, session);
         try {
             f.accept(client);
         } catch (Exception e) {
-- 
GitLab