Skip to content

Commit d8b597b

Browse files
Matthieu Berthoméjmini
authored andcommitted
[DefaultGenerator] consider referenced headers (#863)
1 parent 9bc335b commit d8b597b

5 files changed

Lines changed: 81 additions & 18 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2260,7 +2260,7 @@ public CodegenOperation fromOperation(String path,
22602260
for (String key : operation.getResponses().keySet()) {
22612261
ApiResponse response = operation.getResponses().get(key);
22622262
addProducesInfo(openAPI, response, op);
2263-
CodegenResponse r = fromResponse(key, response);
2263+
CodegenResponse r = fromResponse(openAPI, key, response);
22642264
r.hasMore = true;
22652265
if (r.baseType != null &&
22662266
!defaultIncludes.contains(r.baseType) &&
@@ -2329,7 +2329,7 @@ public CodegenOperation fromOperation(String path,
23292329
op.returnTypeIsPrimitive = true;
23302330
}
23312331
}
2332-
addHeaders(methodResponse, op.responseHeaders);
2332+
addHeaders(openAPI, methodResponse, op.responseHeaders);
23332333
}
23342334
}
23352335

@@ -2506,11 +2506,12 @@ public boolean isParameterNameUnique(CodegenParameter p, List<CodegenParameter>
25062506
/**
25072507
* Convert OAS Response object to Codegen Response object
25082508
*
2509+
* @param openAPI a OAS object representing the spec
25092510
* @param responseCode HTTP response code
25102511
* @param response OAS Response object
25112512
* @return Codegen Response object
25122513
*/
2513-
public CodegenResponse fromResponse(String responseCode, ApiResponse response) {
2514+
public CodegenResponse fromResponse(OpenAPI openAPI, String responseCode, ApiResponse response) {
25142515
CodegenResponse r = CodegenModelFactory.newInstance(CodegenModelType.RESPONSE);
25152516
if ("default".equals(responseCode)) {
25162517
r.code = "0";
@@ -2527,7 +2528,7 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) {
25272528
if (response.getExtensions() != null && !response.getExtensions().isEmpty()) {
25282529
r.vendorExtensions.putAll(response.getExtensions());
25292530
}
2530-
addHeaders(response, r.headers);
2531+
addHeaders(openAPI, response, r.headers);
25312532
r.hasHeaders = !r.headers.isEmpty();
25322533

25332534
if (r.schema != null) {
@@ -3073,12 +3074,15 @@ protected List<Map<String, Object>> toExamples(Map<String, Object> examples) {
30733074
* @param response API response
30743075
* @param properties list of codegen property
30753076
*/
3076-
private void addHeaders(ApiResponse response, List<CodegenProperty> properties) {
3077+
private void addHeaders(OpenAPI openAPI, ApiResponse response, List<CodegenProperty> properties) {
30773078
if (response.getHeaders() != null) {
30783079
for (Map.Entry<String, Header> headers : response.getHeaders().entrySet()) {
3079-
CodegenProperty cp = fromProperty(headers.getKey(), headers.getValue().getSchema());
3080-
cp.setDescription(escapeText(headers.getValue().getDescription()));
3081-
cp.setUnescapedDescription(headers.getValue().getDescription());
3080+
String description = headers.getValue().getDescription();
3081+
// follow the $ref
3082+
Header header = ModelUtils.getReferencedHeader(openAPI, headers.getValue());
3083+
CodegenProperty cp = fromProperty(headers.getKey(), header.getSchema());
3084+
cp.setDescription(escapeText(description));
3085+
cp.setUnescapedDescription(description);
30823086
properties.add(cp);
30833087
}
30843088
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -512,8 +512,8 @@ public CodegenProperty fromProperty(String name, Schema p) {
512512
}
513513

514514
@Override
515-
public CodegenResponse fromResponse(String responseCode, ApiResponse resp) {
516-
final CodegenResponse response = super.fromResponse(responseCode, resp);
515+
public CodegenResponse fromResponse(OpenAPI openAPI, String responseCode, ApiResponse resp) {
516+
final CodegenResponse response = super.fromResponse(openAPI, responseCode, resp);
517517
if (response.dataType != null) {
518518
addEncoderAndDecoder(response.vendorExtensions, response.dataType, response.isMapContainer, response.primitiveType);
519519
}

modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import io.swagger.v3.oas.models.OpenAPI;
2121
import io.swagger.v3.oas.models.Operation;
2222
import io.swagger.v3.oas.models.PathItem;
23+
import io.swagger.v3.oas.models.headers.Header;
2324
import io.swagger.v3.oas.models.media.ArraySchema;
2425
import io.swagger.v3.oas.models.media.BinarySchema;
2526
import io.swagger.v3.oas.models.media.BooleanSchema;
@@ -670,4 +671,25 @@ public static Schema getAdditionalProperties(Schema schema) {
670671
return null;
671672
}
672673

674+
public static Header getReferencedHeader(OpenAPI openAPI, Header header) {
675+
if (header != null && StringUtils.isNotEmpty(header.get$ref())) {
676+
String name = getSimpleRef(header.get$ref());
677+
Header referencedheader = getHeader(openAPI, name);
678+
if (referencedheader != null) {
679+
return referencedheader;
680+
}
681+
}
682+
return header;
683+
}
684+
685+
public static Header getHeader(OpenAPI openAPI, String name) {
686+
if (name == null) {
687+
return null;
688+
}
689+
690+
if (openAPI != null && openAPI.getComponents() != null && openAPI.getComponents().getHeaders() != null) {
691+
return openAPI.getComponents().getHeaders().get(name);
692+
}
693+
return null;
694+
}
673695
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,12 @@
3131
import io.swagger.v3.oas.models.media.Schema;
3232
import io.swagger.v3.oas.models.media.StringSchema;
3333
import io.swagger.v3.oas.models.parameters.RequestBody;
34+
import io.swagger.v3.oas.models.responses.ApiResponse;
3435
import io.swagger.v3.parser.core.models.ParseOptions;
3536
import io.swagger.v3.parser.util.SchemaTypeUtil;
3637

37-
import org.openapitools.codegen.ClientOptInput;
38-
import org.openapitools.codegen.CodegenConstants;
39-
import org.openapitools.codegen.CodegenModel;
40-
import org.openapitools.codegen.CodegenOperation;
41-
import org.openapitools.codegen.CodegenParameter;
42-
import org.openapitools.codegen.CodegenProperty;
43-
import org.openapitools.codegen.MockDefaultGenerator;
38+
import org.openapitools.codegen.*;
4439
import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile;
45-
import org.openapitools.codegen.TestUtils;
4640
import org.openapitools.codegen.config.CodegenConfigurator;
4741
import org.openapitools.codegen.languages.JavaClientCodegen;
4842
import org.openapitools.codegen.utils.ModelUtils;
@@ -305,6 +299,20 @@ public void testGeneratePing() throws Exception {
305299
output.deleteOnExit();
306300
}
307301

302+
@Test
303+
public void testReferencedHeader() {
304+
final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/issue855.yaml", null, new ParseOptions()).getOpenAPI();
305+
JavaClientCodegen codegen = new JavaClientCodegen();
306+
307+
ApiResponse ok_200 = openAPI.getComponents().getResponses().get("OK_200");
308+
CodegenResponse response = codegen.fromResponse(openAPI, "200", ok_200);
309+
310+
Assert.assertEquals(1, response.headers.size());
311+
CodegenProperty header = response.headers.get(0);
312+
Assert.assertEquals("UUID", header.dataType);
313+
Assert.assertEquals("Request", header.baseName);
314+
}
315+
308316
@Test
309317
public void testFreeFormObjects() {
310318
final OpenAPI openAPI = new OpenAPIParser().readLocation("src/test/resources/3_0/issue796.yaml", null, new ParseOptions()).getOpenAPI();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
openapi: 3.0.1
2+
info:
3+
title: Issue 855 example
4+
version: 1.0.0
5+
components:
6+
headers:
7+
Request:
8+
description: ID of the request, unique to the call, as determined by the initiating party.
9+
required: true
10+
example: "99391c7e-ad88-49ec-a2ad-99ddcb1f7721"
11+
schema:
12+
type: string
13+
format: uuid
14+
15+
responses:
16+
OK_200:
17+
description: OK
18+
headers:
19+
Request:
20+
$ref: "#/components/headers/Request"
21+
22+
paths:
23+
/ping:
24+
get:
25+
summary: Get Payment Information
26+
description: Returns the content of a payment object
27+
responses:
28+
'200':
29+
$ref: "#/components/responses/OK_200"

0 commit comments

Comments
 (0)