From cfaefa58e6acc8b7e180a8d693500d3c2e5de96c Mon Sep 17 00:00:00 2001 From: Tanmay Singh Date: Thu, 24 Jul 2025 13:50:53 -0400 Subject: [PATCH 1/4] Add builder extension docs to Java custom code --- .../sdks/overview/java/custom-code.mdx | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/fern/products/sdks/overview/java/custom-code.mdx b/fern/products/sdks/overview/java/custom-code.mdx index 71b1eac46..33b70aa65 100644 --- a/fern/products/sdks/overview/java/custom-code.mdx +++ b/fern/products/sdks/overview/java/custom-code.mdx @@ -104,6 +104,45 @@ description: Augment your Java SDK with custom utilities +## Extending builders + +For advanced use cases requiring request transformation or dynamic configuration, you can extend the generated builder classes. + + + +### Override buildClientOptions() to transform configuration + +```java title="src/main/java/com/example/CustomClientBuilder.java" +public class CustomClientBuilder extends BaseClientBuilder { + @Override + protected ClientOptions buildClientOptions() { + ClientOptions base = super.buildClientOptions(); + + // Transform configuration as needed + String transformedUrl = transformEnvironmentVariables( + base.environment().getUrl() + ); + + return ClientOptions.builder() + .from(base) + .environment(Environment.custom(transformedUrl)) + .build(); + } +} +``` + +### Update .fernignore + +```diff title=".fernignore" ++ src/main/java/com/example/CustomClientBuilder.java +``` + + + + +For authentication customization, override the `build()` method instead of `buildClientOptions()`. + + ## Adding custom dependencies From 52e349f28e08d42c8247cb0e5b989aa0a6f67146 Mon Sep 17 00:00:00 2001 From: Tanmay Singh Date: Thu, 24 Jul 2025 14:19:18 -0400 Subject: [PATCH 2/4] Apply suggestions from code review Co-authored-by: Devin Logan --- fern/products/sdks/overview/java/custom-code.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fern/products/sdks/overview/java/custom-code.mdx b/fern/products/sdks/overview/java/custom-code.mdx index 33b70aa65..e01506c91 100644 --- a/fern/products/sdks/overview/java/custom-code.mdx +++ b/fern/products/sdks/overview/java/custom-code.mdx @@ -110,9 +110,9 @@ For advanced use cases requiring request transformation or dynamic configuration -### Override buildClientOptions() to transform configuration +### Override `buildClientOptions()` to transform configuration -```java title="src/main/java/com/example/CustomClientBuilder.java" +```java title="src/main/java/com/example/CustomClientBuilder.java" {5} public class CustomClientBuilder extends BaseClientBuilder { @Override protected ClientOptions buildClientOptions() { @@ -131,7 +131,7 @@ public class CustomClientBuilder extends BaseClientBuilder { } ``` -### Update .fernignore +### Update `.fernignore` ```diff title=".fernignore" + src/main/java/com/example/CustomClientBuilder.java From 2bd5379df45038a77ffc15a2acfb55407b643fbe Mon Sep 17 00:00:00 2001 From: Tanmay Singh Date: Thu, 24 Jul 2025 14:25:45 -0400 Subject: [PATCH 3/4] Add builder extension docs to Java custom code --- fern/products/sdks/overview/java/custom-code.mdx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/fern/products/sdks/overview/java/custom-code.mdx b/fern/products/sdks/overview/java/custom-code.mdx index e01506c91..1d5877ecf 100644 --- a/fern/products/sdks/overview/java/custom-code.mdx +++ b/fern/products/sdks/overview/java/custom-code.mdx @@ -131,6 +131,18 @@ public class CustomClientBuilder extends BaseClientBuilder { } ``` +### For authentication, override `build()` instead + +```java +@Override +public CustomClient build() { + if (customAuth != null) { + this.addHeader("Authorization", customAuth); + } + return new CustomClient(buildClientOptions()); +} +``` + ### Update `.fernignore` ```diff title=".fernignore" @@ -139,10 +151,6 @@ public class CustomClientBuilder extends BaseClientBuilder { - -For authentication customization, override the `build()` method instead of `buildClientOptions()`. - - ## Adding custom dependencies From 847bede43da633a6eca200a45fd365644f77c592 Mon Sep 17 00:00:00 2001 From: Tanmay Singh Date: Thu, 24 Jul 2025 14:59:50 -0400 Subject: [PATCH 4/4] make it more verbose --- .../sdks/overview/java/custom-code.mdx | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/fern/products/sdks/overview/java/custom-code.mdx b/fern/products/sdks/overview/java/custom-code.mdx index 1d5877ecf..1531a8c41 100644 --- a/fern/products/sdks/overview/java/custom-code.mdx +++ b/fern/products/sdks/overview/java/custom-code.mdx @@ -104,16 +104,50 @@ description: Augment your Java SDK with custom utilities -## Extending builders +## Adding custom client configuration -For advanced use cases requiring request transformation or dynamic configuration, you can extend the generated builder classes. +When you need to intercept and transform client configuration before the SDK client is created, you can extend the generated builder classes. This allows you to add custom code and logic during the client initialization process. + +Common use cases include: +- **Dynamic URL construction**: Replace placeholders with runtime values (e.g., `https://api.${DEV_NAMESPACE}.example.com`) +- **Custom authentication**: Implement complex auth flows beyond basic token authentication +- **Request transformation**: Add custom headers or modify requests globally -### Override `buildClientOptions()` to transform configuration +### Create a custom client that extends the base client + +This client will serve as the entry point for your customized SDK. + +```java title="src/main/java/com/example/MyClient.java" +package com.example; + +import com.example.client.BaseClient; +import com.example.client.ClientOptions; + +public class MyClient extends BaseClient { + public MyClient(ClientOptions clientOptions) { + super(clientOptions); + } + + public static MyClientBuilder builder() { + return new MyClientBuilder(); + } +} +``` + +### Create a custom builder with your transformation logic + +Override the `buildClientOptions()` method to intercept and modify the configuration before the client is created. + +```java title="src/main/java/com/example/MyClientBuilder.java" {10} +package com.example; -```java title="src/main/java/com/example/CustomClientBuilder.java" {5} -public class CustomClientBuilder extends BaseClientBuilder { +import com.example.client.BaseClient.BaseClientBuilder; +import com.example.client.ClientOptions; +import com.example.environment.Environment; + +public class MyClientBuilder extends BaseClientBuilder { @Override protected ClientOptions buildClientOptions() { ClientOptions base = super.buildClientOptions(); @@ -131,22 +165,13 @@ public class CustomClientBuilder extends BaseClientBuilder { } ``` -### For authentication, override `build()` instead - -```java -@Override -public CustomClient build() { - if (customAuth != null) { - this.addHeader("Authorization", customAuth); - } - return new CustomClient(buildClientOptions()); -} -``` - ### Update `.fernignore` +Add the `MyClient.java` and `MyClientBuilder.java` to `.fernignore`. + ```diff title=".fernignore" -+ src/main/java/com/example/CustomClientBuilder.java ++ src/main/java/com/example/MyClient.java ++ src/main/java/com/example/MyClientBuilder.java ```