//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.common.serviceability;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;

/**
 * Generic logger used for logging status messages, warning messages, error
 * messages, and exception stack traces.
 * 
 * @author Kelvin Low
 * @since 1.0
 */
public class Logger {

	// The plug-in instance.
	private Plugin plugin;

	// The plug-in ID.
	private String pluginId;

	/**
	 * Create a new <code>Logger</code> given the plug-in instance.
	 * 
	 * @param plugin
	 *            The plugin instance.
	 */
	public Logger(Plugin plugin) {
		this.plugin = plugin;
		this.pluginId = plugin.getBundle().getSymbolicName(); //plugin.getId();
	}

	/**
	 * Logs the given error message.
	 * 
	 * @param msg
	 *            The error message.
	 */
	public void logError(String msg) {
		logMsg(IStatus.ERROR, msg, null);
	}

	/**
	 * Logs the given exception.
	 * 
	 * @param ex
	 *            The exception.
	 */
	public void logError(Throwable ex) {
		logMsg(IStatus.ERROR, null, ex);
	}

	/**
	 * Logs the given error message and exception.
	 * 
	 * @param msg
	 *            The error message.
	 * @param ex
	 *            The exception.
	 */
	public void logError(String msg, Throwable ex) {
		logMsg(IStatus.ERROR, msg, ex);
	}

	/**
	 * Logs the given warning message.
	 * 
	 * @param msg
	 *            The warning message.
	 */
	public void logWarning(String msg) {
		logMsg(IStatus.WARNING, msg, null);
	}

	/**
	 * Logs the given warning message and exception.
	 * 
	 * @param msg
	 *            The warning message.
	 * @param ex
	 *            The exception.
	 */
	public void logWarning(String msg, Throwable ex) {
		logMsg(IStatus.WARNING, msg, ex);
	}

	/**
	 * Logs the given status message and exception.
	 * 
	 * @param msg
	 *            The status message.
	 */
	public void logInfo(String msg) {
		logMsg(IStatus.INFO, msg, null);
	}

	/**
	 * Logs the given message and exception.
	 * 
	 * @param severity
	 *            The severity.
	 * @param msg
	 *            The message.
	 * @param ex
	 *            The exception.
	 */
	public synchronized void logMsg(int severity, String msg, Throwable ex) {
		if (msg == null && ex != null) {
			msg = ex.getMessage(); 
		}

		if (msg == null) {
			msg = ""; //$NON-NLS-1$
		}

		Status status = new Status(severity, pluginId, IStatus.OK, msg, ex);

		// Call the Eclipse Logger.
		plugin.getLog().log(status);
	}

}