Implementing the actions

Due to our configuration, we need to implement an action to login and another action to logout. Instead of directly implementing the Action interface, we inherit from the convenience AbstractAction base implementation.

Login action

package de.odysseus.calyxo.sample.login;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import de.odysseus.calyxo.base.Message;
import de.odysseus.calyxo.control.misc.AbstractAction;
import de.odysseus.calyxo.control.conf.DispatchConfig;

public class LoginAction extends AbstractAction {

  private HashMap users = new HashMap();

  /**
   * Initialize our "user database" map
   */
  public void init() {
    users.put("jeff", "hacker");
    users.put("fred", "tester");
    users.put("joe",  "manager");
  }

  /**
   * Process login request.
   * The specified user id and password is verified against
   * our map.
   * On success, the user name is placed into session scope.
   */
  public DispatchConfig execute(
    HttpServletRequest request,
    HttpServletResponse response) throws Exception {

    String user = request.getParameter("user");
    if (!users.containsKey(user)) {
      Message.Arg arg = new Message.ValueArg(user);
      Message message = new Message("messages", "login.user.unknown", arg);
      getMessageSupport().addError(request, "user", message);
      return getActionConfig().findDispatchConfig("input");
    }
    if (!users.get(user).equals(request.getParameter("password"))) {
      Message message = new Message("messages", "login.failed");
      getMessageSupport().addError(request, message);
      return getActionConfig().findDispatchConfig("input");
    }
    request.getSession().setAttribute("user", user);
    return getActionConfig().findDispatchConfig("success");
  }
}

As you can see, the login action does not validate inputs. Later, when we use the Calyxo Forms component, we'll be able to perform the necessary validations without changing any code here.

But there's another point of interest: the action produces localized messages and saves them using the addError() methods. When implementing our view, we should not forget to show up these messages somehow.

Logout action

package de.odysseus.calyxo.sample.login;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import de.odysseus.calyxo.control.misc.AbstractAction;
import de.odysseus.calyxo.control.conf.DispatchConfig;

public class LogoutAction extends AbstractAction {
  /**
   * Process logout request.
   * Remove user name from session scope.
   */
  public DispatchConfig execute(
    HttpServletRequest request,
    HttpServletResponse response) throws Exception {

    request.getSession().removeAttribute("user");
    return getActionConfig().findDispatchConfig("success");
  }
}

Trivial, isn't it?