QWEmbeddedClient.java

  1. /*
  2.  * QWEmbeddedClient
  3.  */
  4. package gov.usgs.earthquake.eidsutil;

  5. import com.isti.quakewatch.clientbase.QWTrackingClient;
  6. import com.isti.quakewatch.util.QWConnectionMgr;
  7. import com.isti.util.CfgProperties;

  8. import java.util.Iterator;
  9. import java.util.List;
  10. import java.util.LinkedList;

  11. /**
  12.  * An EIDS client that is a java event source.
  13.  */
  14. public class QWEmbeddedClient extends QWTrackingClient implements EIDSListener {

  15.     /** Version string for program. */
  16.     public static final String PROGRAM_VERSION = "0.2";

  17.     /** Name string for program. */
  18.     public static final String PROGRAM_NAME = "QWEmbeddedClient";

  19.     /** Default server host. */
  20.     public static final String DEFAULT_SERVER_HOST = "eids1.cr.usgs.gov";

  21.     /** Default server port number. */
  22.     public static final Integer DEFAULT_SERVER_PORT = 39977;

  23.     /** Default maxServerEventAgeDays parameter. */
  24.     public static final Double DEFAULT_MAX_SERVER_EVENT_AGE_DAYS = 3.0;

  25.     /** Default Tracking filename. */
  26.     public static final String DEFAULT_TRACKING_FILE_NAME = "EIDSClient_tracking.dat";

  27.     /** Server host name. */
  28.     private String serverHost;

  29.     /** Server port number. */
  30.     private Integer serverPort;

  31.     /** Comma delimited list of host:port s. */
  32.     private String alternateServersList;

  33.     /** The decimal age in days. */
  34.     private Double maxServerEventAgeDays;

  35.     /** Tracking file for EIDS client. */
  36.     private String trackingFileName;

  37.     /** An object that "processes" messages, by passing them up to this object. */
  38.     private QWEmbeddedMsgProcessor processor = new QWEmbeddedMsgProcessor(this);

  39.     /** Listeners to notify when a message is received. */
  40.     private List<EIDSListener> listeners = new LinkedList<EIDSListener>();

  41.     /** Whether this has been shutdown already. */
  42.     private boolean isShutdown = false;

  43.     /** Console log level. */
  44.     private String consoleLogLevel = "Info";

  45.     /** Constructor using the default host and port */
  46.     public QWEmbeddedClient() {
  47.         this(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
  48.     }

  49.     /**
  50.      * Construct an EIDSClient using only server host and port.
  51.      *
  52.      * Calls other constructor with null values for other parameters.
  53.      *
  54.      * @param serverHost host of EIDS client
  55.      * @param serverPort port of EIDS client
  56.      */
  57.     public QWEmbeddedClient(final String serverHost, final Integer serverPort) {
  58.         this(serverHost, serverPort, "");
  59.     }

  60.     /**
  61.      * Construct an EIDSClient using serverHost, serverPort, and
  62.      * alternateServersList.
  63.      *
  64.      * @param serverHost host of EIDS client
  65.      * @param serverPort port of EIDS client
  66.      * @param alternateServersList
  67.      *            a comma delimited list of host:port that are used when unable
  68.      *            to connect to the primary serverHost and serverPort.
  69.      */
  70.     public QWEmbeddedClient(final String serverHost, final Integer serverPort,
  71.             final String alternateServersList) {
  72.         this(serverHost, serverPort, alternateServersList,
  73.                 DEFAULT_MAX_SERVER_EVENT_AGE_DAYS, DEFAULT_TRACKING_FILE_NAME);
  74.     }

  75.     /**
  76.      * Constructor with all options.
  77.      *
  78.      * @param serverHost
  79.      *            the eids server host or ip address.
  80.      * @param serverPort
  81.      *            the eids server port.
  82.      * @param alternateServersList
  83.      *            a comma delimited list of host:port that are used when unable
  84.      *            to connect to the primary serverHost and serverPort.
  85.      * @param maxServerEventAgeDays
  86.      *            number of days worth of messages to retrieve on first connect.
  87.      * @param trackingFileName
  88.      *            location where tracking file is stored. This file is used to
  89.      *            track which messages have been received.
  90.      */
  91.     public QWEmbeddedClient(final String serverHost, final Integer serverPort,
  92.             final String alternateServersList,
  93.             final Double maxServerEventAgeDays, final String trackingFileName) {
  94.         this.serverHost = serverHost;
  95.         this.serverPort = serverPort;
  96.         this.alternateServersList = alternateServersList;
  97.         this.maxServerEventAgeDays = maxServerEventAgeDays;
  98.         this.trackingFileName = trackingFileName;
  99.     }

  100.     /**
  101.      *
  102.      */
  103.     public void setupConfiguration(CfgProperties userPropsObj,
  104.             Object connGroupSelObj, Object logGroupSelObj,
  105.             boolean addPrependDeclFlag) {
  106.         super.setupConfiguration(userPropsObj, connGroupSelObj, logGroupSelObj,
  107.                 addPrependDeclFlag);
  108.         CfgProperties props = getConnPropsObj().getConfigProps();
  109.         props.get("serverHostAddress").setValue(serverHost);
  110.         props.get("serverPortNumber").setValue(serverPort);
  111.         props.get("maxServerEventAgeDays").setValue(maxServerEventAgeDays);

  112.         if (alternateServersList != null) {
  113.             props.get("alternateServersList").setValue(alternateServersList);
  114.             props.get("altServersEnabledFlag").setValue(true);
  115.             props.get("keepDefaultAltServersFlag").setValue(true);
  116.         } else {
  117.             props.get("alternateServersList").setValue("");
  118.             props.get("altServersEnabledFlag").setValue(false);
  119.             props.get("keepDefaultAltServersFlag").setValue(true);
  120.         }

  121.         props.get("trackingFileName").setValue(trackingFileName);
  122.         props.get("clientConsoleLevel").setValue(consoleLogLevel);

  123.         // disable separate log file
  124.         props.get("clientLogFileName").setValue("");
  125.         props.get("clientLogFileLevel").setValue("Debug");
  126.     }

  127.     /**
  128.      * Runs the client.
  129.      *
  130.      * Any listeners should be added before calling this method.
  131.      */
  132.     public void startup() {
  133.         if (isShutdown) {
  134.             throw new IllegalArgumentException(
  135.                     "Cannot restart a QWEmbeddedClient after it has shutdown.");
  136.         }
  137.         // initialize client
  138.         setupConfiguration(null, null);
  139.         // set information for this client
  140.         setupClientInfoProps(PROGRAM_NAME, PROGRAM_VERSION);
  141.         // must be called before runClient
  142.         processConfiguration(null, null, null, false, null, false, null);
  143.         runClient(processor);
  144.     }

  145.     /**
  146.      * Shuts down a running client.
  147.      *
  148.      * Does not call system.exit.
  149.      */
  150.     public void shutdown() {
  151.         // shutdown the client, but doesn't call System.exit()
  152.         stopClient();
  153.         isShutdown = true;

  154.         // this is supposedly called by stopClient, but adding in because memory
  155.         // not being freed as expected
  156.         try {
  157.             QWConnectionMgr manager = this.getConnManagerObj();
  158.             manager.closeConnection();
  159.             manager.getMsgHandlerObj().clearWaitingMsgsQueueTable();
  160.         } catch (Exception e) {
  161.             System.err.println("Exception shutting down QWEmbeddedClient");
  162.             e.printStackTrace();
  163.         }
  164.     }

  165.     /**
  166.      * Add a listener.
  167.      *
  168.      * @param listener
  169.      *            the listener to add.
  170.      */
  171.     public synchronized void addListener(final EIDSListener listener) {
  172.         this.listeners.add(listener);
  173.     }

  174.     /**
  175.      * Remove a listener.
  176.      *
  177.      * @param listener
  178.      *            the listener to remove.
  179.      */
  180.     public synchronized void removeListener(final EIDSListener listener) {
  181.         this.listeners.remove(listener);
  182.     }

  183.     public void onEIDSMessage(EIDSMessageEvent event) {
  184.         // iterate over a copy of the listeners list
  185.         Iterator<EIDSListener> iter = new LinkedList<EIDSListener>(listeners)
  186.                 .iterator();
  187.         while (iter.hasNext()) {
  188.             iter.next().onEIDSMessage(event);
  189.         }
  190.     }

  191.     /**
  192.      * @return the serverHost
  193.      */
  194.     public String getServerHost() {
  195.         return serverHost;
  196.     }

  197.     /**
  198.      * @param serverHost
  199.      *            the serverHost to set
  200.      */
  201.     public void setServerHost(String serverHost) {
  202.         this.serverHost = serverHost;
  203.     }

  204.     /**
  205.      * @return the serverPort
  206.      */
  207.     public Integer getServerPort() {
  208.         return serverPort;
  209.     }

  210.     /**
  211.      * @param serverPort
  212.      *            the serverPort to set
  213.      */
  214.     public void setServerPort(Integer serverPort) {
  215.         this.serverPort = serverPort;
  216.     }

  217.     /**
  218.      * @return the alternateServersList
  219.      */
  220.     public String getAlternateServersList() {
  221.         return alternateServersList;
  222.     }

  223.     /**
  224.      * @param alternateServersList
  225.      *            the alternateServersList to set
  226.      */
  227.     public void setAlternateServersList(String alternateServersList) {
  228.         this.alternateServersList = alternateServersList;
  229.     }

  230.     /**
  231.      * @return the maxServerEventAgeDays
  232.      */
  233.     public Double getMaxServerEventAgeDays() {
  234.         return maxServerEventAgeDays;
  235.     }

  236.     /**
  237.      * @param maxServerEventAgeDays
  238.      *            the maxServerEventAgeDays to set
  239.      */
  240.     public void setMaxServerEventAgeDays(Double maxServerEventAgeDays) {
  241.         this.maxServerEventAgeDays = maxServerEventAgeDays;
  242.     }

  243.     /**
  244.      * @return the trackingFileName
  245.      */
  246.     public String getTrackingFileName() {
  247.         return trackingFileName;
  248.     }

  249.     /**
  250.      * @param trackingFileName
  251.      *            the trackingFileName to set
  252.      */
  253.     public void setTrackingFileName(String trackingFileName) {
  254.         this.trackingFileName = trackingFileName;
  255.     }

  256.     /** @return console Log level */
  257.     public String getConsoleLogLevel() {
  258.         return consoleLogLevel;
  259.     }

  260.     /** @param consoleLogLevel to set */
  261.     public void setConsoleLogLevel(String consoleLogLevel) {
  262.         this.consoleLogLevel = consoleLogLevel;
  263.     }

  264.     /**
  265.      * A method to test the EIDSClient.
  266.      *
  267.      * @param args arguments
  268.      * @throws Exception if error occurs
  269.      */
  270.     public static void main(final String[] args) throws Exception {
  271.         EIDSListener listener = new EIDSListener() {
  272.             public void onEIDSMessage(EIDSMessageEvent event) {
  273.                 System.err.println(event.getServerHost() + " "
  274.                         + event.getServerSequence());
  275.                 System.err.println("\t" + event.getMessageSource() + " "
  276.                         + event.getMessageSequence());
  277.                 System.err.println("\t" + event.getRootNamespace() + ":"
  278.                         + event.getRootElement());
  279.             }
  280.         };

  281.         QWEmbeddedClient client = new QWEmbeddedClient("eids1.cr.usgs.gov",
  282.                 39977);
  283.         client.addListener(listener);

  284.         System.err.println("Starting client");
  285.         // run for 2 seconds
  286.         client.startup();
  287.         Thread.sleep(5000);

  288.         System.err.println("Stopping client");
  289.         // stop for 2 seconds
  290.         client.shutdown();

  291.         // start a new client
  292.         client = new QWEmbeddedClient("eids1.cr.usgs.gov", 39977);
  293.         client.addListener(listener);

  294.         System.err.println("Starting client");
  295.         // run for 2 seconds
  296.         client.startup();
  297.         Thread.sleep(5000);

  298.         System.err.println("Stopping client");
  299.         // stop for 2 seconds
  300.         client.shutdown();
  301.     }

  302. }