Skip to content

Commit 9655c22

Browse files
[Protobuf] Add isEnumSchema check in generateNestedSchema (#22384)
Co-authored-by: xil <[email protected]>
1 parent 6210db3 commit 9655c22

File tree

2 files changed

+54
-5
lines changed

2 files changed

+54
-5
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ private Schema generateNestedSchema(Schema schema, Set<Schema> visitedSchemas) {
385385
if(ModelUtils.isArraySchema(schema)) {
386386
Schema itemsSchema = ModelUtils.getSchemaItems(schema);
387387
itemsSchema = ModelUtils.getReferencedSchema(openAPI, itemsSchema);
388-
if(ModelUtils.isModel(itemsSchema)) {
388+
if(ModelUtils.isModel(itemsSchema) || (itemsSchema != null && ModelUtils.isEnumSchema(itemsSchema))) {
389389
String newSchemaName = ModelUtils.getSimpleRef(ModelUtils.getSchemaItems(schema).get$ref()) + ARRAY_SUFFIX;
390390
return addSchemas(schema, newSchemaName, visitedSchemas);
391391
}else if (ModelUtils.isPrimitiveType(itemsSchema)){
@@ -400,7 +400,7 @@ private Schema generateNestedSchema(Schema schema, Set<Schema> visitedSchemas) {
400400
} else if(ModelUtils.isMapSchema(schema)) {
401401
Schema mapValueSchema = ModelUtils.getAdditionalProperties(schema);
402402
mapValueSchema = ModelUtils.getReferencedSchema(openAPI, mapValueSchema);
403-
if(ModelUtils.isModel(mapValueSchema) ) {
403+
if(ModelUtils.isModel(mapValueSchema) || (mapValueSchema != null && ModelUtils.isEnumSchema(mapValueSchema))) {
404404
String newSchemaName = ModelUtils.getSimpleRef(ModelUtils.getAdditionalProperties(schema).get$ref()) + MAP_SUFFIX;
405405
return addSchemas(schema, newSchemaName, visitedSchemas);
406406
}else if (ModelUtils.isPrimitiveType(mapValueSchema)){
@@ -1116,16 +1116,16 @@ protected void addProperties(Map<String, Schema> properties, List<String> requir
11161116
} else {
11171117
Schema additionalProperties = ModelUtils.getAdditionalProperties(schema);
11181118
if(additionalProperties == null) {
1119-
return;
1119+
return;
11201120
} else if (additionalProperties.getTitle() != null) {
11211121
addtionalPropertiesName = additionalProperties.getTitle();
11221122
} else if (additionalProperties.get$ref() != null) {
11231123
String ref = ModelUtils.getSimpleRef(additionalProperties.get$ref());
11241124
addtionalPropertiesName = toVarName(toModelName(ref));
11251125
}
11261126
}
1127-
1128-
properties.put(addtionalPropertiesName, schema);
1127+
1128+
properties.put(addtionalPropertiesName, schema);
11291129
}
11301130
}
11311131
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
package org.openapitools.codegen.protobuf;
1818

1919
import io.swagger.v3.oas.models.OpenAPI;
20+
import io.swagger.v3.oas.models.media.ArraySchema;
2021
import io.swagger.v3.oas.models.media.IntegerSchema;
22+
import io.swagger.v3.oas.models.media.MapSchema;
23+
import io.swagger.v3.oas.models.media.ObjectSchema;
2124
import io.swagger.v3.oas.models.media.Schema;
2225
import io.swagger.v3.oas.models.media.StringSchema;
2326
import org.openapitools.codegen.ClientOptInput;
@@ -296,4 +299,50 @@ public void unspecifiedEnumValuesIgnoredIfAlreadyPresent() {
296299
Assert.assertEquals(enumVars1.get(1).get("value"), "FOO");
297300
Assert.assertEquals(enumVars1.get(1).get("isString"), false);
298301
}
302+
303+
@SuppressWarnings("unchecked")
304+
@Test(description = "Validate that enums in arrays are treated as complex types")
305+
public void enumInArrayIsTreatedAsComplexType() {
306+
final Schema enumSchema = new StringSchema()._enum(Arrays.asList("APPLE", "BANANA", "ORANGE"));
307+
final ArraySchema arraySchema = new ArraySchema();
308+
arraySchema.setItems(enumSchema);
309+
310+
final Schema model = new Schema()
311+
.description("a sample model with enum array")
312+
.addProperties("fruitList", arraySchema);
313+
314+
final ProtobufSchemaCodegen codegen = new ProtobufSchemaCodegen();
315+
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
316+
codegen.setOpenAPI(openAPI);
317+
final CodegenModel cm = codegen.fromModel("sample", model);
318+
codegen.additionalProperties().put(USE_SIMPLIFIED_ENUM_NAMES, true);
319+
codegen.processOpts();
320+
codegen.postProcessModels(createCodegenModelWrapper(cm));
321+
322+
final CodegenProperty property = cm.vars.get(0);
323+
Assert.assertEquals(property.baseName, "fruitList");
324+
}
325+
326+
@SuppressWarnings("unchecked")
327+
@Test(description = "Validate that enums in maps are treated as complex types")
328+
public void enumInMapIsTreatedAsComplexType() {
329+
final Schema enumSchema = new StringSchema()._enum(Arrays.asList("RED", "GREEN", "BLUE"));
330+
final MapSchema mapSchema = new MapSchema();
331+
mapSchema.setAdditionalProperties(enumSchema);
332+
333+
final Schema model = new Schema()
334+
.description("a sample model with enum map")
335+
.addProperties("colorMap", mapSchema);
336+
337+
final ProtobufSchemaCodegen codegen = new ProtobufSchemaCodegen();
338+
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
339+
codegen.setOpenAPI(openAPI);
340+
final CodegenModel cm = codegen.fromModel("sample", model);
341+
codegen.additionalProperties().put(USE_SIMPLIFIED_ENUM_NAMES, true);
342+
codegen.processOpts();
343+
codegen.postProcessModels(createCodegenModelWrapper(cm));
344+
345+
final CodegenProperty property = cm.vars.get(0);
346+
Assert.assertEquals(property.baseName, "colorMap");
347+
}
299348
}

0 commit comments

Comments
 (0)