Author: alexlehm Date: 2008-05-20 20:24:40 +0000 (Tue, 20 May 2008) New Revision: 19976
Modified: trunk/apps/Freemail/src/freemail/AccountManager.java trunk/apps/Freemail/src/freemail/AckProcrastinator.java trunk/apps/Freemail/src/freemail/InboundContact.java trunk/apps/Freemail/src/freemail/OutboundContact.java trunk/apps/Freemail/src/freemail/RTSFetcher.java trunk/apps/Freemail/src/freemail/RTSLog.java trunk/apps/Freemail/src/freemail/config/Configurator.java trunk/apps/Freemail/src/freemail/utils/PropsFile.java Log: 0002377: Parent issue for PropsFile conflicting writes problems. (https://bugs.freenetproject.org/view.php?id=2377) resp the child issues 0002344 sending many mails immediately after each makes freemail loose some slots 0002176 Messages are sometimes inserted more than once 0001989 Slot with SSK at key/null changed PropsFile to a factory with Eclipse, we only instantiate every PropsFile once by filename, this should fix the conflicting write problems, but creates a minor memory leak with temp files, as mentioned before. We will fix this later. (Also, I fixed some typos in comments and message strings.) Modified: trunk/apps/Freemail/src/freemail/AccountManager.java =================================================================== --- trunk/apps/Freemail/src/freemail/AccountManager.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/AccountManager.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -183,7 +183,7 @@ } private static PropsFile getAccountFile(File accdir) { - PropsFile accfile = new PropsFile(new File(accdir, ACCOUNT_FILE)); + PropsFile accfile = PropsFile.createPropsFile(new File(accdir, ACCOUNT_FILE)); if (!accdir.exists() || !accfile.exists()) { return null; @@ -193,7 +193,7 @@ } private static PropsFile newAccountFile(File accdir) { - PropsFile accfile = new PropsFile(new File(accdir, ACCOUNT_FILE)); + PropsFile accfile = PropsFile.createPropsFile(new File(accdir, ACCOUNT_FILE)); if (accdir.exists() && !accfile.exists()) { initAccFile(accfile); Modified: trunk/apps/Freemail/src/freemail/AckProcrastinator.java =================================================================== --- trunk/apps/Freemail/src/freemail/AckProcrastinator.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/AckProcrastinator.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -37,8 +37,8 @@ /** Takes simple pieces of data to insert to keys and inserts them at some point * randomly within a given time frame in order to disguise the time at which messages - * were received. This is by no means infalliable, and will only work effectively if - * Freemail is run more or less permanantly. + * were received. This is by no means infallible, and will only work effectively if + * Freemail is run more or less permanently. */ public class AckProcrastinator implements Runnable { /** @@ -78,7 +78,7 @@ int i; for (i = 0; i < acks.length; i++) { - PropsFile ack = new PropsFile(acks[i]); + PropsFile ack = PropsFile.createPropsFile(acks[i]); String s_it = ack.get("nominalInsertTime"); String key = ack.get("key"); @@ -108,10 +108,10 @@ FCPInsertErrorMessage err = fcpcli.put(bis, key); if (err == null) { acks[i].delete(); - Logger.normal(this,"ACK insertion to "+key+" sucessful"); + Logger.normal(this,"ACK insertion to "+key+" successful"); } else if (err.errorcode == FCPInsertErrorMessage.COLLISION) { acks[i].delete(); - Logger.normal(this,"ACK insertion to "+key+" sucessful"); + Logger.normal(this,"ACK insertion to "+key+" successful"); } } catch (FCPBadFileException bfe) { // won't occur @@ -154,7 +154,7 @@ long by = System.currentTimeMillis() + MAX_DELAY; try { - PropsFile ackfile= new PropsFile(File.createTempFile("delayed-ack", "", getAckDir())); + PropsFile ackfile= PropsFile.createPropsFile(File.createTempFile("delayed-ack", "", getAckDir())); ackfile.put("key", key); if (data != null) Modified: trunk/apps/Freemail/src/freemail/InboundContact.java =================================================================== --- trunk/apps/Freemail/src/freemail/InboundContact.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/InboundContact.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -58,7 +58,7 @@ this.ibct_dir.mkdir(); } - this.ibct_props = new PropsFile(new File(this.ibct_dir, IBCT_PROPSFILE)); + this.ibct_props = PropsFile.createPropsFile(new File(this.ibct_dir, IBCT_PROPSFILE)); } public void setProp(String key, String val) { @@ -115,7 +115,7 @@ Logger.normal(this,"Found a message!"); // parse the Freemail header(s) out. - PropsFile msgprops = new PropsFile(msg, true); + PropsFile msgprops = PropsFile.createPropsFile(msg, true); String s_id = msgprops.get("id"); if (s_id == null) { Logger.error(this,"Got a message with an invalid header. Discarding."); @@ -199,7 +199,7 @@ public boolean validateFrom(EmailAddress from) throws IOException, ConnectionTerminatedException { String sd = from.getSubDomain(); if (sd == null) { - // well that's definately not valid. Piffle! + // well that's definitely not valid. Piffle! return false; } Modified: trunk/apps/Freemail/src/freemail/OutboundContact.java =================================================================== --- trunk/apps/Freemail/src/freemail/OutboundContact.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/OutboundContact.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -139,7 +139,7 @@ throw new IOException("Couldn't create outbound contact dir!"); } - this.contactfile = new PropsFile(new File(obctdir, PROPSFILE_NAME)); + this.contactfile = PropsFile.createPropsFile(new File(obctdir, PROPSFILE_NAME)); this.ctoutbox = new File(obctdir, OUTBOX_DIR); if (!this.ctoutbox.exists() && !this.ctoutbox.mkdir()) { throw new IOException("Couldn't create contact outbox!"); @@ -152,7 +152,7 @@ this.address = new EmailAddress(); this.address.domain = ctdir.getName()+".freemail"; - this.contactfile = new PropsFile(new File(ctdir, PROPSFILE_NAME)); + this.contactfile = PropsFile.createPropsFile(new File(ctdir, PROPSFILE_NAME)); this.ctoutbox = new File(ctdir, OUTBOX_DIR); if (!this.ctoutbox.exists()) { @@ -540,7 +540,7 @@ Logger.normal(this,"got mailsite"); - PropsFile mailsite = new PropsFile(mailsite_file); + PropsFile mailsite = PropsFile.createPropsFile(mailsite_file); String rtsksk = mailsite.get("rtsksk"); String keymod_str = mailsite.get("asymkey.modulus"); @@ -834,7 +834,7 @@ this.uid = uid; this.file = new File(ctoutbox, Integer.toString(uid)); - this.index = new PropsFile(new File(ctoutbox, INDEX_FILE)); + this.index = PropsFile.createPropsFile(file); this.slot = this.index.get(uid+".slot"); String s_first = this.index.get(uid+".first_send_time"); Modified: trunk/apps/Freemail/src/freemail/RTSFetcher.java =================================================================== --- trunk/apps/Freemail/src/freemail/RTSFetcher.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/RTSFetcher.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -288,7 +288,7 @@ return false; } - PropsFile rtsprops = new PropsFile(rtsfile); + PropsFile rtsprops = PropsFile.createPropsFile(rtsfile); try { validate_rts(rtsprops); @@ -335,7 +335,7 @@ return false; } - PropsFile mailsite = new PropsFile(msfile); + PropsFile mailsite = PropsFile.createPropsFile(msfile); String their_exponent = mailsite.get("asymkey.pubexponent"); String their_modulus = mailsite.get("asymkey.modulus"); Modified: trunk/apps/Freemail/src/freemail/RTSLog.java =================================================================== --- trunk/apps/Freemail/src/freemail/RTSLog.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/RTSLog.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -39,7 +39,7 @@ private static String UNPROC_NEXTID = "unproc-nextid"; public RTSLog(File f) { - this.logfile = new PropsFile(f); + this.logfile = PropsFile.createPropsFile(f); if (!this.logfile.exists()) { String birth = DateStringFactory.getOffsetKeyString(0); this.logfile.put("birth", birth); Modified: trunk/apps/Freemail/src/freemail/config/Configurator.java =================================================================== --- trunk/apps/Freemail/src/freemail/config/Configurator.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/config/Configurator.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -35,7 +35,7 @@ private final HashMap callbacks; public Configurator(File f) { - this.props = new PropsFile(f); + this.props = PropsFile.createPropsFile(f); this.props.setCommentPrefix("#"); String ls = System.getProperty("line.separator"); StringBuffer head = new StringBuffer(); Modified: trunk/apps/Freemail/src/freemail/utils/PropsFile.java =================================================================== --- trunk/apps/Freemail/src/freemail/utils/PropsFile.java 2008-05-20 16:30:25 UTC (rev 19975) +++ trunk/apps/Freemail/src/freemail/utils/PropsFile.java 2008-05-20 20:24:40 UTC (rev 19976) @@ -31,8 +31,31 @@ import java.util.Iterator; import java.util.Map; import java.util.Set; +import java.util.Hashtable; public class PropsFile { + // substitute static methods for constructor + + static Hashtable propsList=new Hashtable(); + + public static PropsFile createPropsFile(File f, boolean stopAtBlank) { + String fn=f.getPath(); + + PropsFile pf=(PropsFile)propsList.get(fn); + + if(pf!=null) { + return pf; + } else { + pf=new PropsFile(f, stopAtBlank); + propsList.put(fn, pf); + return pf; + } + } + + public static PropsFile createPropsFile(File f) { + return createPropsFile(f, false); + } + private final File file; private HashMap data; private BufferedReader bufrdr; @@ -43,7 +66,7 @@ * a blank line. It's the the caller's responsibility to get * (using the getReader() method) the stream and close it properly. */ - public PropsFile(File f, boolean stopAtBlank) { + private PropsFile(File f, boolean stopAtBlank) { this.file = f; this.data = null; @@ -57,10 +80,6 @@ this.header = null; } - public PropsFile(File f) { - this(f, false); - } - public void setCommentPrefix(String cp) { this.commentPrefix = cp; }
