/***************************************************************************************************
 * Copyright (c) 2001, 2004 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 API and implementation
 **************************************************************************************************/
package org.eclipse.wst.validation.internal.plugin;

import java.util.Locale;

import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPluginDescriptor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
import org.eclipse.wst.validation.core.Message;
import org.eclipse.wst.validation.core.SeverityEnum;
import org.eclipse.wst.validation.internal.EventManager;

import com.ibm.wtp.common.logger.LogEntry;

public class ValidationPlugin extends WTPPlugin {
	public static final String VALIDATION_PROP_FILE_NAME = "validate_base"; //$NON-NLS-1$
	public static final String PLUGIN_ID = "org.eclipse.wst.validation"; //$NON-NLS-1$
	private static ValidationPlugin _plugin = null;
	private static TimeEntry _tEntry = null;
	private static LogEntry _entry = null;
	private static Message _message = null;
	public static final String VALIDATION_BUILDER_ID = PLUGIN_ID + ".validationbuilder"; //$NON-NLS-1$// plugin id of the validation builder
	public static final String VALIDATOR_EXT_PT_ID = "validator"; //$NON-NLS-1$// extension point declaration of the validator 

	/**
	 * ValidationPlugin constructor comment.
	 * 
	 * @param descriptor
	 *            org.eclipse.core.runtime.IPluginDescriptor
	 */
	public ValidationPlugin(IPluginDescriptor descriptor) {
		super(descriptor);
		if (_plugin == null) {
			_plugin = this;
			//Commenting off the following lines the Plugin is not activated and the
			//getMsgLogger tries to access the Plugin and the plugin is in a active pending state.
			//getMsgLogger();
			//logger.log(Level.CONFIG, null);

		}
	}

	public static String getBundleName() {
		return VALIDATION_PROP_FILE_NAME;
	}

	public static LogEntry getLogEntry() {
		if (_entry == null) {
			_entry = new LogEntry(VALIDATION_PROP_FILE_NAME);
		} else {
			_entry.reset();
		}
		// Always set the log entry's Locale before you use it
		// because the user can reset it on the fly.
		_entry.setLocaleOfOrigin(Locale.getDefault().toString());
		return _entry;
	}

	public static TimeEntry getTimeEntry() {
		if (_tEntry == null) {
			_tEntry = new TimeEntry();
		}
		_tEntry.reset();
		return _tEntry;
	}

	public static Message getMessage() {
		if (_message == null) {
			_message = new Message();
			_message.setBundleName(getBundleName());
		}
		// clear the message for reuse
		_message.setId(null);
		_message.setParams(null);
		_message.setTargetObject(null);
		_message.setGroupName(null);
		_message.setSeverity(SeverityEnum.LOW_SEVERITY);
		return _message;
	}

	/**
	 * Retrieves a hashtable of a logger's preferences initially from the
	 * com.ibm.etools.logging.util.loggingDefaults extension point if specified in the
	 * com.ibm.etools.logging.util plugin.xml file. If specified, the
	 * com.ibm.etools.logging.util.loggingOptions extension point preferences in the parameter
	 * plugin's plugin.xml file are returned.
	 * 
	 * The logger's preferences are stored in the return hashtable using the static instance
	 * variables in LoggerStateHashKeys as keys.
	 * 
	 * @param plugin
	 *            the Plugin polled for their logger's preferences in the plugin.xml file
	 * @return hashtable of a logger's preferences
	 */
	/*
	 * public Hashtable getMsgLoggerConfig(Plugin plugin) { return (new
	 * PluginHelperImpl().getMsgLoggerConfig(plugin));
	 */
	public static ValidationPlugin getPlugin() {
		return _plugin;
	}

	/**
	 * Sets the logger's preferences based on values in the parameter hashtable.
	 * 
	 * The logger's preferences are stored in the parameter hashtable using the static instance
	 * variables in LoggerStateHashKeys as keys.
	 * 
	 * @param msgLoggerConfig
	 *            hashtable of the logger's preferences
	 */
	/*
	 * public void setMsgLoggerConfig(Hashtable msgLoggerConfig) {
	 * getMsgLogger().setMsgLoggerConfig(msgLoggerConfig); }
	 */
	public static boolean isActivated() {
		IPluginDescriptor desc = Platform.getPluginRegistry().getPluginDescriptor(PLUGIN_ID);
		if (desc != null)
			return desc.isPluginActivated();
		return false;
	}

	/**
	 * @see Plugin#startup()
	 */
	public void startup() throws CoreException {
		super.startup();
		ResourcesPlugin.getWorkspace().addResourceChangeListener(EventManager.getManager(), IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.PRE_BUILD | IResourceChangeEvent.POST_CHANGE);
	}

	/**
	 * @see org.eclipse.core.runtime.Plugin#shutdown()
	 */
	public void shutdown() throws CoreException {
		super.shutdown();
		EventManager.getManager().shutdown();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
	 */
	public String getPluginID() {
		return PLUGIN_ID;
	}
}