2 * ================================================================================
\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
11 * http://www.apache.org/licenses/LICENSE-2.0
\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
20 package org.openecomp.portalapp.portal.utils;
\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
31 import javax.servlet.http.HttpServletResponse;
\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
42 import com.fasterxml.jackson.core.JsonProcessingException;
\r
43 import com.fasterxml.jackson.databind.ObjectMapper;
\r
45 public class EcompPortalUtils {
\r
47 private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(EcompPortalUtils.class);
\r
51 * @return true if orgUserId is not empty and contains only alphanumeric,
\r
54 public static boolean legitimateUserId(String orgUserId) {
\r
55 return orgUserId.matches("^[a-zA-Z0-9]+$");
\r
59 * Splits the string into a list of tokens using the specified regular
\r
64 * @return List of tokens split from the source
\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
80 * Builds a JSON object with error code and message information.
\r
83 * @param errorMessage
\r
84 * @return JSON object as a String
\r
86 public static String jsonErrorMessageResponse(int errorCode, String errorMessage) {
\r
87 return "{\"error\":{\"code\":" + errorCode + "," + "\"message\":\"" + errorMessage + "\"}}";
\r
91 * Builds a JSON object with the specified message
\r
94 * @return JSON object as a String
\r
96 public static String jsonMessageResponse(String message) {
\r
97 return String.format("{\"message\":\"%s\"}", message);
\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
105 * Logger for the class where the object was built; the logger
\r
106 * carries the class name.
\r
108 * First portion of the log message
\r
110 * Second portion of the log message
\r
112 * Object to serialize as JSON
\r
114 public static void logAndSerializeObject(EELFLoggerDelegate logger, String source, String msg, Object obj) {
\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
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
133 * First portion of the log message
\r
135 * Second portion of the log message
\r
137 * Object to serialize as JSON
\r
139 public static void logAndSerializeObject(String source, String msg, Object obj) {
\r
140 logAndSerializeObject(logger, source, msg, obj);
\r
143 public static void rollbackTransaction(Transaction transaction, String errorMessage) {
\r
144 logger.error(EELFLoggerDelegate.errorLogger, errorMessage);
\r
146 if (transaction != null) {
\r
147 transaction.rollback();
\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
156 public static void closeLocalSession(Session localSession, String errorMessage) {
\r
157 logger.error(EELFLoggerDelegate.errorLogger, errorMessage);
\r
159 if (localSession != null) {
\r
160 localSession.close();
\r
162 } catch (Exception e) {
\r
163 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoCloseSessionError, e);
\r
164 logger.error(EELFLoggerDelegate.errorLogger, errorMessage + ", closeLocalSession exception", e);
\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
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
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
188 response.setStatus(HttpServletResponse.SC_FORBIDDEN);
\r
189 MDC.put(EPCommonSystemProperties.RESPONSE_CODE, Integer.toString(HttpServletResponse.SC_FORBIDDEN));
\r
191 if (invocator != null) {
\r
192 logger.warn(EELFLoggerDelegate.errorLogger,
\r
193 invocator + ", permissions problem, response status = " + response.getStatus());
\r
197 public static int getExternalAppResponseCode() {
\r
198 String responseCode = MDC.get(EPCommonSystemProperties.EXTERNAL_API_RESPONSE_CODE);
\r
199 int responseCodeInt = 0;
\r
201 if (responseCode != null && responseCode != "") {
\r
202 responseCodeInt = Integer.valueOf(responseCode);
\r
204 } catch (Exception e) {
\r
205 logger.error(EELFLoggerDelegate.errorLogger,
\r
206 "Exception occurred in getResponseCode(). Details: " + EcompPortalUtils.getStackTrace(e));
\r
208 return responseCodeInt;
\r
211 // This method might be just for testing purposes.
\r
212 public static void setExternalAppResponseCode(int responseCode) {
\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
222 public static String getHTTPStatusString(int httpStatusCode) {
\r
223 String httpStatusString = "unknown_error";
\r
225 httpStatusString = org.springframework.http.HttpStatus.valueOf(httpStatusCode).name();
\r
226 if (httpStatusString != null) {
\r
227 httpStatusString = httpStatusString.toLowerCase();
\r
229 } catch (Exception e) {
\r
230 logger.error(EELFLoggerDelegate.errorLogger,
\r
231 "Exception occurred in getHTTPStatusString(). Details: " + EcompPortalUtils.getStackTrace(e));
\r
233 return httpStatusString;
\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
245 if (responseCode < 1000) {
\r
246 httpStatusString = getHTTPStatusString(responseCode);
\r
248 } catch (Exception e) {
\r
249 logger.error(EELFLoggerDelegate.errorLogger,
\r
250 "Exception occurred in getFEErrorString(). Details: " + EcompPortalUtils.getStackTrace(e));
\r
252 responseString = internalExternalString + responseCode + " " + httpStatusString;
\r
253 return responseString;
\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
266 productionBuild = false;
\r
270 return productionBuild;
\r
273 private static final Object stackTraceLock = new Object();
\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
284 public static String getMyIpAdddress() {
\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
297 public static String getMyHostName() {
\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
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
316 public static void calculateDateTimeDifferenceForLog(String beginDateTime, String endDateTime) {
\r
317 if (beginDateTime != null && endDateTime != null) {
\r
319 SimpleDateFormat ecompLogDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
\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