From 2273c26793fe6e3abfd90a400823e8e46b3303bb Mon Sep 17 00:00:00 2001
From: abobrov <abobrov@localhost>
Date: Mon, 15 Dec 2008 16:07:29 +0000
Subject: [PATCH] - [Issue 274]  Recurring Tasks

---
 opends/src/server/org/opends/server/tools/tasks/TaskClient.java |   94 ++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/opends/src/server/org/opends/server/tools/tasks/TaskClient.java b/opends/src/server/org/opends/server/tools/tasks/TaskClient.java
index 868bdce..8d58d55 100644
--- a/opends/src/server/org/opends/server/tools/tasks/TaskClient.java
+++ b/opends/src/server/org/opends/server/tools/tasks/TaskClient.java
@@ -69,7 +69,10 @@
 import java.util.Date;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicInteger;
+import org.opends.server.protocols.ldap.DeleteRequestProtocolOp;
+import org.opends.server.protocols.ldap.DeleteResponseProtocolOp;
 
 /**
  * Helper class for interacting with the task backend on behalf of utilities
@@ -109,16 +112,33 @@
   public synchronized TaskEntry schedule(TaskScheduleInformation information)
           throws LDAPException, IOException, ASN1Exception, TaskClientException
   {
+    String taskID = null;
+    ASN1OctetString entryDN = null;
+    boolean scheduleRecurring = false;
+
     LDAPReader reader = connection.getLDAPReader();
     LDAPWriter writer = connection.getLDAPWriter();
 
-    // Use a formatted time/date for the ID so that is remotely useful
-    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssMM");
-    String taskID = df.format(new Date());
+    if (information.getRecurringDateTime() != null) {
+      scheduleRecurring = true;
+    }
 
-    ASN1OctetString entryDN =
-         new ASN1OctetString(ATTR_TASK_ID + "=" + taskID + "," +
-                             SCHEDULED_TASK_BASE_RDN + "," + DN_TASK_ROOT);
+    if (scheduleRecurring) {
+      taskID = information.getTaskId();
+      if ((taskID == null) || taskID.length() == 0) {
+        taskID = information.getTaskClass().getSimpleName() +
+          "-" + UUID.randomUUID().toString();
+      }
+      entryDN = new ASN1OctetString(ATTR_RECURRING_TASK_ID + "=" +
+        taskID + "," + RECURRING_TASK_BASE_RDN + "," + DN_TASK_ROOT);
+    } else {
+      // Use a formatted time/date for the ID so that is remotely useful
+      SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssMM");
+      taskID = df.format(new Date());
+
+      entryDN = new ASN1OctetString(ATTR_TASK_ID + "=" + taskID + "," +
+        SCHEDULED_TASK_BASE_RDN + "," + DN_TASK_ROOT);
+    }
 
     ArrayList<LDAPControl> controls = new ArrayList<LDAPControl>();
 
@@ -127,11 +147,20 @@
     ArrayList<ASN1OctetString> ocValues = new ArrayList<ASN1OctetString>(3);
     ocValues.add(new ASN1OctetString("top"));
     ocValues.add(new ASN1OctetString(ConfigConstants.OC_TASK));
+
+    if (scheduleRecurring) {
+      ocValues.add(new ASN1OctetString(ConfigConstants.OC_RECURRING_TASK));
+    }
+
     ocValues.add(new ASN1OctetString(information.getTaskObjectclass()));
     attributes.add(new LDAPAttribute(ATTR_OBJECTCLASS, ocValues));
 
     ArrayList<ASN1OctetString> taskIDValues = new ArrayList<ASN1OctetString>(1);
     taskIDValues.add(new ASN1OctetString(taskID));
+
+    if (scheduleRecurring) {
+      attributes.add(new LDAPAttribute(ATTR_RECURRING_TASK_ID, taskIDValues));
+    }
     attributes.add(new LDAPAttribute(ATTR_TASK_ID, taskIDValues));
 
     ArrayList<ASN1OctetString> classValues = new ArrayList<ASN1OctetString>(1);
@@ -149,6 +178,15 @@
               startDateValues));
     }
 
+    if (scheduleRecurring) {
+      ArrayList<ASN1OctetString> recurringPatternValues =
+        new ArrayList<ASN1OctetString>(1);
+      recurringPatternValues.add(new ASN1OctetString(
+        information.getRecurringDateTime()));
+      attributes.add(new LDAPAttribute(ATTR_RECURRING_TASK_SCHEDULE,
+        recurringPatternValues));
+    }
+
     // add dependency IDs
     List<String> dependencyIds = information.getDependencyIds();
     if (dependencyIds != null && dependencyIds.size() > 0) {
@@ -340,14 +378,13 @@
    * Changes that the state of the task in the backend to a canceled state.
    *
    * @param  id if the task to cancel
-   * @return Entry of the task before the modification
    * @throws IOException if there is a stream communication problem
    * @throws LDAPException if there is a problem getting information
    *         out to the directory
    * @throws ASN1Exception if there is a problem with the encoding
    * @throws TaskClientException if there is no task with the requested id
    */
-  public synchronized TaskEntry cancelTask(String id)
+  public synchronized void cancelTask(String id)
           throws TaskClientException, IOException, ASN1Exception, LDAPException
   {
     LDAPReader reader = connection.getLDAPReader();
@@ -373,11 +410,6 @@
         LDAPAttribute attr = new LDAPAttribute(ATTR_TASK_STATE, values);
         mods.add(new LDAPModification(ModificationType.REPLACE, attr));
 
-        // We have to reset the start time or the scheduler will
-        // reschedule to task.
-        // attr = new LDAPAttribute(ATTR_TASK_SCHEDULED_START_TIME);
-        // mods.add(new LDAPModification(ModificationType.DELETE, attr));
-
         ModifyRequestProtocolOp modRequest =
                 new ModifyRequestProtocolOp(dn, mods);
         LDAPMessage requestMessage =
@@ -409,6 +441,41 @@
                   LDAPResultCode.CLIENT_SIDE_LOCAL_ERROR,
                   errorMessage);
         }
+      } else if (TaskState.isRecurring(state)) {
+
+        ASN1OctetString dn = new ASN1OctetString(entry.getDN().toString());
+        DeleteRequestProtocolOp deleteRequest =
+          new DeleteRequestProtocolOp(dn);
+
+        LDAPMessage requestMessage = new LDAPMessage(
+          nextMessageID.getAndIncrement(), deleteRequest, null);
+
+        writer.writeMessage(requestMessage);
+
+        LDAPMessage responseMessage = reader.readMessage();
+
+        if (responseMessage == null) {
+          Message message = ERR_TASK_CLIENT_UNEXPECTED_CONNECTION_CLOSURE.get();
+          throw new LDAPException(UNAVAILABLE.getIntValue(), message);
+        }
+
+        if (responseMessage.getProtocolOpType() !=
+                LDAPConstants.OP_TYPE_DELETE_RESPONSE)
+        {
+          throw new LDAPException(
+                  LDAPResultCode.CLIENT_SIDE_LOCAL_ERROR,
+                  ERR_TASK_CLIENT_INVALID_RESPONSE_TYPE.get(
+                    responseMessage.getProtocolOpName()));
+        }
+
+        DeleteResponseProtocolOp deleteResponse =
+                responseMessage.getDeleteResponseProtocolOp();
+        Message errorMessage = deleteResponse.getErrorMessage();
+        if (errorMessage != null) {
+          throw new LDAPException(
+                  LDAPResultCode.CLIENT_SIDE_LOCAL_ERROR,
+                  errorMessage);
+        }
       } else {
         throw new TaskClientException(
                 ERR_TASK_CLIENT_UNCANCELABLE_TASK.get(id));
@@ -417,7 +484,6 @@
       throw new TaskClientException(
               ERR_TASK_CLIENT_TASK_STATE_UNKNOWN.get(id));
     }
-    return getTaskEntry(id);
   }
 
 

--
Gitblit v1.10.0