annotate 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
rev   line source
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.services.meta;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import java.util.List;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import java.util.ArrayList;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import javax.xml.xpath.XPathFunctionResolver;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import javax.xml.xpath.XPathFunction;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 import javax.xml.xpath.XPathFunctionException;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 import javax.xml.namespace.QName;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 public class FunctionResolver
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 implements XPathFunctionResolver
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 public static final String FUNCTION_NAMESPACE_URI = "dc";
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 public static final class Entry {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 String name;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 XPathFunction function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 int arity;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 public Entry() {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 public Entry(String name, XPathFunction function, int arity) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 this.name = name;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 this.function = function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 this.arity = arity;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 } // class Entry
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 public static final FunctionResolver FUNCTIONS = new FunctionResolver();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 static {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 FUNCTIONS.addFunction("contains", 2, new XPathFunction() {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 @Override
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 public Object evaluate(List args) throws XPathFunctionException {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 try {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 Object [] haystack = (Object [])args.get(0);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 Object needle = args.get(1);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 for (Object straw: haystack) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 if (straw.equals(needle)) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 return Boolean.TRUE;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 return Boolean.FALSE;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 catch (Exception e) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 throw new XPathFunctionException(e);
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53 });
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
54 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
55
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 protected List<Entry> functions;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 public FunctionResolver() {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 functions = new ArrayList<Entry>();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62 public void addFunction(String name, int arity, XPathFunction function) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 functions.add(new Entry(name, function, arity));
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 @Override
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public XPathFunction resolveFunction(QName functionName, int arity) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 if (!functionName.getNamespaceURI().equals(FUNCTION_NAMESPACE_URI)) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 return null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 String name = functionName.getLocalPart();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 for (Entry entry: functions) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75 if (entry.arity == arity && entry.name.equals(name)) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 return entry.function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 return null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org