Debug.java
上传用户:sxlinghang
上传日期:2022-07-20
资源大小:1405k
文件大小:7k
源码类别:

数据库编程

开发平台:

Java

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.       This program is free software; you can redistribute it and/or modify
  4.       it under the terms of the GNU General Public License as published by
  5.       the Free Software Foundation; either version 2 of the License, or
  6.       (at your option) any later version.
  7.       This program is distributed in the hope that it will be useful,
  8.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.       GNU General Public License for more details.
  11.       You should have received a copy of the GNU General Public License
  12.       along with this program; if not, write to the Free Software
  13.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  14.  */
  15. package com.mysql.jdbc;
  16. import java.sql.DriverManager;
  17. import java.util.Hashtable;
  18. import java.util.StringTokenizer;
  19. /**
  20.  * The Debug class allows debug messages on a per-class basis.
  21.  *
  22.  * <p>
  23.  * The user issues a trace() call, listing the classes they wish to debug.
  24.  * </p>
  25.  *
  26.  * @author Mark Matthews
  27.  */
  28. public class Debug {
  29.     private static final Hashtable CLASSES = new Hashtable();
  30.     private static final Object MUTEX = new Object();
  31.     private static boolean watchAll = false;
  32.     /**
  33.      * Trace a method call.
  34.      *
  35.      * <p>
  36.      * If the user has registered in interest in the Class of Source, then  the
  37.      * Source class can trace method calls through this method.
  38.      * </p>
  39.      *
  40.      * @param source the Object issuing the methodCall() method
  41.      * @param method the name of the Method
  42.      * @param args a list of arguments
  43.      */
  44.     public static void methodCall(Object source, String method, Object[] args) {
  45.         synchronized (MUTEX) {
  46.             if (watchAll || CLASSES.contains(source.getClass().getName())) {
  47.                 // Print the message
  48.                 StringBuffer mesg = new StringBuffer("nTRACE: ");
  49.                 mesg.append(source.toString());
  50.                 mesg.append(".");
  51.                 mesg.append(method);
  52.                 mesg.append("( ");
  53.                 // Print the argument list
  54.                 for (int i = 0; i < (args.length - 1); i++) {
  55.                     if (args[i] == null) {
  56.                         mesg.append("null");
  57.                     } else {
  58.                         if (args[i] instanceof String) {
  59.                             mesg.append(""");
  60.                         }
  61.                         mesg.append(args[i].toString());
  62.                         if (args[i] instanceof String) {
  63.                             mesg.append(""");
  64.                         }
  65.                     }
  66.                     mesg.append(", ");
  67.                 }
  68.                 if (args.length > 0) {
  69.                     if (args[args.length - 1] instanceof String) {
  70.                         mesg.append(""");
  71.                     }
  72.                     mesg.append(args[args.length - 1]);
  73.                     if (args[args.length - 1] instanceof String) {
  74.                         mesg.append(""");
  75.                     }
  76.                 }
  77.                 mesg.append(" )n");
  78.                 if (DriverManager.getLogStream() == null) {
  79.                     System.out.println(mesg.toString());
  80.                 } else {
  81.                     DriverManager.println(mesg.toString());
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     /**
  87.      * Log a message.
  88.      *
  89.      * <p>
  90.      * If the user has registered in interest in the Class of Source, then  the
  91.      * Source class can trace return calls through this method.
  92.      * </p>
  93.      *
  94.      * @param source the Object issuing the msg() method
  95.      * @param message the name of the method
  96.      */
  97.     public static void msg(Object source, String message) {
  98.         synchronized (MUTEX) {
  99.             if (watchAll || CLASSES.contains(source.getClass().getName())) {
  100.                 // Print the message
  101.                 StringBuffer mesg = new StringBuffer("nTRACE: ");
  102.                 mesg.append(source.toString());
  103.                 mesg.append(": ");
  104.                 mesg.append(message);
  105.                 mesg.append("n");
  106.                 if (DriverManager.getLogStream() == null) {
  107.                     System.out.println(mesg.toString());
  108.                 } else {
  109.                     DriverManager.println(mesg.toString());
  110.                 }
  111.             }
  112.         }
  113.     }
  114.     /**
  115.      * Trace a method call.
  116.      *
  117.      * <p>
  118.      * If the user has registered in interest in the Class of Source, then  the
  119.      * Source class can trace return calls through this method.
  120.      * </p>
  121.      *
  122.      * @param source the Object issuing the returnValue() method
  123.      * @param method the name of the method
  124.      * @param value the return value
  125.      */
  126.     public static void returnValue(Object source, String method, Object value) {
  127.         synchronized (MUTEX) {
  128.             if (watchAll || CLASSES.contains(source.getClass().getName())) {
  129.                 // Print the message
  130.                 StringBuffer mesg = new StringBuffer("nTRACE: ");
  131.                 mesg.append(source.toString());
  132.                 mesg.append(".");
  133.                 mesg.append(method);
  134.                 mesg.append(": Returning -> ");
  135.                 if (value == null) {
  136.                     mesg.append("null");
  137.                 } else {
  138.                     mesg.append(value.toString());
  139.                 }
  140.                 mesg.append("n");
  141.                 if (DriverManager.getLogStream() == null) {
  142.                     System.out.println(mesg.toString());
  143.                 } else {
  144.                     DriverManager.println(mesg.toString());
  145.                 }
  146.             }
  147.         }
  148.     }
  149.     /**
  150.      * Set the classes to trace.
  151.      *
  152.      * @param classList the list of classes to trace, separated by colons or
  153.      *        the keyword &quot;ALL&quot; to trace all classes that use the
  154.      *        Debug class.
  155.      */
  156.     public static void trace(String classList) {
  157.         StringTokenizer tokenizer = new StringTokenizer(classList, ":");
  158.         synchronized (MUTEX) {
  159.             watchAll = false;
  160.             if (classList.equals("ALL")) {
  161.                 watchAll = true;
  162.             } else {
  163.                 while (tokenizer.hasMoreTokens()) {
  164.                     String className = tokenizer.nextToken().trim();
  165.                     if (!CLASSES.contains(className)) {
  166.                         CLASSES.put(className, className);
  167.                     }
  168.                 }
  169.             }
  170.         }
  171.     }
  172. }