0d173a46cf0bae850cce4d1159e37bdbd1f9cfaa
[aai/search-data-service.git] / src / main / java / org / onap / aai / sa / rest / ApiUtils.java
1 /**
2  * ============LICENSE_START=======================================================
3  * org.onap.aai
4  * ================================================================================
5  * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
6  * Copyright © 2017-2018 Amdocs
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *       http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.aai.sa.rest;
22
23 import org.onap.aai.sa.searchdbabstraction.util.SearchDbConstants;
24 import org.onap.aai.cl.mdc.MdcContext;
25 import org.slf4j.MDC;
26
27 import java.util.UUID;
28 import javax.servlet.http.HttpServletRequest;
29 import javax.ws.rs.core.HttpHeaders;
30 import javax.ws.rs.core.Response;
31
32
33 public class ApiUtils {
34
35   public static final String SEARCH_AUTH_POLICY_NAME = "search";
36   public static final String URL_PREFIX = "services/search-data-service/v1/search";
37
38   public enum Action {
39     POST, GET, PUT, DELETE
40   }
41
42   ;
43
44
45   /**
46    * This method uses the contents of the supplied HTTP headers and request
47    * structures to populate the MDC Context used for logging purposes.
48    *
49    * @param httpReq - HTTP request structure.
50    * @param headers - HTTP headers
51    */
52   protected static void initMdcContext(HttpServletRequest httpReq, HttpHeaders headers) {
53
54     // Auto generate a transaction if we were not provided one.
55     String transId = null;
56     if (headers != null) {
57       transId = headers.getRequestHeaders().getFirst("X-TransactionId");
58
59       if ((transId == null) || (transId.equals(""))) {
60         transId = UUID.randomUUID().toString();
61       }
62     }
63
64     String fromIp = (httpReq != null) ? httpReq.getRemoteAddr() : "";
65     String fromApp = (headers != null) ? headers.getRequestHeaders().getFirst("X-FromAppId") : "";
66
67     MdcContext.initialize(transId, SearchDbConstants.SDB_SERVICE_NAME, "", fromApp, fromIp);
68   }
69
70
71   protected static void clearMdcContext() {
72     MDC.clear();
73   }
74
75   public static String buildIndexUri(String index) {
76
77     return (URL_PREFIX + "/indexes/") + index;
78   }
79
80   public static String buildDocumentUri(String index, String documentId) {
81
82     return buildIndexUri(index) + "/documents/" + documentId;
83   }
84
85   public static boolean validateIndexUri(String uri) {
86
87     // If the URI starts with a leading '/' character, remove it.
88     uri = uri.startsWith("/") ? uri.substring(1) : uri;
89
90     // Now, tokenize the URI string.
91     String[] tokens = uri.split("/");
92
93     return (tokens.length == 6) && (tokens[4].equals("indexes"));
94
95   }
96
97   public static boolean validateDocumentUri(String uri, boolean requireId) {
98
99     // If the URI starts with a leading '/' character, remove it.
100     uri = uri.startsWith("/") ? uri.substring(1) : uri;
101
102     // Now, tokenize the URI string.
103     String[] tokens = uri.split("/");
104
105     if (requireId) {
106       return (tokens.length == 8) && (tokens[4].equals("indexes")
107           && (tokens[6].equals("documents")));
108     } else {
109       return ((tokens.length == 8) || (tokens.length == 7))
110           && (tokens[4].equals("indexes") && (tokens[6].equals("documents")));
111     }
112   }
113
114   public static String extractIndexFromUri(String uri) {
115
116     // If the URI starts with a leading '/' character, remove it.
117     uri = uri.startsWith("/") ? uri.substring(1) : uri;
118
119     // Now, tokenize the URI string.
120     String[] tokens = uri.split("/");
121
122     int i = 0;
123     for (String token : tokens) {
124       if (token.equals("indexes")) {
125         if (i + 1 < tokens.length) {
126           return tokens[i + 1];
127         }
128       }
129       i++;
130     }
131
132     return null;
133   }
134
135   public static String extractIdFromUri(String uri) {
136
137     // If the URI starts with a leading '/' character, remove it.
138     uri = uri.startsWith("/") ? uri.substring(1) : uri;
139
140     // Now, tokenize the URI string.
141     String[] tokens = uri.split("/");
142
143     int i = 0;
144     for (String token : tokens) {
145       if (token.equals("documents")) {
146         if (i + 1 < tokens.length) {
147           return tokens[i + 1];
148         }
149       }
150       i++;
151     }
152
153     return null;
154   }
155
156   public static String getHttpStatusString(int httpStatusCode) {
157     // Some of the status codes we use are still in draft state in the standards, and are not
158     // recognized in the javax library.  We need to manually translate these to human-readable
159     // strings.
160     String statusString = "Unknown";
161     Response.Status status = Response.Status.fromStatusCode(httpStatusCode);
162
163     if (status == null) {
164       switch (httpStatusCode) {
165         case 207:
166           statusString = "Multi Status";
167           break;
168         default:
169       }
170     } else {
171       statusString = status.toString();
172     }
173
174     return statusString;
175   }
176 }