EventDataXMLHandler.java

package gov.usgs.earthquake.dyfi;

import gov.usgs.util.XmlUtils;

import java.util.HashMap;
import java.util.Map;

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

/**
 * Parser for DYFI "eventdata.xml" metadata.
 */
public class EventDataXMLHandler extends DefaultHandler {

  /** XML Element Name for event_data */
  public static final String DYFI_EVENTDATA_ELEMENT = "event_data";
  /** XML Element Name for event */
  public static final String DYFI_EVENT_ELEMENT = "event";
  /** XML Element Name for cdi_summary */
  public static final String DYFI_CDI_SUMMARY_ELEMENT = "cdi_summary";
  /** XML Element Name for products */
  public static final String DYFI_PRODUCTS_ELEMENT = "products";

  /** Static string to stop parsing before list of products */
  public static final String DYFI_STOP_PARSING_BEFORE_PRODUCTS = "Stop parsing before list of product files.";

  /** Map of XML attributes */
  public static final Map<String, String[]> DYFI_ELEMENT_ATTRIBUTES = new HashMap<String, String[]>();
  static {
    // Statically add all these attributes and associate them to their
    // corresponding elements

    // Currently we only care about the max MMI and number of responses.
    DYFI_ELEMENT_ATTRIBUTES.put(DYFI_CDI_SUMMARY_ELEMENT,
        new String[] { DYFIProduct.DYFI_NUM_RESP_PROPERTY, DYFIProduct.DYFI_MAX_MMI_PROPERTY });
  }

  private DYFIProduct dyfi = null;

  /**
   * Constructor
   *
   * @param dyfi takes in DYFIProduct
   */
  public EventDataXMLHandler(final DYFIProduct dyfi) {
    this.dyfi = dyfi;
  }

  /** @return DYFIProduct */
  public DYFIProduct getDYFI() {
    return this.dyfi;
  }

  /** @param dyfi Product to set */
  public void setDYFI(final DYFIProduct dyfi) {
    this.dyfi = dyfi;
  }

  /**
   *
   * @param in XML object to parse
   * @return DYFIProduct
   * @throws Exception if exception message equals stop_parsing string
   */
  public DYFIProduct parse(final Object in) throws Exception {
    try {
      XmlUtils.parse(in, this);
    } catch (Exception e) {
      if (!DYFI_STOP_PARSING_BEFORE_PRODUCTS.equals(e.getMessage())) {
        throw e;
      }
    }
    return getDYFI();
  }

  public final void startElement(final String uri, final String localName, final String qName,
      final Attributes attributes) throws SAXException {

    if (localName != null && DYFI_PRODUCTS_ELEMENT.equals(localName)) {
      // We don't need the list of product files at this time.
      throw new SAXException(DYFI_STOP_PARSING_BEFORE_PRODUCTS);
    }

    if (DYFI_CDI_SUMMARY_ELEMENT.equals(localName)) {
      dyfi.setNumResponses(attributes.getValue(DYFIProduct.DYFI_NUM_RESP_ATTRIBUTE));
      dyfi.setMaxMMI(attributes.getValue(DYFIProduct.DYFI_MAX_MMI_ATTRIBUTE));
    }
  }
}