Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(feat, java): add timeout to request options #2973

Merged
merged 6 commits into from
Feb 17, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions generators/java/sdk/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.8.1] - 2024-02-14
- Feature: The RequestOptions object now supports configuring an optional timeout to apply per-request.
```java
RequestOptions ro = RequestOptions.builder().timeout(90).build(); // Creates a timeout of 90 seconds for the request
// You could also specify the timeunit, similar to as if you were using OkHttp directly
// RequestOptions ro = RequestOptions.builder().timeout(2, TimeUnit.MINUTES).build();
client.films.list(ro);
```


## [0.8.0] - 2024-02-11
- Feature: The SDK generator now supports whitelabelling. When this is turned on,
there will be no mention of Fern in the generated code.
Expand Down
2 changes: 1 addition & 1 deletion generators/java/sdk/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Apple Silicon: FROM bitnami/gradle:latest
FROM bitnami/gradle:8.5.0
FROM bitnami/gradle:latest

COPY build/distributions/sdk.tar init.sh /
RUN cd / \
Expand Down
2 changes: 1 addition & 1 deletion generators/java/sdk/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.8.0
0.8.1
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,19 @@
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.ParameterizedTypeName;
import com.squareup.javapoet.TypeName;
import com.squareup.javapoet.TypeSpec;

import java.lang.reflect.Field;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.lang.model.element.Modifier;

Expand All @@ -51,6 +57,16 @@ public final class RequestOptionsGenerator extends AbstractFileGenerator {
Modifier.FINAL)
.build();

private static final FieldSpec.Builder TIMEOUT_FIELD_BUILDER = FieldSpec.builder(
ParameterizedTypeName.get(ClassName.get(Optional.class), TypeName.get(Integer.class)),
"timeout",
Modifier.PRIVATE);

private static final FieldSpec.Builder TIMEOUT_TIME_UNIT_FIELD_BUILDER = FieldSpec.builder(
ParameterizedTypeName.get(TimeUnit.class),
"timeoutTimeUnit",
Modifier.PRIVATE);

private final List<HttpHeader> additionalHeaders;
private final ClassName builderClassName;

Expand Down Expand Up @@ -100,6 +116,45 @@ public GeneratedJavaFile generateFile() {
fields.add(headerHandler.visitHeader(httpHeader));
}

// Add in the other (static) fields for request options
createRequestOptionField(
"getTimeout",
TIMEOUT_FIELD_BUILDER,
"null",
requestOptionsTypeSpec,
builderTypeSpec,
fields
);
createRequestOptionField(
"getTimeoutTimeUnit",
TIMEOUT_TIME_UNIT_FIELD_BUILDER,
"TimeUnit.SECONDS",
requestOptionsTypeSpec,
builderTypeSpec,
fields
);

FieldSpec timeoutField = TIMEOUT_FIELD_BUILDER.build();
FieldSpec timeUnitField = TIMEOUT_TIME_UNIT_FIELD_BUILDER.build();
builderTypeSpec.addMethod(MethodSpec.methodBuilder(timeoutField.name)
.addModifiers(Modifier.PUBLIC)
.addParameter(Integer.class, timeoutField.name)
.addStatement("this.$L = Optional.of($L)", timeoutField.name, timeoutField.name)
.addStatement("return this")
.returns(builderClassName)
.build());

builderTypeSpec.addMethod(MethodSpec.methodBuilder(timeoutField.name)
.addModifiers(Modifier.PUBLIC)
.addParameter(Integer.class, timeoutField.name)
.addParameter(timeUnitField.type, timeUnitField.name)
.addStatement("this.$L = Optional.of($L)", timeoutField.name, timeoutField.name)
.addStatement("this.$L = $L", timeUnitField.name, timeUnitField.name)
.addStatement("return this")
.returns(builderClassName)
.build());


String constructorArgs =
fields.stream().map(field -> field.builderField.name).collect(Collectors.joining(", "));
builderTypeSpec.addMethod(MethodSpec.methodBuilder("build")
Expand All @@ -111,8 +166,8 @@ public GeneratedJavaFile generateFile() {
MethodSpec.Builder constructorBuilder = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PRIVATE)
.addParameters(fields.stream()
.map(authSchemeFields -> ParameterSpec.builder(
authSchemeFields.builderField.type, authSchemeFields.builderField.name)
.map(field -> ParameterSpec.builder(
field.builderField.type, field.builderField.name)
.build())
.collect(Collectors.toList()));
for (RequestOption requestOption : fields) {
Expand All @@ -133,6 +188,7 @@ public GeneratedJavaFile generateFile() {
.build());
requestOptionsTypeSpec.addType(builderTypeSpec.build());


JavaFile requestOptionsFile = JavaFile.builder(className.packageName(), requestOptionsTypeSpec.build())
.build();
return GeneratedJavaFile.builder()
Expand All @@ -141,6 +197,37 @@ public GeneratedJavaFile generateFile() {
.build();
}

private void createRequestOptionField(
String getterFunctionName,
FieldSpec.Builder fieldSpecBuilder,
String initializer,
TypeSpec.Builder requestOptionsTypeSpec,
TypeSpec.Builder builderTypeSpec,
List<RequestOption> fields
) {
FieldSpec field = fieldSpecBuilder.build();
requestOptionsTypeSpec.addField(fieldSpecBuilder
.addModifiers(Modifier.FINAL)
.build());
fields.add(new RequestOption(
fieldSpecBuilder
.initializer(initializer)
.build(),
field
));
FieldSpec builderField = FieldSpec.builder(
field.type, field.name, Modifier.PRIVATE)
.initializer(initializer)
.build();
builderTypeSpec.addField(builderField);

requestOptionsTypeSpec.addMethod(MethodSpec.methodBuilder(getterFunctionName)
.addModifiers(Modifier.PUBLIC)
.addStatement("return $N", field.name)
.returns(field.type)
.build());
}

private static class RequestOption {
private final FieldSpec builderField;
private final FieldSpec requestOptionsField;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.lang.model.element.Modifier;

import okhttp3.OkHttpClient;
import okhttp3.Response;

public abstract class AbstractEndpointWriter {
Expand Down Expand Up @@ -275,14 +277,30 @@ public abstract CodeBlock getInitializeRequestCodeBlock(
boolean sendContentType);

public final CodeBlock getResponseParserCodeBlock() {
String defaultedClientName = "client";
CodeBlock.Builder httpResponseBuilder = CodeBlock.builder()
.beginControlFlow("try")
// Default the request client
.addStatement(
"$T $L = $N.$N()",
OkHttpClient.class,
defaultedClientName,
clientOptionsField,
generatedClientOptions.httpClient())
.beginControlFlow("if ($L.getTimeout().isPresent())", REQUEST_OPTIONS_PARAMETER_NAME)
// Set the client's readTimeout if requestOptions overrides it has one
.addStatement(
"$T $L = $N.$N().newCall($L).execute()",
"$L = $L.newBuilder().readTimeout($N.getTimeout().get(), $N.getTimeoutTimeUnit()).build()",
defaultedClientName,
defaultedClientName,
REQUEST_OPTIONS_PARAMETER_NAME,
REQUEST_OPTIONS_PARAMETER_NAME)
.endControlFlow()
.addStatement(
"$T $L = $N.newCall($L).execute()",
Response.class,
getResponseName(),
clientOptionsField,
generatedClientOptions.httpClient(),
defaultedClientName,
getOkhttpRequestName())
.beginControlFlow("if ($L.isSuccessful())", getResponseName());
if (httpEndpoint.getResponse().isPresent()) {
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions seed/java-sdk/alias/gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 10 additions & 10 deletions seed/java-sdk/api-wide-base-path/gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading