diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml
index 1ad15be7..251a945e 100644
--- a/diylc/diylc-core/src/org/diylc/presenter/update.xml
+++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml
@@ -3133,7 +3133,11 @@
IMPROVEMENT
Improved Dutch translation
-
+
+
+ IMPROVEMENT
+ Make file writes more resilient to crashes to avoid loss of data
+
BUG_FIX
"Outline Mode" produces rendering issues when "Cache Boost" feature is enabled
diff --git a/diylc/diylc-core/src/org/diylc/serialization/ProjectFileManager.java b/diylc/diylc-core/src/org/diylc/serialization/ProjectFileManager.java
index 1e573aaf..067dcc83 100644
--- a/diylc/diylc-core/src/org/diylc/serialization/ProjectFileManager.java
+++ b/diylc/diylc-core/src/org/diylc/serialization/ProjectFileManager.java
@@ -148,14 +148,19 @@ public class ProjectFileManager {
public synchronized void serializeProjectToFile(Project project, String fileName, boolean isBackup)
throws IOException {
if (!isBackup) {
- LOG.info(String.format("saveProjectToFile(%s)", fileName));
+ LOG.info(String.format("serializeProjectToFile(%s)", fileName));
}
- FileOutputStream fos;
- fos = new FileOutputStream(fileName);
+ FileOutputStream fos;
+ // write to a temp file to avoid loss of data in case of crash
+ String tempName = fileName + ".temp";
+ fos = new FileOutputStream(tempName);
Writer writer = new OutputStreamWriter(fos, "UTF-8");
writer.write("\n");
xStream.toXML(project, writer);
- fos.close();
+ fos.close();
+ // switch the files at the end
+ new File(fileName).delete();
+ new File(tempName).renameTo(new File(fileName));
if (!isBackup) {
this.currentFileName = fileName;
this.modified = false;