/*
 * Copyright (c) 2002-2003 Che, Dong Email: chedongATbigfoot.com/chedongATchedong.com
 * $Id: HelloUnicodeServlet.java,v 1.4 2003/04/19 03:34:39 chedong Exp $
 */
import java.io.IOException;
import java.io.PrintWriter;

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

/**
 * 一个简单的Servlet试验：用于说明如何自动根据HTTP头中的"Accept-Language"
 * 检测客户端的语言字符集设置，正确的将请求中的内容解码，并将内容用正确的
 * 编码方式编码反馈给客户端。
 *
 * @author Che, Dong
 */
public class HelloUnicodeServlet extends HttpServlet {
    /**
     * Brower language detection demo
     * @param req HTTP Servlet Request
     * @param res HTTP Servlet Response
     * @throws ServletException servlet error
     * @throws IOException  io error
     */
    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws ServletException, IOException {
        String clientLanguage = req.getHeader("Accept-Language");

        /*
         * comment following code to disable brower language detection
         */
        if (clientLanguage.equals("zh-cn")) {
            //for Simplied Chinese        
            req.setCharacterEncoding("GBK");
            res.setContentType("text/html; charset=GBK");
        } else if (clientLanguage.equals("zh-tw")) {
            //for Traditional Chinese
            req.setCharacterEncoding("BIG5");
            res.setContentType("text/html; charset=BIG5");
        } else {
            //default encoding
            req.setCharacterEncoding("ISO-8859-1");
            res.setContentType("text/html; charset=ISO-8859-1");
        }

        //defualt hello string
        String hello = "hello world";

        if (req.getParameter("hello") != null) {
            hello = req.getParameter("hello").trim();
        }

        PrintWriter pw = res.getWriter();
        pw.println(
            "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
        pw.println("<html>");
        pw.println("<head>");
        pw.println("<title>" + hello + "</title>");
        pw.println("</head>");
        pw.println();
        pw.println("<body>");
        pw.println();
        pw.println("<h1>'" + hello + "' length=" + hello.length()
            + "</h1><p />");

        //print current request and response charset encoding
        pw.println("ServletRequest's Charset Encoding = "
            + req.getCharacterEncoding());
        pw.println("<br />");
        pw.println("ServletResponse's Charset Encoding = "
            + res.getCharacterEncoding());
        pw.println("<br />");

        //print char array
        pw.println(getCharArray(hello));

        //show input form
        pw.println("<form action='' method='GET'>");
        pw.println("<input name='hello' value='");
        pw.print(hello);
        pw.print("'>");
        pw.println(" <input type='submit'>");
        pw.print("</form>");

        //print system properties
        pw.println("<pre>");
        System.getProperties().list(pw);
        pw.println("</pre>");

        pw.println("</body></html>");
        pw.close();
    }

    /**
     * print char array
     * @param inStr  input String
     * @return String output String
     */
    private static String getCharArray(String inStr) {
        char[] myBuffer = inStr.toCharArray();
        StringBuffer sb = new StringBuffer();

        //list each Charactor in byte value, short value, and UnicodeBlock Mapping
        for (int i = 0; i < inStr.length(); i++) {
            byte b = (byte) myBuffer[i];
            short s = (short) myBuffer[i];
            String hexB = Integer.toHexString(b).toUpperCase();
            String hexS = Integer.toHexString(s).toUpperCase();

            //print char
            sb.append("char[");
            sb.append(i);
            sb.append("]='");
            sb.append(myBuffer[i]);
            sb.append("'\t");

            //byte value
            sb.append("byte=");
            sb.append(b);
            sb.append(" \\u");
            sb.append(hexB);
            sb.append('\t');

            //short value
            sb.append("short=");
            sb.append(s);
            sb.append(" \\u");
            sb.append(hexS);
            sb.append('\t');

            //Unicode Block
            sb.append(Character.UnicodeBlock.of(myBuffer[i]));
            sb.append("<br />");
        }

        return sb.toString();
    }
}
