From 8271ebead97bf11132eb1146c836212ae456e27c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Tue, 25 Feb 2014 13:48:08 +0000
Subject: [PATCH] Removed unnecessary use of reflection for invoking methods, aprticularly with all ConfigManagers. However, I could not do it for WorkflowElementConfigManager.

---
 opendj3-server-dev/src/server/org/opends/server/core/ExtendedOperationConfigManager.java                |   76 +--
 opendj3-server-dev/src/snmp/src/org/opends/server/snmp/SNMPConnectionHandler.java                       |    5 
 opendj3-server-dev/src/server/org/opends/server/core/AccessControlConfigManager.java                    |   24 -
 opendj3-server-dev/src/server/org/opends/server/core/MatchingRuleConfigManager.java                     |   15 
 opendj3-server-dev/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java            |   33 -
 opendj3-server-dev/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java                |  116 +----
 opendj3-server-dev/src/server/org/opends/server/loggers/AbstractLogger.java                             |    4 
 opendj3-server-dev/src/server/org/opends/server/core/WorkQueueConfigManager.java                        |   18 
 opendj3-server-dev/src/server/org/opends/server/core/IdentityMapperConfigManager.java                   |   13 
 opendj3-server-dev/src/server/org/opends/server/core/PasswordValidatorConfigManager.java                |   22 
 opendj3-server-dev/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java             |   21 
 opendj3-server-dev/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java               |   14 
 opendj3-server-dev/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java                |   22 
 opendj3-server-dev/src/server/org/opends/server/core/ExtensionConfigManager.java                        |   14 
 opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskEntry.java                              |   20 
 opendj3-server-dev/src/server/org/opends/server/core/AttributeSyntaxConfigManager.java                  |   13 
 opendj3-server-dev/src/server/org/opends/server/core/GroupManager.java                                  |   18 
 opendj3-server-dev/src/server/org/opends/server/core/MonitorConfigManager.java                          |   23 
 opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java                    |   77 ---
 opendj3-server-dev/src/server/org/opends/server/core/LogRotationPolicyConfigManager.java                |   79 +--
 opendj3-server-dev/src/server/org/opends/server/core/PluginConfigManager.java                           |   22 
 opendj3-server-dev/src/server/org/opends/server/core/AlertHandlerConfigManager.java                     |   30 
 opendj3-server-dev/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java          |   65 --
 opendj3-server-dev/src/server/org/opends/server/core/EntryCacheConfigManager.java                       |   56 +-
 opendj3-server-dev/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java |   72 +--
 opendj3-server-dev/src/server/org/opends/server/core/CertificateMapperConfigManager.java                |   14 
 opendj3-server-dev/src/server/org/opends/server/core/LogRetentionPolicyConfigManager.java               |   80 +--
 opendj3-server-dev/src/server/org/opends/server/core/SASLConfigManager.java                             |   15 
 opendj3-server-dev/src/server/org/opends/server/core/PasswordPolicyConfigManager.java                   |   86 +---
 29 files changed, 318 insertions(+), 749 deletions(-)

diff --git a/opendj3-server-dev/src/server/org/opends/server/core/AccessControlConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/AccessControlConfigManager.java
index 0d38a5a..f1d9e05 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/AccessControlConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/AccessControlConfigManager.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -34,6 +33,7 @@
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.util.Utils;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -47,7 +47,6 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.util.ServerConstants.*;
@@ -426,9 +425,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the Access Control Handler.
    */
-  private AccessControlHandler<? extends AccessControlHandlerCfg>
+  private <T extends AccessControlHandlerCfg> AccessControlHandler<T>
                loadHandler(String className,
-                           AccessControlHandlerCfg configuration,
+                           T configuration,
                            boolean initialize)
           throws InitializationException
   {
@@ -440,29 +439,18 @@
            definition.getJavaClassPropertyDefinition();
       Class<? extends AccessControlHandler> providerClass =
            propertyDefinition.loadClass(className, AccessControlHandler.class);
-      AccessControlHandler<? extends AccessControlHandlerCfg> provider =
-          providerClass.newInstance();
+      AccessControlHandler<T> provider = providerClass.newInstance();
 
       if (configuration != null)
       {
-        Method method = provider.getClass().getMethod(
-            "initializeAccessControlHandler",
-            configuration.configurationClass());
         if(initialize) {
-          method.invoke(provider, configuration);
+          provider.initializeAccessControlHandler(configuration);
         }
       }
       else
       {
-        Method method =
-             provider.getClass().getMethod("isConfigurationAcceptable",
-                                           AccessControlHandlerCfg.class,
-                                           List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(provider, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!provider.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           // Bug: we are in a section where configuration is null
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
index 393dc92..6119695 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/AccountStatusNotificationHandlerConfigManager.java
@@ -26,17 +26,13 @@
  */
 package org.opends.server.core;
 
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.util.Utils;
-
-import static org.opends.messages.ConfigMessages.*;
-import static org.opends.server.util.StaticUtils.*;
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.util.Utils;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -50,7 +46,9 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
+
+import static org.opends.messages.ConfigMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a utility that will be used to manage the set of account
@@ -141,6 +139,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       AccountStatusNotificationHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -174,6 +173,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       AccountStatusNotificationHandlerCfg configuration
       )
@@ -238,6 +238,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       AccountStatusNotificationHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -280,6 +281,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
       AccountStatusNotificationHandlerCfg configuration
       )
@@ -317,6 +319,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       AccountStatusNotificationHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -331,6 +334,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       AccountStatusNotificationHandlerCfg configuration
       )
@@ -397,54 +401,32 @@
    * @throws  InitializationException  If a problem occurred while attempting
    *                                   to initialize the notification handler.
    */
-  private
-    AccountStatusNotificationHandler
-       <? extends AccountStatusNotificationHandlerCfg>
-    loadNotificationHandler(
-       String className,
-       AccountStatusNotificationHandlerCfg configuration,
-       boolean initialize)
-       throws InitializationException
+  private <T extends AccountStatusNotificationHandlerCfg>
+      AccountStatusNotificationHandler<T> loadNotificationHandler(
+      String className, T configuration, boolean initialize)
+      throws InitializationException
   {
     try
     {
-      AccountStatusNotificationHandlerCfgDefn definition;
-      ClassPropertyDefinition propertyDefinition;
-      Class<? extends AccountStatusNotificationHandler> handlerClass;
-      AccountStatusNotificationHandler
-         <? extends AccountStatusNotificationHandlerCfg> notificationHandler;
-
-      definition = AccountStatusNotificationHandlerCfgDefn.getInstance();
-      propertyDefinition =
+      final AccountStatusNotificationHandlerCfgDefn definition =
+          AccountStatusNotificationHandlerCfgDefn.getInstance();
+      final ClassPropertyDefinition propertyDefinition =
           definition.getJavaClassPropertyDefinition();
-      handlerClass = propertyDefinition.loadClass(
-          className,
-          AccountStatusNotificationHandler.class
-          );
-      notificationHandler =
-        (AccountStatusNotificationHandler
-            <? extends AccountStatusNotificationHandlerCfg>)
-        handlerClass.newInstance();
+      final Class<? extends AccountStatusNotificationHandler> handlerClass =
+          propertyDefinition.loadClass(className,
+              AccountStatusNotificationHandler.class);
+      final AccountStatusNotificationHandler<T> notificationHandler =
+          handlerClass.newInstance();
 
       if (initialize)
       {
-        Method method = notificationHandler.getClass().getMethod(
-            "initializeStatusNotificationHandler",
-            configuration.configurationClass());
-        method.invoke(notificationHandler, configuration);
+        notificationHandler.initializeStatusNotificationHandler(configuration);
       }
       else
       {
-        Method method =
-             notificationHandler.getClass().getMethod(
-                  "isConfigurationAcceptable",
-                  AccountStatusNotificationHandlerCfg.class, List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(notificationHandler,
-                                                     configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!notificationHandler.isConfigurationAcceptable(configuration,
+            unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/AlertHandlerConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/AlertHandlerConfigManager.java
index f339af3..4b480d6 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/AlertHandlerConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/AlertHandlerConfigManager.java
@@ -26,29 +26,27 @@
  */
 package org.opends.server.core;
 
-import org.forgerock.i18n.LocalizableMessage;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-import org.forgerock.util.Utils;
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
+import org.forgerock.util.Utils;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ConfigurationDeleteListener;
+import org.opends.server.admin.server.ServerManagementContext;
 import org.opends.server.admin.std.meta.AlertHandlerCfgDefn;
 import org.opends.server.admin.std.server.AlertHandlerCfg;
 import org.opends.server.admin.std.server.RootCfg;
-import org.opends.server.admin.server.ServerManagementContext;
 import org.opends.server.api.AlertHandler;
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.util.StaticUtils.*;
@@ -139,6 +137,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(AlertHandlerCfg configuration,
                                               List<LocalizableMessage> unacceptableReasons)
   {
@@ -167,6 +166,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(AlertHandlerCfg configuration)
   {
     ResultCode         resultCode          = ResultCode.SUCCESS;
@@ -213,6 +213,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
                       AlertHandlerCfg configuration,
                       List<LocalizableMessage> unacceptableReasons)
@@ -227,6 +228,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
                                  AlertHandlerCfg configuration)
   {
@@ -249,6 +251,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(AlertHandlerCfg configuration,
                       List<LocalizableMessage> unacceptableReasons)
   {
@@ -277,6 +280,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
                                  AlertHandlerCfg configuration)
   {
@@ -382,20 +386,12 @@
 
       if (initialize)
       {
-        Method method = handler.getClass().getMethod("initializeAlertHandler",
-            configuration.configurationClass());
-        method.invoke(handler, configuration);
+        handler.initializeAlertHandler(configuration);
       }
       else
       {
-        Method method =
-             handler.getClass().getMethod("isConfigurationAcceptable",
-                                          AlertHandlerCfg.class, List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(handler, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!handler.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/AttributeSyntaxConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/AttributeSyntaxConfigManager.java
index d895d3c..0b3f734 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/AttributeSyntaxConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/AttributeSyntaxConfigManager.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import java.util.ArrayList;
 import java.util.List;
@@ -465,20 +464,12 @@
 
       if (initialize)
       {
-        Method method = syntax.getClass().getMethod("initializeSyntax",
-            configuration.configurationClass());
-        method.invoke(syntax, configuration);
+        syntax.initializeSyntax(configuration);
       }
       else
       {
-        Method method = syntax.getClass().getMethod("isConfigurationAcceptable",
-                                                    AttributeSyntaxCfg.class,
-                                                    List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(syntax, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!syntax.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/CertificateMapperConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/CertificateMapperConfigManager.java
index 9ef5057..dc7c19c 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/CertificateMapperConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/CertificateMapperConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -398,21 +397,12 @@
 
       if (initialize)
       {
-        Method method =
-             mapper.getClass().getMethod("initializeCertificateMapper",
-                  configuration.configurationClass());
-        method.invoke(mapper, configuration);
+        mapper.initializeCertificateMapper(configuration);
       }
       else
       {
-        Method method = mapper.getClass().getMethod("isConfigurationAcceptable",
-                                                    CertificateMapperCfg.class,
-                                                    List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(mapper, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!mapper.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
index 0fe7691..6e8c541 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/ConnectionHandlerConfigManager.java
@@ -25,29 +25,22 @@
  *      Portions Copyright 2012-2014 ForgeRock AS.
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
 
-
-
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-import static org.opends.messages.ConfigMessages.*;
-import static org.opends.messages.CoreMessages.*;
-
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.AdministrationConnector;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ConfigurationDeleteListener;
 import org.opends.server.admin.server.ServerManagementContext;
-import org.opends.server.admin.std.meta.*;
+import org.opends.server.admin.std.meta.ConnectionHandlerCfgDefn;
 import org.opends.server.admin.std.server.AdministrationConnectorCfg;
 import org.opends.server.admin.std.server.ConnectionHandlerCfg;
 import org.opends.server.admin.std.server.RootCfg;
@@ -57,8 +50,10 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
+import static org.opends.messages.ConfigMessages.*;
+import static org.opends.messages.CoreMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a utility that will be used to manage the
@@ -93,6 +88,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
       ConnectionHandlerCfg configuration) {
     // Default result code.
@@ -143,6 +139,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       ConnectionHandlerCfg configuration) {
     // Attempt to get the existing connection handler. This will only
@@ -217,6 +214,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       ConnectionHandlerCfg configuration) {
 
@@ -330,6 +328,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       ConnectionHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons) {
@@ -347,6 +346,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       ConnectionHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons) {
@@ -364,6 +364,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       ConnectionHandlerCfg configuration,
       List<LocalizableMessage> unacceptableReasons) {
@@ -374,24 +375,22 @@
 
 
   // Load and initialize the connection handler named in the config.
-  private ConnectionHandler<? extends ConnectionHandlerCfg>
-               getConnectionHandler(ConnectionHandlerCfg config)
-          throws ConfigException
+  private <T extends ConnectionHandlerCfg> ConnectionHandler<T> getConnectionHandler(
+      T config) throws ConfigException
   {
     String className = config.getJavaClass();
-    ConnectionHandlerCfgDefn d =
-      ConnectionHandlerCfgDefn.getInstance();
-    ClassPropertyDefinition pd = d
-        .getJavaClassPropertyDefinition();
-
-    // Load the class and cast it to a connection handler.
-    @SuppressWarnings("rawtypes")
-    Class<? extends ConnectionHandler> theClass;
-    ConnectionHandler<?> connectionHandler;
+    ConnectionHandlerCfgDefn d = ConnectionHandlerCfgDefn.getInstance();
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
     try {
-      theClass = pd.loadClass(className, ConnectionHandler.class);
-      connectionHandler = theClass.newInstance();
+      @SuppressWarnings("rawtypes")
+      Class<? extends ConnectionHandler> theClass =
+          pd.loadClass(className, ConnectionHandler.class);
+      ConnectionHandler<T> connectionHandler = theClass.newInstance();
+
+      connectionHandler.initializeConnectionHandler(config);
+
+      return connectionHandler;
     } catch (Exception e) {
       logger.traceException(e);
 
@@ -399,27 +398,6 @@
           className, config.dn(), stackTraceToSingleLineString(e));
       throw new ConfigException(message, e);
     }
-
-    // Perform the necessary initialization for the connection
-    // handler.
-    try {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("initializeConnectionHandler", config
-          .configurationClass());
-
-      method.invoke(connectionHandler, config);
-    } catch (Exception e) {
-      logger.traceException(e);
-
-      LocalizableMessage message = ERR_CONFIG_CONNHANDLER_CANNOT_INITIALIZE.get(
-          className, config.dn(), stackTraceToSingleLineString(e));
-      throw new ConfigException(message, e);
-    }
-
-    // The connection handler has been successfully initialized.
-    return connectionHandler;
   }
 
 
@@ -430,46 +408,19 @@
       ConnectionHandlerCfg config,
       List<LocalizableMessage> unacceptableReasons) {
     String className = config.getJavaClass();
-    ConnectionHandlerCfgDefn d =
-      ConnectionHandlerCfgDefn.getInstance();
-    ClassPropertyDefinition pd = d
-        .getJavaClassPropertyDefinition();
+    ConnectionHandlerCfgDefn d = ConnectionHandlerCfgDefn.getInstance();
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
-    // Load the class and cast it to a connection handler.
-    ConnectionHandler<?> connectionHandler = null;
-    @SuppressWarnings("rawtypes")
-    Class<? extends ConnectionHandler> theClass;
     try {
-      connectionHandler = connectionHandlers.get(config.dn());
-      theClass = pd.loadClass(className, ConnectionHandler.class);
+      ConnectionHandler<?> connectionHandler = connectionHandlers.get(config.dn());
       if (connectionHandler == null) {
+        @SuppressWarnings("rawtypes")
+        Class<? extends ConnectionHandler> theClass =
+            pd.loadClass(className, ConnectionHandler.class);
         connectionHandler = theClass.newInstance();
       }
-    } catch (Exception e) {
-      logger.traceException(e);
 
-      unacceptableReasons.add(
-              ERR_CONFIG_CONNHANDLER_CANNOT_INITIALIZE.get(
-                      className, config.dn(), stackTraceToSingleLineString(e)));
-      return false;
-    }
-
-    // Perform the necessary initialization for the connection
-    // handler.
-    try {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("isConfigurationAcceptable",
-                                         ConnectionHandlerCfg.class,
-                                         List.class);
-      Boolean acceptable = (Boolean) method.invoke(connectionHandler, config,
-                                                   unacceptableReasons);
-
-      if (! acceptable)
-      {
-        return false;
-      }
+      return connectionHandler.isConfigurationAcceptable(config, unacceptableReasons);
     } catch (Exception e) {
       logger.traceException(e);
 
@@ -477,8 +428,5 @@
           className, config.dn(), stackTraceToSingleLineString(e)));
       return false;
     }
-
-    // The class is valid as far as we can tell.
-    return true;
   }
 }
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/EntryCacheConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/EntryCacheConfigManager.java
index 1f671a8..f3db338 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/EntryCacheConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/EntryCacheConfigManager.java
@@ -26,11 +26,11 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import java.util.*;
 
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.forgerock.util.Utils;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
@@ -51,7 +51,6 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.messages.ExtensionMessages.*;
@@ -71,12 +70,12 @@
   private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   // The default entry cache.
-  private DefaultEntryCache _defaultEntryCache = null;
+  private DefaultEntryCache _defaultEntryCache;
 
   // The entry cache order map sorted by the cache level.
-  private SortedMap<Integer, EntryCache<? extends
-    EntryCacheCfg>> cacheOrderMap = new TreeMap<Integer,
-    EntryCache<? extends EntryCacheCfg>>();
+  @SuppressWarnings("rawtypes")
+  private SortedMap<Integer, EntryCache> cacheOrderMap =
+      new TreeMap<Integer, EntryCache>();
 
   // The entry cache name to level map.
   private HashMap<String, Integer>
@@ -144,8 +143,7 @@
 
     // Default entry cache should be already installed with
     // <CODE>initializeDefaultEntryCache()</CODE> method so
-    // that there will be one even if we encounter a problem
-    // later.
+    // that there will be one even if we encounter a problem later.
 
     // Register as an add and delete listener with the root configuration so we
     // can be notified if any entry cache entry is added or removed.
@@ -233,6 +231,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       EntryCacheCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -275,6 +274,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       EntryCacheCfg configuration
       )
@@ -326,7 +326,7 @@
     }
 
     // Push any changes made to the cache order map.
-    _defaultEntryCache.setCacheOrder(cacheOrderMap);
+    setCacheOrder(cacheOrderMap);
 
     // At this point, new configuration is enabled...
     // If the current entry cache is already enabled then we don't do
@@ -364,6 +364,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       EntryCacheCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -407,6 +408,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
       EntryCacheCfg configuration
       )
@@ -443,6 +445,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       EntryCacheCfg configuration,
       List<LocalizableMessage> unacceptableReasons
@@ -458,6 +461,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       EntryCacheCfg configuration
       )
@@ -490,7 +494,7 @@
       cacheNameToLevelMap.remove(configuration.dn().toNormalizedString());
 
       // Push any changes made to the cache order map.
-      _defaultEntryCache.setCacheOrder(cacheOrderMap);
+      setCacheOrder(cacheOrderMap);
 
       entryCache = null;
     }
@@ -537,7 +541,7 @@
       configuration.getCacheLevel());
 
     // Push any changes made to the cache order map.
-    _defaultEntryCache.setCacheOrder(cacheOrderMap);
+    setCacheOrder(cacheOrderMap);
 
     // Install and register the monitor for this cache.
     EntryCacheMonitorProvider monitor =
@@ -557,6 +561,11 @@
     DirectoryServer.registerMonitorProvider(monitor);
   }
 
+  @SuppressWarnings({ "rawtypes", "unchecked" })
+  private void setCacheOrder(SortedMap<Integer, EntryCache> cacheOrderMap)
+  {
+    _defaultEntryCache.setCacheOrder((SortedMap) cacheOrderMap);
+  }
 
   /**
    * Loads the specified class, instantiates it as an entry cache, and
@@ -574,17 +583,16 @@
    * @throws  InitializationException  If a problem occurred while attempting
    *                                   to initialize the entry cache.
    */
-  private EntryCache<? extends EntryCacheCfg> loadEntryCache(
+  private <T extends EntryCacheCfg> EntryCache<T> loadEntryCache(
     String        className,
-    EntryCacheCfg configuration,
+    T configuration,
     boolean initialize
     )
     throws InitializationException
   {
-    EntryCache<?> entryCache = null;
-
     // If we this entry cache is already installed and active it
     // should be present in the current cache order map, use it.
+    EntryCache<T> entryCache = null;
     if (!cacheOrderMap.isEmpty()) {
       entryCache = cacheOrderMap.get(configuration.getCacheLevel());
     }
@@ -595,13 +603,13 @@
       ClassPropertyDefinition propertyDefinition = definition
           .getJavaClassPropertyDefinition();
       @SuppressWarnings("unchecked")
-      Class<? extends EntryCache<?>> cacheClass =
-          (Class<? extends EntryCache<?>>) propertyDefinition
+      Class<? extends EntryCache<T>> cacheClass =
+          (Class<? extends EntryCache<T>>) propertyDefinition
               .loadClass(className, EntryCache.class);
 
       // If there is some entry cache instance already initialized work with
       // it instead of creating a new one unless explicit init is requested.
-      EntryCache<? extends EntryCacheCfg> cache;
+      EntryCache<T> cache;
       if (initialize || (entryCache == null)) {
         cache = cacheClass.newInstance();
       } else {
@@ -610,23 +618,15 @@
 
       if (initialize)
       {
-        Method method = cache.getClass().getMethod("initializeEntryCache",
-            configuration.configurationClass());
-        method.invoke(cache, configuration);
+        cache.initializeEntryCache(configuration);
       }
       // This will check if configuration is acceptable on disabled
       // and uninitialized cache instance that has no "acceptable"
       // change listener registered to invoke and verify on its own.
       else if (!configuration.isEnabled())
       {
-        Method method = cache.getClass().getMethod("isConfigurationAcceptable",
-                                                   EntryCacheCfg.class,
-                                                   List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(cache, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!cache.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String buffer = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/ExtendedOperationConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
index b77f96c..8d38199 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/ExtendedOperationConfigManager.java
@@ -25,36 +25,30 @@
  *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
-
-
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
-import java.lang.reflect.Method;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.ClassPropertyDefinition;
-import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ConfigurationAddListener;
+import org.opends.server.admin.server.ConfigurationChangeListener;
 import org.opends.server.admin.server.ConfigurationDeleteListener;
 import org.opends.server.admin.server.ServerManagementContext;
+import org.opends.server.admin.std.meta.ExtendedOperationHandlerCfgDefn;
 import org.opends.server.admin.std.server.ExtendedOperationHandlerCfg;
 import org.opends.server.admin.std.server.RootCfg;
-import org.opends.server.admin.std.meta.ExtendedOperationHandlerCfgDefn;
 import org.opends.server.api.ExtendedOperationHandler;
 import org.opends.server.config.ConfigException;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
 import static org.opends.messages.ConfigMessages.*;
-
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
-
-
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a utility that will be used to manage the set of extended
@@ -140,6 +134,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
        ExtendedOperationHandlerCfg configuration)
   {
@@ -162,6 +157,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
        ExtendedOperationHandlerCfg configuration,
        List<LocalizableMessage> unacceptableReasons)
@@ -178,6 +174,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
        ExtendedOperationHandlerCfg configuration)
   {
@@ -243,6 +240,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
        ExtendedOperationHandlerCfg configuration,
        List<LocalizableMessage> unacceptableReasons)
@@ -253,6 +251,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
        ExtendedOperationHandlerCfg configuration)
   {
@@ -304,6 +303,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
        ExtendedOperationHandlerCfg configuration,
        List<LocalizableMessage> unacceptableReasons)
@@ -318,35 +318,24 @@
   {
     String className = config.getJavaClass();
     ExtendedOperationHandlerCfgDefn d =
-      ExtendedOperationHandlerCfgDefn.getInstance();
-    ClassPropertyDefinition pd = d
-        .getJavaClassPropertyDefinition();
-
-    // Load the class and cast it to an extended operation handler.
-    Class<? extends ExtendedOperationHandler> theClass;
-    ExtendedOperationHandler extendedOperationHandler;
+        ExtendedOperationHandlerCfgDefn.getInstance();
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
     try
     {
-      theClass = pd.loadClass(className, ExtendedOperationHandler.class);
-      extendedOperationHandler = theClass.newInstance();
+      Class<? extends ExtendedOperationHandler> theClass =
+          pd.loadClass(className, ExtendedOperationHandler.class);
+      ExtendedOperationHandler extendedOperationHandler = theClass.newInstance();
 
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("initializeExtendedOperationHandler",
-          config.configurationClass());
+      extendedOperationHandler.initializeExtendedOperationHandler(config);
 
-      method.invoke(extendedOperationHandler, config);
+      return extendedOperationHandler;
     }
     catch (Exception e)
     {
       logger.traceException(e);
       throw new ConfigException(ERR_CONFIG_EXTOP_INVALID_CLASS.get(className, config.dn(), e), e);
     }
-
-    // The handler has been successfully initialized.
-    return extendedOperationHandler;
   }
 
 
@@ -358,29 +347,15 @@
   {
     String className = config.getJavaClass();
     ExtendedOperationHandlerCfgDefn d =
-      ExtendedOperationHandlerCfgDefn.getInstance();
-    ClassPropertyDefinition pd = d
-        .getJavaClassPropertyDefinition();
+        ExtendedOperationHandlerCfgDefn.getInstance();
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
-    // Load the class and cast it to an extended operation handler.
-    Class<? extends ExtendedOperationHandler> theClass;
     try {
-      theClass = pd.loadClass(className, ExtendedOperationHandler.class);
+      Class<? extends ExtendedOperationHandler> theClass =
+          pd.loadClass(className, ExtendedOperationHandler.class);
       ExtendedOperationHandler extOpHandler = theClass.newInstance();
 
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("isConfigurationAcceptable",
-                                         ExtendedOperationHandlerCfg.class,
-                                         List.class);
-      Boolean acceptable = (Boolean) method.invoke(extOpHandler, config,
-                                                   unacceptableReasons);
-
-      if (! acceptable)
-      {
-        return false;
-      }
+      return extOpHandler.isConfigurationAcceptable(config, unacceptableReasons);
     }
     catch (Exception e)
     {
@@ -388,9 +363,6 @@
       unacceptableReasons.add(ERR_CONFIG_EXTOP_INVALID_CLASS.get(className, config.dn(), e));
       return false;
     }
-
-    // The class is valid as far as we can tell.
-    return true;
   }
 }
 
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/ExtensionConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/ExtensionConfigManager.java
index fde666f..47c09be 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/ExtensionConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/ExtensionConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -395,21 +394,12 @@
 
       if (initialize)
       {
-        Method method = extension.getClass().getMethod(
-            "initializeExtension", configuration.configurationClass());
-        method.invoke(extension, configuration);
+        extension.initializeExtension(configuration);
       }
       else
       {
-        Method method =
-             extension.getClass().getMethod("isConfigurationAcceptable",
-                                           ExtensionCfg.class,
-                                           List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(extension, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!extension.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/GroupManager.java b/opendj3-server-dev/src/server/org/opends/server/core/GroupManager.java
index 2e288f1..8abc45a 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/GroupManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/GroupManager.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -451,25 +450,16 @@
 
       if (initialize)
       {
-        Method method = group.getClass().getMethod(
-          "initializeGroupImplementation", configuration.configurationClass());
-        method.invoke(group, configuration);
+        group.initializeGroupImplementation(configuration);
       }
       else
       {
-        Method method = group.getClass().getMethod("isConfigurationAcceptable",
-                                                   GroupImplementationCfg.class,
-                                                   List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(group, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!group.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reason = Utils.joinAsString(".  ", unacceptableReasons);
-          LocalizableMessage message = ERR_CONFIG_GROUP_CONFIG_NOT_ACCEPTABLE.get(
-              configuration.dn(), reason);
-          throw new InitializationException(message);
+          throw new InitializationException(ERR_CONFIG_GROUP_CONFIG_NOT_ACCEPTABLE.get(
+              configuration.dn(), reason));
         }
       }
 
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/IdentityMapperConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/IdentityMapperConfigManager.java
index 55c110a..d92045b 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/IdentityMapperConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/IdentityMapperConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -408,20 +407,12 @@
 
       if (initialize)
       {
-        Method method = mapper.getClass().getMethod("initializeIdentityMapper",
-            configuration.configurationClass());
-        method.invoke(mapper, configuration);
+        mapper.initializeIdentityMapper(configuration);
       }
       else
       {
-        Method method = mapper.getClass().getMethod("isConfigurationAcceptable",
-                                                    IdentityMapperCfg.class,
-                                                    List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(mapper, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!mapper.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
index 624f2ae..cb6dd3e 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/KeyManagerProviderConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -397,21 +396,12 @@
 
       if (initialize)
       {
-        Method method = provider.getClass().getMethod(
-            "initializeKeyManagerProvider", configuration.configurationClass());
-        method.invoke(provider, configuration);
+        provider.initializeKeyManagerProvider(configuration);
       }
       else
       {
-        Method method =
-             provider.getClass().getMethod("isConfigurationAcceptable",
-                                           KeyManagerProviderCfg.class,
-                                           List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(provider, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!provider.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/LogRetentionPolicyConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/LogRetentionPolicyConfigManager.java
index 7d8d02d..8fd0ce7 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/LogRetentionPolicyConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/LogRetentionPolicyConfigManager.java
@@ -25,11 +25,16 @@
  *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import org.opends.server.admin.std.server.LogRetentionPolicyCfg;
 import org.opends.server.admin.std.server.RootCfg;
 import org.opends.server.admin.std.meta.LogRetentionPolicyCfgDefn;
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ServerManagementContext;
 import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -37,20 +42,12 @@
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.types.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
-import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.loggers.RetentionPolicy;
 import org.opends.server.config.ConfigException;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import static org.opends.messages.ConfigMessages.*;
-
 import static org.opends.server.util.StaticUtils.*;
 
-import java.util.List;
-import java.util.ArrayList;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
 /**
  * This class defines a utility that will be used to manage the set of
  * log retention policies used in the Directory Server.  It will perform the
@@ -98,6 +95,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       LogRetentionPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -108,6 +106,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       LogRetentionPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -119,6 +118,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(LogRetentionPolicyCfg config)
   {
     // Default result code.
@@ -150,6 +150,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       LogRetentionPolicyCfg config)
   {
@@ -175,6 +176,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       LogRetentionPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -185,6 +187,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       LogRetentionPolicyCfg configuration)
   {
@@ -209,69 +212,40 @@
   {
     String className = config.getJavaClass();
     LogRetentionPolicyCfgDefn d = LogRetentionPolicyCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    // Load the class and cast it to a RetentionPolicy.
-    Class<? extends RetentionPolicy> theClass;
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
     try {
-      theClass = pd.loadClass(className, RetentionPolicy.class);
-      theClass.newInstance();
+      Class<? extends RetentionPolicy> theClass =
+          pd.loadClass(className, RetentionPolicy.class);
+      // Explicitly cast to check that implementation implements the correct interface.
+      RetentionPolicy retentionPolicy = theClass.newInstance();
+      // next line is here to ensure that eclipse does not remove the cast in the line above
+      retentionPolicy.hashCode();
+      return true;
     } catch (Exception e) {
       unacceptableReasons.add(
           ERR_CONFIG_RETENTION_POLICY_INVALID_CLASS.get(className, config.dn(), e));
       return false;
     }
-    // Check that the implementation class implements the correct interface.
-    try {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      theClass.getMethod("initializeLogRetentionPolicy", config
-          .configurationClass());
-    } catch (Exception e) {
-      unacceptableReasons.add(
-          ERR_CONFIG_RETENTION_POLICY_INVALID_CLASS.get(className, config.dn(), e));
-      return false;
-    }
-    // The class is valid as far as we can tell.
-    return true;
   }
 
   private RetentionPolicy getRetentionPolicy(LogRetentionPolicyCfg config)
       throws ConfigException {
     String className = config.getJavaClass();
     LogRetentionPolicyCfgDefn d = LogRetentionPolicyCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    // Load the class and cast it to a RetentionPolicy.
-    Class<? extends RetentionPolicy> theClass;
-    RetentionPolicy RetentionPolicy;
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
     try {
-      theClass = pd.loadClass(className, RetentionPolicy.class);
-      RetentionPolicy = theClass.newInstance();
+      Class<? extends RetentionPolicy> theClass =
+          pd.loadClass(className, RetentionPolicy.class);
+      RetentionPolicy retentionPolicy = theClass.newInstance();
 
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("initializeLogRetentionPolicy", config
-          .configurationClass());
-      method.invoke(RetentionPolicy, config);
-    }
-    catch (InvocationTargetException ite)
-    {
-      // Rethrow the exceptions thrown be the invoked method.
-      Throwable e = ite.getTargetException();
-      LocalizableMessage message = ERR_CONFIG_RETENTION_POLICY_INVALID_CLASS.get(
-          className, config.dn(), stackTraceToSingleLineString(e));
-      throw new ConfigException(message, e);
+      retentionPolicy.initializeLogRetentionPolicy(config);
+
+      return retentionPolicy;
     } catch (Exception e) {
       LocalizableMessage message = ERR_CONFIG_RETENTION_POLICY_INVALID_CLASS.get(
           className, config.dn(), e);
       throw new ConfigException(message, e);
     }
-
-    // The connection handler has been successfully initialized.
-    return RetentionPolicy;
   }
 }
 
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/LogRotationPolicyConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/LogRotationPolicyConfigManager.java
index 45ca251..95a3b7e 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/LogRotationPolicyConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/LogRotationPolicyConfigManager.java
@@ -25,8 +25,12 @@
  *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
+import java.util.ArrayList;
+import java.util.List;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.loggers.RotationPolicy;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationDeleteListener;
@@ -38,19 +42,11 @@
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.types.InitializationException;
 import org.opends.server.types.ConfigChangeResult;
-import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.config.ConfigException;
 
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import static org.opends.messages.ConfigMessages.*;
-
 import static org.opends.server.util.StaticUtils.*;
 
-import java.util.List;
-import java.util.ArrayList;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
 /**
  * This class defines a utility that will be used to manage the set of
  * log rotation policies used in the Directory Server.  It will perform the
@@ -98,6 +94,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       LogRotationPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -108,6 +105,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       LogRotationPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -119,6 +117,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(LogRotationPolicyCfg config)
   {
     // Default result code.
@@ -150,6 +149,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       LogRotationPolicyCfg config)
   {
@@ -175,6 +175,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       LogRotationPolicyCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -185,6 +186,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       LogRotationPolicyCfg configuration)
   {
@@ -209,68 +211,39 @@
   {
     String className = config.getJavaClass();
     LogRotationPolicyCfgDefn d = LogRotationPolicyCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    // Load the class and cast it to a RotationPolicy.
-    Class<? extends RotationPolicy> theClass;
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
     try {
-      theClass = pd.loadClass(className, RotationPolicy.class);
-      theClass.newInstance();
+      Class<? extends RotationPolicy> theClass =
+          pd.loadClass(className, RotationPolicy.class);
+      // Explicitly cast to check that implementation implements the correct interface.
+      RotationPolicy retentionPolicy = theClass.newInstance();
+      // next line is here to ensure that eclipse does not remove the cast in the line above
+      retentionPolicy.hashCode();
+      return true;
     } catch (Exception e) {
       unacceptableReasons.add(
           ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(className, config.dn(), e));
       return false;
     }
-    // Check that the implementation class implements the correct interface.
-    try {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      theClass.getMethod("initializeLogRotationPolicy", config
-          .configurationClass());
-    } catch (Exception e) {
-      unacceptableReasons.add(
-          ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(className, config.dn(), e));
-      return false;
-    }
-    // The class is valid as far as we can tell.
-    return true;
   }
 
   private RotationPolicy getRotationPolicy(LogRotationPolicyCfg config)
       throws ConfigException {
     String className = config.getJavaClass();
     LogRotationPolicyCfgDefn d = LogRotationPolicyCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    // Load the class and cast it to a RotationPolicy.
-    Class<? extends RotationPolicy> theClass;
-    RotationPolicy rotationPolicy;
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
     try {
-      theClass = pd.loadClass(className, RotationPolicy.class);
-      rotationPolicy = theClass.newInstance();
+      Class<? extends RotationPolicy> theClass =
+          pd.loadClass(className, RotationPolicy.class);
+      RotationPolicy rotationPolicy = theClass.newInstance();
 
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("initializeLogRotationPolicy", config
-          .configurationClass());
-      method.invoke(rotationPolicy, config);
-    }
-    catch (InvocationTargetException ite)
-    {
-      // Rethrow the exceptions thrown be the invoked method.
-      Throwable e = ite.getTargetException();
-      LocalizableMessage message = ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
-          className, config.dn(), stackTraceToSingleLineString(e));
-      throw new ConfigException(message, e);
+      rotationPolicy.initializeLogRotationPolicy(config);
+
+      return rotationPolicy;
     } catch (Exception e) {
       LocalizableMessage message = ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
           className, config.dn(), e);
       throw new ConfigException(message, e);
     }
-
-    // The connection handler has been successfully initialized.
-    return rotationPolicy;
   }
 }
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/MatchingRuleConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/MatchingRuleConfigManager.java
index 4ab2fc0..b846240 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/MatchingRuleConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/MatchingRuleConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -596,22 +595,12 @@
 
       if (initialize)
       {
-        Method method = factory.getClass().getMethod(
-            "initializeMatchingRule", configuration.configurationClass());
-        method.invoke(factory, configuration);
+        factory.initializeMatchingRule(configuration);
       }
       else
       {
-        Method method =
-             factory.getClass().getMethod("isConfigurationAcceptable",
-                                               MatchingRuleCfg.class,
-                                               List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(factory,
-                                             configuration,
-                                             unacceptableReasons);
-        if (! acceptable)
+        if (!factory.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/MonitorConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/MonitorConfigManager.java
index b8de2c5..a4e96a6 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/MonitorConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/MonitorConfigManager.java
@@ -25,12 +25,10 @@
  *      Portions Copyright 2013-2014 ForgeRock AS.
  */
 package org.opends.server.core;
+
 import org.forgerock.i18n.LocalizableMessage;
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 
-
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -370,30 +368,27 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the monitor provider.
    */
-  private MonitorProvider<? extends MonitorProviderCfg>
-               loadMonitor(String className, MonitorProviderCfg configuration)
+  private <T extends MonitorProviderCfg> MonitorProvider<T>
+               loadMonitor(String className, T configuration)
           throws InitializationException
   {
     try
     {
-      MonitorProviderCfgDefn definition =
-           MonitorProviderCfgDefn.getInstance();
+      MonitorProviderCfgDefn definition = MonitorProviderCfgDefn.getInstance();
       ClassPropertyDefinition propertyDefinition =
            definition.getJavaClassPropertyDefinition();
       @SuppressWarnings("unchecked")
-      Class<? extends MonitorProvider<?>> providerClass =
-          (Class<? extends MonitorProvider<?>>) propertyDefinition
+      Class<? extends MonitorProvider<T>> providerClass =
+          (Class<? extends MonitorProvider<T>>) propertyDefinition
               .loadClass(className, MonitorProvider.class);
-      MonitorProvider<?> monitor = providerClass.newInstance();
+      MonitorProvider<T> monitor = providerClass.newInstance();
 
       if (configuration != null)
       {
-        Method method = monitor.getClass().getMethod(
-            "initializeMonitorProvider", configuration.configurationClass());
-        method.invoke(monitor, configuration);
+        monitor.initializeMonitorProvider(configuration);
       }
 
-      return (MonitorProvider<? extends MonitorProviderCfg>) monitor;
+      return monitor;
     }
     catch (Exception e)
     {
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
index 2532e0b..ab743b9 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/PasswordGeneratorConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -371,9 +370,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the password generator.
    */
-  private PasswordGenerator<? extends PasswordGeneratorCfg>
+  private <T extends PasswordGeneratorCfg> PasswordGenerator<T>
                loadGenerator(String className,
-                             PasswordGeneratorCfg configuration,
+                             T configuration,
                              boolean initialize)
           throws InitializationException
   {
@@ -385,27 +384,16 @@
            definition.getJavaClassPropertyDefinition();
       Class<? extends PasswordGenerator> generatorClass =
            propertyDefinition.loadClass(className, PasswordGenerator.class);
-      PasswordGenerator<? extends PasswordGeneratorCfg> generator =
-           (PasswordGenerator<? extends PasswordGeneratorCfg>)
-           generatorClass.newInstance();
+      PasswordGenerator<T> generator = generatorClass.newInstance();
 
       if (initialize)
       {
-        Method method = generator.getClass().getMethod(
-            "initializePasswordGenerator", configuration.configurationClass());
-        method.invoke(generator, configuration);
+        generator.initializePasswordGenerator(configuration);
       }
       else
       {
-        Method method =
-             generator.getClass().getMethod("isConfigurationAcceptable",
-                                            PasswordGeneratorCfg.class,
-                                            List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(generator, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!generator.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/PasswordPolicyConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
index b17fcc2..77a7052 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/PasswordPolicyConfigManager.java
@@ -26,17 +26,13 @@
  */
 package org.opends.server.core;
 
-
-
-import static org.opends.messages.ConfigMessages.*;
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
-
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationDeleteListener;
@@ -49,11 +45,10 @@
 import org.opends.server.api.AuthenticationPolicyFactory;
 import org.opends.server.api.SubentryChangeListener;
 import org.opends.server.config.ConfigException;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.types.*;
-import org.forgerock.opendj.ldap.ResultCode;
 
-
+import static org.opends.messages.ConfigMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a utility that will be used to manage the set of password
@@ -194,6 +189,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       AuthenticationPolicyCfg configuration, List<LocalizableMessage> unacceptableReason)
   {
@@ -208,6 +204,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
       AuthenticationPolicyCfg configuration)
   {
@@ -241,6 +238,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       AuthenticationPolicyCfg configuration, List<LocalizableMessage> unacceptableReason)
   {
@@ -265,6 +263,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       AuthenticationPolicyCfg configuration)
   {
@@ -291,6 +290,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void checkSubentryAddAcceptable(Entry entry) throws DirectoryException
   {
     if (entry.isPasswordPolicySubentry())
@@ -304,6 +304,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void checkSubentryDeleteAcceptable(Entry entry)
       throws DirectoryException
   {
@@ -317,6 +318,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void checkSubentryModifyAcceptable(Entry oldEntry, Entry newEntry)
       throws DirectoryException
   {
@@ -331,6 +333,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void checkSubentryModifyDNAcceptable(Entry oldEntry, Entry newEntry)
       throws DirectoryException
   {
@@ -344,6 +347,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void handleSubentryAdd(Entry entry)
   {
     if (entry.isPasswordPolicySubentry())
@@ -369,6 +373,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void handleSubentryDelete(Entry entry)
   {
     if (entry.isPasswordPolicySubentry())
@@ -382,6 +387,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void handleSubentryModify(Entry oldEntry, Entry newEntry)
   {
     if (oldEntry.isPasswordPolicySubentry())
@@ -414,6 +420,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public void handleSubentryModifyDN(Entry oldEntry, Entry newEntry)
   {
     if (oldEntry.isPasswordPolicySubentry())
@@ -445,9 +452,8 @@
 
   // Creates and registers the provided authentication policy
   // configuration.
-  private void createAuthenticationPolicy(
-      AuthenticationPolicyCfg policyConfiguration) throws ConfigException,
-      InitializationException
+  private <T extends AuthenticationPolicyCfg> void createAuthenticationPolicy(
+      T policyConfiguration) throws ConfigException, InitializationException
   {
     // If this is going to be the default password policy then check the type is
     // correct.
@@ -465,37 +471,17 @@
     AuthenticationPolicyCfgDefn d = AuthenticationPolicyCfgDefn.getInstance();
     ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
-    // Load the class and cast it to an authentication policy.
-    Class<?> theClass;
-    AuthenticationPolicyFactory<?> factory;
-
     try
     {
-      theClass = pd.loadClass(className, AuthenticationPolicyFactory.class);
-      factory = (AuthenticationPolicyFactory<?>) theClass.newInstance();
+      Class<AuthenticationPolicyFactory<T>> theClass =
+          (Class<AuthenticationPolicyFactory<T>>) pd.loadClass(className,
+              AuthenticationPolicyFactory.class);
+      AuthenticationPolicyFactory<T> factory = theClass.newInstance();
       factory.setServerContext(serverContext);
-    }
-    catch (Exception e)
-    {
-      logger.traceException(e);
 
-      LocalizableMessage message = ERR_CONFIG_PWPOLICY_INVALID_POLICY_CONFIG.get(
-          policyConfiguration.dn(), stackTraceToSingleLineString(e));
-      throw new InitializationException(message, e);
-    }
+      AuthenticationPolicy policy = factory.createAuthenticationPolicy(policyConfiguration);
 
-    // Perform the necessary initialization for the authentication policy.
-    AuthenticationPolicy policy;
-    try
-    {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("createAuthenticationPolicy",
-          policyConfiguration.configurationClass());
-
-      policy = (AuthenticationPolicy) method.invoke(factory,
-          policyConfiguration);
+      DirectoryServer.registerAuthenticationPolicy(policyConfiguration.dn(), policy);
     }
     catch (Exception e)
     {
@@ -519,16 +505,14 @@
           policyConfiguration.dn(), stackTraceToSingleLineString(e));
       throw new InitializationException(message, e);
     }
-
-    DirectoryServer.registerAuthenticationPolicy(policyConfiguration.dn(), policy);
   }
 
 
 
   // Determines whether or not the new authentication policy configuration's
   // implementation class is acceptable.
-  private boolean isAuthenticationPolicyConfigurationAcceptable(
-      AuthenticationPolicyCfg policyConfiguration,
+  private <T extends AuthenticationPolicyCfg> boolean isAuthenticationPolicyConfigurationAcceptable(
+      T policyConfiguration,
       List<LocalizableMessage> unacceptableReasons)
   {
     // If this is going to be the default password policy then check the type is
@@ -551,21 +535,13 @@
     // Validate the configuration.
     try
     {
-      // Load the class and cast it to a authentication policy factory.
-      Class<?> theClass;
-      AuthenticationPolicyFactory<?> factory;
-
-      theClass = pd.loadClass(className, AuthenticationPolicyFactory.class);
-      factory = (AuthenticationPolicyFactory<?>) theClass.newInstance();
+      Class<?> theClass =
+          pd.loadClass(className, AuthenticationPolicyFactory.class);
+      AuthenticationPolicyFactory<T> factory =
+          (AuthenticationPolicyFactory<T>) theClass.newInstance();
       factory.setServerContext(serverContext);
 
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("isConfigurationAcceptable",
-          AuthenticationPolicyCfg.class, List.class);
-      return (Boolean) method.invoke(factory, policyConfiguration,
-          unacceptableReasons);
+      return factory.isConfigurationAcceptable(policyConfiguration, unacceptableReasons);
     }
     catch (Exception e)
     {
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
index 3562e34..56f019d 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/PasswordStorageSchemeConfigManager.java
@@ -32,7 +32,6 @@
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.util.StaticUtils.*;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -388,49 +387,31 @@
    * @throws  InitializationException  If a problem occurred while attempting
    *                                   to initialize the class.
    */
-  private PasswordStorageScheme <? extends PasswordStorageSchemeCfg>
+  private <T extends PasswordStorageSchemeCfg> PasswordStorageScheme<T>
     loadPasswordStorageScheme(
        String className,
-       PasswordStorageSchemeCfg configuration,
+       T configuration,
        boolean initialize)
        throws InitializationException
   {
     try
     {
-      PasswordStorageSchemeCfgDefn definition;
       ClassPropertyDefinition propertyDefinition;
       Class<? extends PasswordStorageScheme> schemeClass;
-      PasswordStorageScheme<? extends PasswordStorageSchemeCfg>
-          passwordStorageScheme;
 
-      definition = PasswordStorageSchemeCfgDefn.getInstance();
+      PasswordStorageSchemeCfgDefn definition = PasswordStorageSchemeCfgDefn.getInstance();
       propertyDefinition = definition.getJavaClassPropertyDefinition();
-      schemeClass = propertyDefinition.loadClass(
-          className,
-          PasswordStorageScheme.class
-          );
-      passwordStorageScheme =
-        (PasswordStorageScheme<? extends PasswordStorageSchemeCfg>)
-            schemeClass.newInstance();
+      schemeClass = propertyDefinition.loadClass(className, PasswordStorageScheme.class);
+      PasswordStorageScheme<T> passwordStorageScheme = schemeClass.newInstance();
 
       if (initialize)
       {
-        Method method = passwordStorageScheme.getClass().getMethod(
-            "initializePasswordStorageScheme",
-            configuration.configurationClass());
-        method.invoke(passwordStorageScheme, configuration);
+        passwordStorageScheme.initializePasswordStorageScheme(configuration);
       }
       else
       {
-        Method method = passwordStorageScheme.getClass().getMethod(
-                             "isConfigurationAcceptable",
-                             PasswordStorageSchemeCfg.class, List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(passwordStorageScheme,
-                                                     configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!passwordStorageScheme.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/PasswordValidatorConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
index 365e31d..0d50dcd 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/PasswordValidatorConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -384,9 +383,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the password validator.
    */
-  private PasswordValidator<? extends PasswordValidatorCfg>
+  private <T extends PasswordValidatorCfg> PasswordValidator<T>
                loadValidator(String className,
-                             PasswordValidatorCfg configuration,
+                             T configuration,
                              boolean initialize)
           throws InitializationException
   {
@@ -398,27 +397,16 @@
            definition.getJavaClassPropertyDefinition();
       Class<? extends PasswordValidator> validatorClass =
            propertyDefinition.loadClass(className, PasswordValidator.class);
-      PasswordValidator<? extends PasswordValidatorCfg> validator =
-           (PasswordValidator<? extends PasswordValidatorCfg>)
-           validatorClass.newInstance();
+      PasswordValidator<T> validator = validatorClass.newInstance();
 
       if (initialize)
       {
-        Method method = validator.getClass().getMethod(
-            "initializePasswordValidator", configuration.configurationClass());
-        method.invoke(validator, configuration);
+        validator.initializePasswordValidator(configuration);
       }
       else
       {
-        Method method =
-             validator.getClass().getMethod("isConfigurationAcceptable",
-                                            PasswordValidatorCfg.class,
-                                            List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(validator, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!validator.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/PluginConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/PluginConfigManager.java
index e0e2997..16500e4 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/PluginConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/PluginConfigManager.java
@@ -26,7 +26,6 @@
  */
 package org.opends.server.core;
 
-import java.lang.reflect.Method;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.locks.ReentrantLock;
@@ -342,9 +341,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the plugin.
    */
-  private DirectoryServerPlugin<? extends PluginCfg>
+  private <T extends PluginCfg> DirectoryServerPlugin<T>
                loadPlugin(String className, Set<PluginType> pluginTypes,
-                          PluginCfg configuration, boolean initialize)
+                          T configuration, boolean initialize)
           throws InitializationException
   {
     try
@@ -355,29 +354,18 @@
            definition.getJavaClassPropertyDefinition();
       Class<? extends DirectoryServerPlugin> pluginClass =
            propertyDefinition.loadClass(className, DirectoryServerPlugin.class);
-      DirectoryServerPlugin<? extends PluginCfg> plugin =
-          pluginClass.newInstance();
+      DirectoryServerPlugin<T> plugin = pluginClass.newInstance();
 
       if (initialize)
       {
         plugin.initializeInternal(configuration.dn(), pluginTypes,
             configuration.isInvokeForInternalOperations());
-
-        Method method =
-            plugin.getClass().getMethod("initializePlugin", Set.class,
-                configuration.configurationClass());
-        method.invoke(plugin, pluginTypes, configuration);
+        plugin.initializePlugin(pluginTypes, configuration);
       }
       else
       {
-        Method method = plugin.getClass().getMethod("isConfigurationAcceptable",
-                                                    PluginCfg.class,
-                                                    List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(plugin, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!plugin.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String buffer = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/SASLConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/SASLConfigManager.java
index a6b5064..19e6456 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/SASLConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/SASLConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -389,22 +388,12 @@
 
       if (initialize)
       {
-        Method method = handler.getClass().getMethod(
-            "initializeSASLMechanismHandler",
-            configuration.configurationClass());
-        method.invoke(handler, configuration);
+        handler.initializeSASLMechanismHandler(configuration);
       }
       else
       {
-        Method method =
-             handler.getClass().getMethod("isConfigurationAcceptable",
-                                          SASLMechanismHandlerCfg.class,
-                                          List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(handler, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!handler.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
index 74a8a99..03b4d29 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/SynchronizationProviderConfigManager.java
@@ -25,20 +25,14 @@
  *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
 
-
-
-import org.forgerock.i18n.slf4j.LocalizedLogger;
-import static org.opends.messages.ConfigMessages.*;
-
-import static org.opends.server.util.StaticUtils.stackTraceToSingleLineString;
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -52,9 +46,9 @@
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
-
+import static org.opends.messages.ConfigMessages.*;
+import static org.opends.server.util.StaticUtils.*;
 
 /**
  * This class defines a utility that will be used to manage the configuration
@@ -155,6 +149,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(
       SynchronizationProviderCfg configuration)
   {
@@ -244,6 +239,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(
       SynchronizationProviderCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -264,6 +260,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationAdd(
     SynchronizationProviderCfg configuration)
   {
@@ -322,6 +319,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationAddAcceptable(
       SynchronizationProviderCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -421,40 +419,16 @@
     String className = configuration.getJavaClass();
     SynchronizationProviderCfgDefn d =
       SynchronizationProviderCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-      d.getJavaClassPropertyDefinition();
+    ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
-    // Load the class and cast it to a synchronizationProvider.
-    SynchronizationProvider provider = null;
-    Class<? extends SynchronizationProvider> theClass;
     try
     {
-       theClass = pd.loadClass(className, SynchronizationProvider.class);
-       provider = theClass.newInstance();
-    } catch (Exception e)
-    {
-       // Handle the exception: put a message in the unacceptable reasons.
-       LocalizableMessage message = ERR_CONFIG_SYNCH_UNABLE_TO_LOAD_PROVIDER_CLASS.get(
-           className, configuration.dn(), stackTraceToSingleLineString(e));
-       unacceptableReasons.add(message);
-       return false;
-    }
-    // Check that the implementation class implements the correct interface.
-    try
-    {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method = theClass.getMethod("isConfigurationAcceptable",
-                                         SynchronizationProviderCfg.class,
-                                         List.class);
-      Boolean acceptable = (Boolean) method.invoke(provider, configuration,
-                                                   unacceptableReasons);
+      Class<? extends SynchronizationProvider> theClass =
+          pd.loadClass(className, SynchronizationProvider.class);
+      SynchronizationProvider provider = theClass.newInstance();
 
-      if (! acceptable)
-      {
-        return false;
-      }
+      return provider.isConfigurationAcceptable(configuration,
+          unacceptableReasons);
     } catch (Exception e)
     {
       // Handle the exception: put a message in the unacceptable reasons.
@@ -463,14 +437,12 @@
       unacceptableReasons.add(message);
       return false;
     }
-
-    // The class is valid as far as we can tell.
-    return true;
   }
 
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationDelete(
       SynchronizationProviderCfg configuration)
   {
@@ -495,6 +467,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationDeleteAcceptable(
       SynchronizationProviderCfg configuration,
       List<LocalizableMessage> unacceptableReasons)
@@ -503,7 +476,3 @@
     return true;
   }
 }
-
-
-
-
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
index d4698aa..a94067a 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/TrustManagerProviderConfigManager.java
@@ -30,7 +30,6 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.util.Utils;
 
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -379,9 +378,9 @@
    * @throws  InitializationException  If a problem occurred while attempting to
    *                                   initialize the trust manager provider.
    */
-  private TrustManagerProvider loadProvider(
+  private <T extends TrustManagerProviderCfg> TrustManagerProvider<T> loadProvider(
                                    String className,
-                                   TrustManagerProviderCfg configuration,
+                                   T configuration,
                                    boolean initialize)
           throws InitializationException
   {
@@ -393,26 +392,16 @@
            definition.getJavaClassPropertyDefinition();
       Class<? extends TrustManagerProvider> providerClass =
            propertyDefinition.loadClass(className, TrustManagerProvider.class);
-      TrustManagerProvider provider = providerClass.newInstance();
+      TrustManagerProvider<T> provider = providerClass.newInstance();
 
       if (initialize)
       {
-        Method method = provider.getClass().getMethod(
-            "initializeTrustManagerProvider",
-            configuration.configurationClass());
-        method.invoke(provider, configuration);
+        provider.initializeTrustManagerProvider(configuration);
       }
       else
       {
-        Method method =
-             provider.getClass().getMethod("isConfigurationAcceptable",
-                                           TrustManagerProviderCfg.class,
-                                           List.class);
-
         List<LocalizableMessage> unacceptableReasons = new ArrayList<LocalizableMessage>();
-        Boolean acceptable = (Boolean) method.invoke(provider, configuration,
-                                                     unacceptableReasons);
-        if (! acceptable)
+        if (!provider.isConfigurationAcceptable(configuration, unacceptableReasons))
         {
           String reasons = Utils.joinAsString(".  ", unacceptableReasons);
           throw new InitializationException(
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/WorkQueueConfigManager.java b/opendj3-server-dev/src/server/org/opends/server/core/WorkQueueConfigManager.java
index 7ae6091..bd17d81 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/WorkQueueConfigManager.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/WorkQueueConfigManager.java
@@ -25,23 +25,21 @@
  *      Portions Copyright 2014 ForgeRock AS
  */
 package org.opends.server.core;
-import org.forgerock.i18n.LocalizableMessage;
-
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationChangeListener;
-import org.opends.server.admin.std.meta.WorkQueueCfgDefn;
-import org.opends.server.admin.std.server.WorkQueueCfg;
-import org.opends.server.admin.std.server.RootCfg;
 import org.opends.server.admin.server.ServerManagementContext;
+import org.opends.server.admin.std.meta.WorkQueueCfgDefn;
+import org.opends.server.admin.std.server.RootCfg;
+import org.opends.server.admin.std.server.WorkQueueCfg;
 import org.opends.server.api.WorkQueue;
 import org.opends.server.config.ConfigException;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.server.util.StaticUtils.*;
@@ -106,9 +104,7 @@
     {
       WorkQueue workQueue = workQueueClass.newInstance();
 
-      Method method = workQueue.getClass().getMethod("initializeWorkQueue",
-          workQueueConfig.configurationClass());
-      method.invoke(workQueue, workQueueConfig);
+      workQueue.initializeWorkQueue(workQueueConfig);
 
       return workQueue;
     }
@@ -125,6 +121,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public boolean isConfigurationChangeAcceptable(WorkQueueCfg configuration,
                       List<LocalizableMessage> unacceptableReasons)
   {
@@ -138,6 +135,7 @@
   /**
    * {@inheritDoc}
    */
+  @Override
   public ConfigChangeResult applyConfigurationChange(WorkQueueCfg configuration)
   {
     ResultCode        resultCode          = ResultCode.SUCCESS;
diff --git a/opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java b/opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java
index b6524fb..53fbc8f 100644
--- a/opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java
+++ b/opendj3-server-dev/src/server/org/opends/server/core/networkgroups/NetworkGroup.java
@@ -26,15 +26,12 @@
  */
 package org.opends.server.core.networkgroups;
 
-
-
 import static org.opends.messages.ConfigMessages.*;
 import static org.opends.messages.CoreMessages.*;
 import static org.opends.server.util.StaticUtils.*;
 import static org.forgerock.util.Reject.*;
 
 import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -47,6 +44,8 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.forgerock.i18n.LocalizableMessage;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
+import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.admin.ClassPropertyDefinition;
 import org.opends.server.admin.server.ConfigurationAddListener;
 import org.opends.server.admin.server.ConfigurationChangeListener;
@@ -63,19 +62,15 @@
 import org.opends.server.core.Workflow;
 import org.opends.server.core.WorkflowImpl;
 import org.opends.server.core.WorkflowTopologyNode;
-import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.opends.server.protocols.ldap.LDAPMessage;
 import org.opends.server.types.AuthenticationType;
 import org.opends.server.types.ConfigChangeResult;
 import org.opends.server.types.DN;
 import org.opends.server.types.DirectoryException;
 import org.opends.server.types.InitializationException;
-import org.forgerock.opendj.ldap.ResultCode;
 import org.opends.server.types.operation.PreParseOperation;
 import org.opends.server.workflowelement.WorkflowElement;
 
-
-
 /**
  * This class defines the network group. A network group is used to
  * categorize client connections. A network group is defined by a set of
@@ -98,6 +93,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public ConfigChangeResult applyConfigurationChange(
         NetworkGroupCfg configuration)
     {
@@ -163,6 +159,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean isConfigurationChangeAcceptable(
         NetworkGroupCfg configuration, List<LocalizableMessage> unacceptableReasons)
     {
@@ -183,6 +180,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public ConfigChangeResult applyConfigurationAdd(
         QOSPolicyCfg configuration)
     {
@@ -214,6 +212,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public ConfigChangeResult applyConfigurationDelete(
         QOSPolicyCfg configuration)
     {
@@ -241,6 +240,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean isConfigurationAddAcceptable(
         QOSPolicyCfg configuration, List<LocalizableMessage> unacceptableReasons)
     {
@@ -253,6 +253,7 @@
     /**
      * {@inheritDoc}
      */
+    @Override
     public boolean isConfigurationDeleteAcceptable(
         QOSPolicyCfg configuration, List<LocalizableMessage> unacceptableReasons)
     {
@@ -728,27 +729,11 @@
     // Validate the configuration.
     try
     {
-      // Load the class and cast it to a network group policy factory.
-      Class<? extends QOSPolicyFactory> theClass;
-      QOSPolicyFactory factory;
+      Class<? extends QOSPolicyFactory> theClass =
+          pd.loadClass(className, QOSPolicyFactory.class);
+      QOSPolicyFactory factory = theClass.newInstance();
 
-      theClass = pd.loadClass(className, QOSPolicyFactory.class);
-      factory = theClass.newInstance();
-
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method =
-          theClass.getMethod("isConfigurationAcceptable",
-              QOSPolicyCfg.class, List.class);
-      Boolean acceptable =
-          (Boolean) method.invoke(factory, policyConfiguration,
-              unacceptableReasons);
-
-      if (!acceptable)
-      {
-        return false;
-      }
+      return factory.isConfigurationAcceptable(policyConfiguration, unacceptableReasons);
     }
     catch (Exception e)
     {
@@ -759,9 +744,6 @@
               className, policyConfiguration.dn(), stackTraceToSingleLineString(e)));
       return false;
     }
-
-    // The configuration is valid as far as we can tell.
-    return true;
   }
 
 
@@ -1598,38 +1580,14 @@
     QOSPolicyCfgDefn d = QOSPolicyCfgDefn.getInstance();
     ClassPropertyDefinition pd = d.getJavaClassPropertyDefinition();
 
-    // Load the class and cast it to a network group policy.
-    Class<? extends QOSPolicyFactory> theClass;
-    QOSPolicyFactory factory;
-
-    try
-    {
-      theClass = pd.loadClass(className, QOSPolicyFactory.class);
-      factory = theClass.newInstance();
-    }
-    catch (Exception e)
-    {
-      logger.traceException(e);
-
-      LocalizableMessage message = ERR_CONFIG_NETWORK_GROUP_POLICY_CANNOT_INITIALIZE.get(
-          className, policyConfiguration.dn(), stackTraceToSingleLineString(e));
-      throw new InitializationException(message, e);
-    }
-
-    // Perform the necessary initialization for the network group
-    // policy.
     QOSPolicy policy;
-
     try
     {
-      // Determine the initialization method to use: it must take a
-      // single parameter which is the exact type of the configuration
-      // object.
-      Method method =
-          theClass.getMethod("createQOSPolicy", policyConfiguration
-              .configurationClass());
+      Class<? extends QOSPolicyFactory> theClass =
+          pd.loadClass(className, QOSPolicyFactory.class);
+      QOSPolicyFactory factory = theClass.newInstance();
 
-      policy = (QOSPolicy) method.invoke(factory, policyConfiguration);
+      policy = factory.createQOSPolicy(policyConfiguration);
     }
     catch (Exception e)
     {
@@ -1654,8 +1612,7 @@
       throw new InitializationException(message, e);
     }
 
-    // The network group has been successfully initialized - so register
-    // it.
+    // The network group has been successfully initialized - so register it.
     QOSPolicy oldPolicy =
         policies.put(policyConfiguration.dn(), policy);
 
diff --git a/opendj3-server-dev/src/server/org/opends/server/loggers/AbstractLogger.java b/opendj3-server-dev/src/server/org/opends/server/loggers/AbstractLogger.java
index 061beb1..65e878b 100644
--- a/opendj3-server-dev/src/server/org/opends/server/loggers/AbstractLogger.java
+++ b/opendj3-server-dev/src/server/org/opends/server/loggers/AbstractLogger.java
@@ -388,9 +388,7 @@
     String className = config.getJavaClass();
     ClassPropertyDefinition pd = getJavaClassPropertyDefinition();
     try {
-      // Load the class and cast it to a LogPublisher.
       P publisher = pd.loadClass(className, logPublisherClass).newInstance();
-      // The class is valid as far as we can tell.
       return publisher.isConfigurationAcceptable(config, unacceptableReasons);
     } catch (Exception e) {
       unacceptableReasons.add(invalidLoggerClassErrorMessage.get(className, config.dn(), e));
@@ -403,10 +401,8 @@
     String className = config.getJavaClass();
     ClassPropertyDefinition pd = getJavaClassPropertyDefinition();
     try {
-      // Load the class and cast it to a LogPublisher.
       P logPublisher = pd.loadClass(className, logPublisherClass).newInstance();
       logPublisher.initializeLogPublisher(config, serverContext);
-      // The log publisher has been successfully initialized.
       return logPublisher;
     }
     catch (Exception e)
diff --git a/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskEntry.java b/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskEntry.java
index 8e91897..a449bcb 100644
--- a/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskEntry.java
+++ b/opendj3-server-dev/src/server/org/opends/server/tools/tasks/TaskEntry.java
@@ -24,20 +24,17 @@
  *      Copyright 2008-2009 Sun Microsystems, Inc.
  *      Portions Copyright 2014 ForgeRock AS
  */
-
 package org.opends.server.tools.tasks;
 
 import org.forgerock.i18n.LocalizableMessage;
-
+import org.opends.server.backends.task.FailedDependencyAction;
 import org.opends.server.backends.task.Task;
 import org.opends.server.backends.task.TaskState;
-import org.opends.server.backends.task.FailedDependencyAction;
 import org.opends.server.types.Entry;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.Attribute;
 import org.opends.server.types.AttributeValue;
 import org.opends.server.types.DN;
-import static org.opends.server.util.ServerConstants.*;
 
 import java.util.Map;
 import java.util.HashMap;
@@ -53,6 +50,8 @@
 import java.text.DateFormat;
 import java.text.ParseException;
 
+import static org.opends.server.util.ServerConstants.*;
+
 /**
  * Processes information from a task entry from the directory and
  * provides accessors for attribute information.  In some cases the
@@ -369,16 +368,9 @@
       if (type == null) {
         Task task = getTask();
         if (task != null) {
-          try {
-            Method m = Task.class.getMethod("getDisplayName");
-            Object oName = m.invoke(task);
-            if (oName instanceof LocalizableMessage) {
-              mapClassToTypeName.put(className, (LocalizableMessage) oName);
-              type = (LocalizableMessage) oName;
-            }
-          } catch (Exception e) {
-            // ignore; this is best effort
-          }
+          LocalizableMessage message = task.getDisplayName();
+          mapClassToTypeName.put(className, message);
+          type = message;
         }
       }
 
diff --git a/opendj3-server-dev/src/snmp/src/org/opends/server/snmp/SNMPConnectionHandler.java b/opendj3-server-dev/src/snmp/src/org/opends/server/snmp/SNMPConnectionHandler.java
index 9ec485e..9b3b424 100644
--- a/opendj3-server-dev/src/snmp/src/org/opends/server/snmp/SNMPConnectionHandler.java
+++ b/opendj3-server-dev/src/snmp/src/org/opends/server/snmp/SNMPConnectionHandler.java
@@ -256,10 +256,9 @@
             URLClassLoader sysloader =
               (URLClassLoader)ClassLoader.getSystemClassLoader();
             Class sysclass = URLClassLoader.class;
-            Method method =
-              sysclass.getDeclaredMethod("addURL",new Class[]{URL.class});
+            Method method = sysclass.getDeclaredMethod("addURL", URL.class);
             method.setAccessible(true);
-            method.invoke(sysloader,new Object[]{ u });
+            method.invoke(sysloader, u);
         }
         catch (Throwable t) {
         }

--
Gitblit v1.10.0