EIDSClient.java

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

  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.LinkedList;
  8. import java.util.Timer;
  9. import java.util.TimerTask;

  10. /**
  11.  * An EIDS client that is a java event source.
  12.  */
  13. public class EIDSClient implements EIDSListener {

  14.     /** Property name for eids server host address. */
  15.     public static final String EIDS_SERVER_HOST_PROPERTY = "serverHost";

  16.     /** Property name for eids server port. */
  17.     public static final String EIDS_SERVER_PORT = "serverPort";

  18.     /** Property name for eids server alternate servers list. */
  19.     public static final String EIDS_ALTERNATE_SERVERS = "alternateServers";

  20.     /** Property name for objects to load and add as EIDSListeners. */
  21.     public static final String EIDS_LISTENERS = "listeners";

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

  24.     /** Name string for program. */
  25.     public static final String PROGRAM_NAME = "EIDSClient";

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

  28.     /** Default server port number. */
  29.     public static final Integer DEFAULT_SERVER_PORT = 39977;

  30.     /** Default maxServerEventAgeDays parameter. */
  31.     public static final Double DEFAULT_MAX_SERVER_EVENT_AGE_DAYS = 3.0;

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

  34.     /** Default client restart interval */
  35.     public static final Long DEFAULT_CLIENT_RESTART_INTERVAL = 86400000L;

  36.     /** Server host name. */
  37.     private String serverHost;

  38.     /** Server port number. */
  39.     private Integer serverPort;

  40.     /** Comma delimited list of host:port s. */
  41.     private String alternateServersList;

  42.     /** The decimal age in days. */
  43.     private Double maxServerEventAgeDays;

  44.     /** Tracking file for EIDS client. */
  45.     private String trackingFileName;

  46.     /** The actual client this object wraps. */
  47.     private QWEmbeddedClient client;

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

  50.     /** A timer used to periodically restart the client. */
  51.     private Timer clientRestartTimer;

  52.     /** How often to periodically restart the client, in milliseconds. */
  53.     private Long clientRestartInterval;

  54.     /** Whether we are debugging or not. Affects log level. */
  55.     private boolean debug;

  56.     /** Constructor using default host and port */
  57.     public EIDSClient() {
  58.         this(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
  59.     }

  60.     /**
  61.      * Construct an EIDSClient using only server host and port.
  62.      *
  63.      * Calls other constructor with null values for other parameters.
  64.      *
  65.      * @param serverHost Specific host
  66.      * @param serverPort Specific port
  67.      */
  68.     public EIDSClient(final String serverHost, final Integer serverPort) {
  69.         this(serverHost, serverPort, "");
  70.     }

  71.     /**
  72.      * Construct an EIDSClient using serverHost, serverPort, and
  73.      * alternateServersList.
  74.      *
  75.      * @param serverHost Host
  76.      * @param serverPort Port
  77.      * @param alternateServersList
  78.      *            a comma delimited list of host:port that are used when unable
  79.      *            to connect to the primary serverHost and serverPort.
  80.      */
  81.     public EIDSClient(final String serverHost, final Integer serverPort,
  82.             final String alternateServersList) {
  83.         this(serverHost, serverPort, alternateServersList,
  84.                 DEFAULT_MAX_SERVER_EVENT_AGE_DAYS, DEFAULT_TRACKING_FILE_NAME,
  85.                 DEFAULT_CLIENT_RESTART_INTERVAL);
  86.     }

  87.     /**
  88.      * Constructor with all options.
  89.      *
  90.      * @param serverHost
  91.      *            the eids server host or ip address.
  92.      * @param serverPort
  93.      *            the eids server port.
  94.      * @param alternateServersList
  95.      *            a comma delimited list of host:port that are used when unable
  96.      *            to connect to the primary serverHost and serverPort.
  97.      * @param maxServerEventAgeDays
  98.      *            number of days worth of messages to retrieve on first connect.
  99.      * @param trackingFileName
  100.      *            location where tracking file is stored. This file is used to
  101.      *            track which messages have been received.
  102.      * @param clientRestartInterval
  103.      *            How often to periodically restart the client, in milliseconds
  104.      */
  105.     public EIDSClient(final String serverHost, final Integer serverPort,
  106.             final String alternateServersList,
  107.             final Double maxServerEventAgeDays, final String trackingFileName,
  108.             final Long clientRestartInterval) {
  109.         this.serverHost = serverHost;
  110.         this.serverPort = serverPort;
  111.         this.alternateServersList = alternateServersList;
  112.         this.maxServerEventAgeDays = maxServerEventAgeDays;
  113.         this.trackingFileName = trackingFileName;
  114.         this.clientRestartInterval = clientRestartInterval;
  115.     }

  116.     /**
  117.      * Runs the client.
  118.      *
  119.      * Any listeners should be added before calling this method.
  120.      */
  121.     public void startup() {
  122.         // were we already running?
  123.         if (client != null) {
  124.             client.shutdown();
  125.             client = null;
  126.         }

  127.         // start the client
  128.         client = new QWEmbeddedClient(serverHost, serverPort,
  129.                 alternateServersList, maxServerEventAgeDays, trackingFileName);
  130.         client.addListener(this);

  131.         if (debug) {
  132.             client.setConsoleLogLevel("Debug5");
  133.         }

  134.         client.startup();

  135.         // if this is the first time through
  136.         if (clientRestartTimer == null && clientRestartInterval > 0) {
  137.             clientRestartTimer = new Timer();
  138.             clientRestartTimer.schedule(
  139.                     new TimerTask() {
  140.                         public void run() {
  141.                             reinitConnection();
  142.                         }
  143.                     },
  144.                     // before first execution
  145.                     clientRestartInterval,
  146.                     // between subsequent executions
  147.                     clientRestartInterval);
  148.         }
  149.     }

  150.     /**
  151.      * Shuts down a running client.
  152.      *
  153.      * Does not call system.exit.
  154.      */
  155.     public void shutdown() {
  156.         if (clientRestartTimer != null) {
  157.             clientRestartTimer.cancel();
  158.         }
  159.         if (client != null) {
  160.             client.shutdown();
  161.             client = null;
  162.         }
  163.     }

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

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

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

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

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

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

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

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

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

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

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

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

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

  255.     /**
  256.      * @return clientRestartInterval
  257.      */
  258.     public Long getClientRestartInterval() {
  259.         return clientRestartInterval;
  260.     }

  261.     /**
  262.      * @param clientRestartInterval
  263.      *            the clientRestartInterval to set
  264.      */
  265.     public void setClientRestartInterval(Long clientRestartInterval) {
  266.         this.clientRestartInterval = clientRestartInterval;
  267.     }

  268.     /** @param debug to set */
  269.     public void setDebug(boolean debug) {
  270.         this.debug = debug;
  271.     }

  272.     /** @return debug boolean */
  273.     public boolean isDebug() {
  274.         return debug;
  275.     }

  276.     /**
  277.      * @return result of reinitialzing the client connection
  278.      */
  279.     public boolean reinitConnection() {
  280.         if (client != null) {
  281.             return client.getConnManagerObj().reinitConnection();
  282.         }
  283.         return false;
  284.     }

  285.     /**
  286.      * A method to test the EIDSClient.
  287.      *
  288.      * @param args arguments
  289.      * @throws Exception if error occurs
  290.      */
  291.     public static void main(final String[] args) throws Exception {
  292.         EIDSListener listener = new EIDSListener() {
  293.             public void onEIDSMessage(EIDSMessageEvent event) {
  294.                 System.err.println(event.getServerHost() + " "
  295.                         + event.getServerSequence());
  296.                 System.err.println(event.getMessage());
  297.             }
  298.         };

  299.         String host = "eids1.cr.usgs.gov";
  300.         int port = 39977;
  301.         boolean debug = false;

  302.         for (String arg : args) {
  303.             if (arg.startsWith("--host=")) {
  304.                 host = arg.replace("--host=", "");
  305.             } else if (arg.startsWith("--port=")) {
  306.                 port = Integer.parseInt(arg.replace("--port=", ""));
  307.             } else if (arg.equals("--debug")) {
  308.                 debug = true;
  309.             }
  310.         }

  311.         EIDSClient client = new EIDSClient(host, port);
  312.         client.setClientRestartInterval(10000L);
  313.         client.setDebug(debug);
  314.         client.addListener(listener);
  315.         client.startup();
  316.     }

  317. }