public String execute() {
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();

    try {
      int custId;

      KKAppEng kkAppEng = this.getKKAppEng(request, response);

      custId = this.loggedIn(request, response, kkAppEng, null);

      // Ensure we are using the correct protocol. Redirect if not.
      String redirForward = checkSSL(kkAppEng, request, custId, /* forceSSL */ false);
      if (redirForward != null) {
        setupResponseForSSLRedirect(response, redirForward);
        return null;
      }

      /*
       * Save preferences in managers, cookies and tags
       */
      kkAppEng.getReviewMgr().setPageSize(numRevs);
      setKKCookie(TAG_REVIEW_PAGE_SIZE, Integer.toString(numRevs), request, response, kkAppEng);
      kkAppEng
          .getCustomerTagMgr()
          .insertCustomerTag(TAG_REVIEW_PAGE_SIZE, Integer.toString(numRevs));

      DataDescriptorIf dd = kkAppEng.getReviewMgr().getDataDesc();
      if (dd != null) {
        dd.setLimit(numRevs + 1);
        dd.setOffset(0);
        kkAppEng.getReviewMgr().orderCurrentReviews(dd.getOrderBy(), t);
      }
      kkAppEng.getReviewMgr().setShowTab(true);

      return SUCCESS;

    } catch (Exception e) {
      return super.handleException(request, e);
    }
  }
  @Override
  public void manageCookiesLogin(
      @Nonnull HttpServletRequest request,
      @Nonnull HttpServletResponse response,
      @Nonnull KKAppEng kkAppEng)
      throws HstComponentException {
    if (!kkAppEng.isKkCookieEnabled()) {
      return;
    }

    CustomerIf currentCustomer = kkAppEng.getCustomerMgr().getCurrentCustomer();
    if (currentCustomer != null) {
      setKKCookie(
          CUSTOMER_NAME,
          currentCustomer.getFirstName() + " " + currentCustomer.getLastName(),
          request,
          response,
          kkAppEng);
    }

    try {
      /*
       * Get customer preferences from customer tags. If the tag value exists, then set the
       * preference in the manager and set the cookie.
       */
      String prodPageSizeStr = kkAppEng.getCustomerTagMgr().getCustomerTagValue(TAG_PROD_PAGE_SIZE);
      if (prodPageSizeStr != null && prodPageSizeStr.length() > 0) {
        int prodPageSize = Integer.parseInt(prodPageSizeStr);
        kkAppEng.getProductMgr().setMaxDisplaySearchResults(prodPageSize);
        setKKCookie(TAG_PROD_PAGE_SIZE, prodPageSizeStr, request, response, kkAppEng);
      }
      String orderPageSizeStr =
          kkAppEng.getCustomerTagMgr().getCustomerTagValue(TAG_ORDER_PAGE_SIZE);
      if (orderPageSizeStr != null && orderPageSizeStr.length() > 0) {
        int orderPageSize = Integer.parseInt(orderPageSizeStr);
        kkAppEng.getOrderMgr().setPageSize(orderPageSize);
        setKKCookie(TAG_ORDER_PAGE_SIZE, orderPageSizeStr, request, response, kkAppEng);
      }
      String reviewPageSizeStr =
          kkAppEng.getCustomerTagMgr().getCustomerTagValue(TAG_REVIEW_PAGE_SIZE);
      if (reviewPageSizeStr != null && reviewPageSizeStr.length() > 0) {
        int reviewPageSize = Integer.parseInt(reviewPageSizeStr);
        kkAppEng.getReviewMgr().setPageSize(reviewPageSize);
        setKKCookie(TAG_REVIEW_PAGE_SIZE, reviewPageSizeStr, request, response, kkAppEng);
      }
    } catch (KKAppException e) {
      throw new HstComponentException(e);
    } catch (KKException e) {
      throw new HstComponentException(e);
    }
  }
  /**
   * @param mapping The ActionMapping used to select this instance
   * @param form The optional ActionForm bean for this request (if any)
   * @param request The HTTP request we are processing
   * @param response The HTTP response we are creating
   */
  public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response) {

    try {
      int custId;

      KKAppEng kkAppEng = this.getKKAppEng(request, response);

      custId = this.loggedIn(request, response, kkAppEng, null);

      // Ensure we are using the correct protocol. Redirect if not.
      ActionForward redirForward = checkSSL(kkAppEng, request, custId, /* forceSSL */ false);
      if (redirForward != null) {
        return redirForward;
      }

      String revId = request.getParameter("revId");
      if (revId == null) {
        return mapping.findForward("Welcome");
      }

      if (log.isDebugEnabled()) {
        log.debug("Review Id from application = " + revId);
      }

      kkAppEng.getReviewMgr().fetchReviewDetails(new Integer(revId).intValue());

      kkAppEng.nav.set(getCatMessage(request, "header.review.details"), request);
      return mapping.findForward("ShowReviewDetails");

    } catch (Exception e) {
      return mapping.findForward(super.handleException(request, e));
    }
  }
  @Override
  @Nullable
  public String manageCookies(
      @Nonnull HttpServletRequest request,
      @Nonnull HttpServletResponse response,
      @Nonnull KKAppEng kkAppEng)
      throws HstComponentException {
    if (!kkAppEng.isKkCookieEnabled()) {
      return null;
    }

    /*
     * The current customer should at this point be a guest customer with a negative customer id
     */
    CustomerIf currentCustomer = kkAppEng.getCustomerMgr().getCurrentCustomer();
    if (currentCustomer == null) {
      log.warn(
          "Current customer is set to null in the manageCookies method. This should never happen");
      return null;
    }

    /*
     * Get the customerUuid from the browser cookie. A new cookie is created if it doesn't exist
     */
    String customerUuid = getCustomerUuidFromBrowserCookie(request, response);

    /*
     * Get the guestCustomerId from the KK database.
     */
    String guestCustomerIdStr = getKKCookie(customerUuid, GUEST_CUSTOMER_ID, kkAppEng);

    if (guestCustomerIdStr == null) {
      /*
       * If it doesn't exist, then we create it
       */
      setKKCookie(
          customerUuid, GUEST_CUSTOMER_ID, Integer.toString(currentCustomer.getId()), kkAppEng);

    } else {
      /*
       * Set the current customer id with the one retrieved from the cookie and fetch any cart
       * items that he may have.
       */
      currentCustomer.setId(Integer.parseInt(guestCustomerIdStr));
      try {
        kkAppEng.getBasketMgr().getBasketItemsPerCustomer();
      } catch (Exception e) {
        throw new HstComponentException(e);
      }

      if (kkAppEng.getWishListMgr().allowWishListWhenNotLoggedIn()) {
        try {
          kkAppEng.getWishListMgr().fetchCustomersWishLists();
        } catch (Exception e) {
          throw new HstComponentException(e);
        }
      }

      // Get the product page size
      String prodPageSizeStr = getKKCookie(customerUuid, TAG_PROD_PAGE_SIZE, kkAppEng);
      if (prodPageSizeStr != null && prodPageSizeStr.length() > 0) {
        try {
          int prodPageSize = Integer.parseInt(prodPageSizeStr);
          kkAppEng.getProductMgr().setMaxDisplaySearchResults(prodPageSize);
        } catch (NumberFormatException e) {
          log.warn(
              "The product page size value stored in the cookie for customer with guest id "
                  + guestCustomerIdStr
                  + " is not a numeric value: "
                  + prodPageSizeStr);
        }
      }

      // Get the order page size
      String orderPageSizeStr = getKKCookie(customerUuid, TAG_ORDER_PAGE_SIZE, kkAppEng);
      if (orderPageSizeStr != null && orderPageSizeStr.length() > 0) {
        try {
          int orderPageSize = Integer.parseInt(orderPageSizeStr);
          kkAppEng.getOrderMgr().setPageSize(orderPageSize);
        } catch (NumberFormatException e) {
          log.warn(
              "The order page size value stored in the cookie for customer with guest id "
                  + guestCustomerIdStr
                  + " is not a numeric value: "
                  + orderPageSizeStr);
        }
      }

      // Get the review page size
      String reviewPageSizeStr = getKKCookie(customerUuid, TAG_REVIEW_PAGE_SIZE, kkAppEng);
      if (reviewPageSizeStr != null && reviewPageSizeStr.length() > 0) {
        try {
          int reviewPageSize = Integer.parseInt(reviewPageSizeStr);
          kkAppEng.getReviewMgr().setPageSize(reviewPageSize);
        } catch (NumberFormatException e) {
          log.warn(
              "The review page size value stored in the cookie for customer with guest id "
                  + guestCustomerIdStr
                  + " is not a numeric value: "
                  + reviewPageSizeStr);
        }
      }
    }

    if (log.isDebugEnabled()) {
      log.debug(
          "GUEST_CUSTOMER_ID cookie value = "
              + getKKCookie(customerUuid, GUEST_CUSTOMER_ID, kkAppEng));
      log.debug(
          "CUSTOMER_NAME cookie value = " + getKKCookie(customerUuid, CUSTOMER_NAME, kkAppEng));
      log.debug(
          "CUSTOMER_LOCALE cookie value = " + getKKCookie(customerUuid, CUSTOMER_LOCALE, kkAppEng));
      log.debug(
          "PROD_PAGE_SIZE cookie value = "
              + getKKCookie(customerUuid, TAG_PROD_PAGE_SIZE, kkAppEng));
      log.debug(
          "ORDER_PAGE_SIZE cookie value = "
              + getKKCookie(customerUuid, TAG_ORDER_PAGE_SIZE, kkAppEng));
      log.debug(
          "REVIEW_PAGE_SIZE cookie value = "
              + getKKCookie(customerUuid, TAG_REVIEW_PAGE_SIZE, kkAppEng));
    }

    return customerUuid;
  }