From 6dc91f889744c17a9a0d8a7c92276b62dea25941 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Thu, 03 May 2007 21:55:23 +0000
Subject: [PATCH] Major changes made to the logging framework. It should resolve the following issues:

---
 opendj-sdk/opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java |   88 +++++++++++++++++++++++++++++++++----------
 1 files changed, 67 insertions(+), 21 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java b/opendj-sdk/opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java
index 2def134..b3cc34e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/loggers/FreeDiskSpaceRetentionPolicy.java
@@ -29,54 +29,92 @@
 import java.io.File;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.List;
 
 import static org.opends.server.loggers.debug.DebugLogger.debugCaught;
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
+import static org.opends.server.loggers.debug.DebugLogger.debugInfo;
 import org.opends.server.types.DebugLogLevel;
+import org.opends.server.types.ResultCode;
+import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.admin.std.server.FreeDiskSpaceLogRetentionPolicyCfg;
+import org.opends.server.admin.server.ConfigurationChangeListener;
 
 /**
  * This class implements a retention policy based on the free disk
  * space available expressed as a percentage. This policy is only
  * available on Java 6.
  */
-public class FreeDiskSpaceRetentionPolicy implements RetentionPolicy
+public class FreeDiskSpaceRetentionPolicy implements
+    RetentionPolicy<FreeDiskSpaceLogRetentionPolicyCfg>,
+    ConfigurationChangeListener<FreeDiskSpaceLogRetentionPolicyCfg>
 {
 
   private long freeDiskSpace = 0;
-  private File directory = null;
-  private String prefix = null;
 
   /**
-   * Create the retention policy based on the free disk space available.
-   *
-   * @param dir           The directory in which the log files reside.
-   * @param prefix        The prefix for the log file names.
-   * @param freeDiskSpace The free disk space needed.
+   * {@inheritDoc}
    */
-  public FreeDiskSpaceRetentionPolicy(String dir, String prefix,
-                                 long freeDiskSpace)
+  public void initializeLogRetentionPolicy(
+      FreeDiskSpaceLogRetentionPolicyCfg config)
   {
-    this.directory = new File(dir);
-    this.freeDiskSpace = freeDiskSpace;
-    this.prefix = prefix;
+    freeDiskSpace = config.getFreeDiskSpace();
+
+    config.addFreeDiskSpaceChangeListener(this);
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  public boolean isConfigurationChangeAcceptable(
+      FreeDiskSpaceLogRetentionPolicyCfg config,
+      List<String> unacceptableReasons)
+  {
+    // Changes should always be OK
+    return true;
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public ConfigChangeResult applyConfigurationChange(
+      FreeDiskSpaceLogRetentionPolicyCfg config)
+  {
+    // Default result code.
+    ResultCode resultCode = ResultCode.SUCCESS;
+    boolean adminActionRequired = false;
+    ArrayList<String> messages = new ArrayList<String>();
+
+    freeDiskSpace = config.getFreeDiskSpace();
+
+    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+  }
 
   /**
    * This method deletes files based on the policy.
    *
+   * @param writer the multi file text writer writing the log files.
    * @return number of files deleted.
    */
-  public int deleteFiles()
+  public int deleteFiles(MultifileTextWriter writer)
   {
+    File[] files = writer.getNamingPolicy().listFiles();
+
+    if(files.length <= 0)
+    {
+      return 0;
+    }
+
     int count = 0;
     long freeSpace = 0;
+
     try
     {
       // Use reflection to see use the getFreeSpace method if available.
       // this method is only available on Java 6.
       Method meth = File.class.getMethod("getFreeSpace", new Class[0]);
-      Object value = meth.invoke(this.directory);
+      Object value = meth.invoke(files[0]);
       freeSpace = ((Long) value).longValue();
     }
     catch (Exception e)
@@ -88,6 +126,12 @@
       return 0;
     }
 
+          if(debugEnabled())
+      {
+        debugInfo("Current free disk space: %d, Required: %d", freeSpace,
+                  freeDiskSpace);
+      }
+
     if (freeSpace > freeDiskSpace)
     {
       // No cleaning needed.
@@ -95,17 +139,19 @@
     }
 
     long freeSpaceNeeded = freeDiskSpace - freeSpace;
-    File[] selectedFiles = directory.listFiles(new LogFileFilter(prefix));
 
     // Sort files based on last modified time.
-    Arrays.sort(selectedFiles, new FileComparator());
+    Arrays.sort(files, new FileComparator());
 
     long freedSpace = 0;
-    for (int j = selectedFiles.length - 1; j < 1; j--)
+    for (int j = files.length - 1; j < 1; j--)
     {
-      freedSpace += selectedFiles[j].length();
-      // System.out.println("Deleting log file:" + selectedFiles[j]);
-      selectedFiles[j].delete();
+      freedSpace += files[j].length();
+      if(debugEnabled())
+      {
+        debugInfo("Deleting log file:", files[j]);
+      }
+      files[j].delete();
       if (freedSpace >= freeSpaceNeeded)
       {
         break;

--
Gitblit v1.10.0