diff --git a/resources/sdk/purecloudjava/extensions/hooksmanager/HookManager.java b/resources/sdk/purecloudjava/extensions/hooksmanager/HookManager.java new file mode 100644 index 00000000..115487b6 --- /dev/null +++ b/resources/sdk/purecloudjava/extensions/hooksmanager/HookManager.java @@ -0,0 +1,43 @@ +package com.mypurecloud.sdk.v2.hooksmanager; + +import java.util.List; +import java.util.ArrayList; +import java.util.Collections; + +public class HookManager { + private List preRequestHooks; + private List postResponseHooks; + + public HookManager() { + this.preRequestHooks = new ArrayList<>(); + this.postResponseHooks = new ArrayList<>(); + } + + public List getPreRequestHooks() { + return Collections.unmodifiableList(preRequestHooks); + } + + public List getPostResponseHooks() { + return Collections.unmodifiableList(postResponseHooks); + } + + public void addPreRequestHook(PreRequestHook hook) { + if (hook != null) { + this.preRequestHooks.add(hook); + } + } + + public void removePreRequestHook(PreRequestHook hook) { + this.preRequestHooks.remove(hook); + } + + public void addPostResponseHook(PostResponseHook hook) { + if (hook != null) { + this.postResponseHooks.add(hook); + } + } + + public void removePostResponseHook(PostResponseHook hook) { + this.postResponseHooks.remove(hook); + } +} \ No newline at end of file diff --git a/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPostResponseHook.java b/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPostResponseHook.java new file mode 100644 index 00000000..494ea996 --- /dev/null +++ b/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPostResponseHook.java @@ -0,0 +1,12 @@ +package com.mypurecloud.sdk.v2.hooksmanager; +import com.mypurecloud.sdk.v2.ApiResponse; +import com.mypurecloud.sdk.v2.ApiException; + +public class LoggingPostResponseHook implements PostResponseHook { + @Override + public ApiResponse execute(ApiResponse response) throws ApiException { + System.out.println("Post-response hook - Status: " + response.getStatusCode()); + System.out.println("Post-response hook - CorrelationId: " + response.getCorrelationId()); + return response; + } +} \ No newline at end of file diff --git a/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPreRequestHook.java b/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPreRequestHook.java new file mode 100644 index 00000000..d4d359e7 --- /dev/null +++ b/resources/sdk/purecloudjava/extensions/hooksmanager/LoggingPreRequestHook.java @@ -0,0 +1,12 @@ +package com.mypurecloud.sdk.v2.hooksmanager; +import com.mypurecloud.sdk.v2.connector.ApiClientConnectorRequest; +import com.mypurecloud.sdk.v2.ApiException; + +public class LoggingPreRequestHook implements PreRequestHook { + @Override + public ApiClientConnectorRequest execute(ApiClientConnectorRequest request) throws ApiException { + System.out.println("Pre-request hook - Method: " + request.getMethod()); + System.out.println("Pre-request hook - URL: " + request.getUrl()); + return request; + } +} \ No newline at end of file diff --git a/resources/sdk/purecloudjava/extensions/hooksmanager/PostResponseHook.java b/resources/sdk/purecloudjava/extensions/hooksmanager/PostResponseHook.java new file mode 100644 index 00000000..34c9eda0 --- /dev/null +++ b/resources/sdk/purecloudjava/extensions/hooksmanager/PostResponseHook.java @@ -0,0 +1,7 @@ +package com.mypurecloud.sdk.v2.hooksmanager; +import com.mypurecloud.sdk.v2.ApiResponse; +import com.mypurecloud.sdk.v2.ApiException; + +public interface PostResponseHook { + ApiResponse execute(ApiResponse response) throws ApiException; +} \ No newline at end of file diff --git a/resources/sdk/purecloudjava/extensions/hooksmanager/PreRequestHook.java b/resources/sdk/purecloudjava/extensions/hooksmanager/PreRequestHook.java new file mode 100644 index 00000000..c6617fdc --- /dev/null +++ b/resources/sdk/purecloudjava/extensions/hooksmanager/PreRequestHook.java @@ -0,0 +1,7 @@ +package com.mypurecloud.sdk.v2.hooksmanager; +import com.mypurecloud.sdk.v2.connector.ApiClientConnectorRequest; +import com.mypurecloud.sdk.v2.ApiException; + +public interface PreRequestHook { + ApiClientConnectorRequest execute(ApiClientConnectorRequest request) throws ApiException; +} \ No newline at end of file diff --git a/resources/sdk/purecloudjava/templates/ApiClient.mustache b/resources/sdk/purecloudjava/templates/ApiClient.mustache index 54219818..4710228b 100644 --- a/resources/sdk/purecloudjava/templates/ApiClient.mustache +++ b/resources/sdk/purecloudjava/templates/ApiClient.mustache @@ -47,6 +47,12 @@ import {{invokerPackage}}.extensions.AuthResponse; import {{invokerPackage}}.Logger; import {{invokerPackage}}.extensions.LocalDateSerializer; +import {{invokerPackage}}.hooksmanager.HookManager; +import {{invokerPackage}}.hooksmanager.LoggingPostResponseHook; +import {{invokerPackage}}.hooksmanager.LoggingPreRequestHook; +import {{invokerPackage}}.hooksmanager.PostResponseHook; +import {{invokerPackage}}.hooksmanager.PreRequestHook; + public class ApiClient implements AutoCloseable { private static final String DEFAULT_BASE_PATH = "{{basePath}}"; private static final String DEFAULT_USER_AGENT = "{{#httpUserAgent}}{{.}}{{/httpUserAgent}}{{^httpUserAgent}}Swagger-Codegen{{/httpUserAgent}}/java"; @@ -89,6 +95,9 @@ public class ApiClient implements AutoCloseable { private String configFilePath; private Boolean autoReloadConfig; + // prehook/posthook declarations + private final HookManager hookManager; + public ApiClient() { this(Builder.standard()); } @@ -100,6 +109,8 @@ public class ApiClient implements AutoCloseable { } this.basePath = basePath; + this.hookManager = new HookManager(); + RetryConfiguration retryConfig = builder.retryConfiguration; if (retryConfig == null) { retryConfig = DEFAULT_RETRY_CONFIG; @@ -283,6 +294,17 @@ public class ApiClient implements AutoCloseable { this.gatewayConfiguration = new GatewayConfiguration(host, protocol, port, pathParamsLogin, pathParamsApi); } + /** + * Methods to set the hooks + */ + public void addPreRequestHook(PreRequestHook hook) { + hookManager.addPreRequestHook(hook); + } + + public void addPostResponseHook(PostResponseHook hook) { + hookManager.addPostResponseHook(hook); + } + /** * Helper method to set access token for the first OAuth2 authentication. */ @@ -878,6 +900,12 @@ public class ApiClient implements AutoCloseable { ApiClientConnectorRequest connectorRequest = prepareConnectorRequest(request, isAuthRequest); ApiClientConnectorResponse connectorResponse = null; Map requestHeaderCopy = new HashMap<>(connectorRequest.getHeaders()); + + // Execute pre-request hooks + for (PreRequestHook hook : hookManager.getPreRequestHooks()) { + connectorRequest = hook.execute(connectorRequest); + } + try { Retry retry = new Retry(retryConfiguration); do { @@ -888,7 +916,14 @@ public class ApiClient implements AutoCloseable { logger.trace(connectorRequest.getMethod(), connectorRequest.getUrl(), connectorRequest.readBody(), connectorResponse.getStatusCode(), requestHeaderCopy, responseHeaderCopy); } while (retry.shouldRetry(connectorResponse)); try { - return interpretConnectorResponse(connectorResponse, returnType); + ApiResponse response = interpretConnectorResponse(connectorResponse, returnType); + + // Execute post-response hooks + for (PostResponseHook hook : hookManager.getPostResponseHooks()) { + response = hook.execute(response); + } + + return response; } catch (ApiException e) { if (e.getStatusCode() == 401 && shouldRefreshAccessToken) { handleExpiredAccessToken(); diff --git a/resources/sdk/purecloudjava/tests/SdkTests.java b/resources/sdk/purecloudjava/tests/SdkTests.java index 426b70d7..31e0100e 100644 --- a/resources/sdk/purecloudjava/tests/SdkTests.java +++ b/resources/sdk/purecloudjava/tests/SdkTests.java @@ -8,6 +8,8 @@ import com.mypurecloud.sdk.v2.connector.okhttp.OkHttpClientConnectorProvider; import com.mypurecloud.sdk.v2.extensions.AuthResponse; import com.mypurecloud.sdk.v2.extensions.notifications.NotificationHandler; +import com.mypurecloud.sdk.v2.hooksmanager.PostResponseHook; +import com.mypurecloud.sdk.v2.hooksmanager.PreRequestHook; import com.mypurecloud.sdk.v2.model.*; import org.testng.Assert; import org.testng.annotations.AfterTest; @@ -248,6 +250,44 @@ public void testObjectMapperIgnoresUnknownProperties() { } @Test(priority = 9) + public void testPreAndPostHooks() { + try { + // Create hook implementations + PreRequestHook preHook = request -> { + System.out.println("Pre-request hook - Method: " + request.getMethod()); + System.out.println("Pre-request hook - URL: " + request.getUrl()); + return request; + }; + + PostResponseHook postHook = new PostResponseHook() { + @Override + public ApiResponse execute(ApiResponse response) throws ApiException { + System.out.println("Post-hook executed. Status code: " + response.getStatusCode()); + return response; + } + }; + + apiClient.addPreRequestHook(preHook); + apiClient.addPostResponseHook(postHook); + + User user = usersApi.getUser(userId, Collections.singletonList("profileSkills"), null, null); + + Assert.assertEquals(user.getId(), userId); + Assert.assertEquals(user.getName(), userName); + Assert.assertEquals(user.getEmail(), userEmail); + Assert.assertEquals(user.getDepartment(), userDepartment); + + + } catch (ApiException ex) { + handleApiException(ex); + } catch (Exception ex) { + System.out.println(ex); + Assert.fail(); + } + } + + + @Test(priority = 10) public void deleteUser() { try { usersApi.deleteUser(userId); @@ -260,7 +300,6 @@ public void deleteUser() { } - @AfterTest public void afterTest() { System.out.println("After test");