From 04ead8f1c81d759108686bbd4add4b9eee542c2e Mon Sep 17 00:00:00 2001
From: kenneth_suter <kenneth_suter@localhost>
Date: Wed, 11 Apr 2007 18:51:40 +0000
Subject: [PATCH] During schema and configuration upgrade, the server is started 'in process' without any connection handlers and the changes are made using an internal connection to the server.  During configuration/schema updates:

---
 opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java |  110 ++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 97 insertions(+), 13 deletions(-)

diff --git a/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java b/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
index a1d53bd..fa1d269 100644
--- a/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
+++ b/opends/src/quicksetup/org/opends/quicksetup/util/FileManager.java
@@ -50,6 +50,38 @@
   }
 
   /**
+   * Move a file.
+   * @param object File to move
+   * @param newParent File representing new parent directory
+   * @param filter that will be asked whether or not the operation should be
+   *        performed
+   * @throws ApplicationException if something goes wrong
+   */
+  public void move(File object, File newParent, FileFilter filter)
+          throws ApplicationException
+  {
+    // TODO: application notification
+    if (filter == null || filter.accept(object)) {
+      new MoveOperation(object, newParent).apply();
+    }
+  }
+
+  /**
+   * Deletes a single file or directory.
+   * @param object File to delete
+   * @param filter that will be asked whether or not the operation should be
+   *        performed
+   * @throws ApplicationException if something goes wrong
+   */
+  public void delete(File object, FileFilter filter)
+          throws ApplicationException
+  {
+    if (filter == null || filter.accept(object)) {
+      new DeleteOperation(object).apply();
+    }
+  }
+
+  /**
    * Deletes everything below the specified file.
    *
    * @param file the path to be deleted.
@@ -252,16 +284,17 @@
       String[] args = {objectFile.getAbsolutePath(),
               destination.getAbsolutePath()};
 
-      // If overwriting and the destination exists then kill it
-      if (destination.exists() && overwrite) {
-        deleteRecursively(destination);
-      }
-
       if (objectFile.isDirectory()) {
         if (!destination.exists()) {
             destination.mkdirs();
         }
       } else {
+
+        // If overwriting and the destination exists then kill it
+        if (destination.exists() && overwrite) {
+          deleteRecursively(destination);
+        }
+
         if (!destination.exists()) {
           if (insureParentsExist(destination)) {
             application.notifyListeners(application.getFormattedWithPoints(
@@ -278,6 +311,18 @@
               fis.close();
               fos.close();
 
+              if (destination.exists()) {
+                // TODO:  set the file's permissions.  This is made easier in
+                // Java 1.6 but until then use the Utils methods
+                if (Utils.isUnix()) {
+                  String permissions =
+                          Utils.getFileSystemPermissions(objectFile);
+                  Utils.setPermissionsUnix(
+                          Utils.getPath(destination),
+                          permissions);
+                }
+              }
+
               application.notifyListeners(application.getFormattedDone() +
                       application.getLineBreak());
 
@@ -299,14 +344,6 @@
       }
     }
 
-    private boolean insureParentsExist(File f) {
-      File parent = f.getParentFile();
-      boolean b = parent.exists();
-      if (!b) {
-        b = parent.mkdirs();
-      }
-      return b;
-    }
   }
 
   /**
@@ -380,6 +417,53 @@
     }
   }
 
+  /**
+   * A delete operation.
+   */
+  private class MoveOperation extends FileOperation {
+
+    File destination = null;
+
+    /**
+     * Creates a delete operation.
+     * @param objectFile to delete
+     */
+    public MoveOperation(File objectFile, File newParent) {
+      super(objectFile);
+      this.destination = new File(newParent, objectFile.getName());
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public FileOperation copyForChild(File child) {
+      return new MoveOperation(child, destination);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    public void apply() throws ApplicationException {
+      File objectFile = getObjectFile();
+      if (destination.exists()) {
+        deleteRecursively(destination);
+      }
+      if (!objectFile.renameTo(destination)) {
+        throw ApplicationException.createFileSystemException(
+                "failed to move " + objectFile + " to " + destination, null);
+      }
+    }
+  }
+
+  private boolean insureParentsExist(File f) {
+    File parent = f.getParentFile();
+    boolean b = parent.exists();
+    if (!b) {
+      b = parent.mkdirs();
+    }
+    return b;
+  }
+
   private String getMsg(String key) {
     return ResourceProvider.getInstance().getMsg(key);
   }

--
Gitblit v1.10.0