|
1 | 1 | package io.swagger.v3.parser.util;
|
2 | 2 |
|
3 |
| -import java.util.ArrayList; |
4 |
| -import java.util.HashMap; |
5 |
| -import java.util.List; |
6 |
| -import java.util.Map; |
| 3 | +import java.util.*; |
7 | 4 |
|
8 | 5 | import org.slf4j.Logger;
|
9 | 6 | import org.slf4j.LoggerFactory;
|
@@ -102,10 +99,20 @@ private void flattenBody(String pathname, RequestBody body)
|
102 | 99 | String genericName = pathBody(pathname);
|
103 | 100 | if (model.getProperties() != null && model.getProperties().size() > 0) {
|
104 | 101 | flattenProperties(model.getProperties(), pathname);
|
105 |
| - String modelName = resolveModelName(model.getTitle(), genericName); |
106 |
| - mediaType.setSchema(new Schema().$ref(modelName)); |
107 |
| - addGenerated(modelName, model); |
108 |
| - openAPI.getComponents().addSchemas(modelName, model); |
| 102 | + if(openAPI.getComponents().getSchemas() == null ) { |
| 103 | + createBodySchemaReference(mediaType, model, genericName); |
| 104 | + } else if (!openAPI.getComponents().getSchemas().containsValue(model)) { |
| 105 | + createBodySchemaReference(mediaType, model, genericName); |
| 106 | + } else { |
| 107 | + //Look at Components.schemas and use the reference name |
| 108 | + String modelName = ""; |
| 109 | + for (Map.Entry<String, Schema> component : openAPI.getComponents().getSchemas().entrySet()) { |
| 110 | + if (component.getValue().equals(model)) { |
| 111 | + modelName = component.getKey(); |
| 112 | + } |
| 113 | + } |
| 114 | + mediaType.setSchema(new Schema().$ref(modelName)); |
| 115 | + } |
109 | 116 | } else if (model instanceof ComposedSchema) {
|
110 | 117 | flattenComposedSchema(model, pathname);
|
111 | 118 | if (model.get$ref() == null) {
|
@@ -145,6 +152,13 @@ private void flattenBody(String pathname, RequestBody body)
|
145 | 152 | }
|
146 | 153 | }
|
147 | 154 |
|
| 155 | + private void createBodySchemaReference(MediaType mediaType, Schema model, String genericName) { |
| 156 | + String modelName = resolveModelName(model.getTitle(), genericName); |
| 157 | + mediaType.setSchema(new Schema().$ref(modelName)); |
| 158 | + addGenerated(modelName, model); |
| 159 | + openAPI.getComponents().addSchemas(modelName, model); |
| 160 | + } |
| 161 | + |
148 | 162 | private void flattenParams(String pathname, List<Parameter> parameters)
|
149 | 163 | {
|
150 | 164 | if (parameters == null){
|
@@ -480,32 +494,20 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
|
480 | 494 | for (String key : properties.keySet()) {
|
481 | 495 | Schema property = properties.get(key);
|
482 | 496 | if (isObjectSchema(property) && property.getProperties() != null && property.getProperties().size() > 0) {
|
483 |
| - String modelName = resolveModelName(property.getTitle(), path + "_" + key); |
484 |
| - Schema model = createModelFromProperty(property, modelName); |
485 |
| - String existing = matchGenerated(model); |
486 |
| - if (existing != null) { |
487 |
| - propsToUpdate.put(key, new Schema().$ref(existing)); |
488 |
| - } else { |
489 |
| - propsToUpdate.put(key, new Schema().$ref(RefType.SCHEMAS.getInternalPrefix()+modelName)); |
490 |
| - modelsToAdd.put(modelName, model); |
491 |
| - addGenerated(modelName, model); |
492 |
| - openAPI.getComponents().addSchemas(modelName, model); |
| 497 | + if(openAPI.getComponents().getSchemas() == null){ |
| 498 | + createSchemaProperty(path, propsToUpdate, modelsToAdd, key, property); |
| 499 | + }else if (!openAPI.getComponents().getSchemas().containsValue(property)) { |
| 500 | + createSchemaProperty(path, propsToUpdate, modelsToAdd, key, property); |
493 | 501 | }
|
494 | 502 | } else if (property instanceof ArraySchema) {
|
495 | 503 | ArraySchema ap = (ArraySchema) property;
|
496 | 504 | Schema inner = ap.getItems();
|
497 | 505 | if (isObjectSchema(inner)) {
|
498 | 506 | if (inner.getProperties() != null && inner.getProperties().size() > 0) {
|
499 |
| - flattenProperties(inner.getProperties(), path); |
500 |
| - String modelName = resolveModelName(inner.getTitle(), path + "_" + key); |
501 |
| - Schema innerModel = createModelFromProperty(inner, modelName); |
502 |
| - String existing = matchGenerated(innerModel); |
503 |
| - if (existing != null) { |
504 |
| - ap.setItems(new Schema().$ref(existing)); |
505 |
| - } else { |
506 |
| - ap.setItems(new Schema().$ref(modelName)); |
507 |
| - addGenerated(modelName, innerModel); |
508 |
| - openAPI.getComponents().addSchemas(modelName, innerModel); |
| 507 | + if(openAPI.getComponents().getSchemas() == null) { |
| 508 | + createArraySchemaProperty(path, key, ap, inner); |
| 509 | + }else if (!openAPI.getComponents().getSchemas().containsValue(inner)) { |
| 510 | + createArraySchemaProperty(path, key, ap, inner); |
509 | 511 | }
|
510 | 512 | }else if (inner instanceof ComposedSchema && this.flattenComposedSchemas) {
|
511 | 513 | flattenComposedSchema(inner,key);
|
@@ -551,6 +553,34 @@ public void flattenProperties(Map<String, Schema> properties, String path) {
|
551 | 553 | }
|
552 | 554 | }
|
553 | 555 |
|
| 556 | + private void createArraySchemaProperty(String path, String key, ArraySchema ap, Schema inner) { |
| 557 | + flattenProperties(inner.getProperties(), path); |
| 558 | + String modelName = resolveModelName(inner.getTitle(), path + "_" + key); |
| 559 | + Schema innerModel = createModelFromProperty(inner, modelName); |
| 560 | + String existing = matchGenerated(innerModel); |
| 561 | + if (existing != null) { |
| 562 | + ap.setItems(new Schema().$ref(existing)); |
| 563 | + } else { |
| 564 | + ap.setItems(new Schema().$ref(modelName)); |
| 565 | + addGenerated(modelName, innerModel); |
| 566 | + openAPI.getComponents().addSchemas(modelName, innerModel); |
| 567 | + } |
| 568 | + } |
| 569 | + |
| 570 | + private void createSchemaProperty(String path, Map<String, Schema> propsToUpdate, Map<String, Schema> modelsToAdd, String key, Schema property) { |
| 571 | + String modelName = resolveModelName(property.getTitle(), path + "_" + key); |
| 572 | + Schema model = createModelFromProperty(property, modelName); |
| 573 | + String existing = matchGenerated(model); |
| 574 | + if (existing != null) { |
| 575 | + propsToUpdate.put(key, new Schema().$ref(existing)); |
| 576 | + } else { |
| 577 | + propsToUpdate.put(key, new Schema().$ref(RefType.SCHEMAS.getInternalPrefix() + modelName)); |
| 578 | + modelsToAdd.put(modelName, model); |
| 579 | + addGenerated(modelName, model); |
| 580 | + openAPI.getComponents().addSchemas(modelName, model); |
| 581 | + } |
| 582 | + } |
| 583 | + |
554 | 584 | private void flattenComposedSchema(Schema inner, String key) {
|
555 | 585 |
|
556 | 586 | ComposedSchema composedSchema = (ComposedSchema) inner;
|
|
0 commit comments