annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/StackFrames.java @ 976:d830c398c8f4

Improved XPath handling for absent flags. flys-artifacts/trunk@2402 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 25 Jul 2011 14:12:14 +0000
parents e91996b46e3c
children
rev   line source
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 package de.intevation.flys.artifacts.services.meta;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 import java.util.Map;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 import java.util.List;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 import java.util.HashMap;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 import java.util.ArrayList;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7
957
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
8 import javax.xml.xpath.XPathVariableResolver;
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
9
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
10 import javax.xml.namespace.QName;
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
11
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
12 import org.apache.log4j.Logger;
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
13
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 public class StackFrames
957
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
15 implements XPathVariableResolver
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 {
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
17 private static Logger log = Logger.getLogger(StackFrames.class);
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
18
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 protected List<Map<String, Object>> frames;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
21 public StackFrames() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
22 frames = new ArrayList<Map<String, Object>>();
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
23 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
24
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
25 public StackFrames(Map<String, Object> initialFrame) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
26 this();
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
27 if (initialFrame != null) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
28 frames.add(new HashMap<String, Object>(initialFrame));
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
29 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
30 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
31
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
32 public void enter() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
33 frames.add(new HashMap<String, Object>());
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
34 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
35
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
36 public void leave() {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 frames.remove(frames.size()-1);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
40 public void put(String key, Object value) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
41 int N = frames.size();
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
42 if (N > 0) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
43 frames.get(N-1).put(key, value);
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
44 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
45 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
46
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47 public void put(String [] keys, Object [] values) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
48 Map<String, Object> top = frames.get(frames.size()-1);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
49 for (int i = 0; i < keys.length; ++i) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
50 top.put(keys[i], values[i]);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
51 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
52 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
53
415
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
54 public boolean containsKey(String key) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
55 for (int i = frames.size()-1; i >= 0; --i) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
56 if (frames.get(i).containsKey(key)) {
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
57 return true;
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
58 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
59 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
60 return false;
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
61 }
7c018f466d6d Datacage: Added river parameter to meta data services.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 372
diff changeset
62
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
63 public Object get(String key) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
64 return get(key, null);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
65 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
66
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67 public Object get(String key, Object def) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69 for (int i = frames.size()-1; i >= 0; --i) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 Map<String, Object> frame = frames.get(i);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71 if (frame.containsKey(key)) {
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 return frame.get(key);
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 return def;
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 }
957
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
78
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
79 @Override
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
80 public Object resolveVariable(QName variableName) {
976
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
81 if (log.isDebugEnabled()) {
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
82 log.debug("resolve var: " + variableName);
d830c398c8f4 Improved XPath handling for absent flags.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 957
diff changeset
83 }
957
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
84 return get(variableName.getLocalPart());
e91996b46e3c Meta data template: Added new choose/when/otherwise construct similiar to XSLT
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 415
diff changeset
85 }
372
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
86 }
fc3cf0ef777e Added meta data service.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
87 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org