[PORTAL-7] Rebase
[portal.git] / ecomp-portal-BE-common / src / main / java / org / openecomp / portalapp / portal / utils / EcompPortalUtils.java
1 /*-\r
2  * ================================================================================\r
3  * ECOMP Portal\r
4  * ================================================================================\r
5  * Copyright (C) 2017 AT&T Intellectual Property\r
6  * ================================================================================\r
7  * Licensed under the Apache License, Version 2.0 (the "License");\r
8  * you may not use this file except in compliance with the License.\r
9  * You may obtain a copy of the License at\r
10  * \r
11  *      http://www.apache.org/licenses/LICENSE-2.0\r
12  * \r
13  * Unless required by applicable law or agreed to in writing, software\r
14  * distributed under the License is distributed on an "AS IS" BASIS,\r
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  * See the License for the specific language governing permissions and\r
17  * limitations under the License.\r
18  * ================================================================================\r
19  */\r
20 package org.openecomp.portalapp.portal.utils;\r
21 \r
22 import java.io.PrintWriter;\r
23 import java.io.StringWriter;\r
24 import java.net.InetAddress;\r
25 import java.net.UnknownHostException;\r
26 import java.text.SimpleDateFormat;\r
27 import java.util.ArrayList;\r
28 import java.util.Date;\r
29 import java.util.List;\r
30 \r
31 import javax.servlet.http.HttpServletResponse;\r
32 \r
33 import org.hibernate.Session;\r
34 import org.hibernate.Transaction;\r
35 import org.openecomp.portalapp.portal.domain.EPUser;\r
36 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;\r
37 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;\r
38 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;\r
39 import org.openecomp.portalsdk.core.util.SystemProperties;\r
40 import org.slf4j.MDC;\r
41 \r
42 import com.fasterxml.jackson.core.JsonProcessingException;\r
43 import com.fasterxml.jackson.databind.ObjectMapper;\r
44 \r
45 public class EcompPortalUtils {\r
46 \r
47         private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(EcompPortalUtils.class);\r
48 \r
49         /**\r
50          * @param orgUserId\r
51          * @return true if orgUserId is not empty and contains only alphanumeric,\r
52          *         false otherwise\r
53          */\r
54         public static boolean legitimateUserId(String orgUserId) {\r
55                 return orgUserId.matches("^[a-zA-Z0-9]+$");\r
56         }\r
57 \r
58         /**\r
59          * Splits the string into a list of tokens using the specified regular\r
60          * expression\r
61          * \r
62          * @param source\r
63          * @param regex\r
64          * @return List of tokens split from the source\r
65          */\r
66         public static List<String> parsingByRegularExpression(String source, String regex) {\r
67                 List<String> tokens = new ArrayList<String>();\r
68                 if (source != null && source.length() > 0) {\r
69                         String[] parsed = source.split(regex);\r
70                         for (String token : parsed) {\r
71                                 if (token.length() > 0) {\r
72                                         tokens.add(token);\r
73                                 }\r
74                         }\r
75                 }\r
76                 return tokens;\r
77         }\r
78 \r
79         /**\r
80          * Builds a JSON object with error code and message information.\r
81          * \r
82          * @param errorCode\r
83          * @param errorMessage\r
84          * @return JSON object as a String\r
85          */\r
86         public static String jsonErrorMessageResponse(int errorCode, String errorMessage) {\r
87                 return "{\"error\":{\"code\":" + errorCode + "," + "\"message\":\"" + errorMessage + "\"}}";\r
88         }\r
89 \r
90         /**\r
91          * Builds a JSON object with the specified message\r
92          * \r
93          * @param message\r
94          * @return JSON object as a String\r
95          */\r
96         public static String jsonMessageResponse(String message) {\r
97                 return String.format("{\"message\":\"%s\"}", message);\r
98         }\r
99 \r
100         /**\r
101          * Serializes the specified object as JSON and writes the result to the\r
102          * debug log. If serialization fails, logs a message to the error logger.\r
103          * \r
104          * @param logger\r
105          *            Logger for the class where the object was built; the logger\r
106          *            carries the class name.\r
107          * @param source\r
108          *            First portion of the log message\r
109          * @param msg\r
110          *            Second portion of the log message\r
111          * @param obj\r
112          *            Object to serialize as JSON\r
113          */\r
114         public static void logAndSerializeObject(EELFLoggerDelegate logger, String source, String msg, Object obj) {\r
115                 try {\r
116                         String objectAsJson = new ObjectMapper().writeValueAsString(obj);\r
117                         logger.debug(EELFLoggerDelegate.debugLogger,\r
118                                         String.format("source= [%s]; %s [%s];", source, msg, objectAsJson));\r
119                 } catch (JsonProcessingException e) {\r
120                         logger.warn(EELFLoggerDelegate.errorLogger, "logAndSerializedObject failed to serialize", e);\r
121                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeInvalidJsonInput, e);\r
122                 } catch (Exception e) {\r
123                         logger.error(EELFLoggerDelegate.errorLogger, "logAndSerializedObject failed", e);\r
124                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeInvalidJsonInput, e);\r
125                 }\r
126         }\r
127 \r
128         /**\r
129          * Serializes the specified object as JSON and writes the result to the\r
130          * debug log. If serialization fails, logs a message to the error logger.\r
131          * \r
132          * @param source\r
133          *            First portion of the log message\r
134          * @param msg\r
135          *            Second portion of the log message\r
136          * @param obj\r
137          *            Object to serialize as JSON\r
138          */\r
139         public static void logAndSerializeObject(String source, String msg, Object obj) {\r
140                 logAndSerializeObject(logger, source, msg, obj);\r
141         }\r
142 \r
143         public static void rollbackTransaction(Transaction transaction, String errorMessage) {\r
144                 logger.error(EELFLoggerDelegate.errorLogger, errorMessage);\r
145                 try {\r
146                         if (transaction != null) {\r
147                                 transaction.rollback();\r
148                         }\r
149                 } catch (Exception e) {\r
150                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeExecuteRollbackError, e);\r
151                         logger.error(EELFLoggerDelegate.errorLogger, "Exception occurred while performing a rollback transaction",\r
152                                         e);\r
153                 }\r
154         }\r
155 \r
156         public static void closeLocalSession(Session localSession, String errorMessage) {\r
157                 logger.error(EELFLoggerDelegate.errorLogger, errorMessage);\r
158                 try {\r
159                         if (localSession != null) {\r
160                                 localSession.close();\r
161                         }\r
162                 } catch (Exception e) {\r
163                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoCloseSessionError, e);\r
164                         logger.error(EELFLoggerDelegate.errorLogger, errorMessage + ", closeLocalSession exception", e);\r
165                 }\r
166         }\r
167 \r
168         // TODO: GLOBAL_LOGIN_URL is the same as in SessionTimeoutInterceptor.\r
169         // It should be defined in SystemProperties.\r
170         private static final String GLOBAL_LOGIN_URL = "global-login-url";\r
171 \r
172         /**\r
173          * Set response status to Unauthorized if user == null and to Forbidden in\r
174          * all (!) other cases. Logging is not performed if invocator == null\r
175          * \r
176          * @param user\r
177          * @param response\r
178          * @param invocator\r
179          *            - may be null\r
180          */\r
181         public static void setBadPermissions(EPUser user, HttpServletResponse response, String invocator) {\r
182                 if (user == null) {\r
183                         String loginUrl = SystemProperties.getProperty(EPCommonSystemProperties.LOGIN_URL_NO_RET_VAL);\r
184                         response.setHeader(GLOBAL_LOGIN_URL, loginUrl);\r
185                         response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);\r
186                         MDC.put(EPCommonSystemProperties.RESPONSE_CODE, Integer.toString(HttpServletResponse.SC_UNAUTHORIZED));\r
187                 } else {\r
188                         response.setStatus(HttpServletResponse.SC_FORBIDDEN);\r
189                         MDC.put(EPCommonSystemProperties.RESPONSE_CODE, Integer.toString(HttpServletResponse.SC_FORBIDDEN));\r
190                 }\r
191                 if (invocator != null) {\r
192                         logger.warn(EELFLoggerDelegate.errorLogger,\r
193                                         invocator + ", permissions problem, response status = " + response.getStatus());\r
194                 }\r
195         }\r
196 \r
197         public static int getExternalAppResponseCode() {\r
198                 String responseCode = MDC.get(EPCommonSystemProperties.EXTERNAL_API_RESPONSE_CODE);\r
199                 int responseCodeInt = 0;\r
200                 try {\r
201                         if (responseCode != null && responseCode != "") {\r
202                                 responseCodeInt = Integer.valueOf(responseCode);\r
203                         }\r
204                 } catch (Exception e) {\r
205                         logger.error(EELFLoggerDelegate.errorLogger,\r
206                                         "Exception occurred in getResponseCode(). Details: " + EcompPortalUtils.getStackTrace(e));\r
207                 }\r
208                 return responseCodeInt;\r
209         }\r
210 \r
211         // This method might be just for testing purposes.\r
212         public static void setExternalAppResponseCode(int responseCode) {\r
213                 try {\r
214                         String responseCodeString = String.valueOf(responseCode);\r
215                         MDC.put(EPCommonSystemProperties.EXTERNAL_API_RESPONSE_CODE, responseCodeString);\r
216                 } catch (Exception e) {\r
217                         logger.error(EELFLoggerDelegate.errorLogger,\r
218                                         "Exception occurred in setResponseCode(). Details: " + EcompPortalUtils.getStackTrace(e));\r
219                 }\r
220         }\r
221 \r
222         public static String getHTTPStatusString(int httpStatusCode) {\r
223                 String httpStatusString = "unknown_error";\r
224                 try {\r
225                         httpStatusString = org.springframework.http.HttpStatus.valueOf(httpStatusCode).name();\r
226                         if (httpStatusString != null) {\r
227                                 httpStatusString = httpStatusString.toLowerCase();\r
228                         }\r
229                 } catch (Exception e) {\r
230                         logger.error(EELFLoggerDelegate.errorLogger,\r
231                                         "Exception occurred in getHTTPStatusString(). Details: " + EcompPortalUtils.getStackTrace(e));\r
232                 }\r
233                 return httpStatusString;\r
234         }\r
235 \r
236         public static String getFEErrorString(Boolean internal, int responseCode) {\r
237                 // Return a String like the following:\r
238                 // "Internal Ecomp Error: 500 internal_server_error" or\r
239                 // "External App Error: 404 not_found"\r
240                 // TODO: create our own Ecomp error codes, starting with 1000 and up.\r
241                 String responseString = "";\r
242                 String internalExternalString = internal ? "Ecomp Error: " : "App Error: ";\r
243                 String httpStatusString = "unknown_error";\r
244                 try {\r
245                         if (responseCode < 1000) {\r
246                                 httpStatusString = getHTTPStatusString(responseCode);\r
247                         }\r
248                 } catch (Exception e) {\r
249                         logger.error(EELFLoggerDelegate.errorLogger,\r
250                                         "Exception occurred in getFEErrorString(). Details: " + EcompPortalUtils.getStackTrace(e));\r
251                 }\r
252                 responseString = internalExternalString + responseCode + " " + httpStatusString;\r
253                 return responseString;\r
254         }\r
255 \r
256         public static boolean isProductionBuild() {\r
257                 boolean productionBuild = true;\r
258                 String epVersion = EcompVersion.buildNumber;\r
259                 if (epVersion != null) {\r
260                         int buildNum = epVersion.lastIndexOf('.');\r
261                         if (buildNum > 0) {\r
262                                 int buildNumber = Integer.parseInt(epVersion.substring(buildNum + 1));\r
263                                 if (buildNumber < 3000) // Production versions are 3000+, (ie\r
264                                                                                 // 1.0.3003)\r
265                                 {\r
266                                         productionBuild = false;\r
267                                 }\r
268                         }\r
269                 }\r
270                 return productionBuild;\r
271         }\r
272 \r
273         private static final Object stackTraceLock = new Object();\r
274 \r
275         public static String getStackTrace(Throwable t) {\r
276                 synchronized (stackTraceLock) {\r
277                         StringWriter sw = new StringWriter();\r
278                         PrintWriter pw = new PrintWriter(sw);\r
279                         t.printStackTrace(pw);\r
280                         return sw.toString();\r
281                 }\r
282         }\r
283 \r
284         public static String getMyIpAdddress() {\r
285                 InetAddress ip;\r
286                 String localIp;\r
287                 try {\r
288                         ip = InetAddress.getLocalHost();\r
289                         localIp = ip.getHostAddress();\r
290                 } catch (UnknownHostException e) {\r
291                         localIp = "unknown";\r
292                         logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));\r
293                 }\r
294                 return localIp;\r
295         }\r
296 \r
297         public static String getMyHostName() {\r
298                 InetAddress ip;\r
299                 String hostName;\r
300                 try {\r
301                         ip = InetAddress.getLocalHost();\r
302                         hostName = ip.getHostName();\r
303                 } catch (UnknownHostException e) {\r
304                         hostName = "unknown";\r
305                         logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));\r
306                 }\r
307                 return hostName;\r
308         }\r
309 \r
310         /* return a default property if the expected one is not available */\r
311         public static String getPropertyOrDefault(String property, String defaultValue) {\r
312                 return ((null == SystemProperties.getProperty(property) || SystemProperties.getProperty(property).equals(""))\r
313                                 ? defaultValue : SystemProperties.getProperty(property));\r
314         }\r
315 \r
316         public static void calculateDateTimeDifferenceForLog(String beginDateTime, String endDateTime) {\r
317                 if (beginDateTime != null && endDateTime != null) {\r
318                         try {\r
319                                 SimpleDateFormat ecompLogDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");\r
320 \r
321                                 Date beginDate = ecompLogDateFormat.parse(beginDateTime);\r
322                                 Date endDate = ecompLogDateFormat.parse(endDateTime);\r
323                                 String timeDifference = String.format("%d", endDate.getTime() - beginDate.getTime());\r
324                                 MDC.put(SystemProperties.MDC_TIMER, timeDifference);\r
325                         } catch (Exception e) {\r
326                                 logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));\r
327                         }\r
328                 }\r
329         }\r
330 \r
331 }\r