GridXMLHandler.java

  1. package gov.usgs.earthquake.shakemap;

  2. import gov.usgs.util.XmlUtils;

  3. import java.util.HashMap;

  4. import org.xml.sax.Attributes;
  5. import org.xml.sax.SAXException;
  6. import org.xml.sax.helpers.DefaultHandler;

  7. /**
  8.  * Parser for ShakeMap grid.xml metadata.
  9.  *
  10.  * Accepts a ShakeMap object and updates the properties of that product based on
  11.  * the product's grid.xml file.
  12.  */
  13. public class GridXMLHandler extends DefaultHandler {

  14.     // ShakeMap grid parameters
  15.         /** Element for shakemap grid */
  16.         public static final String SHAKEMAPGRID_ELEMENT = "shakemap_grid";
  17.         /** Shakemap grid id */
  18.         public static final String SHAKEMAPGRID_ID = "shakemap_id";
  19.         /** Shakemap grid originator */
  20.         public static final String SHAKEMAPGRID_ORIGINATOR = "shakemap_originator";
  21.         /** Shakemap grid process timestamp */
  22.         public static final String SHAKEMAPGRID_TIMESTAMP = "process_timestamp";
  23.         /** Shakemap grid version */
  24.         public static final String SHAKEMAPGRID_VERSION = "shakemap_version";
  25.         /** Shakemap grid event type */
  26.         public static final String SHAKEMAPGRID_EVENT_TYPE = "shakemap_event_type";
  27.         /** Shakemap grid event/map status */
  28.         public static final String SHAKEMAPGRID_EVENT_STATUS = "map_status";

  29.         // ShakeMap event parameters
  30.         /** Element for event */
  31.         public static final String EVENT_ELEMENT = "event";
  32.         /** Event latitude */
  33.         public static final String EVENT_LATITUDE = "lat";
  34.         /** Event longitude */
  35.         public static final String EVENT_LONGITUDE = "lon";
  36.         /** Event magnitude */
  37.         public static final String EVENT_MAGNITUDE = "magnitude";
  38.         /** Event timestamp */
  39.         public static final String EVENT_TIMESTAMP = "event_timestamp";
  40.         /** Event description */
  41.         public static final String EVENT_DESCRIPTION = "event_description";
  42.         /** Event depth */
  43.         public static final String EVENT_DEPTH = "depth";

  44.         // These are new parameters used by GSM when it is contributing to a
  45.         // different
  46.         // network as a backup
  47.         /** GSM Parameter when using a different network as a backup */
  48.         public static final String EVENT_NETWORK = "event_network";
  49.         /** GSM Parameter when using a different network as a backup */
  50.         public static final String EVENT_ID = "event_id";

  51.         // ShakeMap gridspec parameters
  52.         /** Element for grid specification */
  53.         public static final String GRIDSPEC_ELEMENT = "grid_specification";
  54.         /** gridspec longitude min */
  55.         public static final String GRIDSPEC_LONMIN = "lon_min";
  56.         /** gridspec longitude max */
  57.         public static final String GRIDSPEC_LONMAX = "lon_max";
  58.         /** gridspec latitude min */
  59.         public static final String GRIDSPEC_LATMIN = "lat_min";
  60.         /** gridspec latitude max */
  61.         public static final String GRIDSPEC_LATMAX = "lat_max";

  62.         /** XML for SHAKEMAPGRID_ELEMENT */
  63.         public static final String SHAKEMAPGRID_ELEMENT_XML = SHAKEMAPGRID_ELEMENT;
  64.         /** XML for SHAKEMAPGRID_ID */
  65.         public static final String SHAKEMAPGRID_ID_XML =  SHAKEMAPGRID_ELEMENT+ "[" + SHAKEMAPGRID_ID + "]";
  66.         /** XML for SHAKEMAPGRID_ORIGINATOR */
  67.         public static final String SHAKEMAPGRID_ORIGINATOR_XML = SHAKEMAPGRID_ELEMENT + "[" + SHAKEMAPGRID_ORIGINATOR + "]";
  68.         /** XML for SHAKEMAPGRID_TIMESTAMP */
  69.         public static final String SHAKEMAPGRID_TIMESTAMP_XML = SHAKEMAPGRID_ELEMENT + "[" + SHAKEMAPGRID_TIMESTAMP + "]";
  70.         /** XML for SHAKEMAPGRID_VERSION */
  71.         public static final String SHAKEMAPGRID_VERSION_XML = SHAKEMAPGRID_ELEMENT+ "[" + SHAKEMAPGRID_VERSION + "]";
  72.         /** XML for SHAKEMAPGRID_EVENT_TYPE */
  73.         public static final String SHAKEMAPGRID_EVENT_TYPE_XML = SHAKEMAPGRID_ELEMENT+ "[" + SHAKEMAPGRID_EVENT_TYPE + "]";
  74.         /** XML for SHAKEMAPGRID_EVENT_STATUS */
  75.         public static final String SHAKEMAPGRID_EVENT_STATUS_XML = SHAKEMAPGRID_ELEMENT+ "[" + SHAKEMAPGRID_EVENT_STATUS + "]";

  76.         /** XML for EVENT_ELEMENT */
  77.         public static final String EVENT_ELEMENT_XML = EVENT_ELEMENT;
  78.         /** XML for EVENT_LATITUDE */
  79.         public static final String EVENT_LATITUDE_XML = EVENT_ELEMENT + "[" + EVENT_LATITUDE + "]";
  80.         /** XML for EVENT_LONGITUDE */
  81.         public static final String EVENT_LONGITUDE_XML = EVENT_ELEMENT+ "[" + EVENT_LONGITUDE + "]";
  82.         /** XML for EVENT_MAGNITUDE */
  83.         public static final String EVENT_MAGNITUDE_XML = EVENT_ELEMENT+ "[" + EVENT_MAGNITUDE + "]";
  84.         /** XML for EVENT_TIMESTAMP */
  85.         public static final String EVENT_TIMESTAMP_XML = EVENT_ELEMENT+ "[" + EVENT_TIMESTAMP + "]";
  86.         /** XML for EVENT_DESCRIPTION */
  87.         public static final String EVENT_DESCRIPTION_XML = EVENT_ELEMENT+ "[" + EVENT_DESCRIPTION + "]";
  88.         /** XML for EVENT_DEPTH */
  89.         public static final String EVENT_DEPTH_XML = EVENT_ELEMENT+ "[" + EVENT_DEPTH + "]";
  90.         /** XML for EVENT_NETWORK */
  91.         public static final String EVENT_NETWORK_XML = EVENT_ELEMENT + "[" + EVENT_NETWORK + "]";
  92.         /** XML for EVENT_ID */
  93.         public static final String EVENT_ID_XML = EVENT_ELEMENT + "[" + EVENT_ID + "]";

  94.         /** XML for GRIDSPEC_ELEMENT */
  95.         public static final String GRIDSPEC_ELEMENT_XML = GRIDSPEC_ELEMENT;
  96.         /** XML for GRIDSPEC_LONMIN */
  97.         public static final String GRIDSPEC_LONMIN_XML = GRIDSPEC_ELEMENT+ "[" + GRIDSPEC_LONMIN + "]";
  98.         /** XML for GRIDSPEC_LONMAX */
  99.         public static final String GRIDSPEC_LONMAX_XML = GRIDSPEC_ELEMENT+ "[" + GRIDSPEC_LONMAX + "]";
  100.         /** XML for GRIDSPEC_LATMIN */
  101.         public static final String GRIDSPEC_LATMIN_XML = GRIDSPEC_ELEMENT+ "[" + GRIDSPEC_LATMIN + "]";
  102.         /** XML for GRIDSPEC_LATMAX */
  103.         public static final String GRIDSPEC_LATMAX_XML = GRIDSPEC_ELEMENT+ "[" + GRIDSPEC_LATMAX + "]";

  104.     // ShakeMap griddata parameters
  105.     /** Element for Shakemap griddata */
  106.     public static final String GRIDDATA_ELEMENT = "grid_data";
  107.     /** Shakemap griddata parameter to stop parsing before */
  108.     public static final String STOP_PARSING_BEFORE_GRIDDATA =
  109.             "Stop parsing before grid data.";

  110.     private HashMap<String, String> grid = new HashMap<String, String>();

  111.     /**
  112.      * Construct a new SAX Handler for an grid.xml document.
  113.      */
  114.     public GridXMLHandler() {}

  115.     /**
  116.      * @param in
  117.      *            - the file or stream to parse
  118.      * @return the ShakeMap associated with this XML handler
  119.      * @throws Exception if error occurs
  120.      */
  121.     public HashMap<String, String> parse(final Object in) throws Exception {
  122.         try {
  123.             XmlUtils.parse(in, this);
  124.         } catch (Exception se) {
  125.             if (!se.getMessage().equals(STOP_PARSING_BEFORE_GRIDDATA)) {
  126.                 throw se;
  127.             }
  128.         }
  129.         return this.grid;
  130.     }

  131.     /**
  132.      * @return the parsed info.
  133.      */
  134.     public HashMap<String, String> getInfo() {
  135.         return this.grid;
  136.     }


  137.     /**
  138.      * Read grid, event, and gridspec element attributes.
  139.      *
  140.      * @param uri namespace of element.
  141.      * @param localName name of element.
  142.      * @param qName qualified name of element.
  143.      * @param attributes element attributes.
  144.      * @throws SAXException when griddata element is reached, to stop parsing.
  145.      */
  146.     public final void startElement(final String uri, final String localName,
  147.             final String qName, final Attributes attributes)
  148.             throws SAXException {

  149.         if (localName != null && GRIDDATA_ELEMENT.equals(localName)) {
  150.             // don't read the whole grid
  151.             throw new SAXException(STOP_PARSING_BEFORE_GRIDDATA);
  152.         }

  153.         if (localName.equals(SHAKEMAPGRID_ELEMENT)) {
  154.             this.grid.put(SHAKEMAPGRID_ORIGINATOR_XML, attributes.getValue(SHAKEMAPGRID_ORIGINATOR));
  155.             this.grid.put(SHAKEMAPGRID_ID_XML, attributes.getValue(SHAKEMAPGRID_ID));
  156.             this.grid.put(SHAKEMAPGRID_TIMESTAMP_XML, attributes.getValue(SHAKEMAPGRID_TIMESTAMP));
  157.             this.grid.put(SHAKEMAPGRID_VERSION_XML, attributes.getValue(SHAKEMAPGRID_VERSION));
  158.             this.grid.put(SHAKEMAPGRID_EVENT_TYPE_XML, attributes.getValue(SHAKEMAPGRID_EVENT_TYPE));
  159.             this.grid.put(SHAKEMAPGRID_EVENT_STATUS_XML, attributes.getValue(SHAKEMAPGRID_EVENT_STATUS));
  160.         } else if (localName.equals(EVENT_ELEMENT)) {
  161.             this.grid.put(EVENT_LATITUDE_XML, attributes.getValue(EVENT_LATITUDE));
  162.             this.grid.put(EVENT_LONGITUDE_XML, attributes.getValue(EVENT_LONGITUDE));
  163.             this.grid.put(EVENT_MAGNITUDE_XML , attributes.getValue(EVENT_MAGNITUDE));
  164.             this.grid.put(EVENT_DEPTH_XML, attributes.getValue(EVENT_DEPTH));
  165.             this.grid.put(EVENT_TIMESTAMP_XML, attributes.getValue(EVENT_TIMESTAMP));
  166.             this.grid.put(EVENT_DESCRIPTION_XML, attributes.getValue(EVENT_DESCRIPTION));
  167.             this.grid.put(EVENT_NETWORK_XML, attributes.getValue(EVENT_NETWORK));
  168.             this.grid.put(EVENT_ID_XML, attributes.getValue(EVENT_ID));
  169.         } else if (localName.equals(GRIDSPEC_ELEMENT)) {
  170.             this.grid.put(GRIDSPEC_LONMIN_XML, attributes.getValue(GRIDSPEC_LONMIN));
  171.             this.grid.put(GRIDSPEC_LATMIN_XML, attributes.getValue(GRIDSPEC_LATMIN));
  172.             this.grid.put(GRIDSPEC_LONMAX_XML, attributes.getValue(GRIDSPEC_LONMAX));
  173.             this.grid.put(GRIDSPEC_LATMAX_XML, attributes.getValue(GRIDSPEC_LATMAX));
  174.         }
  175.     }
  176. }