RegionsXML.java

  1. package gov.usgs.earthquake.geoserve;

  2. import java.io.InputStream;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.HashMap;
  6. import java.util.TreeSet;

  7. import gov.usgs.earthquake.qdm.Point;
  8. import gov.usgs.earthquake.qdm.Region;
  9. import gov.usgs.earthquake.qdm.Regions;
  10. import gov.usgs.earthquake.qdm.RegionsHandler;
  11. import gov.usgs.util.XmlUtils;

  12. /**
  13.  * Legacy Regions XML formatting for gov.usgs.earthquake.qdm.Regions.
  14.  *
  15.  */
  16. public class RegionsXML {

  17.     /**
  18.      * Output ANSS Authoritative Regions in the legacy Regions XML format.
  19.      * @param regions ANSS Authoritative regions
  20.      * @return String on regions in an XML format
  21.      */
  22.     public String formatXML(final Regions regions) {
  23.         StringBuffer xml = new StringBuffer(String.join("\n",
  24.             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>",
  25.             "<regions>",
  26.             "  <file name=\"regions.xml\">",
  27.             "  <update date=\"" + XmlUtils.formatDate(new Date()) + "\"/>",
  28.             "  <format version=\"0.2\"/>",
  29.             "\n<!--",
  30.             "# ANSS Authoritative Regions",
  31.             "# DEFAULT indicates no polygon - matches any event.",
  32.             "# A network may have more than 1 region list,",
  33.             "# but each region may be associated with only ONE network.",
  34.             "# There may only be 1 DEFAULT region.",
  35.             "-->\n"
  36.         ));

  37.         // group regions by netid
  38.         final HashMap<String, ArrayList<Region>> networks = new HashMap<>();
  39.         for (final Region region : regions.regions) {
  40.             String netid = region.netid;
  41.             ArrayList<Region> netRegions = networks.get(netid);
  42.             if (netRegions == null) {
  43.                 netRegions = new ArrayList<Region>();
  44.                 networks.put(netid, netRegions);
  45.             }
  46.             netRegions.add(region);
  47.         }

  48.         // output networks
  49.         for (String netid : new TreeSet<>(networks.keySet())) {
  50.             xml.append("\n<net")
  51.                     .append(" code=\"").append(netid).append("\"")
  52.                     // name is "DEFAULT" or not, use netid since it's unique
  53.                     .append(" name=\"").append(netid).append("\"")
  54.                     .append(">\n");
  55.             // output network regions
  56.             for (Region region : networks.get(netid)) {
  57.                 xml.append("  <region code=\"").append(region.regionid).append("\">\n");
  58.                 for (Point point : region.points) {
  59.                     xml.append("    <coordinate")
  60.                             .append(" latitude=\"").append(point.y).append("\"")
  61.                             .append(" longitude=\"").append(point.x).append("\"")
  62.                             .append("/>\n");
  63.                 }
  64.                 xml.append("  </region>\n");
  65.             }
  66.             xml.append("</net>\n");
  67.         }

  68.         // add NEIC as default region
  69.         xml.append(String.join("\n",
  70.                 "",
  71.                 "<net code=\"US\" name=\"DEFAULT\">",
  72.                 "  <region code=\"US\"/>",
  73.                 "</net>",
  74.                 ""));

  75.         xml.append("</regions>");

  76.         return xml.toString();
  77.     }

  78.     /**
  79.      * Parse regions from an XML input stream.
  80.      *
  81.      * @param in input stream
  82.      * @throws Exception if error occurs
  83.      * @return Regions
  84.      */
  85.     public static Regions getRegions(final InputStream in) throws Exception {
  86.         RegionsHandler regionsHandler = new RegionsHandler();
  87.         Exception error = regionsHandler.parse(in);
  88.         if (error != null) {
  89.             throw error;
  90.         }
  91.         return regionsHandler.regions;
  92.     }

  93.     /**
  94.      * Download ANSS Authoritative regions from Geoserve,
  95.      * and print to the screen in Regions XML format.
  96.      *
  97.      * @param args console arguments
  98.      * @throws Exception if error occurs
  99.      */
  100.     public static void main(final String[] args) throws Exception {
  101.         Regions regions = ANSSRegionsFactory.getFactory().getRegions();
  102.         String xml = new RegionsXML().formatXML(regions);
  103.         System.out.println(xml);
  104.     }

  105. }