diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/ClientConfig.java b/apps/heartbeat/java/src/net/i2p/heartbeat/ClientConfig.java index 6056ad21ff..6901e9ae33 100644 --- a/apps/heartbeat/java/src/net/i2p/heartbeat/ClientConfig.java +++ b/apps/heartbeat/java/src/net/i2p/heartbeat/ClientConfig.java @@ -1,14 +1,14 @@ package net.i2p.heartbeat; -import net.i2p.data.Destination; -import net.i2p.data.DataFormatException; -import net.i2p.util.Log; - import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.StringTokenizer; +import net.i2p.data.DataFormatException; +import net.i2p.data.Destination; +import net.i2p.util.Log; + /** * Define the configuration for testing against one particular peer as a client * @@ -26,17 +26,63 @@ public class ClientConfig { private String _comment; private int _averagePeriods[]; + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_PREFIX = "peer."; + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_PEER = ".peer"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_STATFILE = ".statFile"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_STATDURATION = ".statDuration"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_STATFREQUENCY = ".statFrequency"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_SENDFREQUENCY = ".sendFrequency"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_SENDSIZE = ".sendSize"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_COMMENT = ".comment"; + + /** + * @seeRoutine ClientConfig#load + * @seeRoutine ClientConfig#store + */ public static final String PROP_AVERAGEPERIODS = ".averagePeriods"; + /** + * Default constructor... + */ public ClientConfig() { this(null, null, null, -1, -1, -1, -1, 0, null, null); } @@ -65,64 +111,135 @@ public class ClientConfig { _averagePeriods = averagePeriods; } - /** peer to test against */ + /** Retrieves the peer to test against + * @return the Destination (peer) + */ public Destination getPeer() { return _peer; } + + /** + * Sets the peer to test against + * @param peer the Destination (peer) + */ public void setPeer(Destination peer) { _peer = peer; } - /** who we are when we test */ + + /** + * Retrieves who we are when we test + * @return the Destination (us) + */ public Destination getUs() { return _us; } + + /** + * Sets who we are when we test + * @param us the Destination (us) + */ public void setUs(Destination us) { _us = us; } - /** location to write the current stats to */ + /** + * Retrieves the location to write the current stats to + * @return the name of the file + */ public String getStatFile() { return _statFile; } + + /** + * Sets the name of the location we write the current stats to + * @param statFile the name of the file + */ public void setStatFile(String statFile) { _statFile = statFile; } - /** how many minutes of statistics should be maintained within the window for this client? */ + /** + * Retrieves how many minutes of statistics should be maintained within the window for this client + * @return the number of minutes + */ public int getStatDuration() { return _statDuration; } + + /** + * Sets how many minutes of statistics should be maintained within the window for this client + * @param durationMinutes the number of minutes + */ public void setStatDuration(int durationMinutes) { _statDuration = durationMinutes; } - /** how frequenty the stats are written out (in seconds) */ + /** + * Retrieves how frequently the stats are written out (in seconds) + * @return the frequency in seconds + */ public int getStatFrequency() { return _statFrequency; } + + /** + * Sets how frequently the stats are written out (in seconds) + * @param freqSeconds the frequency in seconds + */ public void setStatFrequency(int freqSeconds) { _statFrequency = freqSeconds; } - /** how frequenty we send messages to the peer (in seconds) */ + /** + * Retrieves how frequenty we send messages to the peer (in seconds) + * @return the frequency in seconds + */ public int getSendFrequency() { return _sendFrequency; } + + /** + * Sets how frequenty we send messages to the peer (in seconds) + * @param freqSeconds the frequency in seconds + */ public void setSendFrequency(int freqSeconds) { _sendFrequency = freqSeconds; } /** - * How many bytes should the ping messages be (min values ~700, max ~32KB)? - * + * Retrieves how many bytes the ping messages should be + * (min values ~700, max ~32KB) + * @return the size in bytes */ public int getSendSize() { return _sendSize; } + + /** + * Sets how many bytes the ping messages should be + * (min values ~700, max ~32KB) + * @param numBytes the size in bytes + */ public void setSendSize(int numBytes) { _sendSize = numBytes; } /** - * Brief 1 line description of the test. Useful comments are along the lines - * of "The peer is located on a fast router and connection with 2 hop tunnels". - * + * Retrieves the brief, 1 line description of the test. + * Useful comments are along the lines of "The peer is located on a fast router and connection with 2 hop tunnels". + * + * @return the brief comment */ public String getComment() { return _comment; } + /** + * Sets a brief, 1 line description (comment) of the test. + * @param comment the brief comment + */ public void setComment(String comment) { _comment = comment; } /** - * Periods that the client's tests should be averaged over. - * + * Retrieves the periods that the client's tests should be averaged over. * @return list of periods (in minutes) that the data should be averaged over, or null */ public int[] getAveragePeriods() { return _averagePeriods; } + + /** + * Sets the periods that the client's tests should be averaged over. + * @param periods the list of periods (in minutes) that the data should be averaged over, or null + */ public void setAveragePeriods(int periods[]) { _averagePeriods = periods; } /** - * How many hops is this test engine configured to use for its outbound and inbound tunnels? - * + * Retrieves how many hops this test engine is configured to use for its outbound and inbound tunnels + * @return the number of hops */ public int getNumHops() { return _numHops; } + + /** + * Sets how many hops this test engine is configured to use for its outbound and inbound tunnels + * @param numHops the number of hops + */ public void setNumHops(int numHops) { _numHops = numHops; } /** * Load the client config from the properties specified, deriving the current * config entry from the peer number. * + * @param clientConfig the properties to load from + * @param peerNum the number associated with the peer * @return true if it was loaded correctly, false if there were errors */ public boolean load(Properties clientConfig, int peerNum) { @@ -138,8 +255,9 @@ public class ClientConfig { if ( (peerVal == null) || (statFileVal == null) || (statDurationVal == null) || (statFrequencyVal == null) || (sendFrequencyVal == null) || (sendSizeVal == null) ) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Peer number "+ peerNum + " does not exist"); + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Peer number "+ peerNum + " does not exist"); + } return false; } @@ -151,25 +269,29 @@ public class ClientConfig { int sendSize = getInt(sendSizeVal); if ( (duration <= 0) || (statFreq <= 0) || (sendFreq <= 0) || (sendSize <= 0) ) { - if (_log.shouldLog(Log.WARN)) + if (_log.shouldLog(Log.WARN)) { _log.warn("Invalid client config: duration [" + statDurationVal + "] stat frequency [" + statFrequencyVal + "] send frequency [" + sendFrequencyVal + "] send size [" + sendSizeVal + "]"); + } return false; } statFileVal = statFileVal.trim(); if (statFileVal.length() <= 0) { - if (_log.shouldLog(Log.WARN)) + if (_log.shouldLog(Log.WARN)) { _log.warn("Stat file is blank for peer " + peerNum); + } return false; } Destination d = new Destination(); d.fromBase64(peerVal); - if (commentVal == null) - commentVal = ""; - commentVal = commentVal.trim(); + if (commentVal == null) { + commentVal = ""; + } + + commentVal = commentVal.trim(); commentVal = commentVal.replace('\n', '_'); List periods = new ArrayList(4); @@ -178,13 +300,15 @@ public class ClientConfig { while (tok.hasMoreTokens()) { String periodVal = tok.nextToken(); int minutes = getInt(periodVal); - if (minutes > 0) - periods.add(new Integer(minutes)); + if (minutes > 0) { + periods.add(new Integer(minutes)); + } } } int avgPeriods[] = new int[periods.size()]; - for (int i = 0; i < periods.size(); i++) - avgPeriods[i] = ((Integer)periods.get(i)).intValue(); + for (int i = 0; i < periods.size(); i++) { + avgPeriods[i] = ((Integer)periods.get(i)).intValue(); + } _comment = commentVal; _statDuration = duration; @@ -205,6 +329,8 @@ public class ClientConfig { * Store the client config to the properties specified, deriving the current * config entry from the peer number. * + * @param clientConfig the properties to store to + * @param peerNum the number associated with the peer * @return true if it was stored correctly, false if there were errors */ public boolean store(Properties clientConfig, int peerNum) { @@ -214,9 +340,11 @@ public class ClientConfig { } String comment = _comment; - if (comment == null) + if (comment == null) { comment = ""; - comment = comment.trim(); + } + + comment = comment.trim(); comment = comment.replace('\n', '_'); StringBuffer buf = new StringBuffer(32); @@ -243,8 +371,9 @@ public class ClientConfig { int i = Integer.parseInt(val); return i; } catch (NumberFormatException nfe) { - if (_log.shouldLog(Log.DEBUG)) - _log.debug("Value [" + val + "] is not a valid integer"); + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Value [" + val + "] is not a valid integer"); + } return -1; } } diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/ClientEngine.java b/apps/heartbeat/java/src/net/i2p/heartbeat/ClientEngine.java index ee5c0b237d..3e08a8d83b 100644 --- a/apps/heartbeat/java/src/net/i2p/heartbeat/ClientEngine.java +++ b/apps/heartbeat/java/src/net/i2p/heartbeat/ClientEngine.java @@ -2,8 +2,8 @@ package net.i2p.heartbeat; import net.i2p.data.Destination; import net.i2p.util.Clock; -import net.i2p.util.Log; import net.i2p.util.I2PThread; +import net.i2p.util.Log; /** * Responsible for actually conducting the tests, coordinating the storing of the @@ -13,7 +13,7 @@ import net.i2p.util.I2PThread; */ class ClientEngine { private static final Log _log = new Log(ClientEngine.class); - /** who can send our pings/ */ + /** who can send our pings? */ private Heartbeat _heartbeat; /** actual test state */ private PeerData _data; @@ -28,7 +28,8 @@ class ClientEngine { /** * Create a new engine that will send its pings through the given heartbeat * system, and will coordinate the test according to the configuration specified. - * + * @param heartbeat the Heartbeat to send pings through + * @param config the Configuration to load configuration from =p */ public ClientEngine(Heartbeat heartbeat, ClientConfig config) { _heartbeat = heartbeat; @@ -50,10 +51,18 @@ class ClientEngine { t.setName("HeartbeatClient " + _id); t.start(); } - /** who are we testing? */ + /** + * Who are we testing? + * @return the Destination (peer) we're testing + */ public Destination getPeer() { return _data.getConfig().getPeer(); } - /** what is our series identifier (used to locally identify a test) */ + + /** + * What is our series identifier (used to locally identify a test) + * @return the series identifier + */ public int getSeriesNum() { return _id; } + /** * receive notification from the heartbeat system that a pong was received in * reply to a ping we have sent. @@ -74,6 +83,10 @@ class ClientEngine { /** our actual heartbeat pumper - this drives the test */ private class ClientRunner implements Runnable { + + /* (non-Javadoc) + * @see java.lang.Runnable#run() + */ public void run() { if (_log.shouldLog(Log.INFO)) _log.info("Starting engine talking to peer " + _data.getConfig().getPeer().calculateHash().toBase64()); diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/Heartbeat.java b/apps/heartbeat/java/src/net/i2p/heartbeat/Heartbeat.java index ec53b0c6f7..d1ac8d73b7 100644 --- a/apps/heartbeat/java/src/net/i2p/heartbeat/Heartbeat.java +++ b/apps/heartbeat/java/src/net/i2p/heartbeat/Heartbeat.java @@ -1,18 +1,16 @@ package net.i2p.heartbeat; -import net.i2p.util.Log; -import net.i2p.util.Clock; -import net.i2p.data.Destination; - -import java.io.IOException; import java.io.File; import java.io.FileInputStream; - +import java.io.IOException; +import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.Properties; -import java.util.Iterator; -import java.util.Date; + +import net.i2p.data.Destination; +import net.i2p.util.Log; /** * Main driver for the heartbeat engine, loading 0 or more tests, firing @@ -73,7 +71,10 @@ public class Heartbeat { /** if there are no command line arguments, load the config from "heartbeat.config" */ public static final String CONFIG_FILE_DEFAULT = "heartbeat.config"; - /** build up a new heartbeat manager, but don't actually do anything */ + /** + * build up a new heartbeat manager, but don't actually do anything + * @param configFile the name of the configuration file + */ public Heartbeat(String configFile) { _configFile = configFile; _clientConfigs = new HashMap(); @@ -94,8 +95,9 @@ public class Heartbeat { fin = new FileInputStream(_configFile); props.load(fin); } catch (IOException ioe) { - if (_log.shouldLog(Log.ERROR)) + if (_log.shouldLog(Log.ERROR)) { _log.error("Error reading the config data", ioe); + } } finally { if (fin != null) try { fin.close(); } catch (IOException ioe) {} } @@ -119,18 +121,25 @@ public class Heartbeat { _adapter.sendPing(peer, seriesNum, now, size); } - /** load up the base data (I2CP config, etc) */ + /** + * load up the base data (I2CP config, etc) + * @param props the properties to load from + */ private void loadBaseConfig(Properties props) { _adapter.loadConfig(props); } - /** load up all of the test config data */ + /** + * load up all of the test config data + * @param props the properties to load from + * */ private void loadClientConfigs(Properties props) { int i = 0; while (true) { ClientConfig config = new ClientConfig(); - if (!config.load(props, i)) - break; + if (!config.load(props, i)) { + break; + } _clientConfigs.put(new Integer(i), config); i++; } @@ -174,14 +183,17 @@ public class Heartbeat { * running any tests.
* * Usage: Heartbeat [configFileName]
+ * @param args the list of args passed to the program from the command-line
*/
public static void main(String args[]) {
String configFile = CONFIG_FILE_DEFAULT;
- if (args.length == 1)
+ if (args.length == 1) {
configFile = args[0];
+ }
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Starting up with config file " + configFile);
+ }
Heartbeat heartbeat = new Heartbeat(configFile);
heartbeat.loadConfig();
heartbeat.connect();
@@ -210,8 +222,9 @@ public class Heartbeat {
* @param data arbitrary payload data
*/
public void receivePing(Destination from, int seriesNum, Date sentOn, byte[] data) {
- if (_adapter.getIsConnected())
- _adapter.sendPong(from, seriesNum, sentOn, data);
+ if (_adapter.getIsConnected()) {
+ _adapter.sendPong(from, seriesNum, sentOn, data);
+ }
}
/**
@@ -225,8 +238,9 @@ public class Heartbeat {
*/
public void receivePong(Destination from, int seriesNum, Date sentOn, Date replyOn, byte[] data) {
ClientEngine engine = (ClientEngine)_clientEngines.get(new Integer(seriesNum));
- if (engine.getPeer().equals(from))
- engine.receivePong(sentOn.getTime(), replyOn.getTime());
+ if (engine.getPeer().equals(from)) {
+ engine.receivePong(sentOn.getTime(), replyOn.getTime());
+ }
}
}
diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/I2PAdapter.java b/apps/heartbeat/java/src/net/i2p/heartbeat/I2PAdapter.java
index a347e66bc1..cabdc2f5c6 100644
--- a/apps/heartbeat/java/src/net/i2p/heartbeat/I2PAdapter.java
+++ b/apps/heartbeat/java/src/net/i2p/heartbeat/I2PAdapter.java
@@ -1,28 +1,26 @@
package net.i2p.heartbeat;
-import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-
-import java.util.Properties;
-import java.util.Date;
import java.util.Arrays;
+import java.util.Date;
+import java.util.Properties;
-import net.i2p.data.DataFormatException;
-import net.i2p.data.DataHelper;
-import net.i2p.client.I2PClientFactory;
+import net.i2p.I2PException;
import net.i2p.client.I2PClient;
+import net.i2p.client.I2PClientFactory;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
import net.i2p.client.I2PSessionListener;
-import net.i2p.I2PException;
-
+import net.i2p.data.DataFormatException;
+import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
-import net.i2p.util.Log;
import net.i2p.util.Clock;
+import net.i2p.util.Log;
/**
* Tie-in to the I2P SDK for the Heartbeat system, talking to the I2PSession and
@@ -69,6 +67,9 @@ class I2PAdapter {
/** by default, use 2 hop tunnels */
public static final int NUMHOPS_DEFAULT = 2;
+ /**
+ * Constructs an I2PAdapter . . .
+ */
public I2PAdapter() {
_privateDestFile = null;
_i2cpHost = null;
@@ -79,22 +80,40 @@ class I2PAdapter {
_numHops = 0;
}
- /** who are we? */
+ /**
+ * who are we?
+ * @return the destination (us)
+ */
public Destination getLocalDestination() { return _localDest; }
- /** who gets notified when we receive a ping or a pong? */
+ /**
+ * who gets notified when we receive a ping or a pong?
+ * @return the event listener who gets notified
+ */
public PingPongEventListener getListener() { return _listener; }
+
+
+ /**
+ * Sets who gets notified when we receive a ping or a pong
+ * @param listener the event listener to get notified
+ */
public void setListener(PingPongEventListener listener) { _listener = listener; }
- /** how many hops do we want in our tunnels? */
+ /**
+ * how many hops do we want in our tunnels?
+ * @return the number of hops
+ */
public int getNumHops() { return _numHops; }
- /** are we connected? */
+ /**
+ * are we connected?
+ * @return true or false . . .
+ */
public boolean getIsConnected() { return _session != null; }
/**
* Read in all of the config data
- *
+ * @param props the properties to load from
*/
void loadConfig(Properties props) {
String privDestFile = props.getProperty(DEST_FILE_PROP, DEST_FILE_DEFAULT);
@@ -106,16 +125,18 @@ class I2PAdapter {
try {
portNum = Integer.parseInt(port);
} catch (NumberFormatException nfe) {
- if (_log.shouldLog(Log.WARN))
- _log.warn("Invalid I2CP port specified [" + port + "]");
+ if (_log.shouldLog(Log.WARN)) {
+ _log.warn("Invalid I2CP port specified [" + port + "]");
+ }
portNum = I2CP_PORT_DEFAULT;
}
int hops = -1;
try {
hops = Integer.parseInt(numHops);
} catch (NumberFormatException nfe) {
- if (_log.shouldLog(Log.WARN))
- _log.warn("Invalid # hops specified [" + numHops + "]");
+ if (_log.shouldLog(Log.WARN)) {
+ _log.warn("Invalid # hops specified [" + numHops + "]");
+ }
hops = NUMHOPS_DEFAULT;
}
@@ -125,21 +146,30 @@ class I2PAdapter {
_i2cpPort = portNum;
}
- /** write out the config to the props */
+ /**
+ * write out the config to the props
+ * @param props the properties to write to
+ */
void storeConfig(Properties props) {
- if (_privateDestFile != null)
+ if (_privateDestFile != null) {
props.setProperty(DEST_FILE_PROP, _privateDestFile);
- else
+ } else {
props.setProperty(DEST_FILE_PROP, DEST_FILE_DEFAULT);
- if (_i2cpHost != null)
+ }
+
+ if (_i2cpHost != null) {
props.setProperty(I2CP_HOST_PROP, _i2cpHost);
- else
+ } else {
props.setProperty(I2CP_HOST_PROP, I2CP_HOST_DEFAULT);
- if (_i2cpPort > 0)
+ }
+
+ if (_i2cpPort > 0) {
props.setProperty(I2CP_PORT_PROP, ""+_i2cpPort);
- else
+ } else {
props.setProperty(I2CP_PORT_PROP, ""+I2CP_PORT_DEFAULT);
- props.setProperty(NUMHOPS_PROP, ""+_numHops);
+ }
+
+ props.setProperty(NUMHOPS_PROP, ""+_numHops);
}
private static final int TYPE_PING = 0;
@@ -170,21 +200,26 @@ class I2PAdapter {
baos.write(paddingData);
boolean sent = _session.sendMessage(peer, baos.toByteArray());
if (!sent) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Error sending the ping to " + peer.calculateHash().toBase64() + " for series " + seriesNum);
+ }
} else {
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Ping sent to " + peer.calculateHash().toBase64() + " for series " + seriesNum);
+ }
}
} catch (IOException ioe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error sending the ping", ioe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error sending the ping", ioe);
+ }
} catch (DataFormatException dfe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error writing out the ping message", dfe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error writing out the ping message", dfe);
+ }
} catch (I2PSessionException ise) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error writing out the ping message", ise);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error writing out the ping message", ise);
+ }
}
}
@@ -211,27 +246,33 @@ class I2PAdapter {
baos.write(data);
boolean sent = _session.sendMessage(peer, baos.toByteArray());
if (!sent) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Error sending the pong to " + peer.calculateHash().toBase64() + " for series " + seriesNum + " which was sent on " + sentOn);
+ }
} else {
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Pong sent to " + peer.calculateHash().toBase64() + " for series " + seriesNum + " which was sent on " + sentOn);
+ }
}
} catch (IOException ioe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error sending the ping", ioe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error sending the ping", ioe);
+ }
} catch (DataFormatException dfe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error writing out the pong message", dfe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error writing out the pong message", dfe);
+ }
} catch (I2PSessionException ise) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error writing out the pong message", ise);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error writing out the pong message", ise);
+ }
}
}
/**
* We've received this data from I2P - parse it into a ping or a pong
* and notify accordingly
+ * @param data the data to handle
*/
private void handleMessage(byte data[]) {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
@@ -243,38 +284,44 @@ class I2PAdapter {
Date sentOn = DataHelper.readDate(bais);
Date receivedOn = null;
if (type == TYPE_PONG) {
- receivedOn = DataHelper.readDate(bais);
+ receivedOn = DataHelper.readDate(bais);
}
int size = (int)DataHelper.readLong(bais, 2);
byte payload[] = new byte[size];
int read = DataHelper.read(bais, payload);
- if (read != size)
- throw new IOException("Malformed payload - read " + read + " instead of " + size);
+ if (read != size) {
+ throw new IOException("Malformed payload - read " + read + " instead of " + size);
+ }
if (_listener == null) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Listener isn't set, but we received a valid message of type " + type + " sent from " + from.calculateHash().toBase64());
+ }
return;
}
if (type == TYPE_PING) {
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Ping received from " + from.calculateHash().toBase64() + " on series " + series + " sent on " + sentOn + " containing " + size + " bytes");
+ }
_listener.receivePing(from, series, sentOn, payload);
} else if (type == TYPE_PONG) {
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Pong received from " + from.calculateHash().toBase64() + " on series " + series + " sent on " + sentOn + " with pong sent on " + receivedOn + " containing " + size + " bytes");
+ }
_listener.receivePong(from, series, sentOn, receivedOn, payload);
} else {
- throw new IOException("Invalid message type " + type);
+ throw new IOException("Invalid message type " + type);
}
} catch (IOException ioe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error handling the message", ioe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error handling the message", ioe);
+ }
} catch (DataFormatException dfe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error parsing the message", dfe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error parsing the message", dfe);
+ }
}
}
@@ -303,17 +350,20 @@ class I2PAdapter {
session.setSessionListener(lsnr);
session.connect();
_localDest = session.getMyDestination();
- if (_log.shouldLog(Log.INFO))
- _log.info("I2CP Session created and connected as " + _localDest.calculateHash().toBase64());
+ if (_log.shouldLog(Log.INFO)) {
+ _log.info("I2CP Session created and connected as " + _localDest.calculateHash().toBase64());
+ }
_session = session;
_i2pListener = lsnr;
} catch (I2PSessionException ise) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error connecting", ise);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error connecting", ise);
+ }
return false;
} catch (IOException ioe) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Error loading the destionation", ioe);
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Error loading the destionation", ioe);
+ }
return false;
} finally {
if (fin != null) try { fin.close(); } catch (IOException ioe) {}
@@ -325,6 +375,8 @@ class I2PAdapter {
/**
* load, verify, or create a destination
*
+ * @param client the client
+ * @param destFile the file holding the destination
* @return the destination loaded, or null if there was an error
*/
private Destination verifyDestination(I2PClient client, File destFile) {
@@ -335,8 +387,9 @@ class I2PAdapter {
fin = new FileInputStream(destFile);
us = new Destination();
us.readBytes(fin);
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("Existing destination loaded: [" + us.toBase64() + "]");
+ }
} catch (IOException ioe) {
if (fin != null) try { fin.close(); } catch (IOException ioe2) {}
fin = null;
@@ -359,15 +412,18 @@ class I2PAdapter {
try {
fos = new FileOutputStream(destFile);
us = client.createDestination(fos);
- if (_log.shouldLog(Log.INFO))
+ if (_log.shouldLog(Log.INFO)) {
_log.info("New destination created: [" + us.toBase64() + "]");
+ }
} catch (IOException ioe) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Error writing out the destination keys being created", ioe);
+ }
return null;
} catch (I2PException ie) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Error creating the destination", ie);
+ }
return null;
} finally {
if (fos != null) try { fos.close(); } catch (IOException ioe) {}
@@ -378,6 +434,7 @@ class I2PAdapter {
/**
* I2PSession connect options
+ * @return the options as Properties
*/
private Properties getOptions() {
Properties props = new Properties();
@@ -395,8 +452,9 @@ class I2PAdapter {
try {
_session.destroySession();
} catch (I2PSessionException ise) {
- if (_log.shouldLog(Log.ERROR))
+ if (_log.shouldLog(Log.ERROR)) {
_log.error("Error destroying the session", ise);
+ }
}
_session = null;
}
@@ -434,20 +492,34 @@ class I2PAdapter {
*
*/
private class I2PListener implements I2PSessionListener {
- public void disconnected(I2PSession session) {
- if (_log.shouldLog(Log.ERROR))
- _log.error("Session disconnected");
+
+ /* (non-Javadoc)
+ * @see net.i2p.client.I2PSessionListener#disconnected(net.i2p.client.I2PSession)
+ */
+ public void disconnected(I2PSession session) {
+ if (_log.shouldLog(Log.ERROR)) {
+ _log.error("Session disconnected");
+ }
disconnect();
}
+ /* (non-Javadoc)
+ * @see net.i2p.client.I2PSessionListener#errorOccurred(net.i2p.client.I2PSession, java.lang.String, java.lang.Throwable)
+ */
public void errorOccurred(I2PSession session, String message, Throwable error) {
if (_log.shouldLog(Log.ERROR))
_log.error("Error occurred", error);
}
+ /* (non-Javadoc)
+ * @see net.i2p.client.I2PSessionListener#reportAbuse(net.i2p.client.I2PSession, int)
+ */
public void reportAbuse(I2PSession session, int severity) {
if (_log.shouldLog(Log.ERROR))
_log.error("Abuse reported");
}
+ /* (non-Javadoc)
+ * @see net.i2p.client.I2PSessionListener#messageAvailable(net.i2p.client.I2PSession, int, long)
+ */
public void messageAvailable(I2PSession session, int msgId, long size) {
try {
byte data[] = session.receiveMessage(msgId);
diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/PeerData.java b/apps/heartbeat/java/src/net/i2p/heartbeat/PeerData.java
index 8f38e27e6c..64273c2118 100644
--- a/apps/heartbeat/java/src/net/i2p/heartbeat/PeerData.java
+++ b/apps/heartbeat/java/src/net/i2p/heartbeat/PeerData.java
@@ -1,17 +1,17 @@
package net.i2p.heartbeat;
-import net.i2p.util.Clock;
-import net.i2p.util.Log;
-import net.i2p.stat.Rate;
-import net.i2p.stat.RateStat;
-
-import java.util.Arrays;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import net.i2p.stat.Rate;
+import net.i2p.stat.RateStat;
+import net.i2p.util.Clock;
+import net.i2p.util.Log;
+
/**
* Contain the current window of data for a particular series of ping/pong stats
* sent to a peer. This should be periodically kept clean by calling cleanup()
@@ -42,6 +42,10 @@ public class PeerData {
/** synchronize on this when updating _dataPoints or _pendingPings */
private Object _updateLock = new Object();
+ /**
+ * Creates a PeerData . . .
+ * @param config configuration to load from
+ */
public PeerData(ClientConfig config) {
_peer = config;
_dataPoints = new TreeMap();
@@ -54,7 +58,11 @@ public class PeerData {
_lostRate = new RateStat("lostRate", "How frequently we lose messages", "peer", getPeriods(config.getAveragePeriods()));
}
- /** turn the periods (# minutes) into rate periods (# milliseconds) */
+ /**
+ * turn the periods (# minutes) into rate periods (# milliseconds)
+ * @param periods (in minutes)
+ * @return an array of periods (in milliseconds)
+ */
private static long[] getPeriods(int periods[]) {
long rv[] = null;
if (periods == null) periods = new int[0];
@@ -65,22 +73,48 @@ public class PeerData {
return rv;
}
- /** how many pings are still outstanding? */
+ /**
+ * how many pings are still outstanding?
+ * @return the number of pings outstanding
+ */
public int getPendingCount() { synchronized (_updateLock) { return _pendingPings.size(); } }
- /** how many data points are available in the current window? */
+
+ /**
+ * how many data points are available in the current window?
+ * @return the number of datapoints available
+ */
public int getDataPointCount() { synchronized (_updateLock) { return _dataPoints.size(); } }
- /** when did this test begin? */
+
+ /**
+ * when did this test begin?
+ * @return when the test began
+ */
public long getSessionStart() { return _sessionStart; }
- /** how many pings have we sent for this test? */
+
+ /**
+ * how many pings have we sent for this test?
+ * @return the number of pings sent
+ */
public long getLifetimeSent() { return _lifetimeSent; }
- /** how many pongs have we received for this test? */
+
+ /**
+ * how many pongs have we received for this test?
+ * @return the number of pings received
+ */
public long getLifetimeReceived() { return _lifetimeReceived; }
+
+
+ /**
+ * @return the client configuration
+ */
public ClientConfig getConfig() { return _peer; }
/**
* What periods are we averaging the data over (in minutes)?
+ * @return the periods as an array of ints (in minutes)
*/
public int[] getAveragePeriods() { return (_peer.getAveragePeriods() != null ? _peer.getAveragePeriods() : new int[0]); }
+
/**
* average time to send over the given period.
*
@@ -88,6 +122,7 @@ public class PeerData {
* @return milliseconds average, or -1 if we dont track that period
*/
public double getAverageSendTime(int period) { return getAverage(_sendRate, period); }
+
/**
* average time to receive over the given period.
*
@@ -95,6 +130,7 @@ public class PeerData {
* @return milliseconds average, or -1 if we dont track that period
*/
public double getAverageReceiveTime(int period) { return getAverage(_receiveRate, period); }
+
/**
* number of lost messages over the given period.
*
@@ -129,7 +165,7 @@ public class PeerData {
/**
* We have sent the peer a ping on this series (using the send time as given)
- *
+ * @param dateSent when the ping was sent
*/
public void addPing(long dateSent) {
EventDataPoint sent = new EventDataPoint(dateSent);
@@ -239,9 +275,17 @@ public class PeerData {
private long _pongSent;
private long _pongReceived;
+ /**
+ * Creates an EventDataPoint
+ */
public EventDataPoint() {
this(-1);
}
+
+ /**
+ * Creates an EventDataPoint with pingtime associated with it =)
+ * @param pingSentOn the time a ping was sent
+ */
public EventDataPoint(long pingSentOn) {
_wasPonged = false;
_pingSent = pingSentOn;
@@ -249,20 +293,51 @@ public class PeerData {
_pongReceived = -1;
}
- /** when did we send this ping? */
+ /**
+ * when did we send this ping?
+ * @return the time the ping was sent
+ */
public long getPingSent() { return _pingSent; }
- public void setPingSent(long when) { _pingSent = when; }
- /** when did the peer receive the ping? */
+ /**
+ * Set the time the ping was sent
+ * @param when time to set
+ */
+ public void setPingSent(long when) { _pingSent = when; }
+
+ /**
+ * when did the peer receive the ping?
+ * @return the time the ping was receieved
+ */
public long getPongSent() { return _pongSent; }
+
+ /**
+ * Set the time the peer received the ping
+ * @param when the time to set
+ */
public void setPongSent(long when) { _pongSent = when; }
- /** when did we receive the peer's pong? */
+ /**
+ * when did we receive the peer's pong?
+ * @return the time we receieved the pong
+ */
public long getPongReceived() { return _pongReceived; }
+
+ /**
+ * Set the time the peer's pong was receieved
+ * @param when the time to set
+ */
public void setPongReceived(long when) { _pongReceived = when; }
- /** did the peer reply in time? */
+ /**
+ * did the peer reply in time?
+ * @return true or false, whether we got a reply in time */
public boolean getWasPonged() { return _wasPonged; }
+
+ /**
+ * Set whether we receieved the peer's reply in time
+ * @param pong true or false
+ */
public void setWasPonged(boolean pong) { _wasPonged = pong; }
}
}
\ No newline at end of file
diff --git a/apps/heartbeat/java/src/net/i2p/heartbeat/PeerDataWriter.java b/apps/heartbeat/java/src/net/i2p/heartbeat/PeerDataWriter.java
index bee02f26f4..a2378adede 100644
--- a/apps/heartbeat/java/src/net/i2p/heartbeat/PeerDataWriter.java
+++ b/apps/heartbeat/java/src/net/i2p/heartbeat/PeerDataWriter.java
@@ -1,18 +1,17 @@
package net.i2p.heartbeat;
-import net.i2p.util.Log;
-import net.i2p.util.Clock;
-
-import java.io.IOException;
import java.io.File;
import java.io.FileOutputStream;
-
-import java.text.SimpleDateFormat;
+import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
-import java.util.Locale;
+import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
+import java.util.Locale;
+
+import net.i2p.util.Clock;
+import net.i2p.util.Log;
/**
* Actually write out the stats for peer test
@@ -24,6 +23,7 @@ class PeerDataWriter {
/**
* persist the peer state to the location specified in the peer config
*
+ * @param data the peer data to persist
* @return true if it was persisted correctly, false on error
*/
public boolean persist(PeerData data) {
@@ -93,12 +93,25 @@ class PeerDataWriter {
}
private static final SimpleDateFormat _fmt = new SimpleDateFormat("yyyyMMdd.HH:mm:ss.SSS", Locale.UK);
+
+ /**
+ * Converts a time (long) to text
+ * @param when the time to convert
+ * @return the textual representation
+ */
public String getTime(long when) {
synchronized (_fmt) {
return _fmt.format(new Date(when));
}
}
+
private static final DecimalFormat _numFmt = new DecimalFormat("#0", new DecimalFormatSymbols(Locale.UK));
+
+ /**
+ * Converts a number (double) to text
+ * @param val the number to convert
+ * @return the textual representation
+ */
public String getNum(double val) {
synchronized (_numFmt) {
return _numFmt.format(val);