Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[core] do not always cast to ArraySchema #3780

Merged

Conversation

jmini
Copy link
Member

@jmini jmini commented Aug 28, 2019

PR checklist

  • Read the contribution guidelines.
  • Ran the shell script under ./bin/ to update Petstore sample so that CIs can verify the change. (For instance, only need to run ./bin/{LANG}-petstore.sh, ./bin/openapi3/{LANG}-petstore.sh if updating the {LANG} (e.g. php, ruby, python, etc) code generator or {LANG} client's mustache templates). Windows batch files can be found in .\bin\windows\. If contributing template-only or documentation-only changes which will change sample output, be sure to build the project first.
  • Filed the PR against the correct branch: master, 4.1.x, 5.0.x. Default: master.
  • Copied the technical committee to review the pull request if your PR is targeting a particular programming language. @OpenAPITools/generator-core-team

Description of the PR

Similar to PR #3765 but solved at core Level.

Casting an ObjectSchema to ArraySchema after a ModelUtils.isArraySchema(schema) produces java.lang.ClassCastException: io.swagger.v3.oas.models.media.ObjectSchema cannot be cast to io.swagger.v3.oas.models.media.ArraySchema error in some cases.

This is because of the implementation of ModelUtils.isArraySchema(Schema) (the second part of the method):

public static boolean isArraySchema(Schema schema) {
if (schema instanceof ArraySchema) {
return true;
}
// assume it's an array if maxItems, minItems is set
if (schema != null && (schema.getMaxItems() != null || schema.getMinItems() != null)) {
return true;
}
return false;
}

In the case commented with "// assume it's an array if maxItems, minItems is set" we have an ObjectSchema.
When we try to read the items value, we need to check if we are allowed to cast or not.

@auto-labeler
Copy link

auto-labeler bot commented Aug 28, 2019

👍 Thanks for opening this issue!
🏷 I have applied any labels matching special text in your issue.

The team will review the labels and make any necessary changes.

@wing328
Copy link
Member

wing328 commented Aug 28, 2019

@jmini thanks for the PR.

What about removing the following instead?

     // assume it's an array if maxItems, minItems is set 
     if (schema != null && (schema.getMaxItems() != null || schema.getMinItems() != null)) { 
         return true; 
     } 

As ModelUtils.isArraySchema(Schema) should be the source of truth to tell if a schema is ArraySchema or not.

@jmini
Copy link
Member Author

jmini commented Aug 28, 2019

@wing328: this was also my thought.
Maybe this was included a long time ago because checking for instanceOf ArraySchema was not sufficient. Maybe Swagger-Parser did improve in this area.


I will change this PR to remove the second part of the ModelUtils.isArraySchema(Schema) method, but I will keep the getSchemaItems() in the default codegen (it was a lot of copy-paste).

@jmini
Copy link
Member Author

jmini commented Aug 29, 2019

@wing328 ModelUtils.isArraySchema(Schema) is modified as discussed.

@wing328
Copy link
Member

wing328 commented Aug 29, 2019

Maybe this was included a long time ago because checking for instanceOf ArraySchema was not sufficient.

That's what I recalled

Copy link
Member

@wing328 wing328 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@wing328 wing328 merged commit 026612f into OpenAPITools:master Aug 29, 2019
@wing328 wing328 added this to the 4.1.2 milestone Aug 29, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants