From 6e5d7708b9243d6dceff73d7e1127cbe16e1e024 Mon Sep 17 00:00:00 2001
From: pgamba <pgamba@localhost>
Date: Mon, 19 Oct 2009 12:45:50 +0000
Subject: [PATCH] Fix#4261 ECL Virtual attributes should be internal only (and removed from config.ldif)

---
 opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java                         |   61 ++++++++++++++-
 opendj-sdk/opends/src/messages/messages/replication.properties                                                   |    2 
 opendj-sdk/opends/resource/config/config.ldif                                                                    |   33 --------
 opendj-sdk/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java |   25 +-----
 opendj-sdk/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java  |   28 +-----
 opendj-sdk/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java                 |   37 ++++-----
 6 files changed, 84 insertions(+), 102 deletions(-)

diff --git a/opendj-sdk/opends/resource/config/config.ldif b/opendj-sdk/opends/resource/config/config.ldif
index babea19..a19d032 100644
--- a/opendj-sdk/opends/resource/config/config.ldif
+++ b/opendj-sdk/opends/resource/config/config.ldif
@@ -2459,39 +2459,6 @@
 ds-cfg-filter: (&(objectClass=groupOfUniqueNames)(objectClass=ds-virtual-static-group))
 ds-cfg-allow-retrieving-membership: false
 
-dn: cn=Last External Changelog Cookie,cn=Virtual Attributes,cn=config
-objectClass: ds-cfg-virtual-attribute
-objectClass: ds-cfg-user-defined-virtual-attribute
-objectClass: top
-cn: Last External Changelog Cookie
-ds-cfg-attribute-type: lastExternalChangelogCookie
-ds-cfg-enabled: true
-ds-cfg-java-class: org.opends.server.replication.common.LastCookieVirtualProvider
-ds-cfg-value: 1
-ds-cfg-filter: (objectClass=ds-root-dse)
-
-dn: cn=External Changelog First Draft Change Number,cn=Virtual Attributes,cn=config
-objectClass: ds-cfg-virtual-attribute
-objectClass: ds-cfg-user-defined-virtual-attribute
-objectClass: top
-cn: External Changelog First Draft Change Number
-ds-cfg-attribute-type: firstChangeNumber
-ds-cfg-enabled: true
-ds-cfg-java-class: org.opends.server.replication.common.FirstChangeNumberVirtualAttributeProvider
-ds-cfg-value: 0
-ds-cfg-filter: (objectClass=ds-root-dse)
-
-dn: cn=External Changelog Last Draft Change Number,cn=Virtual Attributes,cn=config
-objectClass: ds-cfg-virtual-attribute
-objectClass: ds-cfg-user-defined-virtual-attribute
-objectClass: top
-cn: External Changelog Last Draft Change Number
-ds-cfg-attribute-type: lastChangeNumber
-ds-cfg-enabled: true
-ds-cfg-java-class: org.opends.server.replication.common.LastChangeNumberVirtualAttributeProvider
-ds-cfg-value: 0
-ds-cfg-filter: (objectClass=ds-root-dse)
-
 dn: cn=Work Queue,cn=config
 objectClass: top
 objectClass: ds-cfg-work-queue
diff --git a/opendj-sdk/opends/src/messages/messages/replication.properties b/opendj-sdk/opends/src/messages/messages/replication.properties
index 71e4264..a09b5a6 100644
--- a/opendj-sdk/opends/src/messages/messages/replication.properties
+++ b/opendj-sdk/opends/src/messages/messages/replication.properties
@@ -435,3 +435,5 @@
  server for %s in local server id %s
 SEVERE_ERR_SERVER_BADLY_DISCONNECTED_181= %s has badly disconnected from this \
  replication server %s
+NOTICE_UNABLE_TO_ENABLE_ECL_VIRTUAL_ATTR_182=Error when loading a virtual \
+ attribute for external change log: Attribute: %s , Error: %s
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java b/opendj-sdk/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
index 0c332e2..f3459f8 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/common/FirstChangeNumberVirtualAttributeProvider.java
@@ -65,9 +65,6 @@
        extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
        implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
 {
-  // The current configuration for this virtual attribute provider.
-  private UserDefinedVirtualAttributeCfg currentConfig;
-
   /**
    * Creates a new instance of this member virtual attribute provider.
    */
@@ -89,8 +86,7 @@
                             UserDefinedVirtualAttributeCfg configuration)
          throws ConfigException, InitializationException
   {
-    this.currentConfig = configuration;
-    configuration.addUserDefinedChangeListener(this);
+    // No initialization required
   }
 
 
@@ -101,7 +97,7 @@
   @Override()
   public void finalizeVirtualAttributeProvider()
   {
-    currentConfig.removeUserDefinedChangeListener(this);
+    //
   }
 
 
@@ -112,14 +108,7 @@
   @Override()
   public boolean isMultiValued()
   {
-    if (currentConfig == null)
-    {
-      return true;
-    }
-    else
-    {
-      return (currentConfig.getValue().size() > 1);
-    }
+    return false;
   }
 
 
@@ -200,8 +189,7 @@
                       UserDefinedVirtualAttributeCfg configuration,
                       List<Message> unacceptableReasons)
   {
-    // The new configuration should always be acceptable.
-    return true;
+    return false;
   }
 
 
@@ -212,10 +200,7 @@
   public ConfigChangeResult applyConfigurationChange(
                                  UserDefinedVirtualAttributeCfg configuration)
   {
-    // Just accept the new configuration as-is.
-    currentConfig = configuration;
-
-    return new ConfigChangeResult(ResultCode.SUCCESS, false);
+    return new ConfigChangeResult(ResultCode.OTHER, false);
   }
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java b/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
index c8a068b..a17a07d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastChangeNumberVirtualAttributeProvider.java
@@ -25,7 +25,6 @@
  *      Copyright 2009 Sun Microsystems, Inc.
  */
 package org.opends.server.replication.common;
-import static org.opends.server.loggers.debug.DebugLogger.getTracer;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -40,7 +39,6 @@
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.SearchOperation;
-import org.opends.server.loggers.debug.DebugTracer;
 import org.opends.server.replication.plugin.MultimasterReplication;
 import org.opends.server.replication.server.ReplicationServer;
 import org.opends.server.types.AttributeValue;
@@ -67,10 +65,6 @@
        extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
        implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
 {
-  private static final DebugTracer TRACER = getTracer();
-  // The current configuration for this virtual attribute provider.
-  private UserDefinedVirtualAttributeCfg currentConfig;
-
   /**
    * Creates a new instance of this member virtual attribute provider.
    */
@@ -92,8 +86,7 @@
                             UserDefinedVirtualAttributeCfg configuration)
          throws ConfigException, InitializationException
   {
-    this.currentConfig = configuration;
-    configuration.addUserDefinedChangeListener(this);
+    // No initialization required
   }
 
 
@@ -104,7 +97,7 @@
   @Override()
   public void finalizeVirtualAttributeProvider()
   {
-    currentConfig.removeUserDefinedChangeListener(this);
+    //
   }
 
 
@@ -115,14 +108,7 @@
   @Override()
   public boolean isMultiValued()
   {
-    if (currentConfig == null)
-    {
-      return true;
-    }
-    else
-    {
-      return (currentConfig.getValue().size() > 1);
-    }
+    return false;
   }
 
 
@@ -202,8 +188,7 @@
                       UserDefinedVirtualAttributeCfg configuration,
                       List<Message> unacceptableReasons)
   {
-    // The new configuration should always be acceptable.
-    return true;
+    return false;
   }
 
 
@@ -214,10 +199,7 @@
   public ConfigChangeResult applyConfigurationChange(
                                  UserDefinedVirtualAttributeCfg configuration)
   {
-    // Just accept the new configuration as-is.
-    currentConfig = configuration;
-
-    return new ConfigChangeResult(ResultCode.SUCCESS, false);
+    return new ConfigChangeResult(ResultCode.OTHER, false);
   }
 }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java b/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
index 8bf4b39..263691e 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/common/LastCookieVirtualProvider.java
@@ -62,10 +62,6 @@
    extends VirtualAttributeProvider<UserDefinedVirtualAttributeCfg>
    implements ConfigurationChangeListener<UserDefinedVirtualAttributeCfg>
 {
-  // The current configuration for this virtual attribute provider.
-  private UserDefinedVirtualAttributeCfg currentConfig;
-
-
 
   /**
    * Creates a new instance of this member virtual attribute provider.
@@ -88,8 +84,7 @@
                             UserDefinedVirtualAttributeCfg configuration)
          throws ConfigException, InitializationException
   {
-    this.currentConfig = configuration;
-    configuration.addUserDefinedChangeListener(this);
+    // No initialization required
   }
 
 
@@ -100,10 +95,21 @@
   @Override()
   public void finalizeVirtualAttributeProvider()
   {
-    currentConfig.removeUserDefinedChangeListener(this);
+    //
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override()
+  public boolean hasValue(Entry entry, VirtualAttributeRule rule)
+  {
+    // Indicates whether this virtual attribute provider will generate
+    // at least one value for the provided entry.
+    // True is the DN is the one of the root DSE : "".
+    return entry.getDN().toNormalizedString().equalsIgnoreCase("");
 
+  }
 
   /**
    * {@inheritDoc}
@@ -111,14 +117,7 @@
   @Override()
   public boolean isMultiValued()
   {
-    if (currentConfig == null)
-    {
-      return true;
-    }
-    else
-    {
-      return (currentConfig.getValue().size() > 1);
-    }
+    return false;
   }
 
 
@@ -194,8 +193,7 @@
                       UserDefinedVirtualAttributeCfg configuration,
                       List<Message> unacceptableReasons)
   {
-    // The new configuration should always be acceptable.
-    return true;
+    return false;
   }
 
 
@@ -206,9 +204,6 @@
   public ConfigChangeResult applyConfigurationChange(
                                  UserDefinedVirtualAttributeCfg configuration)
   {
-    // Just accept the new configuration as-is.
-    currentConfig = configuration;
-
-    return new ConfigChangeResult(ResultCode.SUCCESS, false);
+    return new ConfigChangeResult(ResultCode.OTHER, false);
   }
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
index c0c6094..7a461f0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/replication/server/ReplicationServer.java
@@ -57,22 +57,23 @@
 import org.opends.messages.MessageBuilder;
 import org.opends.messages.Severity;
 import org.opends.server.admin.server.ConfigurationChangeListener;
+import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn;
+import org.opends.server.admin.std.meta.VirtualAttributeCfgDefn.*;
 import org.opends.server.admin.std.server.ReplicationServerCfg;
+import org.opends.server.admin.std.server.UserDefinedVirtualAttributeCfg;
 import org.opends.server.api.Backend;
 import org.opends.server.api.BackupTaskListener;
 import org.opends.server.api.ExportTaskListener;
 import org.opends.server.api.ImportTaskListener;
 import org.opends.server.api.RestoreTaskListener;
+import org.opends.server.api.VirtualAttributeProvider;
 import org.opends.server.config.ConfigException;
 import org.opends.server.core.DirectoryServer;
 import org.opends.server.core.WorkflowImpl;
 import org.opends.server.core.networkgroups.NetworkGroup;
 import org.opends.server.loggers.LogLevel;
 import org.opends.server.loggers.debug.DebugTracer;
-import org.opends.server.replication.common.ChangeNumber;
-import org.opends.server.replication.common.ExternalChangeLogSession;
-import org.opends.server.replication.common.MultiDomainServerState;
-import org.opends.server.replication.common.ServerState;
+import org.opends.server.replication.common.*;
 import org.opends.server.replication.protocol.ProtocolSession;
 import org.opends.server.replication.protocol.ReplServerStartMsg;
 import org.opends.server.replication.protocol.ReplSessionSecurity;
@@ -81,6 +82,7 @@
 import org.opends.server.replication.protocol.ServerStartMsg;
 import org.opends.server.replication.protocol.StartECLSessionMsg;
 import org.opends.server.replication.protocol.StartMsg;
+import org.opends.server.types.AttributeType;
 import org.opends.server.types.BackupConfig;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
@@ -91,6 +93,8 @@
 import org.opends.server.types.LDIFImportConfig;
 import org.opends.server.types.RestoreConfig;
 import org.opends.server.types.ResultCode;
+import org.opends.server.types.SearchFilter;
+import org.opends.server.types.VirtualAttributeRule;
 import org.opends.server.util.LDIFReader;
 import org.opends.server.util.ServerConstants;
 import org.opends.server.util.TimeThread;
@@ -648,7 +652,53 @@
     NetworkGroup internalNetworkGroup = NetworkGroup.getInternalNetworkGroup();
     internalNetworkGroup.registerWorkflow(externalChangeLogWorkflow);
 
-}
+    enableECLVirtualAttr("lastexternalchangelogcookie",
+        new LastCookieVirtualProvider());
+    enableECLVirtualAttr("firstchangenumber",
+        new FirstChangeNumberVirtualAttributeProvider());
+    enableECLVirtualAttr("lastchangenumber",
+        new LastChangeNumberVirtualAttributeProvider());
+
+  }
+
+  private void enableECLVirtualAttr(String attrName,
+      VirtualAttributeProvider<UserDefinedVirtualAttributeCfg> provider)
+  {
+    Set<DN> baseDNs = new HashSet<DN>(0);
+    Set<DN> groupDNs = new HashSet<DN>(0);
+    Set<SearchFilter> filters = new HashSet<SearchFilter>(0);
+    VirtualAttributeCfgDefn.ConflictBehavior conflictBehavior =
+      ConflictBehavior.VIRTUAL_OVERRIDES_REAL;
+
+    try
+    {
+
+      // To avoid the configuration in cn=config just
+      // create a rule and register it into the DirectoryServer
+      provider.initializeVirtualAttributeProvider(null);
+
+      AttributeType attributeType = DirectoryServer.getAttributeType(
+          attrName, false);
+
+      SearchFilter filter =
+        SearchFilter.createFilterFromString("objectclass=*");
+      filters.add(filter);
+
+      baseDNs.add(DN.decode(""));
+      VirtualAttributeRule rule =
+        new VirtualAttributeRule(attributeType, provider,
+            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);
+    }
+  }
 
   private void shutdownECL()
   {
@@ -1846,4 +1896,5 @@
   {
     return weight;
   }
+
 }

--
Gitblit v1.10.0