annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/FunctionResolver.java @ 976:d830c398c8f4

Improved XPath handling for absent flags. flys-artifacts/trunk@2402 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 25 Jul 2011 14:12:14 +0000
parents 30c85cb33a50
children
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;
974
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
4 import java.util.Collection;
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
5 import java.util.Map;
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import java.util.ArrayList;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 import javax.xml.xpath.XPathFunctionResolver;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 import javax.xml.xpath.XPathFunction;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 import javax.xml.xpath.XPathFunctionException;
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 import javax.xml.namespace.QName;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 974
diff changeset
14 import org.apache.log4j.Logger;
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 974
diff changeset
15
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 public class FunctionResolver
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
17 implements XPathFunctionResolver
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 {
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 974
diff changeset
19 private static Logger log = Logger.getLogger(FunctionResolver.class);
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 974
diff changeset
20
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 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
22
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 public static final class 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 String name;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 XPathFunction function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 int arity;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 public Entry() {
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
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 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
33 this.name = name;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 this.function = function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35 this.arity = arity;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 } // class Entry
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 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
40
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 static {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 FUNCTIONS.addFunction("contains", 2, new XPathFunction() {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 @Override
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 public Object evaluate(List args) throws XPathFunctionException {
974
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
45 Object haystack = args.get(0);
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
46 Object needle = args.get(1);
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 try {
974
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
48 if (haystack instanceof Collection) {
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
49 return Boolean.valueOf(
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
50 ((Collection)haystack).contains(needle));
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
51 }
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
52
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
53 if (haystack instanceof Map) {
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
54 return Boolean.valueOf(
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
55 ((Map)haystack).containsKey(needle));
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
56 }
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
57
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
58 if (haystack instanceof Object []) {
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
59 for (Object straw: (Object [])haystack) {
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
60 if (straw.equals(needle)) {
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
61 return Boolean.TRUE;
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
62 }
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 }
974
30c85cb33a50 meta data service: made artifact optional and allow passing extra parameters.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 959
diff changeset
65
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 return Boolean.FALSE;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 catch (Exception e) {
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 974
diff changeset
69 log.error(e);
959
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 throw new XPathFunctionException(e);
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 });
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 protected List<Entry> functions;
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 public FunctionResolver() {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 functions = new ArrayList<Entry>();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 }
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 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
83 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
84 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 @Override
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87 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
88
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 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
90 return null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
93 String name = functionName.getLocalPart();
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
94 for (Entry entry: functions) {
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
95 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
96 return entry.function;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 return null;
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 }
a2b20ed3d3b4 Datacage: Added custom provider for XPath functions.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org