//----------------------------BEGIN LICENSE----------------------------
/* 
 * Willow : the Open Source WorkFlow Project
 * Distributable under GNU LGPL license by gun.org
 *
 * Copyright (C) 2004-2010  huihoo.org 
 * Copyright (C) 2004-2010  ZosaTapo <dertyang@hotmail.com> 
 * 
 * ====================================================================
 * Project Homepage : http://www.huihoo.org/willow
 * Source Forge     : http://sourceforge.net/projects/huihoo
 * Mailing list     : willow@lists.sourceforge.net 
 */
//----------------------------END  LICENSE-----------------------------
package org.huihoo.willow.logger;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Timestamp;

import org.huihoo.willow.Globals;
import org.huihoo.willow.startup.Constants;
import org.huihoo.willow.util.StringManager;

public class FileLogger extends LoggerBase
{
	// ----------------------------------------------------- Instance Variables
	/**
	 * The as-of date for the currently open log file, or a zero-length
	 * string if there is no open log file.
	 */
	private String date = "";
	/**
	 * The directory in which log files are created.
	 */
	private String directory = org.huihoo.willow.Globals.LOG_DIRECTORY;
  
	/**
	 * The descriptive information about this implementation.
	 */
	protected static final String info =
		"org.huihoo.willow.logger.FileLogger/1.0";
    
	/**
	 * The prefix that is added to log file filenames.
	 */
	private String prefix = "willow.";
	/**
	 * The string manager for this package.
	 */
	private StringManager sm = StringManager.getManager(Constants.PACKAGE);


	/**
	 * The suffix that is added to log file filenames.
	 */
	private String suffix = ".log";
  
	/**
	 * Should logged messages be date/time stamped?
	 */
	private boolean timestamp = false;
	/**
	 * The PrintWriter to which we are currently logging, if any.
	 */
	private PrintWriter writer = null;
	// ------------------------------------------------------------- Properties
	/**
	 * Return the directory in which we create log files.
	 */
	public String getDirectory()
	{
		return (directory);
	}
	/**
	 * Set the directory in which we create log files.
	 *
	 * @param directory The new log file directory
	 */
	public void setDirectory(String directory)
	{
		String oldDirectory = this.directory;
		this.directory = directory;
		support.firePropertyChange("directory", oldDirectory, this.directory);
	}
	/**
	 * Return the log file prefix.
	 */
	public String getPrefix()
	{
		return (prefix);
	}
	/**
	 * Set the log file prefix.
	 *
	 * @param prefix The new log file prefix
	 */
	public void setPrefix(String prefix)
	{
		String oldPrefix = this.prefix;
		this.prefix = prefix;
		support.firePropertyChange("prefix", oldPrefix, this.prefix);
	}
	/**
	 * Return the log file suffix.
	 */
	public String getSuffix()
	{
		return (suffix);
	}
	/**
	 * Set the log file suffix.
	 *
	 * @param suffix The new log file suffix
	 */
	public void setSuffix(String suffix)
	{
		String oldSuffix = this.suffix;
		this.suffix = suffix;
		support.firePropertyChange("suffix", oldSuffix, this.suffix);
	}
	/**
	 * Return the timestamp flag.
	 */
	public boolean getTimestamp()
	{
		return (timestamp);
	}
	/**
	 * Set the timestamp flag.
	 *
	 * @param timestamp The new timestamp flag
	 */
	public void setTimestamp(boolean timestamp)
	{
		boolean oldTimestamp = this.timestamp;
		this.timestamp = timestamp;
		support.firePropertyChange(
			"timestamp",
			new Boolean(oldTimestamp),
			new Boolean(this.timestamp));
	}
	// --------------------------------------------------------- Public Methods
	/**
	 * Writes the specified message to a servlet log file, usually an event
	 * log.  The name and type of the servlet log is specific to the
	 * servlet container.
	 *
	 * @param msg A <code>String</code> specifying the message to be written
	 *  to the log file
	 */
	public void log(String msg)
	{
		// Construct the timestamp we will use, if requested
		Timestamp ts = new Timestamp(System.currentTimeMillis());
		String tsString = ts.toString().substring(0, 19);
		String tsDate = tsString.substring(0, 10);
		// If the date has changed, switch log files
		if (!date.equals(tsDate))
		{
			synchronized (this)
			{
				if (!date.equals(tsDate))
				{
					close();
					date = tsDate;
					open();
				}
			}
		}
		// jLog this message, timestamped if necessary
		if (writer != null)
		{
			if (timestamp)
			{
				writer.println(tsString + " " + msg);
			}
			else
			{
				writer.println(msg);
			}
		}
	}
	// -------------------------------------------------------- Private Methods
	/**
	 * Close the currently open log file (if any)
	 */
	private void close()
	{
		if (writer == null)
			return;
		writer.flush();
		writer.close();
		writer = null;
		date = "";
	}
	/**
	 * Open the new log file for the date specified by <code>date</code>.
	 */
	private void open()
	{
		// Create the directory if necessary
		File dir = new File(directory);
		if (!dir.isAbsolute())
		{
			dir = new File(System.getProperty(Globals.PROPS_WILLOW_HOME), directory);
		}
		dir.mkdirs();
		// Open the current log file
		try
		{
			String pathname =
				dir.getAbsolutePath() + File.separator + prefix + date + suffix;
			writer = new PrintWriter(new FileWriter(pathname, true), true);
		}
		catch (IOException e)
		{
			writer = null;
		}
	}
}