Package org.nutz.lang

Source Code of org.nutz.lang.Dumps$HTTP

package org.nutz.lang;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import java.util.regex.Matcher;

import javax.servlet.http.HttpServletRequest;

import org.nutz.lang.stream.StringOutputStream;

/**
* 显示对象的信息,为日志以及调试提供帮助的函数集
*
* @author zozoh(zozohtnt@gmail.com)
* @author wendal(wendal1985@gmail.com)
* @author bonyfish(mc02cxj@gmail.com)
*/
public abstract class Dumps {

  /**
   * 显示 Matcher 的详细信息
   *
   * @param m
   *            Matcher 对象
   * @return 信息
   */
  public static String matcher(Matcher m) {
    StringBuilder sb = new StringBuilder();
    if (m.find())
      for (int i = 0; i <= m.groupCount(); i++)
        sb.append(String.format("%2d: %s\n", i, m.group(i)));
    else
      sb.append(String.format("No found!"));
    return sb.toString();
  }

  /**
   * 显示一个对象所有个 getter 函数返回,以及 public 的 Field 的值
   *
   * @param obj
   *            对象
   * @return 信息
   */
  public static String obj(Object obj) {
    if (null == obj)
      return "null";
    StringBuilder sb = new StringBuilder(obj.getClass().getName() + "\n\n[Fields:]");
    Mirror<?> mirror = Mirror.me(obj.getClass());
    for (Field f : mirror.getType().getFields())
      if (Modifier.isPublic(f.getModifiers()))
        try {
          sb.append(String.format("\n\t%10s : %s", f.getName(), f.get(obj)));
        }
        catch (Exception e1) {
          sb.append(String.format("\n\t%10s : %s", f.getName(), e1.getMessage()));
        }
    sb.append("\n\n[Methods:]");
    for (Method m : mirror.getType().getMethods())
      if (Modifier.isPublic(m.getModifiers()))
        if (m.getName().startsWith("get"))
          if (m.getParameterTypes().length == 0)
            try {
              sb.append(String.format("\n\t%10s : %s", m.getName(), m.invoke(obj)));
            }
            catch (Exception e) {
              sb.append(String.format("\n\t%10s : %s", m.getName(), e.getMessage()));
            }
    return sb.toString();
  }

  /**
   * 显示 HTTP 内容的名称空间
   */
  public static class HTTP {

    public static enum MODE {
      ALL, HEADER_ONLY, BODY_ONLY
    }

    /**
     * 详细显示一个 HTTP 请求的全部内容
     *
     * @param req
     *            请求对象
     * @param ops
     *            内容的输出流
     * @param mode
     *            显示 HTTP 头信息的模式: MODE.ALL or MODE.HEADER_ONLY
     */
    public static void http(HttpServletRequest req, OutputStream ops, MODE mode) {
      InputStream ins;
      int b;
      try {
        /*
         * Header
         */
        if (MODE.ALL == mode || MODE.HEADER_ONLY == mode) {
          StringBuilder sb = new StringBuilder();
          Enumeration<?> ens = req.getHeaderNames();
          while (ens.hasMoreElements()) {
            String name = ens.nextElement().toString();
            sb.append(name).append(": ").append(req.getHeader(name)).append("\r\n");
          }
          sb.append("\r\n");
          ins = Lang.ins(sb);
          while (-1 != (b = ins.read()))
            ops.write(b);
        }
        /*
         * Body
         */
        if (MODE.ALL == mode || MODE.BODY_ONLY == mode) {
          ins = req.getInputStream();
          while (-1 != (b = ins.read()))
            ops.write(b);
          ins.close();
        }
        ops.flush();
        ops.close();
      }
      catch (IOException e) {
        throw Lang.wrapThrow(e);
      }
    }

    /**
     * 详细显示一个 HTTP 请求的全部内容
     *
     * @param req
     *            请求对象
     * @param mode
     *            显示 HTTP 头信息的模式: MODE.ALL or MODE.HEADER_ONLY
     * @return 一个文本字符串表示 HTTP 的全部内容
     */
    public static String http(HttpServletRequest req, MODE mode) {
      StringBuilder sb = new StringBuilder();
      OutputStream ops = new StringOutputStream(sb, req.getCharacterEncoding());
      http(req, ops, mode);
      return sb.toString();
    }

    public static void body(HttpServletRequest req, OutputStream ops) {
      http(req, ops, MODE.BODY_ONLY);
    }

    public static String body(HttpServletRequest req) {
      return http(req, MODE.BODY_ONLY);
    }

    public static void header(HttpServletRequest req, OutputStream ops) {
      http(req, ops, MODE.HEADER_ONLY);
    }

    public static String header(HttpServletRequest req) {
      return http(req, MODE.HEADER_ONLY);
    }

    public static void all(HttpServletRequest req, OutputStream ops) {
      http(req, ops, MODE.ALL);
    }

    public static String all(HttpServletRequest req) {
      return http(req, MODE.ALL);
    }
  }

}
TOP

Related Classes of org.nutz.lang.Dumps$HTTP

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.