--- /dev/null
+/*-\r
+ * ================================================================================\r
+ * ECOMP Portal\r
+ * ================================================================================\r
+ * Copyright (C) 2017 AT&T Intellectual Property\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ * \r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ * \r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ================================================================================\r
+ */\r
+package org.openecomp.portalapp.portal.service;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.annotation.PostConstruct;\r
+import javax.servlet.http.HttpServletResponse;\r
+\r
+import org.hibernate.Session;\r
+import org.hibernate.SessionFactory;\r
+import org.hibernate.Transaction;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
+import org.springframework.context.annotation.EnableAspectJAutoProxy;\r
+import org.springframework.stereotype.Service;\r
+import org.springframework.transaction.annotation.Transactional;\r
+\r
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;\r
+import org.openecomp.portalsdk.core.service.DataAccessService;\r
+import org.openecomp.portalsdk.core.util.SystemProperties;\r
+import org.openecomp.portalapp.portal.domain.EPUser;\r
+import org.openecomp.portalapp.portal.domain.EPUserApp;\r
+import org.openecomp.portalapp.portal.domain.Widget;\r
+import org.openecomp.portalapp.portal.logging.aop.EPMetricsLog;\r
+import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;\r
+import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;\r
+import org.openecomp.portalapp.portal.transport.FieldsValidator;\r
+import org.openecomp.portalapp.portal.transport.OnboardingWidget;\r
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;\r
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;\r
+\r
+@Service("widgetService")\r
+@Transactional\r
+@org.springframework.context.annotation.Configuration\r
+@EnableAspectJAutoProxy\r
+@EPMetricsLog\r
+public class WidgetServiceImpl implements WidgetService {\r
+\r
+ private static final String baseSqlToken = " widget.WIDGET_ID, widget.WDG_NAME, widget.APP_ID, app.APP_NAME, widget.WDG_WIDTH, widget.WDG_HEIGHT, widget.WDG_URL"\r
+ + " from FN_WIDGET widget join FN_APP app ON widget.APP_ID = app.APP_ID";\r
+\r
+ private String validAppsFilter = "";\r
+\r
+ private Long LONG_ECOMP_APP_ID = 1L;\r
+ private Long ACCOUNT_ADMIN_ROLE_ID = 999L;\r
+ private static final Long DUBLICATED_FIELD_VALUE_ECOMP_ERROR = new Long(EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR);\r
+\r
+ private static final String urlField = "url";\r
+\r
+ private static final String nameField = "name";\r
+ EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetServiceImpl.class);\r
+\r
+ @Autowired\r
+ AdminRolesService adminRolesService;\r
+ @Autowired\r
+ private SessionFactory sessionFactory;\r
+ @Autowired\r
+ private DataAccessService dataAccessService;\r
+\r
+ @PostConstruct\r
+ private void init() {\r
+ try {\r
+ validAppsFilter = " AND app.ENABLED = 'Y' AND app.APP_ID != " + SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID);\r
+ ACCOUNT_ADMIN_ROLE_ID = Long.valueOf(SystemProperties.getProperty(EPCommonSystemProperties.ACCOUNT_ADMIN_ROLE_ID));\r
+ LONG_ECOMP_APP_ID = Long.valueOf(SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID));\r
+ } catch(Exception e) {\r
+ logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));\r
+ }\r
+ }\r
+ \r
+ private String sqlWidgetsForAllApps() {\r
+ return "SELECT" + baseSqlToken + validAppsFilter;\r
+ }\r
+\r
+ private String sqlWidgetsForAllAppsWhereUserIsAdmin(Long userId) {\r
+ return "SELECT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = " + userId\r
+ + " AND FN_USER_ROLE.ROLE_ID = " + ACCOUNT_ADMIN_ROLE_ID + validAppsFilter;\r
+ }\r
+\r
+ private String sqlWidgetsForAllAppsWhereUserHasAnyRole(Long userId) {\r
+ return "SELECT DISTINCT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = "\r
+ + userId + validAppsFilter;\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public List<OnboardingWidget> getOnboardingWidgets(EPUser user, boolean managed) {\r
+ List<OnboardingWidget> onboardingWidgets = new ArrayList<OnboardingWidget>();\r
+ String sql = null;\r
+ if (adminRolesService.isSuperAdmin(user)) {\r
+ sql = this.sqlWidgetsForAllApps();\r
+ } else if (managed) {\r
+ if (adminRolesService.isAccountAdmin(user)) {\r
+ sql = this.sqlWidgetsForAllAppsWhereUserIsAdmin(user.getId());\r
+ }\r
+ } else if (adminRolesService.isAccountAdmin(user) || adminRolesService.isUser(user)) {\r
+ sql = this.sqlWidgetsForAllAppsWhereUserHasAnyRole(user.getId());\r
+ }\r
+ if (sql != null) {\r
+ onboardingWidgets = dataAccessService.executeSQLQuery(sql, OnboardingWidget.class, null);\r
+ }\r
+ return onboardingWidgets;\r
+ }\r
+\r
+ private static final Object syncRests = new Object();\r
+\r
+ private boolean isUserAdminOfAppForWidget(boolean superAdmin, Long userId, Long appId) {\r
+ if (!superAdmin) {\r
+ @SuppressWarnings("unchecked")\r
+ List<EPUserApp> userRoles = dataAccessService.getList(EPUserApp.class,\r
+ " where userId = " + userId + " and role.id = " + ACCOUNT_ADMIN_ROLE_ID + " and app.id = " + appId, null, null);\r
+ return (userRoles.size() > 0);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ private void validateOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) {\r
+ @SuppressWarnings("unchecked")\r
+ List<Widget> widgets = dataAccessService.getList(Widget.class,\r
+ " where url = '" + onboardingWidget.url + "'" + " or name = '" + onboardingWidget.name + "'", null, null);\r
+ boolean dublicatedUrl = false;\r
+ boolean dublicatedName = false;\r
+ for (Widget widget : widgets) {\r
+ if (onboardingWidget.id != null && onboardingWidget.id.equals(widget.getId())) {\r
+ // widget should not be compared with itself\r
+ continue;\r
+ }\r
+ if (!dublicatedUrl && widget.getUrl().equals(onboardingWidget.url)) {\r
+ dublicatedUrl = true;\r
+ if (dublicatedName) {\r
+ break;\r
+ }\r
+ }\r
+ if (!dublicatedName && widget.getName().equalsIgnoreCase(onboardingWidget.name) && widget.getAppId().equals(onboardingWidget.appId)) {\r
+ dublicatedName = true;\r
+ if (dublicatedUrl) {\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if (dublicatedUrl || dublicatedName) {\r
+ if (dublicatedUrl) {\r
+ fieldsValidator.addProblematicFieldName(urlField);\r
+ }\r
+ if (dublicatedName) {\r
+ fieldsValidator.addProblematicFieldName(nameField);\r
+ }\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);\r
+ fieldsValidator.errorCode = DUBLICATED_FIELD_VALUE_ECOMP_ERROR;\r
+ }\r
+ }\r
+\r
+ private void applyOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) {\r
+ boolean result = false;\r
+ Session localSession = null;\r
+ Transaction transaction = null;\r
+ try {\r
+ localSession = sessionFactory.openSession();\r
+ transaction = localSession.beginTransaction();\r
+ Widget widget;\r
+ if (onboardingWidget.id == null) {\r
+ widget = new Widget();\r
+ } else {\r
+ widget = (Widget) localSession.get(Widget.class, onboardingWidget.id);\r
+ }\r
+ widget.setAppId(onboardingWidget.appId);\r
+ widget.setName(onboardingWidget.name);\r
+ widget.setWidth(onboardingWidget.width);\r
+ widget.setHeight(onboardingWidget.height);\r
+ widget.setUrl(onboardingWidget.url);\r
+ localSession.saveOrUpdate(widget);\r
+ transaction.commit();\r
+ result = true;\r
+ } catch (Exception e) {\r
+ EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);\r
+ EcompPortalUtils.rollbackTransaction(transaction, "applyOnboardingWidget rollback, exception = " + e);\r
+ } finally {\r
+ EcompPortalUtils.closeLocalSession(localSession, "applyOnboardingWidget");\r
+ }\r
+ if (!result) {\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
+ }\r
+ }\r
+\r
+ private FieldsValidator updateOrSaveWidget(boolean superAdmin, Long userId, OnboardingWidget onboardingWidget) {\r
+ FieldsValidator fieldsValidator = new FieldsValidator();\r
+ if (!this.isUserAdminOfAppForWidget(superAdmin, userId, onboardingWidget.appId)) {\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);\r
+ return fieldsValidator;\r
+ }\r
+ synchronized (syncRests) {\r
+ // onboardingWidget.id is null for POST and not null for PUT\r
+ if (onboardingWidget.id == null) {\r
+ this.validateOnboardingWidget(onboardingWidget, fieldsValidator);\r
+ } else {\r
+ Widget widget = (Widget) dataAccessService.getDomainObject(Widget.class, onboardingWidget.id, null);\r
+ if (widget == null || widget.getId() == null) {\r
+ // Widget not found\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);\r
+ return fieldsValidator;\r
+ }\r
+ this.validateOnboardingWidget(onboardingWidget, fieldsValidator);\r
+ }\r
+ if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {\r
+ this.applyOnboardingWidget(onboardingWidget, fieldsValidator);\r
+ }\r
+ }\r
+ return fieldsValidator;\r
+ }\r
+\r
+ @Override\r
+ public FieldsValidator setOnboardingWidget(EPUser user, OnboardingWidget onboardingWidget) {\r
+ if (onboardingWidget.name.length() == 0 || onboardingWidget.url.length() == 0 || onboardingWidget.appId == null\r
+ || onboardingWidget.appId.equals(LONG_ECOMP_APP_ID) || onboardingWidget.width.intValue() <= 0 || onboardingWidget.height.intValue() <= 0) {\r
+ if (onboardingWidget.appId.equals(LONG_ECOMP_APP_ID)) {\r
+ // logger.error("Alarm!!! Security breach attempt on user " + user.getFullName() + ", userId = " + user.getUserId());\r
+ }\r
+ FieldsValidator fieldsValidator = new FieldsValidator();\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);\r
+ return fieldsValidator;\r
+ }\r
+ return this.updateOrSaveWidget(adminRolesService.isSuperAdmin(user), user.getId(), onboardingWidget);\r
+ }\r
+\r
+ @Override\r
+ public FieldsValidator deleteOnboardingWidget(EPUser user, Long onboardingWidgetId) {\r
+ FieldsValidator fieldsValidator = new FieldsValidator();\r
+ synchronized (syncRests) {\r
+ Widget widget = (Widget) dataAccessService.getDomainObject(Widget.class, onboardingWidgetId, null);\r
+ if (widget != null && widget.getId() != null) { // widget exists\r
+ if (!this.isUserAdminOfAppForWidget(adminRolesService.isSuperAdmin(user), user.getId(), widget.getAppId())) {\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);\r
+ } else {\r
+ boolean result = false;\r
+ Session localSession = null;\r
+ Transaction transaction = null;\r
+ try {\r
+ localSession = sessionFactory.openSession();\r
+ transaction = localSession.beginTransaction();\r
+ localSession.delete(localSession.get(Widget.class, onboardingWidgetId));\r
+ transaction.commit();\r
+ result = true;\r
+ } catch (Exception e) {\r
+ EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);\r
+ EcompPortalUtils.rollbackTransaction(transaction, "deleteOnboardingWidget rollback, exception = " + e);\r
+ } finally {\r
+ EcompPortalUtils.closeLocalSession(localSession, "deleteOnboardingWidget");\r
+ }\r
+ if (!result) {\r
+ fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return fieldsValidator;\r
+ }\r
+\r
+}\r