Apicurio / apicurio-codegen

Repository to hold some code generation utilities.
Apache License 2.0
4 stars 13 forks source link

Generated REST API interface method return type depends on order of content types #284

Open jsenko opened 2 months ago

jsenko commented 2 months ago

Given the following operation:

"/admin/export": {
  "get": {
    "description": "Exports registry data as a ZIP archive.",
    "operationId": "exportData",
    "parameters": [
      {
        "description": "Indicates if the operation is done for a browser.  If true, the response will be a JSON payload with a property called `href`.  This `href` will be a single-use, naked download link suitable for use by a web browser to download the content.",
        "in": "query",
        "name": "forBrowser",
        "schema": {
          "type": "boolean"
        }
      }
    ],
    "responses": {
      "200": {
        "content": {
          "application/zip": {
            "schema": {
              "$ref": "#/components/schemas/FileContent"
            }
          },
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DownloadRef"
            }
          }
        },
        ...
      },
      ...
    },
    ...
  },
  ...
}

the generated method is:

/**
 * <p>
 * Exports registry data as a ZIP archive.
 * </p>
 * 
 */
@Path("/export")
@GET
@Produces({"application/json", "application/zip"})
Response exportData(@QueryParam("forBrowser") Boolean forBrowser);

If we reverse the order of the content types:

"/admin/export": {
  "get": {
    "description": "Exports registry data as a ZIP archive.",
    "operationId": "exportData",
    "parameters": [
      {
        "description": "Indicates if the operation is done for a browser.  If true, the response will be a JSON payload with a property called `href`.  This `href` will be a single-use, naked download link suitable for use by a web browser to download the content.",
        "in": "query",
        "name": "forBrowser",
        "schema": {
          "type": "boolean"
        }
      }
    ],
    "responses": {
      "200": {
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/DownloadRef"
            }
          },
          "application/zip": {
            "schema": {
              "$ref": "#/components/schemas/FileContent"
            }
          }
        },
        ...
      },
      ...
    },
    ...
  },
  ...
}

the generated method is:

/**
 * <p>
 * Exports registry data as a ZIP archive.
 * </p>
 * 
 */
@Path("/export")
@GET
@Produces({"application/json", "application/zip"})
DownloadRef exportData(@QueryParam("forBrowser") Boolean forBrowser);

JSON is semantically equivalent if any of the map keys are reordered, so the generator should always generate the first method.