Skip to content

Commit 3d96a40

Browse files
authored
[html2] Support alias types (#18579)
* [html2] Support alias models to render html docs. * [html2] Fix compile error * [html2] Update sample
1 parent 4637658 commit 3d96a40

File tree

5 files changed

+293
-202
lines changed

5 files changed

+293
-202
lines changed

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ private void generateModel(List<File> files, Map<String, Object> models, String
442442
}
443443
}
444444

445-
void generateModels(List<File> files, List<ModelMap> allModels, List<String> unusedModels) {
445+
void generateModels(List<File> files, List<ModelMap> allModels, List<String> unusedModels, List<ModelMap> aliasModels) {
446446
if (!generateModels) {
447447
// TODO: Process these anyway and add to dryRun info
448448
LOGGER.info("Skipping generation of models.");
@@ -567,6 +567,8 @@ void generateModels(List<File> files, List<ModelMap> allModels, List<String> unu
567567
CodegenModel m = modelTemplate.getModel();
568568
if (m.isAlias) {
569569
// alias to number, string, enum, etc, which should not be generated as model
570+
// but aliases are still used to dereference models in some languages (such as in html2).
571+
aliasModels.add(modelTemplate); // Store aliases in the separate list.
570572
continue; // Don't create user-defined classes for aliases
571573
}
572574
}
@@ -1074,11 +1076,11 @@ private void generateSupportingFiles(List<File> files, Map<String, Object> bundl
10741076
generateVersionMetadata(files);
10751077
}
10761078

1077-
Map<String, Object> buildSupportFileBundle(List<OperationsMap> allOperations, List<ModelMap> allModels) {
1078-
return this.buildSupportFileBundle(allOperations, allModels, null);
1079+
Map<String, Object> buildSupportFileBundle(List<OperationsMap> allOperations, List<ModelMap> allModels, List<ModelMap> aliasModels) {
1080+
return this.buildSupportFileBundle(allOperations, allModels, aliasModels, null);
10791081
}
10801082

1081-
Map<String, Object> buildSupportFileBundle(List<OperationsMap> allOperations, List<ModelMap> allModels, List<WebhooksMap> allWebhooks) {
1083+
Map<String, Object> buildSupportFileBundle(List<OperationsMap> allOperations, List<ModelMap> allModels, List<ModelMap> aliasModels, List<WebhooksMap> allWebhooks) {
10821084

10831085
Map<String, Object> bundle = new HashMap<>(config.additionalProperties());
10841086
bundle.put("apiPackage", config.apiPackage());
@@ -1100,6 +1102,7 @@ Map<String, Object> buildSupportFileBundle(List<OperationsMap> allOperations, Li
11001102
bundle.put("apiInfo", apis);
11011103
bundle.put("webhooks", allWebhooks);
11021104
bundle.put("models", allModels);
1105+
bundle.put("aliasModels", aliasModels);
11031106
bundle.put("apiFolder", config.apiPackage().replace('.', File.separatorChar));
11041107
bundle.put("modelPackage", config.modelPackage());
11051108
bundle.put("library", config.getLibrary());
@@ -1225,15 +1228,16 @@ public List<File> generate() {
12251228
// models
12261229
List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI);
12271230
List<ModelMap> allModels = new ArrayList<>();
1228-
generateModels(files, allModels, filteredSchemas);
1231+
List<ModelMap> aliasModels = new ArrayList<>();
1232+
generateModels(files, allModels, filteredSchemas, aliasModels);
12291233
// apis
12301234
List<OperationsMap> allOperations = new ArrayList<>();
12311235
generateApis(files, allOperations, allModels);
12321236
// webhooks
12331237
List<WebhooksMap> allWebhooks = new ArrayList<>();
12341238
generateWebhooks(files, allWebhooks, allModels);
12351239
// supporting files
1236-
Map<String, Object> bundle = buildSupportFileBundle(allOperations, allModels, allWebhooks);
1240+
Map<String, Object> bundle = buildSupportFileBundle(allOperations, allModels, aliasModels, allWebhooks);
12371241
generateSupportingFiles(files, bundle);
12381242

12391243
if (dryRun) {

modules/openapi-generator/src/main/resources/htmlDocs2/index.mustache

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@
151151
{{/model}}
152152
{{/models}}
153153
154+
{{#aliasModels}}
155+
{{#model}}
156+
defs["{{name}}"] = {{{modelJson}}};
157+
{{/model}}
158+
{{/aliasModels}}
159+
154160
var errs = {};
155161
{{#swagger.vendorExtensions.x-shared-errors}}
156162
{
@@ -459,11 +465,13 @@
459465
}
460466
if (schema.$ref != null) {
461467
schema = defsParser.$refs.get(schema.$ref);
462-
Object.keys(schema.properties).forEach( (item) => {
463-
if (schema.properties[item].$ref != null) {
464-
schema.properties[item] = defsParser.$refs.get(schema.properties[item].$ref);
465-
}
466-
});
468+
if (schema.properties != null) {
469+
Object.keys(schema.properties).forEach( (item) => {
470+
if (schema.properties[item].$ref != null) {
471+
schema.properties[item] = defsParser.$refs.get(schema.properties[item].$ref);
472+
}
473+
});
474+
}
467475
} else if (schema.items != null && schema.items.$ref != null) {
468476
schema.items = defsParser.$refs.get(schema.items.$ref);
469477
} else {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1703,7 +1703,8 @@ public void verifyXDiscriminatorValue() {
17031703
List<File> files = new ArrayList<>();
17041704
List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI);
17051705
List<ModelMap> allModels = new ArrayList<>();
1706-
generator.generateModels(files, allModels, filteredSchemas);
1706+
List<ModelMap> aliasModels = new ArrayList<>();
1707+
generator.generateModels(files, allModels, filteredSchemas, aliasModels);
17071708

17081709
// check that the model's children contain the x-discriminator-values
17091710
modelName = "BaseObj";

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

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -660,11 +660,12 @@ public void testHandlesTrailingSlashInServers() {
660660
List<File> files = new ArrayList<>();
661661
List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI);
662662
List<ModelMap> allModels = new ArrayList<>();
663-
generator.generateModels(files, allModels, filteredSchemas);
663+
List<ModelMap> aliasModels = new ArrayList<>();
664+
generator.generateModels(files, allModels, filteredSchemas, aliasModels);
664665
List<OperationsMap> allOperations = new ArrayList<>();
665666
generator.generateApis(files, allOperations, allModels);
666667

667-
Map<String, Object> bundle = generator.buildSupportFileBundle(allOperations, allModels);
668+
Map<String, Object> bundle = generator.buildSupportFileBundle(allOperations, allModels, aliasModels);
668669
LinkedList<CodegenServer> servers = (LinkedList<CodegenServer>) bundle.get("servers");
669670
Assert.assertEquals(servers.get(0).url, "");
670671
Assert.assertEquals(servers.get(1).url, "http://trailingshlash.io:80/v1");
@@ -686,11 +687,12 @@ public void testHandlesRelativeUrlsInServers() {
686687
List<File> files = new ArrayList<>();
687688
List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI);
688689
List<ModelMap> allModels = new ArrayList<>();
689-
generator.generateModels(files, allModels, filteredSchemas);
690+
List<ModelMap> aliasModels = new ArrayList<>();
691+
generator.generateModels(files, allModels, filteredSchemas, aliasModels);
690692
List<OperationsMap> allOperations = new ArrayList<>();
691693
generator.generateApis(files, allOperations, allModels);
692694

693-
Map<String, Object> bundle = generator.buildSupportFileBundle(allOperations, allModels);
695+
Map<String, Object> bundle = generator.buildSupportFileBundle(allOperations, allModels, aliasModels);
694696
LinkedList<CodegenServer> servers = (LinkedList<CodegenServer>) bundle.get("servers");
695697
Assert.assertEquals(servers.get(0).url, "/relative/url");
696698
}
@@ -768,8 +770,9 @@ public void testRecursionBug4650() {
768770
List<File> files = new ArrayList<>();
769771
List<String> filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI);
770772
List<ModelMap> allModels = new ArrayList<>();
773+
List<ModelMap> aliasModels = new ArrayList<>();
771774
// The bug causes a StackOverflowError when calling generateModels
772-
generator.generateModels(files, allModels, filteredSchemas);
775+
generator.generateModels(files, allModels, filteredSchemas, aliasModels);
773776
// all fine, we have passed
774777
}
775778
}

0 commit comments

Comments
 (0)