1 /* ===========================================================
2  * JFreeChart : a free chart library for the Java(tm) platform
3  * ===========================================================
4  *
5  * (C) Copyright 2000-2013, by Object Refinery Limited and Contributors.
6  *
7  * Project Info:  http://www.jfree.org/jfreechart/index.html
8  *
9  * This library is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
17  * License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
22  * USA.
23  *
24  * [Oracle and Java are registered trademarks of Oracle and/or its affiliates.
25  * Other names may be trademarks of their respective owners.]
26  *
27  * ----------------
28  * RootHandler.java
29  * ----------------
30  * (C) Copyright 2003-2008, by Object Refinery Limited and Contributors.
31  *
32  * Original Author:  David Gilbert (for Object Refinery Limited);
33  * Contributor(s):   -;
34  *
35  * Changes
36  * -------
37  * 23-Jan-2003 : Version 1 (DG);
38  *
39  */
40 
41 package org.jfree.data.xml;
42 
43 import java.util.Stack;
44 
45 import org.xml.sax.SAXException;
46 import org.xml.sax.helpers.DefaultHandler;
47 
48 /**
49  * A SAX handler that delegates work to sub-handlers.
50  */
51 public class RootHandler extends DefaultHandler implements DatasetTags {
52 
53     /** The sub-handlers. */
54     private Stack subHandlers;
55 
56     /**
57      * Creates a new handler.
58      */
RootHandler()59     public RootHandler() {
60         this.subHandlers = new Stack();
61     }
62 
63     /**
64      * Returns the stack of sub handlers.
65      *
66      * @return The sub-handler stack.
67      */
getSubHandlers()68     public Stack getSubHandlers() {
69         return this.subHandlers;
70     }
71 
72     /**
73      * Receives some (or all) of the text in the current element.
74      *
75      * @param ch  character buffer.
76      * @param start  the start index.
77      * @param length  the length of the valid character data.
78      *
79      * @throws SAXException for errors.
80      */
81     @Override
characters(char[] ch, int start, int length)82     public void characters(char[] ch, int start, int length)
83         throws SAXException {
84         DefaultHandler handler = getCurrentHandler();
85         if (handler != this) {
86             handler.characters(ch, start, length);
87         }
88     }
89 
90     /**
91      * Returns the handler at the top of the stack.
92      *
93      * @return The handler.
94      */
getCurrentHandler()95     public DefaultHandler getCurrentHandler() {
96         DefaultHandler result = this;
97         if (this.subHandlers != null) {
98             if (this.subHandlers.size() > 0) {
99                 Object top = this.subHandlers.peek();
100                 if (top != null) {
101                     result = (DefaultHandler) top;
102                 }
103             }
104         }
105         return result;
106     }
107 
108     /**
109      * Pushes a sub-handler onto the stack.
110      *
111      * @param subhandler  the sub-handler.
112      */
pushSubHandler(DefaultHandler subhandler)113     public void pushSubHandler(DefaultHandler subhandler) {
114         this.subHandlers.push(subhandler);
115     }
116 
117     /**
118      * Pops a sub-handler from the stack.
119      *
120      * @return The sub-handler.
121      */
popSubHandler()122     public DefaultHandler popSubHandler() {
123         return (DefaultHandler) this.subHandlers.pop();
124     }
125 
126 }
127