URLNotificationParser.java

/*
 * URLNotificationParser
 */
package gov.usgs.earthquake.distribution;

import java.net.URL;
import java.util.Date;

import gov.usgs.earthquake.product.ProductId;
import gov.usgs.util.SAXAdapter;
import gov.usgs.util.XmlUtils;

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

/**
 * This class is not intended to be instantiated directly. Instead, use the
 * static URLNotification.parse method
 *
 * @see URLNotification
 */
public class URLNotificationParser extends SAXAdapter {

  /** Namespace for product XML */
  public static final String PRODUCT_XML_NAMESPACE = "http://earthquake.usgs.gov/distribution/product";

  /** static var for notification element */
  public static final String NOTIFICATION_ELEMENT = "notification";
  /** attribute for product id */
  public static final String ATTRIBUTE_PRODUCT_ID = "id";
  /** attribute for updated */
  public static final String ATTRIBUTE_PRODUCT_UPDATED = "updated";
  /** attribute for expires */
  public static final String ATTRIBUTE_EXPIRES = "expires";
  /** attribute for url */
  public static final String ATTRIBUTE_URL = "url";

  /** The parsed notification. */
  private URLNotification notification;

  /**
   * Construct a URLNotificationParser. This class is not intended to be
   * instantiated directly. Instead, use the static URLNotification.parse method.
   */
  protected URLNotificationParser() {
  }

  /**
   * @return the parsed notification
   */
  public URLNotification getNotification() {
    return notification;
  }

  /**
   * 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 (!uri.equals(PRODUCT_XML_NAMESPACE)) {
      return;
    }

    if (localName.equals(NOTIFICATION_ELEMENT)) {
      ProductId id = ProductId.parse(XmlUtils.getAttribute(attributes, uri, ATTRIBUTE_PRODUCT_ID));
      id.setUpdateTime(XmlUtils.getDate(XmlUtils.getAttribute(attributes, uri, ATTRIBUTE_PRODUCT_UPDATED)));

      Date expirationDate = XmlUtils.getDate(XmlUtils.getAttribute(attributes, uri, ATTRIBUTE_EXPIRES));

      URL productURL = null;
      try {
        productURL = new URL(XmlUtils.getAttribute(attributes, uri, ATTRIBUTE_URL));
      } catch (Exception e) {
        throw new SAXException("Unable to parse product url", e);
      }

      notification = new URLNotification(id, expirationDate, productURL);
    }
  }

}