/*
Copyright (C) 2002 MySQL AB
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.mysql.jdbc;
import java.sql.DriverManager;
import java.util.Hashtable;
import java.util.StringTokenizer;
/**
* The Debug class allows debug messages on a per-class basis.
*
* <p>
* The user issues a trace() call, listing the classes they wish to debug.
* </p>
*
* @author Mark Matthews
*/
public class Debug {
private static final Hashtable CLASSES = new Hashtable();
private static final Object MUTEX = new Object();
private static boolean watchAll = false;
/**
* Trace a method call.
*
* <p>
* If the user has registered in interest in the Class of Source, then the
* Source class can trace method calls through this method.
* </p>
*
* @param source the Object issuing the methodCall() method
* @param method the name of the Method
* @param args a list of arguments
*/
public static void methodCall(Object source, String method, Object[] args) {
synchronized (MUTEX) {
if (watchAll || CLASSES.contains(source.getClass().getName())) {
// Print the message
StringBuffer mesg = new StringBuffer("\nTRACE: ");
mesg.append(source.toString());
mesg.append(".");
mesg.append(method);
mesg.append("( ");
// Print the argument list
for (int i = 0; i < (args.length - 1); i++) {
if (args[i] == null) {
mesg.append("null");
} else {
if (args[i] instanceof String) {
mesg.append("\"");
}
mesg.append(args[i].toString());
if (args[i] instanceof String) {
mesg.append("\"");
}
}
mesg.append(", ");
}
if (args.length > 0) {
if (args[args.length - 1] instanceof String) {
mesg.append("\"");
}
mesg.append(args[args.length - 1]);
if (args[args.length - 1] instanceof String) {
mesg.append("\"");
}
}
mesg.append(" )\n");
if (DriverManager.getLogStream() == null) {
System.out.println(mesg.toString());
} else {
DriverManager.println(mesg.toString());
}
}
}
}
/**
* Log a message.
*
* <p>
* If the user has registered in interest in the Class of Source, then the
* Source class can trace return calls through this method.
* </p>
*
* @param source the Object issuing the msg() method
* @param message the name of the method
*/
public static void msg(Object source, String message) {
synchronized (MUTEX) {
if (watchAll || CLASSES.contains(source.getClass().getName())) {
// Print the message
StringBuffer mesg = new StringBuffer("\nTRACE: ");
mesg.append(source.toString());
mesg.append(": ");
mesg.append(message);
mesg.append("\n");
if (DriverManager.getLogStream() == null) {
System.out.println(mesg.toString());
} else {
DriverManager.println(mesg.toString());
}
}
}
}
/**
* Trace a method call.
*
* <p>
* If the user has registered in interest in the Class of Source, then the
* Source class can trace return calls through this method.
* </p>
*
* @param source the Object issuing the returnValue() method
* @param method the name of the method
* @param value the return value
*/
public static void returnValue(Object source, String method, Object value) {
synchronized (MUTEX) {
if (watchAll || CLASSES.contains(source.getClass().getName())) {
// Print the message
StringBuffer mesg = new StringBuffer("\nTRACE: ");
mesg.append(source.toString());
mesg.append(".");
mesg.append(method);
mesg.append(": Returning -> ");
if (value == null) {
mesg.append("null");
} else {
mesg.append(value.toString());
}
mesg.append("\n");
if (DriverManager.getLogStream() == null) {
System.out.println(mesg.toString());
} else {
DriverManager.println(mesg.toString());
}
}
}
}
/**
* Set the classes to trace.
*
* @param classList the list of classes to trace, separated by colons or
* the keyword "ALL" to trace all classes that use the
* Debug class.
*/
public static void trace(String classList) {
StringTokenizer tokenizer = new StringTokenizer(classList, ":");
synchronized (MUTEX) {
watchAll = false;
if (classList.equals("ALL")) {
watchAll = true;
} else {
while (tokenizer.hasMoreTokens()) {
String className = tokenizer.nextToken().trim();
if (!CLASSES.contains(className)) {
CLASSES.put(className, className);
}
}
}
}
}
}