/**
* Copyright 2009 Google Inc.
*
* 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.
*
*/
package org.waveprotocol.wave.common.logging;
/**
* Static utility methods for logging.
*
*/
public final class LogUtils {
// TODO(user): Why do we need to limit the stack frames in the logs?
// If we don't, remove this and the parameter on LogUtils.printStackTrace
private static final int MAX_STACK_FRAME = 12;
/**
* Utility class, not constructable.
*/
private LogUtils() {}
/**
* Stringifies and XML escapes the passed object, and wraps the result in a
* span.
*
* @return escaped string representation, wrapped in an html span
*/
public static String printObjectAsHtml(Object o) {
return "<span class='object'>" + xmlEscape(String.valueOf(o)) + "</span>";
}
/**
* Converts an object into a string.
*
* If it's an array (coming from the var args log message),
* make a comma separated list of the array's components. Otherwise,
* toString() the object.
*
*/
public static String stringifyLogObject(Object o) {
if (o instanceof Object[]) {
StringBuilder builder = new StringBuilder();
Object[] objects = (Object[]) o;
for (Object object : objects) {
builder.append(object.toString());
}
return builder.toString();
} else {
return o.toString();
}
}
/**
* Formats a subset of a throwable's stack trace as HTML.
*
* @param t throwable to print
* @return t's stack trace as HTML string
*/
public static String printStackTraceAsHtml(Throwable t) {
StackTraceElement[] stes = t.getStackTrace();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < stes.length && i <= MAX_STACK_FRAME; i++) {
sb.append(" ")
.append(stes[i].getClassName())
.append(":")
.append(stes[i].getLineNumber())
.append(": ")
.append(stes[i].getMethodName())
.append("<br/>");
}
if (MAX_STACK_FRAME < stes.length - 1) {
sb.append(" ...<br/>");
}
return sb.toString();
}
/**
* Poor man's common.base.StringUtil.xmlEscape
*
* @param xml
* @return XML-escaped string
*/
public static String xmlEscape(String xml) {
return xml.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").
replaceAll("\"", """).replaceAll("\'", "'");
}
}