/*******************************************************************************
 * Copyright (c) 2008 Standards for Technology in Automotive Retail
 * 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:
 *     David Carver - STAR - bug 224197 - initial API and implementation
 *                    based on work from Apache Xalan 2.7.0
 *******************************************************************************/
/*
 * Copyright 1999-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 * $Id: MsgMgr.java,v 1.2 2008/03/28 02:38:16 dacarver Exp $
 */
package org.eclipse.wst.xsl.core.internal.compiler.xslt10.transformer;

import javax.xml.transform.ErrorListener;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;

import org.apache.xalan.res.XSLMessages;

import org.w3c.dom.Node;

/**
 * This class will manage error messages, warning messages, and other types of
 * message events.
 */
public class MsgMgr {

	/**
	 * Create a message manager object.
	 * 
	 * @param transformer
	 *            non transformer instance
	 */
	public MsgMgr(TransformerImpl transformer) {
		m_transformer = transformer;
	}

	/** Transformer instance */
	private TransformerImpl m_transformer;

	/**
	 * Warn the user of a problem. This is public for access by extensions.
	 * 
	 * @param msg
	 *            The message text to issue
	 * @param terminate
	 *            Flag indicating whether to terminate this process
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 */
	public void message(SourceLocator srcLctr, String msg, boolean terminate)
			throws TransformerException {

		ErrorListener errHandler = m_transformer.getErrorListener();

		if (null != errHandler) {
			errHandler.warning(new TransformerException(msg, srcLctr));
		} else {
			if (terminate)
				throw new TransformerException(msg, srcLctr);
			else
				System.out.println(msg);
		}
	}

	/**
	 * Warn the user of a problem.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void warn(SourceLocator srcLctr, String msg)
			throws TransformerException {
		warn(srcLctr, null, null, msg, null);
	}

	/**
	 * Warn the user of a problem.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @param args
	 *            Arguments to pass to the message
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void warn(SourceLocator srcLctr, String msg, Object[] args)
			throws TransformerException {
		warn(srcLctr, null, null, msg, args);
	}

	/**
	 * Warn the user of a problem.
	 * 
	 * 
	 * @param styleNode
	 *            Stylesheet node
	 * @param sourceNode
	 *            Source tree node
	 * @param msg
	 *            Message text to issue
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void warn(SourceLocator srcLctr, Node styleNode, Node sourceNode,
			String msg) throws TransformerException {
		warn(srcLctr, styleNode, sourceNode, msg, null);
	}

	/**
	 * Warn the user of a problem.
	 * 
	 * @param styleNode
	 *            Stylesheet node
	 * @param sourceNode
	 *            Source tree node
	 * @param msg
	 *            Message text to issue
	 * @param args
	 *            Arguments to pass to the message
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void warn(SourceLocator srcLctr, Node styleNode, Node sourceNode,
			String msg, Object args[]) throws TransformerException {

		String formattedMsg = XSLMessages.createWarning(msg, args);
		ErrorListener errHandler = m_transformer.getErrorListener();

		if (null != errHandler)
			errHandler.warning(new TransformerException(formattedMsg, srcLctr));
		else
			System.out.println(formattedMsg);
	}

	/*
	 * This method is not properly i18nized. We need to use the following method
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param msg Message text to issue @throws XSLProcessorException thrown if
	 * the active ProblemListener and XPathContext decide the error condition is
	 * severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * 
	 * public void error(SourceLocator srcLctr, String msg) throws
	 * TransformerException {
	 *  // Locator locator = m_stylesheetLocatorStack.isEmpty() // ? null : //
	 * ((Locator)m_stylesheetLocatorStack.peek()); // Locator locator = null;
	 * ErrorListener errHandler = m_transformer.getErrorListener();
	 * 
	 * if (null != errHandler) errHandler.fatalError(new
	 * TransformerException(msg, srcLctr)); else throw new
	 * TransformerException(msg, srcLctr); }
	 * 
	 * @xsl.usage internal
	 */

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, String msg)
			throws TransformerException {
		error(srcLctr, null, null, msg, null);
	}

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @param args
	 *            Arguments to be passed to the message
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, String msg, Object[] args)
			throws TransformerException {
		error(srcLctr, null, null, msg, args);
	}

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @param e
	 *            Exception to throw
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, String msg, Exception e)
			throws TransformerException {
		error(srcLctr, msg, null, e);
	}

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param msg
	 *            Message text to issue
	 * @param args
	 *            Arguments to use in message
	 * @param e
	 *            Exception to throw
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, String msg, Object args[],
			Exception e) throws TransformerException {

		// msg = (null == msg) ? XSLTErrorResources.ER_PROCESSOR_ERROR : msg;
		String formattedMsg = XSLMessages.createMessage(msg, args);

		// Locator locator = m_stylesheetLocatorStack.isEmpty()
		// ? null :
		// ((Locator)m_stylesheetLocatorStack.peek());
		// Locator locator = null;
		ErrorListener errHandler = m_transformer.getErrorListener();

		if (null != errHandler)
			errHandler.fatalError(new TransformerException(formattedMsg,
					srcLctr));
		else
			throw new TransformerException(formattedMsg, srcLctr);
	}

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param styleNode
	 *            Stylesheet node
	 * @param sourceNode
	 *            Source tree node
	 * @param msg
	 *            Message text to issue
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, Node styleNode, Node sourceNode,
			String msg) throws TransformerException {
		error(srcLctr, styleNode, sourceNode, msg, null);
	}

	/**
	 * Tell the user of an error, and probably throw an exception.
	 * 
	 * @param styleNode
	 *            Stylesheet node
	 * @param sourceNode
	 *            Source tree node
	 * @param msg
	 *            Message text to issue
	 * @param args
	 *            Arguments to use in message
	 * @throws XSLProcessorException
	 *             thrown if the active ProblemListener and XPathContext decide
	 *             the error condition is severe enough to halt processing.
	 * 
	 * @throws TransformerException
	 * @xsl.usage internal
	 */
	public void error(SourceLocator srcLctr, Node styleNode, Node sourceNode,
			String msg, Object args[]) throws TransformerException {

		String formattedMsg = XSLMessages.createMessage(msg, args);

		// Locator locator = m_stylesheetLocatorStack.isEmpty()
		// ? null :
		// ((Locator)m_stylesheetLocatorStack.peek());
		// Locator locator = null;
		ErrorListener errHandler = m_transformer.getErrorListener();

		if (null != errHandler)
			errHandler.fatalError(new TransformerException(formattedMsg,
					srcLctr));
		else
			throw new TransformerException(formattedMsg, srcLctr);
	}
}
