Skip to content

Commit

Permalink
(feat, java): add timeout to request options (#2973)
Browse files Browse the repository at this point in the history
* add timeout

* cr and run seed

* remove star import

* bump and make a changelog

* cr

* update optionality
  • Loading branch information
armandobelardo authored Feb 17, 2024
1 parent b8eb829 commit a84c850
Show file tree
Hide file tree
Showing 260 changed files with 6,019 additions and 913 deletions.
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

0 comments on commit a84c850

Please sign in to comment.