RelayProductListener.java

/*
 * RelayProductListener
 */
package gov.usgs.earthquake.distribution;

import gov.usgs.earthquake.aws.AwsProductSender;
import gov.usgs.earthquake.product.Product;
import gov.usgs.util.Config;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Listen for products and use a product sender (SocketProductSender by default)
 * to send products as they are received.
 */
public class RelayProductListener extends DefaultNotificationListener {

  /** Logging object. */
  private static final Logger LOGGER = Logger.getLogger(RelayProductListener.class.getName());

  /** property for senderType */
  public static final String SENDER_TYPE_PROPERTY = "senderType";
  /** property saying the sender type is aws */
  public static final String SENDER_TYPE_AWS = "aws";

  /** Sender used to send products. */
  private ProductSender sender;

  /**
   * Empty constructor for configurable, will configure as a SocketProductSender.
   */
  public RelayProductListener() {
  }

  /**
   * Construct a RelayProductListener using a custom ProductSender.
   *
   * @param sender the sender to use.
   */
  public RelayProductListener(final ProductSender sender) {
    this.sender = sender;
  }

  /**
   * Send a product.
   */
  public void onProduct(final Product product) {
    LOGGER.info("Relaying product " + product.getId().toString() + " " + product.getId().getUpdateTime());

    try {
      sender.sendProduct(product);
    } catch (Exception e) {
      LOGGER.log(Level.WARNING, "Error relaying product", e);
    }
  }

  /**
   * Creates a SocketProductSender and uses its configure method.
   */
  public void configure(Config config) throws Exception {
    // read DefaultNotificationListener properties
    super.configure(config);

    final String senderType = config.getProperty(SENDER_TYPE_PROPERTY);
    if (senderType != null && SENDER_TYPE_AWS.equals(senderType)) {
      sender = new AwsProductSender();
    } else {
      sender = new SocketProductSender();
    }
    sender.configure(config);
  }

  public void setName(final String name) {
    super.setName(name);
    // also set sender name for logging
    if (sender != null) {
      sender.setName(name);
    }
  }

  /**
   * Call the sender shutdown method.
   */
  public void shutdown() throws Exception {
    super.shutdown();
    sender.shutdown();
  }

  /**
   * Call the sender startup method.
   */
  public void startup() throws Exception {
    super.startup();
    sender.startup();
  }

}