/** * weupnp - Trivial upnp java library * * Copyright (C) 2008 Alessandro Bahgat Shehata, Daniele Castagna * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.bitlet.weupnp; import java.util.Map; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * A simple SAX handler that is used to parse XML name value pairs in the form * <name>value</name> * * @see org.xml.sax.helpers.DefaultHandler */ public class NameValueHandler extends DefaultHandler { /** * A reference to the name-value map to populate with the data being read */ private Map<String, String> nameValue; /** * The last read element */ private String currentElement; /** * Creates a new instance of a <tt>NameValueHandler</tt>, storing values in * the supplied map * * @param nameValue * the map to store name-value pairs in */ public NameValueHandler(Map<String, String> nameValue) { this.nameValue = nameValue; } /** * Receive notification of the start of an element. * * Caches the element as {@link #currentElement}, so that it will be stored * as a map key when the corresponding value will be read. * * @param uri * The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace processing is not being performed. * @param localName * The local name (without prefix), or the empty string if Namespace * processing is not being performed. * @param qName * The qualified name (with prefix), or the empty string if qualified * names are not available. * @param attributes * The attributes attached to the element. If there are no * attributes, it shall be an empty Attributes object. * @exception org.xml.sax.SAXException * Any SAX exception, possibly wrapping another exception. * @see org.xml.sax.ContentHandler#startElement */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { currentElement = localName; } /** * Receive notification of the end of an element. * * It is used to reset currentElement when the XML node is closed. Note: * this works only when the data we are interested in does not contain child * nodes. * * Based on a patch provided by christophercyll and attached to issue #4: * http://code.google.com/p/weupnp/issues/detail?id=4 * * @param uri * The Namespace URI, or the empty string if the element has no * Namespace URI or if Namespace processing is not being performed. * @param localName * The local name (without prefix), or the empty string if Namespace * processing is not being performed. * @param qName * The qualified name (with prefix), or the empty string if qualified * names are not available. * @throws SAXException * Any SAX exception, possibly wrapping another exception. */ public void endElement(String uri, String localName, String qName) throws SAXException { currentElement = null; } /** * Receive notification of character data inside an element. * * Stores the characters as value, using {@link #currentElement} as a key * * @param ch * The characters. * @param start * The start position in the character array. * @param length * The number of characters to use from the character array. * @exception org.xml.sax.SAXException * Any SAX exception, possibly wrapping another exception. * @see org.xml.sax.ContentHandler#characters */ public void characters(char[] ch, int start, int length) throws SAXException { if (currentElement != null) { String value = new String(ch, start, length); String old = nameValue.put(currentElement, value); if (old != null) { nameValue.put(currentElement, old + value); } } } }