/*******************************************************************************
 * Copyright (c) 2005, 2009 Andrea Bittau, University College London, 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:
 *     Andrea Bittau - initial API and implementation from the PsychoPath XPath 2.0 
 *     Mukul Gandhi - bug 274471 - improvements to fn:string function (support for arity 0)
 *     Jesper Steen Moeller - bug 285145 - implement full arity checking
 *******************************************************************************/

package org.eclipse.wst.xml.xpath2.processor.internal.function;

import org.eclipse.wst.xml.xpath2.processor.DynamicContext;
import org.eclipse.wst.xml.xpath2.processor.StaticContext;
import org.eclipse.wst.xml.xpath2.processor.internal.types.QName;

import java.util.Hashtable;
import java.util.Map;

/**
 * Class for Function Library support.
 */
public class FunctionLibrary {
	private String _namespace;
	private Map _functions;
	private StaticContext _sc;
	private DynamicContext _dc;

	/**
	 * Constructor for FunctionLibrary.
	 * 
	 * @param ns
	 *            namespace.
	 */
	public FunctionLibrary(String ns) {
		_namespace = ns;
		_functions = new Hashtable();
		_sc = null;
		_dc = null;
	}

	/**
	 * Add a function.
	 * 
	 * @param x
	 *            function to add.
	 */
	public void add_function(Function x) {
		x.name().set_namespace(_namespace);
		x.set_function_library(this);
		_functions.put(x.signature(), x);
	}

	/**
	 * Checks whether the function exists or not.
	 * 
	 * @param name
	 *            QName of function.
	 * @param arity
	 *            arity of the function.
	 * @return Result of the test.
	 */
	public boolean function_exists(QName name, int arity) {
		return function(name, arity) != null;
	}

	/**
	 * Function support.
	 * 
	 * @param name
	 *            QName.
	 * @param arity
	 *            arity of the function.
	 * @return The new function.
	 */
	public Function function(QName name, int arity) {
		Function f = (Function) _functions.get(Function.signature(name, arity));

		if (f != null || arity == -1)
			return f;

		// see if we got a varg one
		f = function(name, -1);

		// nope
		if (f == null)
			return null;
		
		if (f.matches_arity(arity))
			return f;

		return null;
	}

	/**
	 * Support for namespace.
	 * 
	 * @return Namespace.
	 */
	public String namespace() {
		return _namespace;
	}

	/**
	 * Set static context on function.
	 */
	public void set_static_context(StaticContext sc) {
		_sc = sc;
	}

	/**
	 * Set dynamic context on function.
	 */
	public void set_dynamic_context(DynamicContext dc) {
		_dc = dc;
	}

	/**
	 * Support for Static context.
	 * 
	 * @return Result of static context.
	 */
	public StaticContext static_context() {
		return _sc;
	}

	/**
	 * Support for Dynamic context.
	 * 
	 * @return Result of dynamic context.
	 */
	public DynamicContext dynamic_context() {
		return _dc;
	}
}
