📄 waveclient.java
字号:
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 + -