From 4c82e8ee11f1a023135243fa75ee77dfe70f8289 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 12 Dec 2013 13:51:35 +0000
Subject: [PATCH] Fixing a test failure in Continuous Integration. See the test failure stack trace at the bottom of this commit message. ECLReplicationServerPreTest(), the very first test of ExternalChangeLogTest, expects external changelog to be disabled. However, when GroupIdHandshakeTest was run before ExternalChangeLogTest but never removed ECL virtual attributes. This led to the "lastChangeNumber" virtual attribute having an actual value of "0" while it was expected it would not exist on the returned entry.

---
 opends/src/server/org/opends/server/core/VirtualAttributeConfigManager.java |  123 ++++++++++++++++++++--------------------
 1 files changed, 62 insertions(+), 61 deletions(-)

diff --git a/opends/src/server/org/opends/server/core/VirtualAttributeConfigManager.java b/opends/src/server/org/opends/server/core/VirtualAttributeConfigManager.java
index 572423f..64dca8e 100644
--- a/opends/src/server/org/opends/server/core/VirtualAttributeConfigManager.java
+++ b/opends/src/server/org/opends/server/core/VirtualAttributeConfigManager.java
@@ -27,7 +27,6 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
@@ -104,8 +103,7 @@
     // Get the root configuration object.
     ServerManagementContext managementContext =
          ServerManagementContext.getInstance();
-    RootCfg rootConfiguration =
-         managementContext.getRootConfiguration();
+    RootCfg rootConfiguration = managementContext.getRootConfiguration();
 
 
     // Register as an add and delete listener with the root configuration so we
@@ -162,7 +160,6 @@
 
           VirtualAttributeRule rule = createRule(cfg, provider, filters);
           rules.put(cfg.dn(), rule);
-          DirectoryServer.registerVirtualAttribute(rule);
         }
         catch (InitializationException ie)
         {
@@ -185,10 +182,7 @@
            cfg.getConflictBehavior());
   }
 
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public boolean isConfigurationAddAcceptable(
                       VirtualAttributeCfg configuration,
@@ -242,11 +236,7 @@
     return filters;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ConfigChangeResult applyConfigurationAdd(
                                  VirtualAttributeCfg configuration)
@@ -296,17 +286,12 @@
     {
       VirtualAttributeRule rule = createRule(configuration, provider, filters);
       rules.put(configuration.dn(), rule);
-      DirectoryServer.registerVirtualAttribute(rule);
     }
 
     return new ConfigChangeResult(resultCode, adminActionRequired, messages);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public boolean isConfigurationDeleteAcceptable(
                       VirtualAttributeCfg configuration,
@@ -316,11 +301,7 @@
     return true;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ConfigChangeResult applyConfigurationDelete(
                                  VirtualAttributeCfg configuration)
@@ -332,18 +313,13 @@
     VirtualAttributeRule rule = rules.remove(configuration.dn());
     if (rule != null)
     {
-      DirectoryServer.deregisterVirtualAttribute(rule);
       rule.getProvider().finalizeVirtualAttributeProvider();
     }
 
     return new ConfigChangeResult(resultCode, adminActionRequired, messages);
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public boolean isConfigurationChangeAcceptable(
                       VirtualAttributeCfg configuration,
@@ -384,11 +360,7 @@
     return true;
   }
 
-
-
-  /**
-   * {@inheritDoc}
-   */
+  /** {@inheritDoc} */
   @Override
   public ConfigChangeResult applyConfigurationChange(
                                  VirtualAttributeCfg configuration)
@@ -409,7 +381,6 @@
       if (existingRule != null)
       {
         rules.remove(configuration.dn());
-        DirectoryServer.deregisterVirtualAttribute(existingRule);
         existingRule.getProvider().finalizeVirtualAttributeProvider();
       }
 
@@ -450,15 +421,9 @@
     if (resultCode == ResultCode.SUCCESS)
     {
       VirtualAttributeRule rule = createRule(configuration, provider, filters);
-
       rules.put(configuration.dn(), rule);
-      if (existingRule == null)
+      if (existingRule != null)
       {
-        DirectoryServer.registerVirtualAttribute(rule);
-      }
-      else
-      {
-        DirectoryServer.replaceVirtualAttribute(existingRule, rule);
         existingRule.getProvider().finalizeVirtualAttributeProvider();
       }
     }
@@ -474,7 +439,7 @@
    *
    * @param  className      The fully-qualified name of the certificate mapper
    *                        class to load, instantiate, and initialize.
-   * @param  configuration  The configuration to use to initialize the
+   * @param  cfg            The configuration to use to initialize the
    *                        virtual attribute provider.  It must not be
    *                        {@code null}.
    * @param  initialize     Indicates whether the virtual attribute provider
@@ -485,8 +450,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the certificate mapper.
    */
+  @SuppressWarnings({ "rawtypes", "unchecked" })
   private VirtualAttributeProvider<? extends VirtualAttributeCfg>
-               loadProvider(String className, VirtualAttributeCfg configuration,
+               loadProvider(String className, VirtualAttributeCfg cfg,
                             boolean initialize)
           throws InitializationException
   {
@@ -499,31 +465,20 @@
       Class<? extends VirtualAttributeProvider> providerClass =
            propertyDefinition.loadClass(className,
                                         VirtualAttributeProvider.class);
-      VirtualAttributeProvider<? extends VirtualAttributeCfg> provider =
-           providerClass.newInstance();
+      VirtualAttributeProvider provider = providerClass.newInstance();
 
       if (initialize)
       {
-        Method method = provider.getClass().getMethod(
-            "initializeVirtualAttributeProvider",
-            configuration.configurationClass());
-        method.invoke(provider, configuration);
+        provider.initializeVirtualAttributeProvider(cfg);
       }
       else
       {
-        Method method =
-             provider.getClass().getMethod("isConfigurationAcceptable",
-                                           VirtualAttributeCfg.class,
-                                           List.class);
-
         List<Message> unacceptableReasons = new ArrayList<Message>();
-        Boolean acceptable = (Boolean) method.invoke(provider, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!provider.isConfigurationAcceptable(cfg, unacceptableReasons))
         {
           String reasons = collectionToString(unacceptableReasons, ".  ");
           Message message = ERR_CONFIG_VATTR_CONFIG_NOT_ACCEPTABLE.get(
-              String.valueOf(configuration.dn()), reasons);
+              String.valueOf(cfg.dn()), reasons);
           throw new InitializationException(message);
         }
       }
@@ -533,9 +488,55 @@
     catch (Exception e)
     {
       Message message = ERR_CONFIG_VATTR_INITIALIZATION_FAILED.
-          get(className, String.valueOf(configuration.dn()),
+          get(className, String.valueOf(cfg.dn()),
               stackTraceToSingleLineString(e));
       throw new InitializationException(message, e);
     }
   }
+
+  /**
+   * Retrieves the collection of registered virtual attribute rules.
+   *
+   * @return The collection of registered virtual attribute rules.
+   */
+  public Collection<VirtualAttributeRule> getVirtualAttributes()
+  {
+    return this.rules.values();
+  }
+
+  /**
+   * Registers the provided virtual attribute rule.
+   *
+   * @param rule
+   *          The virtual attribute rule to be registered.
+   */
+  public void register(VirtualAttributeRule rule)
+  {
+    rules.put(getDummyDN(rule), rule);
+  }
+
+  /**
+   * Deregisters the provided virtual attribute rule.
+   *
+   * @param rule
+   *          The virtual attribute rule to be deregistered.
+   */
+  public void deregister(VirtualAttributeRule rule)
+  {
+    rules.remove(getDummyDN(rule));
+  }
+
+  private DN getDummyDN(VirtualAttributeRule rule)
+  {
+    try
+    {
+      String name = rule.getAttributeType().getNameOrOID();
+      return DN.decode("cn=" + name + ",cn=Virtual Attributes,cn=config");
+    }
+    catch (DirectoryException e)
+    {
+      // should never happen
+      throw new RuntimeException(e);
+    }
+  }
 }

--
Gitblit v1.10.0