svn commit: r15684 - trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java

[email protected]
Newsgroups gmane.comp.lang.uml.argouml.cvs
Message-ID <[email protected]>
Author: mvw
Date: 2008-09-07 09:48:50-0700
New Revision: 15684

Modified:
   trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java

Log:
Fix for issue 5364: User preferences not migrated.

This patch was discussed and approved for 0.26 during beta period.

I hope this fixes issue 5351, too - to be investigated.

Modified: trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java
Url: http://argouml.tigris.org/source/browse/argouml/trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java?view=diff&rev=15684&p1=trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java&p2=trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java&r1=15683&r2=15684
==============================================================================
--- trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java	(original)
+++ trunk/src/argouml-app/src/org/argouml/configuration/ConfigurationProperties.java	2008-09-07 09:48:50-0700
@@ -26,6 +26,7 @@
 
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.net.URL;
@@ -101,49 +102,119 @@
     }
 
     /**
-     * Load the configuration from a specified location.
+     * Copy a file from source to destination.
+     * 
+     * TODO: Perhaps belongs in a utilities class of some sort.
+     * 
+     * @param source the source file to be copied
+     * @param dest the destination file
+     * @return success status flag
+     */
+    private static boolean copyFile(final File source, final File dest) {
+        try {
+            final FileInputStream fis = new FileInputStream(source);
+            final FileOutputStream fos = new FileOutputStream(dest);
+            byte[] buf = new byte[1024];
+            int i = 0;
+            while ((i = fis.read(buf)) != -1) {
+                fos.write(buf, 0, i);
+            }
+            fis.close();
+            fos.close();
+            return true;
+        } catch (final FileNotFoundException e) {
+            LOG.error("File not found while copying", e);
+            return false;
+        } catch (final IOException e) {
+            LOG.error("IO error copying file", e);
+            return false;
+        } catch (final SecurityException e) {
+            LOG.error("You are not allowed to copy these files", e);
+            return false;
+        }
+    }
+
+    /**
+     * Load the configuration from a specified location. <p>
+     * 
+     * Before version 0.25.4, ArgoUML used to store the 
+     * properties file in a different location. A user who
+     * upgrades his ArgoUML to a newer version, 
+     * would not like to loose his settings.
+     * Hence, in case a properties file does not exist 
+     * (in the new location),
+     * this code attempts to copy the file
+     * from the old location to the new location. <p>
+     * 
+     * In this upgrade case, the properties file 
+     * is copied, not moved.
+     * Rationale: see issue 5364. <p>
+     * 
+     * The meaning of the return value is not simply success
+     * in loading the properties file, 
+     * but it indicates if we may save the properties 
+     * on top of this file later.
+     * Hence, in case a properties file did not exist 
+     * (not in the new location, nor in the old location), 
+     * then a new empty file is created, 
+     * and in this case the return value is true. <p>
+     * 
+     * Returning false here would mean that no properties
+     * will be saved at all. 
      *
      * @param file  the path to load the configuration from.
      *
-     * @return true if the load was successful, false if not.
+     * @return true if the given file-location may be used 
+     * for writing the properties later.
      */
     public boolean loadFile(File file) {
         try {
-            propertyBundle.load(new FileInputStream(file));
-            LOG.info("Configuration loaded from " + file);
-            return true;
-        } catch (Exception e) {
-            if (canComplain) {
-                LOG.warn("Unable to load configuration " + file);
-            }
-            // Try to create an empty file.
-            try {
+            if (!file.exists()) {
+                // check for the older properties file and 
+                // copy it over if possible
+
                 // This is done for compatibility with previous version: 
                 // Move the argo.user.properties
                 // written before 0.25.4 to the new location, if it exists.
-                // TODO: Remove this when the next major release is done.
-                File oldFile = new File(getOldDefaultPath());
-                if (oldFile.exists()) {
-                    oldFile.renameTo(file);
-                    propertyBundle.load(new FileInputStream(file));
-                    LOG.info("Configuration moved from " 
-                            + oldFile + " to " + file);
+                final File oldFile = new File(getOldDefaultPath());
+                if (oldFile.exists() && oldFile.isFile() && oldFile.canRead() 
+                        && file.getParentFile().canWrite()) {
+                    // copy to new file and let the regular load code 
+                    // do the actual load
+                    final boolean result = copyFile(oldFile, file);
+                    if (result) {
+                        LOG.info("Configuration copied from " 
+                                + oldFile + " to " + file);
+                    } else {
+                        LOG.error("Error copying old configuration to new, "
+                             + "see previous log messages");
+                    }
+                } else {
+                    try {
+                        file.createNewFile();
+                    } catch (IOException e) {
+                        LOG.error("Could not create the properties file at: " 
+                                + file.getAbsolutePath(), e);
+                    }
                 }
-                else {
-                    file.createNewFile();
-                }
-                if (file.exists() && file.isFile()) {
-                    LOG.info("New configuration created as " + file);
-                    // Pretend we loaded the file correctly
+            }
+
+            if (file.exists() && file.isFile() && file.canRead()) {
+                try {
+                    propertyBundle.load(new FileInputStream(file));
+                    LOG.info("Configuration loaded from " + file);
                     return true;
+                } catch (final IOException e) {
+                    if (canComplain) {
+                        LOG.warn("Unable to load configuration " + file);
+                    }
+                    canComplain = false;
                 }
-            } catch (IOException e1) {
-                // Ignore an error here
-                LOG.warn("Unable to create configuration " + file, e1);
             }
-            canComplain = false;
+        } catch (final SecurityException e) {
+            LOG.error("A security exception occurred trying to load"
+                + " the configuration, check your security settings", e);
         }
-
         return false;
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.