EIDSProductBuilder.java

  1. package gov.usgs.earthquake.eids;

  2. import java.util.Iterator;
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.logging.Level;
  7. import java.util.logging.Logger;

  8. import gov.usgs.ansseqmsg.EQMessage;
  9. import gov.usgs.earthquake.distribution.ProductBuilder;
  10. import gov.usgs.earthquake.distribution.ProductSender;
  11. import gov.usgs.earthquake.eidsutil.EIDSClient;
  12. import gov.usgs.earthquake.eidsutil.EIDSListener;
  13. import gov.usgs.earthquake.eidsutil.EIDSMessageEvent;
  14. import gov.usgs.earthquake.product.Product;
  15. import gov.usgs.util.Config;

  16. /**
  17.  * Convert messages from EIDS into products.
  18.  *
  19.  * Listens to messages from an EIDSClient. Uses EQXMLProductParser and
  20.  * EventAddonParser to build products. Any built products are sent to all
  21.  * configured productSenders.
  22.  */
  23. public class EIDSProductBuilder extends ProductBuilder implements EIDSListener {

  24.     /** Logging object. */
  25.     private static final Logger LOGGER = Logger
  26.             .getLogger(EIDSProductBuilder.class.getName());

  27.     /** Convert EventAddon to EQMessage objects. */
  28.     private EventAddonParser addonParser = new EventAddonParser();

  29.     /** Convert EQMessages to products. */
  30.     private EQMessageProductCreator eqmessageProductCreator = new EQMessageProductCreator();

  31.     /**
  32.      * Receive EIDS messages from an EIDSClient.
  33.      *
  34.      * Any received messages are parsed and sent to any ProductSenders. If the
  35.      * message is not EQXML, this method returns immediately.
  36.      */
  37.     @Override
  38.     public synchronized void onEIDSMessage(EIDSMessageEvent event) {
  39.         List<Product> products = new LinkedList<Product>();

  40.         // parse eids message into Products
  41.         if (event.getRootElement().equals("EQMessage")) {
  42.             try {
  43.                 products.addAll(eqmessageProductCreator
  44.                         .getEQMessageProducts(event.getMessage()));
  45.             } catch (Exception e) {
  46.                 // unable to parse EQMessage
  47.                 LOGGER.log(Level.WARNING, "Error while parsing EQMessage", e);
  48.                 LOGGER.info(event.getMessage());
  49.                 return;
  50.             }
  51.         } else if (event.getRootElement().equals("eventaddon")) {
  52.             try {
  53.                 EQMessage message = addonParser.parseMessage(event);
  54.                 if (message != null) {
  55.                     products.addAll(eqmessageProductCreator
  56.                             .getEQMessageProducts(message));
  57.                 } else {
  58.                     LOGGER.log(Level.WARNING, "Unable to parse eventaddon\n"
  59.                             + event.getMessage());
  60.                 }
  61.             } catch (Exception e) {
  62.                 // unable to parse eventaddon
  63.                 LOGGER.log(Level.WARNING, "Error while parsing eventaddon", e);
  64.                 LOGGER.info(event.getMessage());
  65.                 return;
  66.             }
  67.         } else {
  68.             // not parseable
  69.             LOGGER.info("Unexpected EIDS message {" + event.getRootNamespace()
  70.                     + "}" + event.getRootElement());
  71.             return;
  72.         }

  73.         LOGGER.finest("Received EIDS message " + event.getMessage());

  74.         // add eids properties onto products
  75.         String feederSource = event.getMessageSource();
  76.         Long feederSequence = event.getMessageSequence();
  77.         Iterator<Product> iter = products.iterator();
  78.         while (iter.hasNext()) {
  79.             Product product = iter.next();
  80.             Map<String, String> properties = product.getProperties();
  81.             if (feederSource != null) {
  82.                 properties.put("eids-feeder", feederSource);
  83.             }
  84.             if (feederSequence != null) {
  85.                 properties.put("eids-feeder-sequence",
  86.                         feederSequence.toString());
  87.             }
  88.         }

  89.         try {
  90.             // send products
  91.             iter = products.iterator();
  92.             while (iter.hasNext()) {
  93.                 Product product = iter.next();
  94.                 LOGGER.fine("Sending product id=" + product.getId()
  95.                         + ", status=" + product.getStatus());

  96.                 Map<ProductSender, Exception> errors = sendProduct(product);
  97.                 Iterator<ProductSender> senders = errors.keySet().iterator();
  98.                 while (senders.hasNext()) {
  99.                     LOGGER.log(Level.WARNING, "Error sending product",
  100.                             errors.get(senders.next()));
  101.                     LOGGER.info(event.getMessage());
  102.                 }
  103.             }
  104.         } catch (Exception e) {
  105.             LOGGER.log(Level.FINE, "Error sending products", e);
  106.         }

  107.     }

  108.     /**
  109.      * Main method to test EQXMLProductBuilder.
  110.      *
  111.      * Connects an eids client to the product builder, and uses a dummy product
  112.      * sender that outputs to stderr.
  113.      *
  114.      * @param args arguments included in the running of main
  115.      */
  116.     public static void main(final String[] args) {
  117.         EIDSProductBuilder builder = new EIDSProductBuilder();
  118.         builder.addProductSender(new ProductSender() {
  119.             @Override
  120.             public void configure(Config arg0) throws Exception {
  121.             }

  122.             @Override
  123.             public void shutdown() throws Exception {
  124.             }

  125.             @Override
  126.             public void startup() throws Exception {
  127.             }

  128.             @Override
  129.             public void sendProduct(Product product) throws Exception {
  130.                 System.err.println("product id=" + product.getId().toString());

  131.                 Iterator<String> names = product.getProperties().keySet()
  132.                         .iterator();
  133.                 while (names.hasNext()) {
  134.                     String name = names.next();
  135.                     System.err.println("\t" + name + "="
  136.                             + product.getProperties().get(name));
  137.                 }
  138.             }

  139.             @Override
  140.             public String getName() {
  141.                 return null;
  142.             }

  143.             @Override
  144.             public void setName(String arg0) {
  145.             }
  146.         });

  147.         EIDSClient client = new EIDSClient("eids1.cr.usgs.gov", 39977);
  148.         client.addListener(builder);
  149.         client.startup();
  150.     }

  151. }