package net.i2p.router.transport.udp;
import java.io.Serializable;
import java.util.Collections;
import java.util.Comparator;
import net.i2p.data.DataHelper;
/**
* Comparators for various columns
*
* @since 0.9.18 moved from UDPTransport
*/
class Sorters {
static final int FLAG_ALPHA = 0;
static final int FLAG_IDLE_IN = 1;
static final int FLAG_IDLE_OUT = 2;
static final int FLAG_RATE_IN = 3;
static final int FLAG_RATE_OUT = 4;
static final int FLAG_SKEW = 5;
static final int FLAG_CWND= 6;
static final int FLAG_SSTHRESH = 7;
static final int FLAG_RTT = 8;
// static final int FLAG_DEV = 9;
static final int FLAG_RTO = 10;
static final int FLAG_MTU = 11;
static final int FLAG_SEND = 12;
static final int FLAG_RECV = 13;
static final int FLAG_RESEND = 14;
static final int FLAG_DUP = 15;
static final int FLAG_UPTIME = 16;
static final int FLAG_DEBUG = 99;
static Comparator<PeerState> getComparator(int sortFlags) {
Comparator<PeerState> rv;
switch (Math.abs(sortFlags)) {
case FLAG_IDLE_IN:
rv = new IdleInComparator();
break;
case FLAG_IDLE_OUT:
rv = new IdleOutComparator();
break;
case FLAG_RATE_IN:
rv = new RateInComparator();
break;
case FLAG_RATE_OUT:
rv = new RateOutComparator();
break;
case FLAG_UPTIME:
rv = new UptimeComparator();
break;
case FLAG_SKEW:
rv = new SkewComparator();
break;
case FLAG_CWND:
rv = new CwndComparator();
break;
case FLAG_SSTHRESH:
rv = new SsthreshComparator();
break;
case FLAG_RTT:
rv = new RTTComparator();
break;
//case FLAG_DEV:
// rv = new DevComparator();
// break;
case FLAG_RTO:
rv = new RTOComparator();
break;
case FLAG_MTU:
rv = new MTUComparator();
break;
case FLAG_SEND:
rv = new SendCountComparator();
break;
case FLAG_RECV:
rv = new RecvCountComparator();
break;
case FLAG_RESEND:
rv = new ResendComparator();
break;
case FLAG_DUP:
rv = new DupComparator();
break;
case FLAG_ALPHA:
default:
rv = new AlphaComparator();
break;
}
if (sortFlags < 0)
rv = Collections.reverseOrder(rv);
return rv;
}
static class AlphaComparator extends PeerComparator {
}
static class IdleInComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = r.getLastReceiveTime() - l.getLastReceiveTime();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class IdleOutComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = r.getLastSendTime() - l.getLastSendTime();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class RateInComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getReceiveBps() - r.getReceiveBps();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class RateOutComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getSendBps() - r.getSendBps();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class UptimeComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class SkewComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew());
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class CwndComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getSendWindowBytes() - r.getSendWindowBytes();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class SsthreshComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getSlowStartThreshold() - r.getSlowStartThreshold();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class RTTComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getRTT() - r.getRTT();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
/***
static class DevComparator extends PeerComparator {
static final DevComparator _instance = new DevComparator();
public static final DevComparator instance() { return _instance; }
@Override
public int compare(PeerState l, PeerState r) {
long rv = l.getRTTDeviation() - r.getRTTDeviation();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
****/
/** */
static class RTOComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getRTO() - r.getRTO();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class MTUComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
int rv = l.getMTU() - r.getMTU();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return rv;
}
}
static class SendCountComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class RecvCountComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = l.getPacketsReceived() - r.getPacketsReceived();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class ResendComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class DupComparator extends PeerComparator {
@Override
public int compare(PeerState l, PeerState r) {
long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate();
if (rv == 0) // fallback on alpha
return super.compare(l, r);
else
return (int)rv;
}
}
static class PeerComparator implements Comparator<PeerState>, Serializable {
public int compare(PeerState l, PeerState r) {
return DataHelper.compareTo(l.getRemotePeer().getData(), r.getRemotePeer().getData());
}
}
static void appendSortLinks(StringBuilder buf, String urlBase, int sortFlags, String descr, int ascending) {
if (ascending == FLAG_ALPHA) { // 0
buf.append(" <a href=\"").append(urlBase).append("?sort=0" +
"#udpcon\" title=\"").append(descr).append("\"><img src=\"/themes/console/images/inbound.png\" alt=\"V\"></a>");
} else if (sortFlags == ascending) {
buf.append(" <a href=\"").append(urlBase).append("?sort=").append(0-ascending);
buf.append("#udpcon\" title=\"").append(descr).append("\"><img src=\"/themes/console/images/inbound.png\" alt=\"V\"></a>" +
"<b><img src=\"/themes/console/images/outbound.png\" alt=\"^\"></b>");
} else if (sortFlags == 0 - ascending) {
buf.append(" <b><img src=\"/themes/console/images/inbound.png\" alt=\"V\"></b><a href=\"").append(urlBase).append("?sort=").append(ascending);
buf.append("#udpcon\" title=\"").append(descr).append("\"><img src=\"/themes/console/images/outbound.png\" alt=\"^\"></a>");
} else {
buf.append(" <a href=\"").append(urlBase).append("?sort=").append(0-ascending);
buf.append("#udpcon\" title=\"").append(descr).append("\"><img src=\"/themes/console/images/inbound.png\" alt=\"V\"></a>" +
"<a href=\"").append(urlBase).append("?sort=").append(ascending);
buf.append("#udpcon\" title=\"").append(descr).append("\"><img src=\"/themes/console/images/outbound.png\" alt=\"^\"></a>");
}
}
}