* VersionComparator: Move from TrustedUpdate.java to util

This commit is contained in:
zzz
2010-01-10 16:42:21 +00:00
parent 9ec79f50fa
commit da1a50bfeb
3 changed files with 69 additions and 60 deletions

View File

@ -28,6 +28,7 @@ import net.i2p.data.RouterInfo;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
import net.i2p.router.TunnelPoolSettings; import net.i2p.router.TunnelPoolSettings;
import net.i2p.util.ObjectCounter; import net.i2p.util.ObjectCounter;
import net.i2p.util.VersionComparator;
public class NetDbRenderer { public class NetDbRenderer {
private RouterContext _context; private RouterContext _context;
@ -185,7 +186,7 @@ public class NetDbRenderer {
// versions table // versions table
List<String> versionList = new ArrayList(versions.objects()); List<String> versionList = new ArrayList(versions.objects());
if (versionList.size() > 0) { if (versionList.size() > 0) {
Collections.sort(versionList, Collections.reverseOrder(new TrustedUpdate.VersionComparator())); Collections.sort(versionList, Collections.reverseOrder(new VersionComparator()));
buf.append("<table>\n"); buf.append("<table>\n");
buf.append("<tr><th>" + _("Version") + "</th><th>" + _("Count") + "</th></tr>\n"); buf.append("<tr><th>" + _("Version") + "</th><th>" + _("Count") + "</th></tr>\n");
for (String routerVersion : versionList) { for (String routerVersion : versionList) {

View File

@ -8,7 +8,6 @@ import java.io.IOException;
import java.io.SequenceInputStream; import java.io.SequenceInputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import net.i2p.CoreVersion; import net.i2p.CoreVersion;
@ -19,6 +18,7 @@ import net.i2p.data.Signature;
import net.i2p.data.SigningPrivateKey; import net.i2p.data.SigningPrivateKey;
import net.i2p.data.SigningPublicKey; import net.i2p.data.SigningPublicKey;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.VersionComparator;
/** /**
* <p>Handles DSA signing and verification of update files. * <p>Handles DSA signing and verification of update files.
@ -101,7 +101,6 @@ D8usM7Dxp5yrDrCYZ5AIijc=
-----END PGP SIGNATURE----- -----END PGP SIGNATURE-----
*/ */
private static final String VALID_VERSION_CHARS = "0123456789.";
private static final int VERSION_BYTES = 16; private static final int VERSION_BYTES = 16;
private static final int HEADER_BYTES = Signature.SIGNATURE_BYTES + VERSION_BYTES; private static final int HEADER_BYTES = Signature.SIGNATURE_BYTES + VERSION_BYTES;
private static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys"; private static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys";
@ -187,50 +186,6 @@ D8usM7Dxp5yrDrCYZ5AIijc=
return (new VersionComparator()).compare(currentVersion, newVersion) < 0; return (new VersionComparator()).compare(currentVersion, newVersion) < 0;
} }
/**
* Compares versions.
* Characters other than [0-9.] are ignored.
*/
public static class VersionComparator implements Comparator<String> {
/** l and r non-null */
public int compare(String l, String r) {
// try it the easy way first
if (l.equals(r))
return 0;
StringTokenizer lTokens = new StringTokenizer(sanitize(l), ".");
StringTokenizer rTokens = new StringTokenizer(sanitize(r), ".");
while (lTokens.hasMoreTokens() && rTokens.hasMoreTokens()) {
String lNumber = lTokens.nextToken();
String rNumber = rTokens.nextToken();
int diff = intCompare(lNumber, rNumber);
if (diff != 0)
return diff;
}
if (lTokens.hasMoreTokens() && !rTokens.hasMoreTokens())
return 1;
if (rTokens.hasMoreTokens() && !lTokens.hasMoreTokens())
return -1;
return 0;
}
private static final int intCompare(String lop, String rop) {
int left, right;
try {
left = Integer.parseInt(lop);
} catch (NumberFormatException nfe) {
return -1;
}
try {
right = Integer.parseInt(rop);
} catch (NumberFormatException nfe) {
return 1;
}
return left - right;
}
}
private static final void genKeysCLI(String publicKeyFile, String privateKeyFile) { private static final void genKeysCLI(String publicKeyFile, String privateKeyFile) {
FileOutputStream fileOutputStream = null; FileOutputStream fileOutputStream = null;
@ -263,19 +218,6 @@ D8usM7Dxp5yrDrCYZ5AIijc=
} }
} }
private static final String sanitize(String versionString) {
StringBuilder versionStringBuilder = new StringBuilder(versionString);
for (int i = 0; i < versionStringBuilder.length(); i++) {
if (VALID_VERSION_CHARS.indexOf(versionStringBuilder.charAt(i)) == -1) {
versionStringBuilder.deleteCharAt(i);
i--;
}
}
return versionStringBuilder.toString();
}
private static final void showUsageCLI() { private static final void showUsageCLI() {
System.err.println("Usage: TrustedUpdate keygen publicKeyFile privateKeyFile"); System.err.println("Usage: TrustedUpdate keygen publicKeyFile privateKeyFile");
System.err.println(" TrustedUpdate showversion signedFile"); System.err.println(" TrustedUpdate showversion signedFile");

View File

@ -0,0 +1,66 @@
package net.i2p.util;
import java.util.Comparator;
import java.util.StringTokenizer;
/**
* Compares versions.
* Characters other than [0-9.] are ignored.
* Moved from TrustedUpdate.java
* @since 0.7.10
*/
public class VersionComparator implements Comparator<String> {
/** l and r non-null */
public int compare(String l, String r) {
// try it the easy way first
if (l.equals(r))
return 0;
StringTokenizer lTokens = new StringTokenizer(sanitize(l), ".");
StringTokenizer rTokens = new StringTokenizer(sanitize(r), ".");
while (lTokens.hasMoreTokens() && rTokens.hasMoreTokens()) {
String lNumber = lTokens.nextToken();
String rNumber = rTokens.nextToken();
int diff = intCompare(lNumber, rNumber);
if (diff != 0)
return diff;
}
if (lTokens.hasMoreTokens() && !rTokens.hasMoreTokens())
return 1;
if (rTokens.hasMoreTokens() && !lTokens.hasMoreTokens())
return -1;
return 0;
}
private static final int intCompare(String lop, String rop) {
int left, right;
try {
left = Integer.parseInt(lop);
} catch (NumberFormatException nfe) {
return -1;
}
try {
right = Integer.parseInt(rop);
} catch (NumberFormatException nfe) {
return 1;
}
return left - right;
}
private static final String VALID_VERSION_CHARS = "0123456789.";
private static final String sanitize(String versionString) {
StringBuilder versionStringBuilder = new StringBuilder(versionString);
for (int i = 0; i < versionStringBuilder.length(); i++) {
if (VALID_VERSION_CHARS.indexOf(versionStringBuilder.charAt(i)) == -1) {
versionStringBuilder.deleteCharAt(i);
i--;
}
}
return versionStringBuilder.toString();
}
}