package org.jboss.windup.rules.apps.xml.condition;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.xpath.XPathFunction;
import javax.xml.xpath.XPathFunctionException;
import javax.xml.xpath.XPathFunctionResolver;

public class XmlFileFunctionResolver implements XPathFunctionResolver
{
    private final XPathFunctionResolver originalResolver;
    private final Map<QName, XPathFunction> functionMap = new HashMap<>();

    public XmlFileFunctionResolver(XPathFunctionResolver originalResolver)
    {
        this.originalResolver = originalResolver;
    }

    public void registerFunction(String namespaceURI, String functionName, XPathFunction function)
    {
        QName qname = new QName(namespaceURI, functionName);
        functionMap.put(qname, function);
    }

    public void clearRegisteredFunctions()
    {
        functionMap.clear();
    }

    @Override
    public XPathFunction resolveFunction(final QName functionName, final int arity)
    {
        if (functionMap.containsKey(functionName))
        {
            return new XPathFunction()
            {
                @Override
                public Object evaluate(List args) throws XPathFunctionException
                {
                    return functionMap.get(functionName).evaluate(args);
                }
            };
        }
        return originalResolver.resolveFunction(functionName, arity);
    }
}
