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());