Author: nextgens
Date: 2007-11-22 07:55:28 +0000 (Thu, 22 Nov 2007)
New Revision: 15915

Modified:
   trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java
   trunk/freenet/src/freenet/config/FilePersistentConfig.java
   trunk/freenet/src/freenet/l10n/L10n.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/OpennetManager.java
   trunk/freenet/src/freenet/node/PeerManager.java
   trunk/freenet/src/freenet/node/Persister.java
   trunk/freenet/src/freenet/node/fcp/ClientGet.java
   trunk/freenet/src/freenet/node/fcp/FCPServer.java
   trunk/freenet/src/freenet/node/updater/RevocationChecker.java
   trunk/freenet/src/freenet/pluginmanager/PluginManager.java
   trunk/freenet/src/freenet/support/FileLoggerHook.java
   trunk/freenet/src/freenet/support/SimpleFieldSet.java
   trunk/freenet/src/freenet/support/io/FileUtil.java
Log:
        * Replace most calls to File.renameTo by FileUtil.renameTo
        * Restore the l10n overrides from a backup file if it exists
        * Restore bookmarks from a backup if it exists

It appears to work... but I didn't test it enough to be sure. Make backups 
before updating ;)

Modified: trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java        
2007-11-21 23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/clients/http/bookmark/BookmarkManager.java        
2007-11-22 07:55:28 UTC (rev 15915)
@@ -19,6 +19,8 @@
 import freenet.support.StringArray;
 import freenet.support.URLEncodedFormatException;

+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -32,6 +34,7 @@
     public static final BookmarkCategory PROTECTED_CATEGORY = new 
BookmarkCategory("/protected");
     private final HashMap bookmarks = new HashMap();
     private final File bookmarksFile = new 
File("bookmarks.dat").getAbsoluteFile();
+    private final File backupBookmarksFile = new 
File(bookmarksFile.getParentFile(), bookmarksFile.getName()+".bak");
     private boolean isSavingBookmarks = false;

     public BookmarkManager(NodeClientCore n, SimpleFieldSet oldConfig) {
@@ -89,14 +92,26 @@
                 storeBookmarks();
             }

-            if (bookmarksFile.exists() && bookmarksFile.canRead() && 
bookmarksFile.length() > 0) {
-                Logger.normal(this, "Attempting to read the bookmark file from 
" + bookmarksFile.toString());
-                SimpleFieldSet sfs = SimpleFieldSet.readFrom(bookmarksFile, 
false, true);
-                readBookmarks(MAIN_CATEGORY, sfs);
-            }
+            // Read the backup file if necessary
+            if(!bookmarksFile.exists() || bookmarksFile.length() == 0)
+                throw new IOException();
+            Logger.normal(this, "Attempting to read the bookmark file from " + 
bookmarksFile.toString());
+            SimpleFieldSet sfs = SimpleFieldSet.readFrom(bookmarksFile, false, 
true);
+            readBookmarks(MAIN_CATEGORY, sfs);
         } catch (MalformedURLException mue) {
         } catch (IOException ioe) {
             Logger.error(this, "Error reading the bookmark file (" + 
bookmarksFile.toString() + "):" + ioe.getMessage(), ioe);
+            
+            try {
+                if (backupBookmarksFile.exists() && 
backupBookmarksFile.canRead() && backupBookmarksFile.length() > 0) {
+                    Logger.normal(this, "Attempting to read the backup 
bookmark file from " + backupBookmarksFile.toString());
+                    SimpleFieldSet sfs = 
SimpleFieldSet.readFrom(backupBookmarksFile, false, true);
+                    readBookmarks(MAIN_CATEGORY, sfs);
+                } else
+                    Logger.error(this, "We couldn't find the backup either! - 
"+FileUtil.getCanonicalFile(backupBookmarksFile));
+            } catch (IOException e) {
+                Logger.error(this, "Error reading the backup bookmark file !" 
+ e.getMessage(), e);
+            }
         }
     }

@@ -351,21 +366,16 @@
         }
         FileWriter fw = null;
         try {
-            File tmp = File.createTempFile("bookmark", ".bak", 
bookmarksFile.getParentFile());
-            fw = new FileWriter(tmp);
+            fw = new FileWriter(backupBookmarksFile);
             sfs.writeTo(fw);
-            if (!tmp.renameTo(bookmarksFile)) {
-                Logger.error(this, "Unable to rename " + tmp.toString() + " to 
" + bookmarksFile.toString());
+            
+            if (!FileUtil.renameTo(backupBookmarksFile, bookmarksFile)) {
+                Logger.error(this, "Unable to rename " + 
backupBookmarksFile.toString() + " to " + bookmarksFile.toString());
             }
         } catch (IOException ioe) {
             Logger.error(this, "An error has occured saving the bookmark file 
:" + ioe.getMessage(), ioe);
         } finally {
-            try {
-                if (fw != null) {
-                    fw.close();
-                }
-            } catch (IOException e) {
-            }
+            Closer.close(fw);

             synchronized (bookmarks) {
                 isSavingBookmarks = false;

Modified: trunk/freenet/src/freenet/config/FilePersistentConfig.java
===================================================================
--- trunk/freenet/src/freenet/config/FilePersistentConfig.java  2007-11-21 
23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/config/FilePersistentConfig.java  2007-11-22 
07:55:28 UTC (rev 15915)
@@ -15,6 +15,7 @@

 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
+import freenet.support.io.FileUtil;
 import freenet.support.io.LineReadingInputStream;

 /**
@@ -146,19 +147,7 @@
                        fos.close();
                        throw e;
                }
-               if(!tempFilename.renameTo(filename)) {
-                       if(!filename.delete()) {
-                               Logger.error(this, "Could not delete old config 
file "+filename);
-                               System.err.println("Could not delete old config 
file "+filename+" - we need to delete it in order to replace it with the new 
config file "+tempFilename);
-                       }
-                       if(!tempFilename.renameTo(filename)) {
-                               Logger.error(this, "Could not move new config 
file "+tempFilename+" over old "+filename);
-                               System.err.println("Could not move new config 
file "+tempFilename+" over old "+filename);
-                       } else {
-                               System.err.println("Written "+tempFilename+" 
and moved to "+filename);
-                       }
-               } else {
-                       System.err.println("Written "+filename);
-               }
+                
+                FileUtil.renameTo(tempFilename, filename);
        }
 }

Modified: trunk/freenet/src/freenet/l10n/L10n.java
===================================================================
--- trunk/freenet/src/freenet/l10n/L10n.java    2007-11-21 23:43:52 UTC (rev 
15914)
+++ trunk/freenet/src/freenet/l10n/L10n.java    2007-11-22 07:55:28 UTC (rev 
15915)
@@ -3,7 +3,6 @@
 * http://www.gnu.org/ for further details of the GPL. */
 package freenet.l10n;

-import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -15,6 +14,8 @@
 import freenet.support.HTMLNode;
 import freenet.support.Logger;
 import freenet.support.SimpleFieldSet;
+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;

 /**
 * This class provides a trivial internationalization framework to a Freenet 
node.
@@ -50,11 +51,18 @@
                File tmpFile = new File(L10n.PREFIX + selected + 
L10n.OVERRIDE_SUFFIX);

                try {
-                       if(tmpFile.exists() && tmpFile.canRead()) {
+                       if(tmpFile.exists() && tmpFile.canRead() && 
tmpFile.length() > 0) {
                                Logger.normal(this, "Override file detected : 
let's try to load it");
                                translationOverride = 
SimpleFieldSet.readFrom(tmpFile, false, false);
-                       } else
+                       } else {
+                                // try to restore a backup
+                                File backup = new 
File(tmpFile.getParentFile(), tmpFile.getName()+".bak");
+                                if(backup.exists() && backup.length() > 0) {
+                                    Logger.normal(this, "Override-backup file 
detected : let's try to load it");
+                                    translationOverride = 
SimpleFieldSet.readFrom(backup, false, false);
+                                }
                                translationOverride = null;
+                        }

                } catch (IOException e) {
                        translationOverride = null;
@@ -125,32 +133,22 @@

        private static void _saveTranslationFile() {
                FileOutputStream fos = null;
-               BufferedOutputStream bos = null;
                File finalFile = new File(L10n.PREFIX + 
L10n.getSelectedLanguage() + L10n.OVERRIDE_SUFFIX);

                try {
                        // We don't set deleteOnExit on it : if the save 
operation fails, we want a backup
-                       File tempFile = new File(finalFile.getPath() + "-" + 
System.currentTimeMillis() + ".tmp");
+                       File tempFile = new File(finalFile.getParentFile(), 
finalFile.getName()+".bak");
                        Logger.minor("L10n", "The temporary filename is : " + 
tempFile);

                        fos = new FileOutputStream(tempFile);
-                       bos = new BufferedOutputStream(fos);
+                        L10n.translationOverride.writeTo(fos);

-                       
bos.write(L10n.translationOverride.toOrderedString().getBytes("UTF-8"));
-                       bos.flush();
-                       
-                       
-                       tempFile.renameTo(finalFile);
-                       tempFile.delete();
-                       
+                       FileUtil.renameTo(tempFile, finalFile);
                        Logger.normal("L10n", "Override file saved 
successfully!");
                } catch (IOException e) {
                        Logger.error("L10n", "Error while saving the 
translation override: "+ e.getMessage(), e);
                } finally {
-                       try {
-                               if(bos != null) bos.close();
-                               if(fos != null) fos.close();
-                       } catch (IOException e) {}
+                       Closer.close(fos);
                }
        }


Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-11-21 23:43:52 UTC (rev 
15914)
+++ trunk/freenet/src/freenet/node/Node.java    2007-11-22 07:55:28 UTC (rev 
15915)
@@ -108,6 +108,8 @@
 import freenet.support.api.LongCallback;
 import freenet.support.api.ShortCallback;
 import freenet.support.api.StringCallback;
+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;
 import freenet.support.transport.ip.HostnameSyntaxException;

 /**
@@ -479,20 +481,9 @@
                        BufferedWriter bw = new BufferedWriter(osr);
                        fs.writeTo(bw);
                        bw.close();
-                       if(!backup.renameTo(orig)) {
-                               orig.delete();
-                               if(!backup.renameTo(orig)) {
-                                       Logger.error(this, "Could not rename 
new node file "+backup+" to "+orig);
-                               }
-                       }
+                        FileUtil.renameTo(backup, orig);
                } catch (IOException e) {
-                       if(fos != null) {
-                               try {
-                                       fos.close();
-                               } catch (IOException e1) {
-                                       Logger.error(this, "Cannot close 
"+backup+": "+e1, e1);
-                               }
-                       }
+                        Closer.close(fos);
                }
        }


Modified: trunk/freenet/src/freenet/node/OpennetManager.java
===================================================================
--- trunk/freenet/src/freenet/node/OpennetManager.java  2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/node/OpennetManager.java  2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -32,6 +32,8 @@
 import freenet.support.SimpleFieldSet;
 import freenet.support.SizeUtil;
 import freenet.support.io.ByteArrayRandomAccessThing;
+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;
 import freenet.support.transport.ip.HostnameSyntaxException;

 /**
@@ -152,21 +154,10 @@
                        BufferedWriter bw = new BufferedWriter(osr);
                        fs.writeTo(bw);
                        bw.close();
-                       if(!backup.renameTo(orig)) {
-                               orig.delete();
-                               if(!backup.renameTo(orig)) {
-                                       Logger.error(this, "Could not rename 
new node file "+backup+" to "+orig);
-                               }
-                       }
+                        FileUtil.renameTo(backup, orig);
                } catch (IOException e) {
-                       if(fos != null) {
-                               try {
-                                       fos.close();
-                               } catch (IOException e1) {
-                                       Logger.error(this, "Cannot close 
"+backup+": "+e1, e1);
-                               }
-                       }
-               }
+                        Closer.close(fos);
+                }
        }

        private void readFile(File filename) throws IOException {

Modified: trunk/freenet/src/freenet/node/PeerManager.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerManager.java     2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/node/PeerManager.java     2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -34,6 +34,7 @@
 import freenet.support.Logger;
 import freenet.support.ShortBuffer;
 import freenet.support.SimpleFieldSet;
+import freenet.support.io.FileUtil;

 /**
  * @author amphibian
@@ -886,13 +887,7 @@
                 return; // don't overwrite old file!
             }
             File fnam = new File(filename);
-            if (!new File(f).renameTo(fnam)) {
-                fnam.delete();
-                if (!new File(f).renameTo(fnam)) {
-                    Logger.error(this, "Could not rename " + f + " to "
-                            + filename + " writing peers");
-                }
-            }
+            FileUtil.renameTo(new File(f), fnam);
         }
     }


Modified: trunk/freenet/src/freenet/node/Persister.java
===================================================================
--- trunk/freenet/src/freenet/node/Persister.java       2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/node/Persister.java       2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -12,6 +12,7 @@
 import freenet.support.Logger;
 import freenet.support.OOMHandler;
 import freenet.support.SimpleFieldSet;
+import freenet.support.io.FileUtil;

 class Persister implements Runnable {

@@ -84,21 +85,8 @@
                                Logger.error(this, "Caught while closing: "+e, 
e);
                                return;
                        }
-                       // Try an atomic rename
-                       if(!persistTemp.renameTo(persistTarget)) {
-                               // Not supported on some systems (Windows)
-                               if(!persistTarget.delete()) {
-                                       if(persistTarget.exists()) {
-                                               Logger.error(this, "Could not 
delete "+persistTarget+" - check permissions");
-                                       }
-                               }
-                               if(!persistTemp.renameTo(persistTarget)) {
-                                       Logger.error(this, "Could not rename 
"+persistTemp+" to "+persistTarget+
-                                                       (persistTarget.exists() 
? " (target exists)" : "")+
-                                                       (persistTemp.exists() ? 
" (source exists)" : "")+
-                                                       " - check permissions");
-                               }
-                       }
+
+                        FileUtil.renameTo(persistTemp, persistTarget);
                } catch (FileNotFoundException e) {
                        Logger.error(this, "Could not store throttle data to 
disk: "+e, e);
                        return;

Modified: trunk/freenet/src/freenet/node/fcp/ClientGet.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/ClientGet.java   2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/node/fcp/ClientGet.java   2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -27,6 +27,7 @@
 import freenet.support.api.Bucket;
 import freenet.support.io.CannotCreateFromFieldSetException;
 import freenet.support.io.FileBucket;
+import freenet.support.io.FileUtil;
 import freenet.support.io.NullBucket;
 import freenet.support.io.SerializableToFieldSetBucketUtil;

@@ -399,7 +400,7 @@
                                // Write to temp file, then rename over filename
                                FileOutputStream fos = null;
                                boolean closed = false;
-                               if(!tempFile.renameTo(targetFile)) {
+                               if(!FileUtil.renameTo(tempFile, targetFile)) {
                                        postFetchProtocolErrorMessage = new 
ProtocolErrorMessage(ProtocolErrorMessage.COULD_NOT_RENAME_FILE, false, null, 
identifier, global);
                                        // Don't delete temp file, user might 
want it.
                                }

Modified: trunk/freenet/src/freenet/node/fcp/FCPServer.java
===================================================================
--- trunk/freenet/src/freenet/node/fcp/FCPServer.java   2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/node/fcp/FCPServer.java   2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -45,6 +45,8 @@
 import freenet.support.api.IntCallback;
 import freenet.support.api.LongCallback;
 import freenet.support.api.StringCallback;
+import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;

 /**
  * FCP server process.
@@ -576,28 +578,32 @@
                try {
                        synchronized(persistenceSync) {
                                toFree = 
core.persistentTempBucketFactory.grabBucketsToFree();
+                                
+                                File compressedTemp = new 
File(persistentDownloadsTempFile+".gz");
+                               File compressedFinal = new 
File(persistentDownloadsFile.toString()+".gz");
+                                FileOutputStream fos = null;
+                                BufferedOutputStream bos = null;
+                                GZIPOutputStream gos = null;
+                                OutputStreamWriter osw = null;
+                                BufferedWriter w = null;
                                try {
-                                       File compressedTemp = new 
File(persistentDownloadsTempFile+".gz");
-                                       File compressedFinal = new 
File(persistentDownloadsFile.toString()+".gz");
-                                       FileOutputStream fos = new 
FileOutputStream(compressedTemp);
-                                       BufferedOutputStream bos = new 
BufferedOutputStream(fos);
-                                       GZIPOutputStream gos = new 
GZIPOutputStream(bos);
-                                       OutputStreamWriter osw = new 
OutputStreamWriter(gos, "UTF-8");
-                                       BufferedWriter w = new 
BufferedWriter(osw);
+                                       fos = new 
FileOutputStream(compressedTemp);
+                                       bos = new BufferedOutputStream(fos);
+                                       gos = new GZIPOutputStream(bos);
+                                       osw = new OutputStreamWriter(gos, 
"UTF-8");
+                                       w = new BufferedWriter(osw);
                                        
w.write(Integer.toString(persistentRequests.length)+ '\n');
                                        for(int 
i=0;i<persistentRequests.length;i++)
-                                               persistentRequests[i].write(w);
-                                       w.close();
-                                       
if(!compressedTemp.renameTo(compressedFinal)) {
-                                               if(logMINOR) Logger.minor(this, 
"Rename failed");
-                                               compressedFinal.delete();
-                                               
if(!compressedTemp.renameTo(compressedFinal)) {
-                                                       Logger.error(this, 
"Could not rename persisted requests temp file 
"+persistentDownloadsTempFile+".gz to "+persistentDownloadsFile);
-                                               }
-                                       }
+                                               persistentRequests[i].write(w); 
                                       
                                } catch (IOException e) {
                                        Logger.error(this, "Cannot write 
persistent requests to disk: "+e);
+                                        Closer.close(w);
+                                        Closer.close(osw);
+                                        Closer.close(gos);
+                                        Closer.close(bos);
+                                        Closer.close(fos);
                                }
+                                FileUtil.renameTo(compressedTemp, 
compressedTemp);
                        }
                        if(logMINOR) Logger.minor(this, "Stored persistent 
requests");
                } finally {

Modified: trunk/freenet/src/freenet/node/updater/RevocationChecker.java
===================================================================
--- trunk/freenet/src/freenet/node/updater/RevocationChecker.java       
2007-11-21 23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/node/updater/RevocationChecker.java       
2007-11-22 07:55:28 UTC (rev 15915)
@@ -15,6 +15,7 @@
 import freenet.node.RequestStarter;
 import freenet.support.Logger;
 import freenet.support.io.FileBucket;
+import freenet.support.io.FileUtil;

 /**
  * Fetches the revocation key. Each time it starts, it will try to fetch it 
until it has 3 DNFs. If it ever finds it, it will
@@ -167,13 +168,7 @@
                        Logger.error(this, "No temporary binary blob file 
moving it: may not be able to propagate revocation, bug???");
                        return;
                }
-               if(!tmpBlobFile.renameTo(blobFile)) {
-                       blobFile.delete();
-                       if(!tmpBlobFile.renameTo(blobFile)) {
-                               Logger.error(this, "Not able to rename binary 
blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able 
to tell other peers about this revocation");
-                               System.err.println("Not able to rename binary 
blob for revocation fetcher: "+tmpBlobFile+" -> "+blobFile+" - may not be able 
to tell other peers about this revocation");
-                       }
-               }
+                FileUtil.renameTo(tmpBlobFile, blobFile);
        }

        public void onFailure(FetchException e, ClientGetter state) {

Modified: trunk/freenet/src/freenet/pluginmanager/PluginManager.java
===================================================================
--- trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-11-21 
23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/pluginmanager/PluginManager.java  2007-11-22 
07:55:28 UTC (rev 15915)
@@ -35,6 +35,7 @@
 import freenet.support.api.HTTPRequest;
 import freenet.support.api.StringArrCallback;
 import freenet.support.io.Closer;
+import freenet.support.io.FileUtil;

 public class PluginManager {

@@ -525,7 +526,7 @@
                                Closer.close(pluginInputStream);
                        }

-                       if (!tempPluginFile.renameTo(pluginFile)) {
+                       if (!FileUtil.renameTo(tempPluginFile, pluginFile)) {
                                Logger.error(this, "could not rename temp file 
to plugin file");
                                throw new PluginNotFoundException("could not 
rename temp file to plugin file");
                        }

Modified: trunk/freenet/src/freenet/support/FileLoggerHook.java
===================================================================
--- trunk/freenet/src/freenet/support/FileLoggerHook.java       2007-11-21 
23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/support/FileLoggerHook.java       2007-11-22 
07:55:28 UTC (rev 15915)
@@ -1,7 +1,6 @@
 package freenet.support;

 import java.io.BufferedOutputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.DataInputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -10,7 +9,6 @@
 import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.PrintStream;
-import java.io.PrintWriter;
 import java.net.InetAddress;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -27,6 +25,7 @@
 import java.util.zip.GZIPOutputStream;

 import freenet.node.Version;
+import freenet.support.io.FileUtil;

 /**
  * Converted the old StandardLogger to Ian's loggerhook interface.
@@ -300,8 +299,7 @@
                                                                                
        "Closing alt on change caught " + e);
                                                                }
                                                                if(previousFile 
!= null) {
-                                                                       
previousFile.delete();
-                                                                       
latestFile.renameTo(previousFile);
+                                                                        
FileUtil.renameTo(latestFile, previousFile);
                                                                        
latestFile.delete();
                                                                } else {
                                                                        
latestFile.delete();
@@ -505,8 +503,7 @@
                java.util.Arrays.sort(files);
                long lastStartTime = -1;
                File oldFile = null;
-               previousFile.delete();
-               latestFile.renameTo(previousFile);
+                FileUtil.renameTo(latestFile, previousFile);
                boolean logMINOR = Logger.shouldLog(Logger.MINOR, this);
                for(int i=0;i<files.length;i++) {
                        File f = files[i];

Modified: trunk/freenet/src/freenet/support/SimpleFieldSet.java
===================================================================
--- trunk/freenet/src/freenet/support/SimpleFieldSet.java       2007-11-21 
23:43:52 UTC (rev 15914)
+++ trunk/freenet/src/freenet/support/SimpleFieldSet.java       2007-11-22 
07:55:28 UTC (rev 15915)
@@ -18,7 +18,12 @@
 import java.util.Map;

 import freenet.node.FSParseException;
+import freenet.support.io.Closer;
 import freenet.support.io.LineReader;
+import java.io.BufferedOutputStream;
+import java.io.BufferedWriter;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;

 /**
  * @author amphibian
@@ -671,17 +676,40 @@
                        SimpleFieldSet fs = new SimpleFieldSet(br, 
allowMultiple, shortLived);
                        return fs;
                } finally {
-                       try {
-                               if(br != null) br.close();
-                               if(isr != null) isr.close();
-                               if(bis != null) bis.close();
-                       } catch (IOException e) {}                      
-               }
+                        Closer.close(br);
+                        Closer.close(isr);
+                        Closer.close(bis);
+                }
        }

        public static SimpleFieldSet readFrom(File f, boolean allowMultiple, 
boolean shortLived) throws IOException {
                return readFrom(new FileInputStream(f), allowMultiple, 
shortLived);
        }
+        
+        public void writeTo(OutputStream os) {
+            BufferedOutputStream bos = null;
+            OutputStreamWriter osw = null;
+            BufferedWriter bw = null;
+            
+            try {
+                bos = new BufferedOutputStream(os);
+                try {
+                    osw = new OutputStreamWriter(bos, "UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    Logger.error(SimpleFieldSet.class, "Impossible: " + e, e);
+                    os.close();
+                    return;
+                }
+                bw = new BufferedWriter(osw);
+                writeTo(bw);
+            } catch (IOException ioe) {
+                Logger.error("SimpleFieldSet", "An exception has occured while 
saving the SFS :"+ioe.getMessage(), ioe);
+            }finally {
+                Closer.close(bw);
+                Closer.close(osw);
+                Closer.close(bos);
+            }
+        }

        public int getInt(String key, int def) {
                String s = get(key);

Modified: trunk/freenet/src/freenet/support/io/FileUtil.java
===================================================================
--- trunk/freenet/src/freenet/support/io/FileUtil.java  2007-11-21 23:43:52 UTC 
(rev 15914)
+++ trunk/freenet/src/freenet/support/io/FileUtil.java  2007-11-22 07:55:28 UTC 
(rev 15915)
@@ -4,7 +4,6 @@
 package freenet.support.io;

 import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.io.DataInputStream;
 import java.io.EOFException;
 import java.io.File;
@@ -137,13 +136,35 @@
                        if(fos != null) fos.close();
                }

-               if(file.renameTo(target))
+               if(FileUtil.renameTo(file, target))
                        return true;
                else {
                        file.delete();
                        return false;
                }
        }
+        
+        public static boolean renameTo(File orig, File dest) {
+            // Try an atomic rename
+            // Shall we prevent symlink-race-conditions here ?
+            
+            if (!orig.renameTo(dest)) {
+                // Not supported on some systems (Windows)
+                if (!dest.delete()) {
+                    if (dest.exists()) {
+                        Logger.error("FileUtil", "Could not delete " + dest + 
" - check permissions");
+                    }
+                }
+                if (!orig.renameTo(dest)) {
+                    Logger.error("FileUtil", "Could not rename " + orig + " to 
" + dest +
+                            (dest.exists() ? " (target exists)" : "") +
+                            (orig.exists() ? " (source exists)" : "") +
+                            " - check permissions");
+                    return false;
+                }
+            }
+            return true;
+        }

        public static String sanitize(String s) {
                StringBuffer sb = new StringBuffer(s.length());


Reply via email to