Skip to content

Commit 99a68ac

Browse files
authored
Merge branch 'master' into issue_654
2 parents 5c2cebf + c4d101b commit 99a68ac

File tree

837 files changed

+946
-51136
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

837 files changed

+946
-51136
lines changed

pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>io.swagger.codegen.v3</groupId>
1414
<artifactId>swagger-codegen-generators</artifactId>
15-
<version>1.0.20-SNAPSHOT</version>
15+
<version>1.0.21-SNAPSHOT</version>
1616
<packaging>jar</packaging>
1717

1818
<build>
@@ -252,8 +252,8 @@
252252
</dependency>
253253
</dependencies>
254254
<properties>
255-
<swagger-codegen-version>3.0.20-SNAPSHOT</swagger-codegen-version>
256-
<swagger-parser-version>2.0.20-SNAPSHOT</swagger-parser-version>
255+
<swagger-codegen-version>3.0.21-SNAPSHOT</swagger-codegen-version>
256+
<swagger-parser-version>2.0.21-SNAPSHOT</swagger-parser-version>
257257
<swagger-core-version>2.1.2</swagger-core-version>
258258
<jackson-version>2.10.3</jackson-version>
259259
<scala-version>2.11.1</scala-version>

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

Lines changed: 75 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@
7878
import java.io.File;
7979
import java.io.IOException;
8080
import java.io.InputStream;
81+
import java.io.UnsupportedEncodingException;
82+
import java.net.URLDecoder;
83+
import java.nio.charset.StandardCharsets;
8184
import java.util.ArrayList;
8285
import java.util.Arrays;
8386
import java.util.Collections;
@@ -106,7 +109,6 @@
106109
import static io.swagger.codegen.v3.generators.CodegenHelper.getTypeMappings;
107110
import static io.swagger.codegen.v3.generators.CodegenHelper.initalizeSpecialCharacterMapping;
108111
import static io.swagger.codegen.v3.generators.handlebars.ExtensionHelper.getBooleanValue;
109-
import static io.swagger.codegen.v3.utils.ModelUtils.processCodegenModels;
110112

111113
public abstract class DefaultCodegenConfig implements CodegenConfig {
112114
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultCodegenConfig.class);
@@ -264,10 +266,50 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> processedMod
264266
allModels.put(modelName, codegenModel);
265267
}
266268
}
269+
postProcessAllCodegenModels(allModels);
270+
return processedModels;
271+
}
272+
273+
protected void postProcessAllCodegenModels(Map<String, CodegenModel> allModels) {
267274
if (supportsInheritance) {
268-
processCodegenModels(allModels);
275+
for (String name : allModels.keySet()) {
276+
final CodegenModel codegenModel = allModels.get(name);
277+
fixUpParentAndInterfaces(codegenModel, allModels);
278+
}
279+
}
280+
}
281+
282+
/**
283+
* Fix up all parent and interface CodegenModel references.
284+
* @param allModels
285+
*/
286+
protected void fixUpParentAndInterfaces(CodegenModel codegenModel, Map<String, CodegenModel> allModels) {
287+
if (codegenModel.parent != null) {
288+
codegenModel.parentModel = allModels.get(codegenModel.parent);
289+
}
290+
if (codegenModel.interfaces != null && !codegenModel.interfaces.isEmpty()) {
291+
codegenModel.interfaceModels = new ArrayList<CodegenModel>(codegenModel.interfaces.size());
292+
for (String intf : codegenModel.interfaces) {
293+
CodegenModel intfModel = allModels.get(intf);
294+
if (intfModel != null) {
295+
codegenModel.interfaceModels.add(intfModel);
296+
}
297+
}
298+
}
299+
CodegenModel parent = codegenModel.parentModel;
300+
// if a discriminator exists on the parent, don't add this child to the inheritance hierarchy
301+
// TODO Determine what to do if the parent discriminator name == the grandparent discriminator name
302+
while (parent != null) {
303+
if (parent.children == null) {
304+
parent.children = new ArrayList<CodegenModel>();
305+
}
306+
parent.children.add(codegenModel);
307+
if (parent.discriminator == null) {
308+
parent = allModels.get(parent.parent);
309+
} else {
310+
parent = null;
311+
}
269312
}
270-
return processedModels;
271313
}
272314

273315
// override with any special post-processing
@@ -2073,6 +2115,11 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
20732115
Schema schema = body.getContent().get(contentType).getSchema();
20742116
if (schema != null && StringUtils.isNotBlank(schema.get$ref())) {
20752117
schemaName = OpenAPIUtil.getSimpleRef(schema.get$ref());
2118+
try {
2119+
schemaName = URLDecoder.decode(schemaName, StandardCharsets.UTF_8.name());
2120+
} catch (UnsupportedEncodingException e) {
2121+
LOGGER.error("Could not decoded string: " + schemaName, e);
2122+
}
20762123
schema = schemas.get(schemaName);
20772124
}
20782125
final CodegenContent codegenContent = new CodegenContent(contentType);
@@ -2147,31 +2194,6 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
21472194
param = getParameterFromRef(param.get$ref(), openAPI);
21482195
}
21492196
CodegenParameter codegenParameter = fromParameter(param, imports);
2150-
// rename parameters to make sure all of them have unique names
2151-
if (ensureUniqueParams) {
2152-
while (true) {
2153-
boolean exists = false;
2154-
for (CodegenParameter cp : allParams) {
2155-
if (codegenParameter.paramName != null && codegenParameter.paramName.equals(cp.paramName)) {
2156-
exists = true;
2157-
break;
2158-
}
2159-
}
2160-
if (exists) {
2161-
codegenParameter.paramName = generateNextName(codegenParameter.paramName);
2162-
} else {
2163-
break;
2164-
}
2165-
}
2166-
}
2167-
2168-
// set isPrimitiveType and baseType for allParams
2169-
/*if (languageSpecificPrimitives.contains(p.baseType)) {
2170-
p.isPrimitiveType = true;
2171-
p.baseType = getSwaggerType(p);
2172-
}*/
2173-
2174-
21752197
allParams.add(codegenParameter);
21762198
// Issue #2561 (neilotoole) : Moved setting of is<Type>Param flags
21772199
// from here to fromParameter().
@@ -2403,6 +2425,9 @@ public CodegenParameter fromParameter(Parameter parameter, Set<String> imports)
24032425
inner = new StringSchema().description("//TODO automatically added by swagger-codegen");
24042426
arraySchema.setItems(inner);
24052427

2428+
} else if (isObjectSchema(inner)) {
2429+
//fixme: codegenParameter.getVendorExtensions().put(CodegenConstants.HAS_INNER_OBJECT_NAME, Boolean.TRUE);
2430+
codegenParameter.getVendorExtensions().put("x-has-inner-object", Boolean.TRUE);
24062431
}
24072432

24082433
collectionFormat = getCollectionFormat(parameter);
@@ -2655,6 +2680,9 @@ else if (schema instanceof ArraySchema) {
26552680
if (inner == null) {
26562681
inner = new StringSchema().description("//TODO automatically added by swagger-codegen");
26572682
arraySchema.setItems(inner);
2683+
} else if (isObjectSchema(inner)) {
2684+
//fixme: codegenParameter.getVendorExtensions().put(CodegenConstants.HAS_INNER_OBJECT_NAME, Boolean.TRUE);
2685+
codegenParameter.getVendorExtensions().put("x-has-inner-object", Boolean.TRUE);
26582686
}
26592687

26602688
CodegenProperty codegenProperty = fromProperty("property", schema);
@@ -3044,7 +3072,7 @@ protected void addImport(CodegenModel m, String type) {
30443072
}
30453073
}
30463074

3047-
private void addVars(CodegenModel codegenModel, Map<String, Schema> properties, List<String> required) {
3075+
protected void addVars(CodegenModel codegenModel, Map<String, Schema> properties, List<String> required) {
30483076
addVars(codegenModel, properties, required, null, null);
30493077
}
30503078

@@ -4232,6 +4260,10 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
42324260
}
42334261
this.addCodegenContentParemeters(codegenOperation, codegenContents);
42344262
for (CodegenContent content : codegenContents) {
4263+
if (ensureUniqueParams) {
4264+
ensureUniqueParameters(content.getParameters());
4265+
}
4266+
42354267
Collections.sort(content.getParameters(), (CodegenParameter one, CodegenParameter another) -> {
42364268
if (one.required == another.required){
42374269
return 0;
@@ -4266,6 +4298,20 @@ protected void addCodegenContentParemeters(CodegenOperation codegenOperation, Li
42664298
}
42674299
}
42684300

4301+
protected void ensureUniqueParameters(List<CodegenParameter> codegenParameters) {
4302+
if (codegenParameters == null || codegenParameters.isEmpty()) {
4303+
return;
4304+
}
4305+
for (CodegenParameter codegenParameter : codegenParameters) {
4306+
long count = codegenParameters.stream()
4307+
.filter(codegenParam -> codegenParam.paramName.equals(codegenParameter.paramName))
4308+
.count();
4309+
if (count > 1l) {
4310+
codegenParameter.paramName = generateNextName(codegenParameter.paramName);
4311+
}
4312+
}
4313+
}
4314+
42694315
protected void setParameterNullable(CodegenParameter parameter, CodegenProperty property) {
42704316
parameter.nullable = property.nullable;
42714317
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ protected CodegenModel processArrayItemSchema(CodegenModel codegenModel, ArraySc
124124
final Schema itemsSchema = arraySchema.getItems();
125125
if (itemsSchema instanceof ComposedSchema) {
126126
final CodegenModel composedModel = this.processComposedSchema(codegenModel.name + ARRAY_ITEMS_SUFFIX, (ComposedSchema) itemsSchema, allModels);
127+
if (composedModel == null) {
128+
return null;
129+
}
127130
this.updateArrayModel(codegenModel, composedModel.name, arraySchema);
128131
return composedModel;
129132
}

src/main/java/io/swagger/codegen/v3/generators/dotnet/AbstractCSharpCodegen.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ public void updateCodegenPropertyEnum(CodegenProperty var) {
535535
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
536536
super.postProcessOperations(objs);
537537
if (objs != null) {
538+
boolean hasAuthMethods = false;
538539
Map<String, Object> operations = (Map<String, Object>) objs.get("operations");
539540
if (operations != null) {
540541
List<CodegenOperation> ops = (List<CodegenOperation>) operations.get("operation");
@@ -583,8 +584,12 @@ public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
583584
}
584585

585586
processOperation(operation);
587+
if (getBooleanValue(operation, CodegenConstants.HAS_AUTH_METHODS_EXT_NAME)) {
588+
hasAuthMethods = true;
589+
}
586590
}
587591
}
592+
objs.put("hasAuthMethods", hasAuthMethods);
588593
}
589594

590595
return objs;

src/main/java/io/swagger/codegen/v3/generators/dotnet/AspNetCoreServerCodegen.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public void processOpts() {
149149
supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache", packageFolder + File.separator + "Filters", "BasePathFilter.cs"));
150150
supportingFiles.add(new SupportingFile("Filters" + File.separator + "GeneratePathParamsValidationFilter.mustache", packageFolder + File.separator + "Filters", "GeneratePathParamsValidationFilter.cs"));
151151
supportingFiles.add(new SupportingFile("Startup.mustache", packageFolder, "Startup.cs"));
152-
} else if (aspNetCoreVersion.equals("2.1")) {
152+
} else if (aspNetCoreVersion.equals("2.1") || aspNetCoreVersion.equals("2.2")) {
153153
apiTemplateFiles.put("2.1/controller.mustache", ".cs");
154154
addInterfaceControllerTemplate();
155155

@@ -190,16 +190,11 @@ public void processOpts() {
190190
supportingFiles.add(new SupportingFile("gitignore", packageFolder, ".gitignore"));
191191
supportingFiles.add(new SupportingFile("appsettings.json", packageFolder, "appsettings.json"));
192192

193-
//supportingFiles.add(new SupportingFile("Startup.mustache", packageFolder, "Startup.cs"));
194-
195193
supportingFiles.add(new SupportingFile("validateModel.mustache", packageFolder + File.separator + "Attributes", "ValidateModelStateAttribute.cs"));
196194
supportingFiles.add(new SupportingFile("web.config", packageFolder, "web.config"));
197195

198196
supportingFiles.add(new SupportingFile("Properties" + File.separator + "launchSettings.json", packageFolder + File.separator + "Properties", "launchSettings.json"));
199197

200-
// supportingFiles.add(new SupportingFile("Filters" + File.separator + "BasePathFilter.mustache", packageFolder + File.separator + "Filters", "BasePathFilter.cs"));
201-
// supportingFiles.add(new SupportingFile("Filters" + File.separator + "GeneratePathParamsValidationFilter.mustache", packageFolder + File.separator + "Filters", "GeneratePathParamsValidationFilter.cs"));
202-
203198
supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "README.md", packageFolder + File.separator + "wwwroot", "README.md"));
204199
supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "index.html", packageFolder + File.separator + "wwwroot", "index.html"));
205200
supportingFiles.add(new SupportingFile("wwwroot" + File.separator + "web.config", packageFolder + File.separator + "wwwroot", "web.config"));
@@ -373,7 +368,7 @@ private void setAspNetCoreVersion() {
373368
} else {
374369
this.aspNetCoreVersion = optionValue;
375370
}
376-
if (!this.aspNetCoreVersion.equals("2.0") && !this.aspNetCoreVersion.equals("2.1") && !this.aspNetCoreVersion.equals("2.2")) {
371+
if (!this.aspNetCoreVersion.equals("2.0") && !this.aspNetCoreVersion.equals("2.1") && !this.aspNetCoreVersion.equals("2.2") && !this.aspNetCoreVersion.equals("3.0")) {
377372
LOGGER.error("version '" + this.aspNetCoreVersion + "' is not supported, switching to default version: '" + DEFAULT_ASP_NET_CORE_VERSION + "'");
378373
this.aspNetCoreVersion = DEFAULT_ASP_NET_CORE_VERSION;
379374
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.swagger.codegen.v3.generators.features;
2+
3+
public interface NotNullAnnotationFeatures {
4+
5+
// Language supports generating not Null Jackson Annotation
6+
String NOT_NULL_JACKSON_ANNOTATION = "notNullJacksonAnnotation";
7+
8+
void setNotNullJacksonAnnotation(boolean notNullJacksonAnnotation);
9+
10+
boolean isNotNullJacksonAnnotation();
11+
}

src/main/java/io/swagger/codegen/v3/generators/go/AbstractGoCodegen.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
import io.swagger.codegen.v3.CodegenProperty;
1010
import io.swagger.codegen.v3.ISchemaHandler;
1111
import io.swagger.codegen.v3.generators.DefaultCodegenConfig;
12+
import io.swagger.codegen.v3.generators.SchemaHandler;
1213
import io.swagger.codegen.v3.generators.util.OpenAPIUtil;
1314
import io.swagger.v3.core.util.Yaml;
1415
import io.swagger.v3.oas.models.OpenAPI;
1516
import io.swagger.v3.oas.models.media.ArraySchema;
17+
import io.swagger.v3.oas.models.media.ComposedSchema;
1618
import io.swagger.v3.oas.models.media.MapSchema;
1719
import io.swagger.v3.oas.models.media.Schema;
1820
import org.apache.commons.lang3.StringUtils;
@@ -90,7 +92,7 @@ public AbstractGoCodegen() {
9092
typeMapping.put("file", "*os.File");
9193
// map binary to string as a workaround
9294
// the correct solution is to use []byte
93-
typeMapping.put("binary", "string");
95+
typeMapping.put("binary", "*os.File");
9496
typeMapping.put("ByteArray", "string");
9597
typeMapping.put("object", "interface{}");
9698
typeMapping.put("UUID", "string");
@@ -243,12 +245,32 @@ public String getTypeDeclaration(Schema schema) {
243245
if(schema instanceof ArraySchema) {
244246
ArraySchema arraySchema = (ArraySchema) schema;
245247
Schema inner = arraySchema.getItems();
246-
return "[]" + getTypeDeclaration(inner);
248+
if (inner instanceof ComposedSchema && schema.getExtensions() != null && schema.getExtensions().containsKey("x-schema-name")) {
249+
final ComposedSchema composedSchema = (ComposedSchema) inner;
250+
final String prefix;
251+
if (composedSchema.getAllOf() != null && !composedSchema.getAllOf().isEmpty()) {
252+
prefix = SchemaHandler.ALL_OF_PREFFIX;
253+
} else if (composedSchema.getOneOf() != null && !composedSchema.getOneOf().isEmpty()) {
254+
prefix = SchemaHandler.ONE_OF_PREFFIX;
255+
} else {
256+
prefix = SchemaHandler.ANY_OF_PREFFIX;
257+
}
258+
return "[]" + toModelName(prefix + schema.getExtensions().remove("x-schema-name")) + SchemaHandler.ARRAY_ITEMS_SUFFIX;
259+
} else {
260+
return "[]" + getTypeDeclaration(inner);
261+
}
247262
} else if (schema instanceof MapSchema && hasSchemaProperties(schema)) {
248263
MapSchema mapSchema = (MapSchema) schema;
249264
Schema inner = (Schema) mapSchema.getAdditionalProperties();
250265

251266
return getSchemaType(schema) + "[string]" + getTypeDeclaration(inner);
267+
} else if (schema.get$ref() != null) {
268+
final String simpleRefName = OpenAPIUtil.getSimpleRef(schema.get$ref());
269+
final Schema refSchema = OpenAPIUtil.getSchemaFromName(simpleRefName, this.openAPI);
270+
if (refSchema != null && (refSchema instanceof ArraySchema || refSchema instanceof MapSchema)) {
271+
refSchema.addExtension("x-schema-name", simpleRefName);
272+
return getTypeDeclaration(refSchema);
273+
}
252274
}
253275
// Not using the supertype invocation, because we want to UpperCamelize
254276
// the type.
@@ -271,7 +293,7 @@ public String getSchemaType(Schema schema) {
271293

272294
if (schema.get$ref() != null) {
273295
final Schema refSchema = OpenAPIUtil.getSchemaFromName(schemaType, this.openAPI);
274-
if (refSchema != null && !isObjectSchema(refSchema)) {
296+
if (refSchema != null && !isObjectSchema(refSchema) && refSchema.getEnum() == null) {
275297
schemaType = super.getSchemaType(refSchema);
276298
}
277299
}
@@ -547,7 +569,7 @@ public CodegenModel fromModel(String name, Schema schema, Map<String, Schema> al
547569
if (!getBooleanValue(codegenModel, CodegenConstants.IS_ALIAS_EXT_NAME)) {
548570
boolean isAlias = schema instanceof ArraySchema
549571
|| schema instanceof MapSchema
550-
|| (!isObjectSchema(schema));
572+
|| (!isObjectSchema(schema) && schema.getEnum() == null);
551573

552574
codegenModel.getVendorExtensions().put(CodegenConstants.IS_ALIAS_EXT_NAME, isAlias);
553575
}

0 commit comments

Comments
 (0)