001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * ----------------
028     * ItemHandler.java
029     * ----------------
030     * (C) Copyright 2003-2005, by Object Refinery Limited and Contributors.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   -;
034     *
035     * $Id: ItemHandler.java,v 1.3.2.1 2005/10/25 21:36:10 mungady Exp $
036     *
037     * Changes (from 21-Jun-2001)
038     * --------------------------
039     * 23-Jan-2003 : Version 1 (DG);
040     *
041     */
042    
043    package org.jfree.data.xml;
044    
045    import org.xml.sax.Attributes;
046    import org.xml.sax.SAXException;
047    import org.xml.sax.helpers.DefaultHandler;
048    
049    /**
050     * A handler for reading key-value items.
051     */
052    public class ItemHandler extends DefaultHandler implements DatasetTags {
053    
054        /** The root handler. */
055        private RootHandler root;
056    
057        /** The parent handler (can be the same as root, but not always). */
058        private DefaultHandler parent;
059    
060        /** The key. */
061        private Comparable key;
062    
063        /** The value. */
064        private Number value;
065    
066        /**
067         * Creates a new item handler.
068         *
069         * @param root  the root handler.
070         * @param parent  the parent handler.
071         */
072        public ItemHandler(RootHandler root, DefaultHandler parent) {
073            this.root = root;
074            this.parent = parent;
075            this.key = null;
076            this.value = null;
077        }
078    
079        /**
080         * Returns the key that has been read by the handler, or <code>null</code>.
081         *
082         * @return The key.
083         */
084        public Comparable getKey() {
085            return this.key;
086        }
087    
088        /**
089         * Sets the key.
090         *
091         * @param key  the key.
092         */
093        public void setKey(Comparable key) {
094            this.key = key;
095        }
096    
097        /**
098         * Returns the key that has been read by the handler, or <code>null</code>.
099         *
100         * @return The value.
101         */
102        public Number getValue() {
103            return this.value;
104        }
105    
106        /**
107         * Sets the value.
108         *
109         * @param value  the value.
110         */
111        public void setValue(Number value) {
112            this.value = value;
113        }
114    
115        /**
116         * The start of an element.
117         *
118         * @param namespaceURI  the namespace.
119         * @param localName  the element name.
120         * @param qName  the element name.
121         * @param atts  the attributes.
122         *
123         * @throws SAXException for errors.
124         */
125        public void startElement(String namespaceURI,
126                                 String localName,
127                                 String qName,
128                                 Attributes atts) throws SAXException {
129    
130            if (qName.equals(ITEM_TAG)) {
131                KeyHandler subhandler = new KeyHandler(this.root, this);
132                this.root.pushSubHandler(subhandler);
133            }
134            else if (qName.equals(VALUE_TAG)) {
135                ValueHandler subhandler = new ValueHandler(this.root, this);
136                this.root.pushSubHandler(subhandler);
137            }
138            else {
139                throw new SAXException(
140                    "Expected <Item> or <Value>...found " + qName
141                );
142            }
143    
144        }
145    
146        /**
147         * The end of an element.
148         *
149         * @param namespaceURI  the namespace.
150         * @param localName  the element name.
151         * @param qName  the element name.
152         */
153        public void endElement(String namespaceURI,
154                               String localName,
155                               String qName) {
156    
157            if (this.parent instanceof PieDatasetHandler) {
158                PieDatasetHandler handler = (PieDatasetHandler) this.parent;
159                handler.addItem(this.key, this.value);
160                this.root.popSubHandler();
161            }
162            else if (this.parent instanceof CategorySeriesHandler) {
163                CategorySeriesHandler handler = (CategorySeriesHandler) this.parent;
164                handler.addItem(this.key, this.value);
165                this.root.popSubHandler();
166            }
167    
168        }
169    
170    }