EIDSProductBuilder.java
- package gov.usgs.earthquake.eids;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.Map;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import gov.usgs.ansseqmsg.EQMessage;
- import gov.usgs.earthquake.distribution.ProductBuilder;
- import gov.usgs.earthquake.distribution.ProductSender;
- import gov.usgs.earthquake.eidsutil.EIDSClient;
- import gov.usgs.earthquake.eidsutil.EIDSListener;
- import gov.usgs.earthquake.eidsutil.EIDSMessageEvent;
- import gov.usgs.earthquake.product.Product;
- import gov.usgs.util.Config;
- /**
- * Convert messages from EIDS into products.
- *
- * Listens to messages from an EIDSClient. Uses EQXMLProductParser and
- * EventAddonParser to build products. Any built products are sent to all
- * configured productSenders.
- */
- public class EIDSProductBuilder extends ProductBuilder implements EIDSListener {
- /** Logging object. */
- private static final Logger LOGGER = Logger
- .getLogger(EIDSProductBuilder.class.getName());
- /** Convert EventAddon to EQMessage objects. */
- private EventAddonParser addonParser = new EventAddonParser();
- /** Convert EQMessages to products. */
- private EQMessageProductCreator eqmessageProductCreator = new EQMessageProductCreator();
- /**
- * Receive EIDS messages from an EIDSClient.
- *
- * Any received messages are parsed and sent to any ProductSenders. If the
- * message is not EQXML, this method returns immediately.
- */
- @Override
- public synchronized void onEIDSMessage(EIDSMessageEvent event) {
- List<Product> products = new LinkedList<Product>();
- // parse eids message into Products
- if (event.getRootElement().equals("EQMessage")) {
- try {
- products.addAll(eqmessageProductCreator
- .getEQMessageProducts(event.getMessage()));
- } catch (Exception e) {
- // unable to parse EQMessage
- LOGGER.log(Level.WARNING, "Error while parsing EQMessage", e);
- LOGGER.info(event.getMessage());
- return;
- }
- } else if (event.getRootElement().equals("eventaddon")) {
- try {
- EQMessage message = addonParser.parseMessage(event);
- if (message != null) {
- products.addAll(eqmessageProductCreator
- .getEQMessageProducts(message));
- } else {
- LOGGER.log(Level.WARNING, "Unable to parse eventaddon\n"
- + event.getMessage());
- }
- } catch (Exception e) {
- // unable to parse eventaddon
- LOGGER.log(Level.WARNING, "Error while parsing eventaddon", e);
- LOGGER.info(event.getMessage());
- return;
- }
- } else {
- // not parseable
- LOGGER.info("Unexpected EIDS message {" + event.getRootNamespace()
- + "}" + event.getRootElement());
- return;
- }
- LOGGER.finest("Received EIDS message " + event.getMessage());
- // add eids properties onto products
- String feederSource = event.getMessageSource();
- Long feederSequence = event.getMessageSequence();
- Iterator<Product> iter = products.iterator();
- while (iter.hasNext()) {
- Product product = iter.next();
- Map<String, String> properties = product.getProperties();
- if (feederSource != null) {
- properties.put("eids-feeder", feederSource);
- }
- if (feederSequence != null) {
- properties.put("eids-feeder-sequence",
- feederSequence.toString());
- }
- }
- try {
- // send products
- iter = products.iterator();
- while (iter.hasNext()) {
- Product product = iter.next();
- LOGGER.fine("Sending product id=" + product.getId()
- + ", status=" + product.getStatus());
- Map<ProductSender, Exception> errors = sendProduct(product);
- Iterator<ProductSender> senders = errors.keySet().iterator();
- while (senders.hasNext()) {
- LOGGER.log(Level.WARNING, "Error sending product",
- errors.get(senders.next()));
- LOGGER.info(event.getMessage());
- }
- }
- } catch (Exception e) {
- LOGGER.log(Level.FINE, "Error sending products", e);
- }
- }
- /**
- * Main method to test EQXMLProductBuilder.
- *
- * Connects an eids client to the product builder, and uses a dummy product
- * sender that outputs to stderr.
- *
- * @param args arguments included in the running of main
- */
- public static void main(final String[] args) {
- EIDSProductBuilder builder = new EIDSProductBuilder();
- builder.addProductSender(new ProductSender() {
- @Override
- public void configure(Config arg0) throws Exception {
- }
- @Override
- public void shutdown() throws Exception {
- }
- @Override
- public void startup() throws Exception {
- }
- @Override
- public void sendProduct(Product product) throws Exception {
- System.err.println("product id=" + product.getId().toString());
- Iterator<String> names = product.getProperties().keySet()
- .iterator();
- while (names.hasNext()) {
- String name = names.next();
- System.err.println("\t" + name + "="
- + product.getProperties().get(name));
- }
- }
- @Override
- public String getName() {
- return null;
- }
- @Override
- public void setName(String arg0) {
- }
- });
- EIDSClient client = new EIDSClient("eids1.cr.usgs.gov", 39977);
- client.addListener(builder);
- client.startup();
- }
- }