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.getName());

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

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

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

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

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

  158.     SearchSocket socket = new SearchSocket(host, port);
  159.     socket.search(request, stream);
  160.   }

  161.   /**
  162.    * CLI Usage
  163.    *
  164.    * @return string of usage
  165.    */
  166.   public static String getUsage() {
  167.     StringBuffer buf = new StringBuffer();

  168.     buf.append("Product Index Search Interface:\n");
  169.     buf.append("--search : Command is using the search interface\n");
  170.     buf.append(SEARCH_METHOD_ARGUMENT + "METHOD : Any one of ");
  171.     SearchMethod[] methods = SearchMethod.values();
  172.     for (int i = 0; i < methods.length; i++) {
  173.       buf.append("'" + methods[i].getXmlMethodName() + "'");
  174.       if (i < methods.length - 1) {
  175.         buf.append(", ");
  176.       } else {
  177.         buf.append("\n");
  178.       }
  179.     }
  180.     buf.append("[" + EVENT_SOURCE_ARGUMENT + "SOURCE] : Filter results by event source network.\n");
  181.     buf.append("[" + EVENT_SOURCE_CODE_ARGUMENT + "CODE] : Filter results by event source network code.\n");
  182.     buf.append("[" + MIN_EVENT_TIME_ARGUMENT + "XML_FORMATTED_TIME] : Filter results by start of time window.\n");
  183.     buf.append("[" + MAX_EVENT_TIME_ARGUMENT + "XML_FORMATTED_TIME] : Filter results by end of time window.\n");
  184.     buf.append("[" + MIN_EVENT_LATITUDE_ARGUMENT + "LATITUDE] : Filter results by Southern boundary.\n");
  185.     buf.append("[" + MAX_EVENT_LATITUDE_ARGUMENT + "LATITUDE] : Filter results by Northern boundary.\n");
  186.     buf.append("[" + MIN_EVENT_LONGITUDE_ARGUMENT + "LONGITUDE] : Filter results by Western boundary.\n");
  187.     buf.append("[" + MAX_EVENT_LONGITUDE_ARGUMENT + "LONGITUDE] : Filter results by Eastern boundary.\n");
  188.     buf.append("[" + MIN_EVENT_DEPTH_ARGUMENT + "DEPTH] : Filter results by minimum depth in km.\n");
  189.     buf.append("[" + MAX_EVENT_DEPTH_ARGUMENT + "DEPTH] : Filter results by maximum depth in km.\n");
  190.     buf.append("[" + MIN_EVENT_MAGNITUDE_ARGUMENT + "MAGNITUDE] : Filter results by minimum magnitude.\n");
  191.     buf.append("[" + MAX_EVENT_MAGNITUDE_ARGUMENT + "MAGNITUDE] : Filter results by maximum magnitude.\n");
  192.     buf.append("[" + PRODUCT_ID_ARGUMENT
  193.         + "PRODUCT_ID] : Filter by product ID. Each time this appears the new ID is added.\n");
  194.     buf.append("[" + PRODUCT_SOURCE_ARGUMENT + "SOURCE] : Filter results by product source.\n");
  195.     buf.append("[" + PRODUCT_STATUS_ARGUMENT + "STATUS] : Filter results by product status.\n");
  196.     buf.append("[" + PRODUCT_TYPE_ARGUMENT + "TYPE] : Filter results by product type.\n");
  197.     buf.append("[" + PRODUCT_VERSION_ARGUMENT + "VERSION] : Filter results by product version.\n");
  198.     buf.append(
  199.         "[" + SEARCH_HOST_ARGUMENT + "HOST] : The Product Index host to receive this query. Default is localhost.");
  200.     buf.append("[" + SEARCH_PORT_ARGUMENT + "PORT] : The port on which to execute this query. Default is "
  201.         + SearchServerSocket.DEFAULT_SEARCH_PORT + ".\n");
  202.     buf.append("[" + FILE_OUTPUT_ARGUMENT
  203.         + "FILE] : The file to write output to. If this is not included, output will be directed over stdout.");

  204.     return buf.toString();
  205.   }

  206. }