Mercurial > dive4elements > river
comparison flys-client/src/main/java/org/dive4elements/river/client/server/meta/Converter.java @ 5834:f507086aa94b
Repaired internal references.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:31:32 +0200 |
parents | flys-client/src/main/java/de/intevation/flys/client/server/meta/Converter.java@823c8afa1335 |
children | 821a02bbfb4e |
comparison
equal
deleted
inserted
replaced
5833:a2bdc0f524e8 | 5834:f507086aa94b |
---|---|
1 package de.intevation.flys.client.server.meta; | |
2 | |
3 import org.w3c.dom.Document; | |
4 import org.w3c.dom.Element; | |
5 import org.w3c.dom.Node; | |
6 import org.w3c.dom.NodeList; | |
7 import org.w3c.dom.Attr; | |
8 import org.w3c.dom.NamedNodeMap; | |
9 | |
10 import org.apache.log4j.Logger; | |
11 | |
12 import de.intevation.flys.client.shared.model.DataCageTree; | |
13 import de.intevation.flys.client.shared.model.DataCageNode; | |
14 import de.intevation.flys.client.shared.model.AttrList; | |
15 | |
16 import java.util.ArrayList; | |
17 import java.util.Map; | |
18 import java.util.HashMap; | |
19 | |
20 import de.intevation.artifacts.common.utils.XMLUtils; | |
21 | |
22 /** | |
23 * Converts document parts (meta-data xml) to datacagenodes/trees, | |
24 * which are shown in datacage widgets. | |
25 */ | |
26 public class Converter | |
27 { | |
28 private static final Logger logger = Logger.getLogger(Converter.class); | |
29 | |
30 | |
31 public interface NodeConverter | |
32 { | |
33 DataCageNode convert(Element node, Converter converter); | |
34 | |
35 } // interface NodeConverter | |
36 | |
37 public static class NameConverter implements NodeConverter { | |
38 public DataCageNode convert(Element node, Converter converter) { | |
39 //System.err.println("NameConverter called"); | |
40 DataCageNode out = new DataCageNode( | |
41 node.getAttribute("name"), | |
42 toAttrList(node.getAttributes())); | |
43 converter.convertChildren(out, node); | |
44 return out; | |
45 } | |
46 } // class NameConverter | |
47 | |
48 public static class I18NConverter implements NodeConverter { | |
49 public DataCageNode convert(Element node, Converter converter) { | |
50 //System.err.println("I18NConverter called"); | |
51 | |
52 String name = node.getLocalName(); | |
53 String desc = node.hasAttribute("description") | |
54 ? node.getAttribute("description") | |
55 : "${" + name + "}"; | |
56 | |
57 DataCageNode out = | |
58 new DataCageNode(name, desc, toAttrList(node.getAttributes())); | |
59 | |
60 converter.convertChildren(out, node); | |
61 return out; | |
62 } | |
63 } // I18NConverter | |
64 | |
65 private static Map<String, NodeConverter> converters = new HashMap<String, NodeConverter>(); | |
66 | |
67 public static final NodeConverter NAME_CONVERTER = new NameConverter(); | |
68 public static final NodeConverter I18N_CONVERTER = new I18NConverter(); | |
69 | |
70 static { | |
71 converters.put("river", NAME_CONVERTER); | |
72 converters.put("gauge", NAME_CONVERTER); | |
73 converters.put("historical", NAME_CONVERTER); | |
74 converters.put("column", NAME_CONVERTER); | |
75 } | |
76 | |
77 | |
78 /** Trivial constructor. */ | |
79 public Converter() { | |
80 } | |
81 | |
82 | |
83 public DataCageTree convert(Document document) { | |
84 logger.debug("convert called"); | |
85 | |
86 if (logger.isDebugEnabled()) { | |
87 logger.debug(XMLUtils.toString(document)); | |
88 } | |
89 | |
90 ArrayList<DataCageNode> roots = new ArrayList<DataCageNode>(); | |
91 NodeList nodes = document.getChildNodes(); | |
92 for (int i = 0, N = nodes.getLength(); i < N; ++i) { | |
93 Node node = nodes.item(i); | |
94 if (node.getNodeType() == Node.ELEMENT_NODE) { | |
95 Element ele = (Element)node; | |
96 roots.add(convertElement(ele)); | |
97 } | |
98 } | |
99 return roots.isEmpty() | |
100 ? new DataCageTree() | |
101 : new DataCageTree(roots.get(0)); | |
102 } | |
103 | |
104 protected void convertChildren(DataCageNode parent, Element sub) { | |
105 //System.err.println("convertChildren called"); | |
106 NodeList children = sub.getChildNodes(); | |
107 for (int i = 0, N = children.getLength(); i < N; ++i) { | |
108 Node child = children.item(i); | |
109 if (child.getNodeType() == Node.ELEMENT_NODE) { | |
110 Element childele = (Element)child; | |
111 parent.addChild(convertElement(childele)); | |
112 | |
113 if (childele.hasAttribute("description")) | |
114 logger.debug("nwd: " + childele.getAttribute("description")); | |
115 } | |
116 } // for all children | |
117 } | |
118 | |
119 private DataCageNode convertElement(Element element) { | |
120 String name = element.getLocalName(); | |
121 | |
122 logger.debug("search for name: " + name); | |
123 | |
124 NodeConverter converter = converters.get(name); | |
125 if (converter == null) { | |
126 converter = I18N_CONVERTER; | |
127 } | |
128 return converter.convert(element, this); | |
129 | |
130 } | |
131 | |
132 | |
133 /** | |
134 * Creates key/value pairs from Nodes Attributes. | |
135 */ | |
136 public static AttrList toAttrList(NamedNodeMap nodeMap) { | |
137 if (nodeMap == null) { | |
138 return null; | |
139 } | |
140 int N = nodeMap.getLength(); | |
141 | |
142 if (N == 0) { | |
143 return null; | |
144 } | |
145 | |
146 AttrList result = new AttrList(N); | |
147 | |
148 for (int i = 0; i < N; ++i) { | |
149 Node node = nodeMap.item(i); | |
150 if (node.getNodeType() == Node.ATTRIBUTE_NODE) { | |
151 Attr attr = (Attr)node; | |
152 String key = attr.getName(); | |
153 String value = attr.getValue(); | |
154 result.add(key, value); | |
155 } | |
156 } | |
157 | |
158 return result; | |
159 } | |
160 } | |
161 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |