QWEmbeddedMsgProcessor.java
/*
* EIDSMsgProcessor
*/
package gov.usgs.earthquake.eidsutil;
import com.isti.quakewatch.message.MsgProcessorInterface;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
/**
* Adapts the ISTI MsgProcessorInterface for EIDSClient. When the EIDSClient
* receives a message, the processDataMessage method is invoked.
*
* @see EIDSClient
*/
class QWEmbeddedMsgProcessor implements MsgProcessorInterface {
/** The client to notify when messages are available. */
private QWEmbeddedClient client;
/**
* Construct a new EIDSMsgProcessor.
*
* @param client the client that uses this processor.
*/
public QWEmbeddedMsgProcessor(final QWEmbeddedClient client) {
this.client = client;
}
/**
* Convert QWmessages to QWMsgRecords. Override the notifyMessage method to
* further process messages before sending to listeners.
*
* @param qwMsgElement The "QWmessage" element.
* @param dataMsgElement The "DataMessage" element.
* @param xmlMsgStr the XML text message string.
* @param requestedFlag true to indicate the the message was "requested" (and
* that it should not be processed as a "real-time"
* message).
* @param msgNumObj a 'Long' object holding the message number for the
* message, or null if a message number is not available.
* @param timeGenObj a 'Date' object holding the time-generated value for
* the message, or null if a time-generated value is not
* available.
*/
public void processDataMessage(Element qwMsgElement, Element dataMsgElement, String xmlMsgStr, boolean requestedFlag,
Long msgNumObj, Date timeGenObj) {
// extract unique message id
String fdrSourceHost = getAttribute(qwMsgElement, "FdrSourceHost");
Long fdrSourceMsgNum = Long.valueOf(getAttribute(qwMsgElement, "FdrSourceMsgNum"));
Element root = (Element) dataMsgElement.getChildren().get(0);
String rootElement = root.getName();
String rootNamespace = root.getNamespaceURI();
client.onEIDSMessage(new EIDSMessageEvent(client, msgNumObj, timeGenObj, fdrSourceHost, fdrSourceMsgNum,
rootNamespace, rootElement, getXML(root)));
}
/**
* Extract a JDOM attribute value.
*
* @param element a JDOM element
* @param name the attribute name
* @return the attribute value, or null if not present.
*/
public String getAttribute(final Element element, final String name) {
Attribute attribute = element.getAttribute(name);
String value = null;
if (attribute != null) {
value = attribute.getValue();
}
return value;
}
/**
* Serialize an element to an outputstream.
*
* @param element element to serialize.
* @param out outputstream where serialized element is written.s
*/
public static void writeXML(final Element element, final OutputStream out) {
try {
Document doc = new Document((Element) element.clone());
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, out);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Serialize an element into a String.
*
* @param element element to serialize.
*/
public static String getXML(final Element element) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
writeXML(element, baos);
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}