// Copyright (c) Keith D Gregory, all rights reserved
package com.kdgregory.example.xml.xpath;

import java.util.List;

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

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

import net.sf.practicalxml.ParseUtil;
import net.sf.practicalxml.xpath.XPathWrapper;


public class PracticalXmlExample
{
    private static class Uppercase implements XPathFunction
    {
        @Override
        @SuppressWarnings("rawtypes")
        public Object evaluate(List args) throws XPathFunctionException
        {
            Object arg = args.iterator().next();
            if (arg instanceof NodeList)
            {
                NodeList nodes = (NodeList)arg;
                if (nodes.getLength() == 0)
                    return "";
                else
                    return nodes.item(0).getTextContent().toUpperCase();
            }
            else if (arg instanceof String)
            {
                return ((String)arg).toUpperCase();
            }
            else
                throw new XPathFunctionException("invalid argument: " + arg);
        }
    }

    public static void main(String[] argv) throws Exception
    {
        String xml = "<foo xmlns='http://www.example.com/example'>"
                   + "    <bar name='argle'>"
                   +          "Argle"
                   + "    </bar>"
                   + "    <bar name='bargle'>"
                   +          "Bargle"
                   + "        <baz>Baz</baz>"
                   + "    </bar>"
                   + "</foo>";

        Document dom = ParseUtil.parse(xml);

        XPathWrapper xpath = new XPathWrapper("//ns:bar[fn:uppercase(@name) = $var]")
                             .bindNamespace("ns", "http://www.example.com/example")
                             .bindNamespace("fn", "urn:x-com.kdgregory.example.xpath.functions")
                             .bindFunction(new QName("urn:x-com.kdgregory.example.xpath.functions", "uppercase"), new Uppercase(), 1)
                             .bindVariable("var", "BARGLE");


        String result = xpath.evaluateAsString(dom);
        System.out.println("selected content: \"" + result + "\"");
    }
}
