import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import java.util.*;
import java.sql.*;
import javax.naming.*;
import javax.sql.*;


public final class LoginAction extends Action {

   public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {

      // 画面よりログインIDとパスワードを取得する
      LoginForm loginForm = (LoginForm)form;
      String id = loginForm.getId();
      String password = loginForm.getPassword();

      // 初期値を設定する
      InitialContext ic = null;
      DataSource ds = null;
      Connection con = null;
      PreparedStatement ps = null;
      ResultSet rs = null;
      int count = 0;
      String status = null;
      List usersList = null;
      ActionMessages errors = new ActionMessages();

         try {
         // DBより登録者の情報を取得する
         ic = new InitialContext();
         ds = (DataSource)ic.lookup("java:comp/env/jdbc/mysql");
         con = ds.getConnection();
         ps = con.prepareStatement(
            "select id, password from users where id = ?");
         ps.setString(1, id);
         rs = ps.executeQuery();

         // 認証を行う
         while (rs.next()) {
            count++;
            if (count == 1) {

               // ログインIDとパスワードが登録者の情報と
               // 一致しなければ認証失敗
               if (! id.equals(rs.getString("id")) ||
                  ! password.equals(rs.getString("password"))) {
                  errors.add(
                     ActionMessages.GLOBAL_MESSAGE,
                     new ActionMessage("errors.login"));
               }

            // ログインIDが2件以上存在したら認証失敗
            } else {
               errors.add(
                  ActionMessages.GLOBAL_MESSAGE,
                  new ActionMessage("errors.login"));
            }
         }

         // ログインIDが0件なら認証失敗
         if (count == 0) {
            errors.add(
               ActionMessages.GLOBAL_MESSAGE,
               new ActionMessage("errors.login"));
         }

         // 認証に成功した場合、トップ画面に
         // 登録者の一覧を表示する
         if (errors.isEmpty()) {
            status = "success";
            usersList = new ArrayList();
            ps = con.prepareStatement(
               "select id, name from users order by id");
            rs = ps.executeQuery();
            while (rs.next()) {
               SampleUser sampleUser = new SampleUser();
               sampleUser.setId(rs.getString("id"));
               sampleUser.setName(rs.getString("name"));
               usersList.add(sampleUser);
            }
            request.setAttribute("userslist", usersList);

         // 認証に失敗した場合、ログイン画面に
         // エラーメッセージを表示する
         } else {
            status = "error";
            saveErrors(request, errors);
         }

      } catch (Exception e) {
         throw e;
      } finally {
         con.close();
      }


      return (mapping.findForward(status));
   }
}