public ActionForward doAction(
      ActionMapping mapping, HttpServletRequest request, HttpServletResponse response)
      throws Exception {

    DataHandler handler = (DataHandler) request.getAttribute(BrowserFrameworkConstants.CLIENT_INFO);

    // get values for current location lat and lon, and also distUnit
    TxNode node = (TxNode) handler.getParameter("anchorLat");
    long anchorLat = node != null ? node.valueAt(0) : -1;

    node = (TxNode) handler.getParameter("anchorLon");
    long anchorLon = node != null ? node.valueAt(0) : -1;

    node = (TxNode) handler.getParameter("distUnit");
    long distUnit = node != null ? node.valueAt(0) : 1;

    logger.debug("Lat:" + anchorLat + " Lon:" + anchorLon + "Dist Unit:" + distUnit);

    // convert distUnit to mi or km
    String scale = "mi";
    if (distUnit != Constant.DUNIT_MILES) {
      scale = "km";
    }

    // set attributes for anchor lat, lon, distUnit and scale
    request.setAttribute("anchorLat", anchorLat);
    request.setAttribute("anchorLon", anchorLon);
    request.setAttribute("distUnit", distUnit);
    request.setAttribute("scale", scale);

    try {
      logger.debug("ShareMovie... before");
      ExecutorRequest[] executorRequests = requestParser.parse(request);

      ShareMovieResponse executorResponse = new ShareMovieResponse();

      if (executorRequests != null && executorRequests.length > 0) {
        ExecutorDispatcher ac = ExecutorDispatcher.getInstance();
        ac.execute(executorRequests[0], executorResponse, new ExecutorContext());
      }

      if (executorResponse.getStatus() == ExecutorResponse.STATUS_FAIL) {
        request.setAttribute("errorCode", new Long(-1));
        request.setAttribute("errorMsg", executorResponse.getErrorMessage());
        return mapping.findForward("failure");
      }

      responseFormatter.format(request, new ExecutorResponse[] {executorResponse});
      logger.debug("ShareMovie... after");
      return mapping.findForward("success");
    } catch (Exception e) {
      ActionMessages msgs = new ActionMessages();
      msgs.add("loginfailed", new ActionMessage("errors.movie.failed"));
      addErrors(request, msgs);
      return mapping.findForward("failure");
    }
  }
 @Override
 public ExecutorRequest[] parse(Object object) throws ExecutorException {
   SentAddressRequest request = new SentAddressRequest();
   TxNode node = (TxNode) object;
   request.setUserId(node.valueAt(0));
   return new ExecutorRequest[] {request};
 }
  @Override
  public ExecutorRequest[] parse(Object object) throws ExecutorException {
    TxNode node = (TxNode) object;
    BannerAdsRequest request = new BannerAdsRequest();

    request.setExecutorType(node.msgAt(0));
    request.setPageId(node.msgAt(1));
    request.setKeyWord(node.msgAt(2));
    request.setSearchId(node.msgAt(3));
    request.setPageIndex((int) node.valueAt(3));

    Location location = getLocation(node.valueAt(1), node.valueAt(2));
    request.setLoc(location);
    if (TYPE_CURRENT_LOCATION == node.valueAt(3)) {
      request.setCurLoc(location);
    }

    double width = node.valueAt(5);
    double height = node.valueAt(6);
    // FIXME: what is the real configuration?
    final int preferredWidth = (int) (width * 0.95);
    int preferredHeight = (int) (height / 4);

    ImageSizeType maxSize = new ImageSizeType();
    maxSize.setHeight(preferredHeight);
    maxSize.setWidth(preferredWidth);
    request.setMaxSize(maxSize);

    ImageSizeType minSize = new ImageSizeType();
    minSize.setWidth((int) (width / 2));
    minSize.setHeight((int) (height * 0.04));

    request.setMinSize(minSize);

    return new ExecutorRequest[] {request};
  }