package org.jolokia.util;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.LinkedList;
/*
* Copyright 2009-2013 Roland Huss
*
* Licensed 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.
*/
/**
* Simple store for remembering debug info and returning it via a JMX operation
* (exposed in ConfigMBean)
*
* @author roland
* @since Jun 15, 2009
*/
public class DebugStore {
@SuppressWarnings("PMD.LooseCoupling")
private LinkedList<Entry> debugEntries = new LinkedList<Entry>();
private int maxDebugEntries;
private boolean isDebug;
/**
* Create the debug store for holding debug messages
*
* @param pMaxDebugEntries how many messages to keep
* @param pDebug whether debug is switched on
*/
public DebugStore(int pMaxDebugEntries, boolean pDebug) {
maxDebugEntries = pMaxDebugEntries;
isDebug = pDebug;
}
/**
* Store the given message in this store if debug is switched on
*
* @param pMessage message to store
*/
public void log(String pMessage) {
if (!isDebug) {
return;
}
add(System.currentTimeMillis() / 1000,pMessage);
}
/**
* Store the given message in this store if debug is switched on
*
* @param pMessage message to store
* @param pThrowable exception to store
*/
public void log(String pMessage, Throwable pThrowable) {
add(System.currentTimeMillis() / 1000,pMessage,pThrowable);
}
/**
* Get back all previously logged and stored debug messages
*
* @return debug string
*/
public String debugInfo() {
if (!isDebug || debugEntries.size() == 0) {
return "";
}
StringBuffer ret = new StringBuffer();
for (int i = debugEntries.size() - 1;i >= 0;i--) {
Entry entry = debugEntries.get(i);
ret.append(entry.timestamp).append(": ").append(entry.message).append("\n");
if (entry.throwable != null) {
StringWriter writer = new StringWriter();
entry.throwable.printStackTrace(new PrintWriter(writer));
ret.append(writer.toString());
}
}
return ret.toString();
}
/**
* Reset debug info
*/
public void resetDebugInfo() {
debugEntries.clear();
}
/**
* Switch on/off debug
*
* @param pSwitch if <code>true</code> switch on debug
*/
public void setDebug(boolean pSwitch) {
if (!pSwitch) {
resetDebugInfo();
}
isDebug = pSwitch;
}
/**
* Return <code>true</code> when debugging is switched on
*
* @return true if debugging is switched on
*/
public boolean isDebug() {
return isDebug;
}
/**
* Get the number of max debugging entries which can be stored
* @return number of maximum debug entries
*/
public int getMaxDebugEntries() {
return maxDebugEntries;
}
/**
* Set the number of maximum debuggin entries and trim the list of
* debug entries
*
* @param pNumber the maximal number of debug entries
*/
public void setMaxDebugEntries(int pNumber) {
maxDebugEntries = pNumber;
trim();
}
// add a message along with a time stamp
private synchronized void add(long pTime,String message) {
debugEntries.addFirst(new Entry(pTime,message));
trim();
}
private synchronized void add(long pTimestamp, String pMessage, Throwable pThrowable) {
debugEntries.addFirst(new Entry(pTimestamp,pMessage,pThrowable));
trim();
}
// trim list of debug entries
private synchronized void trim() {
while (debugEntries.size() > maxDebugEntries) {
debugEntries.removeLast();
}
}
// ========================================================================
// a singel entry in the debug store
private static final class Entry {
private long timestamp;
private String message;
private Throwable throwable;
private Entry(long pTimestamp, String pMessage, Throwable pThrowable) {
timestamp = pTimestamp;
message = pMessage;
throwable = pThrowable;
}
private Entry(long pTime, String pMessage) {
timestamp = pTime;
message = pMessage;
}
}
}