StationlistXMLHandler.java

/**
 * This class is not currently in use, but kept for posterity and the ability
 * to add this support back in if it is deemed necessary.
 */
package gov.usgs.earthquake.shakemap;

import gov.usgs.util.StringUtils;
import gov.usgs.util.XmlUtils;

import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

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

/**
 * Parser for Shakemap "stationlist.xml" metadata.
 */
public class StationlistXMLHandler extends DefaultHandler {

  /** Element for Shakemap data */
  public static final String SHAKEMAPDATA_ELEMENT = "shakemap-data";
  /** Shakemap data version */
  public static final String SHAKEMAPDATA_VERSION = "map_version";

  /** Element for earthquake */
  public static final String EARTHQUAKE_ELEMENT = "earthquake";
  /** String for earthquake id */
  public static final String EARTHQUAKE_ID = "id";
  /** String for earthquake latitiude */
  public static final String EARTHQUAKE_LAT = "lat";
  /** String for earthquake longitude */
  public static final String EARTHQUAKE_LON = "lon";
  /** String for earthquake magnitude */
  public static final String EARTHQUAKE_MAG = "mag";
  /** String for earthquake year */
  public static final String EARTHQUAKE_YEAR = "year";
  /** String for earthquake month */
  public static final String EARTHQUAKE_MONTH = "month";
  /** String for earthquake day */
  public static final String EARTHQUAKE_DAY = "day";
  /** String for earthquake hour */
  public static final String EARTHQUAKE_HOUR = "hour";
  /** String for earthquake minute */
  public static final String EARTHQUAKE_MINUTE = "minute";
  /** String for earthquake second */
  public static final String EARTHQUAKE_SECOND = "second";
  /** String for earthquake timezone */
  public static final String EARTHQUAKE_TIMEZONE = "timezone";
  /** String for earthquake depth */
  public static final String EARTHQUAKE_DEPTH = "depth";
  /** String for earthquake locstring */
  public static final String EARTHQUAKE_LOCSTRING = "locstring";
  /** String for earthquake created */
  public static final String EARTHQUAKE_CREATED = "created";

  /** The ShakeMap object parsed by this handler. */
  private ShakeMap shakemap;

  /**
   * Constructor
   *
   * @param shakemap a shakemap object parsed by handler
   */
  public StationlistXMLHandler(ShakeMap shakemap) {
    this.shakemap = shakemap;
  }

  /** @return shakemap */
  public ShakeMap getShakemap() {
    return shakemap;
  }

  /** @param shakemap to set */
  public void setShakemap(ShakeMap shakemap) {
    this.shakemap = shakemap;
  }

  /**
   * Takes in an XML object and parses it
   *
   * @param in an object
   * @return A shakemap
   * @throws Exception if error occurs
   */
  public ShakeMap parse(final Object in) throws Exception {
    XmlUtils.parse(in, this);
    return getShakemap();
  }

  /**
   * Parse element attributes.
   *
   * @param uri        element namespace.
   * @param localName  element name.
   * @param qName      qualified element name.
   * @param attributes element attributes.
   * @throws SAXException if error occurs
   */
  public final void startElement(final String uri, final String localName, final String qName,
      final Attributes attributes) throws SAXException {

    try {
      if (localName.equals(SHAKEMAPDATA_ELEMENT)) {
        shakemap.setVersion(attributes.getValue(SHAKEMAPDATA_VERSION));
      } else if (localName.equals(EARTHQUAKE_ELEMENT)) {
        shakemap.setLatitude(new BigDecimal(attributes.getValue(EARTHQUAKE_LAT)));
        shakemap.setLongitude(new BigDecimal(attributes.getValue(EARTHQUAKE_LON)));
        shakemap.setMagnitude(new BigDecimal(attributes.getValue(EARTHQUAKE_MAG)));
        shakemap.setDepth(new BigDecimal(attributes.getValue(EARTHQUAKE_DEPTH)));
        Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(attributes.getValue(EARTHQUAKE_TIMEZONE)));
        cal.set(Integer.parseInt(attributes.getValue(EARTHQUAKE_YEAR)),
            Integer.parseInt(attributes.getValue(EARTHQUAKE_MONTH)),
            Integer.parseInt(attributes.getValue(EARTHQUAKE_DAY)),
            Integer.parseInt(attributes.getValue(EARTHQUAKE_HOUR)),
            Integer.parseInt(attributes.getValue(EARTHQUAKE_MINUTE)),
            Integer.parseInt(attributes.getValue(EARTHQUAKE_SECOND)));
        shakemap.setEventTime(cal.getTime());
        shakemap.setEventDescription(attributes.getValue(EARTHQUAKE_LOCSTRING));
        shakemap.setProcessTimestamp(new Date(StringUtils.getLong(attributes.getValue(EARTHQUAKE_CREATED))));
      }
    } catch (Exception e) {
      throw new SAXException(e);
    }
  }

}