@Override
  public void doView(RenderRequest request, RenderResponse response)
      throws PortletException, IOException {
    try {
      String view = VIEW_FORM_PAGE;
      String viewType = request.getParameter("viewType");
      if (viewType == null) {
        viewType = (String) request.getPortletSession().getAttribute("viewType");
      }
      // Set global preferences
      request.setAttribute(TITLE, request.getPreferences().getValue(PREF_TITLE, null));
      request.setAttribute(
          INTRODUCTION_MESSAGE, request.getPreferences().getValue(PREF_INTRODUCTION_MESSAGE, null));

      User user = PortalUtils.getUser(request);
      Project project = PortalUtils.getProject(request);

      Task task = (Task) request.getPortletSession().getAttribute("task");

      int projectId = project == null ? -1 : project.getId();
      String projectIdOfLists = request.getParameter(PROJECT_ID_OF_LISTS);
      int pidOfLists = projectIdOfLists == null ? -1 : Integer.parseInt(projectIdOfLists);

      LOG.debug("doView: pidOfLists -- " + pidOfLists);

      // Clean up session
      request.getPortletSession().removeAttribute(VIEW_TYPE);
      request.getPortletSession().removeAttribute(PROJECT_ID_OF_LISTS);

      if (SAVE_FAILURE.equals(viewType)) {
        // Prep the form to show errors...
        request.setAttribute(
            ACTION_ERROR, request.getPreferences().getValue(PREF_FAILURE_MESSAGE, null));
        // Show the form with any errors provided
        PortalUtils.processErrors(request, task.getErrors());
      } else if (SAVE_SUCCESS.equals(viewType)) {
        // Save Success
        request.setAttribute(
            SUCCESS_MESSAGE, request.getPreferences().getValue(PREF_SUCCESS_MESSAGE, null));
        view = VIEW_MESSAGE_PAGE;
      } else {
        if (!user.isLoggedIn()) {
          // If user is not logged in, redirect
          view = VIEW_MESSAGE_PAGE;
          request.setAttribute(ACTION_ERROR, "You need to be logged in to perform this action");
        } else if (projectId <= 0) {
          request.setAttribute(ACTION_ERROR, "No project was specified");
          view = VIEW_MESSAGE_PAGE;
        } else {
          view = VIEW_FORM_PAGE;
          try {
            Connection db = PortalUtils.useConnection(request);

            int userProfileId = user.getProfileProjectId();
            Project userProfile;
            if (userProfileId == -1) {
              view = VIEW_MESSAGE_PAGE;
              request.setAttribute(ACTION_ERROR, "No profile is available to bookmark.");
            } else {
              userProfile = ProjectUtils.loadProject(userProfileId);
              if (pidOfLists == -1) {
                pidOfLists = userProfile.getId();
              }
              // check the user has permissions to add/delete from lists for the project whose lists
              // are being modified
              // these will be used by the view to dynamically show/hide functionality
              request.setAttribute(
                  CAN_ADD_LIST, ProjectUtils.hasAccess(pidOfLists, user, "project-lists-add"));
              request.setAttribute(
                  CAN_DELETE_FROM_LIST,
                  ProjectUtils.hasAccess(pidOfLists, user, "project-lists-delete"));

              ProjectList projectList = findUserProjects(db, user);
              ProjectList availableProjects = new ProjectList();
              // Profile needs to appear on top so remove it from list and don't add twice
              availableProjects.add(userProfile);
              for (int i = 0; i != projectList.size(); i++) {
                Project p = projectList.get(i);
                if (p.getId() != userProfile.getId()) {
                  availableProjects.add(p);
                }
              }

              TaskCategoryList availableLists = getAvailableLists(db, pidOfLists);

              String errorMessage = (String) request.getPortletSession().getAttribute(ACTION_ERROR);
              if (StringUtils.hasText(errorMessage)) {
                request.setAttribute(ACTION_ERROR, errorMessage);
              }

              Map<Integer, TaskCategory> usedLists =
                  findExistingTaskCategorysForProjects(db, pidOfLists, project.getId());
              request.setAttribute(PROJECT_ID_OF_LISTS, pidOfLists);
              request.setAttribute(PROJECT, project);
              request.setAttribute(AVAILABLE_LISTS, availableLists);
              request.setAttribute(USER_PROFILE, userProfile);
              request.setAttribute(AVAILABLE_PROJECTS, availableProjects);
              request.setAttribute(USED_LIST_MAP, usedLists);
            }
          } catch (SQLException e) {
            e.printStackTrace();
            view = VIEW_MESSAGE_PAGE;
            request.setAttribute(
                ACTION_ERROR, "An error occurred processing your request. Please try again.");
          }
        }
      }
      // Clean up session
      request.getPortletSession().removeAttribute(ACTION_ERROR);
      PortletContext context = getPortletContext();
      PortletRequestDispatcher requestDispatcher = context.getRequestDispatcher(view);
      requestDispatcher.include(request, response);
    } catch (Exception e) {
      e.printStackTrace();
      throw new PortletException(e);
    }
  }
  public void doView(RenderRequest request, RenderResponse response)
      throws PortletException, IOException {
    try {
      String ctx = request.getContextPath();
      String defaultView = VIEW_PAGE;

      // Get portal items
      String queryString = (String) request.getAttribute(BASE_QUERY_STRING);
      IIndexerSearch searcher = (IIndexerSearch) request.getAttribute(SEARCHER);
      ProjectCategoryList categories =
          (ProjectCategoryList) request.getAttribute(PROJECT_CATEGORY_LIST);
      SearchBean searchBean = (SearchBean) request.getAttribute(SEARCH_BEAN);

      // Get preferences
      String category = request.getPreferences().getValue(PREF_CATEGORY_NAME, null);
      request.setAttribute(TITLE, request.getPreferences().getValue(TITLE, "Projects"));
      int recordLimit =
          Integer.parseInt(request.getPreferences().getValue(PREF_RECORD_LIMIT, "10"));
      request.setAttribute(RECORD_LIMIT, recordLimit);
      boolean hasPaging = "true".equals(request.getPreferences().getValue(PREF_HAS_PAGING, null));
      if (hasPaging) {
        request.setAttribute(HAS_PAGING, hasPaging);
      }

      if (category != null && categories.getIdFromValue(category) == -1) {
        // don't display anything because the category does not exist in the category list
      } else {
        // If the searchbean category is not this category, then provide a link to that category
        // page
        if (category != null && categories.getIdFromValue(category) != searchBean.getCategoryId()) {
          request.setAttribute(
              HAS_MORE_URL,
              request
                  .getPreferences()
                  .getValue(
                      PREF_HAS_MORE_URL,
                      searchBean.getUrlByCategory(categories.getIdFromValue(category))));
        } else {
          request.setAttribute(
              HAS_MORE_URL, request.getPreferences().getValue(PREF_HAS_MORE_URL, ""));
        }
        request.setAttribute(
            HAS_MORE_TITLE,
            request.getPreferences().getValue(PREF_HAS_MORE_TITLE, "Browse more items"));

        // Request items
        request.setAttribute(SEARCH_BEAN_ATTRIBUTE, searchBean);

        // Customize the string
        queryString +=
            " AND (type:project) "
                + (category != null
                    ? "AND (projectCategoryId:" + categories.getIdFromValue(category) + ") "
                    : "");

        // Efficient unsorted list
        /*
        TopDocCollector collector = new TopDocCollector(50);
        searcher.search(query, collector);
        ScoreDoc[] hits = collector.topDocs().scoreDocs;
        */

        //
        IndexerQueryResultList hits = new IndexerQueryResultList();
        hits.setQueryString(queryString);
        hits.getPagedListInfo().setItemsPerPage(recordLimit);

        // Use paging if requested
        PagedListInfo searchBeanInfo = new PagedListInfo();
        if (hasPaging) {
          searchBeanInfo.setLink("/search");
          String offsetStr = request.getParameter("offset");
          int offset = offsetStr == null ? 0 : Integer.parseInt(offsetStr);
          searchBeanInfo.setCurrentOffset(offset);
          searchBeanInfo.setRenderParameters(searchBean.getParameterMap());
          searchBeanInfo.setNamespace(response.getNamespace());
          searchBeanInfo.setContextPath(ctx);
          searchBeanInfo.setItemsPerPage(recordLimit);
          hits.setPagedListInfo(searchBeanInfo);
        }

        // Configure the parameters for the search results
        if (searchBean.getFilter() == SearchBean.NEWLY_ADDED) {
          // Newly Added (parse in reverse)
          hits.getPagedListInfo().setColumnToSortBy("entered");
          hits.getPagedListInfo().setSortOrder("desc");
          searcher.search(hits);
        } else if (searchBean.getFilter() == SearchBean.HIGHEST_RATED) {
          // Highest Rated (parse in reverse)
          hits.getPagedListInfo().setColumnToSortBy("ratingAverage");
          hits.getPagedListInfo().setSortOrder("desc");
          searcher.search(hits);
        } else if (searchBean.getFilter() == SearchBean.MOST_REVIEWED) {
          // Most Reviewed (parse in reverse)
          hits.getPagedListInfo().setColumnToSortBy("ratingCount");
          hits.getPagedListInfo().setSortOrder("desc");
          searcher.search(hits);
        } else {
          // Best Match
          searcher.search(hits);
        }

        if (hits.getPagedListInfo().moreRecordsExist()) {
          request.setAttribute(HAS_MORE_RECORDS, "true");
        }

        // Set the results for the view
        request.setAttribute(HITS, hits);

        // This portlet can provide data to other portlets
        for (String event : PortalUtils.getDashboardPortlet(request).getGenerateDataEvents()) {
          PortalUtils.setGeneratedData(request, event, hits);
        }

        if (hits.size() > 0) {
          // JSP view
          PortletContext context = getPortletContext();
          PortletRequestDispatcher requestDispatcher = context.getRequestDispatcher(defaultView);
          requestDispatcher.include(request, response);
        }
      }
    } catch (Exception e) {
      e.printStackTrace(System.out);
      throw new PortletException(e);
    }
  }