Debug Util : Debug « Development Class « Java






Debug Util

    

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

}

   
    
    
    
  








Related examples in the same category

1.A simple logging facility.
2.Debug Utilities
3.Debug InputStream
4.Methods for printing Debug messages
5.Trace InputStream
6.Trace OutputStream
7.Debug Utility
8.Debugging utility that reports, in a brute force manner, any internal data of a class instance
9.Swing Console
10.How to do Benchmark
11.Methods for logging events
12.Printing indented text
13.Prints messages formatted for a specific line width.
14.Class providing static methods to log diagnostics
15.A bean that can be used to keep track of a counter
16.An integer synchronized counter class.
17.Counts down from a specified value the number of bytes actually read from the wrapped InputStream.
18.A long integer counter class
19.Logging class to record errors or unexpected behavior to a file
20.Handle obtaining string timestamps
21.Scans java source files in cvs tree and validates the license header
22.Array debug util
23.A simple frame that allows quick and easy visualisation of something