import java.io.*;
import java.util.*;
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;

public class GuestBookDom extends HttpServlet {
  
  private static void appendNewline(Document doc, Element e) {
    Text txt = doc.createTextNode("\n");
    e.appendChild(txt);
  }
  
  private static Element createTableFromKeys(HttpServletRequest req, Document doc, Enumeration keys) {
    Element tbl = doc.createElement("table");
    tbl.setAttribute("border", "1");
    appendNewline(doc, tbl);
    while (keys.hasMoreElements()) {
      Element row = doc.createElement("tr");
      Element td1 = doc.createElement("td");
      String left = (String)keys.nextElement();
      td1.setTextContent(left);
      row.appendChild(td1);
      Element td2 = doc.createElement("td");
      td2.setTextContent(req.getParameter(left));
      row.appendChild(td2);
      tbl.appendChild(row);
      appendNewline(doc, tbl);
    }
    return tbl;
  }
  
  @Override 
  public void doPost(HttpServletRequest req, HttpServletResponse res)
  throws IOException {
    res.setContentType("text/html;  charset=Windows-31J");
    req.setCharacterEncoding("Windows-31J");
    PrintWriter out = res.getWriter();
    out.println("<html><head></head><body>");
    try {
      // 読み込みの準備
      String filename = getServletContext().getRealPath("Guests.html");
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
      DocumentBuilder db = dbf.newDocumentBuilder();

      Document doc = db.parse(filename);       // 木構造の生成
      Element root = doc.getDocumentElement(); // rootはhtml要素のはず   
      Element body = (Element)root.getElementsByTagName("body").item(0);
                     // body要素の検索
      
      // 新しい tableの追加
      body.appendChild(createTableFromKeys(req, doc, req.getParameterNames()));
      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();
  }
}
