Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java @ 959:a2b20ed3d3b4
Datacage: Added custom provider for XPath functions.
flys-artifacts/trunk@2378 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 20 Jul 2011 16:28:49 +0000 |
parents | |
children | 30c85cb33a50 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java Wed Jul 20 16:28:49 2011 +0000 @@ -0,0 +1,83 @@ +package de.intevation.flys.artifacts.services.meta; + +import java.util.List; +import java.util.ArrayList; + +import javax.xml.xpath.XPathFunctionResolver; +import javax.xml.xpath.XPathFunction; +import javax.xml.xpath.XPathFunctionException; + +import javax.xml.namespace.QName; + +public class FunctionResolver +implements XPathFunctionResolver +{ + public static final String FUNCTION_NAMESPACE_URI = "dc"; + + public static final class Entry { + + String name; + XPathFunction function; + int arity; + + public Entry() { + } + + public Entry(String name, XPathFunction function, int arity) { + this.name = name; + this.function = function; + this.arity = arity; + } + } // class Entry + + public static final FunctionResolver FUNCTIONS = new FunctionResolver(); + + static { + FUNCTIONS.addFunction("contains", 2, new XPathFunction() { + @Override + public Object evaluate(List args) throws XPathFunctionException { + try { + Object [] haystack = (Object [])args.get(0); + Object needle = args.get(1); + for (Object straw: haystack) { + if (straw.equals(needle)) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + catch (Exception e) { + throw new XPathFunctionException(e); + } + } + }); + } + + protected List<Entry> functions; + + public FunctionResolver() { + functions = new ArrayList<Entry>(); + } + + public void addFunction(String name, int arity, XPathFunction function) { + functions.add(new Entry(name, function, arity)); + } + + @Override + public XPathFunction resolveFunction(QName functionName, int arity) { + + if (!functionName.getNamespaceURI().equals(FUNCTION_NAMESPACE_URI)) { + return null; + } + + String name = functionName.getLocalPart(); + for (Entry entry: functions) { + if (entry.arity == arity && entry.name.equals(name)) { + return entry.function; + } + } + + return null; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :