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;
    try {
      theClass = pd.loadClass(className, RotationPolicy.class);
      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();
      Message message =
          ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
              className, config.dn().toString(), stackTraceToSingleLineString(e));
      throw new ConfigException(message, e);
    } catch (Exception e) {
      Message message =
          ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
              className, config.dn().toString(), String.valueOf(e));
      throw new ConfigException(message, e);
    }

    // The connection handler has been successfully initialized.
    return rotationPolicy;
  }
 private boolean isJavaClassAcceptable(
     LogRotationPolicyCfg config, List<Message> unacceptableReasons) {
   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;
   try {
     theClass = pd.loadClass(className, RotationPolicy.class);
     theClass.newInstance();
   } catch (Exception e) {
     Message message =
         ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
             className, config.dn().toString(), String.valueOf(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.
     theClass.getMethod("initializeLogRotationPolicy", config.configurationClass());
   } catch (Exception e) {
     Message message =
         ERR_CONFIG_ROTATION_POLICY_INVALID_CLASS.get(
             className, config.dn().toString(), String.valueOf(e));
     unacceptableReasons.add(message);
     return false;
   }
   // The class is valid as far as we can tell.
   return true;
 }
  /** {@inheritDoc} */
  public ConfigChangeResult applyConfigurationAdd(LogRotationPolicyCfg config) {
    // Default result code.
    ResultCode resultCode = ResultCode.SUCCESS;
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();

    try {
      RotationPolicy rotationPolicy = getRotationPolicy(config);

      DirectoryServer.registerRotationPolicy(config.dn(), rotationPolicy);
    } catch (ConfigException e) {
      if (debugEnabled()) {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }
      messages.add(e.getMessageObject());
      resultCode = DirectoryServer.getServerErrorResultCode();
    } catch (Exception e) {
      if (debugEnabled()) {
        TRACER.debugCaught(DebugLogLevel.ERROR, e);
      }

      messages.add(
          ERR_CONFIG_ROTATION_POLICY_CANNOT_CREATE_POLICY.get(
              String.valueOf(config.dn().toString()), stackTraceToSingleLineString(e)));
      resultCode = DirectoryServer.getServerErrorResultCode();
    }

    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
  /** {@inheritDoc} */
  public ConfigChangeResult applyConfigurationChange(LogRotationPolicyCfg configuration) {
    // Default result code.
    ResultCode resultCode = ResultCode.SUCCESS;
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();

    RotationPolicy policy = DirectoryServer.getRotationPolicy(configuration.dn());
    String className = configuration.getJavaClass();
    if (!className.equals(policy.getClass().getName())) {
      adminActionRequired = true;
    }

    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }
  /**
   * Initializes all the log rotation policies.
   *
   * @throws ConfigException If an unrecoverable problem arises in the process of performing the
   *     initialization as a result of the server configuration.
   * @throws InitializationException If a problem occurs during initialization that is not related
   *     to the server configuration.
   */
  public void initializeLogRotationPolicyConfig() throws ConfigException, InitializationException {
    ServerManagementContext context = ServerManagementContext.getInstance();
    RootCfg root = context.getRootConfiguration();

    root.addLogRotationPolicyAddListener(this);
    root.addLogRotationPolicyDeleteListener(this);

    for (String name : root.listLogRotationPolicies()) {
      LogRotationPolicyCfg config = root.getLogRotationPolicy(name);

      RotationPolicy rotationPolicy = getRotationPolicy(config);

      DirectoryServer.registerRotationPolicy(config.dn(), rotationPolicy);
    }
  }
  /** {@inheritDoc} */
  public ConfigChangeResult applyConfigurationDelete(LogRotationPolicyCfg config) {
    // Default result code.
    ResultCode resultCode = ResultCode.SUCCESS;
    boolean adminActionRequired = false;
    ArrayList<Message> messages = new ArrayList<Message>();

    RotationPolicy policy = DirectoryServer.getRotationPolicy(config.dn());
    if (policy != null) {
      DirectoryServer.deregisterRotationPolicy(config.dn());
    } else {
      // TODO: Add message and check for usage
      resultCode = DirectoryServer.getServerErrorResultCode();
    }

    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
  }