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 "";
		}
	}
}