annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java @ 4903:5ab87837622f

Sort the locations array in new datacage templating language functions.
author Raimund Renkert <rrenkert@intevation.de>
date Tue, 29 Jan 2013 17:42:04 +0100
parents e1566938d04c
children 1e379598c47a
rev   line source
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.datacage.templating;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
4903
5ab87837622f Sort the locations array in new datacage templating language functions.
Raimund Renkert <rrenkert@intevation.de>
parents: 4902
diff changeset
3 import java.util.Arrays;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import java.util.List;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import java.util.Collection;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import java.util.Map;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 import java.util.ArrayList;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 import javax.xml.xpath.XPathFunctionResolver;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 import javax.xml.xpath.XPathFunction;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 import javax.xml.xpath.XPathFunctionException;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13 import javax.xml.namespace.QName;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15 import org.apache.log4j.Logger;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
17
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
18 /** Resolves functions (e.g. dc:contains) in Datacage/Meta-Data system. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 public class FunctionResolver
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 implements XPathFunctionResolver
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 {
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
22 /** Home logger. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 private static Logger log = Logger.getLogger(FunctionResolver.class);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
25 public static final String FUNCTION_NAMESPACE_URI = "dc";
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27 public static final class Entry {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 String name;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 XPathFunction function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31 int arity;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 public Entry() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 public Entry(String name, XPathFunction function, int arity) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 this.name = name;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 this.function = function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 this.arity = arity;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 } // class Entry
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43 public static final FunctionResolver FUNCTIONS = new FunctionResolver();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45 static {
1930
de0c2bbb27f9 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1716
diff changeset
46 /** Implementation of case-ignoring dc:contains. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 FUNCTIONS.addFunction("contains", 2, new XPathFunction() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 @Override
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 public Object evaluate(List args) throws XPathFunctionException {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 Object haystack = args.get(0);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 Object needle = args.get(1);
1716
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
52
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
53 if (needle instanceof String) {
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
54 needle = ((String)needle).toUpperCase();
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
55 }
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
56
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 try {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 if (haystack instanceof Collection) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 return Boolean.valueOf(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 ((Collection)haystack).contains(needle));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
61 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
62
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 if (haystack instanceof Map) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 return Boolean.valueOf(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 ((Map)haystack).containsKey(needle));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 if (haystack instanceof Object []) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 for (Object straw: (Object [])haystack) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 if (straw.equals(needle)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 return Boolean.TRUE;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 return Boolean.FALSE;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 catch (Exception e) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 log.error(e);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 throw new XPathFunctionException(e);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
82 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
83 });
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
85
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
86 static {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
87 /** Implementation for getting the minimum value of location or distance
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
88 * dc:fromValue. */
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
89 FUNCTIONS.addFunction("fromValue", 3, new XPathFunction() {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
90 @Override
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
91 public Object evaluate(List args) throws XPathFunctionException {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
92 Object mode = args.get(0);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
93 Object locations = args.get(1);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
94 Object from = args.get(2);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
95
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
96 if (!(mode instanceof String)){
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
97 return -Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
98 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
99
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
100 if (mode.equals("locations")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
101 if (!(locations instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
102 return -Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
103 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
104 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
105 String loc = ((String)locations).replace(" ", "");
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
106 String[] split = loc.split(",");
4903
5ab87837622f Sort the locations array in new datacage templating language functions.
Raimund Renkert <rrenkert@intevation.de>
parents: 4902
diff changeset
107 Arrays.sort(split);
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
108 return split[0];
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
109 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
110 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
111 else if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
112 if (!(from instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
113 return -Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
114 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
115 String f = (String)from;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
116 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
117 return Double.parseDouble(f);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
118 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
119 catch(NumberFormatException nfe) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
120 return -Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
121 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
122 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
123 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
124 return -Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
125 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
126 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
127 });
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
128 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
129
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
130 static {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
131 /** Implementation for getting the maximum value of location or distance
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
132 * dc:toValue. */
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
133 FUNCTIONS.addFunction("toValue", 3, new XPathFunction() {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
134 @Override
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
135 public Object evaluate(List args) throws XPathFunctionException {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
136 Object mode = args.get(0);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
137 Object locations = args.get(1);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
138 Object to = args.get(2);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
139
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
140 if (!(mode instanceof String)){
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
141 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
142 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
143
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
144 if (mode.equals("locations")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
145 if (!(locations instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
146 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
147 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
148 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
149 String loc = ((String)locations).replace(" ", "");
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
150 String[] split = loc.split(",");
4903
5ab87837622f Sort the locations array in new datacage templating language functions.
Raimund Renkert <rrenkert@intevation.de>
parents: 4902
diff changeset
151 Arrays.sort(split);
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
152 return split[split.length - 1];
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
153 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
154 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
155 else if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
156 if (!(to instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
157 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
158 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
159 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
160 String t = (String)to;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
161 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
162 return Double.parseDouble(t);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
163 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
164 catch(NumberFormatException nfe) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
165 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
166 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
167 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
168 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
169 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
170 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
171 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
172 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
173 });
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
174 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
175
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
176 /** List of functions. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
177 protected List<Entry> functions;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
178
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
179 public FunctionResolver() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
180 functions = new ArrayList<Entry>();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
181 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
182
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
183 /**
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
184 * Create a new function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
185 * @param name Name of the function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
186 * @param arity Number of arguments for function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
187 * @param function the function itself.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
188 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
189 public void addFunction(String name, int arity, XPathFunction function) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
190 functions.add(new Entry(name, function, arity));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
191 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
192
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
193 @Override
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
194 public XPathFunction resolveFunction(QName functionName, int arity) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
195
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
196 if (!functionName.getNamespaceURI().equals(FUNCTION_NAMESPACE_URI)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
197 return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
198 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
199
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
200 String name = functionName.getLocalPart();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201 for (Entry entry: functions) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202 if (entry.arity == arity && entry.name.equals(name)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 return entry.function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
204 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
205 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
206
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
207 return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
208 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
209 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
210 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org