annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/FunctionResolver.java @ 4926:1e379598c47a

Fixed dc:fromValue/toValue (now handles values in locations as numbers).
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 31 Jan 2013 10:18:16 +0100
parents 5ab87837622f
children 53be73133104
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 }
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
104 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
105 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
106 if (split.length < 1) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
107 return -Double.MAX_VALUE;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
108 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
109 try {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
110 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
111 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
112 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
113 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
114 min = v;
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 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
117 return min;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
118 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
119 catch (NumberFormatException nfe) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
120 return -Double.MAX_VALUE;
4902
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 if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
124 if (!(from instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
125 return -Double.MAX_VALUE;
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 String f = (String)from;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
128 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
129 return Double.parseDouble(f);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
130 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
131 catch(NumberFormatException nfe) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
132 return -Double.MAX_VALUE;
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 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
135 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
136 return -Double.MAX_VALUE;
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
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
142 static {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
143 /** 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
144 * dc:toValue. */
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
145 FUNCTIONS.addFunction("toValue", 3, new XPathFunction() {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
146 @Override
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
147 public Object evaluate(List args) throws XPathFunctionException {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
148 Object mode = args.get(0);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
149 Object locations = args.get(1);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
150 Object to = args.get(2);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
151
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
152 if (!(mode instanceof String)){
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
153 return Double.MAX_VALUE;
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
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
156 if (mode.equals("locations")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
157 if (!(locations instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
158 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
159 }
4926
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
160 try {
4902
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
161 String loc = ((String)locations).replace(" ", "");
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
162 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
163 if (split.length < 1) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
164 return Double.MAX_VALUE;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
165 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
166 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
167 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
168 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
169 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
170 max = v;
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 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
173 return max;
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
174 }
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
175 catch (NumberFormatException nfe) {
1e379598c47a Fixed dc:fromValue/toValue (now handles values in locations as numbers).
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4903
diff changeset
176 return Double.MAX_VALUE;
4902
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 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
179 else if (mode.equals("distance")) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
180 if (!(to instanceof String)) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
181 return Double.MAX_VALUE;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
182 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
183 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
184 String t = (String)to;
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
185 try {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
186 return Double.parseDouble(t);
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
187 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
188 catch(NumberFormatException nfe) {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
189 return Double.MAX_VALUE;
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 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
193 else {
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
194 return Double.MAX_VALUE;
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 }
e1566938d04c Added new functions to datacage templating language.
Raimund Renkert <rrenkert@intevation.de>
parents: 4594
diff changeset
199
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
200 /** List of functions. */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
201 protected List<Entry> functions;
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
202
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
203 public FunctionResolver() {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
204 functions = new ArrayList<Entry>();
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
4594
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
207 /**
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
208 * Create a new function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
209 * @param name Name of the function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
210 * @param arity Number of arguments for function.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
211 * @param function the function itself.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents: 1930
diff changeset
212 */
998
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
213 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
214 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
215 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
216
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
217 @Override
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
218 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
219
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
220 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
221 return null;
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
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
224 String name = functionName.getLocalPart();
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
225 for (Entry entry: functions) {
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
226 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
227 return entry.function;
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
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
231 return null;
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 }
b81626b10cb7 Datacage: Moved templating in a better suited package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
234 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org