2  * ============LICENSE_START==========================================
 
   4  * ===================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
 
   6  * ===================================================================
 
   8  * Unless otherwise specified, all software contained herein is licensed
 
   9  * under the Apache License, Version 2.0 (the "License");
 
  10  * you may not use this software except in compliance with the License.
 
  11  * You may obtain a copy of the License at
 
  13  *             http://www.apache.org/licenses/LICENSE-2.0
 
  15  * Unless required by applicable law or agreed to in writing, software
 
  16  * distributed under the License is distributed on an "AS IS" BASIS,
 
  17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  18  * See the License for the specific language governing permissions and
 
  19  * limitations under the License.
 
  21  * Unless otherwise specified, all documentation contained herein is licensed
 
  22  * under the Creative Commons License, Attribution 4.0 Intl. (the "License");
 
  23  * you may not use this documentation except in compliance with the License.
 
  24  * You may obtain a copy of the License at
 
  26  *             https://creativecommons.org/licenses/by/4.0/
 
  28  * Unless required by applicable law or agreed to in writing, documentation
 
  29  * distributed under the License is distributed on an "AS IS" BASIS,
 
  30  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  31  * See the License for the specific language governing permissions and
 
  32  * limitations under the License.
 
  34  * ============LICENSE_END============================================
 
  36  * ECOMP is a trademark and service mark of AT&T Intellectual Property.
 
  38 package org.onap.portalapp.portal.service;
 
  40 import java.util.ArrayList;
 
  41 import java.util.HashMap;
 
  42 import java.util.List;
 
  45 import javax.annotation.PostConstruct;
 
  46 import javax.servlet.http.HttpServletResponse;
 
  48 import org.apache.commons.lang3.StringUtils;
 
  49 import org.hibernate.Criteria;
 
  50 import org.hibernate.Query;
 
  51 import org.hibernate.Session;
 
  52 import org.hibernate.SessionFactory;
 
  53 import org.hibernate.Transaction;
 
  54 import org.hibernate.criterion.Criterion;
 
  55 import org.hibernate.criterion.Projections;
 
  56 import org.hibernate.criterion.Restrictions;
 
  57 import org.onap.portalapp.portal.domain.EPApp;
 
  58 import org.onap.portalapp.portal.domain.EPUser;
 
  59 import org.onap.portalapp.portal.domain.FunctionalMenuItemWithAppID;
 
  60 import org.onap.portalapp.portal.logging.aop.EPMetricsLog;
 
  61 import org.onap.portalapp.portal.transport.BusinessCardApplicationRole;
 
  62 import org.onap.portalapp.portal.transport.FavoritesFunctionalMenuItem;
 
  63 import org.onap.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
 
  64 import org.onap.portalapp.portal.transport.FieldsValidator;
 
  65 import org.onap.portalapp.portal.transport.FunctionalMenuItem;
 
  66 import org.onap.portalapp.portal.transport.FunctionalMenuItemWithRoles;
 
  67 import org.onap.portalapp.portal.transport.FunctionalMenuRole;
 
  68 import org.onap.portalapp.portal.utils.EPCommonSystemProperties;
 
  69 import org.onap.portalapp.portal.utils.EcompPortalUtils;
 
  70 import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
 
  71 import org.onap.portalsdk.core.service.DataAccessService;
 
  72 import org.onap.portalsdk.core.util.SystemProperties;
 
  73 import org.springframework.beans.factory.annotation.Autowired;
 
  74 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 
  75 import org.springframework.stereotype.Service;
 
  77 @Service("functionalMenuService")
 
  78 @org.springframework.context.annotation.Configuration
 
  79 @EnableAspectJAutoProxy
 
  81 public class FunctionalMenuServiceImpl implements FunctionalMenuService {
 
  82         EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FunctionalMenuServiceImpl.class);
 
  84         private Long ACCOUNT_ADMIN_ROLE_ID = 999L;
 
  85         private String RESTRICTED_APP_ROLE_ID = "900";
 
  88         private DataAccessService dataAccessService;
 
  90         private SessionFactory sessionFactory;
 
  95                         ACCOUNT_ADMIN_ROLE_ID = Long
 
  96                                         .valueOf(SystemProperties.getProperty(EPCommonSystemProperties.ACCOUNT_ADMIN_ROLE_ID));
 
  97                         RESTRICTED_APP_ROLE_ID = SystemProperties.getProperty(EPCommonSystemProperties.RESTRICTED_APP_ROLE_ID);
 
  98                 } catch (Exception e) {
 
 102         public List<FunctionalMenuItem> getFunctionalMenuItems(EPUser user) {
 
 103                 List<FunctionalMenuItem> menuItems = new ArrayList<FunctionalMenuItem>();
 
 107         public List<FunctionalMenuItem> getFunctionalMenuItems() {
 
 108                 return getFunctionalMenuItems(false);
 
 111         public List<FunctionalMenuItem> getFunctionalMenuItems(Boolean all) {
 
 112                 // Divide this into 2 queries: one which returns the bottom-level menu items
 
 113                 // associated with Restricted apps,
 
 114                 // and one that returns all the other menu items. Then we can easily add the
 
 116                 // restrictedApp to each FunctionalMenuItem, to be used by the front end.
 
 117                 String activeWhereClause = "";
 
 119                         activeWhereClause = " AND UPPER(m.active_yn) = 'Y' ";
 
 121                 String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id "
 
 122                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
 
 123                                 + activeWhereClause // " AND UPPER(m.active_yn) = 'Y' "
 
 124                                 + " AND r.role_id != '" + RESTRICTED_APP_ROLE_ID + "' " + " UNION "
 
 125                                 + " SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id "
 
 126                                 + " FROM fn_menu_functional m " + " WHERE m.url='' " + activeWhereClause; // " AND UPPER(m.active_yn) =
 
 130                 @SuppressWarnings("unchecked")
 
 131                 List<FunctionalMenuItemWithAppID> menuItemsWithAppIdList = dataAccessService.executeSQLQuery(sql,
 
 132                                 FunctionalMenuItemWithAppID.class, null);
 
 133                 List<FunctionalMenuItem> menuItems = new ArrayList<>();
 
 134                 menuItems = transformFunctionalMenuItemWithAppIDToFunctionalMenuItem(menuItemsWithAppIdList);
 
 135                 for (FunctionalMenuItem menuItem : menuItems) {
 
 136                         menuItem.restrictedApp = false;
 
 139                 sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id "
 
 140                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
 
 141                                 + activeWhereClause // " AND UPPER(m.active_yn) = 'Y' "
 
 142                                 + " AND r.role_id = '" + RESTRICTED_APP_ROLE_ID + "' ";
 
 144                 @SuppressWarnings("unchecked")
 
 145                 List<FunctionalMenuItem> menuItems2 = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
 
 146                 for (FunctionalMenuItem menuItem : menuItems2) {
 
 147                         menuItem.restrictedApp = true;
 
 148                         menuItems.add(menuItem);
 
 154         public List<FunctionalMenuItem> getFunctionalMenuItemsForNotificationTree(Boolean all) {
 
 155                 // Divide this into 2 queries: one which returns the bottom-level menu items
 
 156                 // associated with Restricted apps,
 
 157                 // and one that returns all the other menu items which are active. Then we can
 
 158                 // easily add the boolean flag
 
 159                 // restrictedApp to each FunctionalMenuItem, to be used by the front end.
 
 160                 String activeWhereClause = "";
 
 162                         activeWhereClause = " AND UPPER(m.active_yn) = 'Y' ";
 
 164                 String sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id "
 
 165                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
 
 166                                 + activeWhereClause + " AND UPPER(m.active_yn) = 'Y' " + " AND r.role_id != '" + RESTRICTED_APP_ROLE_ID
 
 168                                 + " SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn,-1 app_id "
 
 169                                 + " FROM fn_menu_functional m " + " WHERE m.url='' " + activeWhereClause
 
 170                                 + " AND UPPER(m.active_yn) = 'Y' ";
 
 173                 @SuppressWarnings("unchecked")
 
 174                 List<FunctionalMenuItemWithAppID> menuItemsWithAppIdList = dataAccessService.executeSQLQuery(sql,
 
 175                                 FunctionalMenuItemWithAppID.class, null);
 
 176                 List<FunctionalMenuItem> menuItems = new ArrayList<>();
 
 177                 menuItems = transformFunctionalMenuItemWithAppIDToFunctionalMenuItem(menuItemsWithAppIdList);
 
 178                 for (FunctionalMenuItem menuItem : menuItems) {
 
 179                         menuItem.restrictedApp = false;
 
 182                 sql = "SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn, r.app_id "
 
 183                                 + "FROM fn_menu_functional m, fn_menu_functional_roles r " + "WHERE m.menu_id = r.menu_id "
 
 184                                 + activeWhereClause + " AND UPPER(m.active_yn) = 'Y' " + " AND r.role_id = '" + RESTRICTED_APP_ROLE_ID
 
 187                 @SuppressWarnings("unchecked")
 
 188                 List<FunctionalMenuItem> menuItems2 = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
 
 189                 for (FunctionalMenuItem menuItem : menuItems2) {
 
 190                         menuItem.restrictedApp = true;
 
 191                         menuItems.add(menuItem);
 
 197         public List<FunctionalMenuItem> getFunctionalMenuItemsForApp(Integer appId) {
 
 198                 String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn "
 
 199                                 + " FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a, fn_menu_functional_roles mr "
 
 200                                 + " WHERE " + " mr.app_id='" + appId + "' " + " AND mr.menu_id = m.menu_id "
 
 201                                 + " AND UPPER(m.active_yn) = 'Y'" + " AND UPPER(m1.active_yn) ='Y'" + " AND a.menu_id = m.menu_id "
 
 202                                 + " AND a.ancestor_menu_id = m1.menu_id";
 
 204                 logger.debug(EELFLoggerDelegate.debugLogger, "getFunctionalMenuItemsForApp: logged the query");
 
 206                 @SuppressWarnings("unchecked")
 
 207                 List<FunctionalMenuItem> menuItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
 
 213          * convert List of FunctionalMenuItemWithAppID into List of FunctionalMenuItem
 
 216         public List<FunctionalMenuItem> transformFunctionalMenuItemWithAppIDToFunctionalMenuItem(
 
 217                         List<FunctionalMenuItemWithAppID> functionalMenuItemWithAppIDList) {
 
 218                 List<FunctionalMenuItem> functionalMenuItemList = new ArrayList<FunctionalMenuItem>();
 
 219                 for (FunctionalMenuItemWithAppID functionalMenuItemWithAppID : functionalMenuItemWithAppIDList) {
 
 220                         FunctionalMenuItem menuItem = new FunctionalMenuItem();
 
 221                         menuItem.menuId = functionalMenuItemWithAppID.menuId;
 
 222                         menuItem.column = functionalMenuItemWithAppID.column;
 
 223                         menuItem.text = functionalMenuItemWithAppID.text;
 
 224                         menuItem.parentMenuId = functionalMenuItemWithAppID.parentMenuId;
 
 225                         menuItem.url = functionalMenuItemWithAppID.url;
 
 226                         menuItem.active_yn = functionalMenuItemWithAppID.active_yn;
 
 227                         menuItem.appid = functionalMenuItemWithAppID.appid;
 
 228                         menuItem.setRoles(functionalMenuItemWithAppID.roles);
 
 229                         menuItem.restrictedApp = functionalMenuItemWithAppID.restrictedApp;
 
 230                         functionalMenuItemList.add(menuItem);
 
 232                 return functionalMenuItemList;
 
 235         public List<FunctionalMenuItem> getFunctionalMenuItemsForUser(String orgUserId) {
 
 236                 // m represents the functional menu items that are the leaf nodes
 
 237                 // m1 represents the functional menu items for all the nodes
 
 239                 // Divide this into 2 queries: one which returns the bottom-level menu items
 
 240                 // associated with Restricted apps,
 
 241                 // and one that returns all the other menu items. Then we can easily add the
 
 243                 // restrictedApp to each FunctionalMenuItem, to be used by the front end.
 
 244                 String sql = "SELECT DISTINCT m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m.active_yn "
 
 245                                 + " FROM fn_menu_functional m, fn_menu_functional m1, fn_menu_functional_ancestors a, "
 
 246                                 + " fn_menu_functional_roles mr, fn_user u , fn_user_role ur " + " WHERE " + " u.org_user_id='"
 
 247                                 + orgUserId + "' " + " AND u.user_id = ur.user_id " + " AND ur.app_id = mr.app_id " +
 
 248                                 // " AND ur.role_id = mr.role_id " +
 
 249                                 " AND (ur.role_id = mr.role_id " + "     OR ur.role_id = '" + ACCOUNT_ADMIN_ROLE_ID + "') "
 
 250                                 + " AND m.menu_id = mr.menu_id " + " AND UPPER(m.active_yn) = 'Y'" + " AND UPPER(m1.active_yn) ='Y' "
 
 251                                 + " AND a.menu_id = m.menu_id " + " AND a.ancestor_menu_id = m1.menu_id " + " UNION "
 
 252                                 // the ancestors of the restricted app menu items
 
 253                                 + " select m1.menu_id, m1.column_num, m1.text, m1.parent_menu_id, m1.url, m1.active_yn "
 
 254                                 + " FROM fn_menu_functional m, fn_menu_functional_roles mr, fn_menu_functional m1, "
 
 255                                 + " fn_menu_functional_ancestors a " + " where a.menu_id = m.menu_id "
 
 256                                 + " AND a.ancestor_menu_id = m1.menu_id " + " AND m.menu_id != m1.menu_id "
 
 257                                 + " AND m.menu_id = mr.menu_id " + " AND mr.role_id = '" + RESTRICTED_APP_ROLE_ID + "' "
 
 258                                 + " AND UPPER(m.active_yn) = 'Y'" + " AND UPPER(m1.active_yn) ='Y' "
 
 259                                 // Add the Favorites menu item
 
 260                                 + " UNION " + " SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn "
 
 261                                 + " FROM fn_menu_functional m "
 
 262                                 + " WHERE m.text in ('Favorites','Get Access','Contact Us','Support','User Guide','Help')";
 
 265                 logger.debug(EELFLoggerDelegate.debugLogger, "getFunctionalMenuItemsForUser: logged the query");
 
 267                 @SuppressWarnings("unchecked")
 
 268                 List<FunctionalMenuItem> menuItems = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
 
 269                 for (FunctionalMenuItem menuItem : menuItems) {
 
 270                         menuItem.restrictedApp = false;
 
 273                 sql = " SELECT m.menu_id, m.column_num, m.text, m.parent_menu_id, m.url, m.active_yn "
 
 274                                 + " FROM fn_menu_functional m, fn_menu_functional_roles r " + " WHERE m.menu_id = r.menu_id "
 
 275                                 + " AND UPPER(m.active_yn) = 'Y' " + " AND r.role_id = '" + RESTRICTED_APP_ROLE_ID + "' ";
 
 277                 @SuppressWarnings("unchecked")
 
 278                 List<FunctionalMenuItem> menuItems2 = dataAccessService.executeSQLQuery(sql, FunctionalMenuItem.class, null);
 
 279                 for (FunctionalMenuItem menuItem : menuItems2) {
 
 280                         menuItem.restrictedApp = true;
 
 281                         menuItems.add(menuItem);
 
 287         public FunctionalMenuItem getFunctionalMenuItemDetails(Long menuid) {
 
 288                 // First, fill in the fields that apply to all menu items
 
 290                 List<FunctionalMenuItem> menuItems = getFunctionalMenuItem(menuid);
 
 291                 FunctionalMenuItem menuItem = (menuItems == null || menuItems.isEmpty() ? null : menuItems.get(0));
 
 292                 // If it is a bottom-level menu item, must fill in the appid and the
 
 294                 List<FunctionalMenuRole> roleItems = getFunctionalMenuRoleWithMenuId(menuid);
 
 295                 if (roleItems.size() > 0 && menuItem != null) {
 
 296                         Integer appid = roleItems.get(0).appId;
 
 297                         menuItem.appid = appid;
 
 298                         List<Integer> roles = new ArrayList<Integer>();
 
 299                         for (FunctionalMenuRole roleItem : roleItems) {
 
 300                                 logger.debug(EELFLoggerDelegate.debugLogger,
 
 301                                                 "LR: app_id: " + roleItem.appId + "; role_id: " + roleItem.roleId + "\n");
 
 302                                 roles.add(roleItem.roleId);
 
 304                         menuItem.setRoles(roles);
 
 310         @SuppressWarnings("unchecked")
 
 311         private List<FunctionalMenuItem> getFunctionalMenuItem(Long menuid) {
 
 312                 List<Criterion> restrictionsList = new ArrayList<Criterion>();
 
 313                 Criterion textCriterion = Restrictions.eq("menuId",menuid);
 
 314                 restrictionsList.add(textCriterion);
 
 315                 return  (List<FunctionalMenuItem>) dataAccessService.getList(FunctionalMenuItem.class, null, restrictionsList, null);
 
 318         @SuppressWarnings("unchecked")
 
 319         private List<FunctionalMenuRole> getFunctionalMenuRoleWithMenuId(Long menuid) {
 
 320                 List<Criterion> restrictionsList = new ArrayList<Criterion>();
 
 321                 Criterion textCriterion = Restrictions.eq("menuId",menuid);
 
 322                 restrictionsList.add(textCriterion);
 
 323                 return  (List<FunctionalMenuRole>) dataAccessService.getList(FunctionalMenuRole.class, null, restrictionsList, null);
 
 326         private FieldsValidator menuItemFieldsChecker(FunctionalMenuItemWithRoles menuItemJson) {
 
 327                 FieldsValidator fieldsValidator = new FieldsValidator();
 
 329                         // TODO: validate all the fields
 
 330                         List<FunctionalMenuItem> functionalMenuItems  = getFunctionalMenuItemWithText(menuItemJson);
 
 331                         boolean dublicatedName = false;
 
 332                         for (FunctionalMenuItem fnMenuItem : functionalMenuItems) {
 
 333                                 if (menuItemJson.menuId != null && menuItemJson.menuId.equals(fnMenuItem.menuId)) {
 
 334                                         // FunctionalMenuItem should not be compared with itself
 
 338                                 if (!dublicatedName && fnMenuItem.text.equalsIgnoreCase(menuItemJson.text)) {
 
 339                                         dublicatedName = true;
 
 343                         if (dublicatedName) {
 
 344                                 fieldsValidator.addProblematicFieldName("text");
 
 345                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_CONFLICT);
 
 346                                 fieldsValidator.errorCode = new Long(EPCommonSystemProperties.DUBLICATED_FIELD_VALUE_ECOMP_ERROR);
 
 347                                 logger.debug(EELFLoggerDelegate.debugLogger,
 
 348                                                 "In menuItemFieldsChecker, Error: we have an duplicate text field");
 
 349                         } else if (StringUtils.isEmpty(menuItemJson.text) && menuItemJson.menuId == null) {
 
 350                                 // text must be non empty for a create. For an edit, can be empty, which means
 
 351                                 // it is a move request.
 
 352                                 // a null menuId indicates a create.
 
 353                                 fieldsValidator.addProblematicFieldName("text");
 
 354                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
 
 355                                 logger.debug(EELFLoggerDelegate.debugLogger,
 
 356                                                 "In menuItemFieldsChecker, Error: we have an empty text field");
 
 358                                 // The url, appid, and roles must either be all filled or all empty.
 
 359                                 Boolean urlIsEmpty = StringUtils.isEmpty(menuItemJson.url);
 
 360                                 Boolean rolesIsEmpty = menuItemJson.getRoles() == null || menuItemJson.getRoles().isEmpty();
 
 361                                 Boolean appidIsEmpty = menuItemJson.appid == null || menuItemJson.appid == 0;
 
 362                                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: menuItemfieldsChecker: urlIsEmpty: " + urlIsEmpty
 
 363                                                 + "; rolesIsEmpty: " + rolesIsEmpty + "; appidIsEmpty: " + appidIsEmpty + "\n");
 
 364                                 if (!((urlIsEmpty && rolesIsEmpty && appidIsEmpty)
 
 365                                                 || (!urlIsEmpty && !rolesIsEmpty && !appidIsEmpty))) {
 
 366                                         fieldsValidator.addProblematicFieldName("url,roles,appid");
 
 367                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
 
 368                                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 369                                                         "In menuItemFieldsChecker, Error: we don't have: either all 3 fields empty or all 3 fields nonempty");
 
 371                                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 372                                                         "In menuItemFieldsChecker, Success: either all 3 fields empty or all 3 fields nonempty");
 
 375                 } catch (Exception e) {
 
 376                         logger.error(EELFLoggerDelegate.errorLogger, "menuItemFieldsChecker failed", e);
 
 377                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 380                 return fieldsValidator;
 
 383         @SuppressWarnings("unchecked")
 
 384         private List<FunctionalMenuItem> getFunctionalMenuItemWithText(FunctionalMenuItemWithRoles menuItemJson) {
 
 385                 List<Criterion> restrictionsList = new ArrayList<Criterion>();
 
 386                 Criterion textCriterion = Restrictions.eq("text",menuItemJson.text);
 
 387                 restrictionsList.add(textCriterion);
 
 388                 return (List<FunctionalMenuItem>) dataAccessService.getList(FunctionalMenuItem.class, null, restrictionsList, null);
 
 391         // Turn foreign key checks on or off
 
 392         protected void setForeignKeys(Session localSession, Boolean on) {
 
 393                 String keyCheck = "0";
 
 397                 String sql = "set FOREIGN_KEY_CHECKS=" + keyCheck;
 
 399                 Query query = localSession.createSQLQuery(sql);
 
 400                 query.executeUpdate();
 
 403         public FieldsValidator createFunctionalMenuItem(FunctionalMenuItemWithRoles menuItemJson) {
 
 404                 FieldsValidator fieldsValidator = menuItemFieldsChecker(menuItemJson);
 
 405                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
 
 406                         logger.debug(EELFLoggerDelegate.debugLogger, "LR: createFunctionalMenuItem: test 1");
 
 407                         boolean result = false;
 
 408                         Session localSession = null;
 
 409                         Transaction transaction = null;
 
 411                                 FunctionalMenuItem menuItem = new FunctionalMenuItem();
 
 412                                 menuItem.appid = menuItemJson.appid;
 
 413                                 menuItem.setRoles(menuItemJson.getRoles());
 
 414                                 menuItem.url = menuItemJson.url;
 
 415                                 menuItem.text = menuItemJson.text;
 
 416                                 menuItem.parentMenuId = menuItemJson.parentMenuId;
 
 417                                 menuItem.active_yn = "Y";
 
 418                                 localSession = sessionFactory.openSession();
 
 420                                 // If the app is disabled, deactivate the menu item.
 
 421                                 if (menuItemJson.appid != null) {
 
 422                                         Long appidLong = Long.valueOf(menuItemJson.appid);
 
 423                                         EPApp app = (EPApp) localSession.get(EPApp.class, appidLong);
 
 424                                         if (app != null && !app.getEnabled()) {
 
 425                                                 menuItem.active_yn = "N";
 
 429                                 // Set the column number to 1 higher than the highest column
 
 430                                 // number under this parent.
 
 431                                 Criteria criteria = localSession.createCriteria(FunctionalMenuItem.class);
 
 432                                 criteria.setProjection(Projections.max("column"));
 
 433                                 criteria.add(Restrictions.eq("parentMenuId", menuItem.parentMenuId));
 
 434                                 Integer maxColumn = (Integer) criteria.uniqueResult();
 
 435                                 if (maxColumn == null) {
 
 438                                 menuItem.column = maxColumn + 1;
 
 439                                 logger.debug(EELFLoggerDelegate.debugLogger, "about to create menu item: " + menuItem.toString());
 
 441                                 transaction = localSession.beginTransaction();
 
 442                                 // localSession.saveOrUpdate(newMenuItem);
 
 443                                 localSession.save(menuItem);
 
 444                                 Long menuid = menuItem.menuId;
 
 445                                 menuItemJson.menuId = menuid;
 
 446                                 logger.debug(EELFLoggerDelegate.debugLogger, "after saving menu object, new id: " + menuid);
 
 448                                 // Next, save all the roles
 
 450                                 addRoles(menuItemJson, localSession);
 
 451                                 transaction.commit();
 
 453                         } catch (Exception e) {
 
 454                                 logger.error(EELFLoggerDelegate.errorLogger, "createFunctionalMenuItem failed", e);
 
 455                                 EcompPortalUtils.rollbackTransaction(transaction,
 
 456                                                 "createFunctionalMenuItem rollback, exception = " + e.toString());
 
 458                                 EcompPortalUtils.closeLocalSession(localSession, "createFunctionalMenuItem");
 
 462                                 logger.debug(EELFLoggerDelegate.debugLogger,
 
 463                                                 "LR: createFunctionalMenuItem: no result. setting httpStatusCode to "
 
 464                                                                 + HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 465                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 468                         logger.error(EELFLoggerDelegate.errorLogger,
 
 469                                         "FunctionalMenuServiceImpl.createFunctionalMenuItem: bad request");
 
 471                 return fieldsValidator;
 
 474         /* Add all the roles in the menu item to the database */
 
 475         public void addRoles(FunctionalMenuItemWithRoles menuItemJson, Session localSession) {
 
 476                 logger.debug(EELFLoggerDelegate.debugLogger, "entering addRoles.");
 
 477                 List<Integer> roles = menuItemJson.getRoles();
 
 478                 if (roles != null && roles.size() > 0) {
 
 479                         Integer appid = menuItemJson.appid;
 
 480                         Long menuid = menuItemJson.menuId;
 
 481                         for (Integer roleid : roles) {
 
 482                                 logger.debug(EELFLoggerDelegate.debugLogger, "about to create record for role: " + roleid);
 
 483                                 FunctionalMenuRole role = new FunctionalMenuRole();
 
 485                                 role.menuId = menuid;
 
 486                                 role.roleId = roleid;
 
 487                                 localSession.save(role);
 
 488                                 logger.debug(EELFLoggerDelegate.debugLogger, "after saving role menu object, new id: " + role.id);
 
 493         /* Delete all the roles associated with the menu item from the database */
 
 494         public void deleteRoles(Long menuId) {
 
 495                 dataAccessService.deleteDomainObjects(FunctionalMenuRole.class, "menu_id='" + menuId + "'", null);
 
 498         /* Delete all favorites associated with the menu item from the database */
 
 499         public void deleteFavorites(Long menuId) {
 
 500                 dataAccessService.deleteDomainObjects(FavoritesFunctionalMenuItem.class, "menu_id='" + menuId + "'", null);
 
 503         private Boolean parentMenuIdEqual(Integer menuId1, Integer menuId2) {
 
 504                 return ((menuId1 == null && menuId2 == null) || (menuId1 != null && menuId1.equals(menuId2)));
 
 507         private void updateColumnForSiblings(Session localSession, Long menuId, Integer oldParentMenuId,
 
 508                         Integer newParentMenuId, Integer oldColumn, Integer newColumn) {
 
 509                 logger.debug(EELFLoggerDelegate.debugLogger, "entering updateColumnForSiblings");
 
 510                 Criteria criteria = localSession.createCriteria(FunctionalMenuItem.class);
 
 511                 criteria.add(Restrictions.ne("menuId", menuId));
 
 512                 if (parentMenuIdEqual(oldParentMenuId, newParentMenuId)) {
 
 513                         logger.debug(EELFLoggerDelegate.debugLogger, "moving under the same parent");
 
 514                         // We are moving to a new position under the same parent
 
 515                         if (newParentMenuId == null) {
 
 516                                 logger.debug(EELFLoggerDelegate.debugLogger, "newParentMenuId is null, so using isNull");
 
 517                                 criteria.add(Restrictions.isNull("parentMenuId"));
 
 519                                 logger.debug(EELFLoggerDelegate.debugLogger, "newParentMenuId is NOT null, so using eq");
 
 520                                 criteria.add(Restrictions.eq("parentMenuId", newParentMenuId));
 
 522                         if (oldColumn > newColumn) {
 
 523                                 logger.debug(EELFLoggerDelegate.debugLogger, "moving to a lower column under the same parent");
 
 524                                 // We are moving to a lower column under the same parent
 
 525                                 criteria.add(Restrictions.ge("column", newColumn));
 
 526                                 criteria.add(Restrictions.lt("column", oldColumn));
 
 527                                 @SuppressWarnings("unchecked")
 
 528                                 List<FunctionalMenuItem> menuItems = criteria.list();
 
 529                                 for (FunctionalMenuItem menuItem : menuItems) {
 
 530                                         menuItem.column += 1;
 
 531                                         localSession.save(menuItem);
 
 533                         } else if (oldColumn < newColumn) {
 
 534                                 logger.debug(EELFLoggerDelegate.debugLogger, "moving to a higher column under the same parent");
 
 535                                 // We are moving to a higher column under the same parent
 
 536                                 criteria.add(Restrictions.gt("column", oldColumn));
 
 537                                 criteria.add(Restrictions.le("column", newColumn));
 
 538                                 @SuppressWarnings("unchecked")
 
 539                                 List<FunctionalMenuItem> menuItems = criteria.list();
 
 540                                 for (FunctionalMenuItem menuItem : menuItems) {
 
 541                                         menuItem.column -= 1;
 
 542                                         localSession.save(menuItem);
 
 545                                 // No info has changed
 
 546                                 logger.debug(EELFLoggerDelegate.debugLogger, "no info has changed, so we are not moving");
 
 549                         logger.debug(EELFLoggerDelegate.debugLogger, "moving under a new parent");
 
 550                         // We are moving under a new parent.
 
 552                         // Adjust the children under the old parent
 
 553                         logger.debug(EELFLoggerDelegate.debugLogger, "about to adjust the children under the old parent");
 
 555                         // If the parentId is null, must check for its children differently
 
 556                         if (oldParentMenuId == null) {
 
 557                                 logger.debug(EELFLoggerDelegate.debugLogger, "oldParentMenuId is null, so using isNull");
 
 558                                 criteria.add(Restrictions.isNull("parentMenuId"));
 
 560                                 logger.debug(EELFLoggerDelegate.debugLogger, "oldParentMenuId is NOT null, so using eq");
 
 561                                 criteria.add(Restrictions.eq("parentMenuId", oldParentMenuId));
 
 564                         criteria.add(Restrictions.gt("column", oldColumn));
 
 565                         @SuppressWarnings("unchecked")
 
 566                         List<FunctionalMenuItem> menuItems1 = criteria.list();
 
 567                         for (FunctionalMenuItem menuItem : menuItems1) {
 
 568                                 menuItem.column -= 1;
 
 569                                 localSession.save(menuItem);
 
 571                         // Adjust the children under the new parent.
 
 572                         logger.debug(EELFLoggerDelegate.debugLogger, "about to adjust the children under the new parent");
 
 573                         logger.debug(EELFLoggerDelegate.debugLogger, "get all menu items where menuId!=" + menuId
 
 574                                         + "; parentMenuId==" + newParentMenuId + "; column>=" + newColumn);
 
 575                         criteria = localSession.createCriteria(FunctionalMenuItem.class);
 
 576                         criteria.add(Restrictions.ne("menuId", menuId));
 
 577                         if (newParentMenuId == null) {
 
 578                                 logger.debug(EELFLoggerDelegate.debugLogger, "newParentMenuId is null, so using isNull");
 
 579                                 criteria.add(Restrictions.isNull("parentMenuId"));
 
 581                                 logger.debug(EELFLoggerDelegate.debugLogger, "newParentMenuId is NOT null, so using eq");
 
 582                                 criteria.add(Restrictions.eq("parentMenuId", newParentMenuId));
 
 585                         criteria.add(Restrictions.ge("column", newColumn));
 
 586                         @SuppressWarnings("unchecked")
 
 587                         List<FunctionalMenuItem> menuItems2 = criteria.list();
 
 588                         if (menuItems2 != null) {
 
 589                                 logger.debug(EELFLoggerDelegate.debugLogger, "found " + menuItems2.size() + " menu items");
 
 591                                 logger.debug(EELFLoggerDelegate.debugLogger, "found null menu items");
 
 593                         for (FunctionalMenuItem menuItem : menuItems2) {
 
 594                                 menuItem.column += 1;
 
 595                                 localSession.save(menuItem);
 
 598                 logger.debug(EELFLoggerDelegate.debugLogger, "done with updateColumnForSiblings");
 
 601         public void removeAppInfo(Session localSession, Long menuId) {
 
 602                 // Remove the url, role, and app info from a menu item
 
 603                 FunctionalMenuItem menuItem = (FunctionalMenuItem) localSession.get(FunctionalMenuItem.class, menuId);
 
 608         public FieldsValidator editFunctionalMenuItem(FunctionalMenuItemWithRoles menuItemJson) {
 
 609                 boolean result = false;
 
 610                 Session localSession = null;
 
 611                 Transaction transaction = null;
 
 612                 Long menuId = menuItemJson.menuId;
 
 614                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: editFunctionalMenuItem: test 1");
 
 615                 FieldsValidator fieldsValidator = menuItemFieldsChecker(menuItemJson);
 
 616                 if (fieldsValidator.httpStatusCode.intValue() == HttpServletResponse.SC_OK) {
 
 617                         // TODO: make sure menuId is here. And, it might not already exist
 
 619                         if (menuId == null) {
 
 620                                 fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_BAD_REQUEST);
 
 621                                 logger.error(EELFLoggerDelegate.errorLogger,
 
 622                                                 "FunctionalMenuServiceImpl.editFunctionalMenuItem: bad request");
 
 624                                 // To simplify the code, assume we will have a transaction
 
 626                                         localSession = sessionFactory.openSession();
 
 627                                         transaction = localSession.beginTransaction();
 
 629                                         // Get the existing info associated with menuItem from the DB
 
 630                                         FunctionalMenuItem menuItem = (FunctionalMenuItem) localSession.get(FunctionalMenuItem.class,
 
 632                                         Integer oldColumn = menuItem.column;
 
 633                                         Integer oldParentMenuId = menuItem.parentMenuId;
 
 634                                         Integer newColumn = menuItemJson.column;
 
 635                                         Integer newParentMenuId = menuItemJson.parentMenuId;
 
 637                                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 638                                                         "prev info: column: " + oldColumn + "; parentMenuId: " + oldParentMenuId);
 
 640                                         if (menuItemJson.appid != null && menuItemJson.getRoles() != null
 
 641                                                         && !menuItemJson.getRoles().isEmpty() && menuItemJson.url != null
 
 642                                                         && !menuItemJson.url.isEmpty() && menuItemJson.text != null
 
 643                                                         && !menuItemJson.text.isEmpty()) {
 
 644                                                 // Scenario: appid, roles, url and text are all non-null.
 
 645                                                 // This menu item is associated with an app.
 
 646                                                 // (Note: this should only occur for a bottom-level menu
 
 647                                                 // item with no children.)
 
 648                                                 // 1) Remove all the records from fn_menu_functional_role
 
 650                                                 // 2) Add records to the fn_menu_function_role table for the
 
 651                                                 // appId and each roleId
 
 652                                                 // 3) Update the url and text for this menu item.
 
 654                                                 // Because of foreign key constraints, delete the roles,
 
 655                                                 // then update the menuItem then add the roles.
 
 657                                                 // Assumption: this is not a Move, so don't change the
 
 658                                                 // parentMenuId and column.
 
 659                                                 menuItem.appid = menuItemJson.appid;
 
 660                                                 menuItem.setRoles(menuItemJson.getRoles());
 
 661                                                 menuItem.url = menuItemJson.url;
 
 662                                                 menuItem.text = menuItemJson.text;
 
 664                                                 // If the app is disabled, deactivate the menu item.
 
 665                                                 Long appidLong = Long.valueOf(menuItemJson.appid);
 
 666                                                 EPApp app = (EPApp) localSession.get(EPApp.class, appidLong);
 
 667                                                 if (app != null && !app.getEnabled()) {
 
 668                                                         menuItem.active_yn = "N";
 
 670                                                         menuItem.active_yn = "Y";
 
 673                                                 localSession.update(menuItem);
 
 674                                                 addRoles(menuItemJson, localSession);
 
 676                                         } else if (menuItemJson.appid == null
 
 677                                                         && (menuItemJson.getRoles() == null || menuItemJson.getRoles().isEmpty())
 
 678                                                         && (menuItemJson.url == null || menuItemJson.url.isEmpty()) && menuItemJson.text != null
 
 679                                                         && !menuItemJson.text.isEmpty()) {
 
 680                                                 // Scenario: appid, roles and url are all null; text is
 
 682                                                 // This menu item is NOT associated with an app.
 
 683                                                 // 1) Remove all the records from fn_menu_functional_role
 
 685                                                 // (in case it was previously associated with an app).
 
 686                                                 // 2) Update the text for this menu item.
 
 687                                                 // 3) Set the url to ""
 
 689                                                 // Assumption: this is not a Move, so don't change the
 
 690                                                 // parentMenuId and column.
 
 691                                                 menuItem.text = menuItemJson.text;
 
 693                                                 menuItem.active_yn = "Y";
 
 694                                                 localSession.update(menuItem);
 
 696                                         } else if (newColumn != null) {
 
 697                                                 // This is a "move" request.
 
 698                                                 // Menu item has been moved to a different position under
 
 699                                                 // the same parent, or under a new parent.
 
 700                                                 logger.debug(EELFLoggerDelegate.debugLogger, "Doing a move operation.");
 
 701                                                 if (parentMenuIdEqual(oldParentMenuId, newParentMenuId)) {
 
 702                                                         // The parent is the same. We have just changed the
 
 704                                                         logger.debug(EELFLoggerDelegate.debugLogger, "moving under the same parent");
 
 705                                                         menuItem.column = newColumn;
 
 706                                                         localSession.update(menuItem);
 
 708                                                         logger.debug(EELFLoggerDelegate.debugLogger, "moving under a different parent");
 
 709                                                         menuItem.parentMenuId = newParentMenuId;
 
 710                                                         menuItem.column = newColumn;
 
 711                                                         localSession.update(menuItem);
 
 712                                                         // If we are moving under a new parent, must delete any
 
 713                                                         // app/role info from
 
 714                                                         // the new parent, since it is no longer a leaf menu
 
 715                                                         // item and cannot have app info
 
 716                                                         // associated with it. The front end will have warned
 
 717                                                         // the user and gotten confirmation.
 
 718                                                         if (menuItemJson.parentMenuId != null) {
 
 719                                                                 Long parentMenuIdLong = new Long(menuItemJson.parentMenuId);
 
 720                                                                 removeAppInfo(localSession, parentMenuIdLong);
 
 721                                                                 // deleteRoles(parentMenuIdLong);
 
 724                                                 // must update the column for all old and new sibling menu
 
 726                                                 updateColumnForSiblings(localSession, menuId, oldParentMenuId, newParentMenuId, oldColumn,
 
 730                                         transaction.commit();
 
 731                                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 732                                                         "LR: editFunctionalMenuItem: finished committing transaction");
 
 734                                 } catch (Exception e) {
 
 735                                         logger.error(EELFLoggerDelegate.errorLogger, "editFunctionalMenuItem failed", e);
 
 736                                         EcompPortalUtils.rollbackTransaction(transaction,
 
 737                                                         "createFunctionalMenuItem rollback, exception = " + e.toString());
 
 739                                         EcompPortalUtils.closeLocalSession(localSession, "editFunctionalMenuItem");
 
 744                                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 745                                                         "LR: createFunctionalMenuItem: no result. setting httpStatusCode to "
 
 746                                                                         + HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 747                                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 752                 return fieldsValidator;
 
 755         public FieldsValidator deleteFunctionalMenuItem(Long menuId) {
 
 756                 FieldsValidator fieldsValidator = new FieldsValidator();
 
 757                 logger.debug(EELFLoggerDelegate.debugLogger, "LR: deleteFunctionalMenuItem: test 1");
 
 758                 boolean result = false;
 
 759                 Session localSession = null;
 
 760                 Transaction transaction = null;
 
 763                         localSession = sessionFactory.openSession();
 
 764                         transaction = localSession.beginTransaction();
 
 765                         // We must turn off foreign keys before deleting a menu item. Otherwise there
 
 767                         // constraint violation from the ancestors table.
 
 768                         setForeignKeys(localSession, false);
 
 770                         logger.debug(EELFLoggerDelegate.debugLogger, "deleteFunctionalMenuItem: after deleting roles");
 
 771                         deleteFavorites(menuId);
 
 772                         logger.debug(EELFLoggerDelegate.debugLogger, "deleteFunctionalMenuItem: after deleting favorites");
 
 773                         localSession.delete(localSession.get(FunctionalMenuItem.class, menuId));
 
 774                         logger.debug(EELFLoggerDelegate.debugLogger, "deleteFunctionalMenuItem: about to commit");
 
 775                         transaction.commit();
 
 777                 } catch (Exception e) {
 
 778                         logger.error(EELFLoggerDelegate.errorLogger, "deleteFunctionalMenuItem failed", e);
 
 779                         EcompPortalUtils.rollbackTransaction(transaction,
 
 780                                         "deleteFunctionalMenuItem rollback, exception = " + e.toString());
 
 782                         EcompPortalUtils.closeLocalSession(localSession, "deleteFunctionalMenuItem");
 
 786                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 787                                         "LR: deleteFunctionalMenuItem: no result. setting httpStatusCode to "
 
 788                                                         + HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 789                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 791                 return fieldsValidator;
 
 794         // Regenerate the fn_menu_functional_ancestors table, which is used
 
 795         // by the queries that return the functional menu items.
 
 796         public FieldsValidator regenerateAncestorTable() {
 
 797                 FieldsValidator fieldsValidator = new FieldsValidator();
 
 798                 Session localSession = null;
 
 799                 Transaction transaction = null;
 
 802                         localSession = sessionFactory.openSession();
 
 803                         transaction = localSession.beginTransaction();
 
 804                         String sql = "DELETE FROM fn_menu_functional_ancestors";
 
 806                         Query query = localSession.createSQLQuery(sql);
 
 807                         query.executeUpdate();
 
 808                         logger.debug(EELFLoggerDelegate.debugLogger, "regenerateAncestorTable: finished query 1");
 
 810                         sql = "ALTER TABLE fn_menu_functional_ancestors AUTO_INCREMENT=1";
 
 812                         query = localSession.createSQLQuery(sql);
 
 813                         query.executeUpdate();
 
 814                         logger.debug(EELFLoggerDelegate.debugLogger, "regenerateAncestorTable: reset AUTO_INCREMENT to 1");
 
 817                         sql = "INSERT INTO fn_menu_functional_ancestors(menu_id, ancestor_menu_id, depth) "
 
 818                                         + "SELECT m.menu_id, m.menu_id, " + depth + " FROM fn_menu_functional m";
 
 820                         query = localSession.createSQLQuery(sql);
 
 821                         query.executeUpdate();
 
 822                         logger.debug(EELFLoggerDelegate.debugLogger, "regenerateAncestorTable: finished query 2");
 
 823                         for (depth = 0; depth < 3; depth++) {
 
 824                                 int depthPlusOne = depth + 1;
 
 825                                 sql = "INSERT INTO fn_menu_functional_ancestors(menu_id, ancestor_menu_id, depth) "
 
 826                                                 + " SELECT a.menu_id, m.parent_menu_id, " + depthPlusOne
 
 827                                                 + " FROM fn_menu_functional m, fn_menu_functional_ancestors a " + " WHERE a.depth='" + depth
 
 828                                                 + "' AND " + " a.ancestor_menu_id = m.menu_id AND " + " m.parent_menu_id != '-1'";
 
 830                                 query = localSession.createSQLQuery(sql);
 
 831                                 query.executeUpdate();
 
 833                         logger.debug(EELFLoggerDelegate.debugLogger, "regenerateAncestorTable: finished query 3");
 
 834                         transaction.commit();
 
 835                 } catch (Exception e) {
 
 836                         logger.error(EELFLoggerDelegate.errorLogger, "regenerateAncestorTable failed", e);
 
 837                         EcompPortalUtils.rollbackTransaction(transaction,
 
 838                                         "regenerateAncestorTable rollback, exception = " + e.toString());
 
 839                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 841                         EcompPortalUtils.closeLocalSession(localSession, "regenerateAncestorTable");
 
 843                 return fieldsValidator;
 
 846         private void logQuery(String sql) {
 
 847                 logger.debug(EELFLoggerDelegate.debugLogger, "Executing query: " + sql);
 
 850         public FieldsValidator setFavoriteItem(FavoritesFunctionalMenuItem menuItemJson) {
 
 851                 boolean result = false;
 
 852                 FieldsValidator fieldsValidator = new FieldsValidator();
 
 854                 Session localSession = null;
 
 855                 Transaction transaction = null;
 
 858                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 859                                         String.format("Before adding favorite for user id:{0} and menu id:{1} ", menuItemJson.userId,
 
 860                                                         menuItemJson.menuId));
 
 861                         localSession = sessionFactory.openSession();
 
 862                         transaction = localSession.beginTransaction();
 
 863                         localSession.save(menuItemJson);
 
 864                         transaction.commit();
 
 866                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 867                                         String.format("After adding favorite for user id:{0} and menu id:{1} ", menuItemJson.userId,
 
 868                                                         menuItemJson.menuId));
 
 869                 } catch (Exception e) {
 
 870                         logger.error(EELFLoggerDelegate.errorLogger, "setFavoriteItem failed", e);
 
 871                         EcompPortalUtils.rollbackTransaction(transaction, "setFavoriteItem rollback, exception = " + e.toString());
 
 873                         EcompPortalUtils.closeLocalSession(localSession, "setFavoriteItem");
 
 878                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 881                 return fieldsValidator;
 
 884         public List<FavoritesFunctionalMenuItemJson> getFavoriteItems(Long userId) {
 
 886                         logger.debug(EELFLoggerDelegate.debugLogger, "Before getting favorites for user id: " + userId);
 
 888                         // Divide this into 2 queries: one which returns the favorites items associated
 
 889                         // with Restricted apps,
 
 890                         // and one that returns all the other favorites items. Then we can easily add
 
 892                         // restrictedApp to each FavoritesFunctionalMenuItemJson, to be used by the
 
 895                         String sql = "SELECT f.user_id,f.menu_id,m.text,m.url "
 
 896                                         + " FROM fn_menu_favorites f, fn_menu_functional m, fn_menu_functional_roles mr "
 
 897                                         + " WHERE f.user_id='" + userId + "' AND f.menu_id = m.menu_id " + " AND f.menu_id = mr.menu_id "
 
 898                                         + " AND mr.role_id = '" + RESTRICTED_APP_ROLE_ID + "' ";
 
 900                         @SuppressWarnings("unchecked")
 
 901                         List<FavoritesFunctionalMenuItemJson> menuItems = dataAccessService.executeSQLQuery(sql,
 
 902                                         FavoritesFunctionalMenuItemJson.class, null);
 
 903                         for (FavoritesFunctionalMenuItemJson menuItem : menuItems) {
 
 904                                 menuItem.restrictedApp = true;
 
 907                         sql = "SELECT DISTINCT f.user_id,f.menu_id,m.text,m.url "
 
 908                                         + " FROM fn_menu_favorites f, fn_menu_functional m, fn_menu_functional_roles mr "
 
 909                                         + " WHERE f.user_id='" + userId + "' AND f.menu_id = m.menu_id " + " AND f.menu_id = mr.menu_id "
 
 910                                         + " AND mr.role_id != '" + RESTRICTED_APP_ROLE_ID + "' ";
 
 911                         @SuppressWarnings("unchecked")
 
 912                         List<FavoritesFunctionalMenuItemJson> menuItems2 = dataAccessService.executeSQLQuery(sql,
 
 913                                         FavoritesFunctionalMenuItemJson.class, null);
 
 914                         for (FavoritesFunctionalMenuItemJson menuItem : menuItems2) {
 
 915                                 menuItem.restrictedApp = false;
 
 916                                 menuItems.add(menuItem);
 
 920                 } catch (Exception e) {
 
 921                         logger.error(EELFLoggerDelegate.errorLogger, "getFavoriteItems failed", e);
 
 922                         List<FavoritesFunctionalMenuItemJson> menuItems = new ArrayList<FavoritesFunctionalMenuItemJson>();
 
 927         public FieldsValidator removeFavoriteItem(Long userId, Long menuId) {
 
 928                 boolean result = false;
 
 929                 FieldsValidator fieldsValidator = new FieldsValidator();
 
 931                 Session localSession = null;
 
 932                 Transaction transaction = null;
 
 936                         FavoritesFunctionalMenuItem menuItemJson = new FavoritesFunctionalMenuItem();
 
 937                         menuItemJson.userId = userId;
 
 938                         menuItemJson.menuId = menuId;
 
 940                         localSession = sessionFactory.openSession();
 
 941                         transaction = localSession.beginTransaction();
 
 942                         localSession.delete(menuItemJson);
 
 943                         localSession.flush();
 
 944                         transaction.commit();
 
 946                         logger.debug(EELFLoggerDelegate.debugLogger,
 
 947                                         String.format("After removing favorite for user id: " + userId + "; menu id: " + menuId));
 
 948                 } catch (Exception e) {
 
 949                         logger.error(EELFLoggerDelegate.errorLogger, "removeFavoriteItem failed", e);
 
 950                         EcompPortalUtils.rollbackTransaction(transaction,
 
 951                                         "removeFavoriteItem rollback, exception = " + e.toString());
 
 953                         EcompPortalUtils.closeLocalSession(localSession, "removeFavoriteItem");
 
 958                         fieldsValidator.httpStatusCode = new Long(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
 
 961                 return fieldsValidator;
 
 965         public void assignHelpURLs(List<FunctionalMenuItem> menuItems) {
 
 967                         String user_guide_link = SystemProperties.getProperty(EPCommonSystemProperties.USER_GUIDE_URL);
 
 969                         for (FunctionalMenuItem menuItem : menuItems) {
 
 970                                 if (menuItem.text.equalsIgnoreCase("Contact Us")) {
 
 971                                         menuItem.setUrl("contactUs");
 
 972                                         // menuItem.setRestrictedApp(true);
 
 974                                 if (menuItem.text.equalsIgnoreCase("Get Access")) {
 
 975                                         menuItem.setUrl("getAccess");
 
 977                                 if (menuItem.text.equalsIgnoreCase("User Guide")) {
 
 978                                         menuItem.setUrl(user_guide_link);
 
 979                                         menuItem.setRestrictedApp(true);
 
 982                 } catch (Exception e) {
 
 983                         logger.error(EELFLoggerDelegate.errorLogger, "assignHelpURLs process failed", e);
 
 988         public List<FunctionalMenuRole> getFunctionalMenuRole() {
 
 989                 String sql = "SELECT * from fn_menu_functional_roles";
 
 991                 logger.debug(EELFLoggerDelegate.debugLogger, "getFunctionalMenuRole: logged the query");
 
 993                 @SuppressWarnings("unchecked")
 
 994                 List<FunctionalMenuRole> functionalMenuRole = dataAccessService.executeSQLQuery(sql, FunctionalMenuRole.class,
 
 997                 return functionalMenuRole;
 
1000         @SuppressWarnings("unchecked")
 
1002         public List<BusinessCardApplicationRole> getUserAppRolesList(String userId) {
 
1003                 Map<String, String> params = new HashMap<>();
 
1004                 params.put("userId", userId);
 
1006                 List<BusinessCardApplicationRole> userAppRoles = null;
 
1008                         userAppRoles = dataAccessService.executeNamedQuery("getUserApproles", params, null);
 
1009                 } catch (Exception e) {
 
1010                         // TODO Auto-generated catch block
 
1011                         logger.error(EELFLoggerDelegate.errorLogger, "getUserAppRolesList failed", e);
 
1013                 return userAppRoles;