Skip to content

Commit bfb4926

Browse files
authored
Rupert/additional function inputs (#635)
* added support for attional request args * added support for attional request args * cleanup * added documentation * added entry in index
1 parent 0dd27cd commit bfb4926

File tree

8 files changed

+100
-1
lines changed

8 files changed

+100
-1
lines changed

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CodegenConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ public enum ConfigName {
5656
GENERATE_PART_FILENAME("generate-part-filename"),
5757
PART_FILENAME_VALUE("part-filename-value"),
5858
USE_FIELD_NAME_IN_PART_FILENAME("use-field-name-in-part-filename"),
59-
ADDITIONAL_PROPERTIES_AS_ATTRIBUTE("additional-properties-as-attribute");
59+
ADDITIONAL_PROPERTIES_AS_ATTRIBUTE("additional-properties-as-attribute"),
60+
ADDITIONAL_REQUEST_ARGS("additional-request-args");
6061

6162
private final String name;
6263

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/CommonItemConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ public class CommonItemConfig {
4848
@ConfigItem(name = "additional-api-type-annotations")
4949
public Optional<String> additionalApiTypeAnnotations;
5050

51+
/**
52+
* Add custom/additional HTTP Headers or other args to every request
53+
*/
54+
@ConfigItem(name = "additional-request-args")
55+
public Optional<String> additionalRequestArgs;
56+
5157
/**
5258
* Defines if the methods should return {@link jakarta.ws.rs.core.Response} or a model. Default is <code>false</code>.
5359
*/

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/codegen/OpenApiGeneratorCodeGenBase.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ protected void generate(final Config config, final Path openApiFilePath, final P
205205
getValues(config, openApiFilePath, CodegenConfig.ConfigName.ADDITIONAL_API_TYPE_ANNOTATIONS, String.class)
206206
.ifPresent(generator::withAdditionalApiTypeAnnotationsConfig);
207207

208+
getValues(config, openApiFilePath, CodegenConfig.ConfigName.ADDITIONAL_REQUEST_ARGS, String.class)
209+
.ifPresent(generator::withAdditionalRequestArgs);
210+
208211
getConfigKeyValue(config, openApiFilePath)
209212
.ifPresentOrElse(generator::withConfigKey,
210213
() -> generator.withConfigKey(getSanitizedFileName(openApiFilePath)));

deployment/src/main/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,13 @@ public OpenApiClientGeneratorWrapper withAdditionalApiTypeAnnotationsConfig(fina
179179
return this;
180180
}
181181

182+
public OpenApiClientGeneratorWrapper withAdditionalRequestArgs(final String additionalRequestArgs) {
183+
if (additionalRequestArgs != null) {
184+
this.configurator.addAdditionalProperty("additionalRequestArgs", additionalRequestArgs.split(";"));
185+
}
186+
return this;
187+
}
188+
182189
public void withTemplateDir(Path templateDir) {
183190
this.configurator.addAdditionalProperty("templateDir", templateDir.toString());
184191
}

deployment/src/main/resources/templates/libraries/microprofile/api.qute

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ public interface {classname} {
8585
{/if}
8686
{/if}
8787
{/if}
88+
{#if additionalRequestArgs}
89+
{#for arg in additionalRequestArgs}{!
90+
!}{arg}{#if arg_hasNext}, {/if}{/for}{!
91+
!}{#if op.hasFormParams || op.allParams},{/if}
92+
{/if}
8893
{#if op.hasFormParams}
8994
{#if is-resteasy-reactive}
9095
@jakarta.ws.rs.BeanParam {op.operationIdCamelCase}MultipartForm multipartForm{#if op.hasPathParams},{/if}{!

deployment/src/test/java/io/quarkiverse/openapi/generator/deployment/wrapper/OpenApiClientGeneratorWrapperTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,60 @@ private void verifyApiAdditionalAnnotations(File file) {
536536
}
537537
}
538538

539+
@Test
540+
void verifyAdditionalRequestArgs() throws URISyntaxException {
541+
List<File> generatedFiles = createGeneratorWrapper("petstore-openapi.json")
542+
.withEnabledSecurityGeneration(false)
543+
.withAdditionalRequestArgs(
544+
"@HeaderParam(\"jaxrs-style-header\") String headerValue;@HeaderParam(\"x-correlation-id\") String correlationId;@PathParam(\"stream\") String stream")
545+
.generate("org.additionalHTTPHeaders");
546+
assertFalse(generatedFiles.isEmpty());
547+
548+
generatedFiles.stream()
549+
.filter(file -> file.getPath()
550+
.matches(".*api.*Api.java"))
551+
.forEach(this::verifyApiAdditionalHTTPHeaders);
552+
}
553+
554+
private void verifyApiAdditionalHTTPHeaders(File file) {
555+
try {
556+
CompilationUnit compilationUnit = StaticJavaParser.parse(file);
557+
compilationUnit.findAll(MethodDeclaration.class)
558+
.forEach(c -> {
559+
assertParameter(c.getParameterByName("correlationId"),
560+
"String",
561+
Map.of("HeaderParam",
562+
"\"x-correlation-id\""));
563+
assertParameter(c.getParameterByName("headerValue"),
564+
"String",
565+
Map.of("HeaderParam",
566+
"\"jaxrs-style-header\""));
567+
assertParameter(c.getParameterByName("stream"),
568+
"String",
569+
Map.of("PathParam",
570+
"\"stream\""));
571+
});
572+
} catch (FileNotFoundException e) {
573+
throw new RuntimeException(e.getMessage());
574+
}
575+
}
576+
577+
private void assertParameter(Optional<Parameter> optionalParameter,
578+
String type,
579+
Map<String, String> annotations) {
580+
assertThat(optionalParameter).isPresent();
581+
var parameter = optionalParameter.orElseThrow();
582+
assertThat(parameter.getTypeAsString()).isEqualTo(type);
583+
annotations.forEach((annotationName, annotationValue) -> {
584+
var parameterAnnotation = parameter.getAnnotationByName(annotationName);
585+
assertThat(parameterAnnotation).isPresent();
586+
assertThat(parameterAnnotation.get()
587+
.asSingleMemberAnnotationExpr()
588+
.getMemberValue()
589+
.toString()).hasToString(annotationValue);
590+
});
591+
}
592+
539593
@Test
540594
void verifyAPINormalization() throws Exception {
541595
final List<File> generatedFiles = this.createGeneratorWrapper("open-api-normalizer.json")
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
To add custom request specific parameters you can use the `additional-request-args` property.
2+
3+
Should work with:
4+
5+
* @PathParam
6+
* @QueryParam
7+
* @CookieParam
8+
* @FormParam
9+
* @MatrixParam
10+
11+
To use `additional-request-args` as attribute, add the following entry to your properties file. In this example, our spec file is in `src/main/openapi/petstore.json`:
12+
13+
----
14+
quarkus.openapi-generator.codegen.spec.petstore_json.additional-request-args=@CookieParam("cookie") String cookie;@HeaderParam("x-correlation-id") String correlationId
15+
----
16+
17+
This configuration is applied to every generated method.

docs/modules/ROOT/pages/index.adoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,12 @@ include::./includes/template-customization.adoc[leveloffset=+1, opts=optional]
163163

164164
include::./includes/additional-properties-as-attribute.adoc[leveloffset=+1, opts=optional]
165165

166+
[[additional-request-args]]
167+
== Add Additional Request Arguments to each API Method
168+
169+
include::./includes/additional-request-args.adoc[leveloffset=+1, opts=optional]
170+
171+
166172
== Known Limitations
167173

168174
These are the known limitations of this pre-release version:

0 commit comments

Comments
 (0)