comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java @ 998:b81626b10cb7

Datacage: Moved templating in a better suited package. flys-artifacts/trunk@2434 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 01 Aug 2011 08:31:09 +0000
parents
children 3ca999f507b7
comparison
equal deleted inserted replaced
997:4c82609824c8 998:b81626b10cb7
1 package de.intevation.flys.artifacts.datacage.templating;
2
3 import java.util.List;
4 import java.util.Collection;
5 import java.util.Map;
6 import java.util.ArrayList;
7
8 import javax.xml.xpath.XPathFunctionResolver;
9 import javax.xml.xpath.XPathFunction;
10 import javax.xml.xpath.XPathFunctionException;
11
12 import javax.xml.namespace.QName;
13
14 import org.apache.log4j.Logger;
15
16 public class FunctionResolver
17 implements XPathFunctionResolver
18 {
19 private static Logger log = Logger.getLogger(FunctionResolver.class);
20
21 public static final String FUNCTION_NAMESPACE_URI = "dc";
22
23 public static final class Entry {
24
25 String name;
26 XPathFunction function;
27 int arity;
28
29 public Entry() {
30 }
31
32 public Entry(String name, XPathFunction function, int arity) {
33 this.name = name;
34 this.function = function;
35 this.arity = arity;
36 }
37 } // class Entry
38
39 public static final FunctionResolver FUNCTIONS = new FunctionResolver();
40
41 static {
42 FUNCTIONS.addFunction("contains", 2, new XPathFunction() {
43 @Override
44 public Object evaluate(List args) throws XPathFunctionException {
45 Object haystack = args.get(0);
46 Object needle = args.get(1);
47 try {
48 if (haystack instanceof Collection) {
49 return Boolean.valueOf(
50 ((Collection)haystack).contains(needle));
51 }
52
53 if (haystack instanceof Map) {
54 return Boolean.valueOf(
55 ((Map)haystack).containsKey(needle));
56 }
57
58 if (haystack instanceof Object []) {
59 for (Object straw: (Object [])haystack) {
60 if (straw.equals(needle)) {
61 return Boolean.TRUE;
62 }
63 }
64 }
65
66 return Boolean.FALSE;
67 }
68 catch (Exception e) {
69 log.error(e);
70 throw new XPathFunctionException(e);
71 }
72 }
73 });
74 }
75
76 protected List<Entry> functions;
77
78 public FunctionResolver() {
79 functions = new ArrayList<Entry>();
80 }
81
82 public void addFunction(String name, int arity, XPathFunction function) {
83 functions.add(new Entry(name, function, arity));
84 }
85
86 @Override
87 public XPathFunction resolveFunction(QName functionName, int arity) {
88
89 if (!functionName.getNamespaceURI().equals(FUNCTION_NAMESPACE_URI)) {
90 return null;
91 }
92
93 String name = functionName.getLocalPart();
94 for (Entry entry: functions) {
95 if (entry.arity == arity && entry.name.equals(name)) {
96 return entry.function;
97 }
98 }
99
100 return null;
101 }
102 }
103 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org