From d755882f59202fe62b2ad5a141b3c044c1898aa6 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:

---
 opends/src/server/org/opends/server/loggers/FixedTimeRotationPolicy.java |  148 ++++++++++++++++++++++++++-----------------------
 1 files changed, 79 insertions(+), 69 deletions(-)

diff --git a/opends/src/server/org/opends/server/loggers/FixedTimeRotationPolicy.java b/opends/src/server/org/opends/server/loggers/FixedTimeRotationPolicy.java
index a15fb86..e35d86f 100644
--- a/opends/src/server/org/opends/server/loggers/FixedTimeRotationPolicy.java
+++ b/opends/src/server/org/opends/server/loggers/FixedTimeRotationPolicy.java
@@ -26,117 +26,127 @@
  */
 package org.opends.server.loggers;
 
-import java.util.Calendar;
-import java.util.GregorianCalendar;
+import java.util.*;
 
 import org.opends.server.util.TimeThread;
 
 import static org.opends.server.loggers.debug.DebugLogger.debugEnabled;
 import static org.opends.server.loggers.debug.DebugLogger.debugInfo;
+import org.opends.server.admin.std.server.FixedTimeLogRotationPolicyCfg;
+import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.types.ConfigChangeResult;
+import org.opends.server.types.ResultCode;
 
 /**
  * This class implements a rotation policy based on fixed
  * day/time of day.
  */
-public class FixedTimeRotationPolicy implements RotationPolicy
+public class FixedTimeRotationPolicy implements
+    RotationPolicy<FixedTimeLogRotationPolicyCfg>,
+    ConfigurationChangeListener<FixedTimeLogRotationPolicyCfg>
 {
 
-  private static final long NEXT_DAY = 24 * 3600 * 1000;
+  private static final long MS_IN_DAY = 24 * 3600 * 1000;
 
+  // The scheduled rotation times as ms offsets from the beginnging of the day.
   private long[] rotationTimes;
-  private long nextRotationTime = 0;
 
   /**
-  * Time in HHmm format. Will be calculated as (hourOfDay*100) +
-  * minuteOfHour.
-  *
-  * @param  timeOfDays  The times at which log rotation should occur.
-  */
-
-  public FixedTimeRotationPolicy(int[] timeOfDays)
+   * {@inheritDoc}
+   */
+  public void initializeLogRotationPolicy(FixedTimeLogRotationPolicyCfg config)
   {
-    Calendar cal = new GregorianCalendar();
-    cal.set( Calendar.MILLISECOND, 0 );
-    cal.set( Calendar.SECOND, 0 );
-    cal.set( Calendar.MINUTE, 0 );
-    cal.set( Calendar.HOUR_OF_DAY, 0 );
-    long timeFromStartOfDay = cal.getTime().getTime();
+    rotationTimes = new long[config.getTimeOfDay().size()];
 
-    rotationTimes = new long[timeOfDays.length];
-
-    for(int i = 0; i < timeOfDays.length; i++)
+    int i = 0;
+    for(String time : config.getTimeOfDay())
     {
-      int hour = timeOfDays[i]/100;
-      int min = timeOfDays[i] - hour*100;
+      int hour = Integer.valueOf(time)/100;
+      int min = Integer.valueOf(time) - hour*100;
 
-      rotationTimes[i] = timeFromStartOfDay + hour*3600*1000 + min*60*1000;
+      rotationTimes[i++] = hour*3600*1000 + min*60*1000;
     }
 
-    long currTime = TimeThread.getTime();
+    Arrays.sort(rotationTimes);
 
-    nextRotationTime = getNextRotationTime(currTime, 0);
-
+    config.addFixedTimeChangeListener(this);
   }
 
   /**
-   * This method indicates if the log file should be
-   * rotated or not.
-   *
-   * @return true if the file needs to be rotated, false otherwise.
+   * {@inheritDoc}
    */
-  public boolean rotateFile()
+  public boolean isConfigurationChangeAcceptable(
+      FixedTimeLogRotationPolicyCfg config, List<String> unacceptableReasons)
   {
-    long currTime = TimeThread.getTime();
-    if (debugEnabled())
-    {
-      debugInfo("Rotation at fixed time: %d nextRotationTime: %d",
-                currTime, nextRotationTime);
-    }
-
-    if(currTime > nextRotationTime)
-    {
-      nextRotationTime = getNextRotationTime(currTime, nextRotationTime);
-      if (debugEnabled())
-      {
-        debugInfo("Setting next rotation to : %d", nextRotationTime);
-      }
-      return true;
-    }
-    return false;
+    // Changes should always be OK
+    return true;
   }
 
   /**
-   * Get the next rotation time.
-   *
-   * @param  currTime          The current time.
-   * @param  currRotationTime  The time we currently believe should be the next
-   *                           rotation time.
-   *
-   * @return  The time that should be used for the next log file rotation.
+   * {@inheritDoc}
    */
-  private long getNextRotationTime(long currTime, long currRotationTime)
+  public ConfigChangeResult applyConfigurationChange(
+      FixedTimeLogRotationPolicyCfg config)
   {
-    long prevRotationTime = currRotationTime;
-    for(int j = 0; j < rotationTimes.length; j++)
+    // Default result code.
+    ResultCode resultCode = ResultCode.SUCCESS;
+    boolean adminActionRequired = false;
+    ArrayList<String> messages = new ArrayList<String>();
+
+    rotationTimes = new long[config.getTimeOfDay().size()];
+
+    int i = 0;
+    for(String time : config.getTimeOfDay())
     {
-      if (currTime < rotationTimes[j])
+      int hour = Integer.valueOf(time)/100;
+      int min = Integer.valueOf(time) - hour*100;
+
+      rotationTimes[i++] = hour*3600*1000 + min*60*1000;
+    }
+
+    Arrays.sort(rotationTimes);
+
+    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  public boolean rotateFile(MultifileTextWriter writer)
+  {
+    long currTime = TimeThread.getTime();
+    long lastRotationTime = writer.getLastRotationTime();
+    long dayOfLastRotation = MS_IN_DAY * (lastRotationTime / MS_IN_DAY);
+    long hourOfLastRotation = lastRotationTime - dayOfLastRotation;
+
+    // Find a scheduled rotation time thats right after the last rotation time.
+    long hourOfNextRotation = 0;
+    for(long time : rotationTimes)
+    {
+      if(time > hourOfLastRotation)
       {
-        currRotationTime = rotationTimes[j];
+        hourOfNextRotation = time;
         break;
       }
     }
 
-    if(currRotationTime == prevRotationTime)
+    if(hourOfNextRotation <= 0)
     {
-      for(int k = 0; k < rotationTimes.length; k++)
-      {
-        rotationTimes[k] += NEXT_DAY;
-      }
-      currRotationTime = rotationTimes[0];
+      // Rotation alrealy happened after the latest fixed time for that day.
+      // Set it the first rotation time for the next day.
+      hourOfNextRotation = rotationTimes[0] + MS_IN_DAY;
     }
 
-    return currRotationTime;
-  }
+    long nextRotationTime = dayOfLastRotation + hourOfNextRotation;
 
+    if (debugEnabled())
+    {
+      debugInfo("As of %d, the next rotation at fixed time is: %d",
+                currTime, nextRotationTime);
+    }
+
+    return currTime > nextRotationTime;
+
+  }
 }
 

--
Gitblit v1.10.0