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.service;
\r
22 import java.util.ArrayList;
\r
23 import java.util.List;
\r
25 import javax.annotation.PostConstruct;
\r
26 import javax.servlet.http.HttpServletResponse;
\r
28 import org.hibernate.Session;
\r
29 import org.hibernate.SessionFactory;
\r
30 import org.hibernate.Transaction;
\r
31 import org.springframework.beans.factory.annotation.Autowired;
\r
32 import org.springframework.context.annotation.EnableAspectJAutoProxy;
\r
33 import org.springframework.stereotype.Service;
\r
34 import org.springframework.transaction.annotation.Transactional;
\r
36 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
\r
37 import org.openecomp.portalsdk.core.service.DataAccessService;
\r
38 import org.openecomp.portalsdk.core.util.SystemProperties;
\r
39 import org.openecomp.portalapp.portal.domain.EPUser;
\r
40 import org.openecomp.portalapp.portal.domain.EPUserApp;
\r
41 import org.openecomp.portalapp.portal.domain.Widget;
\r
42 import org.openecomp.portalapp.portal.logging.aop.EPMetricsLog;
\r
43 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
\r
44 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
\r
45 import org.openecomp.portalapp.portal.transport.FieldsValidator;
\r
46 import org.openecomp.portalapp.portal.transport.OnboardingWidget;
\r
47 import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
\r
48 import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
\r
50 @Service("widgetService")
\r
52 @org.springframework.context.annotation.Configuration
\r
53 @EnableAspectJAutoProxy
\r
55 public class WidgetServiceImpl implements WidgetService {
\r
57 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
58 + " from FN_WIDGET widget join FN_APP app ON widget.APP_ID = app.APP_ID";
\r
60 private String validAppsFilter = "";
\r
62 private Long LONG_ECOMP_APP_ID = 1L;
\r
63 private Long ACCOUNT_ADMIN_ROLE_ID = 999L;
\r
64 private static final Long DUBLICATED_FIELD_VALUE_ECOMP_ERROR = new Long(EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR);
\r
66 private static final String urlField = "url";
\r
68 private static final String nameField = "name";
\r
69 EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetServiceImpl.class);
\r
72 AdminRolesService adminRolesService;
\r
74 private SessionFactory sessionFactory;
\r
76 private DataAccessService dataAccessService;
\r
79 private void init() {
\r
81 validAppsFilter = " AND app.ENABLED = 'Y' AND app.APP_ID != " + SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID);
\r
82 ACCOUNT_ADMIN_ROLE_ID = Long.valueOf(SystemProperties.getProperty(EPCommonSystemProperties.ACCOUNT_ADMIN_ROLE_ID));
\r
83 LONG_ECOMP_APP_ID = Long.valueOf(SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID));
\r
84 } catch(Exception e) {
\r
85 logger.error(EELFLoggerDelegate.errorLogger, EcompPortalUtils.getStackTrace(e));
\r
89 private String sqlWidgetsForAllApps() {
\r
90 return "SELECT" + baseSqlToken + validAppsFilter;
\r
93 private String sqlWidgetsForAllAppsWhereUserIsAdmin(Long userId) {
\r
94 return "SELECT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = " + userId
\r
95 + " AND FN_USER_ROLE.ROLE_ID = " + ACCOUNT_ADMIN_ROLE_ID + validAppsFilter;
\r
98 private String sqlWidgetsForAllAppsWhereUserHasAnyRole(Long userId) {
\r
99 return "SELECT DISTINCT" + baseSqlToken + " join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = app.APP_ID where FN_USER_ROLE.USER_ID = "
\r
100 + userId + validAppsFilter;
\r
103 @SuppressWarnings("unchecked")
\r
105 public List<OnboardingWidget> getOnboardingWidgets(EPUser user, boolean managed) {
\r
106 List<OnboardingWidget> onboardingWidgets = new ArrayList<OnboardingWidget>();
\r
108 if (adminRolesService.isSuperAdmin(user)) {
\r
109 sql = this.sqlWidgetsForAllApps();
\r
110 } else if (managed) {
\r
111 if (adminRolesService.isAccountAdmin(user)) {
\r
112 sql = this.sqlWidgetsForAllAppsWhereUserIsAdmin(user.getId());
\r
114 } else if (adminRolesService.isAccountAdmin(user) || adminRolesService.isUser(user)) {
\r
115 sql = this.sqlWidgetsForAllAppsWhereUserHasAnyRole(user.getId());
\r
118 onboardingWidgets = dataAccessService.executeSQLQuery(sql, OnboardingWidget.class, null);
\r
120 return onboardingWidgets;
\r
123 private static final Object syncRests = new Object();
\r
125 private boolean isUserAdminOfAppForWidget(boolean superAdmin, Long userId, Long appId) {
\r
127 @SuppressWarnings("unchecked")
\r
128 List<EPUserApp> userRoles = dataAccessService.getList(EPUserApp.class,
\r
129 " where userId = " + userId + " and role.id = " + ACCOUNT_ADMIN_ROLE_ID + " and app.id = " + appId, null, null);
\r
130 return (userRoles.size() > 0);
\r
135 private void validateOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) {
\r
136 @SuppressWarnings("unchecked")
\r
137 List<Widget> widgets = dataAccessService.getList(Widget.class,
\r
138 " where url = '" + onboardingWidget.url + "'" + " or name = '" + onboardingWidget.name + "'", null, null);
\r
139 boolean dublicatedUrl = false;
\r
140 boolean dublicatedName = false;
\r
141 for (Widget widget : widgets) {
\r
142 if (onboardingWidget.id != null && onboardingWidget.id.equals(widget.getId())) {
\r
143 // widget should not be compared with itself
\r
146 if (!dublicatedUrl && widget.getUrl().equals(onboardingWidget.url)) {
\r
147 dublicatedUrl = true;
\r
148 if (dublicatedName) {
\r
152 if (!dublicatedName && widget.getName().equalsIgnoreCase(onboardingWidget.name) && widget.getAppId().equals(onboardingWidget.appId)) {
\r
153 dublicatedName = true;
\r
154 if (dublicatedUrl) {
\r
159 if (dublicatedUrl || dublicatedName) {
\r
160 if (dublicatedUrl) {
\r
161 fieldsValidator.addProblematicFieldName(urlField);
\r
163 if (dublicatedName) {
\r
164 fieldsValidator.addProblematicFieldName(nameField);
\r
166 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
\r
167 fieldsValidator.errorCode = DUBLICATED_FIELD_VALUE_ECOMP_ERROR;
\r
171 private void applyOnboardingWidget(OnboardingWidget onboardingWidget, FieldsValidator fieldsValidator) {
\r
172 boolean result = false;
\r
173 Session localSession = null;
\r
174 Transaction transaction = null;
\r
176 localSession = sessionFactory.openSession();
\r
177 transaction = localSession.beginTransaction();
\r
179 if (onboardingWidget.id == null) {
\r
180 widget = new Widget();
\r
182 widget = (Widget) localSession.get(Widget.class, onboardingWidget.id);
\r
184 widget.setAppId(onboardingWidget.appId);
\r
185 widget.setName(onboardingWidget.name);
\r
186 widget.setWidth(onboardingWidget.width);
\r
187 widget.setHeight(onboardingWidget.height);
\r
188 widget.setUrl(onboardingWidget.url);
\r
189 localSession.saveOrUpdate(widget);
\r
190 transaction.commit();
\r
192 } catch (Exception e) {
\r
193 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r
194 EcompPortalUtils.rollbackTransaction(transaction, "applyOnboardingWidget rollback, exception = " + e);
\r
196 EcompPortalUtils.closeLocalSession(localSession, "applyOnboardingWidget");
\r
199 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r
203 private FieldsValidator updateOrSaveWidget(boolean superAdmin, Long userId, OnboardingWidget onboardingWidget) {
\r
204 FieldsValidator fieldsValidator = new FieldsValidator();
\r
205 if (!this.isUserAdminOfAppForWidget(superAdmin, userId, onboardingWidget.appId)) {
\r
206 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);
\r
207 return fieldsValidator;
\r
209 synchronized (syncRests) {
\r
210 // onboardingWidget.id is null for POST and not null for PUT
\r
211 if (onboardingWidget.id == null) {
\r
212 this.validateOnboardingWidget(onboardingWidget, fieldsValidator);
\r
214 Widget widget = (Widget) dataAccessService.getDomainObject(Widget.class, onboardingWidget.id, null);
\r
215 if (widget == null || widget.getId() == null) {
\r
216 // Widget not found
\r
217 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);
\r
218 return fieldsValidator;
\r
220 this.validateOnboardingWidget(onboardingWidget, fieldsValidator);
\r
222 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
\r
223 this.applyOnboardingWidget(onboardingWidget, fieldsValidator);
\r
226 return fieldsValidator;
\r
230 public FieldsValidator setOnboardingWidget(EPUser user, OnboardingWidget onboardingWidget) {
\r
231 if (onboardingWidget.name.length() == 0 || onboardingWidget.url.length() == 0 || onboardingWidget.appId == null
\r
232 || onboardingWidget.appId.equals(LONG_ECOMP_APP_ID) || onboardingWidget.width.intValue() <= 0 || onboardingWidget.height.intValue() <= 0) {
\r
233 if (onboardingWidget.appId.equals(LONG_ECOMP_APP_ID)) {
\r
234 // logger.error("Alarm!!! Security breach attempt on user " + user.getFullName() + ", userId = " + user.getUserId());
\r
236 FieldsValidator fieldsValidator = new FieldsValidator();
\r
237 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
\r
238 return fieldsValidator;
\r
240 return this.updateOrSaveWidget(adminRolesService.isSuperAdmin(user), user.getId(), onboardingWidget);
\r
244 public FieldsValidator deleteOnboardingWidget(EPUser user, Long onboardingWidgetId) {
\r
245 FieldsValidator fieldsValidator = new FieldsValidator();
\r
246 synchronized (syncRests) {
\r
247 Widget widget = (Widget) dataAccessService.getDomainObject(Widget.class, onboardingWidgetId, null);
\r
248 if (widget != null && widget.getId() != null) { // widget exists
\r
249 if (!this.isUserAdminOfAppForWidget(adminRolesService.isSuperAdmin(user), user.getId(), widget.getAppId())) {
\r
250 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);
\r
252 boolean result = false;
\r
253 Session localSession = null;
\r
254 Transaction transaction = null;
\r
256 localSession = sessionFactory.openSession();
\r
257 transaction = localSession.beginTransaction();
\r
258 localSession.delete(localSession.get(Widget.class, onboardingWidgetId));
\r
259 transaction.commit();
\r
261 } catch (Exception e) {
\r
262 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r
263 EcompPortalUtils.rollbackTransaction(transaction, "deleteOnboardingWidget rollback, exception = " + e);
\r
265 EcompPortalUtils.closeLocalSession(localSession, "deleteOnboardingWidget");
\r
268 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r
273 return fieldsValidator;
\r