78
78
import java .io .File ;
79
79
import java .io .IOException ;
80
80
import java .io .InputStream ;
81
+ import java .io .UnsupportedEncodingException ;
82
+ import java .net .URLDecoder ;
83
+ import java .nio .charset .StandardCharsets ;
81
84
import java .util .ArrayList ;
82
85
import java .util .Arrays ;
83
86
import java .util .Collections ;
106
109
import static io .swagger .codegen .v3 .generators .CodegenHelper .getTypeMappings ;
107
110
import static io .swagger .codegen .v3 .generators .CodegenHelper .initalizeSpecialCharacterMapping ;
108
111
import static io .swagger .codegen .v3 .generators .handlebars .ExtensionHelper .getBooleanValue ;
109
- import static io .swagger .codegen .v3 .utils .ModelUtils .processCodegenModels ;
110
112
111
113
public abstract class DefaultCodegenConfig implements CodegenConfig {
112
114
private static final Logger LOGGER = LoggerFactory .getLogger (DefaultCodegenConfig .class );
@@ -265,11 +267,47 @@ public Map<String, Object> postProcessAllModels(Map<String, Object> processedMod
265
267
}
266
268
}
267
269
if (supportsInheritance ) {
268
- processCodegenModels (allModels );
270
+ for (String name : allModels .keySet ()) {
271
+ final CodegenModel codegenModel = allModels .get (name );
272
+ fixUpParentAndInterfaces (codegenModel , allModels );
273
+ }
269
274
}
270
275
return processedModels ;
271
276
}
272
277
278
+ /**
279
+ * Fix up all parent and interface CodegenModel references.
280
+ * @param allModels
281
+ */
282
+ protected void fixUpParentAndInterfaces (CodegenModel codegenModel , Map <String , CodegenModel > allModels ) {
283
+ if (codegenModel .parent != null ) {
284
+ codegenModel .parentModel = allModels .get (codegenModel .parent );
285
+ }
286
+ if (codegenModel .interfaces != null && !codegenModel .interfaces .isEmpty ()) {
287
+ codegenModel .interfaceModels = new ArrayList <CodegenModel >(codegenModel .interfaces .size ());
288
+ for (String intf : codegenModel .interfaces ) {
289
+ CodegenModel intfModel = allModels .get (intf );
290
+ if (intfModel != null ) {
291
+ codegenModel .interfaceModels .add (intfModel );
292
+ }
293
+ }
294
+ }
295
+ CodegenModel parent = codegenModel .parentModel ;
296
+ // if a discriminator exists on the parent, don't add this child to the inheritance hierarchy
297
+ // TODO Determine what to do if the parent discriminator name == the grandparent discriminator name
298
+ while (parent != null ) {
299
+ if (parent .children == null ) {
300
+ parent .children = new ArrayList <CodegenModel >();
301
+ }
302
+ parent .children .add (codegenModel );
303
+ if (parent .discriminator == null ) {
304
+ parent = allModels .get (parent .parent );
305
+ } else {
306
+ parent = null ;
307
+ }
308
+ }
309
+ }
310
+
273
311
// override with any special post-processing
274
312
@ SuppressWarnings ("static-method" )
275
313
public Map <String , Object > postProcessModels (Map <String , Object > objs ) {
@@ -1241,6 +1279,9 @@ public String toModelName(final String name) {
1241
1279
* @return Codegen Model object
1242
1280
*/
1243
1281
public CodegenModel fromModel (String name , Schema schema ) {
1282
+ if (openAPI != null && openAPI .getComponents () != null && openAPI .getComponents ().getSchemas () != null ) {
1283
+ return fromModel (name , schema , openAPI .getComponents ().getSchemas ());
1284
+ }
1244
1285
return fromModel (name , schema , null );
1245
1286
}
1246
1287
@@ -2059,6 +2100,11 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
2059
2100
Schema schema = body .getContent ().get (contentType ).getSchema ();
2060
2101
if (schema != null && StringUtils .isNotBlank (schema .get$ref ())) {
2061
2102
schemaName = OpenAPIUtil .getSimpleRef (schema .get$ref ());
2103
+ try {
2104
+ schemaName = URLDecoder .decode (schemaName , StandardCharsets .UTF_8 .name ());
2105
+ } catch (UnsupportedEncodingException e ) {
2106
+ LOGGER .error ("Could not decoded string: " + schemaName , e );
2107
+ }
2062
2108
schema = schemas .get (schemaName );
2063
2109
}
2064
2110
final CodegenContent codegenContent = new CodegenContent (contentType );
@@ -2133,31 +2179,6 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
2133
2179
param = getParameterFromRef (param .get$ref (), openAPI );
2134
2180
}
2135
2181
CodegenParameter codegenParameter = fromParameter (param , imports );
2136
- // rename parameters to make sure all of them have unique names
2137
- if (ensureUniqueParams ) {
2138
- while (true ) {
2139
- boolean exists = false ;
2140
- for (CodegenParameter cp : allParams ) {
2141
- if (codegenParameter .paramName != null && codegenParameter .paramName .equals (cp .paramName )) {
2142
- exists = true ;
2143
- break ;
2144
- }
2145
- }
2146
- if (exists ) {
2147
- codegenParameter .paramName = generateNextName (codegenParameter .paramName );
2148
- } else {
2149
- break ;
2150
- }
2151
- }
2152
- }
2153
-
2154
- // set isPrimitiveType and baseType for allParams
2155
- /*if (languageSpecificPrimitives.contains(p.baseType)) {
2156
- p.isPrimitiveType = true;
2157
- p.baseType = getSwaggerType(p);
2158
- }*/
2159
-
2160
-
2161
2182
allParams .add (codegenParameter );
2162
2183
// Issue #2561 (neilotoole) : Moved setting of is<Type>Param flags
2163
2184
// from here to fromParameter().
@@ -2170,9 +2191,7 @@ public CodegenOperation fromOperation(String path, String httpMethod, Operation
2170
2191
} else if (param instanceof CookieParameter || "cookie" .equalsIgnoreCase (param .getIn ())) {
2171
2192
cookieParams .add (codegenParameter .copy ());
2172
2193
}
2173
- if (!codegenParameter .required ) {
2174
- codegenOperation .getVendorExtensions ().put (CodegenConstants .HAS_OPTIONAL_PARAMS_EXT_NAME , Boolean .TRUE );
2175
- } else {
2194
+ if (codegenParameter .required ) {
2176
2195
requiredParams .add (codegenParameter .copy ());
2177
2196
}
2178
2197
}
@@ -2219,6 +2238,10 @@ public int compare(CodegenParameter one, CodegenParameter another) {
2219
2238
boolean hasRequiredParams = codegenOperation .requiredParams .size () > 0 ;
2220
2239
codegenOperation .getVendorExtensions ().put (CodegenConstants .HAS_REQUIRED_PARAMS_EXT_NAME , hasRequiredParams );
2221
2240
2241
+ boolean hasOptionalParams = codegenOperation .allParams .stream ()
2242
+ .anyMatch (codegenParameter -> !codegenParameter .required );
2243
+ codegenOperation .getVendorExtensions ().put (CodegenConstants .HAS_OPTIONAL_PARAMS_EXT_NAME , hasOptionalParams );
2244
+
2222
2245
// set Restful Flag
2223
2246
codegenOperation .getVendorExtensions ().put (CodegenConstants .IS_RESTFUL_SHOW_EXT_NAME , codegenOperation .getIsRestfulShow ());
2224
2247
codegenOperation .getVendorExtensions ().put (CodegenConstants .IS_RESTFUL_INDEX_EXT_NAME , codegenOperation .getIsRestfulIndex ());
@@ -4216,6 +4239,10 @@ protected void configuresParameterForMediaType(CodegenOperation codegenOperation
4216
4239
}
4217
4240
this .addCodegenContentParemeters (codegenOperation , codegenContents );
4218
4241
for (CodegenContent content : codegenContents ) {
4242
+ if (ensureUniqueParams ) {
4243
+ ensureUniqueParameters (content .getParameters ());
4244
+ }
4245
+
4219
4246
Collections .sort (content .getParameters (), (CodegenParameter one , CodegenParameter another ) -> {
4220
4247
if (one .required == another .required ){
4221
4248
return 0 ;
@@ -4250,6 +4277,20 @@ protected void addCodegenContentParemeters(CodegenOperation codegenOperation, Li
4250
4277
}
4251
4278
}
4252
4279
4280
+ protected void ensureUniqueParameters (List <CodegenParameter > codegenParameters ) {
4281
+ if (codegenParameters == null || codegenParameters .isEmpty ()) {
4282
+ return ;
4283
+ }
4284
+ for (CodegenParameter codegenParameter : codegenParameters ) {
4285
+ long count = codegenParameters .stream ()
4286
+ .filter (codegenParam -> codegenParam .paramName .equals (codegenParameter .paramName ))
4287
+ .count ();
4288
+ if (count > 1l ) {
4289
+ codegenParameter .paramName = generateNextName (codegenParameter .paramName );
4290
+ }
4291
+ }
4292
+ }
4293
+
4253
4294
protected void setParameterNullable (CodegenParameter parameter , CodegenProperty property ) {
4254
4295
parameter .nullable = property .nullable ;
4255
4296
}
0 commit comments