Skip to content

Commit b79e773

Browse files
authored
Merge pull request #327 from chris-prop/issue-326
refs #326 - Resolve header references
2 parents 084696b + 968b76f commit b79e773

File tree

2 files changed

+77
-8
lines changed

2 files changed

+77
-8
lines changed

src/main/java/io/swagger/codegen/v3/generators/DefaultCodegenConfig.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2031,7 +2031,11 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
20312031
codegenOperation.returnTypeIsPrimitive = true;
20322032
}
20332033
}
2034-
addHeaders(methodResponse, codegenOperation.responseHeaders);
2034+
Map<String, Header> componentHeaders = null;
2035+
if ((openAPI != null) && (openAPI.getComponents() != null)) {
2036+
componentHeaders = openAPI.getComponents().getHeaders();
2037+
}
2038+
addHeaders(methodResponse, codegenOperation.responseHeaders, componentHeaders);
20352039
}
20362040
}
20372041

@@ -2259,7 +2263,11 @@ public CodegenResponse fromResponse(String responseCode, ApiResponse response) {
22592263
if (response.getExtensions() != null && !response.getExtensions().isEmpty()) {
22602264
codegenResponse.vendorExtensions.putAll(response.getExtensions());
22612265
}
2262-
addHeaders(response, codegenResponse.headers);
2266+
Map<String, Header> componentHeaders = null;
2267+
if ((openAPI != null) && (openAPI.getComponents() != null)) {
2268+
componentHeaders = openAPI.getComponents().getHeaders();
2269+
}
2270+
addHeaders(response, codegenResponse.headers, componentHeaders);
22632271
codegenResponse.getVendorExtensions().put(CodegenConstants.HAS_HEADERS_EXT_NAME, !codegenResponse.headers.isEmpty());
22642272

22652273
if (responseSchema != null) {
@@ -2855,10 +2863,18 @@ protected List<Map<String, Object>> toExamples(Map<String, Object> examples) {
28552863
return output;
28562864
}
28572865

2858-
private void addHeaders(ApiResponse response, List<CodegenProperty> target) {
2866+
private void addHeaders(ApiResponse response, List<CodegenProperty> target, Map<String, Header> componentHeaders) {
28592867
if (response.getHeaders() != null) {
28602868
for (Map.Entry<String, Header> headers : response.getHeaders().entrySet()) {
2861-
target.add(fromProperty(headers.getKey(), headers.getValue().getSchema()));
2869+
Header header = headers.getValue();
2870+
Schema schema;
2871+
if ((header.get$ref() != null) && (componentHeaders != null)) {
2872+
String ref = OpenAPIUtil.getSimpleRef(header.get$ref());
2873+
schema = componentHeaders.get(ref).getSchema();
2874+
} else {
2875+
schema = header.getSchema();
2876+
}
2877+
target.add(fromProperty(headers.getKey(), schema));
28622878
}
28632879
}
28642880
}
@@ -3951,11 +3967,11 @@ protected void addConsumesInfo(Operation operation, CodegenOperation codegenOper
39513967
String bodyName = OpenAPIUtil.getSimpleRef(body.get$ref());
39523968
body = openAPI.getComponents().getRequestBodies().get(bodyName);
39533969
}
3954-
3970+
39553971
if (body.getContent() == null || body.getContent().isEmpty()) {
39563972
return;
39573973
}
3958-
3974+
39593975
Set<String> consumes = body.getContent().keySet();
39603976
List<Map<String, String>> mediaTypeList = new ArrayList<>();
39613977
int count = 0;
@@ -4101,7 +4117,7 @@ protected String getCollectionFormat(Parameter parameter) {
41014117
if (parameter.getExplode() == null || parameter.getExplode()) {
41024118
return "multi";
41034119
}
4104-
4120+
41054121
// Form is the default, if no style is specified.
41064122
if (parameter.getStyle() == null || Parameter.StyleEnum.FORM.equals(parameter.getStyle())) {
41074123
return "csv";

src/test/java/io/swagger/codegen/v3/generators/DefaultCodegenConfigTest.java

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
import io.swagger.codegen.v3.CodegenOperation;
66
import io.swagger.codegen.v3.CodegenParameter;
77
import io.swagger.codegen.v3.CodegenProperty;
8+
import io.swagger.codegen.v3.CodegenResponse;
89
import io.swagger.codegen.v3.CodegenType;
10+
import io.swagger.v3.oas.models.Components;
911
import io.swagger.v3.oas.models.OpenAPI;
1012
import io.swagger.v3.oas.models.Operation;
1113
import io.swagger.v3.oas.models.PathItem;
14+
import io.swagger.v3.oas.models.headers.Header;
1215
import io.swagger.v3.oas.models.media.ArraySchema;
1316
import io.swagger.v3.oas.models.media.Content;
1417
import io.swagger.v3.oas.models.media.IntegerSchema;
@@ -17,13 +20,15 @@
1720
import io.swagger.v3.oas.models.media.Schema;
1821
import io.swagger.v3.oas.models.parameters.Parameter;
1922
import io.swagger.v3.oas.models.parameters.RequestBody;
23+
import io.swagger.v3.oas.models.responses.ApiResponse;
2024
import io.swagger.v3.parser.OpenAPIV3Parser;
2125

2226
import org.testng.Assert;
2327
import org.testng.annotations.DataProvider;
2428
import org.testng.annotations.Test;
2529

2630
import java.math.BigDecimal;
31+
import java.util.HashMap;
2732
import java.util.HashSet;
2833
import java.util.List;
2934

@@ -256,7 +261,55 @@ public void testOptionalFormParams() {
256261
List<CodegenParameter> requiredParams = codegenOp.getRequiredParams();
257262
Assert.assertTrue(requiredParams == null || requiredParams.size() == 0);
258263
}
259-
264+
265+
@Test
266+
public void testFromResponse_inlineHeaders() {
267+
final String RESPONSE_CODE = "200";
268+
269+
ApiResponse apiResponse = new ApiResponse();
270+
Header inlineHeader = new Header().description("This is header1").schema(new Schema().type("string").example("header_val"));
271+
apiResponse.addHeaderObject("header1", inlineHeader);
272+
273+
OpenAPI openAPI = new OpenAPI().components(new Components().responses(new HashMap<>()));
274+
openAPI.getComponents().addHeaders("ref-header1", inlineHeader);
275+
276+
final DefaultCodegenConfig codegen = new P_DefaultCodegenConfig();
277+
codegen.preprocessOpenAPI(openAPI);
278+
CodegenResponse codegenResponse = codegen.fromResponse(RESPONSE_CODE, apiResponse);
279+
280+
Assert.assertEquals(codegenResponse.code, RESPONSE_CODE);
281+
282+
CodegenProperty headerProperty = codegenResponse.headers.get(0);
283+
Assert.assertNotNull(headerProperty);
284+
Assert.assertEquals(headerProperty.description, inlineHeader.getSchema().getDescription());
285+
Assert.assertEquals(headerProperty.datatype, "String");
286+
Assert.assertEquals(headerProperty.example, inlineHeader.getSchema().getExample());
287+
}
288+
289+
@Test
290+
public void testFromResponse_referenceHeaders() {
291+
final String RESPONSE_CODE = "200";
292+
293+
ApiResponse apiResponse = new ApiResponse();
294+
apiResponse.addHeaderObject("header1", new Header().$ref("#/components/ref-header1"));
295+
296+
OpenAPI openAPI = new OpenAPI().components(new Components().responses(new HashMap<>()));
297+
Header referencedHeader = new Header().schema(new Schema().description("This is header1").type("string").example("header_val"));
298+
openAPI.getComponents().addHeaders("ref-header1", referencedHeader);
299+
300+
final DefaultCodegenConfig codegen = new P_DefaultCodegenConfig();
301+
codegen.preprocessOpenAPI(openAPI);
302+
CodegenResponse codegenResponse = codegen.fromResponse(RESPONSE_CODE, apiResponse);
303+
304+
Assert.assertEquals(codegenResponse.code, RESPONSE_CODE);
305+
306+
CodegenProperty headerProperty = codegenResponse.headers.get(0);
307+
Assert.assertNotNull(headerProperty);
308+
Assert.assertEquals(headerProperty.description, referencedHeader.getSchema().getDescription());
309+
Assert.assertEquals(headerProperty.datatype, "String");
310+
Assert.assertEquals(headerProperty.example, referencedHeader.getSchema().getExample());
311+
}
312+
260313
private static class P_DefaultCodegenConfig extends DefaultCodegenConfig{
261314
@Override
262315
public String getArgumentsLocation() {

0 commit comments

Comments
 (0)