/*
 * Copyright (C) 2007 Steve Ratcliffe
 * 
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 * 
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 * 
 * 
 * Author: Steve Ratcliffe
 * Create date: 08-Sep-2007
 */
package uk.me.parabola.log;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Calendar;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

/**
 * Prints the message all on one line, which amazingly is not the default
 * behaviour in j.u.l, no wonder no one uses it.
 *
 * MUST be public whatever crazy static analyzers might say.
 *
 * @author Steve Ratcliffe
 */
public class UsefulFormatter extends Formatter {
	private boolean showTime = true;
	private static final String lineSeparator = System.getProperty("line.separator");


	public String format(LogRecord record) {
		StringBuffer sb = new StringBuffer();

		if (record.getLevel().intValue() <= Level.SEVERE.intValue()) {
			if (showTime) {
				long millis = record.getMillis();
				Calendar cal = Calendar.getInstance();
				cal.setTimeInMillis(millis);
				sb.append(cal.get(Calendar.YEAR));
				sb.append('/');
				sb.append(fmt2(cal.get(Calendar.MONTH)+1));
				sb.append('/');
				sb.append(fmt2(cal.get(Calendar.DAY_OF_MONTH)));
				sb.append(' ');
				sb.append(fmt2(cal.get(Calendar.HOUR_OF_DAY)));
				sb.append(':');
				sb.append(fmt2(cal.get(Calendar.MINUTE)));
				sb.append(':');
				sb.append(fmt2(cal.get(Calendar.SECOND)));
				sb.append(' ');
			}
			
			sb.append(record.getLevel().getLocalizedName());
			sb.append(" (");
			sb.append(shortName(record.getLoggerName()));
			sb.append("): ");
		}
		sb.append(record.getMessage());
		
		sb.append(lineSeparator);

		Throwable t = record.getThrown();
		if (t != null) {
			StringWriter out = new StringWriter();
			PrintWriter pw = new PrintWriter(out);
			t.printStackTrace(pw);
			sb.append(out.toString());
		}
		return sb.toString();
	}

	public void setShowTime(boolean showTime) {
		this.showTime = showTime;
	}

	private String fmt2(int i) {
		StringBuffer res = new StringBuffer(String.valueOf(i));
		while (res.length() < 2) {
			res.insert(0, '0');
		}
		return res.toString();
	}

	private String shortName(String name) {
		int end = name.lastIndexOf('.');
		if (end > 0) {
			return name.substring(end+1);
		} else
			return name;
	}
}
