1717
1818import io .swagger .v3 .oas .models .OpenAPI ;
1919import io .swagger .v3 .oas .models .Operation ;
20- import io .swagger .v3 .oas .models .media .Content ;
2120import io .swagger .v3 .oas .models .media .MediaType ;
2221import io .swagger .v3 .oas .models .media .Schema ;
23- import io .swagger .v3 .oas .models .parameters .Parameter ;
24- import io .swagger .v3 .oas .models .responses .ApiResponse ;
2522import io .swagger .v3 .oas .models .servers .Server ;
23+
24+ import java .util .ArrayList ;
25+ import java .util .HashSet ;
2626import java .util .List ;
2727import java .util .Map ;
28+ import java .util .Set ;
2829
2930class OperationDefinition {
3031 private final Operation operation ;
3132 private final String method ;
3233 private final OpenAPI openAPI ;
3334 private final String path ;
35+ private final boolean emulateSwaggerV2BodyParameters ;
36+
37+ private static final String APPLICATION_JSON = "application/json" ;
3438
35- OperationDefinition (OpenAPI openAPI , Operation operation , String path , String method ) {
39+ OperationDefinition (
40+ OpenAPI openAPI , Operation operation , String path , String method , boolean emulateSwaggerV2BodyParameters ) {
3641 this .openAPI = openAPI ;
3742 this .operation = operation ;
3843 this .path = path ;
3944 this .method = method ;
45+ this .emulateSwaggerV2BodyParameters = emulateSwaggerV2BodyParameters ;
4046 }
4147
4248 String getMethod () {
@@ -47,72 +53,58 @@ String getPath() {
4753 return path ;
4854 }
4955
50- Operation getOperation () {
51- return operation ;
52- }
53-
5456 List <String > getServers () {
57+ if (openAPI .getServers () == null ) {
58+ return List .of ();
59+ }
5560 return openAPI .getServers ().stream ().map (Server ::getUrl ).toList ();
5661 }
5762
58- List <Parameter > getParameters () {
63+ List <ParameterDefinition > getParameters () {
64+ return emulateSwaggerV2BodyParameters ? getSwaggerV2Parameters () : getOpenApiParameters ();
65+ }
66+
67+ private List <ParameterDefinition > getOpenApiParameters () {
5968 if (operation .getParameters () == null ) {
6069 return List .of ();
6170 }
62- return operation .getParameters ();
71+ return operation .getParameters (). stream (). map ( ParameterDefinition :: new ). toList () ;
6372 }
6473
65- @ SuppressWarnings ({"rawtypes" , "unchecked" })
66- Map <String , Schema > getBody () {
67- if (operation .getRequestBody () != null && operation .getRequestBody ().getContent () != null ) {
68- Content content = operation .getRequestBody ().getContent ();
69- if (content .containsKey ("application/json" )) {
70- MediaType mt = content .get ("application/json" );
71- if (mt .getSchema ().get$ref () != null && !mt .getSchema ().get$ref ().isEmpty ()) {
72- Schema <?> schema = resolveSchema (mt .getSchema ().get$ref ());
73- return schema .getProperties ();
74- } else if (mt .getSchema ().getProperties () != null ) {
75- return mt .getSchema ().getProperties ();
76- } else {
77- throw new IllegalArgumentException (
78- "Can't resolve schema for request body of operation " + operation .getOperationId ());
79- }
80- } else {
81- throw new IllegalArgumentException ("Only 'application/json' content type is supported" );
82- }
74+ @ SuppressWarnings ({"rawtypes" })
75+ private List <ParameterDefinition > getSwaggerV2Parameters () {
76+ if (operation .getParameters () != null && !operation .getParameters ().isEmpty ()) {
77+ return operation .getParameters ().stream ().map (ParameterDefinition ::new ).toList ();
8378 }
84- return Map .of ();
85- }
86-
87- String getContentType () {
88- String method = getMethod ().toUpperCase ();
89-
90- if (method .equals ("POST" ) || method .equals ("PUT" ) || method .equals ("PATCH" )) {
91- if (operation .getRequestBody () != null && operation .getRequestBody ().getContent () != null ) {
92- Content content = operation .getRequestBody ().getContent ();
93- if (!content .isEmpty ()) {
94- return content .keySet ().iterator ().next ();
95- }
79+ if (operation .getRequestBody () != null ) {
80+ Schema <?> schema = null ;
81+ if (operation .getRequestBody ().getContent () != null && operation .getRequestBody ().getContent ().containsKey (APPLICATION_JSON )) {
82+ MediaType mt = operation .getRequestBody ().getContent ().get (APPLICATION_JSON );
83+ schema = mt .getSchema ();
84+ } else if (operation .getRequestBody ().get$ref () != null ) {
85+ schema = resolveSchema (operation .getRequestBody ().get$ref ());
9686 }
97- }
9887
99- if (operation .getResponses () != null ) {
100- for (String code : new String [] {"200" , "201" , "204" }) {
101- ApiResponse resp = operation .getResponses ().get (code );
102- if (resp != null && resp .getContent () != null && !resp .getContent ().isEmpty ()) {
103- return resp .getContent ().keySet ().iterator ().next ();
104- }
88+ if (schema == null ) {
89+ return List .of ();
10590 }
106- for (Map .Entry <String , ApiResponse > e : operation .getResponses ().entrySet ()) {
107- Content content = e .getValue ().getContent ();
108- if (content != null && !content .isEmpty ()) {
109- return content .keySet ().iterator ().next ();
91+
92+ Set <String > required = schema .getRequired () != null
93+ ? new HashSet <>(schema .getRequired ())
94+ : new HashSet <>();
95+
96+ Map <String , Schema > properties = schema .getProperties ();
97+ if (properties != null ) {
98+ List <ParameterDefinition > result = new ArrayList <>();
99+ for (Map .Entry <String , Schema > prop : properties .entrySet ()) {
100+ String fieldName = prop .getKey ();
101+ ParameterDefinition fieldParam = new ParameterDefinition (fieldName , "body" , required .contains (fieldName ));
102+ result .add (fieldParam );
110103 }
104+ return result ;
111105 }
112106 }
113-
114- throw new IllegalStateException (
115- "No content type found for operation " + operation .getOperationId () + " [" + method + "]" );
107+ return List .of ();
116108 }
117109
118110 Schema <?> resolveSchema (String ref ) {
0 commit comments