mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noel Rouvignac
25.48.2014 8271ebead97bf11132eb1146c836212ae456e27c
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
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(
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(
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(
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(
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;
  }
}
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(
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;
  }
}
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(
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));
        }
      }
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(
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(
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;
  }
}
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;
  }
}
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(
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)
    {
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(
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)
    {
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(
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(
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(
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(
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;
  }
}
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(
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;
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);
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)
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;
        }
      }
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) {
        }