SearchRequestParser.java

package gov.usgs.earthquake.indexer;

import java.math.BigDecimal;

import gov.usgs.earthquake.product.ProductId;
import gov.usgs.earthquake.product.io.XmlProductHandler;
import gov.usgs.util.XmlUtils;

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

/**
 * Parser for SearchXML request.
 */
public class SearchRequestParser extends DefaultHandler {

  /** The request being parsed. */
  private SearchRequest searchRequest;

  /** The query being parsed. */
  private SearchQuery searchQuery;

  /** Empty constructor */
  public SearchRequestParser() {
  }

  /** @return searchRequest */
  public SearchRequest getSearchRequest() {
    return searchRequest;
  }

  @Override
  public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    if (SearchXML.INDEXER_XMLNS.equals(uri)) {
      if (SearchXML.REQUEST_ELEMENT.equals(localName)) {
        searchRequest = new SearchRequest();
      } else if (SearchXML.PRODUCT_SUMMARY_ELEMENT.equals(localName)) {
        if (searchQuery == null) {
          throw new SAXException("Expected searchQuery element around productSummary element");
        } else {
          ProductId id = ProductId.parse(XmlUtils.getAttribute(attributes, uri, SearchXML.ID_ATTRIBUTE));
          if (id != null) {
            searchQuery.getProductIndexQuery().getProductIds().add(id);
          } else {
            throw new SAXException("Expected id attribute on productSummary element");
          }
        }
      } else if (SearchXML.QUERY_ELEMENT.equals(localName)) {
        String method = XmlUtils.getAttribute(attributes, SearchXML.INDEXER_XMLNS, SearchXML.METHOD_ATTRIBUTE);
        String value;

        ProductIndexQuery query = new ProductIndexQuery();
        value = XmlUtils.getAttribute(attributes, uri, SearchXML.EVENT_SOURCE_ATTRIBUTE);
        query.setEventSource(value);

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.EVENT_SOURCE_CODE_ATTRIBUTE);
        query.setEventSourceCode(value);

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_EVENT_TIME_ATTRIBUTE);
        if (value != null) {
          query.setMinEventTime(XmlUtils.getDate(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_EVENT_TIME_ATTRIBUTE);
        if (value != null) {
          query.setMaxEventTime(XmlUtils.getDate(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_EVENT_LATITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMinEventLatitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_EVENT_LATITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMaxEventLatitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_EVENT_LONGITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMinEventLongitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_EVENT_LONGITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMaxEventLongitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_EVENT_DEPTH_ATTRIBUTE);
        if (value != null) {
          query.setMinEventDepth(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_EVENT_DEPTH_ATTRIBUTE);
        if (value != null) {
          query.setMaxEventDepth(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_EVENT_MAGNITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMinEventMagnitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_EVENT_MAGNITUDE_ATTRIBUTE);
        if (value != null) {
          query.setMaxEventMagnitude(new BigDecimal(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MIN_PRODUCT_UPDATE_TIME_ATTRIBUTE);
        if (value != null) {
          query.setMinProductUpdateTime(XmlUtils.getDate(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.MAX_PRODUCT_UPDATE_TIME_ATTRIBUTE);
        if (value != null) {
          query.setMaxProductUpdateTime(XmlUtils.getDate(value));
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.PRODUCT_SOURCE_ATTRIBUTE);
        if (value != null) {
          query.setProductSource(value);
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.PRODUCT_TYPE_ATTRIBUTE);
        if (value != null) {
          query.setProductType(value);
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.PRODUCT_CODE_ATTRIBUTE);
        if (value != null) {
          query.setProductCode(value);
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.PRODUCT_VERSION_ATTRIBUTE);
        if (value != null) {
          query.setProductVersion(value);
        }

        value = XmlUtils.getAttribute(attributes, uri, SearchXML.PRODUCT_STATUS_ATTRIBUTE);
        if (value != null) {
          query.setProductStatus(value);
        }

        searchQuery = SearchQuery.getSearchQuery(SearchMethod.fromXmlMethodName(method), query);
      }
    } else if (XmlProductHandler.PRODUCT_XML_NAMESPACE.equals(uri)) {
      // Possible inclusion of properties in the future
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName) throws SAXException {
    if (SearchXML.INDEXER_XMLNS.equals(uri)) {
      if (SearchXML.REQUEST_ELEMENT.equals(localName)) {
        // search request, done
      } else if (SearchXML.QUERY_ELEMENT.equals(localName)) {
        searchRequest.addQuery(searchQuery);
        searchQuery = null;
      }
    }
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
  }

}