EIDSNotificationSender.java
/*
*
*/
package gov.usgs.earthquake.distribution;
import gov.usgs.earthquake.eidsutil.CorbaSender;
import gov.usgs.util.Config;
import gov.usgs.util.FileUtils;
import java.io.File;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
public class EIDSNotificationSender extends DefaultNotificationSender {
/** Logging object. */
private static final Logger LOGGER = Logger
.getLogger(EIDSNotificationSender.class.getName());
/** Property referencing directory where notifications are "sent". */
public static final String EIDS_POLLDIR_PROPERTY = "serverPolldir";
/** Default directory where notifications are sent. */
public static final String EIDS_DEFAULT_POLLDIR = "polldir";
/** Directory for Polldir send, in case CORBA send fails. */
private File serverPolldir = null;
/** CORBA sending object. */
private CorbaSender corbaSender = null;
@Override
protected void sendNotification(final Notification notification) throws Exception {
boolean sent = false;
String message = URLNotificationXMLConverter.toXML((URLNotification) notification);
if (serverHost != null && serverPort != null) {
try {
if (corbaSender == null) {
// try to establish a connection
corbaSender = new CorbaSender(serverHost, serverPort);
}
sent = corbaSender.sendMessage(message);
if (sent) {
LOGGER.fine("[" + getName()
+ "] sent notification to EIDS via CORBA");
}
} catch (Exception e) {
LOGGER.log(Level.WARNING, "[" + getName()
+ "] unable to send notification using CORBA", e);
}
}
if (!sent) {
// when unable to send directly to corba service
// send notification via EIDS polldir
// create a uniqueish filename
String filename = "out_" + new Date().getTime();
File outFile = new File(serverPolldir, filename + ".xml");
while (outFile.exists()) {
filename = filename += "_1";
outFile = new File(serverPolldir, filename + ".xml");
}
// is this atomic enough?, write then move may be better
FileUtils.writeFile(outFile, message.getBytes());
LOGGER.log(Level.INFO, "[" + getName()
+ "] sent notification to EIDS via " + outFile.getPath());
}
}
public void configure(Config config) throws Exception {
// let default notification sender configure itself
super.configure(config);
serverPolldir = new File(config.getProperty(EIDS_POLLDIR_PROPERTY,
EIDS_DEFAULT_POLLDIR));
LOGGER.config("[" + getName() + "] EIDS server polldir '"
+ serverPolldir + "'");
}
@Override
public void shutdown() throws Exception {
super.shutdown();
if (corbaSender != null) {
try {
corbaSender.destroy();
} catch (Exception e) {
// ignore
}
corbaSender = null;
}
}
@Override
public void startup() throws Exception {
if (serverHost != null && serverPort != null) {
try {
corbaSender = new CorbaSender(serverHost, serverPort);
} catch (org.omg.CORBA.COMM_FAILURE e) {
LOGGER.warning("[" + getName()
+ "] unable to connect to EIDS using CORBA");
corbaSender = null;
}
}
super.startup();
}
/** @return serverPolldir */
public File getServerPolldir() {
return serverPolldir;
}
/** @param serverPolldir file to set */
public void setServerPolldir(File serverPolldir) {
this.serverPolldir = serverPolldir;
}
}