2  * ================================================================================
\r 
   4  * ================================================================================
\r 
   5  * Copyright (C) 2017 AT&T Intellectual Property
\r 
   6  * ================================================================================
\r 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
\r 
   8  * you may not use this file except in compliance with the License.
\r 
   9  * You may obtain a copy of the License at
\r 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
\r 
  13  * Unless required by applicable law or agreed to in writing, software
\r 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
\r 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r 
  16  * See the License for the specific language governing permissions and
\r 
  17  * limitations under the License.
\r 
  18  * ================================================================================
\r 
  20 package org.openecomp.portalapp.portal.service;
\r 
  22 import java.io.IOException;
\r 
  23 import java.util.ArrayList;
\r 
  24 import java.util.Base64;
\r 
  25 import java.util.HashMap;
\r 
  26 import java.util.HashSet;
\r 
  27 import java.util.List;
\r 
  28 import java.util.Map;
\r 
  29 import java.util.Set;
\r 
  31 import javax.annotation.PostConstruct;
\r 
  32 import javax.servlet.http.HttpServletResponse;
\r 
  34 import org.apache.commons.lang.StringUtils;
\r 
  35 import org.hibernate.Query;
\r 
  36 import org.hibernate.Session;
\r 
  37 import org.hibernate.SessionFactory;
\r 
  38 import org.hibernate.Transaction;
\r 
  39 import org.openecomp.portalapp.portal.domain.AdminUserApp;
\r 
  40 import org.openecomp.portalapp.portal.domain.AdminUserApplications;
\r 
  41 import org.openecomp.portalapp.portal.domain.AppIdAndNameTransportModel;
\r 
  42 import org.openecomp.portalapp.portal.domain.AppsResponse;
\r 
  43 import org.openecomp.portalapp.portal.domain.EPApp;
\r 
  44 import org.openecomp.portalapp.portal.domain.EPUser;
\r 
  45 import org.openecomp.portalapp.portal.domain.EPUserAppsManualSortPreference;
\r 
  46 import org.openecomp.portalapp.portal.domain.EPUserAppsSortPreference;
\r 
  47 import org.openecomp.portalapp.portal.domain.EPWidgetsManualSortPreference;
\r 
  48 import org.openecomp.portalapp.portal.domain.EcompApp;
\r 
  49 import org.openecomp.portalapp.portal.domain.UserRole;
\r 
  50 import org.openecomp.portalapp.portal.domain.UserRoles;
\r 
  51 import org.openecomp.portalapp.portal.ecomp.model.AppCatalogItem;
\r 
  52 import org.openecomp.portalapp.portal.logging.format.EPAppMessagesEnum;
\r 
  53 import org.openecomp.portalapp.portal.logging.logic.EPLogUtil;
\r 
  54 import org.openecomp.portalapp.portal.transport.EPAppsManualPreference;
\r 
  55 import org.openecomp.portalapp.portal.transport.EPAppsSortPreference;
\r 
  56 import org.openecomp.portalapp.portal.transport.EPDeleteAppsManualSortPref;
\r 
  57 import org.openecomp.portalapp.portal.transport.EPWidgetsSortPreference;
\r 
  58 import org.openecomp.portalapp.portal.transport.FieldsValidator;
\r 
  59 import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
\r 
  60 import org.openecomp.portalapp.portal.transport.LocalRole;
\r 
  61 import org.openecomp.portalapp.portal.transport.OnboardingApp;
\r 
  62 import org.openecomp.portalapp.portal.ueb.EPUebHelper;
\r 
  63 import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
\r 
  64 import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
\r 
  65 import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
\r 
  66 import org.openecomp.portalsdk.core.onboarding.ueb.Helper;
\r 
  67 import org.openecomp.portalsdk.core.onboarding.ueb.TopicManager;
\r 
  68 import org.openecomp.portalsdk.core.onboarding.util.CipherUtil;
\r 
  69 import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants;
\r 
  70 import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties;
\r 
  71 import org.openecomp.portalsdk.core.service.DataAccessService;
\r 
  72 import org.openecomp.portalsdk.core.util.SystemProperties;
\r 
  73 import org.springframework.beans.factory.annotation.Autowired;
\r 
  75 import com.att.nsa.apiClient.http.HttpException;
\r 
  76 import com.att.nsa.cambria.client.CambriaClient.CambriaApiException;
\r 
  77 import com.att.nsa.cambria.client.CambriaClientBuilders;
\r 
  78 import com.att.nsa.cambria.client.CambriaIdentityManager;
\r 
  79 import com.google.common.primitives.Ints;
\r 
  81 public class EPAppCommonServiceImpl implements EPAppService {
\r 
  83         protected String ECOMP_APP_ID = "1";
\r 
  84         protected String SUPER_ADMIN_ROLE_ID = "1";
\r 
  85         protected String ACCOUNT_ADMIN_ROLE_ID = "999";
\r 
  86         protected String RESTRICTED_APP_ROLE_ID = "900";
\r 
  88         private static final String urlField = "url";
\r 
  89         private static final String nameField = "name";
\r 
  91         private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(EPAppCommonServiceImpl.class);
\r 
  94         AdminRolesService adminRolesService;
\r 
  96         private SessionFactory sessionFactory;
\r 
  98         private DataAccessService dataAccessService;
\r 
 100         EPUebHelper epUebHelper;
\r 
 103         private void init() {
\r 
 104                 SUPER_ADMIN_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.SYS_ADMIN_ROLE_ID);
\r 
 105                 ACCOUNT_ADMIN_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.ACCOUNT_ADMIN_ROLE_ID);
\r 
 106                 ECOMP_APP_ID = SystemProperties.getProperty(EPCommonSystemProperties.ECOMP_APP_ID);
\r 
 107                 RESTRICTED_APP_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.RESTRICTED_APP_ROLE_ID);
\r 
 111         public List<EPApp> getUserAsAdminApps(EPUser user) {
\r 
 112                 if (adminRolesService.isAccountAdmin(user)) {
\r 
 113                         String sql = "SELECT * FROM FN_APP join FN_USER_ROLE ON FN_USER_ROLE.APP_ID=FN_APP.APP_ID where "
\r 
 114                                         + "FN_USER_ROLE.USER_ID=" + user.getId() + " AND FN_USER_ROLE.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
\r 
 115                                         + " AND FN_APP.ENABLED = 'Y'";
\r 
 118                                 @SuppressWarnings("unchecked")
\r 
 119                                 List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
\r 
 121                         } catch (Exception e) {
\r 
 122                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 126                         logger.error(EELFLoggerDelegate.errorLogger,
\r 
 127                                         "getUserAsAdminApps: only Account Admin may invoke this function!");
\r 
 128                         return new ArrayList<EPApp>();
\r 
 133         public List<EPApp> getUserByOrgUserIdAsAdminApps(String orgUserId) {
\r 
 134                 String format = "SELECT * FROM FN_APP app INNER JOIN FN_USER_ROLE userrole ON userrole.APP_ID=app.APP_ID "
\r 
 135                                 + "INNER JOIN FN_USER user on user.USER_ID = userrole.USER_ID "
\r 
 136                                 + "WHERE user.org_user_id = '%s' AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
\r 
 137                                 + " AND FN_APP.ENABLED = 'Y'";
\r 
 139                 String sql = String.format(format, orgUserId);
\r 
 143                         @SuppressWarnings("unchecked")
\r 
 144                         List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
\r 
 146                 } catch (Exception e) {
\r 
 147                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 153         public List<EPApp> getAppsFullList() {
\r 
 154                 @SuppressWarnings("unchecked")
\r 
 155                 List<EPApp> apps = dataAccessService.getList(EPApp.class, null);
\r 
 160         public List<EcompApp> getEcompAppAppsFullList() {
\r 
 161                 return transformAppsToEcompApps(getAppsFullList());
\r 
 165         public List<EcompApp> transformAppsToEcompApps(List<EPApp> appsList) {
\r 
 166                 List<EcompApp> ecompAppList = new ArrayList<EcompApp>();
\r 
 167                 for (EPApp app : appsList) {
\r 
 168                         EcompApp ecompApp = new EcompApp();
\r 
 169                         ecompApp.setId(app.getId());
\r 
 170                         ecompApp.setName(app.getName());
\r 
 171                         ecompApp.setImageUrl(app.getImageUrl());
\r 
 172                         ecompApp.setDescription(app.getDescription());
\r 
 173                         ecompApp.setNotes(app.getNotes());
\r 
 174                         ecompApp.setUrl(app.getUrl());
\r 
 175                         ecompApp.setAlternateUrl(app.getAlternateUrl());
\r 
 176                         ecompApp.setUebTopicName(app.getUebTopicName());
\r 
 177                         ecompApp.setUebKey(app.getUebKey());
\r 
 178                         ecompApp.setUebSecret(app.getUebSecret());
\r 
 179                         ecompApp.setEnabled(app.getEnabled());
\r 
 180                         ecompApp.setRestrictedApp(app.isRestrictedApp());
\r 
 181                         ecompAppList.add(ecompApp);
\r 
 183                 return ecompAppList;
\r 
 187         public EPApp getApp(Long appId) {
\r 
 189                         @SuppressWarnings("unchecked")
\r 
 190                         List<EPApp> apps = dataAccessService.getList(EPApp.class, " where id = " + appId, null, null);
\r 
 191                         return (apps.size() > 0) ? apps.get(0) : null;
\r 
 192                 } catch (Exception e) {
\r 
 193                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 198         @SuppressWarnings("unchecked")
\r 
 200         public List<AppIdAndNameTransportModel> getAdminApps(EPUser user) {
\r 
 201                 if (adminRolesService.isAccountAdmin(user)) {
\r 
 202                         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 "
\r 
 203                                         + "where userrole.USER_ID = %d AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
\r 
 204                                         + " AND (app.ENABLED = 'Y' OR app.APP_ID=1)";
\r 
 205                         String sql = String.format(format, user.getId());
\r 
 206                         // sql += " AND app.APP_REST_ENDPOINT IS NOT NULL AND
\r 
 207                         // app.APP_REST_ENDPOINT <> ''";
\r 
 210                                 return dataAccessService.executeSQLQuery(sql, AppIdAndNameTransportModel.class, null);
\r 
 211                         } catch (Exception e) {
\r 
 212                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 213                                 logger.error(EELFLoggerDelegate.errorLogger,
\r 
 214                                                 "Exception occurred while fetching the adminApps for user " + user.getLoginId(), e);
\r 
 217                 return new ArrayList<AppIdAndNameTransportModel>();
\r 
 221         public EPApp getAppDetail(String appName) {
\r 
 222                 final Map<String, String> params = new HashMap<String, String>();
\r 
 224                         params.put("appName", appName);
\r 
 225                         @SuppressWarnings("unchecked")
\r 
 226                         List<EPApp> apps = (List<EPApp>) dataAccessService.executeNamedQuery("getAppDetails", params, null);
\r 
 227                         return (apps.size() > 0) ? apps.get(0) : null;
\r 
 228                 } catch (Exception e) {
\r 
 229                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 234         @SuppressWarnings("unchecked")
\r 
 236         public List<AppIdAndNameTransportModel> getAppsForSuperAdminAndAccountAdmin(EPUser user) {
\r 
 237                 if (adminRolesService.isSuperAdmin(user) || adminRolesService.isAccountAdmin(user)) {
\r 
 238                         String format = "";
\r 
 240                         if (adminRolesService.isSuperAdmin(user)) {
\r 
 241                                 format = "SELECT app.APP_ID, app.APP_NAME, app.APP_TYPE FROM FN_APP app "
\r 
 242                                                 + "where app.ENABLED = 'Y' AND app.app_type = 1";
\r 
 244                                 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 "
\r 
 245                                                 + "where userrole.USER_ID = %d AND userrole.ROLE_ID=" + ACCOUNT_ADMIN_ROLE_ID
\r 
 246                                                 + " AND app.ENABLED = 'Y' AND app.app_type = 1";
\r 
 248                         sql = String.format(format, user.getId());
\r 
 249                         // sql += " AND app.APP_REST_ENDPOINT IS NOT NULL AND
\r 
 250                         // app.APP_REST_ENDPOINT <> ''";
\r 
 253                                 return dataAccessService.executeSQLQuery(sql, AppIdAndNameTransportModel.class, null);
\r 
 254                         } catch (Exception e) {
\r 
 255                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 256                                 logger.error(EELFLoggerDelegate.errorLogger,
\r 
 257                                                 "Exception occurred while fetching the adminApps for user " + user.getLoginId(), e);
\r 
 260                 return new ArrayList<AppIdAndNameTransportModel>();
\r 
 263         protected void logQuery(String sql) {
\r 
 264                 logger.debug(EELFLoggerDelegate.debugLogger, "logQuery: " + sql);
\r 
 267         public DataAccessService getDataAccessService() {
\r 
 268                 return dataAccessService;
\r 
 271         public void setDataAccessService(DataAccessService dataAccessService) {
\r 
 272                 this.dataAccessService = dataAccessService;
\r 
 276         public List<AdminUserApplications> getAppsAdmins() {
\r 
 277                 String sql = "SELECT apps.APP_NAME, apps.APP_ID, user.USER_ID, user.FIRST_NAME, user.LAST_NAME, user.org_user_id FROM fn_user_role userrole "
\r 
 278                                 + "INNER JOIN fn_user user ON user.USER_ID = userrole.USER_ID "
\r 
 279                                 + "INNER JOIN fn_app apps ON apps.APP_ID = userrole.APP_ID " + "WHERE userrole.ROLE_ID = "
\r 
 280                                 + ACCOUNT_ADMIN_ROLE_ID + " AND (apps.ENABLED = 'Y' OR apps.APP_ID=1)";
\r 
 283                         @SuppressWarnings("unchecked")
\r 
 284                         List<AdminUserApp> adminApps = dataAccessService.executeSQLQuery(sql, AdminUserApp.class, null);
\r 
 285                         // DataAccessService does not use generic types.
\r 
 286                         return aggregateRowsResultsByUserId(adminApps);
\r 
 287                 } catch (Exception e) {
\r 
 288                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
 293         private List<AdminUserApplications> aggregateRowsResultsByUserId(List<AdminUserApp> adminApps) {
\r 
 294                 HashMap<Long, AdminUserApplications> adminUserApplications = new HashMap<Long, AdminUserApplications>();
\r 
 295                 for (AdminUserApp app : adminApps) {
\r 
 296                         Long userId = app.getUser_Id();
\r 
 297                         if (adminUserApplications.get(userId) == null)
\r 
 298                                 adminUserApplications.put(userId, new AdminUserApplications(app));
\r 
 300                                 adminUserApplications.get(userId).addApp(app.getAppId(), app.getAppName());
\r 
 302                 return new ArrayList<AdminUserApplications>(adminUserApplications.values());
\r 
 306         public List<AppsResponse> getAllApps(Boolean all) {
\r 
 307                 // If all is true, return both active and inactive apps. Otherwise, just
\r 
 309                 @SuppressWarnings("unchecked")
\r 
 310                 // Sort the list by application name so the drop-down looks pretty.
\r 
 311                 List<EPApp> apps = all
\r 
 312                                 ? (List<EPApp>) dataAccessService.getList(EPApp.class, " where id != " + ECOMP_APP_ID, "name", null)
\r 
 313                                 : (List<EPApp>) dataAccessService.getList(EPApp.class,
\r 
 314                                                 " where ( enabled = 'Y' or id = " + ECOMP_APP_ID + ")", "name", null);
\r 
 316                 List<AppsResponse> appsModified = new ArrayList<AppsResponse>();
\r 
 317                 for (EPApp app : apps) {
\r 
 318                         appsModified.add(new AppsResponse(app.getId(), app.getName(), app.isRestrictedApp(), app.getEnabled()));
\r 
 320                 return appsModified;
\r 
 324         public UserRoles getUserProfile(String loginId) {
\r 
 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 "
\r 
 326                                 + "INNER JOIN fn_user user ON user.USER_ID = userrole.USER_ID "
\r 
 327                                 + "INNER JOIN fn_role role ON role.ROLE_ID = userrole.ROLE_ID "
\r 
 328                                 + "WHERE user.org_user_id = \"%s\" and (userrole.app_id = 1 or role.role_id = " + ACCOUNT_ADMIN_ROLE_ID
\r 
 330                 String sql = String.format(format, loginId);
\r 
 332                 @SuppressWarnings("unchecked")
\r 
 333                 List<UserRole> userRoleList = dataAccessService.executeSQLQuery(sql, UserRole.class, null);
\r 
 334                 ArrayList<UserRoles> usersRolesList = aggregateUserProfileRowsResultsByRole(userRoleList);
\r 
 335                 if (usersRolesList == null || usersRolesList.size() < 1)
\r 
 338                 return usersRolesList.get(0);
\r 
 342         public UserRoles getUserProfileNormalized(EPUser user) {
\r 
 344                 UserRoles userAndRoles = getUserProfile(user.getLoginId());
\r 
 345                 // If no roles are defined, treat this user as a guest.
\r 
 346                 if (user.isGuest() || userAndRoles == null) {
\r 
 347                         logger.debug(EELFLoggerDelegate.debugLogger, "getUserProfile: treating user {} as guest",
\r 
 348                                         user.getLoginId());
\r 
 349                         UserRole userRole = new UserRole();
\r 
 350                         userRole.setUser_Id(user.getId());
\r 
 351                         userRole.setOrgUserId(user.getLoginId());
\r 
 352                         userRole.setFirstName(user.getFirstName());
\r 
 353                         userRole.setLastName(user.getLastName());
\r 
 354                         userRole.setRoleId(-1L);
\r 
 355                         userRole.setRoleName("Guest");
\r 
 356                         userRole.setUser_Id(-1L);
\r 
 357                         userAndRoles = new UserRoles(userRole);
\r 
 360                 return userAndRoles;
\r 
 363         protected ArrayList<UserRoles> aggregateUserProfileRowsResultsByRole(List<UserRole> userRoleList) {
\r 
 364                 HashMap<String, UserRoles> userRoles = new HashMap<String, UserRoles>();
\r 
 365                 for (UserRole user : userRoleList) {
\r 
 366                         String orgUserId = user.getOrgUserId();
\r 
 367                         if (userRoles.get(orgUserId) == null)
\r 
 368                                 userRoles.put(orgUserId, new UserRoles(user));
\r 
 370                                 userRoles.get(orgUserId).addRole(user.getRoleName());
\r 
 372                 return new ArrayList<UserRoles>(userRoles.values());
\r 
 375         private boolean isRestrictedApp(Long appId) {
\r 
 376                 EPApp app = getApp(appId);
\r 
 377                 return app.isRestrictedApp();
\r 
 380         // For the functional menu edit
\r 
 382         public List<LocalRole> getAppRoles(Long appId) {
\r 
 384                 if (isRestrictedApp(appId)) {
\r 
 385                         sql = "SELECT ROLE_ID, ROLE_NAME from FN_ROLE where ROLE_ID = '" + RESTRICTED_APP_ROLE_ID + "'";
\r 
 387                         sql = "SELECT ROLE_ID, ROLE_NAME from FN_ROLE where APP_ID = '" + appId + "'";
\r 
 390                 @SuppressWarnings("unchecked")
\r 
 391                 List<LocalRole> appRoles = dataAccessService.executeSQLQuery(sql, LocalRole.class, null);
\r 
 395         protected String userAppsQuery(EPUser user) {
\r 
 396                 StringBuilder query = new StringBuilder();
\r 
 397                 if (adminRolesService.isSuperAdmin(user)) {
\r 
 398                         query.append("SELECT * FROM FN_APP where FN_APP.ENABLED = 'Y' ORDER BY APP_NAME");
\r 
 400                         query.append("SELECT * FROM FN_APP join FN_USER_ROLE ON FN_USER_ROLE.APP_ID = FN_APP.APP_ID where ");
\r 
 402                                         "FN_USER_ROLE.USER_ID = " + user.getId() + " AND FN_USER_ROLE.ROLE_ID != " + SUPER_ADMIN_ROLE_ID);
\r 
 403                         query.append(" AND FN_APP.ENABLED = 'Y'");
\r 
 405                 return query.toString();
\r 
 408         protected FieldsValidator onboardingAppFieldsChecker(OnboardingApp onboardingApp) {
\r 
 409                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
 410                 if (onboardingApp.name == null || onboardingApp.name.length() == 0 || onboardingApp.url == null
\r 
 411                                 || onboardingApp.url.length() == 0 || onboardingApp.restrictedApp == null
\r 
 412                                 || onboardingApp.isOpen == null || onboardingApp.isEnabled == null
\r 
 413                                 || (onboardingApp.id != null && onboardingApp.id.equals(ECOMP_APP_ID))
\r 
 414                                 // For a normal app (appType==1), these fields must be filled
\r 
 416                                 // For a restricted app (appType==2), they will be empty.
\r 
 417                                 || ((!onboardingApp.restrictedApp)
\r 
 418                                                 && (onboardingApp.username == null || onboardingApp.username.length() == 0
\r 
 419                                                                 || onboardingApp.appPassword == null || onboardingApp.appPassword.length() == 0))) {
\r 
 420                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
\r 
 422                 return fieldsValidator;
\r 
 426         public List<EPApp> getUserApps(EPUser user) {
\r 
 427                 List<EPApp> openApps = getOpenApps();
\r 
 429                 if (user.isGuest()) {
\r 
 432                         String sql = userAppsQuery(user);
\r 
 435                         // TreeSet<EPApp> distinctApps = new TreeSet<EPApp>();
\r 
 436                         List<EPApp> appsList = new ArrayList<>();
\r 
 437                         @SuppressWarnings("unchecked")
\r 
 438                         List<EPApp> adminApps = dataAccessService.executeSQLQuery(sql, EPApp.class, null);
\r 
 439                         HashSet<EPApp> appSet = new HashSet<>();
\r 
 440                         for (EPApp app : adminApps) {
\r 
 445                         for (EPApp app : openApps) {
\r 
 446                                 if (!appSet.contains(app))
\r 
 455         public List<EPApp> getPersAdminApps(EPUser user) {
\r 
 456                 final Map<String, Long> params = new HashMap<>();
\r 
 457                 params.put("userId", user.getId());
\r 
 458                 // Named query is stored in EP.hbm.xml, mapped to EPApp
\r 
 459                 @SuppressWarnings("unchecked")
\r 
 460                 List<EPApp> list = dataAccessService.executeNamedQuery("getPersAdminApps", params, null);
\r 
 465         public List<EPApp> getPersUserApps(EPUser user) {
\r 
 466                 final Map<String, Long> params = new HashMap<>();
\r 
 467                 params.put("userId", user.getId());
\r 
 468                 // Named query is stored in EP.hbm.xml, mapped to EPApp
\r 
 469                 @SuppressWarnings("unchecked")
\r 
 470                 List<EPApp> list = dataAccessService.executeNamedQuery("getPersUserApps", params, null);
\r 
 478          * org.openecomp.portalapp.portal.service.EPAppService#getAppCatalog(com.att
\r 
 479          * .fusionapp.ecomp.portal.domain.EPUser)
\r 
 482         public List<AppCatalogItem> getUserAppCatalog(EPUser user) {
\r 
 483                 final Map<String, Long> params = new HashMap<>();
\r 
 484                 params.put("userId", user.getId());
\r 
 485                 // Named query is stored in EP.hbm.xml, mapped to AppCatalogItem
\r 
 486                 @SuppressWarnings("unchecked")
\r 
 487                 List<AppCatalogItem> list = dataAccessService.executeNamedQuery("getUserAppCatalog", params, null);
\r 
 495          * org.openecomp.portalapp.portal.service.EPAppService#getAdminAppCatalog(
\r 
 496          * org.openecomp.portalapp.portal.domain.EPUser)
\r 
 499         public List<AppCatalogItem> getAdminAppCatalog(EPUser user) {
\r 
 500                 final Map<String, Long> params = new HashMap<>();
\r 
 501                 params.put("userId", user.getId());
\r 
 502                 // Named query is stored in EP.hbm.xml, mapped to AppCatalogItem
\r 
 503                 @SuppressWarnings("unchecked")
\r 
 504                 List<AppCatalogItem> list = dataAccessService.executeNamedQuery("getAdminAppCatalog", params, null);
\r 
 508         private List<EPApp> getOpenApps() {
\r 
 509                 @SuppressWarnings("unchecked")
\r 
 510                 List<EPApp> openApps = dataAccessService.getList(EPApp.class, " where open='Y' and enabled='Y'", null, null);
\r 
 514         @SuppressWarnings("unchecked")
\r 
 516         public List<EPApp> getAppsOrderByName(EPUser user) {
\r 
 517                 final Map<String, Long> params = new HashMap<>();
\r 
 518                 List<EPApp> sortedAppsByName = null;
\r 
 520                         if (adminRolesService.isSuperAdmin(user)) {
\r 
 521                                 params.put("userId", user.getId());
\r 
 522                                 sortedAppsByName = dataAccessService.executeNamedQuery("getPersAdminAppsOrderByName", params, null);
\r 
 524                                 params.put("userId", user.getId());
\r 
 525                                 sortedAppsByName = dataAccessService.executeNamedQuery("getPersUserAppsOrderByName", params, null);
\r 
 527                 } catch (Exception e) {
\r 
 528                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByName failed", e);
\r 
 530                 return sortedAppsByName;
\r 
 533         @SuppressWarnings("unchecked")
\r 
 535         public List<EPApp> getAppsOrderByLastUsed(EPUser user) {
\r 
 537                 final Map<String, Long> params = new HashMap<>();
\r 
 538                 List<EPApp> sortedAppsByLastUsed = new ArrayList<EPApp>();
\r 
 539                 List<EPApp> finalsortedAppsByLastUsed = new ArrayList<EPApp>();
\r 
 541                         if (adminRolesService.isSuperAdmin(user)) {
\r 
 542                                 params.put("userId", user.getId());
\r 
 543                                 sortedAppsByLastUsed = dataAccessService.executeNamedQuery("getAdminAppsOrderByLastUsed", params, null);
\r 
 545                                 params.put("userId", user.getId());
\r 
 546                                 sortedAppsByLastUsed = dataAccessService.executeNamedQuery("getUserAppsOrderByLastUsed", params, null);
\r 
 548                         Set<String> epAppSet = new HashSet<String>();
\r 
 549                         for (EPApp eapp : sortedAppsByLastUsed)
\r 
 550                                 if (!epAppSet.contains(eapp.getName())) {
\r 
 551                                         finalsortedAppsByLastUsed.add(eapp);
\r 
 552                                         epAppSet.add(eapp.getName());
\r 
 555                 } catch (Exception e) {
\r 
 556                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByLastUsed failed", e);
\r 
 558                 return finalsortedAppsByLastUsed;
\r 
 561         @SuppressWarnings("unchecked")
\r 
 563         public List<EPApp> getAppsOrderByMostUsed(EPUser user) {
\r 
 564                 final Map<String, Long> params = new HashMap<>();
\r 
 565                 List<EPApp> sortedAppsByMostUsed = new ArrayList<EPApp>();
\r 
 566                 List<EPApp> finalsortedAppsByMostUsed = new ArrayList<EPApp>();
\r 
 568                         if (adminRolesService.isSuperAdmin(user)) {
\r 
 569                                 params.put("userId", user.getId());
\r 
 570                                 sortedAppsByMostUsed = dataAccessService.executeNamedQuery("getAdminAppsOrderByMostUsed", params, null);
\r 
 572                                 params.put("userId", user.getId());
\r 
 573                                 sortedAppsByMostUsed = dataAccessService.executeNamedQuery("getUserAppsOrderByMostUsed", params, null);
\r 
 575                         Set<String> epAppSet = new HashSet<String>();
\r 
 577                         for (EPApp eapp : sortedAppsByMostUsed) {
\r 
 578                                 if (!epAppSet.contains(eapp.getName())) {
\r 
 579                                         finalsortedAppsByMostUsed.add(eapp);
\r 
 580                                         epAppSet.add(eapp.getName());
\r 
 583                 } catch (Exception e) {
\r 
 584                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByMostUsed failed", e);
\r 
 587                 return finalsortedAppsByMostUsed;
\r 
 591          * This Method retrieves the User Apps by Sort Manual Preference
\r 
 593          * @param: user--contains LoggedIn User Data
\r 
 595         @SuppressWarnings("unchecked")
\r 
 597         public List<EPApp> getAppsOrderByManual(EPUser user) {
\r 
 598                 final Map<String, Long> params = new HashMap<>();
\r 
 599                 List<EPApp> sortedAppsByManual = new ArrayList<EPApp>();
\r 
 600                 List<EPApp> finalsortedAppsByManual = new ArrayList<EPApp>();
\r 
 602                         if (adminRolesService.isSuperAdmin(user)) {
\r 
 603                                 params.put("userId", user.getId());
\r 
 604                                 sortedAppsByManual = dataAccessService.executeNamedQuery("getAdminAppsOrderByManual", params, null);
\r 
 606                                 params.put("userId", user.getId());
\r 
 607                                 sortedAppsByManual = dataAccessService.executeNamedQuery("getUserAppsOrderByManual", params, null);
\r 
 609                         Set<String> epAppSet = new HashSet<String>();
\r 
 611                         for (EPApp eapp : sortedAppsByManual) {
\r 
 612                                 if (!epAppSet.contains(eapp.getName())) {
\r 
 613                                         finalsortedAppsByManual.add(eapp);
\r 
 614                                         epAppSet.add(eapp.getName());
\r 
 617                 } catch (Exception e) {
\r 
 618                         logger.error(EELFLoggerDelegate.errorLogger, "getAppsOrderByManual failed", e);
\r 
 620                 return finalsortedAppsByManual;
\r 
 624         public List<OnboardingApp> getOnboardingApps() {
\r 
 625                 @SuppressWarnings("unchecked")
\r 
 626                 List<EPApp> apps = dataAccessService.getList(EPApp.class, " where id!=" + ECOMP_APP_ID, null, null);
\r 
 627                 List<OnboardingApp> onboardingAppsList = new ArrayList<OnboardingApp>();
\r 
 628                 for (EPApp app : apps) {
\r 
 629                         OnboardingApp onboardingApp = new OnboardingApp();
\r 
 630                         createOnboardingFromApp(app, onboardingApp);
\r 
 631                         onboardingAppsList.add(onboardingApp);
\r 
 633                 return onboardingAppsList;
\r 
 637         public List<OnboardingApp> getEnabledNonOpenOnboardingApps() {
\r 
 638                 @SuppressWarnings("unchecked")
\r 
 639                 List<EPApp> apps = dataAccessService.getList(EPApp.class,
\r 
 640                                 " where enabled = true and open = false and id!=" + ECOMP_APP_ID, null, null);
\r 
 641                 List<OnboardingApp> onboardingAppsList = new ArrayList<OnboardingApp>();
\r 
 642                 for (EPApp app : apps) {
\r 
 643                         OnboardingApp onboardingApp = new OnboardingApp();
\r 
 644                         createOnboardingFromApp(app, onboardingApp);
\r 
 645                         onboardingAppsList.add(onboardingApp);
\r 
 647                 return onboardingAppsList;
\r 
 650         @SuppressWarnings("unchecked")
\r 
 651         private void validateOnboardingApp(OnboardingApp onboardingApp, FieldsValidator fieldsValidator) {
\r 
 652                 boolean duplicatedUrl = false;
\r 
 653                 boolean duplicatedName = false;
\r 
 655                 if (onboardingApp.id == null) {
\r 
 656                         apps = dataAccessService.getList(EPApp.class,
\r 
 657                                         " where url = '" + onboardingApp.url + "' or name = '" + onboardingApp.name + "'", null, null);
\r 
 659                         apps = dataAccessService.getList(EPApp.class, " where id = " + onboardingApp.id + " or url = '"
\r 
 660                                         + onboardingApp.url + "' or name = '" + onboardingApp.name + "'", null, null);
\r 
 662                 for (EPApp app : apps) {
\r 
 663                         if (onboardingApp.id != null && onboardingApp.id.equals(app.getId())) {
\r 
 666                         if (!duplicatedUrl && app.getUrl().equalsIgnoreCase(onboardingApp.url)) {
\r 
 667                                 duplicatedUrl = true;
\r 
 668                                 if (duplicatedName) {
\r 
 672                         if (!duplicatedName && app.getName().equalsIgnoreCase(onboardingApp.name)) {
\r 
 673                                 duplicatedName = true;
\r 
 674                                 if (duplicatedUrl) {
\r 
 679                 if (duplicatedUrl || duplicatedName) {
\r 
 680                         if (duplicatedUrl) {
\r 
 681                                 fieldsValidator.addProblematicFieldName(urlField);
\r 
 683                         if (duplicatedName) {
\r 
 684                                 fieldsValidator.addProblematicFieldName(nameField);
\r 
 686                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
\r 
 687                         fieldsValidator.errorCode = new Long(EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR);
\r 
 692         public FieldsValidator modifyOnboardingApp(OnboardingApp modifiedOnboardingApp, EPUser user) {
\r 
 693                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: entering modifyOnboardingApp");
\r 
 694                 FieldsValidator fieldsValidator = onboardingAppFieldsChecker(modifiedOnboardingApp);
\r 
 695                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
\r 
 696                         validateOnboardingApp(modifiedOnboardingApp, fieldsValidator);
\r 
 698                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
\r 
 699                         if (modifiedOnboardingApp.id != null) {
\r 
 700                                 updateApp(modifiedOnboardingApp.id, modifiedOnboardingApp, fieldsValidator, user);
\r 
 702                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
\r 
 705                 return fieldsValidator;
\r 
 709         public FieldsValidator addOnboardingApp(OnboardingApp newOnboardingApp, EPUser user) {
\r 
 710                 FieldsValidator fieldsValidator = onboardingAppFieldsChecker(newOnboardingApp);
\r 
 711                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
\r 
 712                         validateOnboardingApp(newOnboardingApp, fieldsValidator);
\r 
 714                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
\r 
 715                         if (newOnboardingApp.id == null) {
\r 
 716                                 updateApp(null, newOnboardingApp, fieldsValidator, user);
\r 
 718                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
\r 
 721                 return fieldsValidator;
\r 
 725         public FieldsValidator deleteOnboardingApp(EPUser user, Long appid) {
\r 
 726                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
 727                 if (!adminRolesService.isSuperAdmin(user)) {
\r 
 728                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_FORBIDDEN);
\r 
 729                         return fieldsValidator;
\r 
 731                 Boolean result = false;
\r 
 732                 Session localSession = null;
\r 
 733                 Transaction transaction = null;
\r 
 735                         localSession = sessionFactory.openSession();
\r 
 736                         transaction = localSession.beginTransaction();
\r 
 738                         // 1) Remove the URL for any functional menu item associated with
\r 
 740                         String sql = "UPDATE fn_menu_functional m, fn_menu_functional_roles mr SET m.url='' "
\r 
 741                                         + " WHERE m.menu_id=mr.menu_id " + " AND mr.app_id='" + appid + "'";
\r 
 743                         Query query = localSession.createSQLQuery(sql);
\r 
 744                         query.executeUpdate();
\r 
 746                         // Remove any favorites associated with a menu item that is
\r 
 747                         // associated with this app
\r 
 748                         sql = "Delete from fn_menu_favorites " + " using fn_menu_favorites inner join fn_menu_functional_roles "
\r 
 749                                         + " where fn_menu_functional_roles.app_id='" + appid + "' "
\r 
 750                                         + " AND fn_menu_functional_roles.menu_id=fn_menu_favorites.menu_id";
\r 
 752                         query = localSession.createSQLQuery(sql);
\r 
 753                         query.executeUpdate();
\r 
 755                         // Remove all role, appid records from fn_menu_functional_role
\r 
 756                         // that are associated with this app
\r 
 757                         sql = "delete from fn_menu_functional_roles where app_id='" + appid + "'";
\r 
 759                         query = localSession.createSQLQuery(sql);
\r 
 760                         query.executeUpdate();
\r 
 762                         // Remove all records from fn_user_role associated with this app
\r 
 763                         sql = "delete from fn_user_role where app_id='" + appid + "'";
\r 
 765                         query = localSession.createSQLQuery(sql);
\r 
 766                         query.executeUpdate();
\r 
 768                         // Remove any widgets associated with this app
\r 
 769                         sql = "delete from ep_widget_catalog_role where app_id='" + appid + "'";
\r 
 771                         query = localSession.createSQLQuery(sql);
\r 
 772                         query.executeUpdate();
\r 
 774                         // Remove any roles associated with this app
\r 
 775                         sql = "delete from ep_role_notification " + " using ep_role_notification inner join fn_role "
\r 
 776                                         + " where fn_role.app_id='" + appid + "' " + " and ep_role_notification.role_id= fn_role.role_id";
\r 
 778                         query = localSession.createSQLQuery(sql);
\r 
 779                         query.executeUpdate();
\r 
 781                         // Remove all records from fn_role associated with this app
\r 
 782                         sql = "delete from fn_role where app_id='" + appid + "'";
\r 
 784                         query = localSession.createSQLQuery(sql);
\r 
 785                         query.executeUpdate();
\r 
 787                         // Remove app contact us entries
\r 
 788                         sql = "delete from fn_app_contact_us where app_id='" + appid + "'";
\r 
 790                         query = localSession.createSQLQuery(sql);
\r 
 791                         query.executeUpdate();
\r 
 793                         // Remove any widgets associated with this app
\r 
 794                         sql = "delete from fn_widget where app_id='" + appid + "'";
\r 
 796                         query = localSession.createSQLQuery(sql);
\r 
 797                         query.executeUpdate();
\r 
 799                         // Remove rows in the app personalization selection table
\r 
 800                         sql = "delete from fn_pers_user_app_sel where app_id='" + appid + "'";
\r 
 802                         query = localSession.createSQLQuery(sql);
\r 
 803                         query.executeUpdate();
\r 
 805                         // Remove rows in the app personalization sort table
\r 
 806                         sql = "delete from ep_pers_user_app_man_sort where app_id='" + appid + "'";
\r 
 808                         query = localSession.createSQLQuery(sql);
\r 
 809                         query.executeUpdate();
\r 
 812                         sql = "delete from fn_app where app_id='" + appid + "'";
\r 
 814                         query = localSession.createSQLQuery(sql);
\r 
 815                         query.executeUpdate();
\r 
 817                         transaction.commit();
\r 
 819                 } catch (Exception e) {
\r 
 820                         logger.error(EELFLoggerDelegate.errorLogger, "deleteOnboardingApp failed", e);
\r 
 821                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError);
\r 
 822                         EcompPortalUtils.rollbackTransaction(transaction, "deleteOnboardingApp rollback, exception = " + e);
\r 
 824                         EcompPortalUtils.closeLocalSession(localSession, "deleteOnboardingApp");
\r 
 827                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
 829                 return fieldsValidator;
\r 
 832         private static Object syncRests = new Object();
\r 
 834         // An app has been enabled/disabled. Must enable/disable all associated
\r 
 835         // functional menu items.
\r 
 836         private void setFunctionalMenuItemsEnabled(Session localSession, Boolean enabled, Long appId) {
\r 
 837                 String active_yn = enabled ? "Y" : "N";
\r 
 838                 String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn "
\r 
 839                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
\r 
 840                                 + " AND r.app_id = '" + appId + "' ";
\r 
 842                 @SuppressWarnings("unchecked")
\r 
 843                 List<FunctionalMenuItem> menuItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
\r 
 844                 for (FunctionalMenuItem menuItem : menuItems) {
\r 
 845                         FunctionalMenuItem myMenuItem = (FunctionalMenuItem) localSession.get(FunctionalMenuItem.class,
\r 
 847                         myMenuItem.active_yn = active_yn;
\r 
 848                         localSession.save(myMenuItem);
\r 
 852         // Attention! If (appId == null) we use this function to create application
\r 
 853         // otherwise we use it to modify existing application
\r 
 854         private void updateApp(Long appId, OnboardingApp onboardingApp, FieldsValidator fieldsValidator, EPUser user) {
\r 
 855                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: entering updateApp");
\r 
 856                 // Separate out the code for a restricted app, since it doesn't need any
\r 
 857                 // of the UEB code.
\r 
 858                 if (onboardingApp.restrictedApp) {
\r 
 859                         boolean result = false;
\r 
 860                         Session localSession = null;
\r 
 861                         Transaction transaction = null;
\r 
 863                                 localSession = sessionFactory.openSession();
\r 
 864                                 transaction = localSession.beginTransaction();
\r 
 866                                 if (appId == null) {
\r 
 869                                         app = (EPApp) localSession.get(EPApp.class, appId);
\r 
 870                                         if (app == null || app.getId() == null) { // App is already
\r 
 872                                                 transaction.commit();
\r 
 873                                                 localSession.close();
\r 
 874                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);
\r 
 878                                 createAppFromOnboarding(app, onboardingApp, localSession);
\r 
 879                                 localSession.saveOrUpdate(app);
\r 
 880                                 // Enable or disable all menu items associated with this app
\r 
 881                                 setFunctionalMenuItemsEnabled(localSession, onboardingApp.isEnabled, appId);
\r 
 882                                 transaction.commit();
\r 
 884                         } catch (Exception e) {
\r 
 885                                 EcompPortalUtils.rollbackTransaction(transaction,
\r 
 886                                                 "updateApp rollback, exception = " + EcompPortalUtils.getStackTrace(e));
\r 
 888                                 EcompPortalUtils.closeLocalSession(localSession, "updateApp");
\r 
 891                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
 895                         synchronized (syncRests) {
\r 
 896                                 boolean result = false;
\r 
 897                                 Session localSession = null;
\r 
 898                                 Transaction transaction = null;
\r 
 900                                         localSession = sessionFactory.openSession();
\r 
 901                                         transaction = localSession.beginTransaction();
\r 
 903                                         if (appId == null) {
\r 
 905                                                 // -------------------------------------------------------------------------------------------
\r 
 906                                                 // Register this App with the UEB communication server.
\r 
 908                                                 // the App's unique mailbox/topic
\r 
 909                                                 // name and keys to the FN_APP table. The App's mailbox
\r 
 911                                                 // keys will be visible to the
\r 
 912                                                 // admin on the ECOMP portal.
\r 
 913                                                 // -------------------------------------------------------------------------------------------
\r 
 914                                                 TopicManager topicManager = new TopicManager();
\r 
 915                                                 final CambriaIdentityManager im = new CambriaClientBuilders.IdentityManagerBuilder()
\r 
 916                                                                 .usingHosts(Helper.uebUrlList()).build();
\r 
 917                                                 com.att.nsa.apiClient.credentials.ApiCredential credential = im.createApiKey(user.getEmail(),
\r 
 918                                                                 "ECOMP Portal Owner");
\r 
 919                                                 String appKey = credential.getApiKey();
\r 
 920                                                 String appSecret = credential.getApiSecret();
\r 
 921                                                 String appMailboxName = null;
\r 
 923                                                 int maxNumAttemptsToCreateATopic = 3;
\r 
 924                                                 boolean successfullyCreatedMailbox = false;
\r 
 925                                                 for (int i = 0; i < maxNumAttemptsToCreateATopic; i++) {
\r 
 926                                                         appMailboxName = "ECOMP-PORTAL-OUTBOX-" + (int) (Math.random() * 100000.0);
\r 
 929                                                                 topicManager.createTopic(
\r 
 930                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
\r 
 931                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET),
\r 
 932                                                                                 appMailboxName, "ECOMP outbox for app" + onboardingApp.name);
\r 
 933                                                                 successfullyCreatedMailbox = true;
\r 
 934                                                                 logger.debug(EELFLoggerDelegate.debugLogger,
\r 
 935                                                                                 "Successfully created " + appMailboxName + " for App " + onboardingApp.name);
\r 
 936                                                                 logger.debug(EELFLoggerDelegate.debugLogger, "    Key = " + appKey + " Secret = "
\r 
 937                                                                                 + appSecret + " generated using = " + user.getEmail());
\r 
 939                                                         } catch (HttpException e) {
\r 
 940                                                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebConnectionError, e);
\r 
 941                                                                 if (e.getStatusCode() == 409) {
\r 
 942                                                                         logger.error(EELFLoggerDelegate.errorLogger, "Topic/mailbox " + appMailboxName
\r 
 943                                                                                         + " already exists. Will try using a different name", e);
\r 
 945                                                                         logger.error(EELFLoggerDelegate.errorLogger, "HttpException when onboarding App: ",
\r 
 951                                                 if (successfullyCreatedMailbox) {
\r 
 952                                                         onboardingApp.setUebTopicName(appMailboxName);
\r 
 953                                                         onboardingApp.setUebKey(appKey);
\r 
 954                                                         onboardingApp.setUebSecret(appSecret);
\r 
 958                                                                  * EP is a publisher to this App's new mailbox
\r 
 960                                                                 topicManager.addPublisher(
\r 
 961                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
\r 
 962                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET),
\r 
 963                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
\r 
 967                                                                  * This App is a subscriber of its own mailbox
\r 
 969                                                                 topicManager.addSubscriber(
\r 
 970                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
\r 
 971                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET), appKey,
\r 
 975                                                                  * This App is a publisher to EP
\r 
 977                                                                 topicManager.addPublisher(
\r 
 978                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY),
\r 
 979                                                                                 PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_SECRET), appKey,
\r 
 980                                                                                 PortalApiProperties.getProperty(PortalApiConstants.ECOMP_PORTAL_INBOX_NAME));
\r 
 981                                                         } catch (HttpException | CambriaApiException | IOException e) {
\r 
 982                                                                 EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebRegisterOnboardingAppError, e);
\r 
 983                                                                 logger.error(EELFLoggerDelegate.errorLogger,
\r 
 984                                                                                 "Error when configuring Publisher/Subscriber for App's new mailbox", e);
\r 
 985                                                                 transaction.commit();
\r 
 986                                                                 localSession.close();
\r 
 987                                                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
\r 
 991                                                         transaction.commit();
\r 
 992                                                         localSession.close();
\r 
 993                                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
\r 
 997                                                 app = (EPApp) localSession.get(EPApp.class, appId);
\r 
 998                                                 if (app == null || app.getId() == null) {
\r 
 999                                                         // App is already deleted!
\r 
1000                                                         transaction.commit();
\r 
1001                                                         localSession.close();
\r 
1002                                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_NOT_FOUND);
\r 
1006                                         logger.debug(EELFLoggerDelegate.debugLogger, "LR: about to call createAppFromOnboarding");
\r 
1007                                         createAppFromOnboarding(app, onboardingApp, localSession);
\r 
1008                                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1009                                                         "LR: updateApp: finished calling createAppFromOnboarding");
\r 
1010                                         localSession.saveOrUpdate(app);
\r 
1011                                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1012                                                         "LR: updateApp: finished calling localSession.saveOrUpdate");
\r 
1013                                         // Enable or disable all menu items associated with this app
\r 
1014                                         setFunctionalMenuItemsEnabled(localSession, onboardingApp.isEnabled, appId);
\r 
1015                                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1016                                                         "LR: updateApp: finished calling setFunctionalMenuItemsEnabled");
\r 
1017                                         transaction.commit();
\r 
1018                                         logger.debug(EELFLoggerDelegate.debugLogger, "LR: updateApp: finished calling transaction.commit");
\r 
1019                                         epUebHelper.addPublisher(app);
\r 
1020                                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1021                                                         "LR: updateApp: finished calling epUebHelper.addPublisher");
\r 
1023                                 } catch (Exception e) {
\r 
1024                                         logger.error(EELFLoggerDelegate.errorLogger, "updateApp failed", e);
\r 
1025                                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeUebRegisterOnboardingAppError, e);
\r 
1026                                         EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeDaoSystemError, e);
\r 
1027                                         EcompPortalUtils.rollbackTransaction(transaction,
\r 
1028                                                         "updateApp rollback, exception = " + EcompPortalUtils.getStackTrace(e));
\r 
1030                                         EcompPortalUtils.closeLocalSession(localSession, "updateApp");
\r 
1033                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1040          * Populates a transport model of the application from a database row model.
\r 
1041          * Leaves out the thumbnail because the FE fetches images via a different
\r 
1045          *            Model of database row
\r 
1046          * @param onboardingApp
\r 
1047          *            Model for transport as JSON
\r 
1050         public void createOnboardingFromApp(EPApp app, OnboardingApp onboardingApp) {
\r 
1051                 onboardingApp.id = app.getId();
\r 
1052                 onboardingApp.name = app.getName();
\r 
1053                 onboardingApp.imageUrl = app.getImageUrl();
\r 
1054                 onboardingApp.description = app.getDescription();
\r 
1055                 onboardingApp.notes = app.getNotes();
\r 
1056                 onboardingApp.url = app.getUrl();
\r 
1057                 onboardingApp.alternateUrl = app.getAlternateUrl();
\r 
1058                 onboardingApp.restUrl = app.getAppRestEndpoint();
\r 
1059                 onboardingApp.isOpen = app.getOpen();
\r 
1060                 onboardingApp.isEnabled = app.getEnabled();
\r 
1061                 onboardingApp.username = app.getUsername();
\r 
1062                 onboardingApp.appPassword = decryptedPassword(app.getAppPassword(), app);
\r 
1063                 onboardingApp.uebTopicName = app.getUebTopicName();
\r 
1064                 onboardingApp.uebKey = app.getUebKey();
\r 
1065                 onboardingApp.uebSecret = app.getUebSecret();
\r 
1066                 onboardingApp.setRestrictedApp(app.isRestrictedApp());
\r 
1067                 // if (app.getThumbnail() != null)
\r 
1068                 // onboardingApp.thumbnail = new
\r 
1069                 // String(Base64.getEncoder().encode(app.getThumbnail()));
\r 
1073          * Creates a database object for an application from an uploaded transport
\r 
1074          * model. Must decode the thumbnail, if any.
\r 
1077          * @param onboardingApp
\r 
1078          * @param localSession
\r 
1079          * @return The first argument.
\r 
1081         protected EPApp createAppFromOnboarding(EPApp app, OnboardingApp onboardingApp, Session localSession) {
\r 
1082                 app.setName(onboardingApp.name);
\r 
1083                 app.setDescription(onboardingApp.description);
\r 
1084                 app.setNotes(onboardingApp.notes);
\r 
1085                 app.setUrl(onboardingApp.url);
\r 
1086                 app.setAlternateUrl(onboardingApp.alternateUrl);
\r 
1087                 app.setAppRestEndpoint(onboardingApp.restUrl);
\r 
1088                 app.setOpen(onboardingApp.isOpen);
\r 
1089                 app.setEnabled(onboardingApp.isEnabled);
\r 
1090                 app.setUsername(onboardingApp.username);
\r 
1091                 app.setAppPassword(this.encryptedPassword(onboardingApp.appPassword, app));
\r 
1092                 app.setUebTopicName(onboardingApp.uebTopicName);
\r 
1093                 app.setUebKey(onboardingApp.uebKey);
\r 
1094                 app.setUebSecret(onboardingApp.uebSecret);
\r 
1095                 app.setRestrictedApp(onboardingApp.restrictedApp);
\r 
1096                 if (!StringUtils.isEmpty(onboardingApp.thumbnail)) {
\r 
1097                         logger.debug(EELFLoggerDelegate.debugLogger, "createAppFromOnboarding: onboarding thumbnail is NOT empty");
\r 
1098                         String[] splitBase64Thumbnail = onboardingApp.thumbnail.split("base64,");
\r 
1099                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1100                                         "createAppFromOnboarding: length of splitBase64Thumbnail: " + splitBase64Thumbnail.length);
\r 
1101                         if (splitBase64Thumbnail.length > 1) {
\r 
1102                                 // This occurs when we have a new image, not an existing image
\r 
1103                                 byte[] decodedImage = Base64.getDecoder().decode(splitBase64Thumbnail[1].getBytes());
\r 
1104                                 logger.debug(EELFLoggerDelegate.debugLogger, "createAppFromOnboarding: finished calling decode");
\r 
1105                                 // This is basically a boolean indicator that an image is
\r 
1107                                 app.setImageUrl(constructImageName(onboardingApp));
\r 
1108                                 app.setThumbnail(decodedImage);
\r 
1110                 } else if (app.getThumbnail() != null) {
\r 
1111                         // The thumbnail that came in from the json is empty; the previous
\r 
1112                         // thumbnail is NOT empty. Must delete it.
\r 
1113                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1114                                         "createAppFromOnboarding: onboarding thumbnail is empty; db thumbnail is NOT null");
\r 
1115                         app.setImageUrl(null);
\r 
1116                         app.setThumbnail(null);
\r 
1118                         logger.debug(EELFLoggerDelegate.debugLogger,
\r 
1119                                         "createAppFromOnboarding: onboarding thumbnail is empty; db thumbnail is null");
\r 
1124         protected String constructImageName(OnboardingApp onboardingApp) {
\r 
1125                 return "portal_" + String.valueOf(onboardingApp.url.hashCode() + "_" + (int) (Math.random() * 100000.0))
\r 
1129         // Don't encrypt or decrypt the password if it is null or the empty string
\r 
1130         private String decryptedPassword(String encryptedAppPwd, EPApp app) {
\r 
1131                 String result = "";
\r 
1132                 if (encryptedAppPwd != null & encryptedAppPwd.length() > 0) {
\r 
1134                                 result = CipherUtil.decrypt(encryptedAppPwd,
\r 
1135                                                 SystemProperties.getProperty(SystemProperties.Decryption_Key));
\r 
1136                         } catch (Exception e) {
\r 
1137                                 logger.error(EELFLoggerDelegate.errorLogger, "decryptedPassword failed for app " + app.getName(), e);
\r 
1143         protected String encryptedPassword(String decryptedAppPwd, EPApp app) {
\r 
1144                 String result = "";
\r 
1145                 if (decryptedAppPwd != null & decryptedAppPwd.length() > 0) {
\r 
1147                                 result = CipherUtil.encrypt(decryptedAppPwd,
\r 
1148                                                 SystemProperties.getProperty(SystemProperties.Decryption_Key));
\r 
1149                         } catch (Exception e) {
\r 
1150                                 logger.error(EELFLoggerDelegate.errorLogger, "encryptedPassword failed for app " + app.getName(), e);
\r 
1156         @SuppressWarnings("unchecked")
\r 
1158         public FieldsValidator saveWidgetsSortManual(List<EPWidgetsSortPreference> widgetsSortManual, EPUser user) {
\r 
1159                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
1160                 final Map<String, Long> params = new HashMap<>();
\r 
1161                 List<EPWidgetsManualSortPreference> epManualWidgets = new ArrayList<EPWidgetsManualSortPreference>();
\r 
1164                         params.put("userId", user.getId());
\r 
1165                         epManualWidgets = dataAccessService.executeNamedQuery("userWidgetManualSortPrfQuery", params, null);
\r 
1166                         Map<Long, EPWidgetsManualSortPreference> existingWidgetsIds = new HashMap<Long, EPWidgetsManualSortPreference>();
\r 
1167                         for (EPWidgetsManualSortPreference userWidgetManualPref : epManualWidgets) {
\r 
1168                                 existingWidgetsIds.put(userWidgetManualPref.getWidgetId(), userWidgetManualPref);
\r 
1170                         for (EPWidgetsSortPreference epWidgetsManPref : widgetsSortManual) {
\r 
1171                                 if (epWidgetsManPref.getWidgetid() != null) {
\r 
1172                                         Long widgetid = epWidgetsManPref.getWidgetid();
\r 
1173                                         if (existingWidgetsIds.containsKey(widgetid)) {
\r 
1174                                                 EPWidgetsManualSortPreference epWidgetsManualSort = existingWidgetsIds.get(widgetid);
\r 
1175                                                 epWidgetsManualSort.setWidgetRow(epWidgetsManPref.getRow());
\r 
1176                                                 epWidgetsManualSort.setWidgetCol(epWidgetsManPref.getCol());
\r 
1177                                                 epWidgetsManualSort.setWidgetWidth(epWidgetsManPref.getSizeX());
\r 
1178                                                 epWidgetsManualSort.setWidgetHeight(epWidgetsManPref.getSizeY());
\r 
1179                                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
\r 
1180                                                 additionalUpdateParam.put("userId", epWidgetsManualSort.getUserId());
\r 
1181                                                 dataAccessService.saveDomainObject(epWidgetsManualSort, additionalUpdateParam);
\r 
1183                                                 EPWidgetsManualSortPreference epWidgetsManualSort = new EPWidgetsManualSortPreference();
\r 
1184                                                 epWidgetsManualSort.setWidgetId(epWidgetsManPref.getWidgetid());
\r 
1185                                                 epWidgetsManualSort.setWidgetRow(epWidgetsManPref.getRow());
\r 
1186                                                 epWidgetsManualSort.setWidgetCol(epWidgetsManPref.getCol());
\r 
1187                                                 epWidgetsManualSort.setWidgetWidth(epWidgetsManPref.getSizeX());
\r 
1188                                                 epWidgetsManualSort.setWidgetHeight(epWidgetsManPref.getSizeY());
\r 
1189                                                 epWidgetsManualSort.setUserId(Ints.checkedCast(user.getId()));
\r 
1190                                                 dataAccessService.saveDomainObject(epWidgetsManualSort, null);
\r 
1192                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1195                 } catch (Exception e) {
\r 
1196                         logger.error(EELFLoggerDelegate.errorLogger, "saveWidgetsSortManual failed", e);
\r 
1197                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1199                 return fieldsValidator;
\r 
1202         @SuppressWarnings("unchecked")
\r 
1204         public FieldsValidator deleteUserWidgetSortPref(List<EPWidgetsSortPreference> delWidgetSortPref, EPUser user) {
\r 
1205                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
1206                 final Map<String, Long> params = new HashMap<>();
\r 
1207                 List<EPWidgetsManualSortPreference> epWidgets = new ArrayList<EPWidgetsManualSortPreference>();
\r 
1209                         params.put("userId", user.getId());
\r 
1210                         epWidgets = dataAccessService.executeNamedQuery("userWidgetManualSortPrfQuery", params, null);
\r 
1211                         Map<Long, EPWidgetsManualSortPreference> existingWidgetIds = new HashMap<Long, EPWidgetsManualSortPreference>();
\r 
1212                         for (EPWidgetsManualSortPreference userWidgetSortPref : epWidgets) {
\r 
1213                                 existingWidgetIds.put(userWidgetSortPref.getWidgetId(), userWidgetSortPref);
\r 
1215                         for (EPWidgetsSortPreference delEpWidgetsManPref : delWidgetSortPref) {
\r 
1216                                 if (delEpWidgetsManPref.getWidgetid() != null) {
\r 
1217                                         Long widgetId = delEpWidgetsManPref.getWidgetid();
\r 
1218                                         if (existingWidgetIds.containsKey(widgetId)) {
\r 
1219                                                 dataAccessService.deleteDomainObjects(EPWidgetsManualSortPreference.class,
\r 
1220                                                                 "widget_id=" + widgetId + " AND user_id=" + user.getId(), null);
\r 
1222                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1225                 } catch (Exception e) {
\r 
1226                         logger.error(EELFLoggerDelegate.errorLogger, "deleteUserWidgetSortPref failed", e);
\r 
1227                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1229                 return fieldsValidator;
\r 
1233          * This Method Stores the Sort Order of User Apps by Sort Manual Preference
\r 
1235          * @param: appsSortManual--contains User Apps Data
\r 
1237          * @param: user--contains LoggedIn User Data
\r 
1239         @SuppressWarnings("unchecked")
\r 
1241         public FieldsValidator saveAppsSortManual(List<EPAppsManualPreference> appsSortManual, EPUser user) {
\r 
1242                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
1243                 final Map<String, Long> params = new HashMap<>();
\r 
1244                 List<EPUserAppsManualSortPreference> epManualApps = new ArrayList<EPUserAppsManualSortPreference>();
\r 
1247                         params.put("userId", user.getId());
\r 
1248                         epManualApps = dataAccessService.executeNamedQuery("userAppsManualSortPrfQuery", params, null);
\r 
1249                         Map<Long, EPUserAppsManualSortPreference> existingAppIds = new HashMap<Long, EPUserAppsManualSortPreference>();
\r 
1250                         for (EPUserAppsManualSortPreference userAppManualPref : epManualApps) {
\r 
1251                                 existingAppIds.put(userAppManualPref.getAppId(), userAppManualPref);
\r 
1253                         for (EPAppsManualPreference epAppsManPref : appsSortManual) {
\r 
1254                                 if (epAppsManPref.getAppid() != null) {
\r 
1255                                         Long appid = epAppsManPref.getAppid();
\r 
1256                                         if (existingAppIds.containsKey(appid)) {
\r 
1257                                                 EPUserAppsManualSortPreference epAppsManualSort = existingAppIds.get(appid);
\r 
1259                                                                 .setAppManualSortOrder((epAppsManPref.getCol() + (6 * epAppsManPref.getRow())) + 1);
\r 
1260                                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
\r 
1261                                                 additionalUpdateParam.put("userId", epAppsManualSort.getUserId());
\r 
1262                                                 dataAccessService.saveDomainObject(epAppsManualSort, additionalUpdateParam);
\r 
1264                                                 EPUserAppsManualSortPreference epAppsManualSort = new EPUserAppsManualSortPreference();
\r 
1265                                                 epAppsManualSort.setAppId(epAppsManPref.getAppid());
\r 
1267                                                                 .setAppManualSortOrder((epAppsManPref.getCol() + (6 * epAppsManPref.getRow())) + 1);
\r 
1268                                                 epAppsManualSort.setUserId(Ints.checkedCast(user.getId()));
\r 
1269                                                 dataAccessService.saveDomainObject(epAppsManualSort, null);
\r 
1271                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1274                 } catch (Exception e) {
\r 
1275                         logger.error(EELFLoggerDelegate.errorLogger, "saveAppsSortManual failed", e);
\r 
1276                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1278                 return fieldsValidator;
\r 
1284          * @see org.openecomp.portalapp.portal.service.EPAppService#
\r 
1285          * deleteUserAppSortManual(java.lang.String,
\r 
1286          * org.openecomp.portalapp.portal.domain.EPUser)
\r 
1288         @SuppressWarnings("unchecked")
\r 
1290         public FieldsValidator deleteUserAppSortManual(EPDeleteAppsManualSortPref delAppSortManual, EPUser user) {
\r 
1291                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
1292                 final Map<String, Long> params = new HashMap<>();
\r 
1293                 List<EPUserAppsManualSortPreference> epManualApps = new ArrayList<EPUserAppsManualSortPreference>();
\r 
1295                         params.put("userId", user.getId());
\r 
1296                         epManualApps = dataAccessService.executeNamedQuery("userAppsManualSortPrfQuery", params, null);
\r 
1297                         Map<Long, EPUserAppsManualSortPreference> existingAppIds = new HashMap<Long, EPUserAppsManualSortPreference>();
\r 
1298                         for (EPUserAppsManualSortPreference userAppPref : epManualApps) {
\r 
1299                                 existingAppIds.put(userAppPref.getAppId(), userAppPref);
\r 
1301                         if (existingAppIds.containsKey(delAppSortManual.getAppId()) && !delAppSortManual.isSelect()) {
\r 
1302                                 dataAccessService.deleteDomainObjects(EPUserAppsManualSortPreference.class,
\r 
1303                                                 "app_id=" + delAppSortManual.getAppId() + " AND user_id=" + user.getId(), null);
\r 
1304                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1306                 } catch (Exception e) {
\r 
1307                         logger.error(EELFLoggerDelegate.errorLogger, "deleteUserAppSortManual failed", e);
\r 
1308                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1310                 return fieldsValidator;
\r 
1313         @SuppressWarnings("unchecked")
\r 
1315         public FieldsValidator saveAppsSortPreference(EPAppsSortPreference appsSortPreference, EPUser user) {
\r 
1316                 FieldsValidator fieldsValidator = new FieldsValidator();
\r 
1317                 final Map<String, Long> params = new HashMap<>();
\r 
1318                 List<EPUserAppsSortPreference> epSortTypes = new ArrayList<EPUserAppsSortPreference>();
\r 
1319                 EPUserAppsSortPreference usrSortPr = null;
\r 
1321                         params.put("userId", user.getId());
\r 
1322                         epSortTypes = dataAccessService.executeNamedQuery("userAppsSortPreferenceQuery", params, null);
\r 
1323                         if (epSortTypes.size() == 0) {
\r 
1324                                 usrSortPr = new EPUserAppsSortPreference();
\r 
1325                                 usrSortPr.setUserId(Ints.checkedCast(user.getId()));
\r 
1326                                 usrSortPr.setSortPref(appsSortPreference.getValue());
\r 
1327                                 dataAccessService.saveDomainObject(usrSortPr, null);
\r 
1328                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1330                                 usrSortPr = epSortTypes.get(0);
\r 
1331                                 usrSortPr.setSortPref(appsSortPreference.getValue());
\r 
1332                                 HashMap<String, Integer> additionalUpdateParam = new HashMap<String, Integer>();
\r 
1333                                 additionalUpdateParam.put("userId", usrSortPr.getUserId());
\r 
1334                                 dataAccessService.saveDomainObject(usrSortPr, additionalUpdateParam);
\r 
1335                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_OK);
\r 
1337                 } catch (Exception e) {
\r 
1338                         logger.error(EELFLoggerDelegate.errorLogger, "saveAppsSortPreference failed", e);
\r 
1339                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
\r 
1341                 return fieldsValidator;
\r 
1344         @SuppressWarnings("unchecked")
\r 
1346         public String getUserAppsSortTypePreference(EPUser user) {
\r 
1347                 final Map<String, Long> params = new HashMap<>();
\r 
1348                 List<EPUserAppsSortPreference> userSortPrefs = new ArrayList<EPUserAppsSortPreference>();
\r 
1350                         params.put("userId", user.getId());
\r 
1351                         userSortPrefs = dataAccessService.executeNamedQuery("userAppsSortPreferenceQuery", params, null);
\r 
1352                         if (userSortPrefs.size() > 0)
\r 
1353                                 return userSortPrefs.get(0).getSortPref();
\r 
1356                 } catch (Exception e) {
\r 
1357                         logger.error(EELFLoggerDelegate.errorLogger, "getUserAppsSortTypePreference failed", e);
\r 
1364         public List<EPApp> getUserRemoteApps(String id) {
\r 
1365                 throw new RuntimeException(" Cannot be called from parent class");
\r