package chat.server; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.HashSet; import java.util.Set; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import chat.server.call.JSONObject; public class AppDispatcher implements Filter { private static Logger logger; private static AppDispatcher instance; private static String contextPath; private static int contextLength; private static Set resourceSet; static { logger = Logger.getLogger(AppDispatcher.class); } public AppDispatcher() { instance = this; initResourceList(); } public synchronized static AppDispatcher getInstance() { if (instance == null) { instance = new AppDispatcher(); } return instance; } public void init(FilterConfig filterConfig) throws ServletException { ServletContext servletContext = filterConfig.getServletContext(); contextPath = servletContext.getContextPath(); contextLength = contextPath.length(); } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; request.setCharacterEncoding("utf-8"); try { String uri = request.getRequestURI(); logger.debug("filter request URI:" + uri); uri = uri.substring(contextLength); int pos_root = uri.lastIndexOf("/root/"); uri = pos_root >= 0 ? uri.substring(pos_root + 5) : uri; try { uri = URLDecoder.decode(uri, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } //1. String suffix = getSuffix(uri); if (resourceSet.contains(suffix)) { RequestDispatcher dispatcher = request.getRequestDispatcher(uri); dispatcher.forward(request, response); return; } //2. // RequestParams dataPool = new RequestParams(request); // HttpResultPool resultPool = new HttpResultPool(response); // console.receive(uri, dataPool, resultPool); // writeResultPool(response, resultPool); return; } catch (Exception e) { String error = printStackToString(e); logger.error("dispatch error:" + e.getMessage()); logger.error(error); writeError(request, response, error); } } private void writeError(HttpServletRequest request, HttpServletResponse response, String error) throws IOException { PrintWriter writer = response.getWriter(); JSONObject json = new JSONObject(); json.beginObject(); json.addValue("success", false); json.addValue("errorcode", "ServerError"); json.addValue("errorMessage", encode(error)); json.endObject(); writer.print(json.toString()); writer.flush(); } public void destroy() { } private String printStackToString(Exception e) { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(outStream); e.printStackTrace(printStream); return outStream.toString(); } private String encode(String value) throws UnsupportedEncodingException { return URLEncoder.encode(value, "UTF-8"); } private void initResourceList() { resourceSet = new HashSet(); resourceSet.add(".html"); resourceSet.add(".css"); resourceSet.add(".js"); resourceSet.add(".png"); resourceSet.add(".jpg"); resourceSet.add(".bmp"); resourceSet.add(".icon"); } private String getSuffix(String uri) { String result = null; int pos = uri.lastIndexOf("."); if (pos <= 0) { return result; } result = uri.substring(pos); result = result.toLowerCase(); return result; } }