@Override
  public ServiceResponse<NavigationElementTree> perform(ServiceRequest<NamedValues> request)
      throws Exception {
    String lookup = (String) request.getData().get("lookup");
    boolean lazyLoadResource = (Boolean) request.getData().get("lazyLoadResource");

    List<NavigationElementTree> navigationElementTrees = new ArrayList<NavigationElementTree>();
    if (ConfigContainer.isAppInstalled() && StringUtils.isNotBlank(lookup)) {
      String packageLookup = StringUtils.getPackageLookup(lookup);
      if (packageLookup == null) {
        logger.warn(MSG_WRONG_LOOKUP);
      } else {
        OPFContext context = OPFContext.getContext();
        INavElementContainer navElementContainer = context.getNavElementContainer();
        List<NavigationElement> navElementListByPackage =
            navElementContainer.getNavElementListByPackage(packageLookup);
        if (navElementListByPackage == null || navElementListByPackage.isEmpty()) {
          logger.warn(MSG_APPROPRIATE_NAVIGATION_ELEMENTS_WERE_FOUND);
        } else {
          NavigationElementTree navigationElementTree = null;
          NavigationElement parent = null;
          for (NavigationElement vo : navElementListByPackage) {
            if (vo.getLookup().equalsIgnoreCase(lookup)) {
              parent = vo;
              navigationElementTree = convert(parent);
              break;
            }
          }
          if (parent == null) {
            logger.warn(MSG_NO_SUCH_PARENT_NAVIGATION_WAS_FOUND);
          } else {
            buildTree(navigationElementTree, parent, navElementListByPackage, lazyLoadResource);
            navigationElementTrees = navigationElementTree.getChildren();
          }
        }
      }
    }
    return new ServiceResponse<NavigationElementTree>(
        navigationElementTrees, "Return tree navigation elements.", true);
  }
 private void buildTree(
     NavigationElementTree parentNavigationElementTree,
     NavigationElement parent,
     List<NavigationElement> navigationElementList,
     boolean lazyLoadResource) {
   List<NavigationElementTree> children = parentNavigationElementTree.getChildren();
   for (NavigationElement navigationElement : navigationElementList) {
     if (parent.getLookup().endsWith(navigationElement.getPath())) {
       OpenFlamePrincipal principal = OPFContext.getContext().getPrincipal();
       if (principal.checkUserPermission(navigationElement)) {
         if (!lazyLoadResource) {
           initResourceContents(navigationElement);
         }
         NavigationElementTree navigationElementTree = convert(navigationElement);
         children.add(navigationElementTree);
         buildTree(
             navigationElementTree, navigationElement, navigationElementList, lazyLoadResource);
       }
     }
   }
   Collections.sort(children, NavigationElementTree.SORT_POSITION);
 }
 private NavigationElementTree convert(NavigationElement navigationElement) {
   NavigationElementTree navigationElementTree = new NavigationElementTree();
   String name = navigationElement.getName();
   if (navigationElement.getTextResourceVersion() != null) {
     name = navigationElement.getTextResourceVersion().getText();
   }
   navigationElementTree.setName(name);
   navigationElementTree.setUrlPath(navigationElement.getUrlPath());
   navigationElementTree.setPageUrl(navigationElement.getPageUrl());
   navigationElementTree.setElementType(navigationElement.getElementType());
   navigationElementTree.setPath(navigationElement.getPath());
   navigationElementTree.setLookup(navigationElement.getLookup());
   navigationElementTree.setSortPosition(navigationElement.getSortPosition());
   navigationElementTree.setChildren(new ArrayList<NavigationElementTree>());
   navigationElementTree.setAllowDrag(false);
   navigationElementTree.setAllowDrop(false);
   navigationElementTree.setExpandable(true);
   navigationElementTree.setExpanded(false);
   navigationElementTree.setHidden(
       navigationElement.getHidden() != null && navigationElement.getHidden());
   return navigationElementTree;
 }