f38b921a0a89d943edad540641abca7435b67499
[portal.git] / ecomp-portal-BE-common / src / main / java / org / openecomp / portalapp / portal / service / EPAppCommonServiceImpl.java
1 /*-
2  * ================================================================================
3  * ECOMP Portal
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ================================================================================
19  */
20 package org.openecomp.portalapp.portal.service;
21
22 import java.io.IOException;
23 import java.security.GeneralSecurityException;
24 import java.util.ArrayList;
25 import java.util.Base64;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.LinkedList;
29 import java.util.List;
30 import java.util.Map;
31 import java.util.Set;
32
33 import javax.annotation.PostConstruct;
34 import javax.servlet.http.HttpServletResponse;
35
36 import org.apache.commons.lang.StringUtils;
37 import org.hibernate.Query;
38 import org.hibernate.Session;
39 import org.hibernate.SessionFactory;
40 import org.hibernate.Transaction;
41 import org.openecomp.portalapp.portal.domain.AdminUserApp;
42 import org.openecomp.portalapp.portal.domain.AdminUserApplications;
43 import org.openecomp.portalapp.portal.domain.AppIdAndNameTransportModel;
44 import org.openecomp.portalapp.portal.domain.AppsResponse;
45 import org.openecomp.portalapp.portal.domain.EPApp;
46 import org.openecomp.portalapp.portal.domain.EPUser;
47 import org.openecomp.portalapp.portal.domain.EPUserAppsManualSortPreference;
48 import org.openecomp.portalapp.portal.domain.EPUserAppsSortPreference;
49 import org.openecomp.portalapp.portal.domain.EPWidgetsManualSortPreference;
50 import org.openecomp.portalapp.portal.domain.EcompApp;
51 import org.openecomp.portalapp.portal.domain.UserRole;
52 import org.openecomp.portalapp.portal.domain.UserRoles;
53 import org.openecomp.portalapp.portal.ecomp.model.AppCatalogItem;
54 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
55 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
56 import org.openecomp.portalapp.portal.transport.EPAppsManualPreference;
57 import org.openecomp.portalapp.portal.transport.EPAppsSortPreference;
58 import org.openecomp.portalapp.portal.transport.EPDeleteAppsManualSortPref;
59 import org.openecomp.portalapp.portal.transport.EPWidgetsSortPreference;
60 import org.openecomp.portalapp.portal.transport.FieldsValidator;
61 import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
62 import org.openecomp.portalapp.portal.transport.LocalRole;
63 import org.openecomp.portalapp.portal.transport.OnboardingApp;
64 import org.openecomp.portalapp.portal.ueb.EPUebHelper;
65 import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
66 import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
67 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
68 import org.openecomp.portalsdk.core.onboarding.ueb.Helper;
69 import org.openecomp.portalsdk.core.onboarding.ueb.TopicManager;
70 import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
71 import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
72 import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties;
73 import org.openecomp.portalsdk.core.service.DataAccessService;
74 import org.openecomp.portalsdk.core.util.SystemProperties;
75 import org.springframework.beans.factory.annotation.Autowired;
76
77 import com.att.nsa.apiClient.http.HttpException;
78 import com.att.nsa.cambria.client.CambriaClient.CambriaApiException;
79 import com.att.nsa.cambria.client.CambriaClientBuilders;
80 import com.att.nsa.cambria.client.CambriaIdentityManager;
81 import com.att.nsa.cambria.client.CambriaTopicManager;
82 import com.google.common.primitives.Ints;
83
84 public class EPAppCommonServiceImpl implements EPAppService {
85
86         protected String ECOMP_APP_ID = "1";
87         protected String SUPER_ADMIN_ROLE_ID = "1";
88         protected String ACCOUNT_ADMIN_ROLE_ID = "999";
89         protected String RESTRICTED_APP_ROLE_ID = "900";
90
91         private static final String urlField = "url";
92         private static final String nameField = "name";
93
94         private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(EPAppCommonServiceImpl.class);
95
96         @Autowired
97         private AdminRolesService adminRolesService;
98         @Autowired
99         protected SessionFactory sessionFactory;
100         @Autowired
101         private DataAccessService dataAccessService;
102         @Autowired
103         private EPUebHelper epUebHelper;
104
105         @PostConstruct
106         private void init() {
107                 SUPER_ADMIN_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.SYS_ADMIN_ROLE_ID);
108                 ACCOUNT_ADMIN_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.ACCOUNT_ADMIN_ROLE_ID);
109                 ECOMP_APP_ID = SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID);
110                 RESTRICTED_APP_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.RESTRICTED_APP_ROLE_ID);
111         }
112
113         @Override
114         public List<EPApp> getUserAsAdminApps(EPUser user) {
115                 if (adminRolesService.isAccountAdmin(user)) {
116                         String sql = "SELECT * FROM FN_APP join FN_USER_ROLE ON FN_USER_ROLE.APP_ID=FN_APP.APP_ID where "
117                                         + "FN_USER_ROLE.USER_ID=" + user.getId() + " AND FN_USER_ROLE.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
118                                         + " AND FN_APP.ENABLED = 'Y'";
119                         logQuery(sql);
120                         try {
121                                 @SuppressWarnings("unchecked")
122                                 List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
123                                 return adminApps;
124                         } catch (Exception e) {
125                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
126                                 return null;
127                         }
128                 } else {
129                         logger.error(EELFLoggerDelegate.errorLogger,
130                                         "getUserAsAdminApps: only Account Admin may invoke this function!");
131                         return new ArrayList<EPApp>();
132                 }
133         }
134
135         @Override
136         public List<EPApp> getUserByOrgUserIdAsAdminApps(String orgUserId) {
137                 String format = "SELECT * FROM FN_APP app INNER JOIN FN_USER_ROLE userrole ON userrole.APP_ID=app.APP_ID "
138                                 + "INNER JOIN FN_USER user on user.USER_ID = userrole.USER_ID "
139                                 + "WHERE user.org_user_id = '%s' AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
140                                 + " AND FN_APP.ENABLED = 'Y'";
141
142                 String sql = String.format(format, orgUserId);
143                 logQuery(sql);
144
145                 try {
146                         @SuppressWarnings("unchecked")
147                         List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
148                         return adminApps;
149                 } catch (Exception e) {
150                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
151                         return null;
152                 }
153         }
154
155         @Override
156         public List<EPApp> getAppsFullList() {
157                 @SuppressWarnings("unchecked")
158                 List<EPApp> apps = dataAccessService.getList(EPApp.class, null);
159                 return apps;
160         }
161
162         @Override
163         public List<EcompApp> getEcompAppAppsFullList() {
164                 return transformAppsToEcompApps(getAppsFullList());
165         }
166
167         @Override
168         public List<EcompApp> transformAppsToEcompApps(List<EPApp> appsList) {
169                 List<EcompApp> ecompAppList = new ArrayList<EcompApp>();
170                 for (EPApp app : appsList) {
171                         EcompApp ecompApp = new EcompApp();
172                         ecompApp.setId(app.getId());
173                         ecompApp.setName(app.getName());
174                         ecompApp.setImageUrl(app.getImageUrl());
175                         ecompApp.setDescription(app.getDescription());
176                         ecompApp.setNotes(app.getNotes());
177                         ecompApp.setUrl(app.getUrl());
178                         ecompApp.setAlternateUrl(app.getAlternateUrl());
179                         ecompApp.setUebTopicName(app.getUebTopicName());
180                         ecompApp.setUebKey(app.getUebKey());
181                         ecompApp.setUebSecret(app.getUebSecret());
182                         ecompApp.setEnabled(app.getEnabled());
183                         ecompApp.setRestrictedApp(app.isRestrictedApp());
184                         ecompAppList.add(ecompApp);
185                 }
186                 return ecompAppList;
187         }
188
189         @Override
190         public EPApp getApp(Long appId) {
191                 try {
192                         @SuppressWarnings("unchecked")
193                         List<EPApp> apps = dataAccessService.getList(EPApp.class, " where id = " + appId, null, null);
194                         return (apps.size() > 0) ? apps.get(0) : null;
195                 } catch (Exception e) {
196                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
197                         return null;
198                 }
199         }
200
201         @SuppressWarnings("unchecked")
202         @Override
203         public List<AppIdAndNameTransportModel> getAdminApps(EPUser user) {
204                 if (adminRolesService.isAccountAdmin(user)) {
205                         String format = "SELECT app.APP_ID, app.APP_NAME, app.APP_TYPE FROM FN_APP app inner join FN_USER_ROLE userrole ON userrole.APP_ID=app.APP_ID "
206                                         + "where userrole.USER_ID = %d AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
207                                         + " AND (app.ENABLED = 'Y' OR app.APP_ID=1)";
208                         String sql = String.format(format, user.getId());
209                         // sql += " AND app.APP_REST_ENDPOINT IS NOT NULL AND
210                         // app.APP_REST_ENDPOINT <> ''";
211                         logQuery(sql);
212                         try {
213                                 return dataAccessService.executeSQLQuery(sql, AppIdAndNameTransportModel.class, null);
214                         } catch (Exception e) {
215                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
216                                 logger.error(EELFLoggerDelegate.errorLogger,
217                                                 "Exception occurred while fetching the adminApps for user " + user.getLoginId(), e);
218                         }
219                 }
220                 return new ArrayList<AppIdAndNameTransportModel>();
221         }
222
223         @Override
224         public EPApp getAppDetail(String appName) {
225                 final Map<String, String> params = new HashMap<String, String>();
226                 try {
227                         params.put("appName", appName);
228                         @SuppressWarnings("unchecked")
229                         List<EPApp> apps = (List<EPApp>) dataAccessService.executeNamedQuery("getMyloginAppDetails", params, null);
230                         return (apps.size() > 0) ? apps.get(0) : null;
231                 } catch (Exception e) {
232                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
233                         return null;
234                 }
235         }
236
237         @SuppressWarnings("unchecked")
238         @Override
239         public List<AppIdAndNameTransportModel> getAppsForSuperAdminAndAccountAdmin(EPUser user) {
240                 if (adminRolesService.isSuperAdmin(user) || adminRolesService.isAccountAdmin(user)) {
241                         String format = "";
242                         String sql = "";
243                         if (adminRolesService.isSuperAdmin(user)) {
244                                 format = "SELECT app.APP_ID, app.APP_NAME, app.APP_TYPE FROM FN_APP app "
245                                                 + "where app.ENABLED = 'Y' AND app.app_type = 1";
246                         } else {
247                                 format = "SELECT app.APP_ID, app.APP_NAME, APP_TYPE FROM FN_APP app inner join FN_USER_ROLE userrole ON userrole.APP_ID=app.APP_ID "
248                                                 + "where userrole.USER_ID = %d AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
249                                                 + " AND app.ENABLED = 'Y' AND app.app_type = 1";
250                         }
251                         sql = String.format(format, user.getId());
252                         // sql += " AND app.APP_REST_ENDPOINT IS NOT NULL AND
253                         // app.APP_REST_ENDPOINT <> ''";
254                         logQuery(sql);
255                         try {
256                                 return dataAccessService.executeSQLQuery(sql, AppIdAndNameTransportModel.class, null);
257                         } catch (Exception e) {
258                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
259                                 logger.error(EELFLoggerDelegate.errorLogger,
260                                                 "Exception occurred while fetching the adminApps for user " + user.getLoginId(), e);
261                         }
262                 }
263                 return new ArrayList<AppIdAndNameTransportModel>();
264         }
265
266         protected void logQuery(String sql) {
267                 logger.debug(EELFLoggerDelegate.debugLogger, "logQuery: " + sql);
268         }
269
270         public DataAccessService getDataAccessService() {
271                 return dataAccessService;
272         }
273
274         public void setDataAccessService(DataAccessService dataAccessService) {
275                 this.dataAccessService = dataAccessService;
276         }
277
278         @SuppressWarnings("unchecked")
279         @Override
280         public List<AdminUserApplications> getAppsAdmins() {
281                 try {
282                         Map<String, String> params = new HashMap<>();
283                         params.put("accountAdminRoleId", ACCOUNT_ADMIN_ROLE_ID);
284                         List<AdminUserApp> adminApps = (List<AdminUserApp>) dataAccessService.executeNamedQuery("getAppsAdmins",
285                                         params, null);
286                         return aggregateRowsResultsByUserId(adminApps);
287                 } catch (Exception e) {
288                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
289                         return null;
290                 }
291         }
292
293         private List<AdminUserApplications> aggregateRowsResultsByUserId(List<AdminUserApp> adminApps) {
294                 HashMap<Long, AdminUserApplications> adminUserApplications = new HashMap<Long, AdminUserApplications>();
295                 for (AdminUserApp app : adminApps) {
296                         Long userId = app.getUser_Id();
297                         if (adminUserApplications.get(userId) == null)
298                                 adminUserApplications.put(userId, new AdminUserApplications(app));
299                         else
300                                 adminUserApplications.get(userId).addApp(app.getAppId(), app.getAppName());
301                 }
302                 return new ArrayList<AdminUserApplications>(adminUserApplications.values());
303         }
304
305         @Override
306         public List<AppsResponse> getAllApps(Boolean all) {
307                 // If all is true, return both active and inactive apps. Otherwise, just
308                 // active apps.
309                 @SuppressWarnings("unchecked")
310                 // Sort the list by application name so the drop-down looks pretty.
311                 List<EPApp> apps = all
312                                 ? (List<EPApp>) dataAccessService.getList(EPApp.class, " where id != " + ECOMP_APP_ID, "name", null)
313                                 : (List<EPApp>) dataAccessService.getList(EPApp.class,
314                                                 " where ( enabled = 'Y' or id = " + ECOMP_APP_ID + ")", "name", null);
315
316                 List<AppsResponse> appsModified = new ArrayList<AppsResponse>();
317                 for (EPApp app : apps) {
318                         appsModified.add(new AppsResponse(app.getId(), app.getName(), app.isRestrictedApp(), app.getEnabled()));
319                 }
320                 return appsModified;
321         }
322
323         @Override
324         public UserRoles getUserProfile(String loginId) {
325                 String format = "SELECT DISTINCT user.USER_ID, role.ROLE_ID, user.org_user_id, user.FIRST_NAME, user.LAST_NAME, role.ROLE_NAME  FROM fn_user_role userrole "
326                                 + "INNER JOIN fn_user user ON user.USER_ID = userrole.USER_ID "
327                                 + "INNER JOIN fn_role role ON role.ROLE_ID = userrole.ROLE_ID "
328                                 + "WHERE user.org_user_id = \"%s\" and (userrole.app_id = 1 or role.role_id = " + ACCOUNT_ADMIN_ROLE_ID
329                                 + ") ";
330                 String sql = String.format(format, loginId);
331                 logQuery(sql);
332                 @SuppressWarnings("unchecked")
333                 List<UserRole> userRoleList = dataAccessService.executeSQLQuery(sql, UserRole.class, null);
334                 ArrayList<UserRoles> usersRolesList = aggregateUserProfileRowsResultsByRole(userRoleList);
335                 if (usersRolesList == null || usersRolesList.size() < 1)
336                         return null;
337
338                 return usersRolesList.get(0);
339         }
340
341         @Override
342         public UserRoles getUserProfileNormalized(EPUser user) {
343                 // Check database.
344                 UserRoles userAndRoles = getUserProfile(user.getLoginId());
345                 // If no roles are defined, treat this user as a guest.
346                 if (user.isGuest() || userAndRoles == null) {
347                         logger.debug(EELFLoggerDelegate.debugLogger, "getUserProfile: treating user {} as guest",
348                                         user.getLoginId());
349                         UserRole userRole = new UserRole();
350                         userRole.setUser_Id(user.getId());
351                         userRole.setOrgUserId(user.getLoginId());
352                         userRole.setFirstName(user.getFirstName());
353                         userRole.setLastName(user.getLastName());
354                         userRole.setRoleId(-1L);
355                         userRole.setRoleName("Guest");
356                         userRole.setUser_Id(-1L);
357                         userAndRoles = new UserRoles(userRole);
358                 }
359
360                 return userAndRoles;
361         }
362
363         protected ArrayList<UserRoles> aggregateUserProfileRowsResultsByRole(List<UserRole> userRoleList) {
364                 HashMap<String, UserRoles> userRoles = new HashMap<String, UserRoles>();
365                 for (UserRole user : userRoleList) {
366                         String orgUserId = user.getOrgUserId();
367                         if (userRoles.get(orgUserId) == null)
368                                 userRoles.put(orgUserId, new UserRoles(user));
369                         else
370                                 userRoles.get(orgUserId).addRole(user.getRoleName());
371                 }
372                 return new ArrayList<UserRoles>(userRoles.values());
373         }
374
375         private boolean isRestrictedApp(Long appId) {
376                 EPApp app = getApp(appId);
377                 return app.isRestrictedApp();
378         }
379
380         // For the functional menu edit
381         @Override
382         public List<LocalRole> getAppRoles(Long appId) {
383                 String sql = "";
384                 if (isRestrictedApp(appId)) {
385                         sql = "SELECT ROLE_ID, ROLE_NAME from FN_ROLE where ROLE_ID = '" + RESTRICTED_APP_ROLE_ID + "'";
386                 } else {
387                         sql = "SELECT ROLE_ID, ROLE_NAME from FN_ROLE where APP_ID = '" + appId + "'";
388                 }
389                 logQuery(sql);
390                 @SuppressWarnings("unchecked")
391                 List<LocalRole> appRoles = dataAccessService.executeSQLQuery(sql, LocalRole.class, null);
392                 return appRoles;
393         }
394
395         protected String userAppsQuery(EPUser user) {
396                 StringBuilder query = new StringBuilder();
397                 if (adminRolesService.isSuperAdmin(user)) {
398                         query.append("SELECT * FROM FN_APP where FN_APP.ENABLED = 'Y' ORDER BY APP_NAME");
399                 } else {
400                         query.append("SELECT * FROM FN_APP join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = FN_APP.APP_ID where ");
401                         query.append(
402                                         "FN_USER_ROLE.USER_ID = " + user.getId() + " AND FN_USER_ROLE.ROLE_ID != " + SUPER_ADMIN_ROLE_ID);
403                         query.append(" AND FN_APP.ENABLED = 'Y'");
404                 }
405                 return query.toString();
406         }
407
408         protected FieldsValidator onboardingAppFieldsChecker(OnboardingApp onboardingApp) {
409                 FieldsValidator fieldsValidator = new FieldsValidator();
410                 if (onboardingApp.name == null || onboardingApp.name.length() == 0 || onboardingApp.url == null
411                                 || onboardingApp.url.length() == 0 || onboardingApp.restrictedApp == null
412                                 || onboardingApp.isOpen == null || onboardingApp.isEnabled == null
413                                 || (onboardingApp.id != null && onboardingApp.id.equals(ECOMP_APP_ID))
414                                 // For a normal app (appType==1), these fields must be filled
415                                 // in.
416                                 // For a restricted app (appType==2), they will be empty.
417                                 || ((!onboardingApp.restrictedApp)
418                                                 && (onboardingApp.username == null || onboardingApp.username.length() == 0
419                                                                 || onboardingApp.appPassword == null || onboardingApp.appPassword.length() == 0))) {
420                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
421                 }
422                 return fieldsValidator;
423         }
424
425         @Override
426         public List<EPApp> getUserApps(EPUser user) {
427                 List<EPApp> openApps = getOpenApps();
428
429                 if (user.isGuest()) {
430                         return openApps;
431                 } else {
432                         String sql = userAppsQuery(user);
433                         logQuery(sql);
434
435                         // TreeSet<EPApp> distinctApps = new TreeSet<EPApp>();
436                         List<EPApp> appsList = new ArrayList<>();
437                         @SuppressWarnings("unchecked")
438                         List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
439                         HashSet<EPApp> appSet = new HashSet<>();
440                         for (EPApp app : adminApps) {
441                                 appSet.add(app);
442                                 appsList.add(app);
443                         }
444
445                         for (EPApp app : openApps) {
446                                 if (!appSet.contains(app))
447                                         appsList.add(app);
448                         }
449
450                         return appsList;
451                 }
452         }
453
454         @Override
455         public List<EPApp> getPersAdminApps(EPUser user) {
456                 final Map<String, Long> params = new HashMap<>();
457                 params.put("userId", user.getId());
458                 // Named query is stored in EP.hbm.xml, mapped to EPApp
459                 @SuppressWarnings("unchecked")
460                 List<EPApp> list = dataAccessService.executeNamedQuery("getPersAdminApps", params, null);
461                 return list;
462         }
463
464         @Override
465         public List<EPApp> getPersUserApps(EPUser user) {
466                 final Map<String, Long> params = new HashMap<>();
467                 params.put("userId", user.getId());
468                 // Named query is stored in EP.hbm.xml, mapped to EPApp
469                 @SuppressWarnings("unchecked")
470                 List<EPApp> list = dataAccessService.executeNamedQuery("getPersUserApps", params, null);
471                 return list;
472         }
473
474         /*
475          * (non-Javadoc)
476          *
477          * @see
478          * org.openecomp.portalapp.portal.service.EPAppService#getAppCatalog(com.att
479          * .fusionapp.ecomp.portal.domain.EPUser)
480          */
481         @Override
482         public List<AppCatalogItem> getUserAppCatalog(EPUser user) {
483                 final Map<String, Long> params = new HashMap<>();
484                 params.put("userId", user.getId());
485                 // Named query is stored in EP.hbm.xml, mapped to AppCatalogItem
486                 @SuppressWarnings("unchecked")
487                 List<AppCatalogItem> list = dataAccessService.executeNamedQuery("getUserAppCatalog", params, null);
488                 return list;
489         }
490
491         /*
492          * (non-Javadoc)
493          *
494          * @see
495          * org.openecomp.portalapp.portal.service.EPAppService#getAdminAppCatalog(
496          * org.openecomp.portalapp.portal.domain.EPUser)
497          */
498         @Override
499         public List<AppCatalogItem> getAdminAppCatalog(EPUser user) {
500                 final Map<String, Long> params = new HashMap<>();
501                 params.put("userId", user.getId());
502                 // Named query is stored in EP.hbm.xml, mapped to AppCatalogItem
503                 @SuppressWarnings("unchecked")
504                 List<AppCatalogItem> list = dataAccessService.executeNamedQuery("getAdminAppCatalog", params, null);
505                 return list;
506         }
507
508         private List<EPApp> getOpenApps() {
509                 @SuppressWarnings("unchecked")
510                 List<EPApp> openApps = dataAccessService.getList(EPApp.class, " where open='Y' and enabled='Y'", null, null);
511                 return openApps;
512         }
513
514         @SuppressWarnings("unchecked")
515         @Override
516         public List<EPApp> getAppsOrderByName(EPUser user) {
517                 final Map<String, Long> params = new HashMap<>();
518                 List<EPApp> sortedAppsByName = null;
519                 try {
520                         if (adminRolesService.isSuperAdmin(user)) {
521                                 params.put("userId", user.getId());
522                                 sortedAppsByName = dataAccessService.executeNamedQuery("getPersAdminAppsOrderByName", params, null);
523                         } else {
524                                 params.put("userId", user.getId());
525                                 sortedAppsByName = dataAccessService.executeNamedQuery("getPersUserAppsOrderByName", params, null);
526                         }
527                 } catch (Exception e) {
528                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByName failed", e);
529                 }
530                 return sortedAppsByName;
531         }
532
533         @SuppressWarnings("unchecked")
534         @Override
535         public List<EPApp> getAppsOrderByLastUsed(EPUser user) {
536
537                 final Map<String, Long> params = new HashMap<>();
538                 List<EPApp> sortedAppsByLastUsed = new ArrayList<EPApp>();
539                 List<EPApp> finalsortedAppsByLastUsed = new ArrayList<EPApp>();
540                 try {
541                         if (adminRolesService.isSuperAdmin(user)) {
542                                 params.put("userId", user.getId());
543                                 sortedAppsByLastUsed = dataAccessService.executeNamedQuery("getAdminAppsOrderByLastUsed", params, null);
544                         } else {
545                                 params.put("userId", user.getId());
546                                 sortedAppsByLastUsed = dataAccessService.executeNamedQuery("getUserAppsOrderByLastUsed", params, null);
547                         }
548                         Set<String> epAppSet = new HashSet<String>();
549                         for (EPApp eapp : sortedAppsByLastUsed)
550                                 if (!epAppSet.contains(eapp.getName())) {
551                                         finalsortedAppsByLastUsed.add(eapp);
552                                         epAppSet.add(eapp.getName());
553                                 }
554
555                 } catch (Exception e) {
556                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByLastUsed failed", e);
557                 }
558                 return finalsortedAppsByLastUsed;
559         }
560
561         @SuppressWarnings("unchecked")
562         @Override
563         public List<EPApp> getAppsOrderByMostUsed(EPUser user) {
564                 final Map<String, Long> params = new HashMap<>();
565                 List<EPApp> sortedAppsByMostUsed = new ArrayList<EPApp>();
566                 List<EPApp> finalsortedAppsByMostUsed = new ArrayList<EPApp>();
567                 try {
568                         if (adminRolesService.isSuperAdmin(user)) {
569                                 params.put("userId", user.getId());
570                                 sortedAppsByMostUsed = dataAccessService.executeNamedQuery("getAdminAppsOrderByMostUsed", params, null);
571                         } else {
572                                 params.put("userId", user.getId());
573                                 sortedAppsByMostUsed = dataAccessService.executeNamedQuery("getUserAppsOrderByMostUsed", params, null);
574                         }
575                         Set<String> epAppSet = new HashSet<String>();
576
577                         for (EPApp eapp : sortedAppsByMostUsed) {
578                                 if (!epAppSet.contains(eapp.getName())) {
579                                         finalsortedAppsByMostUsed.add(eapp);
580                                         epAppSet.add(eapp.getName());
581                                 }
582                         }
583                 } catch (Exception e) {
584                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByMostUsed failed", e);
585                 }
586
587                 return finalsortedAppsByMostUsed;
588         }
589
590         /*
591          * This Method retrieves the User Apps by Sort Manual Preference
592          *
593          * @param: user--contains LoggedIn User Data
594          */
595         @SuppressWarnings("unchecked")
596         @Override
597         public List<EPApp> getAppsOrderByManual(EPUser user) {
598                 final Map<String, Long> params = new HashMap<>();
599                 List<EPApp> sortedAppsByManual = new ArrayList<EPApp>();
600                 List<EPApp> finalsortedAppsByManual = new ArrayList<EPApp>();
601                 try {
602                         if (adminRolesService.isSuperAdmin(user)) {
603                                 params.put("userId", user.getId());
604                                 sortedAppsByManual = dataAccessService.executeNamedQuery("getAdminAppsOrderByManual", params, null);
605                         } else {
606                                 params.put("userId", user.getId());
607                                 sortedAppsByManual = dataAccessService.executeNamedQuery("getUserAppsOrderByManual", params, null);
608                         }
609                         Set<String> epAppSet = new HashSet<String>();
610
611                         for (EPApp eapp : sortedAppsByManual) {
612                                 if (!epAppSet.contains(eapp.getName())) {
613                                         finalsortedAppsByManual.add(eapp);
614                                         epAppSet.add(eapp.getName());
615                                 }
616                         }
617                 } catch (Exception e) {
618                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByManual failed", e);
619                 }
620                 return finalsortedAppsByManual;
621         }
622
623         @Override
624         public List<OnboardingApp> getOnboardingApps() {
625                 @SuppressWarnings("unchecked")
626                 List<EPApp> apps = dataAccessService.getList(EPApp.class, " where id!=" + ECOMP_APP_ID, null, null);
627                 List<OnboardingApp> onboardingAppsList = new ArrayList<OnboardingApp>();
628                 for (EPApp app : apps) {
629                         OnboardingApp onboardingApp = new OnboardingApp();
630                         createOnboardingFromApp(app, onboardingApp);
631                         onboardingAppsList.add(onboardingApp);
632                 }
633                 return onboardingAppsList;
634         }
635
636         @Override
637         public List<OnboardingApp> getEnabledNonOpenOnboardingApps() {
638                 @SuppressWarnings("unchecked")
639                 List<EPApp> apps = dataAccessService.getList(EPApp.class,
640                                 " where enabled = true and open = false and id!=" + ECOMP_APP_ID, null, null);
641                 List<OnboardingApp> onboardingAppsList = new ArrayList<OnboardingApp>();
642                 for (EPApp app : apps) {
643                         OnboardingApp onboardingApp = new OnboardingApp();
644                         createOnboardingFromApp(app, onboardingApp);
645                         onboardingAppsList.add(onboardingApp);
646                 }
647                 return onboardingAppsList;
648         }
649
650         @SuppressWarnings("unchecked")
651         private void validateOnboardingApp(OnboardingApp onboardingApp, FieldsValidator fieldsValidator) {
652                 boolean duplicatedUrl = false;
653                 boolean duplicatedName = false;
654                 List<EPApp> apps;
655                 if (onboardingApp.id == null) {
656                         apps = dataAccessService.getList(EPApp.class,
657                                         " where url = '" + onboardingApp.url + "' or name = '" + onboardingApp.name + "'", null, null);
658                 } else {
659                         apps = dataAccessService.getList(EPApp.class, " where id = " + onboardingApp.id + " or url = '"
660                                         + onboardingApp.url + "' or name = '" + onboardingApp.name + "'", null, null);
661                 }
662                 for (EPApp app : apps) {
663                         if (onboardingApp.id != null && onboardingApp.id.equals(app.getId())) {
664                                 continue;
665                         }
666                         if (!duplicatedUrl && app.getUrl().equalsIgnoreCase(onboardingApp.url)) {
667                                 duplicatedUrl = true;
668                                 if (duplicatedName) {
669                                         break;
670                                 }
671                         }
672                         if (!duplicatedName && app.getName().equalsIgnoreCase(onboardingApp.name)) {
673                                 duplicatedName = true;
674                                 if (duplicatedUrl) {
675                                         break;
676                                 }
677                         }
678                 }
679                 if (duplicatedUrl || duplicatedName) {
680                         if (duplicatedUrl) {
681                                 fieldsValidator.addProblematicFieldName(urlField);
682                         }
683                         if (duplicatedName) {
684                                 fieldsValidator.addProblematicFieldName(nameField);
685                         }
686                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
687                         fieldsValidator.errorCode = new Long(EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR);
688                 }
689         }
690
691         @Override
692         public FieldsValidator modifyOnboardingApp(OnboardingApp modifiedOnboardingApp, EPUser user) {
693                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: entering modifyOnboardingApp");
694                 FieldsValidator fieldsValidator = onboardingAppFieldsChecker(modifiedOnboardingApp);
695                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
696                         validateOnboardingApp(modifiedOnboardingApp, fieldsValidator);
697                 }
698                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
699                         if (modifiedOnboardingApp.id != null) {
700                                 updateApp(modifiedOnboardingApp.id, modifiedOnboardingApp, fieldsValidator, user);
701                         } else {
702                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
703                         }
704                 }
705                 return fieldsValidator;
706         }
707
708         @Override
709         public FieldsValidator addOnboardingApp(OnboardingApp newOnboardingApp, EPUser user) {
710                 FieldsValidator fieldsValidator = onboardingAppFieldsChecker(newOnboardingApp);
711                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
712                         validateOnboardingApp(newOnboardingApp, fieldsValidator);
713                 }
714                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
715                         if (newOnboardingApp.id == null) {
716                                 updateApp(null, newOnboardingApp, fieldsValidator, user);
717                         } else {
718                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
719                         }
720                 }
721                 return fieldsValidator;
722         }
723
724         @Override
725         public FieldsValidator deleteOnboardingApp(EPUser user, Long appid) {
726                 FieldsValidator fieldsValidator = new FieldsValidator();
727                 if (!adminRolesService.isSuperAdmin(user)) {
728                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);
729                         return fieldsValidator;
730                 }
731                 Boolean result = false;
732                 Session localSession = null;
733                 Transaction transaction = null;
734                 try {
735                         localSession = sessionFactory.openSession();
736                         transaction = localSession.beginTransaction();
737
738                         // 1) Remove the URL for any functional menu item associated with
739                         // this app
740                         String sql = "UPDATE fn_menu_functional m, fn_menu_functional_roles mr SET m.url='' "
741                                         + " WHERE m.menu_id=mr.menu_id " + " AND mr.app_id='" + appid + "'";
742                         logQuery(sql);
743                         Query query = localSession.createSQLQuery(sql);
744                         query.executeUpdate();
745
746                         // Remove any favorites associated with a menu item that is
747                         // associated with this app
748                         sql = "Delete from fn_menu_favorites " + " using fn_menu_favorites inner join fn_menu_functional_roles "
749                                         + " where fn_menu_functional_roles.app_id='" + appid + "' "
750                                         + " AND fn_menu_functional_roles.menu_id=fn_menu_favorites.menu_id";
751                         logQuery(sql);
752                         query = localSession.createSQLQuery(sql);
753                         query.executeUpdate();
754
755                         // Remove all role, appid records from fn_menu_functional_role
756                         // that are associated with this app
757                         sql = "delete from fn_menu_functional_roles where app_id='" + appid + "'";
758                         logQuery(sql);
759                         query = localSession.createSQLQuery(sql);
760                         query.executeUpdate();
761
762                         // Remove all records from fn_user_role associated with this app
763                         sql = "delete from fn_user_role where app_id='" + appid + "'";
764                         logQuery(sql);
765                         query = localSession.createSQLQuery(sql);
766                         query.executeUpdate();
767
768                         // Remove any widgets associated with this app
769                         sql = "delete from ep_widget_catalog_role where app_id='" + appid + "'";
770                         logQuery(sql);
771                         query = localSession.createSQLQuery(sql);
772                         query.executeUpdate();
773
774                         // Remove any roles associated with this app
775                         sql = "delete from ep_role_notification " + " using ep_role_notification inner join fn_role "
776                                         + " where fn_role.app_id='" + appid + "' " + " and ep_role_notification.role_id= fn_role.role_id";
777                         logQuery(sql);
778                         query = localSession.createSQLQuery(sql);
779                         query.executeUpdate();
780
781                         // Remove all records from fn_role associated with this app
782                         sql = "delete from fn_role where app_id='" + appid + "'";
783                         logQuery(sql);
784                         query = localSession.createSQLQuery(sql);
785                         query.executeUpdate();
786
787                         // Remove app contact us entries
788                         sql = "delete from fn_app_contact_us where app_id='" + appid + "'";
789                         logQuery(sql);
790                         query = localSession.createSQLQuery(sql);
791                         query.executeUpdate();
792
793                         // Remove rows in the app personalization selection table
794                         sql = "delete from fn_pers_user_app_sel where app_id='" + appid + "'";
795                         logQuery(sql);
796                         query = localSession.createSQLQuery(sql);
797                         query.executeUpdate();
798
799                         // Remove rows in the app personalization sort table
800                         sql = "delete from ep_pers_user_app_man_sort where app_id='" + appid + "'";
801                         logQuery(sql);
802                         query = localSession.createSQLQuery(sql);
803                         query.executeUpdate();
804
805                         // Remove rows in the app personalization sort table
806                         sql = "delete from ep_user_roles_request where app_id='" + appid + "'";
807                         logQuery(sql);
808                         query = localSession.createSQLQuery(sql);
809                         query.executeUpdate();
810
811                         // Remove rows in the app personalization sort table
812                         sql = "delete from ep_web_analytics_source where app_id='" + appid + "'";
813                         logQuery(sql);
814                         query = localSession.createSQLQuery(sql);
815                         query.executeUpdate();
816
817                         // Delete the app
818                         sql = "delete from fn_app where app_id='" + appid + "'";
819                         logQuery(sql);
820                         query = localSession.createSQLQuery(sql);
821                         query.executeUpdate();
822
823                         transaction.commit();
824                         result = true;
825                 } catch (Exception e) {
826                         logger.error(EELFLoggerDelegate.errorLogger, "deleteOnboardingApp failed", e);
827                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError);
828                         EcompPortalUtils.rollbackTransaction(transaction, "deleteOnboardingApp rollback, exception = " + e);
829                 } finally {
830                         EcompPortalUtils.closeLocalSession(localSession, "deleteOnboardingApp");
831                 }
832                 if (!result) {
833                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
834                 }
835                 return fieldsValidator;
836         }
837
838         private static Object syncRests = new Object();
839
840         // An app has been enabled/disabled. Must enable/disable all associated
841         // functional menu items.
842         protected void setFunctionalMenuItemsEnabled(Session localSession, Boolean enabled, Long appId) {
843                 String active_yn = enabled ? "Y" : "N";
844                 String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn "
845                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
846                                 + " AND r.app_id = '" + appId + "' ";
847                 logQuery(sql);
848                 @SuppressWarnings("unchecked")
849                 List<FunctionalMenuItem> menuItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
850                 for (FunctionalMenuItem menuItem : menuItems) {
851                         FunctionalMenuItem myMenuItem = (FunctionalMenuItem) localSession.get(FunctionalMenuItem.class,
852                                         menuItem.menuId);
853                         myMenuItem.active_yn = active_yn;
854                         localSession.save(myMenuItem);
855                 }
856         }
857
858         // Attention! If (appId == null) we use this function to create application
859         // otherwise we use it to modify existing application
860         protected void updateApp(Long appId, OnboardingApp onboardingApp, FieldsValidator fieldsValidator, EPUser user) {
861                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: entering updateApp");
862                 // Separate out the code for a restricted app, since it doesn't need any
863                 // of the UEB code.
864                 if (onboardingApp.restrictedApp) {
865                         boolean result = false;
866                         Session localSession = null;
867                         Transaction transaction = null;
868                         try {
869                                 localSession = sessionFactory.openSession();
870                                 transaction = localSession.beginTransaction();
871                                 EPApp app;
872                                 if (appId == null) {
873                                         app = new EPApp();
874                                 } else {
875                                         app = (EPApp) localSession.get(EPApp.class, appId);
876                                         if (app == null || app.getId() == null) { // App is already
877                                                 // deleted!
878                                                 transaction.commit();
879                                                 localSession.close();
880                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);
881                                                 return;
882                                         }
883                                 }
884                                 createAppFromOnboarding(app, onboardingApp, localSession);
885                                 localSession.saveOrUpdate(app);
886                                 // Enable or disable all menu items associated with this app
887                                 setFunctionalMenuItemsEnabled(localSession, onboardingApp.isEnabled, appId);
888                                 transaction.commit();
889                                 result = true;
890                         } catch (Exception e) {
891                                 EcompPortalUtils.rollbackTransaction(transaction,
892                                                 "updateApp rollback, exception = " + EcompPortalUtils.getStackTrace(e));
893                         } finally {
894                                 EcompPortalUtils.closeLocalSession(localSession, "updateApp");
895                         }
896                         if (!result) {
897                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
898                         }
899
900                 } else {
901                         updateRestrictedApp(appId, onboardingApp, fieldsValidator, user);
902                         
903                 }
904         }
905
906         protected void updateRestrictedApp(Long appId, OnboardingApp onboardingApp, FieldsValidator fieldsValidator,
907                         EPUser user) {
908                 synchronized (syncRests) {
909                         boolean result = false;
910                         Session localSession = null;
911                         Transaction transaction = null;
912                         try {
913                                 localSession = sessionFactory.openSession();
914                                 transaction = localSession.beginTransaction();
915                                 EPApp app;
916                                 if (appId == null) {
917                                         app = new EPApp();
918                                         // -------------------------------------------------------------------------------------------
919                                         // Register this App with the UEB communication server.
920                                         // Save
921                                         // the App's unique mailbox/topic
922                                         // name and keys to the FN_APP table. The App's mailbox
923                                         // and
924                                         // keys will be visible to the
925                                         // admin on the ECOMP portal.
926                                         // -------------------------------------------------------------------------------------------
927                                         TopicManager topicManager = new TopicManager() {
928
929                                                 EPAppCommonServiceImpl service;
930
931                                                 public void init(EPAppCommonServiceImpl _service) {
932                                                         service = _service;
933                                                 }
934
935                                                 public void createTopic(String key, String secret, String topicName,
936                                                                 String topicDescription) throws HttpException, CambriaApiException, IOException {
937
938                                                         init(EPAppCommonServiceImpl.this);
939                                                         final LinkedList<String> urlList = Helper.uebUrlList();
940                                                         if (logger.isInfoEnabled()) {
941                                                                 logger.info("==> createTopic");
942                                                                 logger.info("topicName: " + topicName);
943                                                                 logger.info("topicDescription: " + topicDescription);
944                                                         }
945                                                         CambriaTopicManager tm = null;
946                                                         try {
947                                                                 tm = service.getTopicManager(urlList, key, secret);
948                                                         } catch (Exception e) {
949                                                                 logger.error("pub.build Exception ", e);
950                                                                 throw new CambriaApiException(topicName);
951                                                         }
952                                                         tm.createTopic(topicName, topicDescription, 1, 1);
953                                                 }
954
955                                                 public void addPublisher(String topicOwnerKey, String topicOwnerSecret, String publisherKey,
956                                                                 String topicName) throws HttpException, CambriaApiException, IOException {
957                                                         logger.info("==> addPublisher to topic " + topicName);
958                                                         final LinkedList<String> urlList = Helper.uebUrlList();
959                                                         CambriaTopicManager tm = null;
960                                                         try {
961                                                                 tm = service.getTopicManager(urlList, topicOwnerKey, topicOwnerSecret);
962                                                         } catch (Exception e) {
963                                                                 logger.error("pub.build Exception ", e);
964                                                                 throw new CambriaApiException(topicName);
965                                                         }
966                                                         tm.allowProducer(topicName, publisherKey);
967                                                 }
968
969                                         };
970                                         final CambriaIdentityManager im = new CambriaClientBuilders.IdentityManagerBuilder()
971                                                         .usingHosts(Helper.uebUrlList()).build();
972                                         com.att.nsa.apiClient.credentials.ApiCredential credential = im.createApiKey(user.getEmail(),
973                                                         "ECOMP Portal Owner");
974                                         String appKey = credential.getApiKey();
975                                         String appSecret = credential.getApiSecret();
976                                         String appMailboxName = null;
977
978                                         int maxNumAttemptsToCreateATopic = 3;
979                                         boolean successfullyCreatedMailbox = false;
980                                         for (int i = 0; i < maxNumAttemptsToCreateATopic; i++) {
981                                                 appMailboxName = "ECOMP-PORTAL-OUTBOX-" + (int) (Math.random() * 100000.0);
982
983                                                 try {
984                                                         topicManager.createTopic(
985                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
986                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET),
987                                                                         appMailboxName, "ECOMP outbox for app" + onboardingApp.name);
988                                                         successfullyCreatedMailbox = true;
989                                                         logger.debug(EELFLoggerDelegate.debugLogger,
990                                                                         "Successfully created " + appMailboxName + " for App " + onboardingApp.name);
991                                                         logger.debug(EELFLoggerDelegate.debugLogger, "    Key = " + appKey + " Secret = "
992                                                                         + appSecret + " generated using = " + user.getEmail());
993                                                         break;
994                                                 } catch (HttpException e) {
995                                                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebConnectionError, e);
996                                                         if (e.getStatusCode() == 409) {
997                                                                 logger.error(EELFLoggerDelegate.errorLogger, "Topic/mailbox " + appMailboxName
998                                                                                 + " already exists. Will try using a different name", e);
999                                                         } else {
1000                                                                 logger.error(EELFLoggerDelegate.errorLogger, "HttpException when onboarding App: ",
1001                                                                                 e);
1002                                                         }
1003                                                 }
1004                                         }
1005
1006                                         if (successfullyCreatedMailbox) {
1007                                                 onboardingApp.setUebTopicName(appMailboxName);
1008                                                 onboardingApp.setUebKey(appKey);
1009                                                 onboardingApp.setUebSecret(appSecret);
1010
1011                                                 try {
1012                                                         /*
1013                                                          * EP is a publisher to this App's new mailbox
1014                                                          */
1015                                                         topicManager.addPublisher(
1016                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
1017                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET),
1018                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
1019                                                                         appMailboxName);
1020
1021                                                         /*
1022                                                          * This App is a subscriber of its own mailbox
1023                                                          */
1024                                                         topicManager.addSubscriber(
1025                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
1026                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET), appKey,
1027                                                                         appMailboxName);
1028
1029                                                         /*
1030                                                          * This App is a publisher to EP
1031                                                          */
1032                                                         topicManager.addPublisher(
1033                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
1034                                                                         PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET), appKey,
1035                                                                         PortalApiProperties.getProperty(PortalApiConstants.ECOMP_PORTAL_INBOX_NAME));
1036                                                 } catch (HttpException | CambriaApiException | IOException e) {
1037                                                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebRegisterOnboardingAppError, e);
1038                                                         logger.error(EELFLoggerDelegate.errorLogger,
1039                                                                         "Error when configuring Publisher/Subscriber for App's new mailbox", e);
1040                                                         transaction.commit();
1041                                                         localSession.close();
1042                                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
1043                                                         return;
1044                                                 }
1045                                         } else {
1046                                                 transaction.commit();
1047                                                 localSession.close();
1048                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
1049                                                 return;
1050                                         }
1051                                 } else {
1052                                         app = (EPApp) localSession.get(EPApp.class, appId);
1053                                         if (app == null || app.getId() == null) {
1054                                                 // App is already deleted!
1055                                                 transaction.commit();
1056                                                 localSession.close();
1057                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);
1058                                                 return;
1059                                         }
1060                                 }
1061                                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: about to call createAppFromOnboarding");
1062                                 createAppFromOnboarding(app, onboardingApp, localSession);
1063                                 logger.debug(EELFLoggerDelegate.debugLogger,
1064                                                 "LR: updateApp: finished calling createAppFromOnboarding");
1065                                 localSession.saveOrUpdate(app);
1066                                 logger.debug(EELFLoggerDelegate.debugLogger,
1067                                                 "LR: updateApp: finished calling localSession.saveOrUpdate");
1068                                 // Enable or disable all menu items associated with this app
1069                                 setFunctionalMenuItemsEnabled(localSession, onboardingApp.isEnabled, appId);
1070                                 logger.debug(EELFLoggerDelegate.debugLogger,
1071                                                 "LR: updateApp: finished calling setFunctionalMenuItemsEnabled");
1072                                 transaction.commit();
1073                                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: updateApp: finished calling transaction.commit");
1074                                 epUebHelper.addPublisher(app);
1075                                 logger.debug(EELFLoggerDelegate.debugLogger,
1076                                                 "LR: updateApp: finished calling epUebHelper.addPublisher");
1077                                 result = true;
1078                         } catch (Exception e) {
1079                                 logger.error(EELFLoggerDelegate.errorLogger, "updateApp failed", e);
1080                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebRegisterOnboardingAppError, e);
1081                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
1082                                 EcompPortalUtils.rollbackTransaction(transaction,
1083                                                 "updateApp rollback, exception = " + EcompPortalUtils.getStackTrace(e));
1084                         } finally {
1085                                 EcompPortalUtils.closeLocalSession(localSession, "updateApp");
1086                         }
1087                         if (!result) {
1088                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1089                         }
1090                 }
1091
1092         }
1093
1094         public CambriaTopicManager getTopicManager(LinkedList<String> urlList, String key, String secret)
1095                         throws GeneralSecurityException, Exception {
1096                 throw new Exception("This method can only be invoked from child class");
1097         }
1098
1099         /**
1100          * Populates a transport model of the application from a database row model.
1101          * Leaves out the thumbnail because the FE fetches images via a different
1102          * API.
1103          * 
1104          * @param app
1105          *            Model of database row
1106          * @param onboardingApp
1107          *            Model for transport as JSON
1108          */
1109         @Override
1110         public void createOnboardingFromApp(EPApp app, OnboardingApp onboardingApp) {
1111                 onboardingApp.id = app.getId();
1112                 onboardingApp.name = app.getName();
1113                 onboardingApp.imageUrl = app.getImageUrl();
1114                 onboardingApp.description = app.getDescription();
1115                 onboardingApp.notes = app.getNotes();
1116                 onboardingApp.url = app.getUrl();
1117                 onboardingApp.alternateUrl = app.getAlternateUrl();
1118                 onboardingApp.restUrl = app.getAppRestEndpoint();
1119                 onboardingApp.isOpen = app.getOpen();
1120                 onboardingApp.isEnabled = app.getEnabled();
1121                 onboardingApp.username = app.getUsername();
1122                 onboardingApp.appPassword = decryptedPassword(app.getAppPassword(), app);
1123                 onboardingApp.uebTopicName = app.getUebTopicName();
1124                 onboardingApp.uebKey = app.getUebKey();
1125                 onboardingApp.uebSecret = app.getUebSecret();
1126                 onboardingApp.setRestrictedApp(app.isRestrictedApp());
1127                 // if (app.getThumbnail() != null)
1128                 // onboardingApp.thumbnail = new
1129                 // String(Base64.getEncoder().encode(app.getThumbnail()));
1130         }
1131
1132         /**
1133          * Creates a database object for an application from an uploaded transport
1134          * model. Must decode the thumbnail, if any.
1135          * 
1136          * @param app
1137          * @param onboardingApp
1138          * @param localSession
1139          * @return The first argument.
1140          */
1141         protected EPApp createAppFromOnboarding(EPApp app, OnboardingApp onboardingApp, Session localSession) {
1142                 app.setName(onboardingApp.name);
1143                 app.setDescription(onboardingApp.description);
1144                 app.setNotes(onboardingApp.notes);
1145                 app.setUrl(onboardingApp.url);
1146                 app.setAlternateUrl(onboardingApp.alternateUrl);
1147                 app.setAppRestEndpoint(onboardingApp.restUrl);
1148                 app.setOpen(onboardingApp.isOpen);
1149                 app.setEnabled(onboardingApp.isEnabled);
1150                 app.setUsername(onboardingApp.username);
1151                 app.setAppPassword(this.encryptedPassword(onboardingApp.appPassword, app));
1152                 app.setUebTopicName(onboardingApp.uebTopicName);
1153                 app.setUebKey(onboardingApp.uebKey);
1154                 app.setUebSecret(onboardingApp.uebSecret);
1155                 app.setRestrictedApp(onboardingApp.restrictedApp);
1156                 if (!StringUtils.isEmpty(onboardingApp.thumbnail)) {
1157                         logger.debug(EELFLoggerDelegate.debugLogger, "createAppFromOnboarding: onboarding thumbnail is NOT empty");
1158                         String[] splitBase64Thumbnail = onboardingApp.thumbnail.split("base64,");
1159                         logger.debug(EELFLoggerDelegate.debugLogger,
1160                                         "createAppFromOnboarding: length of splitBase64Thumbnail: " + splitBase64Thumbnail.length);
1161                         if (splitBase64Thumbnail.length > 1) {
1162                                 // This occurs when we have a new image, not an existing image
1163                                 byte[] decodedImage = Base64.getDecoder().decode(splitBase64Thumbnail[1].getBytes());
1164                                 logger.debug(EELFLoggerDelegate.debugLogger, "createAppFromOnboarding: finished calling decode");
1165                                 // This is basically a boolean indicator that an image is
1166                                 // present.
1167                                 app.setImageUrl(constructImageName(onboardingApp));
1168                                 app.setThumbnail(decodedImage);
1169                         }
1170                 } else if (app.getThumbnail() != null && onboardingApp.imageLink == null) {
1171                         // The thumbnail that came in from the json is empty; the previous
1172                         // thumbnail is NOT empty. Must delete it.
1173                         logger.debug(EELFLoggerDelegate.debugLogger,
1174                                         "createAppFromOnboarding: onboarding thumbnail is empty; db thumbnail is NOT null");
1175                         app.setImageUrl(null);
1176                         app.setThumbnail(null);
1177                 } else {
1178                         logger.debug(EELFLoggerDelegate.debugLogger,
1179                                         "createAppFromOnboarding: making no changes to thumbnail as imageLink is not null");
1180                 }
1181                 return app;
1182         }
1183
1184         protected String constructImageName(OnboardingApp onboardingApp) {
1185                 return "portal_" + String.valueOf(onboardingApp.url.hashCode() + "_" + (int) (Math.random() * 100000.0))
1186                                 + ".png";
1187         }
1188
1189         // Don't encrypt or decrypt the password if it is null or the empty string
1190         private String decryptedPassword(String encryptedAppPwd, EPApp app) {
1191                 String result = "";
1192                 if (encryptedAppPwd != null & encryptedAppPwd.length() > 0) {
1193                         try {
1194                                 result = CipherUtil.decrypt(encryptedAppPwd,
1195                                                 SystemProperties.getProperty(SystemProperties.Decryption_Key));
1196                         } catch (Exception e) {
1197                                 logger.error(EELFLoggerDelegate.errorLogger, "decryptedPassword failed for app " + app.getName(), e);
1198                         }
1199                 }
1200                 return result;
1201         }
1202
1203         protected String encryptedPassword(String decryptedAppPwd, EPApp app) {
1204                 String result = "";
1205                 if (decryptedAppPwd != null & decryptedAppPwd.length() > 0) {
1206                         try {
1207                                 result = CipherUtil.encrypt(decryptedAppPwd,
1208                                                 SystemProperties.getProperty(SystemProperties.Decryption_Key));
1209                         } catch (Exception e) {
1210                                 logger.error(EELFLoggerDelegate.errorLogger, "encryptedPassword failed for app " + app.getName(), e);
1211                         }
1212                 }
1213                 return result;
1214         }
1215
1216         @SuppressWarnings("unchecked")
1217         @Override
1218         public FieldsValidator saveWidgetsSortManual(List<EPWidgetsSortPreference> widgetsSortManual, EPUser user) {
1219                 FieldsValidator fieldsValidator = new FieldsValidator();
1220                 final Map<String, Long> params = new HashMap<>();
1221                 List<EPWidgetsManualSortPreference> epManualWidgets = new ArrayList<EPWidgetsManualSortPreference>();
1222
1223                 try {
1224                         params.put("userId", user.getId());
1225                         epManualWidgets = dataAccessService.executeNamedQuery("userWidgetManualSortPrfQuery", params, null);
1226                         Map<Long, EPWidgetsManualSortPreference> existingWidgetsIds = new HashMap<Long, EPWidgetsManualSortPreference>();
1227                         for (EPWidgetsManualSortPreference userWidgetManualPref : epManualWidgets) {
1228                                 existingWidgetsIds.put(userWidgetManualPref.getWidgetId(), userWidgetManualPref);
1229                         }
1230                         for (EPWidgetsSortPreference epWidgetsManPref : widgetsSortManual) {
1231                                 if (epWidgetsManPref.getWidgetid() != null) {
1232                                         Long widgetid = epWidgetsManPref.getWidgetid();
1233                                         if (existingWidgetsIds.containsKey(widgetid)) {
1234                                                 EPWidgetsManualSortPreference epWidgetsManualSort = existingWidgetsIds.get(widgetid);
1235                                                 epWidgetsManualSort.setWidgetRow(epWidgetsManPref.getRow());
1236                                                 epWidgetsManualSort.setWidgetCol(epWidgetsManPref.getCol());
1237                                                 epWidgetsManualSort.setWidgetWidth(epWidgetsManPref.getSizeX());
1238                                                 epWidgetsManualSort.setWidgetHeight(epWidgetsManPref.getSizeY());
1239                                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
1240                                                 additionalUpdateParam.put("userId", epWidgetsManualSort.getUserId());
1241                                                 dataAccessService.saveDomainObject(epWidgetsManualSort, additionalUpdateParam);
1242                                         } else {
1243                                                 EPWidgetsManualSortPreference epWidgetsManualSort = new EPWidgetsManualSortPreference();
1244                                                 epWidgetsManualSort.setWidgetId(epWidgetsManPref.getWidgetid());
1245                                                 epWidgetsManualSort.setWidgetRow(epWidgetsManPref.getRow());
1246                                                 epWidgetsManualSort.setWidgetCol(epWidgetsManPref.getCol());
1247                                                 epWidgetsManualSort.setWidgetWidth(epWidgetsManPref.getSizeX());
1248                                                 epWidgetsManualSort.setWidgetHeight(epWidgetsManPref.getSizeY());
1249                                                 epWidgetsManualSort.setUserId(Ints.checkedCast(user.getId()));
1250                                                 dataAccessService.saveDomainObject(epWidgetsManualSort, null);
1251                                         }
1252                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1253                                 }
1254                         }
1255                 } catch (Exception e) {
1256                         logger.error(EELFLoggerDelegate.errorLogger, "saveWidgetsSortManual failed", e);
1257                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1258                 }
1259                 return fieldsValidator;
1260         }
1261
1262         @SuppressWarnings("unchecked")
1263         @Override
1264         public FieldsValidator deleteUserWidgetSortPref(List<EPWidgetsSortPreference> delWidgetSortPref, EPUser user) {
1265                 FieldsValidator fieldsValidator = new FieldsValidator();
1266                 final Map<String, Long> params = new HashMap<>();
1267                 List<EPWidgetsManualSortPreference> epWidgets = new ArrayList<EPWidgetsManualSortPreference>();
1268                 try {
1269                         params.put("userId", user.getId());
1270                         epWidgets = dataAccessService.executeNamedQuery("userWidgetManualSortPrfQuery", params, null);
1271                         Map<Long, EPWidgetsManualSortPreference> existingWidgetIds = new HashMap<Long, EPWidgetsManualSortPreference>();
1272                         for (EPWidgetsManualSortPreference userWidgetSortPref : epWidgets) {
1273                                 existingWidgetIds.put(userWidgetSortPref.getWidgetId(), userWidgetSortPref);
1274                         }
1275                         for (EPWidgetsSortPreference delEpWidgetsManPref : delWidgetSortPref) {
1276                                 if (delEpWidgetsManPref.getWidgetid() != null) {
1277                                         Long widgetId = delEpWidgetsManPref.getWidgetid();
1278                                         if (existingWidgetIds.containsKey(widgetId)) {
1279                                                 dataAccessService.deleteDomainObjects(EPWidgetsManualSortPreference.class,
1280                                                                 "widget_id=" + widgetId + " AND user_id=" + user.getId(), null);
1281                                         }
1282                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1283                                 }
1284                         }
1285                 } catch (Exception e) {
1286                         logger.error(EELFLoggerDelegate.errorLogger, "deleteUserWidgetSortPref failed", e);
1287                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1288                 }
1289                 return fieldsValidator;
1290         }
1291
1292         /*
1293          * This Method Stores the Sort Order of User Apps by Sort Manual Preference
1294          *
1295          * @param: appsSortManual--contains User Apps Data
1296          *
1297          * @param: user--contains LoggedIn User Data
1298          */
1299         @SuppressWarnings("unchecked")
1300         @Override
1301         public FieldsValidator saveAppsSortManual(List<EPAppsManualPreference> appsSortManual, EPUser user) {
1302                 FieldsValidator fieldsValidator = new FieldsValidator();
1303                 final Map<String, Long> params = new HashMap<>();
1304                 List<EPUserAppsManualSortPreference> epManualApps = new ArrayList<EPUserAppsManualSortPreference>();
1305
1306                 try {
1307                         params.put("userId", user.getId());
1308                         epManualApps = dataAccessService.executeNamedQuery("userAppsManualSortPrfQuery", params, null);
1309                         Map<Long, EPUserAppsManualSortPreference> existingAppIds = new HashMap<Long, EPUserAppsManualSortPreference>();
1310                         for (EPUserAppsManualSortPreference userAppManualPref : epManualApps) {
1311                                 existingAppIds.put(userAppManualPref.getAppId(), userAppManualPref);
1312                         }
1313                         for (EPAppsManualPreference epAppsManPref : appsSortManual) {
1314                                 if (epAppsManPref.getAppid() != null) {
1315                                         Long appid = epAppsManPref.getAppid();
1316                                         if (existingAppIds.containsKey(appid)) {
1317                                                 EPUserAppsManualSortPreference epAppsManualSort = existingAppIds.get(appid);
1318                                                 epAppsManualSort
1319                                                                 .setAppManualSortOrder((epAppsManPref.getCol() + (6 * epAppsManPref.getRow())) + 1);
1320                                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
1321                                                 additionalUpdateParam.put("userId", epAppsManualSort.getUserId());
1322                                                 dataAccessService.saveDomainObject(epAppsManualSort, additionalUpdateParam);
1323                                         } else {
1324                                                 EPUserAppsManualSortPreference epAppsManualSort = new EPUserAppsManualSortPreference();
1325                                                 epAppsManualSort.setAppId(epAppsManPref.getAppid());
1326                                                 epAppsManualSort
1327                                                                 .setAppManualSortOrder((epAppsManPref.getCol() + (6 * epAppsManPref.getRow())) + 1);
1328                                                 epAppsManualSort.setUserId(Ints.checkedCast(user.getId()));
1329                                                 dataAccessService.saveDomainObject(epAppsManualSort, null);
1330                                         }
1331                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1332                                 }
1333                         }
1334                 } catch (Exception e) {
1335                         logger.error(EELFLoggerDelegate.errorLogger, "saveAppsSortManual failed", e);
1336                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1337                 }
1338                 return fieldsValidator;
1339         }
1340
1341         /*
1342          * (non-Javadoc)
1343          *
1344          * @see org.openecomp.portalapp.portal.service.EPAppService#
1345          * deleteUserAppSortManual(java.lang.String,
1346          * org.openecomp.portalapp.portal.domain.EPUser)
1347          */
1348         @SuppressWarnings("unchecked")
1349         @Override
1350         public FieldsValidator deleteUserAppSortManual(EPDeleteAppsManualSortPref delAppSortManual, EPUser user) {
1351                 FieldsValidator fieldsValidator = new FieldsValidator();
1352                 final Map<String, Long> params = new HashMap<>();
1353                 List<EPUserAppsManualSortPreference> epManualApps = new ArrayList<EPUserAppsManualSortPreference>();
1354                 try {
1355                         params.put("userId", user.getId());
1356                         epManualApps = dataAccessService.executeNamedQuery("userAppsManualSortPrfQuery", params, null);
1357                         Map<Long, EPUserAppsManualSortPreference> existingAppIds = new HashMap<Long, EPUserAppsManualSortPreference>();
1358                         for (EPUserAppsManualSortPreference userAppPref : epManualApps) {
1359                                 existingAppIds.put(userAppPref.getAppId(), userAppPref);
1360                         }
1361                         if (existingAppIds.containsKey(delAppSortManual.getAppId()) && !delAppSortManual.isSelect()) {
1362                                 dataAccessService.deleteDomainObjects(EPUserAppsManualSortPreference.class,
1363                                                 "app_id=" + delAppSortManual.getAppId() + " AND user_id=" + user.getId(), null);
1364                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1365                         }
1366                 } catch (Exception e) {
1367                         logger.error(EELFLoggerDelegate.errorLogger, "deleteUserAppSortManual failed", e);
1368                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1369                 }
1370                 return fieldsValidator;
1371         }
1372
1373         @SuppressWarnings("unchecked")
1374         @Override
1375         public FieldsValidator saveAppsSortPreference(EPAppsSortPreference appsSortPreference, EPUser user) {
1376                 FieldsValidator fieldsValidator = new FieldsValidator();
1377                 final Map<String, Long> params = new HashMap<>();
1378                 List<EPUserAppsSortPreference> epSortTypes = new ArrayList<EPUserAppsSortPreference>();
1379                 EPUserAppsSortPreference usrSortPr = null;
1380                 try {
1381                         params.put("userId", user.getId());
1382                         epSortTypes = dataAccessService.executeNamedQuery("userAppsSortPreferenceQuery", params, null);
1383                         if (epSortTypes.size() == 0) {
1384                                 usrSortPr = new EPUserAppsSortPreference();
1385                                 usrSortPr.setUserId(Ints.checkedCast(user.getId()));
1386                                 usrSortPr.setSortPref(appsSortPreference.getValue());
1387                                 dataAccessService.saveDomainObject(usrSortPr, null);
1388                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1389                         } else {
1390                                 usrSortPr = epSortTypes.get(0);
1391                                 usrSortPr.setSortPref(appsSortPreference.getValue());
1392                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
1393                                 additionalUpdateParam.put("userId", usrSortPr.getUserId());
1394                                 dataAccessService.saveDomainObject(usrSortPr, additionalUpdateParam);
1395                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
1396                         }
1397                 } catch (Exception e) {
1398                         logger.error(EELFLoggerDelegate.errorLogger, "saveAppsSortPreference failed", e);
1399                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
1400                 }
1401                 return fieldsValidator;
1402         }
1403
1404         @SuppressWarnings("unchecked")
1405         @Override
1406         public String getUserAppsSortTypePreference(EPUser user) {
1407                 final Map<String, Long> params = new HashMap<>();
1408                 List<EPUserAppsSortPreference> userSortPrefs = new ArrayList<EPUserAppsSortPreference>();
1409                 try {
1410                         params.put("userId", user.getId());
1411                         userSortPrefs = dataAccessService.executeNamedQuery("userAppsSortPreferenceQuery", params, null);
1412                         if (userSortPrefs.size() > 0)
1413                                 return userSortPrefs.get(0).getSortPref();
1414                         else
1415                                 return null;
1416                 } catch (Exception e) {
1417                         logger.error(EELFLoggerDelegate.errorLogger, "getUserAppsSortTypePreference failed", e);
1418                 }
1419                 return null;
1420
1421         }
1422
1423         @Override
1424         public List<EPApp> getUserRemoteApps(String id) {
1425                 throw new RuntimeException(" Cannot be called from parent class");
1426         }
1427
1428 }