SearchCLI.java

  1. package gov.usgs.earthquake.indexer;

  2. import java.io.FileOutputStream;
  3. import java.io.OutputStream;
  4. import java.math.BigDecimal;
  5. import java.net.InetAddress;
  6. import java.util.logging.Logger;

  7. import gov.usgs.earthquake.product.ProductId;
  8. import gov.usgs.util.XmlUtils;

  9. /**
  10.  * Command line interface for search socket.
  11.  *
  12.  * This class reads arguments from the command line that represent a
  13.  * ProductIndexQuery. Then it connects to a configured socket, executes the
  14.  * search, and outputs the response xml.
  15.  */
  16. public class SearchCLI {

  17.     private static final Logger LOGGER = Logger.getLogger(SearchCLI.class
  18.             .getName());

  19.     /**
  20.      * Command-line argument definitions
  21.      */
  22.     /** Argument for search method */
  23.     public static String SEARCH_METHOD_ARGUMENT = "--searchMethod=";
  24.     /** Argument for result type */
  25.     public static String RESULT_TYPE_ARGUMENT = "--resultType=";
  26.     /** Argument for event Source */
  27.     public static String EVENT_SOURCE_ARGUMENT = "--eventSource=";
  28.     /** Argument for event Source Code */
  29.     public static String EVENT_SOURCE_CODE_ARGUMENT = "--eventSourceCode=";
  30.     /** Argument for minimum Event Time */
  31.     public static String MIN_EVENT_TIME_ARGUMENT = "--minEventTime=";
  32.     /** Argument for maximum event time */
  33.     public static String MAX_EVENT_TIME_ARGUMENT = "--maxEventTime=";
  34.     /** Argument for minimum event latitude */
  35.     public static String MIN_EVENT_LATITUDE_ARGUMENT = "--minEventLatitude=";
  36.     /** Argument for minimum event longitude */
  37.     public static String MIN_EVENT_LONGITUDE_ARGUMENT = "--minEventLongitude=";
  38.     /** Argument for maximum event latitude */
  39.     public static String MAX_EVENT_LATITUDE_ARGUMENT = "--maxEventLatitude=";
  40.     /** Argument for maximum event longitude */
  41.     public static String MAX_EVENT_LONGITUDE_ARGUMENT = "--maxEventLongitude=";
  42.     /** Argument for minimum event depth */
  43.     public static String MIN_EVENT_DEPTH_ARGUMENT = "--minEventDepth=";
  44.     /** Argument for maximum event depth */
  45.     public static String MAX_EVENT_DEPTH_ARGUMENT = "--maxEventDepth=";
  46.     /** Argument for minimum event magnitude */
  47.     public static String MIN_EVENT_MAGNITUDE_ARGUMENT = "--minEventMagnitude=";
  48.     /** Argument for maximum event magnitude */
  49.     public static String MAX_EVENT_MAGNITUDE_ARGUMENT = "--maxEventMagnitude=";
  50.     /** Argument for product ID */
  51.     public static String PRODUCT_ID_ARGUMENT = "--productId=";
  52.     /** Argument for  minimum product update time */
  53.     public static String MIN_PRODUCT_UPDATE_TIME_ARGUMENT = "--minProductUpdateTime=";
  54.     /** Argument for maximum product update time */
  55.     public static String MAX_PRODUCT_UPDATE_TIME_ARGUMENT = "--maxProductUpdateTime=";
  56.     /** Argument for product source */
  57.     public static String PRODUCT_SOURCE_ARGUMENT = "--productSource=";
  58.     /** Argument for product type */
  59.     public static String PRODUCT_TYPE_ARGUMENT = "--productType=";
  60.     /** Argument for product verion */
  61.     public static String PRODUCT_VERSION_ARGUMENT = "--productVersion=";
  62.     /** Argument for product status */
  63.     public static String PRODUCT_STATUS_ARGUMENT = "--productStatus=";

  64.     /** Argument for search host */
  65.     public static String SEARCH_HOST_ARGUMENT = "--searchHost=";
  66.     /** Argument for search port */
  67.     public static String SEARCH_PORT_ARGUMENT = "--searchPort=";

  68.     /** Argument for file output */
  69.     public static String FILE_OUTPUT_ARGUMENT = "--outputFile=";

  70.     /**
  71.      * Default constructor, for configurable interface.
  72.      */
  73.     public SearchCLI() {
  74.     }

  75.     /**
  76.      * Entry point into search. Called by Main when the --search argument is
  77.      * used.
  78.      *
  79.      * @param args
  80.      *            command line arguments.
  81.      * @throws Exception if error occurs
  82.      */
  83.     public static void main(final String[] args) throws Exception {
  84.         String outputFilePath = null;
  85.         SearchMethod type = null;
  86.         InetAddress host = InetAddress.getByName("localhost");
  87.         int port = Integer.parseInt(SearchServerSocket.DEFAULT_SEARCH_PORT);
  88.         ProductIndexQuery query = new ProductIndexQuery();
  89.         // Alternate result types are currently not supported.
  90.         query.setResultType(ProductIndexQuery.RESULT_TYPE_CURRENT);
  91.         for (String arg : args) {
  92.             if (arg.startsWith(SEARCH_METHOD_ARGUMENT)) {
  93.                 type = SearchMethod.fromXmlMethodName(arg.replace(
  94.                         SEARCH_METHOD_ARGUMENT, ""));
  95.                 if (type == null) {
  96.                     LOGGER.severe("Undefined search method received: '"
  97.                             + arg.replace(SEARCH_METHOD_ARGUMENT, "")
  98.                             + "'. Search could not be processed.");
  99.                     throw new Exception();
  100.                 }
  101.                 /*
  102.                  * Alternate result types are currently not supported. } else if
  103.                  * (arg.startsWith(RESULT_TYPE_ARGUMENT)) { String resultType =
  104.                  * arg.replace(RESULT_TYPE_ARGUMENT, ""); if
  105.                  * (resultType.toLowerCase() == "current")
  106.                  * query.setResultType(ProductIndexQuery.RESULT_TYPE_CURRENT);
  107.                  * else if (resultType.toLowerCase() == "superseded")
  108.                  * query.setResultType
  109.                  * (ProductIndexQuery.RESULT_TYPE_SUPERSEDED); else if
  110.                  * (resultType.toLowerCase() == "all")
  111.                  * query.setResultType(ProductIndexQuery.RESULT_TYPE_ALL);
  112.                  */
  113.             } else if (arg.startsWith(EVENT_SOURCE_ARGUMENT)) {
  114.                 query.setEventSource(arg.replace(EVENT_SOURCE_ARGUMENT, ""));
  115.             } else if (arg.startsWith(EVENT_SOURCE_CODE_ARGUMENT)) {
  116.                 query.setEventSourceCode(arg.replace(
  117.                         EVENT_SOURCE_CODE_ARGUMENT, ""));
  118.             } else if (arg.startsWith(MIN_EVENT_TIME_ARGUMENT)) {
  119.                 query.setMinEventTime(XmlUtils.getDate(arg.replace(
  120.                         MIN_EVENT_TIME_ARGUMENT, "")));
  121.             } else if (arg.startsWith(MAX_EVENT_TIME_ARGUMENT)) {
  122.                 query.setMaxEventTime(XmlUtils.getDate(arg.replace(
  123.                         MAX_EVENT_TIME_ARGUMENT, "")));
  124.             } else if (arg.startsWith(MIN_EVENT_LATITUDE_ARGUMENT)) {
  125.                 query.setMinEventLatitude(new BigDecimal(arg.replace(
  126.                         MIN_EVENT_LATITUDE_ARGUMENT, "")));
  127.             } else if (arg.startsWith(MIN_EVENT_LONGITUDE_ARGUMENT)) {
  128.                 query.setMinEventLongitude(new BigDecimal(arg.replace(
  129.                         MIN_EVENT_LONGITUDE_ARGUMENT, "")));
  130.             } else if (arg.startsWith(MIN_EVENT_DEPTH_ARGUMENT)) {
  131.                 query.setMinEventDepth(new BigDecimal(arg.replace(
  132.                         MIN_EVENT_DEPTH_ARGUMENT, "")));
  133.             } else if (arg.startsWith(MAX_EVENT_LATITUDE_ARGUMENT)) {
  134.                 query.setMaxEventLatitude(new BigDecimal(arg.replace(
  135.                         MAX_EVENT_LATITUDE_ARGUMENT, "")));
  136.             } else if (arg.startsWith(MAX_EVENT_LONGITUDE_ARGUMENT)) {
  137.                 query.setMaxEventLongitude(new BigDecimal(arg.replace(
  138.                         MAX_EVENT_LONGITUDE_ARGUMENT, "")));
  139.             } else if (arg.startsWith(MAX_EVENT_DEPTH_ARGUMENT)) {
  140.                 query.setMaxEventDepth(new BigDecimal(arg.replace(
  141.                         MAX_EVENT_DEPTH_ARGUMENT, "")));
  142.             } else if (arg.startsWith(MIN_EVENT_MAGNITUDE_ARGUMENT)) {
  143.                 query.setMinEventMagnitude(new BigDecimal(arg.replace(
  144.                         MIN_EVENT_MAGNITUDE_ARGUMENT, "")));
  145.             } else if (arg.startsWith(MAX_EVENT_MAGNITUDE_ARGUMENT)) {
  146.                 query.setMaxEventMagnitude(new BigDecimal(arg.replace(
  147.                         MAX_EVENT_MAGNITUDE_ARGUMENT, "")));
  148.             } else if (arg.startsWith(PRODUCT_ID_ARGUMENT)) {
  149.                 query.getProductIds().add(
  150.                         ProductId.parse(arg.replace(PRODUCT_ID_ARGUMENT, "")));
  151.             } else if (arg.startsWith(PRODUCT_SOURCE_ARGUMENT)) {
  152.                 query.setProductSource(arg.replace(PRODUCT_SOURCE_ARGUMENT, ""));
  153.             } else if (arg.startsWith(PRODUCT_STATUS_ARGUMENT)) {
  154.                 query.setProductStatus(arg.replace(PRODUCT_STATUS_ARGUMENT, ""));
  155.             } else if (arg.startsWith(PRODUCT_TYPE_ARGUMENT)) {
  156.                 query.setProductType(arg.replace(PRODUCT_TYPE_ARGUMENT, ""));
  157.             } else if (arg.startsWith(PRODUCT_VERSION_ARGUMENT)) {
  158.                 query.setProductVersion(arg.replace(PRODUCT_VERSION_ARGUMENT,
  159.                         ""));
  160.             } else if (arg.startsWith(SEARCH_HOST_ARGUMENT)) {
  161.                 host = InetAddress.getByName(arg.replace(SEARCH_HOST_ARGUMENT,
  162.                         ""));
  163.             } else if (arg.startsWith(SEARCH_PORT_ARGUMENT)) {
  164.                 port = Integer.parseInt(arg.replace(SEARCH_PORT_ARGUMENT, ""));
  165.             } else if (arg.startsWith(FILE_OUTPUT_ARGUMENT)) {
  166.                 outputFilePath = arg.replace(FILE_OUTPUT_ARGUMENT, "");
  167.             }
  168.         }
  169.         SearchRequest request = new SearchRequest();
  170.         if (type == null) {
  171.             LOGGER.severe("No search type was provided.");
  172.         }
  173.         OutputStream stream;
  174.         if (outputFilePath != null) {
  175.             stream = new FileOutputStream(FILE_OUTPUT_ARGUMENT);
  176.         } else {
  177.             stream = System.out;
  178.         }
  179.         request.addQuery(SearchQuery.getSearchQuery(type, query));

  180.         SearchSocket socket = new SearchSocket(host, port);
  181.         socket.search(request, stream);
  182.     }

  183.     /**
  184.      * CLI Usage
  185.      * @return string of usage
  186.      */
  187.     public static String getUsage() {
  188.         StringBuffer buf = new StringBuffer();

  189.         buf.append("Product Index Search Interface:\n");
  190.         buf.append("--search : Command is using the search interface\n");
  191.         buf.append(SEARCH_METHOD_ARGUMENT + "METHOD : Any one of ");
  192.         SearchMethod[] methods = SearchMethod.values();
  193.         for (int i = 0; i < methods.length; i++) {
  194.             buf.append("'" + methods[i].getXmlMethodName() + "'");
  195.             if (i < methods.length - 1) {
  196.                 buf.append(", ");
  197.             } else {
  198.                 buf.append("\n");
  199.             }
  200.         }
  201.         buf.append("[" + EVENT_SOURCE_ARGUMENT
  202.                 + "SOURCE] : Filter results by event source network.\n");
  203.         buf.append("[" + EVENT_SOURCE_CODE_ARGUMENT
  204.                 + "CODE] : Filter results by event source network code.\n");
  205.         buf.append("["
  206.                 + MIN_EVENT_TIME_ARGUMENT
  207.                 + "XML_FORMATTED_TIME] : Filter results by start of time window.\n");
  208.         buf.append("["
  209.                 + MAX_EVENT_TIME_ARGUMENT
  210.                 + "XML_FORMATTED_TIME] : Filter results by end of time window.\n");
  211.         buf.append("[" + MIN_EVENT_LATITUDE_ARGUMENT
  212.                 + "LATITUDE] : Filter results by Southern boundary.\n");
  213.         buf.append("[" + MAX_EVENT_LATITUDE_ARGUMENT
  214.                 + "LATITUDE] : Filter results by Northern boundary.\n");
  215.         buf.append("[" + MIN_EVENT_LONGITUDE_ARGUMENT
  216.                 + "LONGITUDE] : Filter results by Western boundary.\n");
  217.         buf.append("[" + MAX_EVENT_LONGITUDE_ARGUMENT
  218.                 + "LONGITUDE] : Filter results by Eastern boundary.\n");
  219.         buf.append("[" + MIN_EVENT_DEPTH_ARGUMENT
  220.                 + "DEPTH] : Filter results by minimum depth in km.\n");
  221.         buf.append("[" + MAX_EVENT_DEPTH_ARGUMENT
  222.                 + "DEPTH] : Filter results by maximum depth in km.\n");
  223.         buf.append("[" + MIN_EVENT_MAGNITUDE_ARGUMENT
  224.                 + "MAGNITUDE] : Filter results by minimum magnitude.\n");
  225.         buf.append("[" + MAX_EVENT_MAGNITUDE_ARGUMENT
  226.                 + "MAGNITUDE] : Filter results by maximum magnitude.\n");
  227.         buf.append("["
  228.                 + PRODUCT_ID_ARGUMENT
  229.                 + "PRODUCT_ID] : Filter by product ID. Each time this appears the new ID is added.\n");
  230.         buf.append("[" + PRODUCT_SOURCE_ARGUMENT
  231.                 + "SOURCE] : Filter results by product source.\n");
  232.         buf.append("[" + PRODUCT_STATUS_ARGUMENT
  233.                 + "STATUS] : Filter results by product status.\n");
  234.         buf.append("[" + PRODUCT_TYPE_ARGUMENT
  235.                 + "TYPE] : Filter results by product type.\n");
  236.         buf.append("[" + PRODUCT_VERSION_ARGUMENT
  237.                 + "VERSION] : Filter results by product version.\n");
  238.         buf.append("["
  239.                 + SEARCH_HOST_ARGUMENT
  240.                 + "HOST] : The Product Index host to receive this query. Default is localhost.");
  241.         buf.append("["
  242.                 + SEARCH_PORT_ARGUMENT
  243.                 + "PORT] : The port on which to execute this query. Default is "
  244.                 + SearchServerSocket.DEFAULT_SEARCH_PORT + ".\n");
  245.         buf.append("["
  246.                 + FILE_OUTPUT_ARGUMENT
  247.                 + "FILE] : The file to write output to. If this is not included, output will be directed over stdout.");

  248.         return buf.toString();
  249.     }

  250. }