Bump checkstyle version
[dcaegen2/collectors/hv-ves.git] / sources / hv-collector-utils / src / main / kotlin / org / onap / dcae / collectors / veshv / utils / http / ratpack.kt
1 /*
2  * ============LICENSE_START=======================================================
3  * dcaegen2-collectors-veshv
4  * ================================================================================
5  * Copyright (C) 2018 NOKIA
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.onap.dcae.collectors.veshv.utils.http
21
22 import arrow.core.Either
23 import arrow.effects.IO
24 import org.onap.dcae.collectors.veshv.utils.logging.Logger
25 import javax.json.Json
26
27 /**
28  * @author Piotr Jaszczyk <piotr.jaszczyk@nokia.com>
29  * @since August 2018
30  */
31
32 private val logger = Logger("org.onap.dcae.collectors.veshv.utils.arrow.ratpack")
33
34 fun ratpack.http.Response.sendOrError(action: IO<Unit>) {
35     sendAndHandleErrors(action.map {
36         Response(
37                 HttpStatus.OK,
38                 Content(
39                         ContentType.JSON,
40                         Json.createObjectBuilder().add("response", "Request accepted").build()))
41     })
42 }
43
44 fun <A> ratpack.http.Response.sendEitherErrorOrResponse(response: Either<A, Response>) {
45     when(response) {
46         is Either.Left -> send(errorResponse(response.a.toString()))
47         is Either.Right -> sendAndHandleErrors(IO.just(response.b))
48     }
49 }
50
51 fun ratpack.http.Response.sendAndHandleErrors(response: IO<Response>) {
52     response.attempt().unsafeRunSync().fold(
53             { err ->
54                 logger.warn("Error occurred. Sending .", err)
55                 val message = err.message
56                 send(errorResponse(message))
57             },
58             ::send
59     )
60 }
61
62 private fun errorResponse(message: String?): Response {
63     return Response(
64             HttpStatus.INTERNAL_SERVER_ERROR,
65             Content(
66                     ContentType.JSON,
67                     Json.createObjectBuilder().add("error", message).build()))
68 }
69
70 fun ratpack.http.Response.send(response: Response) {
71     val respWithStatus = status(response.status.number)
72     response.content.apply {
73         respWithStatus.send(
74                 type.value,
75                 serializer.run { value.show() })
76     }
77 }