From 09ef01374239f7048c2db6bb9cad2b8a807d4cf8 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Wed, 28 Oct 2009 08:38:19 +0000
Subject: [PATCH] Fix#4320 ECL Replication Server only should not support 'cn=changelog' naming context

---
 opends/src/server/org/opends/server/replication/server/ReplicationServer.java |   84 +++++++++++++++++++-----------------------
 1 files changed, 38 insertions(+), 46 deletions(-)

diff --git a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index c0c1655..b4403da 100644
--- a/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -185,8 +185,11 @@
    */
   private static final DebugTracer TRACER = getTracer();
 
-  private String externalChangeLogWorkflowID = "External Changelog Workflow ID";
+  private static String externalChangeLogWorkflowID =
+    "External Changelog Workflow ID";
   ECLWorkflowElement eclwe;
+  WorkflowImpl externalChangeLogWorkflowImpl = null;
+
   private static HashSet<Integer> localPorts = new HashSet<Integer>();
 
   // used to synchronize the domain creation with the connect thread.
@@ -501,15 +504,6 @@
       socket.setTcpNoDelay(true);
       socket.connect(ServerAddr, 500);
 
-      /*
-      ServerHandler handler = new ServerHandler(
-           replSessionSecurity.createClientSession(serverURL, socket,
-           ReplSessionSecurity.HANDSHAKE_TIMEOUT),
-           queueSize);
-      handler.start(baseDn, serverId, this.serverURL, rcvWindow,
-                    sslEncryption, this);
-      */
-
       ReplicationServerHandler handler = new ReplicationServerHandler(
           replSessionSecurity.createClientSession(remoteServerURL,
               socket,
@@ -578,9 +572,14 @@
         serverId , this);
       listenThread.start();
 
-      // Initialize the External Changelog
-      // FIXME: how is WF creation enabed/disabled in the RS ?
-      initializeECL();
+      // Creates the ECL workflow elem so that DS (LDAPReplicationDomain)
+      // can know me and really enableECL.
+      if (WorkflowImpl.getWorkflow(externalChangeLogWorkflowID) != null)
+      {
+        // Already done . Nothing to do
+        return;
+      }
+      eclwe = new ECLWorkflowElement(this);
 
       if (debugEnabled())
         TRACER.debugInfo("RS " +getMonitorInstanceName()+
@@ -609,64 +608,57 @@
     {
       //FIXME:DirectoryException is raised by initializeECL => fix err msg
       Message message = Message.raw(Category.SYNC, Severity.SEVERE_ERROR,
-        "Directory Exception raised by ECL initialization: " + e.getMessage());
+      "Directory Exception raised by ECL initialization: " + e.getMessage());
       logError(message);
     }
   }
 
   /**
-   * Initializes the ECL access by creating a dedicated workflow element.
-   * @throws DirectoryException
+   * Enable the ECL access by creating a dedicated workflow element.
+   * @throws DirectoryException when an error occurs.
    */
-  private void initializeECL()
+  public void enableECL()
   throws DirectoryException
   {
-    WorkflowImpl externalChangeLogWorkflow;
-    if (WorkflowImpl.getWorkflow(externalChangeLogWorkflowID)
-        !=null)
+    if (externalChangeLogWorkflowImpl!=null)
+    {
+      // do nothing if ECL is already enabled
       return;
-
-    ECLWorkflowElement eclwe = new ECLWorkflowElement(this);
+    }
 
     // Create the workflow for the base DN and register the workflow with
     // the server.
-    externalChangeLogWorkflow = new WorkflowImpl(
+    externalChangeLogWorkflowImpl = new WorkflowImpl(
         externalChangeLogWorkflowID,
         DN.decode(ServerConstants.DN_EXTERNAL_CHANGELOG_ROOT),
         eclwe.getWorkflowElementID(),
         eclwe);
-    externalChangeLogWorkflow.register();
+    externalChangeLogWorkflowImpl.register();
 
     NetworkGroup defaultNetworkGroup = NetworkGroup.getDefaultNetworkGroup();
-    defaultNetworkGroup.registerWorkflow(externalChangeLogWorkflow);
+    defaultNetworkGroup.registerWorkflow(externalChangeLogWorkflowImpl);
 
     // FIXME:ECL should the ECL Workflow be registered in adminNetworkGroup?
     NetworkGroup adminNetworkGroup = NetworkGroup.getAdminNetworkGroup();
-    adminNetworkGroup.registerWorkflow(externalChangeLogWorkflow);
+    adminNetworkGroup.registerWorkflow(externalChangeLogWorkflowImpl);
 
     // FIXME:ECL should the ECL Workflow be registered in internalNetworkGroup?
     NetworkGroup internalNetworkGroup = NetworkGroup.getInternalNetworkGroup();
-    internalNetworkGroup.registerWorkflow(externalChangeLogWorkflow);
+    internalNetworkGroup.registerWorkflow(externalChangeLogWorkflowImpl);
 
-    try
-    {
-      enableECLVirtualAttr("lastexternalchangelogcookie",
-          new LastCookieVirtualProvider());
-      enableECLVirtualAttr("firstchangenumber",
-          new FirstChangeNumberVirtualAttributeProvider());
-      enableECLVirtualAttr("lastchangenumber",
-          new LastChangeNumberVirtualAttributeProvider());
-      enableECLVirtualAttr("changelog",
-          new ChangelogBaseDNVirtualAttributeProvider());
-    }
-    catch (Exception e)
-    {
-      TRACER.debugCaught(DebugLogLevel.ERROR, e);
-    }
+    enableECLVirtualAttr("lastexternalchangelogcookie",
+        new LastCookieVirtualProvider());
+    enableECLVirtualAttr("firstchangenumber",
+        new FirstChangeNumberVirtualAttributeProvider());
+    enableECLVirtualAttr("lastchangenumber",
+        new LastChangeNumberVirtualAttributeProvider());
+    enableECLVirtualAttr("changelog",
+        new ChangelogBaseDNVirtualAttributeProvider());
   }
 
-  private void enableECLVirtualAttr(String attrName,
+  private static void enableECLVirtualAttr(String attrName,
       VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> provider)
+  throws DirectoryException
   {
     Set<DN> baseDNs = new HashSet<DN>(0);
     Set<DN> groupDNs = new HashSet<DN>(0);
@@ -694,13 +686,13 @@
             baseDNs, groupDNs, filters, conflictBehavior);
 
       DirectoryServer.registerVirtualAttribute(rule);
-
     }
     catch (Exception e)
     {
       Message message =
-        NOTE_UNABLE_TO_ENABLE_ECL_VIRTUAL_ATTR.get(attrName, e.toString());
-      logError(message);
+        NOTE_ERR_UNABLE_TO_ENABLE_ECL_VIRTUAL_ATTR.get(attrName, e.toString());
+      throw new DirectoryException(ResultCode.OPERATIONS_ERROR,
+          message, e);
     }
   }
 

--
Gitblit v1.10.0