1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package net.sf.webmancer.util.xml.sax;
22
23 import java.util.HashMap;
24 import java.util.Map;
25
26 import javax.xml.namespace.QName;
27
28 import org.xml.sax.Attributes;
29 import org.xml.sax.ContentHandler;
30 import org.xml.sax.SAXException;
31
32
33
34
35 public class ForkingHandler extends DelegateContentHandler {
36 private Map<QName, ContentHandler> handlers;
37
38 private ContentHandler defaultHandler;
39
40 private QName inside;
41
42
43
44
45 public ForkingHandler(final ContentHandler defaultHandler) {
46 super(defaultHandler);
47 this.handlers = new HashMap<QName, ContentHandler>();
48 this.defaultHandler = defaultHandler;
49 this.inside = null;
50 }
51
52
53
54
55 public ForkingHandler() {
56 this(null);
57 }
58
59
60
61
62
63 public void addContentHandler(final QName qname, final ContentHandler contentHandler) {
64 this.handlers.put(qname, contentHandler);
65 }
66
67
68
69
70
71
72 public void addContentHandler(final String uri, final String localName, final ContentHandler contentHandler) {
73 addContentHandler(new QName(uri, localName), contentHandler);
74 }
75
76
77
78
79
80 @Override
81 public void startElement(final String uri, final String localName, final String qName, final Attributes atts) throws SAXException {
82 QName qname = new QName(uri, localName);
83 ContentHandler newHandler = this.handlers.get(qname);
84 if (newHandler != null) {
85 setTargetContentHandler(newHandler);
86 this.inside = qname;
87 }
88 super.startElement(uri, localName, qName, atts);
89 }
90
91
92
93
94 @Override
95 public void endElement(final String uri, final String localName, final String qName) throws SAXException {
96 super.endElement(uri, localName, qName);
97 QName qname = new QName(uri, localName);
98 if (qname.equals(this.inside)) {
99 setTargetContentHandler(this.defaultHandler);
100 this.inside = null;
101 }
102 }
103
104 }