/*******************************************************************************
 * Copyright (c) 2007 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: ExtensionsTable.java,v 1.3 2008/03/28 02:38:17 dacarver Exp $
 */
package org.eclipse.wst.xsl.core.internal.compiler.xslt10.extensions;

import java.util.Hashtable;
import java.util.Vector;

import org.eclipse.wst.xsl.core.compiler.xslt10.res.Messages;
import org.eclipse.wst.xsl.core.compiler.xslt10.res.XSLTErrorResources;
import org.eclipse.wst.xsl.core.internal.compiler.xslt10.templates.StylesheetRoot;
import org.apache.xpath.XPathProcessorException;
import org.apache.xpath.functions.FuncExtFunction;

/**
 * Class holding a table registered extension namespace handlers
 * 
 * @xsl.usage internal
 */
public class ExtensionsTable {
	/**
	 * Table of extensions that may be called from the expression language via
	 * the call(name, ...) function. Objects are keyed on the call name.
	 * 
	 * @xsl.usage internal
	 */
	public Hashtable m_extensionFunctionNamespaces = new Hashtable();

	/**
	 * The StylesheetRoot associated with this extensions table.
	 */
	private StylesheetRoot m_sroot;

	/**
	 * The constructor (called from TransformerImpl) registers the
	 * StylesheetRoot for the transformation and instantiates an
	 * ExtensionHandler for each extension namespace.
	 * 
	 * @xsl.usage advanced
	 */
	public ExtensionsTable(StylesheetRoot sroot)
			throws javax.xml.transform.TransformerException {
		m_sroot = sroot;
		Vector extensions = m_sroot.getExtensions();
		for (int i = 0; i < extensions.size(); i++) {
			ExtensionNamespaceSupport extNamespaceSpt = (ExtensionNamespaceSupport) extensions
					.elementAt(i);
			ExtensionHandler extHandler = extNamespaceSpt.launch();
			if (extHandler != null)
				addExtensionNamespace(extNamespaceSpt.getNamespace(),
						extHandler);
		}
	}

	/**
	 * Get an ExtensionHandler object that represents the given namespace.
	 * 
	 * @param extns
	 *            A valid extension namespace.
	 * 
	 * @return ExtensionHandler object that represents the given namespace.
	 */
	public ExtensionHandler get(String extns) {
		return (ExtensionHandler) m_extensionFunctionNamespaces.get(extns);
	}

	/**
	 * Register an extension namespace handler. This handler provides functions
	 * for testing whether a function is known within the namespace and also for
	 * invoking the functions.
	 * 
	 * @param uri
	 *            the URI for the extension.
	 * @param extNS
	 *            the extension handler.
	 * @xsl.usage advanced
	 */
	public void addExtensionNamespace(String uri, ExtensionHandler extNS) {
		m_extensionFunctionNamespaces.put(uri, extNS);
	}

	/**
	 * Execute the function-available() function.
	 * 
	 * @param ns
	 *            the URI of namespace in which the function is needed
	 * @param funcName
	 *            the function name being tested
	 * 
	 * @return whether the given function is available or not.
	 * 
	 * @throws javax.xml.transform.TransformerException
	 */
	public boolean functionAvailable(String ns, String funcName)
			throws javax.xml.transform.TransformerException {
		boolean isAvailable = false;

		if (null != ns) {
			ExtensionHandler extNS = (ExtensionHandler) m_extensionFunctionNamespaces
					.get(ns);
			if (extNS != null)
				isAvailable = extNS.isFunctionAvailable(funcName);
		}
		return isAvailable;
	}

	/**
	 * Execute the element-available() function.
	 * 
	 * @param ns
	 *            the URI of namespace in which the function is needed
	 * @param elemName
	 *            name of element being tested
	 * 
	 * @return whether the given element is available or not.
	 * 
	 * @throws javax.xml.transform.TransformerException
	 */
	public boolean elementAvailable(String ns, String elemName)
			throws javax.xml.transform.TransformerException {
		boolean isAvailable = false;
		if (null != ns) {
			ExtensionHandler extNS = (ExtensionHandler) m_extensionFunctionNamespaces
					.get(ns);
			if (extNS != null) // defensive
				isAvailable = extNS.isElementAvailable(elemName);
		}
		return isAvailable;
	}

	/**
	 * Handle an extension function.
	 * 
	 * @param ns
	 *            the URI of namespace in which the function is needed
	 * @param funcName
	 *            the function name being called
	 * @param argVec
	 *            arguments to the function in a vector
	 * @param methodKey
	 *            a unique key identifying this function instance in the
	 *            stylesheet
	 * @param exprContext
	 *            a context which may be passed to an extension function and
	 *            provides callback functions to access various areas in the
	 *            environment
	 * 
	 * @return result of executing the function
	 * 
	 * @throws javax.xml.transform.TransformerException
	 */
	public Object extFunction(String ns, String funcName, Vector argVec,
			Object methodKey, ExpressionContext exprContext)
			throws javax.xml.transform.TransformerException {
		Object result = null;
		if (null != ns) {
			ExtensionHandler extNS = (ExtensionHandler) m_extensionFunctionNamespaces
					.get(ns);
			if (null != extNS) {
				try {
					result = extNS.callFunction(funcName, argVec, methodKey,
							exprContext);
				} catch (javax.xml.transform.TransformerException e) {
					throw e;
				} catch (Exception e) {
					throw new javax.xml.transform.TransformerException(e);
				}
			} else {
				throw new XPathProcessorException(Messages.createMessage(
						XSLTErrorResources.ER_EXTENSION_FUNC_UNKNOWN,
						new Object[] { ns, funcName }));
				// "Extension function '" + ns + ":" + funcName + "' is
				// unknown");
			}
		}
		return result;
	}

	/**
	 * Handle an extension function.
	 * 
	 * @param extFunction
	 *            the extension function
	 * @param argVec
	 *            arguments to the function in a vector
	 * @param exprContext
	 *            a context which may be passed to an extension function and
	 *            provides callback functions to access various areas in the
	 *            environment
	 * 
	 * @return result of executing the function
	 * 
	 * @throws javax.xml.transform.TransformerException
	 */
	public Object extFunction(FuncExtFunction extFunction, Vector argVec,
			ExpressionContext exprContext)
			throws javax.xml.transform.TransformerException {
		Object result = null;
		String ns = extFunction.getNamespace();
		if (null != ns) {
			ExtensionHandler extNS = (ExtensionHandler) m_extensionFunctionNamespaces
					.get(ns);
			if (null != extNS) {
				try {
					result = extNS.callFunction(extFunction, argVec,
							exprContext);
				} catch (javax.xml.transform.TransformerException e) {
					throw e;
				} catch (Exception e) {
					throw new javax.xml.transform.TransformerException(e);
				}
			} else {
				throw new XPathProcessorException(Messages.createMessage(
						XSLTErrorResources.ER_EXTENSION_FUNC_UNKNOWN,
						new Object[] { ns, extFunction.getFunctionName() }));
			}
		}
		return result;
	}
}
