Mercurial > dive4elements > river
comparison flys-client/src/main/java/de/intevation/flys/client/server/meta/Converter.java @ 286:0fa8bf8a2295
Datacage: Better converter for incoming XML tree
flys-client/trunk@1916 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 13 May 2011 09:06:13 +0000 |
parents | |
children | 2e02db03e576 |
comparison
equal
deleted
inserted
replaced
285:3e99953bac8d | 286:0fa8bf8a2295 |
---|---|
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 | |
8 import de.intevation.flys.client.shared.model.DataCageTree; | |
9 import de.intevation.flys.client.shared.model.DataCageNode; | |
10 | |
11 import java.util.List; | |
12 import java.util.ArrayList; | |
13 import java.util.Map; | |
14 import java.util.HashMap; | |
15 | |
16 public class Converter | |
17 { | |
18 public interface NodeConverter | |
19 { | |
20 DataCageNode convert(Element node, Converter converter); | |
21 | |
22 } // interface NodeConverter | |
23 | |
24 public static class NameConverter implements NodeConverter { | |
25 public DataCageNode convert(Element node, Converter converter) { | |
26 System.err.println("NameConverter called"); | |
27 DataCageNode out = new DataCageNode(node.getAttribute("name")); | |
28 converter.convertChildren(out, node); | |
29 return out; | |
30 } | |
31 } // class NameConverter | |
32 | |
33 public static class I18NConverter implements NodeConverter { | |
34 public DataCageNode convert(Element node, Converter converter) { | |
35 System.err.println("I18NConverter called"); | |
36 DataCageNode out = | |
37 new DataCageNode("${" + node.getLocalName() + "}"); | |
38 converter.convertChildren(out, node); | |
39 return out; | |
40 } | |
41 } // I18NConverter | |
42 | |
43 protected Map<String, NodeConverter> converters; | |
44 | |
45 protected void convertChildren(DataCageNode parent, Element sub) { | |
46 System.err.println("convertChildren called"); | |
47 NodeList children = sub.getChildNodes(); | |
48 for (int i = 0, N = children.getLength(); i < N; ++i) { | |
49 Node child = children.item(i); | |
50 if (child.getNodeType() == Node.ELEMENT_NODE) { | |
51 String name = child.getLocalName(); | |
52 NodeConverter converter = converters.get(name); | |
53 if (converter != null) { | |
54 DataCageNode son = converter.convert( | |
55 (Element)child, this); | |
56 parent.addChild(son); | |
57 } | |
58 } | |
59 } // for all children | |
60 } | |
61 | |
62 public Converter() { | |
63 converters = new HashMap<String, NodeConverter>(); | |
64 registerConverters(); | |
65 } | |
66 | |
67 protected void registerConverters() { | |
68 System.err.println("register converters called"); | |
69 converters.put("datacage", new NameConverter()); | |
70 converters.put("river", new NameConverter()); | |
71 converters.put("gauge", new NameConverter()); | |
72 converters.put("historical", new NameConverter()); | |
73 converters.put("discharge-table-nn", new I18NConverter()); | |
74 converters.put("discharge-table-gauge", new I18NConverter()); | |
75 converters.put("fixations", new I18NConverter()); | |
76 converters.put("fixation", new I18NConverter()); | |
77 converters.put("columns", new I18NConverter()); | |
78 converters.put("column", new NameConverter()); | |
79 converters.put("flood-protections", new I18NConverter()); | |
80 converters.put("flood-protection", new I18NConverter()); | |
81 converters.put("flood-water-marks", new I18NConverter()); | |
82 converters.put("flood-water-mark", new I18NConverter()); | |
83 converters.put("water-levels", new I18NConverter()); | |
84 converters.put("water-level", new I18NConverter()); | |
85 converters.put("extra-longitudinal-sections", new I18NConverter()); | |
86 converters.put("extra-longitudinal-section", new I18NConverter()); | |
87 converters.put("longitudinal-section", new I18NConverter()); | |
88 } | |
89 | |
90 public DataCageTree convert(Document document) { | |
91 System.err.println("convert called"); | |
92 | |
93 ArrayList<DataCageNode> roots = new ArrayList<DataCageNode>(); | |
94 NodeList nodes = document.getChildNodes(); | |
95 for (int i = 0, N = nodes.getLength(); i < N; ++i) { | |
96 Node node = nodes.item(i); | |
97 if (node.getNodeType() == Node.ELEMENT_NODE) { | |
98 System.err.println("search for name: " + node.getLocalName()); | |
99 NodeConverter converter = converters.get(node.getLocalName()); | |
100 if (converter != null) { | |
101 roots.add(converter.convert((Element)node, this)); | |
102 } | |
103 } | |
104 } | |
105 return roots.isEmpty() | |
106 ? new DataCageTree() | |
107 : new DataCageTree(roots.get(0)); | |
108 } | |
109 } | |
110 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |