Skip to content

Commit b40a935

Browse files
committed
avoid multiple calculations
1 parent 7d4200b commit b40a935

5 files changed

Lines changed: 45 additions & 30 deletions

File tree

src/main/groovy/com/github/hauner/openapi/spring/converter/ApiConverter.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class ApiConverter {
151151
collectParameters (operation.parameters, ep, dataTypes, resolver)
152152
collectRequestBody (operation.requestBody, ep, dataTypes, resolver)
153153
collectResponses (operation.responses, ep, dataTypes, resolver)
154-
ep
154+
ep.initEndpointResponses ()
155155

156156
} catch (UnknownDataTypeException e) {
157157
log.error ("failed to parse endpoint {} {} because of: '{}'", ep.path, ep.method, e.message, e)

src/main/groovy/com/github/hauner/openapi/spring/model/Endpoint.groovy

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,20 @@ class Endpoint {
3131
List<Parameter> parameters = []
3232
List<RequestBody> requestBodies = []
3333
LinkedHashMap<String, List<Response>> responses = [:]
34+
35+
// grouped responses
36+
List<EndpointResponse> endpointResponses = []
3437

3538
void addResponses (String httpStatus, List<Response> statusResponses) {
3639
responses.put (httpStatus, statusResponses)
3740
}
3841

42+
Endpoint initEndpointResponses () {
43+
endpointResponses = createEndpointResponses ()
44+
this
45+
}
46+
47+
3948
RequestBody getRequestBody () {
4049
requestBodies.first ()
4150
}
@@ -93,7 +102,7 @@ class Endpoint {
93102
*
94103
* @return list of method responses
95104
*/
96-
List<EndpointResponse> getEndpointResponses () {
105+
private List<EndpointResponse> createEndpointResponses () {
97106
Set<Response> oks = successResponses
98107
Set<Response> errors = errorResponses
99108
oks.collect {

src/test/groovy/com/github/hauner/openapi/spring/model/EndpointMethodResponseSpec.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class EndpointMethodResponseSpec extends Specification {
2828
new Response (contentType: 'application/json',
2929
responseType: new CollectionDataType (item: new StringDataType ()))
3030
]
31-
])
31+
]).initEndpointResponses ()
3232

3333
when:
3434
def result = endpoint.endpointResponses
@@ -51,7 +51,7 @@ class EndpointMethodResponseSpec extends Specification {
5151
new Response (contentType: 'text/plain',
5252
responseType: new CollectionDataType (item: new StringDataType ()))
5353
]
54-
])
54+
]).initEndpointResponses ()
5555

5656
when:
5757
def result = endpoint.endpointResponses

src/test/groovy/com/github/hauner/openapi/spring/writer/InterfaceWriterSpec.groovy

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ import com.github.hauner.openapi.Bar;
247247
contentType: 'application/json',
248248
responseType: new ObjectDataType (type: type, pkg: pkg))
249249
]
250-
])
250+
]).initEndpointResponses ()
251251
])
252252

253253
when:
@@ -278,7 +278,7 @@ import ${pkg}.${type};
278278
contentType: 'text/plain',
279279
responseType: new ObjectDataType (type: type2, pkg: pkg2))
280280
]
281-
])
281+
]).initEndpointResponses ()
282282
])
283283

284284
when:
@@ -347,8 +347,10 @@ public interface NameApi {
347347

348348
void "writes methods" () {
349349
def endpoints = [
350-
new Endpoint(path: 'path1', method: HttpMethod.GET, responses: ['200': [new EmptyResponse()]]),
350+
new Endpoint(path: 'path1', method: HttpMethod.GET, responses: ['200': [new EmptyResponse()]])
351+
.initEndpointResponses (),
351352
new Endpoint(path: 'path2', method: HttpMethod.GET, responses: ['200': [new EmptyResponse()]])
353+
.initEndpointResponses ()
352354
]
353355

354356
writer.methodWriter.write (_ as Writer, _ as Endpoint, _ as EndpointResponse) >> {

src/test/groovy/com/github/hauner/openapi/spring/writer/MethodWriterSpec.groovy

Lines changed: 27 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,12 @@ class MethodWriterSpec extends Specification {
4545
def writer = new MethodWriter (apiOptions: apiOptions)
4646
def target = new StringWriter ()
4747

48+
private Endpoint createEndpoint (Map properties) {
49+
new Endpoint(properties).initEndpointResponses ()
50+
}
51+
4852
void "writes parameter less method without response" () {
49-
def endpoint = new Endpoint (path: '/ping', method: HttpMethod.GET, responses: [
53+
def endpoint = createEndpoint (path: '/ping', method: HttpMethod.GET, responses: [
5054
'204': [new Response(responseType: new NoneDataType())]
5155
])
5256

@@ -62,7 +66,7 @@ class MethodWriterSpec extends Specification {
6266

6367
@Unroll
6468
void "writes parameter less method with simple data type #type" () {
65-
def endpoint = new Endpoint (path: "/$type", method: HttpMethod.GET, responses: [
69+
def endpoint = createEndpoint (path: "/$type", method: HttpMethod.GET, responses: [
6670
'200': [new Response(contentType: contentType, responseType: responseType)]
6771
])
6872

@@ -87,7 +91,7 @@ class MethodWriterSpec extends Specification {
8791
}
8892

8993
void "writes parameter less method with inline object response type" () {
90-
def endpoint = new Endpoint (path: '/inline', method: HttpMethod.GET, responses: [
94+
def endpoint = createEndpoint (path: '/inline', method: HttpMethod.GET, responses: [
9195
'200': [
9296
new Response (contentType: 'application/json',
9397
responseType: new ObjectDataType (
@@ -110,7 +114,7 @@ class MethodWriterSpec extends Specification {
110114
}
111115

112116
void "writes method with Collection response type" () {
113-
def endpoint = new Endpoint (path: '/collection', method: HttpMethod.GET, responses: [
117+
def endpoint = createEndpoint (path: '/collection', method: HttpMethod.GET, responses: [
114118
'200': [
115119
new Response (contentType: 'application/json',
116120
responseType: new CollectionDataType (item: new StringDataType ()))
@@ -129,7 +133,7 @@ class MethodWriterSpec extends Specification {
129133
}
130134

131135
void "writes method with List response type" () {
132-
def endpoint = new Endpoint (path: '/list', method: HttpMethod.GET, responses: [
136+
def endpoint = createEndpoint (path: '/list', method: HttpMethod.GET, responses: [
133137
'200': [
134138
new Response (contentType: 'application/json',
135139
responseType: new ListDataType (item: new StringDataType ()))
@@ -148,7 +152,7 @@ class MethodWriterSpec extends Specification {
148152
}
149153

150154
void "writes method with Set response type" () {
151-
def endpoint = new Endpoint (path: '/set', method: HttpMethod.GET, responses: [
155+
def endpoint = createEndpoint (path: '/set', method: HttpMethod.GET, responses: [
152156
'200': [
153157
new Response (contentType: 'application/json',
154158
responseType: new SetDataType (item: new StringDataType ()))
@@ -167,7 +171,7 @@ class MethodWriterSpec extends Specification {
167171
}
168172

169173
void "writes simple (required) query parameter" () {
170-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
174+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
171175
'204': [new Response (responseType: new NoneDataType ())]
172176
], parameters: [
173177
new QueryParameter(name: 'foo', required: true, dataType: new StringDataType())
@@ -184,7 +188,7 @@ class MethodWriterSpec extends Specification {
184188
}
185189
186190
void "writes simple (optional) query parameter" () {
187-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
191+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
188192
'204': [new Response (responseType: new NoneDataType ())]
189193
], parameters: [
190194
new QueryParameter(name: 'foo', required: false, dataType: new StringDataType())
@@ -201,7 +205,7 @@ class MethodWriterSpec extends Specification {
201205
}
202206
203207
void "writes simple (required) header parameter" () {
204-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
208+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
205209
'204': [new Response (responseType: new NoneDataType())
206210
]
207211
], parameters: [
@@ -219,7 +223,7 @@ class MethodWriterSpec extends Specification {
219223
}
220224
221225
void "writes simple (optional) header parameter" () {
222-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
226+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
223227
'204': [new Response (responseType: new NoneDataType())]
224228
], parameters: [
225229
new HeaderParameter(name: 'x-foo', required: false, dataType: new StringDataType())
@@ -236,7 +240,7 @@ class MethodWriterSpec extends Specification {
236240
}
237241
238242
void "writes simple (required) cookie parameter" () {
239-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
243+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
240244
'200': [new Response (responseType: new NoneDataType())]
241245
], parameters: [
242246
new CookieParameter(name: 'foo', required: true, dataType: new StringDataType())
@@ -253,7 +257,7 @@ class MethodWriterSpec extends Specification {
253257
}
254258
255259
void "writes simple (optional) cookie parameter" () {
256-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
260+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
257261
'204': [new Response (responseType: new NoneDataType())]
258262
], parameters: [
259263
new CookieParameter(name: 'foo', required: false, dataType: new StringDataType())
@@ -270,7 +274,7 @@ class MethodWriterSpec extends Specification {
270274
}
271275
272276
void "writes object query parameter without @RequestParam annotation" () {
273-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
277+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
274278
'204': [new Response (responseType: new NoneDataType())]
275279
], parameters: [
276280
new QueryParameter(name: 'foo', required: false, dataType: new ObjectDataType (
@@ -292,7 +296,7 @@ class MethodWriterSpec extends Specification {
292296
}
293297
294298
void "writes map from single query parameter" () {
295-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
299+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
296300
'204': [new Response (responseType: new NoneDataType())]
297301
], parameters: [
298302
new QueryParameter(name: 'foo', required: false, dataType: new MappedMapDataType (
@@ -313,7 +317,7 @@ class MethodWriterSpec extends Specification {
313317
}
314318
315319
void "writes method name from path with valid java identifiers" () {
316-
def endpoint = new Endpoint (path: '/f_o-ooo/b_a-rrr', method: HttpMethod.GET, responses: [
320+
def endpoint = createEndpoint (path: '/f_o-ooo/b_a-rrr', method: HttpMethod.GET, responses: [
317321
'204': [new Response (responseType: new NoneDataType())]
318322
], parameters: [
319323
new QueryParameter(name: 'foo', required: true, dataType: new StringDataType())
@@ -330,7 +334,7 @@ class MethodWriterSpec extends Specification {
330334
}
331335
332336
void "writes method name from operation id with valid java identifiers" () {
333-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, operationId: 'get-bar',
337+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, operationId: 'get-bar',
334338
responses: [
335339
'204': [new Response (responseType: new NoneDataType())]
336340
])
@@ -346,7 +350,7 @@ class MethodWriterSpec extends Specification {
346350
}
347351
348352
void "writes method parameter with valid java identifiers" () {
349-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
353+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
350354
'204': [new Response (responseType: new NoneDataType())]
351355
], parameters: [
352356
new QueryParameter(name: '_fo-o', required: true, dataType: new StringDataType())
@@ -363,7 +367,7 @@ class MethodWriterSpec extends Specification {
363367
}
364368
365369
void "writes required request body parameter" () {
366-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.POST, responses: [
370+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.POST, responses: [
367371
'204': [new Response (responseType: new NoneDataType())]
368372
], requestBodies: [
369373
new RequestBody(
@@ -384,7 +388,7 @@ class MethodWriterSpec extends Specification {
384388
}
385389
386390
void "writes optional request body parameter" () {
387-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.POST, responses: [
391+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.POST, responses: [
388392
'204': [new Response (responseType: new NoneDataType())]
389393
], requestBodies: [
390394
new RequestBody(
@@ -406,7 +410,7 @@ class MethodWriterSpec extends Specification {
406410
}
407411
408412
void "writes simple (optional) parameter with string default value" () {
409-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
413+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
410414
'204': [new Response (responseType: new NoneDataType())]
411415
], parameters: [
412416
new QueryParameter(name: 'foo', required: false,
@@ -425,7 +429,7 @@ class MethodWriterSpec extends Specification {
425429
}
426430
427431
void "writes simple (optional) parameter with number default value" () {
428-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
432+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
429433
'204': [new Response (responseType: new NoneDataType())]
430434
], parameters: [
431435
new QueryParameter(name: 'foo', required: false,
@@ -444,7 +448,7 @@ class MethodWriterSpec extends Specification {
444448
}
445449
446450
void "writes mapping annotation with multiple result content types" () {
447-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
451+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
448452
'200' : [
449453
new Response (contentType: 'application/json',
450454
responseType: new CollectionDataType (item: new StringDataType ()))
@@ -465,7 +469,7 @@ class MethodWriterSpec extends Specification {
465469
}
466470
467471
void "writes method with any response type when it has multiple result contents" () {
468-
def endpoint = new Endpoint (path: '/foo', method: HttpMethod.GET, responses: [
472+
def endpoint = createEndpoint (path: '/foo', method: HttpMethod.GET, responses: [
469473
'200' : [
470474
new Response (contentType: 'application/json',
471475
responseType: new CollectionDataType (item: new StringDataType ()))

0 commit comments

Comments
 (0)