annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java @ 5164:8c65acf01adc 2.9.10

Fixed datacage to be oracle compatible.
author Raimund Renkert <rrenkert@intevation.de>
date Mon, 04 Mar 2013 11:44:11 +0100
parents 53be73133104
children ba489a16f4d8
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
4949
53be73133104 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4926
diff changeset
3 import java.util.ArrayList;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import java.util.Collection;
4949
53be73133104 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4926
diff changeset
5 import java.util.List;
998
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
4949
53be73133104 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4926
diff changeset
8 import javax.xml.namespace.QName;
53be73133104 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4926
diff changeset
9
998
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;
4949
53be73133104 Removed obsolete imports.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4926
diff changeset
12 import javax.xml.xpath.XPathFunctionResolver;
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 import org.apache.log4j.Logger;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
16
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
17 /** 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
18 public class FunctionResolver
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 implements XPathFunctionResolver
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 {
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
21 /** Home logger. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 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
23
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24 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
25
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
26 public static final class Entry {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
27
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
28 String name;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29 XPathFunction function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 int arity;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
31
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 public Entry() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 }
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 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
36 this.name = name;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 this.function = function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 this.arity = arity;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
40 } // class Entry
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 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
43
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 static {
1930
de0c2bbb27f9 Cosmetics, docs.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1716
diff changeset
45 /** 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
46 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
47 @Override
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 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
49 Object haystack = args.get(0);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 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
51
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
52 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
53 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
54 }
3ca999f507b7 flys/issue314: Variables in datacage are now case insensitive.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 998
diff changeset
55
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
56 try {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
57 if (haystack instanceof Collection) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
58 return Boolean.valueOf(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
59 ((Collection)haystack).contains(needle));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
60 }
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 if (haystack instanceof Map) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 return Boolean.valueOf(
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 ((Map)haystack).containsKey(needle));
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 }
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 if (haystack instanceof Object []) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 for (Object straw: (Object [])haystack) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 if (straw.equals(needle)) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 return Boolean.TRUE;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 }
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 return Boolean.FALSE;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 catch (Exception e) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 log.error(e);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79 throw new XPathFunctionException(e);
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 }
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
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
85 static {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
86 /** 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
87 * dc:fromValue. */
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
88 FUNCTIONS.addFunction("fromValue", 3, new XPathFunction() {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
89 @Override
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
90 public Object evaluate(List args) throws XPathFunctionException {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
91 Object mode = args.get(0);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
92 Object locations = args.get(1);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
93 Object from = args.get(2);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
94
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
95 if (!(mode instanceof String)){
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
96 return -99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
97 }
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 if (mode.equals("locations")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
100 if (!(locations instanceof String)) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
101 return -99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
102 }
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
103 String loc = ((String)locations).replace(" ", "");
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
104 String[] split = loc.split(",");
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
105 if (split.length < 1) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
106 return -99999d;
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
107 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
108 try {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
109 double min = Double.parseDouble(split[0]);
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
110 for (int i = 1; i < split.length; ++i) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
111 double v = Double.parseDouble(split[i]);
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
112 if (v < min) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
113 min = v;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
114 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
115 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
116 return min;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
117 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
118 catch (NumberFormatException nfe) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
119 return -99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
120 }
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 else if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
123 if (!(from instanceof String)) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
124 return -99999d;
4902
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 String f = (String)from;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
127 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
128 return Double.parseDouble(f);
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 catch(NumberFormatException nfe) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
131 return -99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
132 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
133 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
134 else {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
135 return -99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
136 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
137 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
138 });
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
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
141 static {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
142 /** 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
143 * dc:toValue. */
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
144 FUNCTIONS.addFunction("toValue", 3, new XPathFunction() {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
145 @Override
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
146 public Object evaluate(List args) throws XPathFunctionException {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
147 Object mode = args.get(0);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
148 Object locations = args.get(1);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
149 Object to = args.get(2);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
150
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
151 if (!(mode instanceof String)){
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
152 return 99999d;
4902
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 if (mode.equals("locations")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
156 if (!(locations instanceof String)) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
157 return 99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
158 }
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
159 try {
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
160 String loc = ((String)locations).replace(" ", "");
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
161 String[] split = loc.split(",");
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
162 if (split.length < 1) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
163 return 99999d;
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
164 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
165 double max = Double.parseDouble(split[0]);
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
166 for (int i = 1; i < split.length; ++i) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
167 double v = Double.parseDouble(split[i]);
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
168 if (v > max) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
169 max = v;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
170 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
171 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
172 return max;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
173 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
174 catch (NumberFormatException nfe) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
175 return 99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
176 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
177 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
178 else if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
179 if (!(to instanceof String)) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
180 return 99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
181 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
182 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
183 String t = (String)to;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
184 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
185 return Double.parseDouble(t);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
186 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
187 catch(NumberFormatException nfe) {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
188 return 99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
189 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
190 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
191 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
192 else {
5164
8c65acf01adc Fixed datacage to be oracle compatible.
Raimund Renkert <rrenkert@intevation.de>
parents: 4949
diff changeset
193 return 99999d;
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
194 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
195 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
196 });
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
197 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
198
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
199 /** List of functions. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
200 protected List<Entry> functions;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202 public FunctionResolver() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 functions = new ArrayList<Entry>();
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
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
206 /**
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
207 * Create a new function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
208 * @param name Name of the function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
209 * @param arity Number of arguments for function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
210 * @param function the function itself.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
211 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
212 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
213 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
214 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
215
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216 @Override
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217 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
218
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
219 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
220 return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
221 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
222
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
223 String name = functionName.getLocalPart();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 for (Entry entry: functions) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225 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
226 return entry.function;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
227 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
228 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
229
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
230 return null;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
232 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
233 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org