/** {@inheritDoc} */
  public ActionForward execute(
      ActionMapping mapping,
      ActionForm formIn,
      HttpServletRequest request,
      HttpServletResponse response) {

    ActionErrors errors = new ActionErrors();
    DynaActionForm form = (DynaActionForm) formIn;
    Map<String, Object> params = makeParamMap(request);
    RequestContext ctx = new RequestContext(request);

    // keep the cid
    if (ctx.hasParam("cid")) {
      params.put("cid", ctx.getParam("cid", true));
    }

    if (!isSubmitted(form)) {
      setupForm(request, form);
      return getStrutsDelegate()
          .forwardParams(mapping.findForward(RhnHelper.DEFAULT_FORWARD), request.getParameterMap());
    }

    if (ctx.hasParam("create_button")) {
      Long cid = create(form, errors, ctx);
      params.put("cid", cid);
      if (errors.isEmpty()) {
        createSuccessMessage(request, "message.channelcreated", form.getString("name"));
      }
    } else if (ctx.hasParam("edit_button")) {
      String sharing = (String) form.get("org_sharing");

      if (hasSharingChanged(form, ctx)
          && ("private".equals(sharing) || "protected".equals(sharing))) {
        // forward to confirm page
        request.setAttribute("org", ctx.getCurrentUser().getOrg());
        formToAttributes(request, form);
        Map urlParams = new HashMap();
        urlParams.put(RequestContext.CID, ctx.getRequiredParam(RequestContext.CID));
        ListHelper helper = new ListHelper(this, request, urlParams);
        helper.setDataSetName(getDataSetName());
        helper.setListName(getListName());
        // ignore the return
        helper.execute();
        request.setAttribute("channel_name", form.getString("name"));
        return getStrutsDelegate().forwardParams(mapping.findForward(sharing), params);
      }

      edit(form, errors, ctx);
      if (errors.isEmpty()) {
        createSuccessMessage(request, "message.channelupdated", form.getString("name"));
      }

      // did they enable per user subscriptions?
      String sub = (String) form.get("per_user_subscriptions");
      if (!sub.equals("all")) {
        addMessage(request, "message.channelsubscribers");
      }
    }
    // handler for private confirmation page
    else if (ctx.hasParam(RequestContext.DISPATCH)) {
      makePrivate(form, errors, ctx);
      if (errors.isEmpty()) {
        createSuccessMessage(request, "message.channelupdated", form.getString("name"));
      }
    } else if (ctx.hasParam("deny")) {
      deny(form, errors, ctx);
      if (errors.isEmpty()) {
        createSuccessMessage(request, "message.channelupdated", form.getString("name"));
      }
    } else if (ctx.hasParam("grant")) {
      grant(form, errors, ctx);
      if (errors.isEmpty()) {
        createSuccessMessage(request, "message.channelupdated", form.getString("name"));
      }
    }
    if (!errors.isEmpty()) {
      request.setAttribute("channel_label", form.get("label"));
      request.setAttribute("channel_name", form.getString("name"));
      request.setAttribute("channel_arch", form.get("arch_name"));
      request.setAttribute("channel_arch_label", form.get("arch"));
      request.setAttribute("checksum", form.get("checksum"));
      addErrors(request, errors);
      prepDropdowns(new RequestContext(request));
      return getStrutsDelegate()
          .forwardParams(mapping.findForward(RhnHelper.DEFAULT_FORWARD), params);
    }

    return getStrutsDelegate().forwardParams(mapping.findForward("success"), params);
  }