import java.io.*;
import javax.servlet.http.*;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import org.xml.sax.InputSource;

public class GuestBookDom extends HttpServlet {
  
  private static void appendNewline(Document doc, Element e) {
    Text txt = doc.createTextNode("\n");
    e.appendChild(txt);
  }

  private static void writeTableRow(Document doc, Element tbl, String left, String right) {
    Element row = doc.createElement("tr");
    Element td1 = doc.createElement("td");
    td1.setTextContent(left);
    row.appendChild(td1);
    Element td2 = doc.createElement("td");
    td2.setTextContent(right);
    row.appendChild(td2);
    tbl.appendChild(row);
    appendNewline(doc, tbl);
  }
    
  private static Element createTable(HttpServletRequest request, Document doc) {
    Element tbl = doc.createElement("table");
    tbl.setAttribute("border", "1");
    appendNewline(doc, tbl);
    writeTableRow(doc, tbl, "名前", request.getParameter("名前"));
    writeTableRow(doc, tbl, "メールアドレス", request.getParameter("メールアドレス"));
    writeTableRow(doc, tbl, "ホームページ", request.getParameter("ホームページ"));
    writeTableRow(doc, tbl, "ひとこと", request.getParameter("ひとこと"));
    return tbl;
  }
  
  @Override 
  public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws IOException {
    response.setContentType("text/html;  charset=Windows-31J");
    request.setCharacterEncoding("Windows-31J");
    PrintWriter out = response.getWriter();
    out.println("<html><head></head><body>");
    try {
      // 読み込みの準備
      String filename = getServletContext().getRealPath("/Guests.html");
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();

      InputSource is = new InputSource(new FileReader(filename));
      is.setEncoding("Shift_JIS");
      Document doc = db.parse(is);       // 木構造の生成
      Element root = doc.getDocumentElement(); // rootはhtml要素のはず   
      Element body = (Element)root.getElementsByTagName("body").item(0);
                     // body要素の検索
      
      // 新しい tableの追加
      body.appendChild(createTable(request, doc));
      appendNewline(doc, body);
      body.appendChild(doc.createElement("hr"));
      appendNewline(doc, body);
      
      // 出力処理
      TransformerFactory fac = TransformerFactory.newInstance();
      Transformer tran = fac.newTransformer();
      tran.setOutputProperty(OutputKeys.ENCODING, "Shift_JIS"); 
                              //  注: Windows-31Jは少し不都合がある
      OutputStream o = new FileOutputStream(filename);
      StreamResult result = new StreamResult(o);
      tran.transform(new DOMSource(doc.getDocumentElement()), result);
      o.close();
      
      out.println("御記帳有難うございました。<br/>");
      out.println("ゲストブックは<a href='Guests.html'>こちら</a>です。");
      
    } catch (Exception e) {
      e.printStackTrace(out);
    }
    out.println("</body></html>");
    out.close();
  }
}
