From 2b71499102401aee3dc084355a293abb45f81a28 Mon Sep 17 00:00:00 2001
From: Nicolas Capponi <nicolas.capponi@forgerock.com>
Date: Mon, 21 Jul 2014 12:22:07 +0000
Subject: [PATCH] Checkpoint commit for OPENDJ-1206 : Create a new ReplicationBackend/ChangelogBackend   to support cn=changelog CR-4052

---
 opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java |   28 ++++++++++----
 opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationWrapper.java                              |   17 ++++++++
 opendj-sdk/opends/src/messages/messages/core.properties                                                      |    7 ++-
 opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationBasis.java                                |   19 +++++++++
 opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java                                     |   20 +++++++++
 5 files changed, 78 insertions(+), 13 deletions(-)

diff --git a/opendj-sdk/opends/src/messages/messages/core.properties b/opendj-sdk/opends/src/messages/messages/core.properties
index a03040b..a854126 100644
--- a/opendj-sdk/opends/src/messages/messages/core.properties
+++ b/opendj-sdk/opends/src/messages/messages/core.properties
@@ -20,7 +20,7 @@
 # CDDL HEADER END
 #
 #      Copyright 2006-2010 Sun Microsystems, Inc.
-#      Portions copyright 2011-2012 ForgeRock AS
+#      Portions copyright 2011-2014 ForgeRock AS
 
 
 
@@ -1429,4 +1429,7 @@
 SEVERE_ERR_PWPOLICY_REJECT_DUE_TO_UNKNOWN_VALIDATOR_LOG_747=The password for \
  user %s could not be validated because the password policy subentry %s is \
  referring to an unknown password validator (%s). Please make sure the password \
- policy subentry only refers to validators that exist on all replicas
\ No newline at end of file
+ policy subentry only refers to validators that exist on all replicas
+MILD_ERR_SEARCH_UNSUPPORTED_CRITICAL_CONTROL_ECL_COOKIE_EXCHANGE_748=The search request \
+ cannot be processed because the backend "%s" does not support the Changelog Exchange Control \
+  (oid: 1.3.6.1.4.1.26027.1.5.4)
\ No newline at end of file
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
index b94cc35..00b3676 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperation.java
@@ -22,13 +22,14 @@
  *
  *
  *      Copyright 2006-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
 import java.util.List;
 import java.util.Set;
 
+import org.opends.server.controls.ExternalChangelogRequestControl;
 import org.opends.server.controls.MatchedValuesControl;
 import org.opends.server.types.*;
 
@@ -488,4 +489,21 @@
    */
   public abstract void setProxiedAuthorizationDN(DN proxiedAuthorizationDN);
 
+  /**
+   * Retrieves the external changelog request control.
+   *
+   * @return the external changelog request control, or {@code null}
+   *  if the control has not been requested.
+   */
+  public abstract ExternalChangelogRequestControl getECLRequestControl();
+
+  /**
+   * Sets the external changelog request control.
+   * <p>
+   * It should be set only when searching the external changelog.
+   *
+   * @param control
+   *            The external changelog request control.
+   */
+  public abstract void setECLRequestControl(ExternalChangelogRequestControl control);
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationBasis.java b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationBasis.java
index 62cd5f5..296488e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationBasis.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationBasis.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2006-2010 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
@@ -34,6 +34,7 @@
 import org.opends.server.api.ClientConnection;
 import org.opends.server.api.plugin.PluginResult;
 import org.opends.server.controls.AccountUsableResponseControl;
+import org.opends.server.controls.ExternalChangelogRequestControl;
 import org.opends.server.controls.MatchedValuesControl;
 import org.opends.server.core.networkgroups.NetworkGroup;
 import org.opends.server.loggers.debug.DebugLogger;
@@ -163,6 +164,8 @@
   /** Indicates whether to send the search result done to the client or not. */
   private boolean sendResponse = true;
 
+  private ExternalChangelogRequestControl eclRequestControl;
+
   /**
    * Creates a new search operation with the provided information.
    *
@@ -1078,6 +1081,20 @@
     this.matchedValuesControl = controls;
   }
 
+  /** {@inheritDoc} */
+  @Override
+  public ExternalChangelogRequestControl getECLRequestControl()
+  {
+    return eclRequestControl;
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public void setECLRequestControl(ExternalChangelogRequestControl control)
+  {
+    eclRequestControl = control;
+  }
+
   /**
    * {@inheritDoc}
    */
diff --git a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationWrapper.java b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationWrapper.java
index 882e388..9bae780 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationWrapper.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/core/SearchOperationWrapper.java
@@ -22,13 +22,14 @@
  *
  *
  *      Copyright 2008-2009 Sun Microsystems, Inc.
- *      Portions Copyright 2011-2013 ForgeRock AS
+ *      Portions Copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.core;
 
 import java.util.List;
 import java.util.Set;
 
+import org.opends.server.controls.ExternalChangelogRequestControl;
 import org.opends.server.controls.MatchedValuesControl;
 import org.opends.server.types.*;
 
@@ -492,4 +493,18 @@
     getOperation().setProxiedAuthorizationDN(proxiedAuthorizationDN);
   }
 
+  /** {@inheritDoc} */
+  @Override
+  public ExternalChangelogRequestControl getECLRequestControl()
+  {
+    return getOperation().getECLRequestControl();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  public void setECLRequestControl(ExternalChangelogRequestControl control)
+  {
+    getOperation().setECLRequestControl(control);
+  }
+
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
index 1a6fe96..00970f5 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/workflowelement/localbackend/LocalBackendSearchOperation.java
@@ -22,7 +22,7 @@
  *
  *
  *      Copyright 2008-2010 Sun Microsystems, Inc.
- *      Portions copyright 2011-2013 ForgeRock AS
+ *      Portions copyright 2011-2014 ForgeRock AS
  */
 package org.opends.server.workflowelement.localbackend;
 
@@ -526,20 +526,32 @@
         {
           // Do nothing here and let AciHandler deal with it.
         }
-
-        // NYI -- Add support for additional controls.
-
-        else if (c.isCritical())
+        else if (OID_ECL_COOKIE_EXCHANGE_CONTROL.equals(oid))
         {
-          if ((backend == null) || (! backend.supportsControl(oid)))
+          if (c.isCritical() && !backendSupportsControl(oid))
           {
             throw new DirectoryException(
-                           ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
-                           ERR_SEARCH_UNSUPPORTED_CRITICAL_CONTROL.get(oid));
+                ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+                ERR_SEARCH_UNSUPPORTED_CRITICAL_CONTROL_ECL_COOKIE_EXCHANGE.get(backend.getBackendID()));
           }
+          setECLRequestControl(getRequestControl(ExternalChangelogRequestControl.DECODER));
+        }
+        // NYI -- Add support for additional controls.
+
+        else if (c.isCritical() && !backendSupportsControl(oid))
+        {
+          throw new DirectoryException(
+              ResultCode.UNAVAILABLE_CRITICAL_EXTENSION,
+              ERR_SEARCH_UNSUPPORTED_CRITICAL_CONTROL.get(oid));
         }
       }
     }
   }
+
+  /** Indicates if the backend supports the control corresponding to provided oid. */
+  private boolean backendSupportsControl(final String oid)
+  {
+    return backend != null && backend.supportsControl(oid);
+  }
 }
 

--
Gitblit v1.10.0