import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

/**
 * 「オリジナルレシピ投稿掲示板プログラム」
 *  レシピ投稿サーブレット
 */
public class ToukouServlet extends HttpServlet {
  
  //レシピを保存するファイルのパス
  private String separater = System.getProperty("file.separator");//==C:\tomcat\bin
  private String recipeFilePath = System.getProperty("user.dir")+separater+"webapps"+separater+"okusama"+separater+"text"+separater+"recipes.txt";
  /**
   *  レシピの投稿を受け付ける
   *  (投稿には、HTTP POSTメソッドを用いる)
   */
  public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    
    
    //***** 投稿者がログインしているかを調べる *****
    
    HttpSession session = request.getSession(false);//セッションを取得
    
    //ログインしてなかった場合、エラーページを作成する
    if(session == null){
      createErrorPage(response);
      return;//ここで、メソッドを終了する
    }
    
    
    //***** レシピの投稿を受け付ける *****
    
    //セッションとHTTPリクエストのパラメータから、レシピを構成する情報を取り出す
    String contributor = (String)session.getAttribute("name");//ログインしたユーザ名を投稿者とする
    String title = request.getParameter("title"); //タイトル
    String content = request.getParameter("content"); //レシピ内容
    
    //日本語コードを正しい形に変換する
    title = convertToUnicode(title);
    content = convertToUnicode(content);
    
    //投稿された時刻を取得する
    String date = (new java.util.Date()).toString();
    
    
    //***** 受け付けたレシピをファイルに書き込む *****
    
    //改行を正しい形に変換する
    //(改行コードが含まれると、書き込んだ際、1行に収まらなくなってしまう)
    contributor = convertReturnCode(contributor);
    title = convertReturnCode(title);
    content = convertReturnCode(content);
    
    //ファイルに書き込むためのストリームを作成する
    BufferedWriter writer = new BufferedWriter( new FileWriter(recipeFilePath, true) ); //このtrueはファイルへの追記を意味する
    
    //レシピを、contributor, title, date, content の順で書き込む
    writer.write(contributor);
    writer.newLine();
    writer.write(title);
    writer.newLine();
    writer.write(date);
    writer.newLine();
    writer.write(content);
    writer.newLine();
    
    //ストリームを閉じる
    writer.close();
    
    
    //***** 投稿した回数を増やす*****
    
    Integer count = (Integer)session.getAttribute("count");//セッションからカウンタの値を取得
    //初めての投稿の場合カウンタを作る
    if(count == null){
      count = new Integer(1);
    //2度目の投稿の場合カウンタを増やす
    }else{
      count = new Integer(count.intValue()+1);
    }
    //セッションにカウンタを入れる
    session.setAttribute("count", count);
    
    
    //***** 感謝のメッセージのHTMLを出力する *****
    
    //結果を出力するための準備
    response.setContentType("text/html; charset=shift_jis");
    PrintWriter out = response.getWriter();
    
    //感謝のHTMLを出力する
    out.println("<html>");
    out.println("<head><title>ありがとうございました。</title></head>");
    out.println("<body bgcolor='#33CCFF' text='#000000'>");
    out.println("<font size='big'><b>" + count + "回目の投稿ありがとうございました。");
    out.println("<br>おいしい料理ができたら、また教えてくださいね☆</b></font><br><br>");
    out.println("[ <a href=\"IchiranServlet\">レシピ一覧画面へ</a> ]");
    out.println("</body>");
    out.println("</html>");
    
    //HTML出力のあとかたづけをする
    out.close();
  }
  
  /**
   *投稿者がログインしていなかった場合の処理
   */
  public void createErrorPage(HttpServletResponse response) throws IOException {
    
    //結果を出力するための準備
    response.setContentType("text/html; charset=shift_jis");
    PrintWriter out = response.getWriter();
    
    out.println("<html>");
    out.println("<head>");
    out.println("<title>奥様Web-再ログイン</title>");
    out.println("</head>");
    out.println("<body bgcolor=\"#33CCFF\">");
    out.println("<h1>再ログインしてください</h1>");
    out.println("<p><a href=\"/okusama/html/login.html\">ログインページへ</a></p>");
    out.println("</body>");
    out.println("</html>");
  }
  /**
   *  日本語コードを正しい形に変換する
   */
  private String convertToUnicode(String s) throws UnsupportedEncodingException {
    return new String(s.getBytes("8859_1"),"JISAutoDetect");
  }
  
  /**
   *  改行を正しい形に変換する
   */
  private String convertReturnCode(String s) {
    StringTokenizer tokenizer = new StringTokenizer(s, "\n\r");
    String outStr = new String();
    
    while( tokenizer.hasMoreTokens() ) {
      outStr += tokenizer.nextToken();
      if( tokenizer.hasMoreTokens() ){
        outStr += "<BR>";
      }
    }
    
    return outStr;
  }
}
