From 6b3ef14a652f6be0d559365d2fd2c78a61524fec Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Fri, 17 Sep 2010 22:06:25 +0000
Subject: [PATCH] Minimize Historical Data (dsreplication/client side). The purge historical can be executed on the local server even when it is stopped. This is matches the functionality provided by utilities such import-ldif, backup, etc.
---
opends/src/server/org/opends/server/backends/task/RecurringTask.java | 145 ++++++++++++++++++++++++++++++++++++++----------
1 files changed, 115 insertions(+), 30 deletions(-)
diff --git a/opends/src/server/org/opends/server/backends/task/RecurringTask.java b/opends/src/server/org/opends/server/backends/task/RecurringTask.java
index 16b4ed9..c58a9d6 100644
--- a/opends/src/server/org/opends/server/backends/task/RecurringTask.java
+++ b/opends/src/server/org/opends/server/backends/task/RecurringTask.java
@@ -64,6 +64,9 @@
/**
* This class defines a information about a recurring task, which will be used
* to repeatedly schedule tasks for processing.
+ * <br>
+ * It also provides some static methods that allow to validate strings in
+ * crontab (5) format.
*/
public class RecurringTask
{
@@ -102,6 +105,12 @@
*/
private static enum TaskTab {MINUTE, HOUR, DAY, MONTH, WEEKDAY};
+ private final static int MINUTE_INDEX = 0;
+ private final static int HOUR_INDEX = 1;
+ private final static int DAY_INDEX = 2;
+ private final static int MONTH_INDEX = 3;
+ private final static int WEEKDAY_INDEX = 4;
+
// Exact match pattern.
private static final Pattern exactPattern =
Pattern.compile("\\d+");
@@ -115,11 +124,11 @@
Pattern.compile("^(\\d+,)(.*)(\\d+)$");
// Boolean arrays holding task tab slots.
- private boolean[] minutesArray;
- private boolean[] hoursArray;
- private boolean[] daysArray;
- private boolean[] monthArray;
- private boolean[] weekdayArray;
+ private final boolean[] minutesArray;
+ private final boolean[] hoursArray;
+ private final boolean[] daysArray;
+ private final boolean[] monthArray;
+ private final boolean[] weekdayArray;
/**
* Creates a new recurring task based on the information in the provided
@@ -225,7 +234,16 @@
}
String taskScheduleTab = value.toString();
- parseTaskTab(taskScheduleTab);
+
+ boolean[][] taskArrays = new boolean[][]{null, null, null, null, null};
+
+ parseTaskTab(taskScheduleTab, taskArrays, true);
+
+ minutesArray = taskArrays[MINUTE_INDEX];
+ hoursArray = taskArrays[HOUR_INDEX];
+ daysArray = taskArrays[DAY_INDEX];
+ monthArray = taskArrays[MONTH_INDEX];
+ weekdayArray = taskArrays[WEEKDAY_INDEX];
// Get the class name from the entry. If there isn't one, then fail.
attrType = DirectoryServer.getAttributeType(
@@ -451,14 +469,41 @@
* @param taskSchedule recurring task schedule tab in crontab(5) format.
* @throws DirectoryException to indicate an error.
*/
- private void parseTaskTab(String taskSchedule) throws DirectoryException
+ public static void parseTaskTab(String taskSchedule) throws DirectoryException
+ {
+ parseTaskTab(taskSchedule, new boolean[][]{null, null, null, null, null},
+ false);
+ }
+
+ /**
+ * Parse and validate recurring task schedule.
+ * @param taskSchedule recurring task schedule tab in crontab(5) format.
+ * @param arrays, an array of 5 boolean arrays. The array has the following
+ * structure: {minutesArray, hoursArray, daysArray, monthArray, weekdayArray}.
+ * @param referToTaskEntryAttribute whether the error messages must refer
+ * to the task entry attribute or not. This is used to have meaningful
+ * messages when the {@link #parseTaskTab(String)} is called to validate
+ * a crontab formatted string.
+ * @throws DirectoryException to indicate an error.
+ */
+ private static void parseTaskTab(String taskSchedule,
+ boolean[][] arrays,
+ boolean referToTaskEntryAttribute) throws DirectoryException
{
StringTokenizer st = new StringTokenizer(taskSchedule);
if (st.countTokens() != TASKTAB_NUM_TOKENS) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_N_TOKENS.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_N_TOKENS.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_N_TOKENS_SIMPLE.get());
+ }
}
for (TaskTab taskTabToken : TaskTab.values()) {
@@ -466,47 +511,87 @@
switch (taskTabToken) {
case MINUTE:
try {
- minutesArray = parseTaskTabField(token, 0, 59);
+ arrays[MINUTE_INDEX] = parseTaskTabField(token, 0, 59);
} catch (IllegalArgumentException e) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_MINUTE_TOKEN.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_MINUTE_TOKEN.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_MINUTE_TOKEN_SIMPLE.get());
+ }
}
break;
case HOUR:
try {
- hoursArray = parseTaskTabField(token, 0, 23);
+ arrays[HOUR_INDEX] = parseTaskTabField(token, 0, 23);
} catch (IllegalArgumentException e) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_HOUR_TOKEN.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_HOUR_TOKEN.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_HOUR_TOKEN_SIMPLE.get());
+ }
}
break;
case DAY:
try {
- daysArray = parseTaskTabField(token, 1, 31);
+ arrays[DAY_INDEX] = parseTaskTabField(token, 1, 31);
} catch (IllegalArgumentException e) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_DAY_TOKEN.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_DAY_TOKEN.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_DAY_TOKEN_SIMPLE.get());
+ }
}
break;
case MONTH:
try {
- monthArray = parseTaskTabField(token, 1, 12);
+ arrays[MONTH_INDEX] = parseTaskTabField(token, 1, 12);
} catch (IllegalArgumentException e) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_MONTH_TOKEN.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_MONTH_TOKEN.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_MONTH_TOKEN_SIMPLE.get());
+ }
}
break;
case WEEKDAY:
try {
- weekdayArray = parseTaskTabField(token, 0, 6);
+ arrays[WEEKDAY_INDEX] = parseTaskTabField(token, 0, 6);
} catch (IllegalArgumentException e) {
- throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
- ERR_RECURRINGTASK_INVALID_WEEKDAY_TOKEN.get(
- ATTR_RECURRING_TASK_SCHEDULE));
+ if (referToTaskEntryAttribute)
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_WEEKDAY_TOKEN.get(
+ ATTR_RECURRING_TASK_SCHEDULE));
+ }
+ else
+ {
+ throw new DirectoryException(ResultCode.CONSTRAINT_VIOLATION,
+ ERR_RECURRINGTASK_INVALID_WEEKDAY_TOKEN_SIMPLE.get());
+ }
}
break;
}
--
Gitblit v1.10.0