// AP(r) Computer Science Marine Biology Simulation:
// The Debug class is copyright(c) 2002 College Entrance
// Examination Board (www.collegeboard.com).
//
// This class 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.
//
// This class 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.
package edu.kzoo.util;
import java.util.Stack;
/**
* AP® Computer Science Marine Biology Simulation:
* The Debug
class supports conditional printing of
* debugging messages.
*
*
* The turnOn
and turnOff
methods cause the
* previous debugging state to be saved on a stack so that it can be
* restored later using the restoreState
method.
*
*
* For example, consider the following scenario. Method 1 turns on * debugging and calls Method 2. Method 2, not knowing that debugging * is already on, turns debugging on and calls Method 3. Method 3 * turns debugging off. Before returning, Method 3 restores the * previous state, which turns debugging back on (as set by Method 2). * Before Method 2 returns, it also restores the state, which will * leave debugging on (as set by Method 1). This is illustrated in * the pseudo-code below. *
* in Method 1: * (A: in Method 1; we don't know debugging state) * turn on debugging * (debugging state is now on; Debug.println will print) * call Method 2 * (B: now in Method 2; debugging state is unchanged (on)) * turn on debugging * (debugging state is on (still)) * call Method 3 * (C: now in Method 3; debugging state is unchanged (on)) * turn off debugging * (debugging state is now off; Debug.println will not print) * restore state * (debugging state is restored to what it was at point C (on)) * return to Method 2 * (D: now in Method 2; debugging state is unchanged (still on)) * restore state * (debugging state is still on because it was on at point B) * return to Method 1 * (E: now in Method 1; debugging state unchanged (still on)) * restore state * (debugging state is whatever it was at point A (unknown)) ** Note that when Method 2 restores the debugging state, it does not go * back to its most recent state, which would be off (as set by Method 3). * State restoration is controlled by a stack, not by a toggle. * *
* The Debug
class is
* copyright© 2002 College Entrance Examination Board
* (www.collegeboard.com).
*
* @author Alyce Brady
* @version 1 July 2002
**/
public class Debug
{
private static boolean debugOn = false; // debugging is on or off?
private static Stack oldStates = new Stack(); // to restore previous states
/** Checks whether debugging is on. The Debug.print
* and Debug.println
) methods use isOn
* to decide whether or not to print.
**/
public static boolean isOn ()
{
return debugOn;
}
/** Checks whether debugging is off.
**/
public static boolean isOff()
{
return ! isOn();
}
/** Turns debugging on.
**/
public static void turnOn()
{
// Push current state on stack.
oldStates.push (new Boolean(debugOn));
debugOn = true;
}
/** Turns debugging off.
**/
public static void turnOff()
{
// Push current state on stack.
oldStates.push (new Boolean(debugOn));
debugOn = false;
}
/** Restores the previous debugging state. If there is
* no previous state to restore, restoreState
turns
* debugging off.
**/
public static void restoreState()
{
// Is there a previous state to restore to?
if ( oldStates.empty() )
debugOn = false;
else
debugOn = ((Boolean) oldStates.pop()).booleanValue();
}
/** Prints debugging message without appending a newline character at
* the end.
* If debugging is turned on, message
is
* printed to System.out
without a newline.
* @param message debugging message to print
**/
public static void print(String message)
{
if ( debugOn )
System.out.print(message);
}
/** Prints debugging message, appending a newline character at the end.
* If debugging is turned on, message
is
* printed to System.out
followed by a newline.
* @param message debugging message to print
**/
public static void println(String message)
{
if ( debugOn )
System.out.println(message);
}
}