Mercurial > dive4elements > river
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 : |