RepreZen / KaiZen-OpenApi-Parser

High-performance Parser, Validator, and Java Object Model for OpenAPI 3.x
130 stars 31 forks source link

Can't parse OpenAPI with circular references #255

Open mbrodowski opened 4 years ago

mbrodowski commented 4 years ago

I'm trying to parse API containing a circular relationship, like following:

{
  "openapi": "3.0.0",
  "info": {
    "description": "Products",
    "version": "1.0.0",
    "title": "Product API",
    "contact": {
      "name": "Test",
      "email": "Test"
    },
    "license": {
      "name": "Proprietary license"
    }
  },
  "tags": [],
  "security": [
    {
      "accessToken": []
    },
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/products": {
      "get": {
        "tags": [
          "Product"
        ],
        "summary": "Search Products",
        "operationId": "searchProducts",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {},
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                }
              }
            }
          }
        },
        "deprecated": false
      }
    }
  },
  "servers": [],
  "components": {
    "securitySchemes": {
      "accessToken": {
        "description": "Access token in JWT or opaque format sent in HTTP Authorization header, Bearer schema",
        "type": "apiKey",
        "name": "Authorization",
        "in": "header"
      },
      "apiKey": {
        "description": "API key for technical accounts (opaque format) sent in HTTP Authorization header, no schema",
        "type": "apiKey",
        "name": "Authorization",
        "in": "header"
      }
    },
    "schemas": {
      "Product": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Unique identifier for the product"
          },
          "href": {
            "type": "string",
            "description": "Reference of the product"
          },
          "name": {
            "type": "string",
            "description": "Name of the product "
          },
          "description": {
            "type": "string",
            "description": "Description of the product "
          },
          "productRelationships": {
            "type": "array",
            "description": "A list of product relationships",
            "items": {
              "$ref": "#/components/schemas/ProductRelationship"
            }
          }
        },
        "title": "Product",
        "description": "Product"
      },
      "ProductRelationship": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "The direction of the relationship"
          },
          "product": {
            "$ref": "#/components/schemas/Product"
          }
        },
        "title": "ProductRelationship",
        "description": "Indicates all relationships between the products"
      }
    }
  }
}

I'm getting java.lang.StackOverflowError

java.lang.StackOverflowError: null
    at java.base/java.util.HashMap.tableSizeFor(HashMap.java:379) ~[na:na]
    at java.base/java.util.HashMap.<init>(HashMap.java:452) ~[na:na]
    at java.base/java.util.HashMap.<init>(HashMap.java:463) ~[na:na]
    at java.base/java.util.HashSet.<init>(HashSet.java:119) ~[na:na]
    at com.reprezen.jsonoverlay.SerializationOptions.plus(SerializationOptions.java:38) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.SerializationOptions.plus(SerializationOptions.java:44) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.ListOverlay._toJsonInternal(ListOverlay.java:70) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:248) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.PropertiesOverlay._toJsonInternal(PropertiesOverlay.java:298) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.MapOverlay._toJsonInternal(MapOverlay.java:75) ~[jsonoverlay-4.0.4.jar:na]
    at com.reprezen.jsonoverlay.JsonOverlay._toJson(JsonOverlay.java:251) ~[jsonoverlay-4.0.4.jar:na]

Is there any way around this problem?