[PORTAL-16 PORTAL-18] Widget ms; staging
[portal.git] / ecomp-portal-BE-common / src / main / java / org / openecomp / portalapp / portal / controller / FunctionalMenuController.java
index de71766..490a182 100644 (file)
-/*-\r
- * ================================================================================\r
- * ECOMP Portal\r
- * ================================================================================\r
- * Copyright (C) 2017 AT&T Intellectual Property\r
- * ================================================================================\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- * \r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- * \r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- * ================================================================================\r
- */\r
-package org.openecomp.portalapp.portal.controller;\r
-\r
-import java.io.IOException;\r
-import java.text.SimpleDateFormat;\r
-import java.util.ArrayList;\r
-import java.util.Collections;\r
-import java.util.Comparator;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import javax.servlet.http.HttpServletRequest;\r
-import javax.servlet.http.HttpServletResponse;\r
-\r
-import org.apache.cxf.transport.http.HTTPException;\r
-import org.json.JSONObject;\r
-import org.springframework.beans.factory.annotation.Autowired;\r
-import org.springframework.context.annotation.EnableAspectJAutoProxy;\r
-import org.springframework.web.bind.annotation.PathVariable;\r
-import org.springframework.web.bind.annotation.RequestBody;\r
-import org.springframework.web.bind.annotation.RequestMapping;\r
-import org.springframework.web.bind.annotation.RequestMethod;\r
-import org.springframework.web.bind.annotation.RequestParam;\r
-import org.springframework.web.bind.annotation.RestController;\r
-\r
-import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;\r
-import org.openecomp.portalsdk.core.service.UserProfileService;\r
-import org.openecomp.portalapp.controller.EPRestrictedBaseController;\r
-import org.openecomp.portalapp.portal.domain.EPUser;\r
-import org.openecomp.portalapp.portal.domain.SharedContext;\r
-import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;\r
-import org.openecomp.portalapp.portal.service.AdminRolesService;\r
-import org.openecomp.portalapp.portal.service.EPAuditService;\r
-import org.openecomp.portalapp.portal.service.FunctionalMenuService;\r
-import org.openecomp.portalapp.portal.service.SearchService;\r
-import org.openecomp.portalapp.portal.service.SharedContextService;\r
-import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;\r
-import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRolesList;\r
-import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItem;\r
-import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;\r
-import org.openecomp.portalapp.portal.transport.FieldsValidator;\r
-import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;\r
-import org.openecomp.portalapp.portal.transport.FunctionalMenuItemWithRoles;\r
-import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;\r
-import org.openecomp.portalapp.portal.utils.EcompPortalUtils;\r
-import org.openecomp.portalapp.util.EPUserUtils;\r
-\r
-/**\r
- * Supports menus at the top of the Portal app landing page.\r
- */\r
-@RestController\r
-@org.springframework.context.annotation.Configuration\r
-@EnableAspectJAutoProxy\r
-@EPAuditLog\r
-public class FunctionalMenuController extends EPRestrictedBaseController {\r
-       EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FunctionalMenuController.class);\r
-\r
-       @Autowired\r
-       AdminRolesService adminRolesService;\r
-       @Autowired\r
-       FunctionalMenuService functionalMenuService;\r
-       @Autowired\r
-       SharedContextService sharedContextService;\r
-       @Autowired\r
-       UserProfileService service;\r
-       @Autowired\r
-       SearchService searchService;\r
-       @Autowired\r
-       EPAuditService epAuditService;\r
-\r
-       /**\r
-        * RESTful service method to fetch all the FunctionalMenuItems.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = { "/portalApi/functionalMenu" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItems(HttpServletRequest request, HttpServletResponse response) {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       menuItems = functionalMenuService.getFunctionalMenuItems();\r
-                       functionalMenuService.assignHelpURLs(menuItems);\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenu", "result =", menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenu. Details: " + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-               return menuItems;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to fetch all the FunctionalMenuItems, both active\r
-        * and inactive, for the EditFunctionalMenu feature. Can only be accessed by\r
-        * the portal admin.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuForEditing" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItemsForEditing(HttpServletRequest request, HttpServletResponse response) {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       if (!adminRolesService.isSuperAdmin(user)) {\r
-                               EcompPortalUtils.setBadPermissions(user, response, "getFunctionalMenuItemDetails");\r
-                       } else {\r
-                               menuItems = functionalMenuService.getFunctionalMenuItems(true);\r
-                       }\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForEditing", "result =", menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenuForEditing. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-               return menuItems;\r
-       }\r
-       \r
-       /**\r
-        * RESTful service method to fetch all the FunctionalMenuItems,  active\r
-        *, for the Functional menu in notification Tree feature.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuForNotificationTree" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItemsForNotifications(HttpServletRequest request, HttpServletResponse response) {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       menuItems = functionalMenuService.getFunctionalMenuItemsForNotificationTree(true);\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForNotificationTree", "result =", menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenuForNotifications. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-               return menuItems;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to fetch all FunctionalMenuItems associated with\r
-        * an application.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuForApp/{appId}" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItemsForApp(HttpServletRequest request, @PathVariable("appId") Integer appId)\r
-                       throws HTTPException {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       menuItems = functionalMenuService.getFunctionalMenuItemsForApp(appId);\r
-                       functionalMenuService.assignHelpURLs(menuItems);\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForApp/" + appId, "result =", menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenuForApp. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-               return menuItems;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to fetch all FunctionalMenuItems associated with\r
-        * the applications and roles that a user has access to.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuForUser/{orgUserId}" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItemsForUser(HttpServletRequest request,\r
-                       @PathVariable("orgUserId") String orgUserId) throws HTTPException {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       menuItems = functionalMenuService.getFunctionalMenuItemsForUser(orgUserId);\r
-                       functionalMenuService.assignHelpURLs(menuItems);\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForUser/" + orgUserId, "result =", menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenuForUser. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-\r
-               return menuItems;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to fetch all FunctionalMenuItems associated with\r
-        * the applications and roles that the authenticated user has access to.\r
-        * \r
-        * @return List of FunctionalMenuItem objects\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuForAuthUser" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FunctionalMenuItem> getMenuItemsForAuthUser(HttpServletRequest request, HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               List<FunctionalMenuItem> menuItems = null;\r
-               try {\r
-                       if (user == null) {\r
-                               EcompPortalUtils.setBadPermissions(user, response, "getMenuItemsForAuthUser");\r
-                       } else if (adminRolesService.isSuperAdmin(user)) {\r
-                               menuItems = functionalMenuService.getFunctionalMenuItems();\r
-                       } else {\r
-                               // calculate the menu items\r
-                               String orgUserId = user.getOrgUserId();\r
-                               menuItems = functionalMenuService.getFunctionalMenuItemsForUser(orgUserId);\r
-                               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForUser/" + orgUserId, "result =",\r
-                                               menuItems);\r
-                       }\r
-                       functionalMenuService.assignHelpURLs(menuItems);\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling getMenuItemsForAuthUser. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-               return menuItems;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to fetch the details for a functional menu item.\r
-        * Requirement: you must be the Ecomp portal super admin user.\r
-        * \r
-        * @return FunctionalMenuItem object\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuItemDetails/{menuId}" }, method = RequestMethod.GET, produces = "application/json")\r
-       public FunctionalMenuItem getFunctionalMenuItemDetails(HttpServletRequest request,\r
-                       @PathVariable("menuId") Integer menuId, HttpServletResponse response) throws HTTPException {\r
-               // TODO: return FunctionalMenuItemJson\r
-               // TODO: modify FunctionalMenuItem to not include the transient fields\r
-               FunctionalMenuItem menuItem = null;\r
-               try {\r
-                       EPUser user = EPUserUtils.getUserSession(request);\r
-                       if (!adminRolesService.isSuperAdmin(user)) {\r
-                               EcompPortalUtils.setBadPermissions(user, response, "getFunctionalMenuItemDetails");\r
-                       } else {\r
-                               menuItem = functionalMenuService.getFunctionalMenuItemDetails(menuId);\r
-                               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItemDetails/" + menuId, "result =",\r
-                                               menuItem);\r
-                       }\r
-               } catch (Exception e) {\r
-                       logger.error(EELFLoggerDelegate.errorLogger,\r
-                                       "Exception occurred while calling functionalMenuItemDetails. Details: "\r
-                                                       + EcompPortalUtils.getStackTrace(e));\r
-               }\r
-\r
-               return menuItem;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to create a new menu item.\r
-        * \r
-        * Requirement: you must be the Ecomp portal super admin user.\r
-        */\r
-       @RequestMapping(value = { "/portalApi/functionalMenuItem" }, method = RequestMethod.POST)\r
-       public FieldsValidator createFunctionalMenuItem(HttpServletRequest request,\r
-                       @RequestBody FunctionalMenuItemWithRoles menuItemJson, HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-               if (!adminRolesService.isSuperAdmin(user)) {\r
-                       logger.debug(EELFLoggerDelegate.debugLogger,\r
-                                       "FunctionalMenuController.createFunctionalMenuItem bad permissions");\r
-                       EcompPortalUtils.setBadPermissions(user, response, "createFunctionalMenuItem");\r
-               } else {\r
-                       fieldsValidator = functionalMenuService.createFunctionalMenuItem(menuItemJson);\r
-                       response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "POST result =",\r
-                                       response.getStatus());\r
-               }\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to update an existing menu item\r
-        * \r
-        * Requirement: you must be the Ecomp portal super admin user.\r
-        * \r
-        * @return FieldsValidator\r
-        */\r
-       @RequestMapping(value = { "/portalApi/functionalMenuItem" }, method = RequestMethod.PUT)\r
-       public FieldsValidator editFunctionalMenuItem(HttpServletRequest request,\r
-                       @RequestBody FunctionalMenuItemWithRoles menuItemJson, HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-               if (!adminRolesService.isSuperAdmin(user)) {\r
-                       EcompPortalUtils.setBadPermissions(user, response, "editFunctionalMenuItem");\r
-               } else {\r
-                       fieldsValidator = functionalMenuService.editFunctionalMenuItem(menuItemJson);\r
-                       response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "PUT result =",\r
-                                       response.getStatus());\r
-               }\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESTful service method to delete a menu item\r
-        * \r
-        * @return FieldsValidator\r
-        */\r
-       @RequestMapping(value = { "/portalApi/functionalMenuItem/{menuId}" }, method = RequestMethod.DELETE)\r
-       public FieldsValidator deleteFunctionalMenuItem(HttpServletRequest request, @PathVariable("menuId") Long menuId,\r
-                       HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-               if (!adminRolesService.isSuperAdmin(user)) {\r
-                       EcompPortalUtils.setBadPermissions(user, response, "deleteFunctionalMenuItem");\r
-               } else {\r
-                       fieldsValidator = functionalMenuService.deleteFunctionalMenuItem(menuId);\r
-                       response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "DELETE result =",\r
-                                       response.getStatus());\r
-               }\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESTful service to regenerate table\r
-        * \r
-        * @param request\r
-        * @param response\r
-        * \r
-        * @return FieldsValidator\r
-        */\r
-       @RequestMapping(value = { "/portalApi/regenerateFunctionalMenuAncestors" }, method = RequestMethod.GET)\r
-       public FieldsValidator regenerateAncestorTable(HttpServletRequest request, HttpServletResponse response) {\r
-               // TODO: should only the superuser be allowed to use this API?\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-\r
-               if (!adminRolesService.isSuperAdmin(user)) {\r
-                       EcompPortalUtils.setBadPermissions(user, response, "deleteFunctionalMenuItem");\r
-               } else {\r
-                       fieldsValidator = functionalMenuService.regenerateAncestorTable();\r
-                       response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/regenerateAncestorTable", "GET result =",\r
-                                       response.getStatus());\r
-               }\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESful service to set a favorite item.\r
-        * \r
-        * @return FieldsValidator\r
-        */\r
-       @RequestMapping(value = { "/portalApi/setFavoriteItem" }, method = RequestMethod.POST)\r
-       public FieldsValidator addFavoriteItem(HttpServletRequest request,\r
-                       @RequestBody FavoritesFunctionalMenuItem menuItemJson, HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-               menuItemJson.userId = user.getId();\r
-               fieldsValidator = functionalMenuService.setFavoriteItem(menuItemJson);\r
-               response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/setFavoriteItem", "Post result =", response.getStatus());\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESTful service to get favorites for the current user as identified in\r
-        * the session\r
-        * \r
-        * @return List of FavoritesFunctionalMenuItemJson\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/getFavoriteItems" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<FavoritesFunctionalMenuItemJson> getFavoritesForUser(HttpServletRequest request,\r
-                       HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               List<FavoritesFunctionalMenuItemJson> favorites = functionalMenuService.getFavoriteItems(user.getId());\r
-               FieldsValidator fieldsValidator = new FieldsValidator();\r
-               response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/getFavoriteItems", "GET result =", response.getStatus());\r
-               return favorites;\r
-       }\r
-\r
-       /**\r
-        * RESTful service to delete a favorite menu item for the current user as\r
-        * identified in the session.\r
-        * \r
-        * @return FieldsValidator\r
-        */\r
-       @RequestMapping(value = { "/portalApi/removeFavoriteItem/{menuId}" }, method = RequestMethod.DELETE)\r
-       public FieldsValidator deleteFavoriteItem(HttpServletRequest request, @PathVariable("menuId") Long menuId,\r
-                       HttpServletResponse response) {\r
-               EPUser user = EPUserUtils.getUserSession(request);\r
-               FieldsValidator fieldsValidator = null;\r
-               Long userId = user.getId();\r
-               fieldsValidator = functionalMenuService.removeFavoriteItem(userId, menuId);\r
-               response.setStatus(fieldsValidator.httpStatusCode.intValue());\r
-               EcompPortalUtils.logAndSerializeObject(logger, "/deleteFavoriteItem", "DELETE result =", response.getStatus());\r
-\r
-               return fieldsValidator;\r
-       }\r
-\r
-       /**\r
-        * RESTful service to get user information: user's first and last names, ATT\r
-        * UID, email and last-login. (Actually has nothing to do with the real\r
-        * functional menu.) First attempts to get the information from the Tomcat\r
-        * session (i.e., the CSP cookie); if that fails, calls the shared context\r
-        * service to read the information from the database. Gives back what it\r
-        * found, any of which may be null, as a JSON collection.\r
-        * \r
-        * @return JSON collection of key-value pairs shown below.\r
-        */\r
-       @RequestMapping(value = {\r
-                       "/portalApi/functionalMenuStaticInfo" }, method = RequestMethod.GET, produces = "application/json")\r
-       public String getFunctionalMenuStaticInfo(HttpServletRequest request, HttpServletResponse response) {\r
-\r
-               // Get user details from session\r
-               logger.debug(EELFLoggerDelegate.debugLogger, "getFunctionalMenuStaticInfo: getting user info");\r
-               String fnMenuStaticResponse = null;\r
-               try {                   \r
-                       String orgUserIdStr = null, firstNameStr = null, lastNameStr = null, emailStr = null, lastLogin = null;\r
-                       EPUser user = EPUserUtils.getUserSession(request);\r
-                       firstNameStr = user.getFirstName();\r
-                       lastNameStr = user.getLastName();\r
-                       orgUserIdStr = user.getOrgUserId();\r
-                       emailStr = user.getEmail();\r
-                       if (emailStr == null || emailStr.equals("")) {\r
-                               EPUser userResult = searchService.searchUserByUserId(orgUserIdStr);\r
-                               emailStr = userResult.getEmail();\r
-                       }\r
-                       SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssZ");\r
-                       Date lastLoginDate = user.getLastLoginDate();\r
-                       if (lastLoginDate == null) {\r
-                               // should never happen\r
-                               logger.error(EELFLoggerDelegate.errorLogger, "getFunctionalMenuStaticInfo: no last login in session");\r
-                               lastLogin = "no last login available";\r
-                       }\r
-                       else {\r
-                               lastLogin = sdf.format(lastLoginDate);\r
-                       }\r
-                       \r
-                       // If any item is missing from session, try the Shared Context\r
-                       // service.\r
-                       SharedContext orgUserIdSC = null, firstNameSC = null, lastNameSC = null, emailSC = null;\r
-                       String sessionId = request.getSession().getId();\r
-                       if (firstNameStr == null)\r
-                               firstNameSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_FIRST_NAME);\r
-                       if (lastNameStr == null)\r
-                               lastNameSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_LAST_NAME);\r
-                       if (emailStr == null)\r
-                               emailSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_EMAIL);\r
-                       if (orgUserIdStr == null)\r
-                               orgUserIdSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_ORG_USERID);\r
-\r
-                       // Build the response\r
-                       Map<String, String> map = new HashMap<String, String>();\r
-                       map.put("firstName",\r
-                                       firstNameStr != null ? firstNameStr : (firstNameSC != null ? firstNameSC.getCvalue() : null));\r
-                       map.put("lastName",\r
-                                       lastNameStr != null ? lastNameStr : (lastNameSC != null ? lastNameSC.getCvalue() : null));\r
-                       map.put("email", emailStr != null ? emailStr : (emailSC != null ? emailSC.getCvalue() : null));\r
-                       map.put("userId", orgUserIdStr != null ? orgUserIdStr : (orgUserIdSC != null ? orgUserIdSC.getCvalue() : null));\r
-                       map.put("last_login", lastLogin);\r
-                       JSONObject j = new JSONObject(map);\r
-                       fnMenuStaticResponse = j.toString();\r
-                       // Be chatty in the log\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuStaticInfo", "GET result =",\r
-                                       fnMenuStaticResponse);\r
-               } catch (Exception e) {\r
-                       // Should never happen.\r
-                       logger.error(EELFLoggerDelegate.errorLogger, "getFunctionalMenuStaticInfo failed", e);\r
-                       // Return a real error?\r
-                       // fnMenuStaticResponse = "{ \"status\": \"error\", \"message\": \""\r
-                       // + e.toString() + "\" }";\r
-                       // But the angular controller expects null on error.\r
-               }\r
-               return fnMenuStaticResponse;\r
-       }\r
-       \r
-       private Comparator<BusinessCardApplicationRole> getUserAppRolesComparator = new Comparator<BusinessCardApplicationRole>() {\r
-               public int compare(BusinessCardApplicationRole o1, BusinessCardApplicationRole o2) {\r
-                       return o1.getAppName().compareTo(o2.getAppName());\r
-               }\r
-       };\r
-\r
-       @RequestMapping(value = {\r
-                       "/portalApi/userApplicationRoles" }, method = RequestMethod.GET, produces = "application/json")\r
-       public List<BusinessCardApplicationRolesList> getAppList(HttpServletRequest request,@RequestParam("userId") String userId) throws IOException {\r
-\r
-               \r
-               List<BusinessCardApplicationRolesList> AppRoles = null;\r
-               try {\r
-                       List<BusinessCardApplicationRole> userAppRoleList = functionalMenuService.getUserAppRolesList(userId);\r
-                       \r
-                       Collections.sort(userAppRoleList, getUserAppRolesComparator);\r
-                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/userApplicationRoles", "result =", userAppRoleList);\r
-                       \r
-                        AppRoles = new ArrayList<BusinessCardApplicationRolesList>();     \r
-                       for(BusinessCardApplicationRole userAppRole: userAppRoleList)\r
-                       {    \r
-                                 boolean found = false;\r
-                             List<String> roles = null;\r
-                            \r
-                               for(BusinessCardApplicationRolesList app :AppRoles)\r
-                               {       \r
-                                       if(app.getAppName().equals(userAppRole.getAppName()))\r
-                                       {\r
-                                               roles= app.getRoleNames();\r
-                                               roles.add(userAppRole.getRoleName());\r
-                                               app.setRoleNames(roles);\r
-                                               found = true;   \r
-                                               break;  \r
-                                       }\r
-                               }\r
-                               \r
-                               if(!found)\r
-                               {\r
-                               roles = new ArrayList<String>();        \r
-                               roles.add(userAppRole.getRoleName());\r
-                               AppRoles.add(new BusinessCardApplicationRolesList(userAppRole.getAppName(), roles));\r
-                               }       \r
-                               \r
-                               Collections.sort(roles);\r
-                       }\r
-               } catch (Exception e) {\r
-                       // TODO Auto-generated catch block\r
-                       logger.error(EELFLoggerDelegate.errorLogger, "getAppList failed", e);\r
-               }\r
-\r
-       return  AppRoles;\r
-\r
-       }\r
-}\r
+/*-
+ * ================================================================================
+ * ECOMP Portal
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ================================================================================
+ */
+package org.openecomp.portalapp.portal.controller;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.json.JSONObject;
+import org.openecomp.portalapp.controller.EPRestrictedBaseController;
+import org.openecomp.portalapp.portal.domain.EPUser;
+import org.openecomp.portalapp.portal.domain.SharedContext;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestResponse;
+import org.openecomp.portalapp.portal.ecomp.model.PortalRestStatusEnum;
+import org.openecomp.portalapp.portal.logging.aop.EPAuditLog;
+import org.openecomp.portalapp.portal.service.AdminRolesService;
+import org.openecomp.portalapp.portal.service.FunctionalMenuService;
+import org.openecomp.portalapp.portal.service.SearchService;
+import org.openecomp.portalapp.portal.service.SharedContextService;
+import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRole;
+import org.openecomp.portalapp.portal.transport.BusinessCardApplicationRolesList;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FavoritesFunctionalMenuItemJson;
+import org.openecomp.portalapp.portal.transport.FieldsValidator;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItem;
+import org.openecomp.portalapp.portal.transport.FunctionalMenuItemWithRoles;
+import org.openecomp.portalapp.portal.utils.EPCommonSystemProperties;
+import org.openecomp.portalapp.portal.utils.EcompPortalUtils;
+import org.openecomp.portalapp.util.EPUserUtils;
+import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.openecomp.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Supports menus at the top of the Portal app landing page.
+ */
+@RestController
+@org.springframework.context.annotation.Configuration
+@EnableAspectJAutoProxy
+@EPAuditLog
+public class FunctionalMenuController extends EPRestrictedBaseController {
+
+       private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FunctionalMenuController.class);
+
+       @Autowired
+       private AdminRolesService adminRolesService;
+       @Autowired
+       private FunctionalMenuService functionalMenuService;
+       @Autowired
+       private SharedContextService sharedContextService;
+       @Autowired
+       private SearchService searchService;
+
+       /**
+        * RESTful service method to fetch all the FunctionalMenuItems.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = { "/portalApi/functionalMenu" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItems(HttpServletRequest request, HttpServletResponse response) {
+               // TODO: should only the superuser be allowed to use this API?
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       menuItems = functionalMenuService.getFunctionalMenuItems();
+                       functionalMenuService.assignHelpURLs(menuItems);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenu", "result =", menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenu. Details: " + EcompPortalUtils.getStackTrace(e));
+               }
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to get ECOMP Portal Title.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return PortalRestResponse of ECOMP portal title
+        */
+       @RequestMapping(value = { "/portalApi/ecompTitle" }, method = RequestMethod.GET, produces = "application/json")
+       public PortalRestResponse<String> getECOMPTitle(HttpServletRequest request, HttpServletResponse response) {
+               PortalRestResponse<String> portalRestResponse = null;
+               try {
+                       String ecompTitle = SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME);
+                       portalRestResponse = new PortalRestResponse<String>(PortalRestStatusEnum.OK, "success", ecompTitle);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/ecompTitle", "result =", ecompTitle);
+               } catch (Exception e) {
+                       portalRestResponse = new PortalRestResponse<String>(PortalRestStatusEnum.ERROR, e.getMessage(), null);
+                       logger.error(EELFLoggerDelegate.errorLogger, "getEcompTitle failed", e);
+               }
+               return portalRestResponse;
+       }
+
+       /**
+        * RESTful service method to fetch all the FunctionalMenuItems, both active
+        * and inactive, for the EditFunctionalMenu feature. Can only be accessed by
+        * the portal admin.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuForEditing" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItemsForEditing(HttpServletRequest request, HttpServletResponse response) {
+               // TODO: should only the superuser be allowed to use this API?
+               EPUser user = EPUserUtils.getUserSession(request);
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       if (!adminRolesService.isSuperAdmin(user)) {
+                               EcompPortalUtils.setBadPermissions(user, response, "getFunctionalMenuItemDetails");
+                       } else {
+                               menuItems = functionalMenuService.getFunctionalMenuItems(true);
+                       }
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForEditing", "result =",
+                                       menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenuForEditing. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to fetch all the FunctionalMenuItems, active , for
+        * the Functional menu in notification Tree feature.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuForNotificationTree" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItemsForNotifications(HttpServletRequest request,
+                       HttpServletResponse response) {
+               // TODO: should only the superuser be allowed to use this API?
+               // EPUser user = EPUserUtils.getUserSession(request);
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       menuItems = functionalMenuService.getFunctionalMenuItemsForNotificationTree(true);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForNotificationTree", "result =",
+                                       menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenuForNotifications. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to fetch all FunctionalMenuItems associated with
+        * an application.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param appId
+        *            application ID
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuForApp/{appId}" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItemsForApp(HttpServletRequest request,
+                       @PathVariable("appId") Integer appId) {
+               // TODO: should only the superuser be allowed to use this API?
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       menuItems = functionalMenuService.getFunctionalMenuItemsForApp(appId);
+                       functionalMenuService.assignHelpURLs(menuItems);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForApp/" + appId, "result =",
+                                       menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenuForApp. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to fetch all FunctionalMenuItems associated with
+        * the applications and roles that a user has access to.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param orgUserId
+        *            user ID
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuForUser/{orgUserId}" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItemsForUser(HttpServletRequest request,
+                       @PathVariable("orgUserId") String orgUserId) {
+               // TODO: should only the superuser be allowed to use this API?
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       menuItems = functionalMenuService.getFunctionalMenuItemsForUser(orgUserId);
+                       functionalMenuService.assignHelpURLs(menuItems);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForUser/" + orgUserId, "result =",
+                                       menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenuForUser. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to fetch all FunctionalMenuItems associated with
+        * the applications and roles that the authenticated user has access to.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return List of FunctionalMenuItem objects
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuForAuthUser" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FunctionalMenuItem> getMenuItemsForAuthUser(HttpServletRequest request, HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               List<FunctionalMenuItem> menuItems = null;
+               try {
+                       if (user == null) {
+                               EcompPortalUtils.setBadPermissions(user, response, "getMenuItemsForAuthUser");
+                       } else if (adminRolesService.isSuperAdmin(user)) {
+                               menuItems = functionalMenuService.getFunctionalMenuItems();
+                       } else {
+                               // calculate the menu items
+                               String orgUserId = user.getOrgUserId();
+                               menuItems = functionalMenuService.getFunctionalMenuItemsForUser(orgUserId);
+                               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuForUser/" + orgUserId,
+                                               "result =", menuItems);
+                       }
+                       functionalMenuService.assignHelpURLs(menuItems);
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling getMenuItemsForAuthUser. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+               return menuItems;
+       }
+
+       /**
+        * RESTful service method to fetch the details for a functional menu item.
+        * Requirement: you must be the Ecomp portal super admin user.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuId
+        *            menu ID
+        * @return FunctionalMenuItem object
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuItemDetails/{menuId}" }, method = RequestMethod.GET, produces = "application/json")
+       public FunctionalMenuItem getFunctionalMenuItemDetails(HttpServletRequest request,
+                       @PathVariable("menuId") Integer menuId, HttpServletResponse response) {
+               // TODO: return FunctionalMenuItemJson
+               // TODO: modify FunctionalMenuItem to not include the transient fields
+               FunctionalMenuItem menuItem = null;
+               try {
+                       EPUser user = EPUserUtils.getUserSession(request);
+                       if (!adminRolesService.isSuperAdmin(user)) {
+                               EcompPortalUtils.setBadPermissions(user, response, "getFunctionalMenuItemDetails");
+                       } else {
+                               menuItem = functionalMenuService.getFunctionalMenuItemDetails(menuId);
+                               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItemDetails/" + menuId,
+                                               "result =", menuItem);
+                       }
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger,
+                                       "Exception occurred while calling functionalMenuItemDetails. Details: "
+                                                       + EcompPortalUtils.getStackTrace(e));
+               }
+
+               return menuItem;
+       }
+
+       /**
+        * RESTful service method to create a new menu item.
+        * 
+        * Requirement: you must be the Ecomp portal super admin user.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuItemJson
+        *            FunctionalMenuItemWithRoles
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/functionalMenuItem" }, method = RequestMethod.POST)
+       public FieldsValidator createFunctionalMenuItem(HttpServletRequest request,
+                       @RequestBody FunctionalMenuItemWithRoles menuItemJson, HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+               if (!adminRolesService.isSuperAdmin(user)) {
+                       logger.debug(EELFLoggerDelegate.debugLogger,
+                                       "FunctionalMenuController.createFunctionalMenuItem bad permissions");
+                       EcompPortalUtils.setBadPermissions(user, response, "createFunctionalMenuItem");
+               } else {
+                       fieldsValidator = functionalMenuService.createFunctionalMenuItem(menuItemJson);
+                       response.setStatus(fieldsValidator.httpStatusCode.intValue());
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "POST result =",
+                                       response.getStatus());
+               }
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESTful service method to update an existing menu item
+        * 
+        * Requirement: you must be the Ecomp portal super admin user.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuItemJson
+        *            FunctionalMenuItemWithRoles
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/functionalMenuItem" }, method = RequestMethod.PUT)
+       public FieldsValidator editFunctionalMenuItem(HttpServletRequest request,
+                       @RequestBody FunctionalMenuItemWithRoles menuItemJson, HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+               if (!adminRolesService.isSuperAdmin(user)) {
+                       EcompPortalUtils.setBadPermissions(user, response, "editFunctionalMenuItem");
+               } else {
+                       fieldsValidator = functionalMenuService.editFunctionalMenuItem(menuItemJson);
+                       response.setStatus(fieldsValidator.httpStatusCode.intValue());
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "PUT result =",
+                                       response.getStatus());
+               }
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESTful service method to delete a menu item
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuId
+        *            menu identifier
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/functionalMenuItem/{menuId}" }, method = RequestMethod.DELETE)
+       public FieldsValidator deleteFunctionalMenuItem(HttpServletRequest request, @PathVariable("menuId") Long menuId,
+                       HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+               if (!adminRolesService.isSuperAdmin(user)) {
+                       EcompPortalUtils.setBadPermissions(user, response, "deleteFunctionalMenuItem");
+               } else {
+                       fieldsValidator = functionalMenuService.deleteFunctionalMenuItem(menuId);
+                       response.setStatus(fieldsValidator.httpStatusCode.intValue());
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuItem", "DELETE result =",
+                                       response.getStatus());
+               }
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESTful service to regenerate table
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/regenerateFunctionalMenuAncestors" }, method = RequestMethod.GET)
+       public FieldsValidator regenerateAncestorTable(HttpServletRequest request, HttpServletResponse response) {
+               // TODO: should only the superuser be allowed to use this API?
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+
+               if (!adminRolesService.isSuperAdmin(user)) {
+                       EcompPortalUtils.setBadPermissions(user, response, "deleteFunctionalMenuItem");
+               } else {
+                       fieldsValidator = functionalMenuService.regenerateAncestorTable();
+                       response.setStatus(fieldsValidator.httpStatusCode.intValue());
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/regenerateAncestorTable", "GET result =",
+                                       response.getStatus());
+               }
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESful service to set a favorite item.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuItemJson
+        *            FunctionalMenuItemWithRoles
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/setFavoriteItem" }, method = RequestMethod.POST)
+       public FieldsValidator addFavoriteItem(HttpServletRequest request,
+                       @RequestBody FavoritesFunctionalMenuItem menuItemJson, HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+               menuItemJson.userId = user.getId();
+               fieldsValidator = functionalMenuService.setFavoriteItem(menuItemJson);
+               response.setStatus(fieldsValidator.httpStatusCode.intValue());
+               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/setFavoriteItem", "Post result =",
+                               response.getStatus());
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESTful service to get favorites for the current user as identified in
+        * the session
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return List of FavoritesFunctionalMenuItemJson
+        */
+       @RequestMapping(value = {
+                       "/portalApi/getFavoriteItems" }, method = RequestMethod.GET, produces = "application/json")
+       public List<FavoritesFunctionalMenuItemJson> getFavoritesForUser(HttpServletRequest request,
+                       HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               List<FavoritesFunctionalMenuItemJson> favorites = functionalMenuService.getFavoriteItems(user.getId());
+               FieldsValidator fieldsValidator = new FieldsValidator();
+               response.setStatus(fieldsValidator.httpStatusCode.intValue());
+               EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/getFavoriteItems", "GET result =",
+                               response.getStatus());
+               return favorites;
+       }
+
+       /**
+        * RESTful service to delete a favorite menu item for the current user as
+        * identified in the session.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @param menuId
+        *            menu identifier
+        * @return FieldsValidator
+        */
+       @RequestMapping(value = { "/portalApi/removeFavoriteItem/{menuId}" }, method = RequestMethod.DELETE)
+       public FieldsValidator deleteFavoriteItem(HttpServletRequest request, @PathVariable("menuId") Long menuId,
+                       HttpServletResponse response) {
+               EPUser user = EPUserUtils.getUserSession(request);
+               FieldsValidator fieldsValidator = null;
+               Long userId = user.getId();
+               fieldsValidator = functionalMenuService.removeFavoriteItem(userId, menuId);
+               response.setStatus(fieldsValidator.httpStatusCode.intValue());
+               EcompPortalUtils.logAndSerializeObject(logger, "/deleteFavoriteItem", "DELETE result =", response.getStatus());
+
+               return fieldsValidator;
+       }
+
+       /**
+        * RESTful service to get user information: user's first and last names, org
+        * user ID, email and last-login. (Actually has nothing to do with the real
+        * functional menu.) First attempts to get the information from the Tomcat
+        * session (i.e., the CSP cookie); if that fails, calls the shared context
+        * service to read the information from the database. Gives back what it
+        * found, any of which may be null, as a JSON collection.
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param response
+        *            HttpServletResponse
+        * @return JSON collection of key-value pairs shown below.
+        */
+       @RequestMapping(value = {
+                       "/portalApi/functionalMenuStaticInfo" }, method = RequestMethod.GET, produces = "application/json")
+       public String getFunctionalMenuStaticInfo(HttpServletRequest request, HttpServletResponse response) {
+
+               // Get user details from session
+               logger.debug(EELFLoggerDelegate.debugLogger, "getFunctionalMenuStaticInfo: getting user info");
+               String fnMenuStaticResponse = null;
+               try {
+                       String orgUserIdStr = null, firstNameStr = null, lastNameStr = null, emailStr = null, lastLogin = null;
+                       EPUser user = EPUserUtils.getUserSession(request);
+                       firstNameStr = user.getFirstName();
+                       lastNameStr = user.getLastName();
+                       orgUserIdStr = user.getOrgUserId();
+                       emailStr = user.getEmail();
+                       if (emailStr == null || emailStr.equals("")) {
+                               EPUser userResult = searchService.searchUserByUserId(orgUserIdStr);
+                               emailStr = userResult.getEmail();
+                       }
+                       SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy hh:mm:ssZ");
+                       Date lastLoginDate = user.getLastLoginDate();
+                       if (lastLoginDate == null) {
+                               // should never happen
+                               logger.error(EELFLoggerDelegate.errorLogger, "getFunctionalMenuStaticInfo: no last login in session");
+                               lastLogin = "no last login available";
+                       } else {
+                               lastLogin = sdf.format(lastLoginDate);
+                       }
+
+                       // If any item is missing from session, try the Shared Context
+                       // service.
+                       SharedContext orgUserIdSC = null, firstNameSC = null, lastNameSC = null, emailSC = null;
+                       String sessionId = request.getSession().getId();
+                       if (firstNameStr == null)
+                               firstNameSC = sharedContextService.getSharedContext(sessionId,
+                                               EPCommonSystemProperties.USER_FIRST_NAME);
+                       if (lastNameStr == null)
+                               lastNameSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_LAST_NAME);
+                       if (emailStr == null)
+                               emailSC = sharedContextService.getSharedContext(sessionId, EPCommonSystemProperties.USER_EMAIL);
+                       if (orgUserIdStr == null)
+                               orgUserIdSC = sharedContextService.getSharedContext(sessionId,
+                                               EPCommonSystemProperties.USER_ORG_USERID);
+
+                       // Build the response
+                       Map<String, String> map = new HashMap<String, String>();
+                       map.put("firstName",
+                                       firstNameStr != null ? firstNameStr : (firstNameSC != null ? firstNameSC.getCvalue() : null));
+                       map.put("lastName",
+                                       lastNameStr != null ? lastNameStr : (lastNameSC != null ? lastNameSC.getCvalue() : null));
+                       map.put("email", emailStr != null ? emailStr : (emailSC != null ? emailSC.getCvalue() : null));
+                       map.put("userId",
+                                       orgUserIdStr != null ? orgUserIdStr : (orgUserIdSC != null ? orgUserIdSC.getCvalue() : null));
+                       map.put("last_login", lastLogin);
+                       JSONObject j = new JSONObject(map);
+                       fnMenuStaticResponse = j.toString();
+                       // Be chatty in the log
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/functionalMenuStaticInfo", "GET result =",
+                                       fnMenuStaticResponse);
+               } catch (Exception e) {
+                       // Should never happen.
+                       logger.error(EELFLoggerDelegate.errorLogger, "getFunctionalMenuStaticInfo failed", e);
+                       // Return a real error?
+                       // fnMenuStaticResponse = "{ \"status\": \"error\", \"message\": \""
+                       // + e.toString() + "\" }";
+                       // But the angular controller expects null on error.
+               }
+               return fnMenuStaticResponse;
+       }
+
+       private Comparator<BusinessCardApplicationRole> getUserAppRolesComparator = new Comparator<BusinessCardApplicationRole>() {
+               public int compare(BusinessCardApplicationRole o1, BusinessCardApplicationRole o2) {
+                       return o1.getAppName().compareTo(o2.getAppName());
+               }
+       };
+
+       /**
+        * 
+        * @param request
+        *            HttpServletRequest
+        * @param userId
+        *            user ID
+        * @return List<BusinessCardApplicationRolesList>
+        * @throws IOException
+        *             on error
+        */
+       @RequestMapping(value = {
+                       "/portalApi/userApplicationRoles" }, method = RequestMethod.GET, produces = "application/json")
+       public List<BusinessCardApplicationRolesList> getAppList(HttpServletRequest request,
+                       @RequestParam("userId") String userId) throws IOException {
+
+               List<BusinessCardApplicationRolesList> AppRoles = null;
+               try {
+                       List<BusinessCardApplicationRole> userAppRoleList = functionalMenuService.getUserAppRolesList(userId);
+
+                       Collections.sort(userAppRoleList, getUserAppRolesComparator);
+                       EcompPortalUtils.logAndSerializeObject(logger, "/portalApi/userApplicationRoles", "result =",
+                                       userAppRoleList);
+
+                       AppRoles = new ArrayList<BusinessCardApplicationRolesList>();
+                       for (BusinessCardApplicationRole userAppRole : userAppRoleList) {
+                               boolean found = false;
+                               List<String> roles = null;
+
+                               for (BusinessCardApplicationRolesList app : AppRoles) {
+                                       if (app.getAppName().equals(userAppRole.getAppName())) {
+                                               roles = app.getRoleNames();
+                                               roles.add(userAppRole.getRoleName());
+                                               app.setRoleNames(roles);
+                                               found = true;
+                                               break;
+                                       }
+                               }
+
+                               if (!found) {
+                                       roles = new ArrayList<String>();
+                                       roles.add(userAppRole.getRoleName());
+                                       AppRoles.add(new BusinessCardApplicationRolesList(userAppRole.getAppName(), roles));
+                               }
+
+                               Collections.sort(roles);
+                       }
+               } catch (Exception e) {
+                       logger.error(EELFLoggerDelegate.errorLogger, "getAppList failed", e);
+               }
+
+               return AppRoles;
+
+       }
+}