Author: mvw
Date: 2012-03-14 00:14:53-0700
New Revision: 19876

Modified:
   trunk/src/argouml-app/src/org/argouml/i18n/label.properties
   trunk/src/argouml-app/src/org/argouml/i18n/optionpane.properties
   trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/OldZargoFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/PersistenceManager.java
   trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/XmiFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java
   trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java
   trunk/src/argouml-app/src/org/argouml/ui/SettingsDialog.java
   trunk/src/argouml-app/src/org/argouml/ui/SettingsTabPreferences.java

Log:
Fix for issue 6012: saving project to network drive (SharePoint)

Modified: trunk/src/argouml-app/src/org/argouml/i18n/label.properties
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/i18n/label.properties?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/i18n/label.properties (original)
+++ trunk/src/argouml-app/src/org/argouml/i18n/label.properties 2012-03-14 
00:14:53-0700
@@ -1,6 +1,6 @@
 # $Id$
 #******************************************************************************
-# Copyright (c) 2009-2011 Contributors - see below
+# Copyright (c) 2009-2012 Contributors - see below
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -474,6 +474,7 @@
 label.usage = Usage
 # Note: our internal uses are incorrectly spelled.  Guillemet is correct.
 label.use-guillemots = Use guillemets  (\u00ab\u00bb)
+label.use-safe-saves = Use 'safe' saves (switch this off on SharePoint)
 label.usecase = Use Case
 label.usecase-base = Base Use Case:
 label.usecase-diagram = Use Case Diagram

Modified: trunk/src/argouml-app/src/org/argouml/i18n/optionpane.properties
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/i18n/optionpane.properties?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/i18n/optionpane.properties    
(original)
+++ trunk/src/argouml-app/src/org/argouml/i18n/optionpane.properties    
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 # $Id$
 #******************************************************************************
-# Copyright (c) 2009 Contributors - see below
+# Copyright (c) 2009-2012 Contributors - see below
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
 #
 # Contributors:
 #    dthompson
+#    Michiel van der Wulp
 #******************************************************************************
 #
 # Some portions of this file was previously release using the BSD License:
@@ -79,4 +80,7 @@
 optionpane.save-project-io-exception-title = Problem while saving.
 optionpane.shortcut-save-conflict = Impossible to save shortcuts: conflicts 
found.
 optionpane.shortcut-save-conflict-title = Problem while saving.
-
+optionpane.save-project-exception-cause1 = Failed to archive the previous file 
version. \
+       If the save destination is in a folder managed by \
+       SharePoint, then you should disable safe saves
+optionpane.save-project-exception-cause2 = Failed to archive the previous file 
version

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java    
    (original)
+++ 
trunk/src/argouml-app/src/org/argouml/persistence/AbstractFilePersister.java    
    2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -50,6 +51,7 @@
 import javax.swing.filechooser.FileFilter;
 
 import org.apache.log4j.Logger;
+import org.argouml.configuration.Configuration;
 import org.argouml.kernel.ProfileConfiguration;
 import org.argouml.kernel.Project;
 import org.argouml.kernel.ProjectMember;
@@ -130,6 +132,29 @@
     }
 
     /**
+     * Saving in a safe way means: Retain the previous project 
+     * file even when the save operation causes an
+     * exception in the middle. 
+     * Also create a backup file after saving.
+     * 
+     * See issue 6012 - our method of saving in a safe way does not 
+     * work on a SharePoint drive. 
+     * Hence we can configure ArgoUML to save unsafe, too...
+     * 
+     * @return true if we should be careful
+     */
+    protected boolean useSafeSaves() {
+        boolean result = Configuration.getBoolean(
+                        PersistenceManager.USE_SAFE_SAVES, true);
+
+        /* make sure this setting exists in the configuration file 
+         * to facilitate changing: */
+        Configuration.setBoolean(PersistenceManager.USE_SAFE_SAVES, result);
+        
+        return result;
+    }
+    
+    /**
      * Copies one file src to another, raising file exceptions
      * if there are some problems.
      *

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/OldZargoFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/OldZargoFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- 
trunk/src/argouml-app/src/org/argouml/persistence/OldZargoFilePersister.java    
    (original)
+++ 
trunk/src/argouml-app/src/org/argouml/persistence/OldZargoFilePersister.java    
    2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -100,8 +101,7 @@
     }
     
     /**
-     * It is being considered to save out individual xmi's from individuals
-     * diagrams to make it easier to modularize the output of Argo.
+     * Save the project in ".zargo" format.
      *
      * @param file
      *            The file to write.
@@ -117,6 +117,10 @@
     public void doSave(Project project, File file) throws SaveException, 
     InterruptedException {
 
+        /* Retain the previous project file even when the save operation 
+         * crashes in the middle. Also create a backup file after saving. */
+        boolean doSafeSaves = useSafeSaves();
+
         ProgressMgr progressMgr = new ProgressMgr();
         progressMgr.setNumberOfPhases(4);
         progressMgr.nextPhase();
@@ -124,14 +128,16 @@
         File lastArchiveFile = new File(file.getAbsolutePath() + "~");
         File tempFile = null;
 
-        try {
-            tempFile = createTempFile(file);
-        } catch (FileNotFoundException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
-        } catch (IOException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
+        if (doSafeSaves) {
+            try {
+                tempFile = createTempFile(file);
+            } catch (FileNotFoundException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause1"), e);
+            } catch (IOException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause2"), e);
+            }
         }
 
         BufferedWriter writer = null;
@@ -205,20 +211,20 @@
                     stream.flush();
                 }
             }
-            
-            
-            
-            // if save did not raise an exception
-            // and name+"#" exists move name+"#" to name+"~"
-            // this is the correct backup file
-            if (lastArchiveFile.exists()) {
-                lastArchiveFile.delete();
-            }
-            if (tempFile.exists() && !lastArchiveFile.exists()) {
-                tempFile.renameTo(lastArchiveFile);
-            }
-            if (tempFile.exists()) {
-                tempFile.delete();
+
+            if (doSafeSaves) {
+                // if save did not raise an exception
+                // and name+"#" exists move name+"#" to name+"~"
+                // this is the correct backup file
+                if (lastArchiveFile.exists()) {
+                    lastArchiveFile.delete();
+                }
+                if (tempFile.exists() && !lastArchiveFile.exists()) {
+                    tempFile.renameTo(lastArchiveFile);
+                }
+                if (tempFile.exists()) {
+                    tempFile.delete();
+                }            
             }
 
             progressMgr.nextPhase();
@@ -231,11 +237,13 @@
                 // Do nothing.
             }
 
-            // frank: in case of exception
-            // delete name and mv name+"#" back to name if name+"#" exists
-            // this is the "rollback" to old file
-            file.delete();
-            tempFile.renameTo(file);
+            if (doSafeSaves) {
+                // frank: in case of exception
+                // delete name and mv name+"#" back to name if name+"#" exists
+                // this is the "rollback" to old file
+                file.delete();
+                tempFile.renameTo(file);
+            }
             // we have to give a message to user and set the system to unsaved!
             throw new SaveException(e);
         }

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/PersistenceManager.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/PersistenceManager.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/PersistenceManager.java   
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/PersistenceManager.java   
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    bobtarling
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -109,6 +110,16 @@
      */
     public static final ConfigurationKey KEY_IMPORT_XMI_PATH =
         Configuration.makeKey("xmi", "import", "path");
+    
+    /**
+     * The configuration to do safe saves, i.e. retain the 
+     * previous project file even when the save operation 
+     * crashes in the middle. Also create a backup file after saving.
+     * This works with a project file ending in "~" for the backup 
+     * file, and a file ending in "#" for a temporary file during saving.
+     */
+    public static final ConfigurationKey USE_SAFE_SAVES =
+            Configuration.makeKey("project", "use", "safe-saves");
 
     /**
      * Create the default diagram persister.

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/UmlFilePersister.java     
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,6 +9,7 @@
  * Contributors:
  *    Bob Tarling
  *    Thomas Neustupny
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -137,8 +138,7 @@
     }
 
     /**
-     * It is being considered to save out individual xmi's from individuals
-     * diagrams to make it easier to modularize the output of Argo.
+     * Save the project in ".uml" format.
      * 
      * @param file The file to write.
      * @param project the project to save
@@ -151,6 +151,10 @@
     public void doSave(Project project, File file) throws SaveException,
         InterruptedException {
 
+        /* Retain the previous project file even when the save operation 
+         * crashes in the middle. Also create a backup file after saving. */
+        boolean doSafeSaves = useSafeSaves();
+
         ProgressMgr progressMgr = new ProgressMgr();
         progressMgr.setNumberOfPhases(4);
         progressMgr.nextPhase();
@@ -158,14 +162,16 @@
         File lastArchiveFile = new File(file.getAbsolutePath() + "~");
         File tempFile = null;
 
-        try {
-            tempFile = createTempFile(file);
-        } catch (FileNotFoundException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
-        } catch (IOException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
+        if (doSafeSaves) {
+            try {
+                tempFile = createTempFile(file);
+            } catch (FileNotFoundException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause1"), e);
+            } catch (IOException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause2"), e);
+            }
         }
 
         try {
@@ -186,17 +192,19 @@
                 LOG.info("Dir ==" + path);
             }
 
-            // if save did not raise an exception
-            // and name+"#" exists move name+"#" to name+"~"
-            // this is the correct backup file
-            if (lastArchiveFile.exists()) {
-                lastArchiveFile.delete();
-            }
-            if (tempFile.exists() && !lastArchiveFile.exists()) {
-                tempFile.renameTo(lastArchiveFile);
-            }
-            if (tempFile.exists()) {
-                tempFile.delete();
+            if (doSafeSaves) {
+                // if save did not raise an exception
+                // and name+"#" exists move name+"#" to name+"~"
+                // this is the correct backup file
+                if (lastArchiveFile.exists()) {
+                    lastArchiveFile.delete();
+                }
+                if (tempFile.exists() && !lastArchiveFile.exists()) {
+                    tempFile.renameTo(lastArchiveFile);
+                }
+                if (tempFile.exists()) {
+                    tempFile.delete();
+                }
             }
 
             progressMgr.nextPhase();
@@ -204,11 +212,13 @@
         } catch (Exception e) {
             LOG.error("Exception occured during save attempt", e);
 
-            // frank: in case of exception
-            // delete name and mv name+"#" back to name if name+"#" exists
-            // this is the "rollback" to old file
-            file.delete();
-            tempFile.renameTo(file);
+            if (doSafeSaves) {
+                // frank: in case of exception
+                // delete name and mv name+"#" back to name if name+"#" exists
+                // this is the "rollback" to old file
+                file.delete();
+                tempFile.renameTo(file);
+            }
             if (e instanceof InterruptedException) {
                 throw (InterruptedException) e;
             } else {

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/XmiFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/XmiFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/XmiFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/XmiFilePersister.java     
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -117,6 +118,10 @@
     public void doSave(Project project, File file)
         throws SaveException, InterruptedException {
 
+        /* Retain the previous project file even when the save operation 
+         * crashes in the middle. Also create a backup file after saving. */
+        boolean doSafeSaves = useSafeSaves();
+        
         ProgressMgr progressMgr = new ProgressMgr();
         progressMgr.setNumberOfPhases(4);
         progressMgr.nextPhase();
@@ -124,14 +129,16 @@
         File lastArchiveFile = new File(file.getAbsolutePath() + "~");
         File tempFile = null;
 
-        try {
-            tempFile = createTempFile(file);
-        } catch (FileNotFoundException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
-        } catch (IOException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
+        if (doSafeSaves) {
+            try {
+                tempFile = createTempFile(file);
+            } catch (FileNotFoundException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause1"), e);
+            } catch (IOException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause2"), e);
+            }
         }
 
         OutputStream stream = null;
@@ -140,17 +147,19 @@
             writeProject(project, stream, progressMgr);
             stream.close();
 
-            // if save did not raise an exception
-            // and name+"#" exists move name+"#" to name+"~"
-            // this is the correct backup file
-            if (lastArchiveFile.exists()) {
-                lastArchiveFile.delete();
-            }
-            if (tempFile.exists() && !lastArchiveFile.exists()) {
-                tempFile.renameTo(lastArchiveFile);
-            }
-            if (tempFile.exists()) {
-                tempFile.delete();
+            if (doSafeSaves) {
+                // if save did not raise an exception
+                // and name+"#" exists move name+"#" to name+"~"
+                // this is the correct backup file
+                if (lastArchiveFile.exists()) {
+                    lastArchiveFile.delete();
+                }
+                if (tempFile.exists() && !lastArchiveFile.exists()) {
+                    tempFile.renameTo(lastArchiveFile);
+                }
+                if (tempFile.exists()) {
+                    tempFile.delete();
+                }
             }
         } catch (InterruptedException exc) {
             try {
@@ -163,11 +172,13 @@
                 stream.close();
             } catch (IOException ex) { }
 
-            // frank: in case of exception
-            // delete name and mv name+"#" back to name if name+"#" exists
-            // this is the "rollback" to old file
-            file.delete();
-            tempFile.renameTo(file);
+            if (doSafeSaves) {
+                // frank: in case of exception
+                // delete name and mv name+"#" back to name if name+"#" exists
+                // this is the "rollback" to old file
+                file.delete();
+                tempFile.renameTo(file);
+            }
             // we have to give a message to user and set the system to unsaved!
             throw new SaveException(e);
         }

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java   
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/ZargoFilePersister.java   
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -128,6 +129,10 @@
     InterruptedException {
 
         LOG.info("Saving");
+        /* Retain the previous project file even when the save operation 
+         * crashes in the middle. Also create a backup file after saving. */
+        boolean doSafeSaves = useSafeSaves();
+
         ProgressMgr progressMgr = new ProgressMgr();
         progressMgr.setNumberOfPhases(4);
         progressMgr.nextPhase();
@@ -135,14 +140,16 @@
         File lastArchiveFile = new File(file.getAbsolutePath() + "~");
         File tempFile = null;
 
-        try {
-            tempFile = createTempFile(file);
-        } catch (FileNotFoundException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
-        } catch (IOException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
+        if (doSafeSaves) {
+            try {
+                tempFile = createTempFile(file);
+            } catch (FileNotFoundException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause1"), e);
+            } catch (IOException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause2"), e);
+            }
         }
 
         ZipOutputStream stream = null;
@@ -167,17 +174,20 @@
                     persister.save(projectMember, stream);
                 }
             }
-            // if save did not raise an exception
-            // and name+"#" exists move name+"#" to name+"~"
-            // this is the correct backup file
-            if (lastArchiveFile.exists()) {
-                lastArchiveFile.delete();
-            }
-            if (tempFile.exists() && !lastArchiveFile.exists()) {
-                tempFile.renameTo(lastArchiveFile);
-            }
-            if (tempFile.exists()) {
-                tempFile.delete();
+            
+            if (doSafeSaves) {
+                // if save did not raise an exception
+                // and name+"#" exists move name+"#" to name+"~"
+                // this is the correct backup file
+                if (lastArchiveFile.exists()) {
+                    lastArchiveFile.delete();
+                }
+                if (tempFile.exists() && !lastArchiveFile.exists()) {
+                    tempFile.renameTo(lastArchiveFile);
+                }
+                if (tempFile.exists()) {
+                    tempFile.delete();
+                }
             }
 
             progressMgr.nextPhase();
@@ -192,11 +202,13 @@
                 // Do nothing.
             }
 
-            // frank: in case of exception
-            // delete name and mv name+"#" back to name if name+"#" exists
-            // this is the "rollback" to old file
-            file.delete();
-            tempFile.renameTo(file);
+            if (doSafeSaves) {
+                // frank: in case of exception
+                // delete name and mv name+"#" back to name if name+"#" exists
+                // this is the "rollback" to old file
+                file.delete();
+                tempFile.renameTo(file);
+            }
             // we have to give a message to user and set the system to unsaved!
             throw new SaveException(e);
         }

Modified: 
trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java     
(original)
+++ trunk/src/argouml-app/src/org/argouml/persistence/ZipFilePersister.java     
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -100,8 +101,7 @@
     }
 
     /**
-     * It is being considered to save out individual xmi's from individuals
-     * diagrams to make it easier to modularize the output of Argo.
+     * Save the project in ZIP format.
      *
      * @param file
      *            The file to write.
@@ -116,18 +116,24 @@
     public void doSave(Project project, File file) throws SaveException {
 
         LOG.info("Receiving file '" + file.getName() + "'");
-
+        
+        /* Retain the previous project file even when the save operation 
+         * crashes in the middle. Also create a backup file after saving. */
+        boolean doSafeSaves = useSafeSaves();
+        
         File lastArchiveFile = new File(file.getAbsolutePath() + "~");
         File tempFile = null;
 
-        try {
-            tempFile = createTempFile(file);
-        } catch (FileNotFoundException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
-        } catch (IOException e) {
-            throw new SaveException(
-                    "Failed to archive the previous file version", e);
+        if (doSafeSaves) {
+            try {
+                tempFile = createTempFile(file);
+            } catch (FileNotFoundException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause1"), e);
+            } catch (IOException e) {
+                throw new SaveException(Translator.localize(
+                        "optionpane.save-project-exception-cause2"), e);
+            }
         }
 
         OutputStream bufferedStream = null;
@@ -158,17 +164,20 @@
                 }
             }
             stream.close();
-            // if save did not raise an exception
-            // and name+"#" exists move name+"#" to name+"~"
-            // this is the correct backup file
-            if (lastArchiveFile.exists()) {
-                lastArchiveFile.delete();
-            }
-            if (tempFile.exists() && !lastArchiveFile.exists()) {
-                tempFile.renameTo(lastArchiveFile);
-            }
-            if (tempFile.exists()) {
-                tempFile.delete();
+            
+            if (doSafeSaves) {
+                // if save did not raise an exception
+                // and name+"#" exists move name+"#" to name+"~"
+                // this is the correct backup file
+                if (lastArchiveFile.exists()) {
+                    lastArchiveFile.delete();
+                }
+                if (tempFile.exists() && !lastArchiveFile.exists()) {
+                    tempFile.renameTo(lastArchiveFile);
+                }
+                if (tempFile.exists()) {
+                    tempFile.delete();
+                }
             }
         } catch (Exception e) {
             LOG.error("Exception occured during save attempt", e);
@@ -178,11 +187,13 @@
                 // If we get a 2nd error, just ignore it
             }
 
-            // frank: in case of exception
-            // delete name and mv name+"#" back to name if name+"#" exists
-            // this is the "rollback" to old file
-            file.delete();
-            tempFile.renameTo(file);
+            if (doSafeSaves) {
+                // frank: in case of exception
+                // delete name and mv name+"#" back to name if name+"#" exists
+                // this is the "rollback" to old file
+                file.delete();
+                tempFile.renameTo(file);
+            }
             // we have to give a message to user and set the system to unsaved!
             throw new SaveException(e);
         }

Modified: trunk/src/argouml-app/src/org/argouml/ui/SettingsDialog.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/ui/SettingsDialog.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/ui/SettingsDialog.java        
(original)
+++ trunk/src/argouml-app/src/org/argouml/ui/SettingsDialog.java        
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -101,7 +102,7 @@
         }
 
         // Increase width to accommodate all tabs on one row.
-        final int minimumWidth = 500;
+        final int minimumWidth = 600;
         tabs.setPreferredSize(new Dimension(Math.max(tabs
                 .getPreferredSize().width, minimumWidth), tabs
                 .getPreferredSize().height));

Modified: trunk/src/argouml-app/src/org/argouml/ui/SettingsTabPreferences.java
Url: 
http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/ui/SettingsTabPreferences.java?view=diff&pathrev=19876&r1=19875&r2=19876
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/ui/SettingsTabPreferences.java        
(original)
+++ trunk/src/argouml-app/src/org/argouml/ui/SettingsTabPreferences.java        
2012-03-14 00:14:53-0700
@@ -1,6 +1,6 @@
 /* $Id$
  *****************************************************************************
- * Copyright (c) 2009 Contributors - see below
+ * Copyright (c) 2009-2012 Contributors - see below
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
  *
  * Contributors:
  *    tfmorris
+ *    Michiel van der Wulp
  *****************************************************************************
  *
  * Some portions of this file was previously release using the BSD License:
@@ -50,6 +51,7 @@
 import org.argouml.application.api.GUISettingsTabInterface;
 import org.argouml.configuration.Configuration;
 import org.argouml.i18n.Translator;
+import org.argouml.persistence.PersistenceManager;
 
 /**
  * Settings tab panel for handling ArgoUML application related settings.
@@ -64,7 +66,8 @@
     private JCheckBox chkSplash;
     private JCheckBox chkReloadRecent;
     private JCheckBox chkStripDiagrams;
-
+    private JCheckBox chkUseSafeSaves;
+    
     /**
      * The constructor.
      *
@@ -102,6 +105,12 @@
         chkStripDiagrams = j3;
         topPanel.add(chkStripDiagrams, checkConstraints);
 
+        checkConstraints.gridy++;
+        JCheckBox j4 =
+            new JCheckBox(Translator.localize("label.use-safe-saves"));
+        chkUseSafeSaves = j4;
+        topPanel.add(chkUseSafeSaves, checkConstraints);
+        
         checkConstraints.fill = GridBagConstraints.HORIZONTAL;
 
        add(topPanel, BorderLayout.NORTH);
@@ -118,6 +127,9 @@
         chkStripDiagrams.setSelected(
                 Configuration.getBoolean(Argo.KEY_XMI_STRIP_DIAGRAMS,
                                          false));
+        chkUseSafeSaves.setSelected(
+            Configuration.getBoolean(PersistenceManager.USE_SAFE_SAVES,
+                true)); 
     }
 
     /*
@@ -129,6 +141,8 @@
                                 chkReloadRecent.isSelected());
         Configuration.setBoolean(Argo.KEY_XMI_STRIP_DIAGRAMS,
                  chkStripDiagrams.isSelected());
+        Configuration.setBoolean(PersistenceManager.USE_SAFE_SAVES,
+                chkUseSafeSaves.isSelected());
     }
 
     /*
@@ -162,9 +176,5 @@
         return "tab.preferences";
     }
 
-    /**
-     * The UID.
-     */
-    private static final long serialVersionUID = -340220974967836979L;
 }

------------------------------------------------------
http://argouml.tigris.org/ds/viewMessage.do?dsForumId=5905&dsMessageId=2935370

To unsubscribe from this discussion, e-mail: 
[[email protected]].

Reply via email to