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(SENDER_TYPE_AWS)) {
			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();
	}

}