1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package ch.elca.el4j.env.xml;
18
19 import java.util.Map;
20
21 import org.springframework.core.io.Resource;
22 import org.xml.sax.Attributes;
23 import org.xml.sax.SAXException;
24 import org.xml.sax.helpers.DefaultHandler;
25
26 import ch.elca.el4j.env.xml.handlers.EnvGroupHandler;
27
28
29
30
31
32
33
34
35
36 public class EnvSaxHandler extends DefaultHandler {
37
38
39
40 private Map<String, EnvGroupHandler> m_handlers;
41
42
43
44
45 private EnvGroupHandler m_currentGroupHandler;
46
47
48
49
50 private int m_depth = 0;
51
52
53
54
55 public EnvSaxHandler(Map<String, EnvGroupHandler> handlers) {
56 m_handlers = handlers;
57 }
58
59
60
61
62
63 public void startResource(Resource resource) {
64 for (EnvGroupHandler handler : m_handlers.values()) {
65 if (handler != null) {
66 handler.startResource(resource);
67 }
68 }
69 }
70
71
72 @Override
73 public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
74 if (m_depth == 0) {
75 assert qName.equals("env");
76 } else if (m_depth == 1) {
77 if (qName.equals("group")) {
78 m_currentGroupHandler = m_handlers.get(attributes.getValue("type"));
79 } else {
80 m_currentGroupHandler = m_handlers.get(qName);
81 }
82 } else if (m_currentGroupHandler != null) {
83 m_currentGroupHandler.startElement(uri, localName, qName, attributes);
84 }
85 m_depth++;
86 }
87
88
89 @Override
90 public void characters(char[] ch, int start, int length) throws SAXException {
91 if (m_currentGroupHandler != null) {
92 m_currentGroupHandler.characters(ch, start, length);
93 }
94 }
95
96
97 @Override
98 public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
99 if (m_currentGroupHandler != null) {
100 m_currentGroupHandler.ignorableWhitespace(ch, start, length);
101 }
102 }
103
104
105 @Override
106 public void endElement(String uri, String localName, String name) throws SAXException {
107 if (m_currentGroupHandler != null) {
108 m_currentGroupHandler.endElement(uri, localName, name);
109 }
110 m_depth--;
111 }
112 }