EventAddonParser.java

/*
 * EventAddonProductParser
 */
package gov.usgs.earthquake.eids;

import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import gov.usgs.ansseqmsg.Action;
import gov.usgs.ansseqmsg.Comment;
import gov.usgs.ansseqmsg.EQMessage;
import gov.usgs.ansseqmsg.Event;
import gov.usgs.ansseqmsg.ProductLink;
import gov.usgs.earthquake.eidsutil.EIDSMessageEvent;
import gov.usgs.util.SAXAdapter;
import gov.usgs.util.XmlUtils;

/**
 * Parser for event addon messages.
 *
 * Maps these messages into an EQMessage with a
 * product link.
 */
public class EventAddonParser extends SAXAdapter {

	/** Date format used in event addon message. */
	public static final SimpleDateFormat ADDON_DATE_FORMAT = new SimpleDateFormat(
			"yyyy/MM/dd_HH:mm:ss");

	/** The parsed addon object. */
	private EventAddon addon;

	/**
	 * Takes a EIDSMessage event and returns the EQMessage
	 * @param event EIDSMessageEvent to parse
	 * @return an EQmessage
	 * @throws Exception if error occurs
	 */
	public EQMessage parseMessage(EIDSMessageEvent event) throws Exception {
		// create a parser object for this message
		EventAddonParser parser = new EventAddonParser();

		try {
			// parse the message using the parser
			XmlUtils.parse(event.getMessage(), parser);
			// get the parsed addon
			EventAddon addon = parser.getAddon();
			// convert the parsed addon to an EQMessage
			return addon.getEQMessage();
		} catch (SAXException e) {
			if (!(e.getCause() instanceof ParseException)) {
				throw e;
			}
		}

		return null;
	}

	/**
	 * Data structure for event addon message. Also performs mapping onto
	 * EQMessage,Event, and ProductLink or Comment elements.
	 */
	public static class EventAddon {

		/** fileName */
		public String fileName;
		/** Submitter */
		public String submitter;
		/** Submit time */
		public Date submitTime;
		/** email */
		public String email;
		/** event id */
		public String eventid;
		/** type */
		public String type;
		/** version */
		public String version;
		/** action */
		public String action;
		/** description */
		public String description;
		/** link */
		public String link;
		/** text */
		public String text;

		/** Constructor */
		public EventAddon() {
		}

		/**
		 * Parse eventaddon xml into a ProductLink.
		 *
		 * @return null, if there is no link.
		 */
		public ProductLink getProductLink() {
			if (this.link == null) {
				return null;
			}

			Action plAction = Action.UPDATE;
			if (action.equalsIgnoreCase("DEL")) {
				plAction = Action.DELETE;
			}

			ProductLink link = new ProductLink();
			link.setSourceKey(submitter);
			link.setTypeKey("LinkURL");
			link.setAction(plAction);
			link.setCode(type);
			link.setLink(this.link);
			link.setNote(text);
			link.setVersion(version);

			return link;
		}

		/**
		 * Parse eventaddon xml into a Comment.
		 *
		 * @return null, if there is a link.
		 */
		public Comment getComment() {
			if (this.link != null) {
				return null;
			}

			Action cAction = Action.UPDATE;
			if (action.equalsIgnoreCase("DEL")) {
				cAction = Action.DELETE;
			}

			Comment comment = new Comment();
			comment.setSourceKey(submitter);
			comment.setTypeKey(type);
			comment.setAction(cAction);
			comment.setText(text);
			comment.setVersion(version);

			return comment;
		}

		/** @return event */
		public Event getEvent() {
			Event event = new Event();
			event.setDataSource(eventid.substring(0, 2));
			event.setEventID(eventid.substring(2));

			ProductLink link = getProductLink();
			if (link != null) {
				event.getProductLink().add(getProductLink());
			} else {
				Comment comment = getComment();
				event.getComment().add(comment);
			}

			return event;
		}

		/** @return EQMessage */
		public EQMessage getEQMessage() {
			EQMessage message = new EQMessage();
			message.setSent(submitTime);
			message.setSource(submitter);
			message.getEvent().add(getEvent());
			return message;
		}
	}

	/**
	 * Get parsed addon.
	 *
	 * @return parsed addon, or null if nothing parsed.
	 */
	public EventAddon getAddon() {
		return addon;
	}

	/**
	 * SAXAdapter start element handler.
	 *
	 * @param uri
	 *            element uri.
	 * @param localName
	 *            element localName.
	 * @param qName
	 *            element qName.
	 * @param attributes
	 *            element attributes.
	 * @throws SAXException
	 *             if there is an error.
	 */
	public void onStartElement(final String uri, final String localName,
			final String qName, final Attributes attributes)
			throws SAXException {

		if (localName.equals("eventaddon")) {
			addon = new EventAddon();
		} else if (localName.equals("file")) {
			addon.fileName = attributes.getValue("name");
		}
	}

	/**
	 * SAXAdapter end element handler. Content only includes characters that
	 * were read from this element, NOT any characters from child elements.
	 *
	 * @param uri
	 *            element uri.
	 * @param localName
	 *            element localName.
	 * @param qName
	 *            element qName.
	 * @param content
	 *            element content.
	 * @throws SAXException
	 *             if onEndElement throws a SAXException.
	 */
	public void onEndElement(final String uri, final String localName,
			final String qName, final String content) throws SAXException {

		if (localName.equals("submitter")) {
			addon.submitter = content;
		} else if (localName.equals("email")) {
			addon.email = content;
		} else if (localName.equals("eventid")) {
			addon.eventid = content;
		} else if (localName.equals("type")) {
			addon.type = content;
		} else if (localName.equals("version")) {
			addon.version = content;
		} else if (localName.equals("action")) {
			addon.action = content;
		} else if (localName.equals("description")) {
			addon.description = content;
		} else if (localName.equals("link")) {
			addon.link = content;
		} else if (localName.equals("text")) {
			addon.text = content;
		} else if (localName.equals("submit_time")) {
			try {
				addon.submitTime = ADDON_DATE_FORMAT.parse(content);
			} catch (ParseException e) {
				throw new SAXException(e);
			}
		}
	}

}