SearchXML.java

  1. package gov.usgs.earthquake.indexer;

  2. import gov.usgs.earthquake.distribution.FileProductStorage;
  3. import gov.usgs.earthquake.product.Content;
  4. import gov.usgs.earthquake.product.Product;
  5. import gov.usgs.earthquake.product.ProductId;
  6. import gov.usgs.earthquake.product.io.XmlProductHandler;
  7. import gov.usgs.util.XmlUtils;

  8. import java.io.InputStream;
  9. import java.io.OutputStream;
  10. import java.io.OutputStreamWriter;
  11. import java.net.URI;
  12. import java.util.Iterator;
  13. import java.util.List;
  14. import java.util.Map;

  15. /**
  16.  * Formatter for Search XML.
  17.  */
  18. public class SearchXML {

  19.     /** Location of Indexer on distribution site */
  20.     public static final String INDEXER_XMLNS = "http://earthquake.usgs.gov/distribution/indexer";

  21.     /** Element for searchRequests */
  22.     public static final String REQUEST_ELEMENT = "searchrequest";
  23.     /** Element for searchResponses */
  24.     public static final String RESPONSE_ELEMENT = "searchresponse";

  25.     /** Element for results */
  26.     public static final String RESULT_ELEMENT = "result";
  27.     /** Element for queries */
  28.     public static final String QUERY_ELEMENT = "query";
  29.     /** Element for events */
  30.     public static final String EVENT_ELEMENT = "event";
  31.     /** Element for errors */
  32.     public static final String ERROR_ELEMENT = "error";

  33.     /** Attribute for methods */
  34.     public static final String METHOD_ATTRIBUTE = "method";

  35.     /** Attribute for event source */
  36.     public static final String EVENT_SOURCE_ATTRIBUTE = "eventSource";
  37.     /** Attribute for event source code */
  38.     public static final String EVENT_SOURCE_CODE_ATTRIBUTE = "eventSourceCode";
  39.     /** Attribute for min event time */
  40.     public static final String MIN_EVENT_TIME_ATTRIBUTE = "minEventTime";
  41.     /** Attribute for max event time */
  42.     public static final String MAX_EVENT_TIME_ATTRIBUTE = "maxEventTime";
  43.     /** Attribute for min event latitude*/
  44.     public static final String MIN_EVENT_LATITUDE_ATTRIBUTE = "minEventLatitude";
  45.     /** Attribute for max event latitude */
  46.     public static final String MAX_EVENT_LATITUDE_ATTRIBUTE = "maxEventLatitude";
  47.     /** Attribute for min event longitude */
  48.     public static final String MIN_EVENT_LONGITUDE_ATTRIBUTE = "minEventLongitude";
  49.     /** Attribute for max event longitude */
  50.     public static final String MAX_EVENT_LONGITUDE_ATTRIBUTE = "maxEventLongitude";
  51.     /** Attribute for min event depth */
  52.     public static final String MIN_EVENT_DEPTH_ATTRIBUTE = "minEventDepth";
  53.     /** Attribute for max event depth*/
  54.     public static final String MAX_EVENT_DEPTH_ATTRIBUTE = "maxEventDepth";
  55.     /** Attribute for min event magnitude */
  56.     public static final String MIN_EVENT_MAGNITUDE_ATTRIBUTE = "minEventMagnitude";
  57.     /** Attribute for max event magnitude */
  58.     public static final String MAX_EVENT_MAGNITUDE_ATTRIBUTE = "maxEventMagnitude";
  59.     /** Attribute for min product update time */
  60.     public static final String MIN_PRODUCT_UPDATE_TIME_ATTRIBUTE = "minProductUpdateTime";
  61.     /** Attribute for max product update time */
  62.     public static final String MAX_PRODUCT_UPDATE_TIME_ATTRIBUTE = "maxProductUpdateTime";
  63.     /** Attribute for product source */
  64.     public static final String PRODUCT_SOURCE_ATTRIBUTE = "productSource";
  65.     /** Attribute for product type */
  66.     public static final String PRODUCT_TYPE_ATTRIBUTE = "productType";
  67.     /** Attribute for product code */
  68.     public static final String PRODUCT_CODE_ATTRIBUTE = "productCode";
  69.     /** Attribute for product version */
  70.     public static final String PRODUCT_VERSION_ATTRIBUTE = "productVersion";
  71.     /** Attribute for product Status */
  72.     public static final String PRODUCT_STATUS_ATTRIBUTE = "productStatus";

  73.     /** Element for event summary */
  74.     public static final String EVENT_SUMMARY_ELEMENT = "eventSummary";
  75.     /** Element for product summary */
  76.     public static final String PRODUCT_SUMMARY_ELEMENT = "productSummary";

  77.     /** Attribute for id */
  78.     public static final String ID_ATTRIBUTE = "id";
  79.     /** Attribute for update time */
  80.     public static final String UPDATE_TIME_ATTRIBUTE = "updateTime";
  81.     /** Attribute for status */
  82.     public static final String STATUS_ATTRIBUTE = "status";
  83.     /** Attribute for source */
  84.     public static final String SOURCE_ATTRIBUTE = "source";
  85.     /** Attribute for source code */
  86.     public static final String SOURCE_CODE_ATTRIBUTE = "sourceCode";
  87.     /** Attribute for time */
  88.     public static final String TIME_ATTRIBUTE = "time";
  89.     /** Attribute for latitude */
  90.     public static final String LATITUDE_ATTRIBUTE = "latitude";
  91.     /** Attribute for longitude */
  92.     public static final String LONGITUDE_ATTRIBUTE = "longitude";
  93.     /** Attribute for depth */
  94.     public static final String DEPTH_ATTRIBUTE = "depth";
  95.     /** Attribute for magnitude */
  96.     public static final String MAGNITUDE_ATTRIBUTE = "magnitude";
  97.     /** Attribute for version */
  98.     public static final String VERSION_ATTRIBUTE = "version";
  99.     /** Attribute for preferred weight */
  100.     public static final String PREFERRED_WEIGHT_ATTRIBUTE = "preferredWeight";

  101.     /**
  102.      * Parse an input stream with xml to a SearchRequest object.
  103.      *
  104.      * @param in
  105.      *            the input stream containing xml.
  106.      * @return the parsed SearchRequest object.
  107.      * @throws Exception if error occurs
  108.      */
  109.     public static SearchRequest parseRequest(final InputStream in)
  110.             throws Exception {
  111.         SearchRequestParser parser = new SearchRequestParser();
  112.         XmlUtils.parse(in, parser);
  113.         return parser.getSearchRequest();
  114.     }

  115.     /**
  116.      * Parse an input stream with xml to a SearchResponse object.
  117.      *
  118.      * @param in
  119.      *            the input stream containing xml.
  120.      * @param storage
  121.      *            the storage where received products are stored.
  122.      * @return the parsed SearchResponse object.
  123.      * @throws Exception if error occurs
  124.      */
  125.     public static SearchResponse parseResponse(final InputStream in,
  126.             final FileProductStorage storage) throws Exception {
  127.         SearchResponseParser parser = new SearchResponseParser(storage);
  128.         XmlUtils.parse(in, parser);
  129.         return parser.getSearchResponse();
  130.     }

  131.     /**
  132.      * Convert a SearchRequest object to xml.
  133.      *
  134.      * @param request
  135.      *            the search request object to convert.
  136.      * @param out
  137.      *            the output stream where xml is written.
  138.      * @throws Exception if error occurs
  139.      */
  140.     public static void toXML(final SearchRequest request, final OutputStream out)
  141.             throws Exception {
  142.         OutputStreamWriter outStream = new OutputStreamWriter(out);
  143.         outStream.write("<?xml version=\"1.0\"?>");
  144.         outStream.write("<" + REQUEST_ELEMENT);
  145.         outStream.write(" xmlns=\"" + INDEXER_XMLNS + "\"");
  146.         outStream.write(">");
  147.         List<SearchQuery> queries = request.getQueries();
  148.         for (Iterator<SearchQuery> queryIterator = queries.iterator(); queryIterator
  149.                 .hasNext();) {
  150.             SearchQuery query = queryIterator.next();
  151.             outStream.write(getQueryXMLString(query));
  152.         }
  153.         outStream.write("</" + REQUEST_ELEMENT + ">");
  154.         outStream.flush();
  155.     }

  156.     /**
  157.      * Convert a SearchResponse object to xml.
  158.      *
  159.      * @param response
  160.      *            the search response object to convert.
  161.      * @param out
  162.      *            the output stream where xml is written.
  163.      * @throws Exception if error occurs
  164.      */
  165.     public static void toXML(final SearchResponse response,
  166.             final OutputStream out) throws Exception {
  167.         OutputStreamWriter writer = new OutputStreamWriter(out);
  168.         writer.write("<?xml version=\"1.0\"?>");
  169.         writer.write("<" + RESPONSE_ELEMENT);
  170.         writer.write(" xmlns=\"" + INDEXER_XMLNS + "\"");
  171.         writer.write(" xmlns:product=\""
  172.                 + XmlProductHandler.PRODUCT_XML_NAMESPACE + "\"");
  173.         writer.write(">");
  174.         List<SearchQuery> results = response.getResults();
  175.         for (Iterator<SearchQuery> resultsIterator = results.iterator(); resultsIterator
  176.                 .hasNext();) {
  177.             SearchQuery result = resultsIterator.next();
  178.             writer.write("<" + RESULT_ELEMENT);
  179.             writer.write(" " + METHOD_ATTRIBUTE + "=\""
  180.                     + result.getType().getXmlMethodName() + "\"");
  181.             writer.write(">");
  182.             writer.write(getQueryXMLString(result));

  183.             if (result.getType() == SearchMethod.EVENT_DETAIL) {
  184.                 EventDetailQuery edResult = (EventDetailQuery) result;
  185.                 List<Event> events = edResult.getResult();
  186.                 for (Iterator<Event> eventIter = events.iterator(); eventIter
  187.                         .hasNext();) {
  188.                     Event event = eventIter.next();
  189.                     writer.write("<" + EVENT_ELEMENT);
  190.                     if (event.getSource() != null)
  191.                         writer.write(" " + SOURCE_ATTRIBUTE + "=\""
  192.                                 + event.getSource() + "\"");
  193.                     if (event.getSourceCode() != null)
  194.                         writer.write(" " + SOURCE_CODE_ATTRIBUTE + "=\""
  195.                                 + event.getSourceCode() + "\"");
  196.                     if (event.getTime() != null)
  197.                         writer.write(" " + TIME_ATTRIBUTE + "=\""
  198.                                 + XmlUtils.formatDate(event.getTime()) + "\"");
  199.                     if (event.getLatitude() != null)
  200.                         writer.write(" " + LATITUDE_ATTRIBUTE + "=\""
  201.                                 + event.getLatitude().toString() + "\"");
  202.                     if (event.getLongitude() != null)
  203.                         writer.write(" " + LONGITUDE_ATTRIBUTE + "=\""
  204.                                 + event.getLongitude().toString() + "\"");
  205.                     if (event.getDepth() != null)
  206.                         writer.write(" " + DEPTH_ATTRIBUTE + "=\""
  207.                                 + event.getDepth().toString() + "\"");
  208.                     if (event.getMagnitude() != null)
  209.                         writer.write(" " + MAGNITUDE_ATTRIBUTE + "=\""
  210.                                 + event.getMagnitude().toString() + "\"");
  211.                     writer.write(">");
  212.                     if (!event.getProducts().isEmpty()) {
  213.                         Map<String, List<ProductSummary>> products = event
  214.                                 .getProducts();
  215.                         for (Iterator<String> prodIter = products.keySet()
  216.                                 .iterator(); prodIter.hasNext();) {
  217.                             String prodType = prodIter.next();
  218.                             for (Iterator<ProductSummary> summaryIter = products
  219.                                     .get(prodType).iterator(); summaryIter
  220.                                     .hasNext();) {
  221.                                 writer.write(getProductSummaryXmlString(summaryIter
  222.                                         .next()));
  223.                             }
  224.                         }
  225.                     }
  226.                     writer.write("</" + EVENT_ELEMENT + ">");
  227.                 }
  228.             } else if (result.getType() == SearchMethod.EVENTS_SUMMARY) {
  229.                 EventsSummaryQuery esResult = (EventsSummaryQuery) result;
  230.                 List<EventSummary> summaries = esResult.getResult();
  231.                 for (Iterator<EventSummary> summaryIter = summaries.iterator(); summaryIter
  232.                         .hasNext();) {
  233.                     writer.write("<" + EVENT_SUMMARY_ELEMENT);
  234.                     EventSummary summary = summaryIter.next();
  235.                     if (summary.getSource() != null)
  236.                         writer.write(" " + SOURCE_ATTRIBUTE + "=\""
  237.                                 + summary.getSource() + "\"");
  238.                     if (summary.getSourceCode() != null)
  239.                         writer.write(" " + SOURCE_CODE_ATTRIBUTE + "=\""
  240.                                 + summary.getSourceCode() + "\"");
  241.                     if (summary.getTime() != null)
  242.                         writer.write(" " + TIME_ATTRIBUTE + "=\""
  243.                                 + XmlUtils.formatDate(summary.getTime()) + "\"");
  244.                     if (summary.getLatitude() != null)
  245.                         writer.write(" " + LATITUDE_ATTRIBUTE + "=\""
  246.                                 + summary.getLatitude().toString() + "\"");
  247.                     if (summary.getLongitude() != null)
  248.                         writer.write(" " + LONGITUDE_ATTRIBUTE + "=\""
  249.                                 + summary.getLongitude().toString() + "\"");
  250.                     if (summary.getDepth() != null)
  251.                         writer.write(" " + DEPTH_ATTRIBUTE + "=\""
  252.                                 + summary.getDepth().toString() + "\"");
  253.                     if (summary.getMagnitude() != null)
  254.                         writer.write(" " + MAGNITUDE_ATTRIBUTE + "=\""
  255.                                 + summary.getMagnitude().toString() + "\"");
  256.                     writer.write(">");
  257.                     if (!summary.getProperties().isEmpty()) {
  258.                         Map<String, String> properties = summary
  259.                                 .getProperties();
  260.                         for (Iterator<String> propIter = properties.keySet()
  261.                                 .iterator(); propIter.hasNext();) {
  262.                             String property = propIter.next();
  263.                             String value = properties.get(property);
  264.                             writer.write("<product:"
  265.                                     + XmlProductHandler.PROPERTY_ELEMENT);
  266.                             writer.write(" "
  267.                                     + XmlProductHandler.PROPERTY_ATTRIBUTE_NAME
  268.                                     + "=\"" + property + "\"");
  269.                             writer.write(" "
  270.                                     + XmlProductHandler.PROPERTY_ATTRIBUTE_VALUE
  271.                                     + "=\"" + value + "\"");
  272.                             writer.write(" />");
  273.                         }
  274.                     }
  275.                     writer.write("</" + EVENT_SUMMARY_ELEMENT + ">");
  276.                 }
  277.             } else if (result.getType() == SearchMethod.PRODUCT_DETAIL) {
  278.                 ProductDetailQuery pdResult = (ProductDetailQuery) result;
  279.                 List<Product> products = pdResult.getResult();
  280.                 writer.flush();
  281.                 for (Iterator<Product> prodIter = products.iterator(); prodIter
  282.                         .hasNext();) {
  283.                     Product product = prodIter.next();
  284.                     XmlProductHandler handler = new XmlProductHandler(out, false);
  285.                     handler.onBeginProduct(product.getId(),
  286.                             product.getStatus(), product.getTrackerURL());
  287.                     Map<String, String> properties = product.getProperties();
  288.                     for (Iterator<String> propIter = properties.keySet()
  289.                             .iterator(); propIter.hasNext();) {
  290.                         String name = propIter.next();
  291.                         handler.onProperty(product.getId(), name,
  292.                                 properties.get(name));
  293.                     }
  294.                     Map<String, List<URI>> links = product.getLinks();
  295.                     for (Iterator<String> relIter = links.keySet().iterator(); relIter
  296.                             .hasNext();) {
  297.                         String relation = relIter.next();
  298.                         for (Iterator<URI> uriIter = links.get(relation)
  299.                                 .iterator(); uriIter.hasNext();) {
  300.                             URI href = uriIter.next();
  301.                             handler.onLink(product.getId(), relation, href);
  302.                         }
  303.                     }
  304.                     Map<String, Content> contents = product.getContents();
  305.                     for (Iterator<String> pathIter = contents.keySet()
  306.                             .iterator(); pathIter.hasNext();) {
  307.                         String path = pathIter.next();
  308.                         handler.onContent(product.getId(), path,
  309.                                 contents.get(path));
  310.                     }
  311.                     if (product.getSignature() != null)
  312.                         handler.onSignature(product.getId(),
  313.                                 product.getSignature());
  314.                     handler.onEndProduct(product.getId());
  315.                 }
  316.             } else if (result.getType() == SearchMethod.PRODUCTS_SUMMARY) {
  317.                 ProductsSummaryQuery psQuery = (ProductsSummaryQuery) result;
  318.                 List<ProductSummary> summaries = psQuery.getResult();
  319.                 for (Iterator<ProductSummary> summaryIter = summaries
  320.                         .iterator(); summaryIter.hasNext();) {
  321.                     writer.write(getProductSummaryXmlString(summaryIter.next()));
  322.                 }
  323.             }

  324.             writer.write("</" + RESULT_ELEMENT + ">");
  325.         }
  326.         writer.write("</" + RESPONSE_ELEMENT + ">");
  327.         writer.flush();
  328.     }

  329.     /**
  330.      * Private  helper method to convert query elements into XML
  331.      * @param query
  332.      *      the query element to convert to xml
  333.      * @return an xml string representing the query object
  334.      */
  335.     private static String getQueryXMLString(SearchQuery query) {
  336.         StringBuffer queryXmlString = new StringBuffer();
  337.         queryXmlString.append("<" + QUERY_ELEMENT);
  338.         queryXmlString.append(" " + METHOD_ATTRIBUTE + "=\"");
  339.         queryXmlString.append(query.getType().getXmlMethodName());
  340.         queryXmlString.append("\"");
  341.         ProductIndexQuery prodIndexQuery = query.getProductIndexQuery();
  342.         if (prodIndexQuery.getEventSource() != null)
  343.             queryXmlString.append(" " + EVENT_SOURCE_ATTRIBUTE + "=\""
  344.                     + prodIndexQuery.getEventSource() + "\"");
  345.         if (prodIndexQuery.getEventSourceCode() != null)
  346.             queryXmlString.append(" " + EVENT_SOURCE_CODE_ATTRIBUTE + "=\""
  347.                     + prodIndexQuery.getEventSourceCode() + "\"");
  348.         if (prodIndexQuery.getMinEventTime() != null)
  349.             queryXmlString.append(" " + MIN_EVENT_TIME_ATTRIBUTE + "=\""
  350.                     + XmlUtils.formatDate(prodIndexQuery.getMinEventTime())
  351.                     + "\"");
  352.         if (prodIndexQuery.getMaxEventTime() != null)
  353.             queryXmlString.append(" " + MAX_EVENT_TIME_ATTRIBUTE + "=\""
  354.                     + XmlUtils.formatDate(prodIndexQuery.getMaxEventTime())
  355.                     + "\"");
  356.         if (prodIndexQuery.getMinEventLatitude() != null)
  357.             queryXmlString.append(" " + MIN_EVENT_LATITUDE_ATTRIBUTE + "=\""
  358.                     + prodIndexQuery.getMinEventLatitude() + "\"");
  359.         if (prodIndexQuery.getMaxEventLatitude() != null)
  360.             queryXmlString.append(" " + MAX_EVENT_LATITUDE_ATTRIBUTE + "=\""
  361.                     + prodIndexQuery.getMaxEventLatitude() + "\"");
  362.         if (prodIndexQuery.getMinEventLongitude() != null)
  363.             queryXmlString.append(" " + MIN_EVENT_LONGITUDE_ATTRIBUTE + "=\""
  364.                     + prodIndexQuery.getMinEventLongitude() + "\"");
  365.         if (prodIndexQuery.getMaxEventLongitude() != null)
  366.             queryXmlString.append(" " + MAX_EVENT_LONGITUDE_ATTRIBUTE + "=\""
  367.                     + prodIndexQuery.getMaxEventLongitude() + "\"");
  368.         if (prodIndexQuery.getMinEventDepth() != null)
  369.             queryXmlString.append(" " + MIN_EVENT_DEPTH_ATTRIBUTE + "=\""
  370.                     + prodIndexQuery.getMinEventDepth() + "\"");
  371.         if (prodIndexQuery.getMaxEventDepth() != null)
  372.             queryXmlString.append(" " + MAX_EVENT_DEPTH_ATTRIBUTE + "=\""
  373.                     + prodIndexQuery.getMaxEventDepth() + "\"");
  374.         if (prodIndexQuery.getMinEventMagnitude() != null)
  375.             queryXmlString.append(" " + MIN_EVENT_MAGNITUDE_ATTRIBUTE + "=\""
  376.                     + prodIndexQuery.getMinEventMagnitude() + "\"");
  377.         if (prodIndexQuery.getMaxEventMagnitude() != null)
  378.             queryXmlString.append(" " + MAX_EVENT_MAGNITUDE_ATTRIBUTE + "=\""
  379.                     + prodIndexQuery.getMaxEventMagnitude() + "\"");
  380.         if (prodIndexQuery.getMinProductUpdateTime() != null)
  381.             queryXmlString.append(" "
  382.                     + MIN_PRODUCT_UPDATE_TIME_ATTRIBUTE
  383.                     + "=\""
  384.                     + XmlUtils.formatDate(prodIndexQuery
  385.                             .getMinProductUpdateTime()) + "\"");
  386.         if (prodIndexQuery.getMaxProductUpdateTime() != null)
  387.             queryXmlString.append(" "
  388.                     + MAX_PRODUCT_UPDATE_TIME_ATTRIBUTE
  389.                     + "=\""
  390.                     + XmlUtils.formatDate(prodIndexQuery
  391.                             .getMaxProductUpdateTime()) + "\"");
  392.         if (prodIndexQuery.getProductSource() != null)
  393.             queryXmlString.append(" " + PRODUCT_SOURCE_ATTRIBUTE + "=\""
  394.                     + prodIndexQuery.getProductSource() + "\"");
  395.         if (prodIndexQuery.getProductType() != null)
  396.             queryXmlString.append(" " + PRODUCT_TYPE_ATTRIBUTE + "=\""
  397.                     + prodIndexQuery.getProductType() + "\"");
  398.         if (prodIndexQuery.getProductCode() != null)
  399.             queryXmlString.append(" " + PRODUCT_CODE_ATTRIBUTE + "=\""
  400.                     + prodIndexQuery.getProductCode() + "\"");
  401.         if (prodIndexQuery.getProductVersion() != null)
  402.             queryXmlString.append(" " + PRODUCT_VERSION_ATTRIBUTE + "=\""
  403.                     + prodIndexQuery.getProductVersion() + "\"");
  404.         if (prodIndexQuery.getProductStatus() != null)
  405.             queryXmlString.append(" " + PRODUCT_STATUS_ATTRIBUTE + "=\""
  406.                     + prodIndexQuery.getProductStatus() + "\"");

  407.         queryXmlString.append(">");

  408.         Iterator<ProductId> ids = prodIndexQuery.getProductIds().iterator();
  409.         while (ids.hasNext()) {
  410.             queryXmlString.append("<" + PRODUCT_SUMMARY_ELEMENT);
  411.             queryXmlString.append(" " + ID_ATTRIBUTE + "=\""
  412.                     + ids.next().toString() + "\"");
  413.             queryXmlString.append(" />");
  414.         }

  415.         queryXmlString.append("</" + QUERY_ELEMENT + ">");

  416.         return queryXmlString.toString();
  417.     }

  418.     /**
  419.      * Private  helper method to convert product summary elements into XML
  420.      * @param summary
  421.      *      the product summary element to convert to xml
  422.      * @return an xml string representing the product summary object
  423.      */
  424.     private static String getProductSummaryXmlString(ProductSummary summary) {
  425.         String summaryXmlString = "";
  426.         summaryXmlString += "<" + PRODUCT_SUMMARY_ELEMENT;
  427.         if (summary.getId() != null)
  428.             summaryXmlString += " " + ID_ATTRIBUTE + "=\""
  429.                     + summary.getId().toString() + "\"";
  430.         if (summary.getId().getUpdateTime() != null)
  431.             summaryXmlString += " " + UPDATE_TIME_ATTRIBUTE + "=\""
  432.                     + XmlUtils.formatDate(summary.getId().getUpdateTime())
  433.                     + "\"";
  434.         if (summary.getStatus() != null)
  435.             summaryXmlString += " " + STATUS_ATTRIBUTE + "=\""
  436.                     + summary.getStatus() + "\"";
  437.         if (summary.getSource() != null)
  438.             summaryXmlString += " " + SOURCE_ATTRIBUTE + "=\""
  439.                     + summary.getSource() + "\"";
  440.         if (summary.getCode() != null)
  441.             summaryXmlString += " " + SOURCE_CODE_ATTRIBUTE + "=\"" +
  442.                     summary.getCode() + "\"";
  443.         if (summary.getEventTime() != null)
  444.             summaryXmlString += " " + TIME_ATTRIBUTE + "=\""
  445.                     + XmlUtils.formatDate(summary.getEventTime()) + "\"";
  446.         if (summary.getEventLatitude() != null)
  447.             summaryXmlString += " " + LATITUDE_ATTRIBUTE + "=\""
  448.                     + summary.getEventLatitude().toString() + "\"";
  449.         if (summary.getEventLongitude() != null)
  450.             summaryXmlString += " " + LONGITUDE_ATTRIBUTE + "=\""
  451.                     + summary.getEventLongitude().toString() + "\"";
  452.         if (summary.getEventDepth() != null)
  453.             summaryXmlString += " " + DEPTH_ATTRIBUTE + "=\""
  454.                     + summary.getEventDepth().toString() + "\"";
  455.         if (summary.getEventMagnitude() != null)
  456.             summaryXmlString += " " + MAGNITUDE_ATTRIBUTE + "=\""
  457.                     + summary.getEventMagnitude().toString() + "\"";
  458.         if (summary.getVersion() != null)
  459.             summaryXmlString += " " + VERSION_ATTRIBUTE + "=\""
  460.                     + summary.getVersion() + "\"";
  461.         summaryXmlString += " " + PREFERRED_WEIGHT_ATTRIBUTE + "=\""
  462.                 + summary.getPreferredWeight() + "\"";
  463.         summaryXmlString += ">";

  464.         Map<String, String> properties = summary.getProperties();
  465.         for (Iterator<String> propIter = properties.keySet().iterator(); propIter
  466.                 .hasNext();) {
  467.             String name = propIter.next();
  468.             String value = properties.get(name);
  469.             summaryXmlString += "<product:"
  470.                     + XmlProductHandler.PROPERTY_ELEMENT;
  471.             summaryXmlString += " " + XmlProductHandler.PROPERTY_ATTRIBUTE_NAME
  472.                     + "=\"" + name + "\"";
  473.             summaryXmlString += " "
  474.                     + XmlProductHandler.PROPERTY_ATTRIBUTE_VALUE + "=\""
  475.                     + value + "\"";
  476.             summaryXmlString += " />";
  477.         }

  478.         Map<String, List<URI>> links = summary.getLinks();
  479.         for (Iterator<String> linkIter = links.keySet().iterator(); linkIter
  480.                 .hasNext();) {
  481.             String relation = linkIter.next();
  482.             for (Iterator<URI> uriIter = links.get(relation).iterator(); uriIter
  483.                     .hasNext();) {
  484.                 URI href = uriIter.next();
  485.                 summaryXmlString += "<product:"
  486.                         + XmlProductHandler.LINK_ELEMENT;
  487.                 summaryXmlString += " "
  488.                         + XmlProductHandler.LINK_ATTRIBUTE_RELATION + "=\""
  489.                         + relation + "\"";
  490.                 summaryXmlString += " " + XmlProductHandler.LINK_ATTRIBUTE_HREF
  491.                         + "=\"" + href + "\"";
  492.                 summaryXmlString += " />";
  493.             }
  494.         }

  495.         summaryXmlString += "</" + PRODUCT_SUMMARY_ELEMENT + ">";
  496.         return summaryXmlString;
  497.     }

  498. }