⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waveclient.java

📁 一个用java写的地震分析软件(无源码)-used to write a seismic analysis software (without source)
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
package org.trinet.waveserver.rt;
import java.util.*;
import java.io.*;
import java.net.*;
//import org.trinet.jasi.*;
import org.trinet.util.*;
import org.trinet.jasi.seed.SeedReader;


/* NOTE - A patch to fix verbose logging of data recovery failure:
        if (retVal == TN_FAILURE) retVal = TN_NODATA;   // TEMPORARY PATCH UNTIL DWS CODES FIXED
   is inserted in all doGetXXX() routines for CASE TN_TCP_ERROR_RESP messages values.
*/

/** Implementations of a WaveClient API adapted with modifications from the
* original "TRINET C++ WaveClient API" by Patrick Small. Methods allow the
* recovery of data from a list of server connections created using the
* addServer() methods. The getXXX() methods can then be used to retrieve data
* from the server list. Note that the getXXX() methods usually return the data
* into a user initialized input parameter object and the methods return a status
* code indicating success or failure. Some methods throw exceptions if an error
* is encountered during processing. Refer the the TriNet WaveClient/WaveServer
* documentation for further descriptions of the TCP message protocols and the
* roles served by the classes in this package.
*<p>
*<b> Note - some methods may alias input/output parameter object references,
*    when aliased, the data members reflect any external modification to the data.
*    If preservation of the original object data is required, as a precaution clone
*    the data of the external reference before modifying or setting the data values.
*</b>
*
* @see TrinetReturnCodes
* @see TrinetTCPMessageTypes
* @see TCPConn
* @see TCPMessage */
public class WaveClient extends org.trinet.util.WaveClient
    implements TrinetReturnCodes, TrinetTCPMessageTypes

{

/** Constant identifying rapid wave server default pool size in milliseconds */
    public static final long RWS_MAX_MILLISECS_IN_POOL = 8640000l; // 1 day

/** Constant identifying rapid wave server (memory based) default port number*/
    public static final int RWS_PORT_ID = 6500;

/** Constant identifying disk wave server (file based) default port number*/
    public static final int DWS_PORT_ID = 6501;

/** Constant identifying primary server role */
    public static final int TN_PRIMARY = 1;

/** Maximum message sequence number value. */
    public static final int DEFAULT_MAX_SEQNUM = 2048;

/** Default time to wait for a server response. */
    public static final int DEFAULT_MAX_TIMEOUT_MILLISECS = 30000;

/** Time to wait for a server response. */
    private int maxTimeout = DEFAULT_MAX_TIMEOUT_MILLISECS;

/** Default number of retries for a connection attempt. */
    public static final int DEFAULT_MAX_RETRIES = 3;

/** Number of reconnection attempts. */
    private int maxRetries = DEFAULT_MAX_RETRIES;

/** HashMap buckets. */
    static final int INITIAL_HASH_CAPACITY = 8;

/** Map storing server connections. */
    private Map servers = new Hashtable(INITIAL_HASH_CAPACITY);

/** True == truncate waveforms at first time gap. */
    private boolean truncateAtTimeGap = false;

/** True == verify waveforms. */
    private boolean verifyWaveforms = true;

/** TCPMessage number generator */
    private Counter sequenceNumberCounter;

/** Default constructor, default waveform modes: ignore time gaps and verifies waveforms.
*   Initializes request message sequence number to zero.
*/
    public WaveClient() {
        sequenceNumberCounter = new Counter(0, DEFAULT_MAX_SEQNUM);
    }

/** constructor sets client properties to the values parsed from the specified input property file.<p>
*<b>
* Valid properties:<br>
*</b>
* <pre>
* keyString                valueString<br>
* server            name:port name2:port name3:port ... ("\" at EOL continues theinput on next line)
* verifyWaveforms   true or false                       (default=true)
* truncateAtTimeGap true or false                       (default=false)
* maxTimeout        int >= 0                            (default=30000 ms, 0 => infinite, socket reads)
* maxRetries        int >= 0                            (default=3 reconnects attempted on socket error)
* </pre>
*   @exception WaveClientException input property file not found; invalid input property specification
*
*
*/
    public WaveClient(String propertyFileName) throws WaveClientException {
        String keyStr = null;
        String valueStr = null;
        int maxSequenceNumber = DEFAULT_MAX_SEQNUM;

        try {

            PropertyResourceBundle propRsrcBdl = new PropertyResourceBundle(new FileInputStream(propertyFileName));
            Enumeration keys = propRsrcBdl.getKeys();

            while (keys.hasMoreElements()) {

                keyStr = (String) keys.nextElement();
                valueStr = propRsrcBdl.getString(keyStr);

                if (keyStr.equalsIgnoreCase("servers")) {
                    StringTokenizer strToke = new StringTokenizer(valueStr, " :\t\n\r\f");
                    if ( strToke.countTokens()%2 != 0 )
                        throw new WaveClientException("invalid server property string; must be serverName:portNumber pairs");
                    while (strToke.hasMoreTokens()) {
                        String serverName = strToke.nextToken();
                        int serverPort = Integer.parseInt(strToke.nextToken());
                        this.addServer(serverName, serverPort);
                    }
                }

                else if (keyStr.equalsIgnoreCase("verifyWaveforms")) {
                    if (valueStr.equalsIgnoreCase("false")) verifyWaveforms = false;
                }

                else if (keyStr.equalsIgnoreCase("truncateAtTimeGap")) {
                    if (valueStr.equalsIgnoreCase("true")) truncateAtTimeGap = true;
                }

                else if (keyStr.equalsIgnoreCase("maxTimeout")) {
                    this.maxTimeout = Integer.parseInt(valueStr);
                }

                else if (keyStr.equalsIgnoreCase("maxRetries")) {
                    this.maxRetries = Integer.parseInt(valueStr);
                }
                else if (keyStr.equalsIgnoreCase("maxSequence")) {
                    maxSequenceNumber = Integer.parseInt(valueStr);
                }
                else {
                    throw new WaveClientException("Property resource file:" + propertyFileName + " has unknown key: " + keyStr);
                }
            }
            sequenceNumberCounter = new Counter(0, maxSequenceNumber);
        }
        catch (Exception ex)  {
            ex.printStackTrace();
            throw new WaveClientException("WaveClient constructor failed; propertyFile: " + propertyFileName  +
            " key: " + keyStr + " value: " + valueStr);
        }
    }


/** Default constructor, sets mode to ignore time gaps, returning all time segments.
*   Initializes request message sequence number to zero.
*   @param maxRetries          number of server reconnections to attempt if connection is broken or input timesout.
*   @param maxTimeoutMillisecs timeout milliseconds to wait for input to complete before attempting a reconnection.
*   @param verifyWaveforms     true == (default) check all packet headers for data consistency; false == accept packets as is.
*   @param truncateAtTimeGap   false == (default) return all time-series segments; false == return only time-series before 1st gap.
*   @exception java.lang.IllegalArgumentException input parameter < 0
*/
    public WaveClient(int maxRetries, int maxTimeoutMilliSecs, boolean verifyWaveforms, boolean truncateAtTimeGap) {
        if (maxRetries < 0 || maxTimeoutMilliSecs < 0)
            throw new IllegalArgumentException("WaveClient constructor invoked with input parameter < 0");

//  removed -  @param maxSequenceNumber   maximum TCPMessage sequence number for the generated request messages.
//        maxSequence < 0 throw new Illegal ...
//        sequenceNumberCounter = new Counter(0, maxSequenceNumber);

        this.maxRetries = maxRetries;
        this.maxTimeout = maxTimeoutMilliSecs;
        this.verifyWaveforms = verifyWaveforms;
        this.truncateAtTimeGap = truncateAtTimeGap;
        sequenceNumberCounter = new Counter(0, DEFAULT_MAX_SEQNUM);
    }

/** Closes socket connections for any server in the server list. */
    protected void finalize() {
        this.close();
    }

/** Returns the maximum TCPMessage number allowed for the generated request messages. */
    public int getMaxSequenceNumber() {
        return sequenceNumberCounter.rolloverValue;
    }

/** Returns the maximum number of re-connection, re-requests attempted on any server connection before failing. */
    public int getMaxRetries() {
        return maxRetries;
    }

/** Sets the maximum number of re-connection, re-requests attempted on any server connection error before failing.
*   @exception java.lang.IllegalArgumentException input parameter < 0
*/
    public int setMaxRetries(int retries) {
        if (maxRetries < 0 )
            throw new IllegalArgumentException("WaveClient.setMaxRetries(int) input parameter < 0");
        return(maxRetries = retries);
    }

/** Returns the maximum timeout milliseconds for input from a server responses to complete. */
    public int getMaxTimeoutMilliSecs() {
        return maxTimeout;
    }

/** Sets the maximum timeout milliseconds to allowed for input from a server responses to complete
*   before an java.io.InterruptedIOException is thrown by client socket.
*   @exception java.lang.IllegalArgumentException input parameter < 0
*/
    // Made public 7/17/2000 - DDG
    public int setMaxTimeoutMilliSecs(int millisecs) {
        if (millisecs < 0)
            throw new IllegalArgumentException("WaveClient.setMaxTimeoutMilliSecs(int) input parameter < 0");
        maxTimeout = millisecs;
//        Collection connList = getServerPollList();
        Collection connList = servers.values();
        Iterator iter = connList.iterator();
        while(iter.hasNext()){
            ((TCPConn) iter.next()).setDefaultTimeout(maxTimeout);
        }
				return(maxTimeout);
    }

/** Sets mode to truncate any requested time-series data at first time tear.
* Data requested by the getData(...) , getPacketData(...) , getJasiWaveformDataXXX(...) and getTimes(...) methods
* @see #getData(String, String, String, Date, int, Collection)
* @see #getData(Channel, TimeWindow, Waveform)
* @see #getJasiWaveformDataRaw(org.trinet.jasi.Waveform)
* @see #getJasiWaveformDataSeries(org.trinet.jasi.Waveform)
* @see #getPacketData(Channel, TimeWindow)
* @see #getTimes(Channel, Collection)
*/
    public void setTruncatetAtTimeGap(boolean value) {
        truncateAtTimeGap = value;
    }

/** Returns true if mode is set to truncate any requested time-series data at first time tear.
* Data requested by the getData(...) and getPacketData(...) and getTimes(...) methods.
* @see #getData(String, String, String, Date, int, Collection)
* @see #getData(Channel, TimeWindow, Waveform)
* @see #getJasiWaveformDataRaw(org.trinet.jasi.Waveform)
* @see #getJasiWaveformDataSeries(org.trinet.jasi.Waveform)
* @see #getPacketData(Channel, TimeWindow)
* @see #getTimes(Channel, Collection)
*/
    public boolean isTruncateAtTimeGap() {
        return truncateAtTimeGap;
    }

/** Returns true if mode is set to ignore all time gaps any requested time-series data, no data truncation.
* Data requested by the getData(...) and getPacketData(...) and getTimes(...) methods.
* @see #getData(String, String, String, Date, int, Collection)
* @see #getData(Channel, TimeWindow, Waveform)
* @see #getJasiWaveformDataRaw(org.trinet.jasi.Waveform)
* @see #getJasiWaveformDataSeries(org.trinet.jasi.Waveform)
* @see #getPacketData(Channel, TimeWindow)
* @see #getTimes(Channel, Collection)
*/
    public boolean isIgnoreTimeGaps() {
        return ! truncateAtTimeGap;
    }

/** Gets the verification state setting for all retrieved time series data.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -