Debug.java Source code

Java tutorial

Introduction

Here is the source code for Debug.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//package org.apache.sanselan.util;

import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.Map;

public final class Debug {

    public static void debug(String message) {
        System.out.println(message);
    }

    public static void debug(Object o) {
        System.out.println(o == null ? "null" : o.toString());
    }

    public static String getDebug(String message) {
        return message;
    }

    public static void debug() {
        newline();
    }

    public static void newline() {
        System.out.print(newline);
    }

    public static String getDebug(String message, int value) {
        return getDebug(message + ": " + (value));
    }

    public static String getDebug(String message, double value) {
        return getDebug(message + ": " + (value));
    }

    public static String getDebug(String message, String value) {
        return getDebug(message + " " + value);
    }

    public static String getDebug(String message, long value) {
        return getDebug(message + " " + Long.toString(value));
    }

    public static String getDebug(String message, int v[]) {
        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(message + " (" + null + ")" + newline);
        else {
            result.append(message + " (" + v.length + ")" + newline);
            for (int i = 0; i < v.length; i++)
                result.append("\t" + v[i] + newline);
            result.append(newline);
        }
        return result.toString();
    }

    public static String getDebug(String message, byte v[]) {
        final int max = 250;
        return getDebug(message, v, max);
    }

    public static String getDebug(String message, byte v[], int max) {

        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(message + " (" + null + ")" + newline);
        else {
            result.append(message + " (" + v.length + ")" + newline);
            for (int i = 0; i < max && i < v.length; i++) {
                int b = 0xff & v[i];

                char c;
                if (b == 0 || b == 10 || b == 11 || b == 13)
                    c = ' ';
                else
                    c = (char) b;

                result.append("\t" + i + ": " + b + " (" + c + ", 0x" + Integer.toHexString(b) + ")" + newline);
            }
            if (v.length > max)
                result.append("\t" + "..." + newline);

            result.append(newline);
        }
        return result.toString();
    }

    public static String getDebug(String message, char v[]) {
        StringBuffer result = new StringBuffer();

        if (v == null)
            result.append(getDebug(message + " (" + null + ")") + newline);
        else {
            result.append(getDebug(message + " (" + v.length + ")") + newline);
            for (int i = 0; i < v.length; i++)
                result.append(getDebug("\t" + v[i] + " (" + (0xff & v[i])) + ")" + newline);
            result.append(newline);
        }
        return result.toString();
    }

    private static long counter = 0;

    public static String getDebug(String message, java.util.List v) {
        StringBuffer result = new StringBuffer();

        String suffix = " [" + counter++ + "]";

        result.append(getDebug(message + " (" + v.size() + ")" + suffix) + newline);
        for (int i = 0; i < v.size(); i++)
            result.append(getDebug("\t" + v.get(i).toString() + suffix) + newline);
        result.append(newline);

        return result.toString();
    }

    public static void debug(String message, Map map) {
        debug(getDebug(message, map));
    }

    public static String getDebug(String message, Map map) {
        StringBuffer result = new StringBuffer();

        if (map == null)
            return getDebug(message + " map: " + null);

        ArrayList keys = new ArrayList(map.keySet());
        result.append(getDebug(message + " map: " + keys.size()) + newline);
        for (int i = 0; i < keys.size(); i++) {
            Object key = keys.get(i);
            Object value = map.get(key);
            result.append(getDebug("\t" + i + ": '" + key + "' -> '" + value + "'") + newline);
        }

        result.append(newline);

        return result.toString();
    }

    public static boolean compare(String prefix, Map a, Map b) {
        return compare(prefix, a, b, null, null);
    }

    //    public static String newline = System.getProperty("line.separator");
    public static String newline = "\r\n";

    private static void log(StringBuffer buffer, String s) {
        Debug.debug(s);
        if (buffer != null)
            buffer.append(s + newline);
    }

    public static boolean compare(String prefix, Map a, Map b, ArrayList ignore, StringBuffer buffer) {
        if ((a == null) && (b == null)) {
            log(buffer, prefix + " both maps null");
            return true;
        }
        if (a == null) {
            log(buffer, prefix + " map a: null, map b: map");
            return false;
        }
        if (b == null) {
            log(buffer, prefix + " map a: map, map b: null");
            return false;
        }

        ArrayList keys_a = new ArrayList(a.keySet());
        ArrayList keys_b = new ArrayList(b.keySet());

        if (ignore != null) {
            keys_a.removeAll(ignore);
            keys_b.removeAll(ignore);
        }

        boolean result = true;

        for (int i = 0; i < keys_a.size(); i++) {
            Object key = keys_a.get(i);
            if (!keys_b.contains(key)) {
                log(buffer, prefix + "b is missing key '" + key + "' from a");
                result = false;
            } else {
                keys_b.remove(key);
                Object value_a = a.get(key);
                Object value_b = b.get(key);
                if (!value_a.equals(value_b)) {
                    log(buffer, prefix + "key(" + key + ") value a: " + value_a + ") !=  b: " + value_b + ")");
                    result = false;
                }
            }
        }
        for (int i = 0; i < keys_b.size(); i++) {
            Object key = keys_b.get(i);

            log(buffer, prefix + "a is missing key '" + key + "' from b");
            result = false;
        }

        if (result)
            log(buffer, prefix + "a is the same as  b");

        return result;
    }

    private static final String byteQuadToString(int bytequad) {
        byte b1 = (byte) ((bytequad >> 24) & 0xff);
        byte b2 = (byte) ((bytequad >> 16) & 0xff);
        byte b3 = (byte) ((bytequad >> 8) & 0xff);
        byte b4 = (byte) ((bytequad >> 0) & 0xff);

        char c1 = (char) b1;
        char c2 = (char) b2;
        char c3 = (char) b3;
        char c4 = (char) b4;
        //        return new String(new char[] { c1, c2, c3, c4 });
        StringBuffer fStringBuffer = new StringBuffer();
        fStringBuffer.append(new String(new char[] { c1, c2, c3, c4 }));
        fStringBuffer.append(" bytequad: " + bytequad);
        fStringBuffer.append(" b1: " + b1);
        fStringBuffer.append(" b2: " + b2);
        fStringBuffer.append(" b3: " + b3);
        fStringBuffer.append(" b4: " + b4);

        return fStringBuffer.toString();
    }

    public static String getDebug(String message, boolean value) {
        return getDebug(message + " " + ((value) ? ("true") : ("false")));
    }

    public static String getDebug(String message, File file) {
        return getDebug(message + ": " + ((file == null) ? "null" : file.getPath()));
    }

    public static String getDebug(String message, Date value) {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        return getDebug(message, (value == null) ? "null" : df.format(value));
    }

    public static String getDebug(String message, Calendar value) {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        return getDebug(message, (value == null) ? "null" : df.format(value.getTime()));
    }

    public static void debug(String message, Object value) {
        if (value == null)
            debug(message, "null");
        else if (value instanceof char[])
            debug(message, (char[]) value);
        else if (value instanceof byte[])
            debug(message, (byte[]) value);
        else if (value instanceof int[])
            debug(message, (int[]) value);
        else if (value instanceof String)
            debug(message, (String) value);
        else if (value instanceof java.util.List)
            debug(message, (java.util.List) value);
        else if (value instanceof Map)
            debug(message, (Map) value);
        else if (value instanceof File)
            debug(message, (File) value);
        else if (value instanceof Date)
            debug(message, (Date) value);
        else if (value instanceof Calendar)
            debug(message, (Calendar) value);
        else
            debug(message, value.toString());
    }

    public static void debug(String message, Object value[]) {
        if (value == null) {
            debug(message, "null");
        } else {
            debug(message, value.length);
            final int max = 10;
            for (int i = 0; i < value.length && i < max; i++) {
                debug("\t" + i, value[i]);
            }
            if (value.length > max) {
                debug("\t...");
            }
        }
        debug();
    }

    public static String getDebug(String message, Object value) {
        if (value == null)
            return getDebug(message, "null");
        else if (value instanceof Calendar)
            return getDebug(message, (Calendar) value);
        else if (value instanceof Date)
            return getDebug(message, (Date) value);
        else if (value instanceof File)
            return getDebug(message, (File) value);
        else if (value instanceof Map)
            return getDebug(message, (Map) value);
        else if (value instanceof Map)
            return getDebug(message, (Map) value); //
        //        else if (value instanceof Object) // getDebug(message, (Object) value);
        else if (value instanceof String)
            return getDebug(message, (String) value);
        else if (value instanceof byte[])
            return getDebug(message, (byte[]) value);
        else if (value instanceof char[])
            return getDebug(message, (char[]) value);
        else if (value instanceof int[])
            return getDebug(message, (int[]) value);
        else if (value instanceof java.util.List)
            return getDebug(message, (java.util.List) value);
        else
            return getDebug(message, value.toString());
    }

    public static String getType(Object value) {
        if (value == null)
            return "null";
        else if (value instanceof Object[])
            return "[Object[]: " + ((Object[]) value).length + "]";
        else if (value instanceof char[])
            return "[char[]: " + ((char[]) value).length + "]";
        else if (value instanceof byte[])
            return "[byte[]: " + ((byte[]) value).length + "]";
        else if (value instanceof short[])
            return "[short[]: " + ((short[]) value).length + "]";
        else if (value instanceof int[])
            return "[int[]: " + ((int[]) value).length + "]";
        else if (value instanceof long[])
            return "[long[]: " + ((long[]) value).length + "]";
        else if (value instanceof float[])
            return "[float[]: " + ((float[]) value).length + "]";
        else if (value instanceof double[])
            return "[double[]: " + ((double[]) value).length + "]";
        else if (value instanceof boolean[])
            return "[boolean[]: " + ((boolean[]) value).length + "]";
        else
            return value.getClass().getName();
    }

    public static boolean isArray(Object value) {
        if (value == null)
            return false;
        else if (value instanceof Object[])
            return true;
        else if (value instanceof char[])
            return true;
        else if (value instanceof byte[])
            return true;
        else if (value instanceof short[])
            return true;
        else if (value instanceof int[])
            return true;
        else if (value instanceof long[])
            return true;
        else if (value instanceof float[])
            return true;
        else if (value instanceof double[])
            return true;
        else if (value instanceof boolean[])
            return true;
        else
            return false;
    }

    public static String getDebug(String message, Object value[]) {
        StringBuffer result = new StringBuffer();

        if (value == null) {
            result.append(getDebug(message, "null") + newline);
        } else {
            result.append(getDebug(message, value.length));
            final int max = 10;
            for (int i = 0; i < value.length && i < max; i++) {
                result.append(getDebug("\t" + i, value[i]) + newline);
            }
            if (value.length > max) {
                result.append(getDebug("\t...") + newline);
            }
        }
        result.append(newline);

        return result.toString();
    }

    public static String getDebug(Class fClass, Throwable e) {
        return getDebug(fClass == null ? "[Unknown]" : fClass.getName(), e);
    }

    public static void debug(Class fClass, Throwable e) {
        debug(fClass.getName(), e);
    }

    private static final SimpleDateFormat timestamp = new SimpleDateFormat("yyyy-MM-dd kk:mm:ss:SSS");

    public static void debug(String message, boolean value) {
        debug(message + " " + ((value) ? ("true") : ("false")));
    }

    public static void debug(String message, byte v[]) {
        debug(getDebug(message, v));
    }

    public static void debug(String message, char v[]) {
        debug(getDebug(message, v));
    }

    public static void debug(String message, Calendar value) {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        debug(message, (value == null) ? "null" : df.format(value.getTime()));
    }

    public static void debug(String message, Date value) {
        DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        debug(message, (value == null) ? "null" : df.format(value));
    }

    public static void debug(String message, double value) {
        debug(message + ": " + (value));
    }

    public static void debug(String message, File file) {
        debug(message + ": " + ((file == null) ? "null" : file.getPath()));
    }

    public static void debug(String message, int value) {
        debug(message + ": " + (value));
    }

    public static void debug(String message, int v[]) {
        debug(getDebug(message, v));
    }

    public static void debug(String message, byte v[], int max) {
        debug(getDebug(message, v, max));
    }

    public static void debug(String message, java.util.List v) {
        String suffix = " [" + counter++ + "]";

        debug(message + " (" + v.size() + ")" + suffix);
        for (int i = 0; i < v.size(); i++)
            debug("\t" + v.get(i).toString() + suffix);
        debug();
    }

    public static void debug(String message, long value) {
        debug(message + " " + Long.toString(value));
    }

    public static void debug(String prefix, Point p) {
        System.out.println(prefix + ": " + ((p == null) ? "null" : (p.x + ", " + p.y)));
    }

    public static void debug(String prefix, Rectangle r) {
        debug(getDebug(prefix, r));
    }

    public static void debug(String message, String value) {
        debug(message + " " + value);
    }

    public static void debug(String message, Throwable e) {
        debug(getDebug(message, e));
    }

    public static void debug(Throwable e) {
        debug(getDebug(e));
    }

    public static void debug(Throwable e, int value) {
        debug(getDebug(e, value));
    }

    public static void dumpStack() {
        debug(getStackTrace(new Exception("Stack trace"), -1, 1));
    }

    public static void dumpStack(int limit) {
        debug(getStackTrace(new Exception("Stack trace"), limit, 1));
    }

    public static String getDebug(String message, Throwable e) {
        return message + newline + getDebug(e);
    }

    public static String getDebug(Throwable e) {
        return getDebug(e, -1);
    }

    public static String getDebug(Throwable e, int max) {
        StringBuffer result = new StringBuffer();

        String datetime = timestamp.format(new Date()).toLowerCase();

        result.append(newline);
        result.append("Throwable: " + ((e == null) ? "" : ("(" + e.getClass().getName() + ")")) + ":" + datetime
                + newline);
        result.append("Throwable: " + ((e == null) ? "null" : e.getLocalizedMessage()) + newline);
        result.append(newline);

        result.append(getStackTrace(e, max));

        result.append("Caught here:" + newline);
        result.append(getStackTrace(new Exception(), max, 1));
        //        Debug.dumpStack();
        result.append(newline);
        return result.toString();
    }

    public static String getStackTrace(Throwable e) {
        return getStackTrace(e, -1);
    }

    public static String getStackTrace(Throwable e, int limit) {
        return getStackTrace(e, limit, 0);
    }

    public static String getStackTrace(Throwable e, int limit, int skip) {
        StringBuffer result = new StringBuffer();

        if (e != null) {
            StackTraceElement stes[] = e.getStackTrace();
            if (stes != null) {
                for (int i = skip; i < stes.length && (limit < 0 || i < limit); i++) {
                    StackTraceElement ste = stes[i];

                    result.append("\tat " + ste.getClassName() + "." + ste.getMethodName() + "(" + ste.getFileName()
                            + ":" + ste.getLineNumber() + ")" + newline);
                }
                if (limit >= 0 && stes.length > limit)
                    result.append("\t..." + newline);
            }

            //            e.printStackTrace(System.out);
            result.append(newline);
        }

        return result.toString();
    }

    public static void debugByteQuad(String message, int i) {
        int alpha = (i >> 24) & 0xff;
        int red = (i >> 16) & 0xff;
        int green = (i >> 8) & 0xff;
        int blue = (i >> 0) & 0xff;

        System.out.println(message + ": " + "alpha: " + alpha + ", " + "red: " + red + ", " + "green: " + green
                + ", " + "blue: " + blue);
    }

    public static void debugIPQuad(String message, int i) {
        int b1 = (i >> 24) & 0xff;
        int b2 = (i >> 16) & 0xff;
        int b3 = (i >> 8) & 0xff;
        int b4 = (i >> 0) & 0xff;

        System.out.println(
                message + ": " + "b1: " + b1 + ", " + "b2: " + b2 + ", " + "b3: " + b3 + ", " + "b4: " + b4);
    }

    public static void debugIPQuad(String message, byte bytes[]) {
        System.out.print(message + ": ");
        if (bytes == null)
            System.out.print("null");
        else {
            for (int i = 0; i < bytes.length; i++) {
                if (i > 0)
                    System.out.print(".");
                System.out.print(0xff & bytes[i]);
            }
        }
        System.out.println();
    }

    public static String getDebug(String prefix, Dimension r) {
        String s_ar1 = "null";
        String s_ar2 = "null";

        if (r != null) {
            double aspect_ratio = ((double) r.width) / ((double) r.height);
            double aspect_ratio2 = 1.0 / aspect_ratio;

            s_ar1 = "" + aspect_ratio;
            s_ar2 = "" + aspect_ratio2;

            if (s_ar1.length() > 7)
                s_ar1 = s_ar1.substring(0, 7);
            if (s_ar2.length() > 7)
                s_ar2 = s_ar2.substring(0, 7);
        }

        return (prefix + ": " + ((r == null) ? "null" : (r.width + "x" + r.height)) + " aspect_ratio: " + s_ar1
                + " (" + s_ar2 + ")");
    }

    public static void debug(String prefix, Dimension r) {
        debug(getDebug(prefix, r));
    }

    public static String getDebug(String prefix, Rectangle r) {
        String s_ar1 = "null";
        String s_ar2 = "null";

        if (r != null) {
            double aspect_ratio = ((double) r.width) / ((double) r.height);
            double aspect_ratio2 = 1.0 / aspect_ratio;

            s_ar1 = "" + aspect_ratio;
            s_ar2 = "" + aspect_ratio2;

            if (s_ar1.length() > 7)
                s_ar1 = s_ar1.substring(0, 7);
            if (s_ar2.length() > 7)
                s_ar2 = s_ar2.substring(0, 7);
        }

        return (prefix + ": " + ((r == null) ? "null" : (r.x + "x" + r.y + "," + r.width + "x" + r.height))
                + " aspect_ratio: " + s_ar1 + " (" + s_ar2 + ")");
    }

    public static String getDebug(String prefix, Point p) {
        return (prefix + ": " + ((p == null) ? "null" : (p.x + ", " + p.y)));
    }

    public static void dump(String prefix, Object value) {
        if (value == null)
            debug(prefix, "null");
        else if (value instanceof Object[]) {
            Object[] array = (Object[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                dump(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof int[]) {
            int[] array = (int[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof char[]) {
            char[] array = (char[]) value;
            debug(prefix, "[" + new String(array) + "]");
        } else if (value instanceof long[]) {
            long[] array = (long[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof boolean[]) {
            boolean[] array = (boolean[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof byte[]) {
            byte[] array = (byte[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof float[]) {
            float[] array = (float[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof byte[]) {
            double[] array = (double[]) value;
            debug(prefix, array);
            for (int i = 0; i < array.length; i++)
                debug(prefix + "\t" + i + ": ", array[i]);
        } else if (value instanceof java.util.List) {
            java.util.List list = (java.util.List) value;
            debug(prefix, "list");
            for (int i = 0; i < list.size(); i++)
                dump(prefix + "\t" + "list: " + i + ": ", list.get(i));
        } else if (value instanceof Map) {
            java.util.Map map = (java.util.Map) value;
            debug(prefix, "map");
            ArrayList keys = new ArrayList(map.keySet());
            Collections.sort(keys);
            for (int i = 0; i < keys.size(); i++) {
                Object key = keys.get(i);
                dump(prefix + "\t" + "map: " + key + " -> ", map.get(key));
            }
        }
        //        else if (value instanceof String)
        //            debug(prefix, value);
        else {
            debug(prefix, value.toString());
            debug(prefix + "\t", value.getClass().getName());
        }
    }

    public static final void purgeMemory() {
        try {
            //            Thread.sleep(50);
            System.runFinalization();
            Thread.sleep(50);
            System.gc();
            Thread.sleep(50);
        } catch (Throwable e) {
            Debug.debug(e);
        }
    }

}