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;
        }


Reply via email to