ProductTrackerParser.java

package gov.usgs.earthquake.distribution;

import gov.usgs.earthquake.product.ProductId;

import gov.usgs.util.SAXAdapter;
import gov.usgs.util.XmlUtils;

import java.net.InetAddress;
import java.net.URL;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

/**
 * Parser for ProductTracker responses.
 */
public class ProductTrackerParser extends SAXAdapter {

	/** The tracker that generated the list being parsed. */
	private URL trackerURL;

	/** A list of parsed updates. */
	private List<ProductTrackerUpdate> updates = new LinkedList<ProductTrackerUpdate>();

	/** The current update being parsed. */
	private ProductTrackerUpdate update = null;

	/**
	 * Create a new TrackerUpdateParser.
	 * @param trackerURL URL that generated the list being parsed
	 */
	public ProductTrackerParser(final URL trackerURL) {
		this.trackerURL = trackerURL;
	}

	/**
	 * Get the parsed updates.
	 * @return list of parsed updates
	 */
	public List<ProductTrackerUpdate> getUpdates() {
		return updates;
	}

	/**
	 * SAXAdapter start element handler.
	 *
	 * @param uri
	 *            element uri.
	 * @param localName
	 *            element localName.
	 * @param qName
	 *            element qName.
	 * @param attributes
	 *            element attributes.
	 * @throws SAXException
	 *             if there is an error.
	 */
	public void onStartElement(final String uri, final String localName,
			final String qName, final Attributes attributes)
			throws SAXException {
		if (localName.equals("update")) {
			try {
				Long sequenceNumber = Long.valueOf(XmlUtils.getAttribute(
						attributes, uri, "sequenceNumber"));
				Date created = XmlUtils.getDate(XmlUtils.getAttribute(
						attributes, uri, "created"));
				InetAddress host = InetAddress.getByName(XmlUtils.getAttribute(
						attributes, uri, "host"));
				ProductId id = new ProductId(XmlUtils.getAttribute(attributes,
						uri, "source"), XmlUtils.getAttribute(attributes,
								uri, "type"), XmlUtils.getAttribute(attributes, uri,
						"code"), XmlUtils.getDate(XmlUtils.getAttribute(
						attributes, uri, "updateTime")));
				String className = XmlUtils.getAttribute(attributes, uri,
						"className");
				update = new ProductTrackerUpdate(trackerURL, sequenceNumber,
						created, host, id, className, null);
			} catch (Exception e) {
				throw new SAXException(e);
			}
		}
	}

	/**
	 * SAXAdapter end element handler. Content only includes characters that
	 * were read from this element, NOT any characters from child elements.
	 *
	 * @param uri
	 *            element uri.
	 * @param localName
	 *            element localName.
	 * @param qName
	 *            element qName.
	 * @param content
	 *            element content.
	 * @throws SAXException
	 *             if onEndElement throws a SAXException.
	 */
	public void onEndElement(final String uri, final String localName,
			final String qName, final String content) throws SAXException {
		// message is element content
		update.setMessage(content);
		// add update to list of parsed updates
		updates.add(update);
		// reset update to null
		update = null;
	}

}