aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/main/java/org/onap/policy/api/main/rest/CommonRestController.java
blob: ce479bc071eed3335394bb19fbb194f694ab7410 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*-
 * ============LICENSE_START=======================================================
 * ONAP Policy API
 * ================================================================================
 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
 * Modifications Copyright (C) 2022 Bell Canada. All rights reserved.
 * Modifications Copyright (C) 2022 Nordix Foundation.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * SPDX-License-Identifier: Apache-2.0
 * ============LICENSE_END=========================================================
 */

package org.onap.policy.api.main.rest;

import java.util.UUID;
import org.onap.policy.api.main.exception.PolicyApiRuntimeException;
import org.onap.policy.common.utils.coder.Coder;
import org.onap.policy.common.utils.coder.CoderException;
import org.onap.policy.common.utils.coder.StandardCoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;

/**
 * Super class from which REST controllers are derived.
 */
public class CommonRestController {

    private static final Logger LOGGER = LoggerFactory.getLogger(CommonRestController.class);

    protected static final String EXTENSION_NAME = "interface info";

    protected static final String API_VERSION_NAME = "api-version";
    protected static final String API_VERSION = "1.0.0";

    protected static final String LAST_MOD_NAME = "last-mod-release";

    protected static final String AUTHORIZATION_TYPE = "basicAuth";

    protected static final String VERSION_MINOR_NAME = "X-MinorVersion";
    protected static final String VERSION_MINOR_DESCRIPTION =
        "Used to request or communicate a MINOR version back from the client"
            + " to the server, and from the server back to the client";

    protected static final String VERSION_PATCH_NAME = "X-PatchVersion";
    protected static final String VERSION_PATCH_DESCRIPTION = "Used only to communicate a PATCH version in a "
        + "response for troubleshooting purposes only, and will not be provided by" + " the client on request";

    protected static final String VERSION_LATEST_NAME = "X-LatestVersion";
    protected static final String VERSION_LATEST_DESCRIPTION = "Used only to communicate an API's latest version";

    public static final String REQUEST_ID_NAME = "X-ONAP-RequestID";
    protected static final String REQUEST_ID_HDR_DESCRIPTION = "Used to track REST transactions for logging purpose";
    protected static final String REQUEST_ID_PARAM_DESCRIPTION = "RequestID for http transaction";

    protected static final String AUTHENTICATION_ERROR_MESSAGE = "Authentication Error";
    protected static final String AUTHORIZATION_ERROR_MESSAGE = "Authorization Error";
    protected static final String SERVER_ERROR_MESSAGE = "Internal Server Error";
    protected static final String NOT_FOUND_MESSAGE = "Resource Not Found";
    protected static final String INVALID_BODY_MESSAGE = "Invalid Body";
    protected static final String INVALID_PAYLOAD_MESSAGE = "Not Acceptable Payload";
    protected static final String HTTP_CONFLICT_MESSAGE = "Delete Conflict, Rule Violation";
    protected static final String ERROR_MESSAGE_NO_POLICIES_FOUND = "No policies found";

    protected final Coder coder = new StandardCoder();

    protected <T> ResponseEntity<T> makeOkResponse(UUID requestId, T respEntity) {
        return CommonRestController.addLoggingHeaders(addVersionControlHeaders(ResponseEntity.ok()), requestId)
            .body(respEntity);
    }

    /**
     * Adds version headers to the response.
     *
     * @param respBuilder response builder
     * @return the response builder, with version headers
     */
    public static ResponseEntity.BodyBuilder addVersionControlHeaders(ResponseEntity.BodyBuilder respBuilder) {
        return respBuilder.header(VERSION_MINOR_NAME, "0").header(VERSION_PATCH_NAME, "0").header(VERSION_LATEST_NAME,
            API_VERSION);
    }

    /**
     * Adds logging headers to the response.
     *
     * @param respBuilder response builder
     * @return the response builder, with version logging
     */
    public static ResponseEntity.BodyBuilder addLoggingHeaders(ResponseEntity.BodyBuilder respBuilder, UUID requestId) {
        if (requestId == null) {
            // Generate a random uuid if client does not embed requestId in rest request
            return respBuilder.header(REQUEST_ID_NAME, UUID.randomUUID().toString());
        }

        return respBuilder.header(REQUEST_ID_NAME, requestId.toString());
    }

    /**
     * Converts an object to a JSON string.
     *
     * @param object object to convert
     * @return a JSON string representing the object
     */
    protected String toJson(Object object) {
        if (object == null) {
            return null;
        }

        try {
            return coder.encode(object);

        } catch (CoderException e) {
            LOGGER.warn("cannot convert {} to JSON", object.getClass().getName(), e);
            return null;
        }
    }

    @ExceptionHandler(value = {PolicyApiRuntimeException.class})
    protected ResponseEntity<Object> handleException(PolicyApiRuntimeException ex, WebRequest req) {
        LOGGER.warn(ex.getMessage(), ex.getCause());
        final var requestId = req.getHeader(CommonRestController.REQUEST_ID_NAME);
        final var status = ex.getErrorResponse().getResponseCode().getStatusCode();
        return CommonRestController.addLoggingHeaders(
            CommonRestController.addVersionControlHeaders(ResponseEntity.status(status)),
            requestId != null ? UUID.fromString(requestId) : ex.getRequestId()).body(ex.getErrorResponse());
    }
}