com.espertech.esper.util.ThreadLogUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.espertech.esper.util.ThreadLogUtil.java

Source

/**************************************************************************************
 * Copyright (C) 2008 EsperTech, Inc. All rights reserved.                            *
 * http://esper.codehaus.org                                                          *
 * http://www.espertech.com                                                           *
 * ---------------------------------------------------------------------------------- *
 * The software in this package is published under the terms of the GPL license       *
 * a copy of which has been included with this distribution in the license.txt file.  *
 **************************************************************************************/
package com.espertech.esper.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * Utility class for logging threading-related messages.
 * <p>
 * Prints thread information and lock-specific info. 
 */
public class ThreadLogUtil {
    /**
     * Set trace log level.
     */
    public static int TRACE = 0;

    /**
     * Set info log level.
     */
    public static int INFO = 1;

    /**
     * Enable trace logging.
     */
    public final static boolean ENABLED_TRACE = false;

    /**
     * Enable info logging.
     */
    public final static boolean ENABLED_INFO = false;

    /**
     * If enabled, logs for trace level the given objects and text
     * @param text to log
     * @param objects to write
     */
    public static void trace(String text, Object... objects) {
        if (!ENABLED_TRACE) {
            return;
        }
        write(text, objects);
    }

    /**
     * If enabled, logs for info level the given objects and text
     * @param text to log
     * @param objects to write
     */
    public static void info(String text, Object... objects) {
        if (!ENABLED_INFO) {
            return;
        }
        write(text, objects);
    }

    /**
     * Logs the lock and action.
     * @param lockAction is the action towards the lock
     * @param lock is the lock instance
     */
    public static void traceLock(String lockAction, ReentrantLock lock) {
        if (!ENABLED_TRACE) {
            return;
        }
        write(lockAction + " " + getLockInfo(lock));
    }

    /**
     * Logs the lock and action.
     * @param lockAction is the action towards the lock
     * @param lock is the lock instance
     */
    public static void traceLock(String lockAction, ReentrantReadWriteLock lock) {
        if (!ENABLED_TRACE) {
            return;
        }
        write(lockAction + " " + getLockInfo(lock));
    }

    private static String getLockInfo(ReentrantLock lock) {
        String lockid = "Lock@" + Integer.toHexString(lock.hashCode());
        return "lock " + lockid + " held=" + lock.getHoldCount() + " isHeldMe=" + lock.isHeldByCurrentThread()
                + " hasQueueThreads=" + lock.hasQueuedThreads();
    }

    private static String getLockInfo(ReentrantReadWriteLock lock) {
        String lockid = "RWLock@" + Integer.toHexString(lock.hashCode());
        return lockid + " readLockCount=" + lock.getReadLockCount() + " isWriteLocked=" + lock.isWriteLocked();
    }

    private static void write(String text, Object... objects) {
        StringBuilder buf = new StringBuilder();
        buf.append(text);
        buf.append(' ');
        for (Object obj : objects) {
            if ((obj instanceof String) || (obj instanceof Number)) {
                buf.append(obj.toString());
            } else {
                buf.append(obj.getClass().getSimpleName());
                buf.append('@');
                buf.append(Integer.toHexString(obj.hashCode()));
            }
            buf.append(' ');
        }
        write(buf.toString());
    }

    private static void write(String text) {
        log.info(".write Thread " + Thread.currentThread().getId() + " " + text);
    }

    private static final Log log = LogFactory.getLog(ThreadLogUtil.class);
}