EIDSNotificationReceiver.java
/*
* EIDSNotificationReceiver
*/
package gov.usgs.earthquake.distribution;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import gov.usgs.earthquake.eidsutil.EIDSClient;
import gov.usgs.earthquake.eidsutil.EIDSListener;
import gov.usgs.earthquake.eidsutil.EIDSMessageEvent;
import gov.usgs.util.Config;
import gov.usgs.util.StreamUtils;
/**
* Receive XML notifications using EIDS.
*
*
* This class implements the Configurable interface, and has the following
* options:
* <dl>
* <dt>serverHost</dt>
* <dd>The EIDS Server hostname or IP address.</dd>
* <dt>serverPort</dt>
* <dd>The EIDS Server listen port, usually 39977.</dd>
* <dt>alternateServers</dt>
* <dd>A comma separated list of HOST:PORT pairs. The EIDSClient will attempt to
* connect to these servers when unable to connect to the primary
* serverHost:serverPort.</dd>
* <dt>trackingFile</dt>
* <dd>A file name used for tracking connection state. This is used to receive
* missed messages when (re)connecting.</dd>
* </dl>
*/
public class EIDSNotificationReceiver extends DefaultNotificationReceiver
implements EIDSListener {
/** Logging object. */
private static final Logger LOGGER = Logger
.getLogger(EIDSNotificationReceiver.class.getName());
/** Property name for eids server host address. */
public static final String EIDS_SERVER_HOST_PROPERTY = "serverHost";
/** Property name for eids server port. */
public static final String EIDS_SERVER_PORT = "serverPort";
/** Property name for eids server alternate servers list. */
public static final String EIDS_ALTERNATE_SERVERS = "alternateServers";
/** Property name for eids client tracking file. */
public static final String EIDS_TRACKING_FILE = "trackingfile";
/** Property name for eids client log level. */
public static final String EIDS_DEBUG = "eidsDebug";
/** Property name for eids max server event age. */
public static final String EIDS_MAX_EVENT_AGE = "maxServerEventAgeDays";
/** EIDSClient that receives notifications. */
private EIDSClient client;
//TODO: Change condition using URLNotificationParser
/**
* Implement the EIDSListener interface to process messages from EIDS.
*
* Checks to make sure message has Correct namespace and root element before
* parsing.
*/
public void onEIDSMessage(EIDSMessageEvent event) {
if (URLNotificationParser.PRODUCT_XML_NAMESPACE.equals(event
.getRootNamespace())
&& URLNotificationParser.NOTIFICATION_ELEMENT.equals(event
.getRootElement())) {
InputStream in = null;
try {
in = StreamUtils.getInputStream(event.getMessage());
// this is a notification message
URLNotification notification = URLNotificationXMLConverter.parseXML(in);
// process the notification
receiveNotification(notification);
} catch (Exception e) {
LOGGER.log(Level.WARNING, "[" + getName()
+ "] exception while parsing URLNotification", e);
} finally {
StreamUtils.closeStream(in);
}
} else {
LOGGER.info("[" + getName() + "] ignoring message type "
+ event.getRootNamespace() + ":" + event.getRootElement());
LOGGER.info("[" + getName() + "] message content: "
+ event.getMessage());
}
}
public void configure(Config config) throws Exception {
super.configure(config);
// configure eids client
client = new EIDSClient();
client.addListener(this);
String serverHost = config.getProperty(EIDS_SERVER_HOST_PROPERTY,
EIDSClient.DEFAULT_SERVER_HOST);
LOGGER.config("[" + getName() + "] EIDS server host is '" + serverHost
+ "'");
client.setServerHost(serverHost);
Integer serverPort = Integer.valueOf(config.getProperty(
EIDS_SERVER_PORT,
Integer.toString(EIDSClient.DEFAULT_SERVER_PORT)));
LOGGER.config("[" + getName() + "] EIDS server port is '" + serverPort
+ "'");
client.setServerPort(serverPort);
String alternateServers = config
.getProperty(EIDS_ALTERNATE_SERVERS, "");
LOGGER.config("[" + getName() + "] EIDS alternate servers '"
+ alternateServers + "'");
client.setAlternateServersList(alternateServers);
String trackingFile = config.getProperty(EIDS_TRACKING_FILE);
if (trackingFile != null) {
LOGGER.config("[" + getName() + "] EIDS tracking file is '"
+ trackingFile + "'");
client.setTrackingFileName(trackingFile);
}
String debug = config.getProperty(EIDS_DEBUG);
if (debug != null) {
LOGGER.config("[" + getName() + "] EIDS debug mode = '" + debug
+ "'");
client.setDebug(Boolean.parseBoolean(debug));
}
String maxEventAgeString = config.getProperty(EIDS_MAX_EVENT_AGE);
if (maxEventAgeString != null) {
LOGGER.config("[" + getName() + "] EIDS max event age is " + maxEventAgeString + " days");
client.setMaxServerEventAgeDays(Double.parseDouble(maxEventAgeString));
}
}
public void shutdown() throws Exception {
client.shutdown();
super.shutdown();
}
public void startup() throws Exception {
super.startup();
if (client == null) {
throw new ConfigurationException("[" + getName()
+ "] EIDS client is not properly configured");
}
client.startup();
}
/** @return EIDSClient */
public EIDSClient getClient() {
return client;
}
/** @param client set EIDSClient */
public void setClient(EIDSClient client) {
this.client = client;
}
}