package vroom.common.utilities.logging;
import java.util.Collection;
import java.util.Collections;
import vroom.common.utilities.Constants;
import vroom.common.utilities.ILockable;
import vroom.common.utilities.Utilities;
/**
* A convenience class to pass formatted string to loggers and defer the actual formatting to the appending time
*
* @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a> - <a
* href="http://copa.uniandes.edu.co">Copa</a>, <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a
* href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp" >SLP</a>, CTI
*/
public class FormattedLogMessage {
private final String mFormatString;
private final Object[] mArgs;
private String mFormattedString;
/**
* Creates a new formated message based on the given <tt>formatString</tt> and <tt>args</tt>
*
* @param formatString
* @param args
*/
public FormattedLogMessage(String formatString, Object[] args) {
mFormatString = formatString;
mArgs = args;
}
/**
* @return the result of the formatting of the given format string with the given args
*/
@Override
public String toString() {
try {
if (mFormattedString == null) {
for (int i = 0; i < mArgs.length; i++) {
if (mArgs[i] instanceof ILockable) {
if (!((ILockable) mArgs[i]).tryLock(1000)) {
mArgs[i] = Constants.TOSTRING_LOCKED;
}
}
if (mArgs[i] instanceof StackTraceElement[]) {
StackTraceElement[] stack = (StackTraceElement[]) mArgs[i];
StringBuilder b = new StringBuilder(stack.length * 20);
boolean first = true;
for (int j = 1; j < stack.length; j++) {
// Filter out logging stack
if (!first
|| !stack[j].getClassName().startsWith(LoggerHelper.class.getPackage().getName())) {
if (!first) {
b.append(" ");
}
b.append(String.format("%s.%s (%s %s)", stack[j].getClassName(),
stack[j].getMethodName(), stack[j].getFileName(), stack[j].getLineNumber()));
b.append("\n");
first = false;
}
}
if (mArgs[i] instanceof Collections) {
mArgs[i] = Utilities.toShortString((Collection<?>) mArgs[i]);
} else {
mArgs[i] = b.toString();
}
}
}
mFormattedString = String.format(mFormatString, mArgs);
for (Object mArg : mArgs) {
if (mArg instanceof ILockable) {
((ILockable) mArg).releaseLock();
}
}
}
return mFormattedString;
} catch (Exception e) {
return "Exception caught while formating " + mFormatString + " (" + e.toString() + ")";
}
}
}