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