Skip to content

Commit efad139

Browse files
authored
Merge pull request #568 from slinkydeveloper/2.0
Added flag to avoid aggregation of anyOf/allOf/oneOf schemas while using resolveFully()
2 parents 98f27ba + 6634df2 commit efad139

File tree

4 files changed

+114
-57
lines changed

4 files changed

+114
-57
lines changed

modules/swagger-parser-core/src/main/java/io/swagger/v3/parser/core/models/ParseOptions.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
public class ParseOptions {
44
private boolean resolve;
5+
private boolean resolveCombinators = true;
56
private boolean resolveFully;
67
private boolean flatten;
78

@@ -13,6 +14,14 @@ public void setResolve(boolean resolve) {
1314
this.resolve = resolve;
1415
}
1516

17+
public boolean isResolveCombinators() {
18+
return resolveCombinators;
19+
}
20+
21+
public void setResolveCombinators(boolean resolveCombinators) {
22+
this.resolveCombinators = resolveCombinators;
23+
}
24+
1625
public boolean isResolveFully() {
1726
return resolveFully;
1827
}

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/OpenAPIV3Parser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public SwaggerParseResult readLocation(String url, List<AuthorizationValue> auth
5252
}
5353
if (options.isResolveFully()) {
5454
result.setOpenAPI(resolver.resolve());
55-
new ResolverFully().resolveFully(result.getOpenAPI());
55+
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
5656
}else if (options.isFlatten()){
5757
InlineModelResolver inlineResolver = new InlineModelResolver();
5858
inlineResolver.flatten(result.getOpenAPI());
@@ -178,7 +178,7 @@ public SwaggerParseResult readContents(String swaggerAsString, List<Authorizatio
178178
}
179179
}if (options.isResolveFully()){
180180
result.setOpenAPI(new OpenAPIResolver(result.getOpenAPI(), auth, null).resolve());
181-
new ResolverFully().resolveFully(result.getOpenAPI());
181+
new ResolverFully(options.isResolveCombinators()).resolveFully(result.getOpenAPI());
182182

183183
}if (options.isFlatten()){
184184
new InlineModelResolver().flatten(result.getOpenAPI());

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/util/ResolverFully.java

Lines changed: 75 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,21 @@
2121
import java.util.LinkedHashMap;
2222
import java.util.Map;
2323
import java.util.Set;
24+
import java.util.stream.Collectors;
2425

2526
public class ResolverFully {
2627
private static final Logger LOGGER = LoggerFactory.getLogger(ResolverFully.class);
2728

29+
private boolean aggregateCombinators;
30+
31+
public ResolverFully() {
32+
this(true);
33+
}
34+
35+
public ResolverFully(boolean aggregateCombinators) {
36+
this.aggregateCombinators = aggregateCombinators;
37+
}
38+
2839
private Map<String, Schema> schemas;
2940
private Map<String, Schema> resolvedModels = new HashMap<>();
3041
private Map<String, Example> examples;
@@ -179,78 +190,87 @@ public Schema resolveSchema(Schema schema) {
179190

180191
if(schema instanceof ComposedSchema) {
181192
ComposedSchema composedSchema = (ComposedSchema) schema;
182-
Schema model = SchemaTypeUtil.createSchema(composedSchema.getType(),composedSchema.getFormat());
183-
Set<String> requiredProperties = new HashSet<>();
184-
if(composedSchema.getAllOf() != null){
185-
for(Schema innerModel : composedSchema.getAllOf()) {
186-
Schema resolved = resolveSchema(innerModel);
187-
Map<String, Schema> properties = resolved.getProperties();
188-
if (resolved.getProperties() != null) {
189-
190-
for (String key : properties.keySet()) {
191-
Schema prop = (Schema) resolved.getProperties().get(key);
192-
model.addProperties(key, resolveSchema(prop));
193-
}
194-
if (resolved.getRequired() != null) {
195-
for(int i =0;i<resolved.getRequired().size();i++){
196-
if (resolved.getRequired().get(i) != null) {
197-
requiredProperties.add(resolved.getRequired().get(i).toString());
193+
if (aggregateCombinators) {
194+
Schema model = SchemaTypeUtil.createSchema(composedSchema.getType(), composedSchema.getFormat());
195+
Set<String> requiredProperties = new HashSet<>();
196+
if (composedSchema.getAllOf() != null) {
197+
for (Schema innerModel : composedSchema.getAllOf()) {
198+
Schema resolved = resolveSchema(innerModel);
199+
Map<String, Schema> properties = resolved.getProperties();
200+
if (resolved.getProperties() != null) {
201+
for (String key : properties.keySet()) {
202+
Schema prop = (Schema) resolved.getProperties().get(key);
203+
model.addProperties(key, resolveSchema(prop));
204+
}
205+
if (resolved.getRequired() != null) {
206+
for (int i = 0; i < resolved.getRequired().size(); i++) {
207+
if (resolved.getRequired().get(i) != null) {
208+
requiredProperties.add(resolved.getRequired().get(i).toString());
209+
}
198210
}
199211
}
200212
}
201213
}
202-
}
203-
}else if(composedSchema.getOneOf() != null){
204-
for(Schema innerModel : composedSchema.getOneOf()) {
205-
Schema resolved = resolveSchema(innerModel);
206-
Map<String, Schema> properties = resolved.getProperties();
207-
if (resolved.getProperties() != null) {
208-
209-
for (String key : properties.keySet()) {
210-
Schema prop = (Schema) resolved.getProperties().get(key);
211-
model.addProperties(key, resolveSchema(prop));
212-
}
213-
if (resolved.getRequired() != null) {
214-
for(int i =0;i<resolved.getRequired().size();i++){
215-
if (resolved.getRequired().get(i) != null) {
216-
requiredProperties.add(resolved.getRequired().get(i).toString());
214+
} else if (composedSchema.getOneOf() != null) {
215+
for (Schema innerModel : composedSchema.getOneOf()) {
216+
Schema resolved = resolveSchema(innerModel);
217+
Map<String, Schema> properties = resolved.getProperties();
218+
if (resolved.getProperties() != null) {
219+
220+
for (String key : properties.keySet()) {
221+
Schema prop = (Schema) resolved.getProperties().get(key);
222+
model.addProperties(key, resolveSchema(prop));
223+
}
224+
if (resolved.getRequired() != null) {
225+
for (int i = 0; i < resolved.getRequired().size(); i++) {
226+
if (resolved.getRequired().get(i) != null) {
227+
requiredProperties.add(resolved.getRequired().get(i).toString());
228+
}
217229
}
218230
}
219231
}
220232
}
221-
}
222233

223-
}else if(composedSchema.getAnyOf() != null){
224-
for(Schema innerModel : composedSchema.getAnyOf()) {
225-
Schema resolved = resolveSchema(innerModel);
226-
Map<String, Schema> properties = resolved.getProperties();
227-
if (resolved.getProperties() != null) {
234+
} else if (composedSchema.getAnyOf() != null) {
235+
for (Schema innerModel : composedSchema.getAnyOf()) {
236+
Schema resolved = resolveSchema(innerModel);
237+
Map<String, Schema> properties = resolved.getProperties();
238+
if (resolved.getProperties() != null) {
228239

229-
for (String key : properties.keySet()) {
230-
Schema prop = (Schema) resolved.getProperties().get(key);
231-
model.addProperties(key, resolveSchema(prop));
232-
}
233-
if (resolved.getRequired() != null) {
234-
for(int i =0;i<resolved.getRequired().size();i++){
235-
if (resolved.getRequired().get(i) != null) {
236-
requiredProperties.add(resolved.getRequired().get(i).toString());
240+
for (String key : properties.keySet()) {
241+
Schema prop = (Schema) resolved.getProperties().get(key);
242+
model.addProperties(key, resolveSchema(prop));
243+
}
244+
if (resolved.getRequired() != null) {
245+
for (int i = 0; i < resolved.getRequired().size(); i++) {
246+
if (resolved.getRequired().get(i) != null) {
247+
requiredProperties.add(resolved.getRequired().get(i).toString());
248+
}
237249
}
238250
}
239251
}
240252
}
241-
242253
}
243-
}
244-
if(requiredProperties.size() > 0) {
245-
model.setRequired(new ArrayList<>(requiredProperties));
246-
}
247-
if(composedSchema.getExtensions() != null) {
248-
Map<String, Object> extensions = composedSchema.getExtensions();
249-
for(String key : extensions.keySet()) {
250-
model.addExtension(key, composedSchema.getExtensions().get(key));
254+
if (requiredProperties.size() > 0) {
255+
model.setRequired(new ArrayList<>(requiredProperties));
256+
}
257+
if (composedSchema.getExtensions() != null) {
258+
Map<String, Object> extensions = composedSchema.getExtensions();
259+
for (String key : extensions.keySet()) {
260+
model.addExtension(key, composedSchema.getExtensions().get(key));
261+
}
251262
}
263+
return model;
264+
} else {
265+
// User don't want to aggregate composed schema, we only solve refs
266+
if (composedSchema.getAllOf() != null)
267+
composedSchema.allOf(composedSchema.getAllOf().stream().map(this::resolveSchema).collect(Collectors.toList()));
268+
else if (composedSchema.getOneOf() != null)
269+
composedSchema.oneOf(composedSchema.getOneOf().stream().map(this::resolveSchema).collect(Collectors.toList()));
270+
else if (composedSchema.getAnyOf() != null)
271+
composedSchema.anyOf(composedSchema.getAnyOf().stream().map(this::resolveSchema).collect(Collectors.toList()));
272+
return composedSchema;
252273
}
253-
return model;
254274
}
255275

256276
if (schema.getProperties() != null) {

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/test/OpenAPIResolverTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,34 @@ public void selfReferenceTest(@Injectable final List<AuthorizationValue> auths)
534534

535535
}
536536

537+
@Test
538+
public void resolveAllOfWithoutAggregatingParameters(@Injectable final List<AuthorizationValue> auths) {
539+
ParseOptions options = new ParseOptions();
540+
options.setResolveFully(true);
541+
options.setResolveCombinators(false);
542+
543+
// Testing components/schemas
544+
OpenAPI openAPI = new OpenAPIV3Parser().readLocation("src/test/resources/composed.yaml",auths,options).getOpenAPI();
545+
546+
ComposedSchema allOf = (ComposedSchema) openAPI.getComponents().getSchemas().get("ExtendedAddress");
547+
assertEquals(allOf.getAllOf().size(), 2);
548+
549+
assertTrue(allOf.getAllOf().get(0).getProperties().containsKey("street"));
550+
assertTrue(allOf.getAllOf().get(1).getProperties().containsKey("gps"));
551+
552+
// Testing path item
553+
ComposedSchema schema = (ComposedSchema) openAPI.getPaths().get("/withInvalidComposedModel").getPost().getRequestBody().getContent().get("application/json").getSchema();
554+
555+
// In fact the schema resolved previously is the same of /withInvalidComposedModel
556+
assertEquals(schema, allOf);
557+
558+
assertEquals(schema.getAllOf().size(), 2);
559+
560+
assertTrue(schema.getAllOf().get(0).getProperties().containsKey("street"));
561+
assertTrue(schema.getAllOf().get(1).getProperties().containsKey("gps"));
562+
563+
}
564+
537565
@Test
538566
public void resolveComposedReferenceSchema(@Injectable final List<AuthorizationValue> auths){
539567

0 commit comments

Comments
 (0)