Mega Code Archive

 
Categories / Java Tutorial / Development
 

Debug Utility

/*  * Copyright (c) 1998-2002 Carnegie Mellon University.  All rights  * reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.  *  * 2. Redistributions in binary form must reproduce the above copyright  *    notice, this list of conditions and the following disclaimer in  *    the documentation and/or other materials provided with the  *    distribution.  *  * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND  * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY  * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  */ import java.io.PrintStream; import java.lang.reflect.Field; import java.lang.reflect.Modifier; public abstract class Debug {     public static final Debug VERBOSE = new Verbose ();     public static final Debug QUIET = new Quiet ();     public static final Debug NONE = new NoDebug ();     public static Debug getDebugLevel (Class cls)         throws NoSuchFieldException {         try {             Field fld = cls.getField ("debug");             if (fld.getType () != Debug.class                 || !Modifier.isStatic (fld.getModifiers ()))                 throw new NoSuchFieldException ();             return (Debug) fld.get (null);         } catch (IllegalArgumentException e) {             throw new NoSuchFieldException ();         } catch (IllegalAccessException e) {             throw new NoSuchFieldException ();         } catch (SecurityException e) {             throw new NoSuchFieldException ();         }     }     public static void setDebugLevel (Class cls, Debug level)          throws NoSuchFieldException {         try {             Field fld = cls.getField ("debug");             if (fld.getType () != Debug.class                 || !Modifier.isStatic (fld.getModifiers ()))                 throw new NoSuchFieldException ();             fld.set (null, level);         } catch (IllegalArgumentException e) {             throw new NoSuchFieldException ();         } catch (IllegalAccessException e) {             throw new NoSuchFieldException ();         } catch (SecurityException e) {             throw new NoSuchFieldException ();         }     }     public abstract boolean isEnabled ();     public abstract void print (String message);     public abstract void println (String message);     public abstract void print (Object obj);     public abstract void println (Object obj);     public abstract void report (Throwable t);     public abstract void printThreadInfo ();     public abstract void printStackTrace ();     public abstract void assertion (boolean f);     public static class Verbose extends Debug {          protected PrintStream out;         public Verbose () {             this (System.err);         }         public Verbose (PrintStream out) {             this.out = out;         }         public boolean isEnabled () {             return true;         }         public void print (String message) {             out.print (message);             out.flush ();         }         public void println (String message) {             out.println (message);             out.flush ();         }         public void print (Object obj) {             print (obj.toString ());         }         public void println (Object obj) {             println (obj.toString ());         }         public void report (Throwable t) {             t.printStackTrace (out);             out.flush ();         }         public void printThreadInfo () {             ThreadGroup g = Thread.currentThread().getThreadGroup ();             Thread[] t = new Thread[g.activeCount ()];             g.enumerate (t);             out.println ("Active threads in " + g);             for (int i=0; i<t.length; ++i)                 out.println (t[i]);             out.flush ();         }         public void printStackTrace () {             try {                 throw new Exception ();             } catch (Exception e) {                 e.printStackTrace (out);                 out.flush ();             }         }         public void assertion (boolean f) {             if (!f)                 throw new RuntimeException ("assertion failure");         }     }     public static class Quiet extends Verbose {          public Quiet () {         }         public Quiet (PrintStream out) {             super (out);         }         public boolean isEnabled () {             return false;         }         public void print (String message) {         }         public void println (String message) {         }         public void print (Object message) {         }         public void println (Object message) {         }         public void report (Throwable t) {             t.printStackTrace (out);             out.flush ();         }         public void printThreadInfo () {         }         public void printStackTrace () {         }         public void assertion (boolean f) {             if (!f) {                 try {                     throw new RuntimeException ("assertion failure");                 } catch (RuntimeException e) {                     e.printStackTrace (out);                     out.flush ();                 }             }         }     }     public static class NoDebug extends Debug {          public boolean isEnabled () {             return false;         }         public void print (String message) {         }         public void println (String message) {         }         public void print (Object message) {         }         public void println (Object message) {         }         public void report (Throwable t) {         }         public void printThreadInfo () {         }         public void printStackTrace () {         }         public void assertion (boolean f) {         }     } }