1
1
package io .swagger .codegen .v3 .generators ;
2
2
3
- import io .swagger .codegen .v3 .*;
3
+ import io .swagger .codegen .v3 .CodegenModel ;
4
+ import io .swagger .codegen .v3 .CodegenModelFactory ;
5
+ import io .swagger .codegen .v3 .CodegenModelType ;
6
+ import io .swagger .codegen .v3 .CodegenProperty ;
4
7
import io .swagger .codegen .v3 .generators .util .OpenAPIUtil ;
5
8
import io .swagger .v3 .oas .models .media .ComposedSchema ;
9
+ import io .swagger .v3 .oas .models .media .ObjectSchema ;
6
10
import io .swagger .v3 .oas .models .media .Schema ;
7
11
import org .apache .commons .lang3 .StringUtils ;
8
12
@@ -28,27 +32,63 @@ public void createCodegenModel(ComposedSchema composedProperty, CodegenProperty
28
32
final List <Schema > anyOf = composedProperty .getAnyOf ();
29
33
30
34
if (oneOf != null && !oneOf .isEmpty ()) {
31
- final CodegenModel oneOfModel = createFromOneOfSchemas (oneOf );
32
- codegenProperty .vendorExtensions .put ("oneOf-model" , oneOfModel );
35
+ if (!hasNonObjectSchema (oneOf )) {
36
+ final CodegenModel oneOfModel = createFromOneOfSchemas (oneOf );
37
+ codegenProperty .vendorExtensions .put ("oneOf-model" , oneOfModel );
38
+ }
33
39
}
34
40
if (anyOf != null && !anyOf .isEmpty ()) {
35
- final CodegenModel anyOfModel = createFromOneOfSchemas (anyOf );
36
- codegenProperty .vendorExtensions .put ("anyOf-model" , anyOfModel );
41
+ if (!hasNonObjectSchema (anyOf )) {
42
+ final CodegenModel anyOfModel = createFromOneOfSchemas (anyOf );
43
+ codegenProperty .vendorExtensions .put ("anyOf-model" , anyOfModel );
44
+ }
37
45
}
38
46
39
47
}
40
48
41
- public void configureOneOfModel (CodegenModel codegenModel , List <Schema > oneOf ) {
42
- String oneOfModelName = "OneOf" + codegenModel .name ;
43
- final CodegenModel oneOfModel = CodegenModelFactory .newInstance (CodegenModelType .MODEL );
44
- oneOfModel .name = oneOfModelName ;
45
- oneOfModel .classname = codegenConfig .toModelName (oneOfModelName );
46
- oneOfModel .classVarName = codegenConfig .toVarName (oneOfModelName );
47
- oneOfModel .classFilename = codegenConfig .toModelFilename (oneOfModelName );
48
- oneOfModel .vendorExtensions .put ("x-is-composed-model" , Boolean .TRUE );
49
+ public void configureComposedModelFromSchemaItems (CodegenModel codegenModel , ComposedSchema items ) {
50
+ List <Schema > oneOfList = items .getOneOf ();
51
+ if (oneOfList != null && !oneOfList .isEmpty ()){
52
+ String name = "OneOf" + codegenModel .name + "Items" ;
53
+ final CodegenModel oneOfModel = createComposedModel (name );
54
+ // setting name to be used as instance type on composed model.
55
+ items .addExtension ("x-model-name" , codegenConfig .toModelName (name ));
56
+
57
+ final List <String > modelNames = new ArrayList <>();
58
+ for (Schema interfaceSchema : oneOfList ) {
59
+ if (StringUtils .isNotBlank (interfaceSchema .get$ref ())) {
60
+ String schemaName = OpenAPIUtil .getSimpleRef (interfaceSchema .get$ref ());
61
+ modelNames .add (codegenConfig .toModelName (schemaName ));
62
+ }
63
+ }
64
+ oneOfModel .vendorExtensions .put ("x-model-names" , modelNames );
65
+ if (!modelNames .isEmpty ()) {
66
+ codegenModel .vendorExtensions .put ("oneOf-model" , oneOfModel );
67
+ }
68
+ }
69
+ List <Schema > anyOfList = items .getAnyOf ();
70
+ if (anyOfList != null && !anyOfList .isEmpty ()){
71
+ String name = "AnyOf" + codegenModel .name + "Items" ;
72
+ final CodegenModel anyOfModel = createComposedModel (name );
73
+ items .addExtension ("x-model-name" , codegenConfig .toModelName (name ));
74
+
75
+ final List <String > modelNames = new ArrayList <>();
76
+ for (Schema interfaceSchema : anyOfList ) {
77
+ if (StringUtils .isNotBlank (interfaceSchema .get$ref ())) {
78
+ String schemaName = OpenAPIUtil .getSimpleRef (interfaceSchema .get$ref ());
79
+ modelNames .add (codegenConfig .toModelName (schemaName ));
80
+ }
81
+ }
82
+ anyOfModel .vendorExtensions .put ("x-model-names" , modelNames );
83
+ if (!modelNames .isEmpty ()) {
84
+ codegenModel .vendorExtensions .put ("anyOf-model" , anyOfModel );
85
+ }
86
+ }
87
+ }
49
88
89
+ public void configureOneOfModel (CodegenModel codegenModel , List <Schema > oneOf ) {
90
+ final CodegenModel oneOfModel = createComposedModel ("OneOf" + codegenModel .name );
50
91
final List <String > modelNames = new ArrayList <>();
51
-
52
92
for (Schema interfaceSchema : oneOf ) {
53
93
if (StringUtils .isNotBlank (interfaceSchema .get$ref ())) {
54
94
String schemaName = OpenAPIUtil .getSimpleRef (interfaceSchema .get$ref ());
@@ -66,16 +106,8 @@ public void configureOneOfModel(CodegenModel codegenModel, List<Schema> oneOf) {
66
106
}
67
107
68
108
public void configureAnyOfModel (CodegenModel codegenModel , List <Schema > anyOf ) {
69
- String anyOfModelName = "AnyOf" + codegenModel .name ;
70
- final CodegenModel anyOfModel = CodegenModelFactory .newInstance (CodegenModelType .MODEL );
71
- anyOfModel .name = anyOfModelName ;
72
- anyOfModel .classname = codegenConfig .toModelName (anyOfModelName );
73
- anyOfModel .classVarName = codegenConfig .toVarName (anyOfModelName );
74
- anyOfModel .classFilename = codegenConfig .toModelFilename (anyOfModelName );
75
- anyOfModel .vendorExtensions .put ("x-is-composed-model" , Boolean .TRUE );
76
-
109
+ final CodegenModel anyOfModel = createComposedModel ("AnyOf" + codegenModel .name );
77
110
final List <String > modelNames = new ArrayList <>();
78
-
79
111
for (Schema interfaceSchema : anyOf ) {
80
112
if (StringUtils .isNotBlank (interfaceSchema .get$ref ())) {
81
113
String schemaName = OpenAPIUtil .getSimpleRef (interfaceSchema .get$ref ());
@@ -96,16 +128,13 @@ public void configureOneOfModelFromProperty(CodegenProperty codegenProperty, Cod
96
128
String name = "OneOf" + codegenConfig .toModelName (codegenModel .name );
97
129
name += codegenConfig .toModelName (codegenProperty .name );
98
130
CodegenModel oneOfModel = (CodegenModel ) codegenProperty .vendorExtensions .get ("oneOf-model" );
99
- oneOfModel .name = name ;
100
- oneOfModel .classname = codegenConfig .toModelName (name );
101
- oneOfModel .classVarName = codegenConfig .toVarName (name );
102
- oneOfModel .classFilename = codegenConfig .toModelFilename (name );
103
- oneOfModel .vendorExtensions .put ("x-is-composed-model" , Boolean .TRUE );
131
+ this .configureModel (oneOfModel , name );
104
132
codegenProperty .vendorExtensions .remove ("oneOf-model" );
105
133
106
134
codegenProperty .datatype = name ;
107
135
codegenProperty .datatypeWithEnum = name ;
108
136
codegenProperty .baseType = name ;
137
+ codegenProperty .complexType = name ;
109
138
110
139
codegenModel .vendorExtensions .put ("oneOf-model" , oneOfModel );
111
140
}
@@ -114,16 +143,13 @@ public void configureAnyOfModelFromProperty(CodegenProperty codegenProperty, Cod
114
143
String name = "AnyOf" + codegenConfig .toModelName (codegenModel .name );
115
144
name += codegenConfig .toModelName (codegenProperty .name );
116
145
CodegenModel anyOfModel = (CodegenModel ) codegenProperty .vendorExtensions .get ("anyOf-model" );
117
- anyOfModel .name = name ;
118
- anyOfModel .classname = codegenConfig .toModelName (name );
119
- anyOfModel .classVarName = codegenConfig .toVarName (name );
120
- anyOfModel .classFilename = codegenConfig .toModelFilename (name );
121
- anyOfModel .vendorExtensions .put ("x-is-composed-model" , Boolean .TRUE );
146
+ this .configureModel (anyOfModel , name );
122
147
codegenProperty .vendorExtensions .remove ("anyOf-model" );
123
148
124
149
codegenProperty .datatype = name ;
125
150
codegenProperty .datatypeWithEnum = name ;
126
151
codegenProperty .baseType = name ;
152
+ codegenProperty .complexType = name ;
127
153
128
154
codegenModel .vendorExtensions .put ("anyOf-model" , anyOfModel );
129
155
}
@@ -141,4 +167,28 @@ private CodegenModel createFromOneOfSchemas(List<Schema> schemas) {
141
167
codegenModel .vendorExtensions .put ("x-model-names" , modelNames );
142
168
return codegenModel ;
143
169
}
170
+
171
+ private CodegenModel createComposedModel (String name ) {
172
+ final CodegenModel composedModel = CodegenModelFactory .newInstance (CodegenModelType .MODEL );
173
+ this .configureModel (composedModel , name );
174
+ return composedModel ;
175
+ }
176
+
177
+ private void configureModel (CodegenModel codegenModel , String name ) {
178
+ codegenModel .name = name ;
179
+ codegenModel .classname = codegenConfig .toModelName (name );
180
+ codegenModel .classVarName = codegenConfig .toVarName (name );
181
+ codegenModel .classFilename = codegenConfig .toModelFilename (name );
182
+ codegenModel .vendorExtensions .put ("x-is-composed-model" , Boolean .TRUE );
183
+ }
184
+
185
+ private boolean hasNonObjectSchema (List <Schema > schemas ) {
186
+ for (Schema schema : schemas ) {
187
+ boolean hasNonObjectSchema = (!(schema instanceof ObjectSchema )) || (schema .getProperties () != null && !schema .getProperties ().isEmpty ());
188
+ if (hasNonObjectSchema ) {
189
+ return true ;
190
+ }
191
+ }
192
+ return false ;
193
+ }
144
194
}
0 commit comments