[PORTAL-7] Rebase
[portal.git] / ecomp-portal-BE-common / src / main / java / org / openecomp / portalapp / portal / service / WidgetServiceImpl.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.service;\r
21 \r
22 import java.util.ArrayList;\r
23 import java.util.List;\r
24 \r
25 import javax.annotation.PostConstruct;\r
26 import javax.servlet.http.HttpServletResponse;\r
27 \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
35 \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
49 \r
50 @Service("widgetService")\r
51 @Transactional\r
52 @org.springframework.context.annotation.Configuration\r
53 @EnableAspectJAutoProxy\r
54 @EPMetricsLog\r
55 public class WidgetServiceImpl implements WidgetService {\r
56 \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
59 \r
60         private String validAppsFilter = "";\r
61 \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
65 \r
66         private static final String urlField = "url";\r
67 \r
68         private static final String nameField = "name";\r
69         EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(WidgetServiceImpl.class);\r
70 \r
71         @Autowired\r
72         AdminRolesService adminRolesService;\r
73         @Autowired\r
74         private SessionFactory sessionFactory;\r
75         @Autowired\r
76         private DataAccessService dataAccessService;\r
77 \r
78         @PostConstruct\r
79         private void init() {\r
80                 try {\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
86                 }\r
87         }\r
88         \r
89         private String sqlWidgetsForAllApps() {\r
90                 return "SELECT" + baseSqlToken + validAppsFilter;\r
91         }\r
92 \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
96         }\r
97 \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
101         }\r
102 \r
103         @SuppressWarnings("unchecked")\r
104         @Override\r
105         public List<OnboardingWidget> getOnboardingWidgets(EPUser user, boolean managed) {\r
106                 List<OnboardingWidget> onboardingWidgets = new ArrayList<OnboardingWidget>();\r
107                 String sql = null;\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
113                         }\r
114                 } else if (adminRolesService.isAccountAdmin(user) || adminRolesService.isUser(user)) {\r
115                         sql = this.sqlWidgetsForAllAppsWhereUserHasAnyRole(user.getId());\r
116                 }\r
117                 if (sql != null) {\r
118                         onboardingWidgets = dataAccessService.executeSQLQuery(sql, OnboardingWidget.class, null);\r
119                 }\r
120                 return onboardingWidgets;\r
121         }\r
122 \r
123         private static final Object syncRests = new Object();\r
124 \r
125         private boolean isUserAdminOfAppForWidget(boolean superAdmin, Long userId, Long appId) {\r
126                 if (!superAdmin) {\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
131                 }\r
132                 return true;\r
133         }\r
134 \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
144                                 continue;\r
145                         }\r
146                         if (!dublicatedUrl && widget.getUrl().equals(onboardingWidget.url)) {\r
147                                 dublicatedUrl = true;\r
148                                 if (dublicatedName) {\r
149                                         break;\r
150                                 }\r
151                         }\r
152                         if (!dublicatedName && widget.getName().equalsIgnoreCase(onboardingWidget.name) && widget.getAppId().equals(onboardingWidget.appId)) {\r
153                                 dublicatedName = true;\r
154                                 if (dublicatedUrl) {\r
155                                         break;\r
156                                 }\r
157                         }\r
158                 }\r
159                 if (dublicatedUrl || dublicatedName) {\r
160                         if (dublicatedUrl) {\r
161                                 fieldsValidator.addProblematicFieldName(urlField);\r
162                         }\r
163                         if (dublicatedName) {\r
164                                 fieldsValidator.addProblematicFieldName(nameField);\r
165                         }\r
166                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);\r
167                         fieldsValidator.errorCode = DUBLICATED_FIELD_VALUE_ECOMP_ERROR;\r
168                 }\r
169         }\r
170 \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
175                 try {\r
176                         localSession = sessionFactory.openSession();\r
177                         transaction = localSession.beginTransaction();\r
178                         Widget widget;\r
179                         if (onboardingWidget.id == null) {\r
180                                 widget = new Widget();\r
181                         } else {\r
182                                 widget = (Widget) localSession.get(Widget.class, onboardingWidget.id);\r
183                         }\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
191                         result = true;\r
192                 } catch (Exception e) {\r
193                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);\r
194                         EcompPortalUtils.rollbackTransaction(transaction, "applyOnboardingWidget rollback, exception = " + e);\r
195                 } finally {\r
196                         EcompPortalUtils.closeLocalSession(localSession, "applyOnboardingWidget");\r
197                 }\r
198                 if (!result) {\r
199                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
200                 }\r
201         }\r
202 \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
208                 }\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
213                         } else {\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
219                                 }\r
220                                 this.validateOnboardingWidget(onboardingWidget, fieldsValidator);\r
221                         }\r
222                         if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {\r
223                                 this.applyOnboardingWidget(onboardingWidget, fieldsValidator);\r
224                         }\r
225                 }\r
226                 return fieldsValidator;\r
227         }\r
228 \r
229         @Override\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
235                         }\r
236                         FieldsValidator fieldsValidator = new FieldsValidator();\r
237                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);\r
238                         return fieldsValidator;\r
239                 }\r
240                 return this.updateOrSaveWidget(adminRolesService.isSuperAdmin(user), user.getId(), onboardingWidget);\r
241         }\r
242 \r
243         @Override\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
251                                 } else {\r
252                                         boolean result = false;\r
253                                         Session localSession = null;\r
254                                         Transaction transaction = null;\r
255                                         try {\r
256                                                 localSession = sessionFactory.openSession();\r
257                                                 transaction = localSession.beginTransaction();\r
258                                                 localSession.delete(localSession.get(Widget.class, onboardingWidgetId));\r
259                                                 transaction.commit();\r
260                                                 result = true;\r
261                                         } catch (Exception e) {\r
262                                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);\r
263                                                 EcompPortalUtils.rollbackTransaction(transaction, "deleteOnboardingWidget rollback, exception = " + e);\r
264                                         } finally {\r
265                                                 EcompPortalUtils.closeLocalSession(localSession, "deleteOnboardingWidget");\r
266                                         }\r
267                                         if (!result) {\r
268                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);\r
269                                         }\r
270                                 }\r
271                         }\r
272                 }\r
273                 return fieldsValidator;\r
274         }\r
275 \r
276 }\r