/*
* $Id: BasicLogLayout.java,v 1.8 2002/09/16 08:05:06 jkl Exp $
*
* Copyright (c) 2002 Njet Communications Ltd. All Rights Reserved.
*
* Use is subject to license terms, as defined in
* Anvil Sofware License, Version 1.1. See LICENSE
* file, or http://njet.org/license-1.1.txt
*/
package anvil.server.basic;
import java.util.TimeZone;
import java.util.Calendar;
import java.util.ArrayList;
import anvil.Log;
import anvil.LogEvent;
import anvil.LogLayout;
import anvil.server.LoggingPreferences;
import anvil.server.Zone;
import anvil.server.LoggingPreferences;
import anvil.server.ConfigurationError;
/**
* class BasicLogLayout
*
* @author Jani Lehtim�ki
*/
public class BasicLogLayout implements LogLayout
{
private static final String DEFAULT_FORMAT = "{date} {time} {thread}\t\t{message}\\n{exception}";
private static final String _lineSeparator = System.getProperty("line.separator");
private static final int FMT_TEXT = 0;
private static final int FMT_DATE = 1;
private static final int FMT_TIME = 2;
private static final int FMT_MS = 3;
private static final int FMT_THREAD = 4;
private static final int FMT_SEVERITY = 5;
private static final int FMT_ZONE = 6;
private static final int FMT_MESSAGE = 7;
private static final int FMT_EXCEPTION = 8;
private TimeZone _timezone = TimeZone.getDefault();
private String _formatstr = null;
private Object[] _format = null;
public BasicLogLayout(LoggingPreferences prefs)
{
String tz = (String)prefs.getPreference("timezone");
if (tz != null) {
_timezone = TimeZone.getTimeZone(tz);
}
String fmt = (String)prefs.getPreference("formatting");
if (fmt == null) {
fmt = DEFAULT_FORMAT;
}
init(fmt);
}
public BasicLogLayout()
{
init(DEFAULT_FORMAT);
}
public void init(String fmt)
{
ArrayList list = new ArrayList();
int n = fmt.length();
int i = 0;
StringBuffer text = new StringBuffer();
while(i<n) {
char ch = fmt.charAt(i++);
if (ch == '\\') {
if (i<n) {
switch(ch = fmt.charAt(i++)) {
case 't':
text.append('\t');
break;
case 'r':
text.append('\r');
break;
case 'n':
text.append('\n');
break;
case '\\':
text.append('\\');
break;
default:
text.append(ch);
}
} else {
text.append('\\');
}
} else if (ch == '{') {
if (i<n) {
if (text.length()>0) {
list.add(new Integer(FMT_TEXT));
list.add(text.toString());
}
text.setLength(0);
while(i<n) {
ch = fmt.charAt(i++);
if (ch=='}') {
break;
}
text.append(ch);
}
String tag = text.toString();
if (tag.equals("date")) {
list.add(new Integer(FMT_DATE));
} else if (tag.equals("time")) {
list.add(new Integer(FMT_TIME));
} else if (tag.equals("ms")) {
list.add(new Integer(FMT_MS));
} else if (tag.equals("thread")) {
list.add(new Integer(FMT_THREAD));
} else if (tag.equals("severity")) {
list.add(new Integer(FMT_SEVERITY));
} else if (tag.equals("zone")) {
list.add(new Integer(FMT_ZONE));
} else if (tag.equals("message")) {
list.add(new Integer(FMT_MESSAGE));
} else if (tag.equals("exception")) {
list.add(new Integer(FMT_EXCEPTION));
} else {
throw new ConfigurationError("Invalid log format tag '{"+tag+"}'");
}
text.setLength(0);
}
} else {
text.append(ch);
}
}
if (text.length()>0) {
list.add(new Integer(FMT_TEXT));
list.add(text.toString());
}
_format = list.toArray(new Object[list.size()]);
_formatstr = fmt;
list.clear();
}
public String toString()
{
return "BasicLogLayout("+_formatstr+")";
}
public String format(LogEvent event)
{
Calendar date = null;
Log log = event.getLog();
StringBuffer buffer = new StringBuffer(100);
Object[] fmt = _format;
int n = fmt.length;
int i = 0;
while(i<n) {
switch(((Integer)fmt[i++]).intValue()) {
case FMT_TEXT:
{
buffer.append(fmt[i++]);
}
break;
case FMT_DATE:
{
if (date == null) {
date = Calendar.getInstance(_timezone);
}
int j = date.get(Calendar.YEAR);
buffer.append(j);
buffer.append('-');
j = date.get(Calendar.MONTH) + 1;
if (j<10) {
buffer.append('0');
}
buffer.append(j);
buffer.append('-');
j = date.get(Calendar.DAY_OF_MONTH);
if (j<10) {
buffer.append('0');
}
buffer.append(j);
}
break;
case FMT_TIME:
{
if (date == null) {
date = Calendar.getInstance(_timezone);
}
int j = date.get(Calendar.HOUR_OF_DAY);
if (j<10) {
buffer.append('0');
}
buffer.append(j);
buffer.append(':');
j = date.get(Calendar.MINUTE);
if (j<10) {
buffer.append('0');
}
buffer.append(j);
buffer.append('.');
j = date.get(Calendar.SECOND);
if (j<10) {
buffer.append('0');
}
buffer.append(j);
}
break;
case FMT_MS:
{
buffer.append(System.currentTimeMillis() - log.getStartTime());
}
break;
case FMT_THREAD:
{
buffer.append(event.getThread().getName());
}
break;
case FMT_SEVERITY:
{
buffer.append(anvil.Log.SEVERITY[event.getSeverity()]);
}
break;
case FMT_ZONE:
{
buffer.append(log.getName());
}
break;
case FMT_MESSAGE:
{
buffer.append(event.getMessage());
}
break;
case FMT_EXCEPTION:
{
Throwable throwable = event.getThrowable();
if (throwable != null) {
java.io.StringWriter stringWriter = new java.io.StringWriter();
java.io.PrintWriter printWriter = new java.io.PrintWriter(stringWriter);
throwable.printStackTrace(printWriter);
buffer.append(stringWriter.getBuffer());
buffer.append(_lineSeparator);
}
}
break;
}
}
return buffer.toString();
}
}