|
10 | 10 | import io.swagger.v3.oas.models.media.Schema;
|
11 | 11 | import io.swagger.v3.oas.models.media.XML;
|
12 | 12 | import java.util.ArrayList;
|
| 13 | +import java.util.HashSet; |
13 | 14 | import java.util.LinkedHashMap;
|
14 | 15 | import java.util.List;
|
15 | 16 | import java.util.Map;
|
16 | 17 | import java.util.Objects;
|
17 | 18 | import java.util.Optional;
|
| 19 | +import java.util.Set; |
18 | 20 | import org.openapitools.openapidiff.core.compare.schemadiffresult.ArraySchemaDiffResult;
|
19 | 21 | import org.openapitools.openapidiff.core.compare.schemadiffresult.ComposedSchemaDiffResult;
|
20 | 22 | import org.openapitools.openapidiff.core.compare.schemadiffresult.SchemaDiffResult;
|
@@ -79,17 +81,26 @@ public static SchemaDiffResult getSchemaDiffResult(
|
79 | 81 | }
|
80 | 82 | }
|
81 | 83 |
|
82 |
| - protected static Schema<?> resolveComposedSchema(Components components, Schema<?> schema) { |
| 84 | + protected static Schema<?> resolveComposedSchema( |
| 85 | + Components components, Schema<?> schema, Set<String> visitedRefs) { |
83 | 86 | if (schema instanceof ComposedSchema) {
|
84 | 87 | ComposedSchema composedSchema = (ComposedSchema) schema;
|
85 |
| - List<Schema> allOfSchemaList = composedSchema.getAllOf(); |
86 |
| - if (allOfSchemaList != null) { |
87 |
| - for (Schema<?> allOfSchema : allOfSchemaList) { |
88 |
| - allOfSchema = refPointer.resolveRef(components, allOfSchema, allOfSchema.get$ref()); |
89 |
| - allOfSchema = resolveComposedSchema(components, allOfSchema); |
90 |
| - schema = addSchema(schema, allOfSchema); |
| 88 | + List<Schema> composedSchemas = new ArrayList<>(); |
| 89 | + Optional.ofNullable(composedSchema.getAllOf()).ifPresent(composedSchemas::addAll); |
| 90 | + Optional.ofNullable(composedSchema.getAnyOf()).ifPresent(composedSchemas::addAll); |
| 91 | + |
| 92 | + if (!composedSchemas.isEmpty()) { |
| 93 | + for (Schema<?> composed : composedSchemas) { |
| 94 | + if (composed.get$ref() == null || !visitedRefs.contains(composed.get$ref())) { |
| 95 | + Set<String> updatedVisitedRefs = new HashSet<>(visitedRefs); |
| 96 | + updatedVisitedRefs.add(composed.get$ref()); |
| 97 | + composed = refPointer.resolveRef(components, composed, composed.get$ref()); |
| 98 | + composed = resolveComposedSchema(components, composed, updatedVisitedRefs); |
| 99 | + schema = addSchema(schema, composed); |
| 100 | + } |
91 | 101 | }
|
92 | 102 | composedSchema.setAllOf(null);
|
| 103 | + composedSchema.setAnyOf(null); |
93 | 104 | }
|
94 | 105 | }
|
95 | 106 | return schema;
|
@@ -154,6 +165,16 @@ protected static Schema<?> addSchema(Schema<?> schema, Schema<?> fromSchema) {
|
154 | 165 | }
|
155 | 166 | schema.getExtensions().putAll(fromSchema.getExtensions());
|
156 | 167 | }
|
| 168 | + if (fromSchema instanceof ComposedSchema && schema instanceof ComposedSchema) { |
| 169 | + ComposedSchema composedFromSchema = (ComposedSchema) fromSchema; |
| 170 | + ComposedSchema composedSchema = (ComposedSchema) schema; |
| 171 | + if (composedFromSchema.getOneOf() != null) { |
| 172 | + if (composedSchema.getOneOf() == null) { |
| 173 | + composedSchema.setOneOf(new ArrayList<>()); |
| 174 | + } |
| 175 | + composedSchema.getOneOf().addAll(composedFromSchema.getOneOf()); |
| 176 | + } |
| 177 | + } |
157 | 178 | if (fromSchema.getDiscriminator() != null) {
|
158 | 179 | if (schema.getDiscriminator() == null) {
|
159 | 180 | schema.setDiscriminator(new Discriminator());
|
@@ -316,8 +337,8 @@ public DeferredChanged<ChangedSchema> computeDiffForReal(
|
316 | 337 | left = refPointer.resolveRef(this.leftComponents, left, getSchemaRef(left));
|
317 | 338 | right = refPointer.resolveRef(this.rightComponents, right, getSchemaRef(right));
|
318 | 339 |
|
319 |
| - left = resolveComposedSchema(leftComponents, left); |
320 |
| - right = resolveComposedSchema(rightComponents, right); |
| 340 | + left = resolveComposedSchema(leftComponents, left, new HashSet<>()); |
| 341 | + right = resolveComposedSchema(rightComponents, right, new HashSet<>()); |
321 | 342 |
|
322 | 343 | // If type of schemas are different, just set old & new schema, set changedType to true in
|
323 | 344 | // SchemaDiffResult and
|
|
0 commit comments