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