From b7cfcccf59e48a11e83679acdd356883ca09a9dd Mon Sep 17 00:00:00 2001 From: dev Date: Tue, 26 Jul 2011 14:35:30 +0000 Subject: [PATCH] Changed Transl._ to allow for plurality via Translate. Changed method and classname to be more descriptive. Recieve RouterInfo netstatus via enumerator rather than strings for increased translatability. --- src/net/i2p/itoopie/Main.java | 9 ++-- src/net/i2p/itoopie/gui/ConfigurationTab.java | 6 +-- src/net/i2p/itoopie/gui/OverviewTab.java | 12 ++++-- src/net/i2p/itoopie/i18n/Transl.java | 30 +++++++++++++ .../i2pcontrol/methods/GetRouterInfo.java | 35 +++++++++++++++- .../i2pcontrol/methods/RouterInfo.java | 21 +++++++++- .../{RouterRunner.java => RouterManager.java} | 18 ++++---- ...outerRunner.java => SetRouterManager.java} | 18 ++++---- src/net/i2p/itoopie/util/DataHelper.java | 42 +++++++++++++++++++ 9 files changed, 164 insertions(+), 27 deletions(-) rename src/net/i2p/itoopie/i2pcontrol/methods/{RouterRunner.java => RouterManager.java} (65%) rename src/net/i2p/itoopie/i2pcontrol/methods/{SetRouterRunner.java => SetRouterManager.java} (72%) create mode 100644 src/net/i2p/itoopie/util/DataHelper.java diff --git a/src/net/i2p/itoopie/Main.java b/src/net/i2p/itoopie/Main.java index 008037bd4..d4ca04f62 100644 --- a/src/net/i2p/itoopie/Main.java +++ b/src/net/i2p/itoopie/Main.java @@ -36,10 +36,10 @@ import net.i2p.itoopie.i2pcontrol.methods.GetRouterInfo; import net.i2p.itoopie.i2pcontrol.methods.I2PControl.I2P_CONTROL; import net.i2p.itoopie.i2pcontrol.methods.NetworkSetting.NETWORK_SETTING; import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; -import net.i2p.itoopie.i2pcontrol.methods.RouterRunner.ROUTER_RUNNER; +import net.i2p.itoopie.i2pcontrol.methods.RouterManager.ROUTER_MANAGER; import net.i2p.itoopie.i2pcontrol.methods.SetI2PControl; import net.i2p.itoopie.i2pcontrol.methods.SetNetworkSetting; -import net.i2p.itoopie.i2pcontrol.methods.SetRouterRunner; +import net.i2p.itoopie.i2pcontrol.methods.SetRouterManager; import net.i2p.itoopie.security.CertificateHelper; import net.i2p.itoopie.security.ItoopieHostnameVerifier; @@ -95,7 +95,7 @@ public class Main { // Popup Main window. WindowHandler.toggleFrames(); -// testStuff(); // Delete Me + testStuff(); // Delete Me } @SuppressWarnings("static-access") @@ -133,6 +133,7 @@ public class Main { // Try port switching + /* System.out.println("\nI2PControl - Port Switch"); try { HashMap hm = new HashMap(); @@ -261,6 +262,7 @@ public class Main { } catch (InvalidParametersException e) { System.out.println("Bad parameters sent.."); } + */ // Test reading all router info @@ -276,6 +278,7 @@ public class Main { System.out.println("Invalid password.."); } catch (JSONRPC2SessionException e) { System.out.println("Connection failed.."); + e.printStackTrace(); } // Test restart - worked at one point :) Possibly now as well. diff --git a/src/net/i2p/itoopie/gui/ConfigurationTab.java b/src/net/i2p/itoopie/gui/ConfigurationTab.java index c629ccf02..2fc314966 100644 --- a/src/net/i2p/itoopie/gui/ConfigurationTab.java +++ b/src/net/i2p/itoopie/gui/ConfigurationTab.java @@ -36,8 +36,8 @@ import net.i2p.itoopie.i18n.Transl; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.methods.GetNetworkSetting; -import net.i2p.itoopie.i2pcontrol.methods.RouterRunner.ROUTER_RUNNER; -import net.i2p.itoopie.i2pcontrol.methods.SetRouterRunner; +import net.i2p.itoopie.i2pcontrol.methods.RouterManager.ROUTER_MANAGER; +import net.i2p.itoopie.i2pcontrol.methods.SetRouterManager; import net.i2p.itoopie.i2pcontrol.methods.NetworkSetting.NETWORK_SETTING; import net.i2p.itoopie.i2pcontrol.methods.SetNetworkSetting; @@ -396,7 +396,7 @@ public class ConfigurationTab extends TabLogoPanel { JOptionPane.INFORMATION_MESSAGE); if (n == JOptionPane.YES_OPTION){ try { - SetRouterRunner.execute(ROUTER_RUNNER.RESTART); + SetRouterManager.execute(ROUTER_MANAGER.RESTART); StatusHandler.setStatus(Transl._("Restarting I2P node.. ")); } catch (InvalidPasswordException e) { StatusHandler.setStatus(Transl._("Restart failed: ") + DEFAULT_STATUS.INVALID_PASSWORD); diff --git a/src/net/i2p/itoopie/gui/OverviewTab.java b/src/net/i2p/itoopie/gui/OverviewTab.java index e964ee28f..f2954ee0f 100644 --- a/src/net/i2p/itoopie/gui/OverviewTab.java +++ b/src/net/i2p/itoopie/gui/OverviewTab.java @@ -26,7 +26,9 @@ import net.i2p.itoopie.gui.component.multilinelabel.MultiLineLabelUI; import net.i2p.itoopie.i18n.Transl; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.methods.GetRouterInfo; +import net.i2p.itoopie.i2pcontrol.methods.GetRouterInfo.NETWORK_STATUS; import net.i2p.itoopie.i2pcontrol.methods.RouterInfo.ROUTER_INFO; +import net.i2p.itoopie.util.DataHelper; public class OverviewTab extends TabLogoPanel { private static ConfigurationManager _conf = ConfigurationManager.getInstance(); @@ -142,10 +144,12 @@ public class OverviewTab extends TabLogoPanel { lblVersionSpecified.setText((String) em.get(ROUTER_INFO.VERSION)); - lblUptimeSpecified.setText((String) em.get(ROUTER_INFO.UPTIME)); - lblUptimeSpecified.revalidate(); + lblUptimeSpecified.setText(DataHelper.formatDuration((Long) em.get(ROUTER_INFO.UPTIME))); lblStatusSpecified.setText((String) em.get(ROUTER_INFO.STATUS)); - lblNetworkStatusSpecified.setText(((String) em.get(ROUTER_INFO.NETWORK_STATUS)).replace("-", " ")); + Long netStatus = (Long) em.get(ROUTER_INFO.NETWORK_STATUS); + Integer intNetStatus = netStatus.intValue(); + NETWORK_STATUS enumNetStatus = GetRouterInfo.getEnum(intNetStatus); + lblNetworkStatusSpecified.setText(enumNetStatus.toString()); this.getRootPane().repaint(); // Repainting jlabel or jpanel is not enough. @@ -155,6 +159,8 @@ public class OverviewTab extends TabLogoPanel { StatusHandler.setDefaultStatus(DEFAULT_STATUS.INVALID_PASSWORD); } catch (JSONRPC2SessionException e) { StatusHandler.setDefaultStatus(DEFAULT_STATUS.NOT_CONNECTED); + } catch (Exception e){ + e.printStackTrace(); } } diff --git a/src/net/i2p/itoopie/i18n/Transl.java b/src/net/i2p/itoopie/i18n/Transl.java index f6a1997b3..d9d96a69c 100644 --- a/src/net/i2p/itoopie/i18n/Transl.java +++ b/src/net/i2p/itoopie/i18n/Transl.java @@ -9,8 +9,38 @@ public class Transl { return Translate.getString(s, BUNDLE_NAME); } + + /** + * translate a string with a parameter + * This is a lot more expensive than getString(s, ctx), so use sparingly. + * + * @param s string to be translated containing {0} + * The {0} will be replaced by the parameter. + * Single quotes must be doubled, i.e. ' -> '' in the string. + * @param o parameter, not translated. + * To tranlslate parameter also, use _("foo {0} bar", _("baz")) + * Do not double the single quotes in the parameter. + * Use autoboxing to call with ints, longs, floats, etc. + */ public static String _(String s, Object o) { return Translate.getString(s, o, BUNDLE_NAME); } + + /** for {0} and {1} */ + public static String _(String s, Object o, Object o2){ + return Translate.getString(s, o, o2, BUNDLE_NAME); + } + + /** + * Use GNU ngettext + * For .po file format see http://www.gnu.org/software/gettext/manual/gettext.html.gz#Translating-plural-forms + * + * @param n how many + * @param s singluar string, optionally with {0} e.g. "one tunnel" + * @param p plural string optionally with {0} e.g. "{0} tunnels" + */ + public static String getString(int n, String s, String p) { + return Translate.getString( n, s, p, BUNDLE_NAME); + } } diff --git a/src/net/i2p/itoopie/i2pcontrol/methods/GetRouterInfo.java b/src/net/i2p/itoopie/i2pcontrol/methods/GetRouterInfo.java index bfc109e72..7e51eaff1 100644 --- a/src/net/i2p/itoopie/i2pcontrol/methods/GetRouterInfo.java +++ b/src/net/i2p/itoopie/i2pcontrol/methods/GetRouterInfo.java @@ -11,6 +11,7 @@ import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import net.i2p.itoopie.i18n.Transl; import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface; @@ -23,10 +24,37 @@ import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; public class GetRouterInfo { private final static Log _log = LogFactory.getLog(GetRouterInfo.class); + private static HashMap enumMap; + + public static enum NETWORK_STATUS{ + OK { public String toString(){ return Transl._("Ok."); }}, + TESTING { public String toString(){ return Transl._("Testing."); }}, + FIREWALLED { public String toString(){ return Transl._("Firewalled."); }}, + HIDDEN { public String toString(){ return Transl._("Hidden."); }}, + WARN_FIREWALLED_AND_FAST { public String toString(){ return Transl._("Warning, firewalled and fast."); }}, + WARN_FIREWALLED_AND_FLOODFILL { public String toString(){ return Transl._("Warning, firewalled and floodfill."); }}, + WARN_FIREWALLED_WITH_INBOUND_TCP { public String toString(){ return Transl._("Warning, firewalled with inbound TCP enabled."); }}, + WARN_FIREWALLED_WITH_UDP_DISABLED { public String toString(){ return Transl._("Warning, firewalled with UDP disabled."); }}, + ERROR_I2CP { public String toString(){ return Transl._("Error, I2CP issue. Check logs."); }}, + ERROR_CLOCK_SKEW { public String toString(){ return Transl._("Error, clock skew. Try setting system clock."); }}, + ERROR_PRIVATE_TCP_ADDRESS { public String toString(){ return Transl._("Error, private TCP address."); }}, + ERROR_SYMMETRIC_NAT { public String toString(){ return Transl._("Error, behind symmetric NAT. Can't recieve connections."); }}, + ERROR_UDP_PORT_IN_USE { public String toString(){ return Transl._("Error, UDP port already in use."); }}, + ERROR_NO_ACTIVE_PEERS_CHECK_CONNECTION_AND_FIREWALL { public String toString(){ return Transl._("Error, no active peers. Check connection and firewall."); }}, + ERROR_UDP_DISABLED_AND_TCP_UNSET { public String toString(){ return Transl._("Error, UDP disabled and TCP unset."); }} + }; + + + static { + enumMap = new HashMap(); + for (NETWORK_STATUS n : NETWORK_STATUS.values()){ + enumMap.put(n.ordinal(), n); + } + } public static EnumMap execute(ROUTER_INFO ... info) throws InvalidPasswordException, JSONRPC2SessionException{ - + JSONRPC2Request req = new JSONRPC2Request("RouterInfo", JSONRPC2Interface.incrNonce()); @SuppressWarnings("rawtypes") Map outParams = new HashMap(); @@ -67,4 +95,9 @@ public class GetRouterInfo { } return null; } + + + public static NETWORK_STATUS getEnum(Integer key){ + return enumMap.get(key); + } } diff --git a/src/net/i2p/itoopie/i2pcontrol/methods/RouterInfo.java b/src/net/i2p/itoopie/i2pcontrol/methods/RouterInfo.java index dd8ff7be1..832d47c88 100644 --- a/src/net/i2p/itoopie/i2pcontrol/methods/RouterInfo.java +++ b/src/net/i2p/itoopie/i2pcontrol/methods/RouterInfo.java @@ -50,8 +50,27 @@ public class RouterInfo{ TUNNELS_PARTICIPATING { public boolean isReadable(){ return true;} public boolean isWritable(){ return false;} - public String toString() { return "i2p.router.net.tunnels.participating"; }} + public String toString() { return "i2p.router.net.tunnels.participating"; }}, + + KNOWN_PEERS { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "i2p.router.netdb.knownpeers"; }}, + + ACTIVE_PEERS { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "i2p.router.netdb.activepeers"; }}, + FAST_PEERS { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "i2p.router.netdb.fastpeers"; }}, + + HIGH_CAPACITY_PEERS { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "i2p.router.netdb.highcapacitypeers"; }}, + + IS_RESEEDING { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "i2p.router.netdb.isreseeding"; }} }; static { diff --git a/src/net/i2p/itoopie/i2pcontrol/methods/RouterRunner.java b/src/net/i2p/itoopie/i2pcontrol/methods/RouterManager.java similarity index 65% rename from src/net/i2p/itoopie/i2pcontrol/methods/RouterRunner.java rename to src/net/i2p/itoopie/i2pcontrol/methods/RouterManager.java index 43054d13a..8e6fe4e40 100644 --- a/src/net/i2p/itoopie/i2pcontrol/methods/RouterRunner.java +++ b/src/net/i2p/itoopie/i2pcontrol/methods/RouterManager.java @@ -7,15 +7,15 @@ import java.util.HashMap; * Describes the ways a I2P router can be restarted. * @author hottuna */ -public class RouterRunner{ - private final static HashMap enumMap; +public class RouterManager{ + private final static HashMap enumMap; /** * Describes the ways a I2P router can be restarted. * @author hottuna */ - public enum ROUTER_RUNNER implements Remote{ + public enum ROUTER_MANAGER implements Remote{ RESTART { public boolean isReadable(){ return true;} public boolean isWritable(){ return false;} public String toString() { return "Restart"; }}, @@ -30,17 +30,21 @@ public class RouterRunner{ SHUTDOWN_GRACEFUL { public boolean isReadable(){ return true;} public boolean isWritable(){ return false;} - public String toString() { return "ShutdownGraceful"; }} + public String toString() { return "ShutdownGraceful"; }}, + + RESEED { public boolean isReadable(){ return true;} + public boolean isWritable(){ return false;} + public String toString() { return "Reseed"; }} }; static { - enumMap = new HashMap(); - for (ROUTER_RUNNER n : ROUTER_RUNNER.values()){ + enumMap = new HashMap(); + for (ROUTER_MANAGER n : ROUTER_MANAGER.values()){ enumMap.put(n.toString(), n); } } - public static ROUTER_RUNNER getEnum(String key){ + public static ROUTER_MANAGER getEnum(String key){ return enumMap.get(key); } } diff --git a/src/net/i2p/itoopie/i2pcontrol/methods/SetRouterRunner.java b/src/net/i2p/itoopie/i2pcontrol/methods/SetRouterManager.java similarity index 72% rename from src/net/i2p/itoopie/i2pcontrol/methods/SetRouterRunner.java rename to src/net/i2p/itoopie/i2pcontrol/methods/SetRouterManager.java index e66ebe075..931f7186c 100644 --- a/src/net/i2p/itoopie/i2pcontrol/methods/SetRouterRunner.java +++ b/src/net/i2p/itoopie/i2pcontrol/methods/SetRouterManager.java @@ -14,20 +14,20 @@ import net.i2p.itoopie.i2pcontrol.InvalidParametersException; import net.i2p.itoopie.i2pcontrol.InvalidPasswordException; import net.i2p.itoopie.i2pcontrol.JSONRPC2Interface; import net.i2p.itoopie.i2pcontrol.UnrecoverableFailedRequestException; -import net.i2p.itoopie.i2pcontrol.methods.RouterRunner.ROUTER_RUNNER; +import net.i2p.itoopie.i2pcontrol.methods.RouterManager.ROUTER_MANAGER; import com.thetransactioncompany.jsonrpc2.JSONRPC2Request; import com.thetransactioncompany.jsonrpc2.JSONRPC2Response; import com.thetransactioncompany.jsonrpc2.client.JSONRPC2SessionException; -public class SetRouterRunner { - private final static Log _log = LogFactory.getLog(SetRouterRunner.class); +public class SetRouterManager { + private final static Log _log = LogFactory.getLog(SetRouterManager.class); - public static EnumMap execute(ROUTER_RUNNER cmd) + public static EnumMap execute(ROUTER_MANAGER cmd) throws InvalidPasswordException, JSONRPC2SessionException{ - JSONRPC2Request req = new JSONRPC2Request("RouterRunner", JSONRPC2Interface.incrNonce()); + JSONRPC2Request req = new JSONRPC2Request("RouterManager", JSONRPC2Interface.incrNonce()); Map outParams = new HashMap(); @@ -41,11 +41,11 @@ public class SetRouterRunner { HashMap map = (HashMap) resp.getResult(); if (map != null){ Set inputSet = map.entrySet(); - EnumMap output = new EnumMap(ROUTER_RUNNER.class); + EnumMap output = new EnumMap(ROUTER_MANAGER.class); // Present the result as an map. for (Entry e: inputSet){ String key = (String) e.getKey(); - ROUTER_RUNNER RR = RouterRunner.getEnum(key); + ROUTER_MANAGER RR = RouterManager.getEnum(key); // If the enum exists. They should exists, but safety first. if (RR != null){ output.put(RR, e.getValue()); @@ -53,10 +53,10 @@ public class SetRouterRunner { } return output; } else { - return new EnumMap(ROUTER_RUNNER.class); + return new EnumMap(ROUTER_MANAGER.class); } } catch (UnrecoverableFailedRequestException e) { - _log.error("setRouterRunner failed.", e); + _log.error("setRouterManager failed.", e); } catch (InvalidParametersException e) { _log.error("Remote host rejected provided parameters: " + req.toJSON().toJSONString()); } diff --git a/src/net/i2p/itoopie/util/DataHelper.java b/src/net/i2p/itoopie/util/DataHelper.java new file mode 100644 index 000000000..1f75b06d9 --- /dev/null +++ b/src/net/i2p/itoopie/util/DataHelper.java @@ -0,0 +1,42 @@ +package net.i2p.itoopie.util; + +import net.i2p.itoopie.i18n.Transl; + +public class DataHelper { + + + /** + * Like formatDuration but with a non-breaking space after the number, + * 0 is unitless, and the unit is translated. + * This seems consistent with most style guides out there. + * Thresholds are a little lower than in formatDuration() also, + * as precision is less important in the GUI than in logging. + */ + public static String formatDuration(long ms) { + String t; + if (ms == 0) { + return "0"; + } else if (ms < 3 * 1000) { + // milliseconds + // Note to translators, may be negative or zero, 2999 maximum. + // {0,number,####} prevents 1234 from being output as 1,234 in the English locale. + // If you want the digit separator in your locale, translate as {0}. + return Transl._("1 ms", "{0,number,####} ms", (int) ms); + } else if (ms < 2 * 60 * 1000) { + // seconds + return Transl._("1 sec", "{0} sec", (int) (ms / 1000)); + } else if (ms < 120 * 60 * 1000) { + // minutes + return Transl._("1 min", "{0} min", (int) (ms / (60 * 1000))); + } else if (ms < 2 * 24 * 60 * 60 * 1000) { + // hours + return Transl._("1 hour", "{0} hours", (int) (ms / (60 * 60 * 1000))); + } else if (ms > 1000l * 24l * 60l * 60l * 1000l) { + // >1000 days + return Transl._("n/a"); + } else { + // days + return Transl._("1 day", "{0} days", (int) (ms / (24 * 60 * 60 * 1000))); + } + } +}