diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 463d44618e..cbfd7b48a5 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -7,13 +7,11 @@ import java.io.Serializable; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.DecimalFormat; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.List; @@ -1803,11 +1801,8 @@ public class I2PSnarkServlet extends BasicServlet { out.write(formatSize(total-remaining) + thinsp(noThinsp) + formatSize(total)); out.write(""); } else if (remaining == 0) { - // needs locale configured for automatic translation - SimpleDateFormat fmt = new SimpleDateFormat("HH:mm, EEE dd MMM yyyy"); - fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context)); long[] dates = _manager.getSavedAddedAndCompleted(snark); - String date = fmt.format(new Date(dates[1])); + String date = DataHelper.formatTime(dates[1]); out.write("
").append(fmt.format(new Date(c.getTime()))); + buf.append(" | ").append(DataHelper.formatTime(c.getTime())); buf.append(" | ");
if (esc) {
if (c.getText() != null) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java
index 8c43b66a3e..d84922af77 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/ConnThrottler.java
@@ -1,8 +1,6 @@
package net.i2p.i2ptunnel;
-import java.text.DateFormat;
import java.util.ArrayList;
-import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -38,7 +36,6 @@ class ConnThrottler {
private long _totalThrottleUntil;
private final String _action;
private final Log _log;
- private final DateFormat _fmt;
private final SimpleTimer2.TimedEvent _cleaner;
private boolean _isRunning;
@@ -58,9 +55,6 @@ class ConnThrottler {
_peers = new HashMap"); - out.write(fmt.format(date)); + // Warning - update NewsHandler.parseNews() if you change the format + out.write(DataHelper.formatDate(e.updated)); out.write(": "); out.write(e.title); out.write("\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java index e2109946d2..69dae13273 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFeedHelper.java @@ -65,7 +65,7 @@ public class NewsFeedHelper extends HelperBase { } } if (!entries.isEmpty()) { - DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT); + DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM); // the router sets the JVM time zone to UTC but saves the original here so we can get it fmt.setTimeZone(SystemVersion.getSystemTimeZone(ctx)); int i = 0; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java index 9c2d62f209..1a058a99cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java @@ -4,8 +4,6 @@ import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Reader; -import java.text.SimpleDateFormat; -import java.util.Date; import net.i2p.data.DataHelper; import net.i2p.router.RouterContext; @@ -201,7 +199,7 @@ public class NewsHelper extends ContentHelper { /** * Convert long date stamp to - * '07-Jul 21:09 UTC' with month name in the system locale + * date/time in the system locale, local time zone * @return null if ver = null * @since 0.9.4 moved from NewsFetcher */ @@ -209,7 +207,7 @@ public class NewsHelper extends ContentHelper { if (ver != null) { try { long modtime = Long.parseLong(ver); - return (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC"; + return DataHelper.formatTime(modtime); } catch (NumberFormatException nfe) {} } return null; diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java index 9b0d472f53..e5647f0ae8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigClientsHelper.java @@ -1,11 +1,9 @@ package net.i2p.router.web.helpers; import java.text.Collator; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; -import java.util.Date; import java.util.List; import java.util.Locale; import java.util.Properties; @@ -289,7 +287,7 @@ public class ConfigClientsHelper extends HelperBase { ms = Long.parseLong(s); } catch (NumberFormatException nfe) {} if (ms > 0) { - String date = (new SimpleDateFormat("yyyy-MM-dd HH:mm")).format(new Date(ms)); + String date = DataHelper.formatTime(ms); desc.append("")
.append(_t("Date")).append(" | ").append(date);
}
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java
index 2f67328c24..0632f6cfd4 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/EventLogHelper.java
@@ -2,12 +2,9 @@ package net.i2p.router.web.helpers;
import java.io.IOException;
import java.text.Collator;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -187,17 +184,13 @@ public class EventLogHelper extends FormHandler {
}
buf.append(" | ");
- buf.append(fmt.format(new Date(time)));
+ buf.append(DataHelper.formatTime(time));
buf.append(" | ");
if (isAll) {
String[] s = DataHelper.split(event, " ", 2);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java
index 859f7f07fe..4b9c08c66d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SummaryBarRenderer.java
@@ -3,9 +3,7 @@ package net.i2p.router.web.helpers;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
-import java.text.DateFormat;
import java.util.Collections;
-import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -972,9 +970,6 @@ class SummaryBarRenderer {
entries = nmgr.getEntries();
}
if (!entries.isEmpty()) {
- DateFormat fmt = DateFormat.getDateInstance(DateFormat.SHORT);
- // the router sets the JVM time zone to UTC but saves the original here so we can get it
- fmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
int i = 0;
// show a min of 1, max of 3, none older than 60 days over min
// Except, if news fetching is disabled, min is 0 and oldest is 7 days.
@@ -1003,9 +998,8 @@ class SummaryBarRenderer {
.append(consoleNonce)
.append("\"");
if (entry.updated > 0) {
- Date date = new Date(entry.updated);
buf.append(" title=\"")
- .append(_t("Published")).append(": ").append(fmt.format(date)).append("\"");
+ .append(_t("Published")).append(": ").append(DataHelper.formatDate(entry.updated)).append("\"");
}
buf.append(">");
buf.append(entry.title)
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java
index 0679b220b6..ae9ffafaaa 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java
@@ -64,7 +64,6 @@ public class SybilRenderer {
private final RouterContext _context;
private final Log _log;
private final DecimalFormat fmt = new DecimalFormat("#0.00");
- private final DateFormat dfmt;
private static final int PAIRMAX = Analysis.PAIRMAX;
private static final int MAX = Analysis.MAX;
@@ -76,8 +75,6 @@ public class SybilRenderer {
public SybilRenderer(RouterContext ctx) {
_context = ctx;
_log = ctx.logManager().getLog(SybilRenderer.class);
- dfmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT);
- dfmt.setTimeZone(SystemVersion.getSystemTimeZone(_context));
}
/**
@@ -209,13 +206,13 @@ public class SybilRenderer {
points = ps.load(date);
} catch (IOException ioe) {
_log.error("loading stored analysis for date: " + date, ioe);
- out.write("Failed to load analysis for " + dfmt.format(new Date(date)) + ": " +
+ out.write("Failed to load analysis for " + DataHelper.formatTime(date) + ": " +
DataHelper.escapeHTML(ioe.toString()));
return;
}
if (points.isEmpty()) {
_log.error("empty stored analysis or bad file format for date: " + date);
- out.write("Corrupt analysis file for " + dfmt.format(new Date(date)) + "");
+ out.write("Corrupt analysis file for " + DataHelper.formatTime(date) + "");
} else {
renderThreatsHTML(out, buf, date, points);
}
@@ -266,7 +263,7 @@ public class SybilRenderer {
buf.append(" selected=\"selected\"");
first = false;
}
- buf.append('>').append(dfmt.format(new Date(date.longValue()))).append("\n");
+ buf.append('>').append(DataHelper.formatTime(date.longValue())).append("\n");
}
buf.append("\n" +
"" +
@@ -366,7 +363,7 @@ public class SybilRenderer {
buf.append(" | \n" +
"Average closest floodfill distance: ").append(fmt.format(avgMinDist)).append(" \n");
@@ -509,7 +506,7 @@ public class SybilRenderer {
List\n" + "Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) - .append("\" Last Changed: ").append(dfmt.format(new Date(_context.routerKeyGenerator().getLastChanged()))).append(" \n" + + .append("\" Last Changed: ").append(DataHelper.formatTime(_context.routerKeyGenerator().getLastChanged())).append(" \n" + "Next Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) .append("\" Rotates in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())).append("\n" + " Routers with Most Threat Points as of " + dfmt.format(new Date(date)) + ""); + buf.append("Routers with Most Threat Points as of " + DataHelper.formatTime(date) + ""); for (Hash h : warns) { Points pp = points.get(h); double p = pp.getPoints(); diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java index c20c2e4302..7bb9b21877 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java @@ -279,7 +279,7 @@ public class AddressBean String d = getProp(key); if (d.length() > 0) { try { - d = FormatDate.format(Long.parseLong(d)); + d = DataHelper.formatTime(Long.parseLong(d)); } catch (NumberFormatException nfe) {} } return d; diff --git a/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java b/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java deleted file mode 100644 index cc582d3c98..0000000000 --- a/apps/susidns/src/java/src/i2p/susi/dns/FormatDate.java +++ /dev/null @@ -1,29 +0,0 @@ -package i2p.susi.dns; - -import java.util.Date; -import java.text.DateFormat; - -import net.i2p.util.SystemVersion; - -/** - * Format a date in local time zone - * @since 0.8.7 - */ -public abstract class FormatDate -{ - private static final DateFormat _dateFormat; - - static { - DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); - // the router sets the JVM time zone to UTC but saves the original here so we can get it - fmt.setTimeZone(SystemVersion.getSystemTimeZone()); - _dateFormat = fmt; - } - - public static String format(long date) - { - synchronized(_dateFormat) { - return _dateFormat.format(new Date(date)); - } - } -} diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java index 08b962be51..05ee120c75 100644 --- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java +++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java @@ -386,12 +386,10 @@ class Mail { private static final DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm"); private static final DateFormat localDateFormatter = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); - private static final DateFormat longLocalDateFormatter = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); static { // the router sets the JVM time zone to UTC but saves the original here so we can get it TimeZone tz = SystemVersion.getSystemTimeZone(); localDateFormatter.setTimeZone(tz); - longLocalDateFormatter.setTimeZone(tz); } /** @@ -403,8 +401,8 @@ class Mail { synchronized(dateFormatter) { formattedDate = dateFormatter.format( date ); localFormattedDate = localDateFormatter.format( date ); - quotedDate = longLocalDateFormatter.format(date); } + quotedDate = DataHelper.formatTime(dateLong); } /** diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 11e2197af0..1aa87e7b27 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -26,6 +26,7 @@ import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.MessageDigest; +import java.text.DateFormat; import java.text.DecimalFormat; import java.util.Arrays; import java.util.Collection; @@ -107,6 +108,17 @@ public class DataHelper { private static final Pattern ILLEGAL_KEY = Pattern.compile("[#=\r\n;]"); private static final Pattern ILLEGAL_VALUE = Pattern.compile("[#\r\n]"); + /** + * The default formatting for date/time, current locale, local time zone + * @since 0.9.43 + */ + private static final DateFormat DATE_FORMAT = DateFormat.getDateInstance(DateFormat.MEDIUM); + private static final DateFormat TIME_FORMAT = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT); + static { + DATE_FORMAT.setTimeZone(SystemVersion.getSystemTimeZone()); + TIME_FORMAT.setTimeZone(SystemVersion.getSystemTimeZone()); + } + /** Read a mapping from the stream, as defined by the I2P data structure spec, * and store it into a Properties object. * @@ -1608,6 +1620,34 @@ public class DataHelper { default: return bytes + space; } } + + /** + * The default formatting for date, current locale, local time zone. + * Warning - NOT UTC! + * Examples: + * en: Aug 30, 2019 + * de: 30.08.2019 + * @since 0.9.43 + */ + public static String formatDate(long now) { + synchronized(DATE_FORMAT) { + return DATE_FORMAT.format(new Date(now)); + } + } + + /** + * The default formatting for date/time, current locale, local time zone. + * Warning - NOT UTC! + * Examples: + * en: Aug 30, 2019 12:38 PM + * de: 30.08.2019 12:38 + * @since 0.9.43 + */ + public static String formatTime(long now) { + synchronized(TIME_FORMAT) { + return TIME_FORMAT.format(new Date(now)); + } + } /** * Strip out any HTML (simply removing any less than / greater than symbols) diff --git a/core/java/src/net/i2p/stat/BufferedStatLog.java b/core/java/src/net/i2p/stat/BufferedStatLog.java index 9bf7afffc3..57e4b6a314 100644 --- a/core/java/src/net/i2p/stat/BufferedStatLog.java +++ b/core/java/src/net/i2p/stat/BufferedStatLog.java @@ -5,13 +5,12 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; -import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.StringTokenizer; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.util.I2PThread; import net.i2p.util.Log; @@ -125,7 +124,6 @@ public class BufferedStatLog implements StatLog { } private class StatLogWriter implements Runnable { - private final SimpleDateFormat _fmt = new SimpleDateFormat("yyyyMMdd HH:mm:ss.SSS"); public void run() { int writeStart = -1; int writeEnd = -1; @@ -162,10 +160,7 @@ public class BufferedStatLog implements StatLog { int cur = start; while (cur != end) { //if (shouldLog(_events[cur].getStat())) { - String when = null; - synchronized (_fmt) { - when = _fmt.format(new Date(_events[cur].getTime())); - } + String when = DataHelper.formatTime(_events[cur].getTime()); _out.write(when); _out.write(" "); if (_events[cur].getScope() == null) diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java index 50852992e4..377f80ddf6 100644 --- a/core/java/src/net/i2p/util/LogManager.java +++ b/core/java/src/net/i2p/util/LogManager.java @@ -503,7 +503,7 @@ public class LogManager implements Flushable { return true; try { - SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM); + SimpleDateFormat fmt = (SimpleDateFormat) DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); if (!format.equals("")) fmt.applyPattern(format); // the router sets the JVM time zone to UTC but saves the original here so we can get it @@ -722,9 +722,13 @@ public class LogManager implements Flushable { _format = fmt; } + /** + * Any usage of returned formatter must be synchronized! + */ public SimpleDateFormat getDateFormat() { return _dateFormat; } + public String getDateFormatPattern() { return _dateFormatPattern; } diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index 78ecd11a71..de98e12a7c 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -12,6 +12,7 @@ package net.i2p.util; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; +import java.text.SimpleDateFormat; import java.util.Date; import net.i2p.I2PAppContext; @@ -86,7 +87,11 @@ class LogRecordFormatter { } public static String getWhen(LogManager manager, LogRecord logRecord) { - return manager.getDateFormat().format(new Date(logRecord.getDate())); + SimpleDateFormat fmt = manager.getDateFormat(); + Date d = new Date(logRecord.getDate()); + synchronized(fmt) { + return fmt.format(d); + } } /** don't translate */ diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java index f506d4de36..5b6df3a6ab 100644 --- a/core/java/src/net/i2p/util/SocketTimeout.java +++ b/core/java/src/net/i2p/util/SocketTimeout.java @@ -2,7 +2,6 @@ package net.i2p.util; import java.io.IOException; import java.net.Socket; -import java.text.SimpleDateFormat; import java.util.Date; /** @@ -75,19 +74,16 @@ public class SocketTimeout extends SimpleTimer2.TimedEvent { public void setTimeoutCommand(Runnable job) { _command = job; } - private static final SimpleDateFormat _fmt = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss.SSS"); - private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } } - @Override public String toString() { StringBuilder buf = new StringBuilder(); buf.append("SocketTimeout started on "); - buf.append(ts(_startTime)); + buf.append(new Date(_startTime)); buf.append(" idle for "); buf.append(System.currentTimeMillis() - _lastActivity); buf.append("ms "); if (_totalTimeoutTime > 0) - buf.append("total timeout at ").append(ts(_totalTimeoutTime)); + buf.append("total timeout at ").append(new Date(_totalTimeoutTime)); buf.append("cancelled? ").append(_cancelled); return buf.toString(); } diff --git a/installer/resources/wrapper.config b/installer/resources/wrapper.config index 688092e5b1..d189db165f 100644 --- a/installer/resources/wrapper.config +++ b/installer/resources/wrapper.config @@ -136,7 +136,7 @@ wrapper.app.parameter.1=net.i2p.router.Router #******************************************************************** # Enables Debug output from the Wrapper. # wrapper.debug=TRUE -# Format of output for the console. (See docs for formats) +# Format of output for the console. See below or https://wrapper.tanukisoftware.com/doc/english/prop-logfile-format.html wrapper.console.format=PM # Log Level for console output. (See docs for log levels) diff --git a/router/java/src/com/maxmind/geoip/DatabaseInfo.java b/router/java/src/com/maxmind/geoip/DatabaseInfo.java index 78ff7033de..7c707bfb2f 100644 --- a/router/java/src/com/maxmind/geoip/DatabaseInfo.java +++ b/router/java/src/com/maxmind/geoip/DatabaseInfo.java @@ -67,7 +67,7 @@ public class DatabaseInfo { public static final int NETSPEED_EDITION_REV1 = 32; public static final int NETSPEED_EDITION_REV1_V6 = 33; - private static SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); + private static final SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); private String info; diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java index 505eea2c64..a1cf7a2f28 100644 --- a/router/java/src/net/i2p/router/MessageHistory.java +++ b/router/java/src/net/i2p/router/MessageHistory.java @@ -3,7 +3,6 @@ package net.i2p.router; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Queue; @@ -52,13 +51,9 @@ public class MessageHistory { public final static String PROP_MESSAGE_HISTORY_FILENAME = "router.historyFilename"; public final static String DEFAULT_MESSAGE_HISTORY_FILENAME = "messageHistory.txt"; - private final SimpleDateFormat _fmt; - public MessageHistory(RouterContext context) { _context = context; _log = context.logManager().getLog(getClass()); - _fmt = new SimpleDateFormat("yy/MM/dd.HH:mm:ss.SSS"); - _fmt.setTimeZone(TimeZone.getTimeZone("GMT")); _unwrittenEntries = new LinkedBlockingQueue |