Debug.java Source code

Java tutorial

Introduction

Here is the source code for Debug.java

Source

/*
 * 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) {
        }
    }

}