From b54d8bdf7b583b5d57b7deae2431c32fcd644a1a Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 25 Apr 2013 09:00:37 +0000
Subject: [PATCH] OPENDJ-879 (CR-1603) Add HTTP access log

---
 opends/src/server/org/opends/server/loggers/debug/DebugLogger.java |  349 +++++++++-------------------------------------------------
 1 files changed, 54 insertions(+), 295 deletions(-)

diff --git a/opends/src/server/org/opends/server/loggers/debug/DebugLogger.java b/opends/src/server/org/opends/server/loggers/debug/DebugLogger.java
index dd3ddf8..ba22b11 100644
--- a/opends/src/server/org/opends/server/loggers/debug/DebugLogger.java
+++ b/opends/src/server/org/opends/server/loggers/debug/DebugLogger.java
@@ -26,30 +26,19 @@
  *      Portions Copyright 2013 ForgeRock AS
  */
 package org.opends.server.loggers.debug;
+
 import static org.opends.messages.ConfigMessages.*;
-import static org.opends.server.util.StaticUtils.*;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
 
-import org.opends.messages.Message;
 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.std.meta.DebugLogPublisherCfgDefn;
 import org.opends.server.admin.std.server.DebugLogPublisherCfg;
 import org.opends.server.api.DebugLogPublisher;
-import org.opends.server.config.ConfigException;
-import org.opends.server.core.DirectoryServer;
+import org.opends.server.loggers.AbstractLogger;
 import org.opends.server.loggers.LogLevel;
-import org.opends.server.types.ConfigChangeResult;
-import org.opends.server.types.DN;
 import org.opends.server.types.DebugLogLevel;
-import org.opends.server.types.InitializationException;
-import org.opends.server.types.ResultCode;
 
 /**
  * A logger for debug and trace logging. DebugLogger provides a debugging
@@ -63,46 +52,71 @@
  *
  * DebugLogger is self-initializing.
  */
-public class DebugLogger implements
-    ConfigurationAddListener<DebugLogPublisherCfg>,
-    ConfigurationDeleteListener<DebugLogPublisherCfg>,
-    ConfigurationChangeListener<DebugLogPublisherCfg>
+public class DebugLogger extends AbstractLogger
+    <DebugLogPublisher<DebugLogPublisherCfg>, DebugLogPublisherCfg>
 {
-  //The default level to log constructor exectuions.
+  /** The default level to log constructor executions. */
   static final LogLevel DEFAULT_CONSTRUCTOR_LEVEL =
       DebugLogLevel.VERBOSE;
-  //The default level to log method entry and exit pointcuts.
+  /** The default level to log method entry and exit pointcuts. */
   static final LogLevel DEFAULT_ENTRY_EXIT_LEVEL =
       DebugLogLevel.VERBOSE;
-  //The default level to log method entry and exit pointcuts.
+  /** The default level to log method entry and exit pointcuts. */
   static final LogLevel DEFAULT_THROWN_LEVEL =
       DebugLogLevel.ERROR;
 
-  // The set of all DebugTracer instances.
-  private static ConcurrentHashMap<String, DebugTracer> classTracers =
+  /** The set of all DebugTracer instances. */
+  private static Map<String, DebugTracer> classTracers =
       new ConcurrentHashMap<String, DebugTracer>();
 
-  // The set of debug loggers that have been registered with the server.  It
-  // will initially be empty.
-  private static CopyOnWriteArrayList<DebugLogPublisher> debugPublishers =
-      new CopyOnWriteArrayList<DebugLogPublisher>();
-
-  // Trace methods will use this static boolean to determine if debug is
-  // enabled so to not incur the cost of calling debugPublishers.isEmtpty().
+  /**
+   * Trace methods will use this static boolean to determine if debug is enabled
+   * so to not incur the cost of calling debugPublishers.isEmpty().
+   */
   static boolean enabled = false;
 
-  // The singleton instance of this class for configuration purposes.
+  private static final LoggerStorage
+      <DebugLogPublisher<DebugLogPublisherCfg>, DebugLogPublisherCfg>
+      loggerStorage = new LoggerStorage
+      <DebugLogPublisher<DebugLogPublisherCfg>, DebugLogPublisherCfg>();
+
+  /** The singleton instance of this class for configuration purposes. */
   static final DebugLogger instance = new DebugLogger();
 
   /**
+   * The constructor for this class.
+   */
+  public DebugLogger()
+  {
+    super((Class) DebugLogPublisher.class,
+        ERR_CONFIG_LOGGER_INVALID_DEBUG_LOGGER_CLASS);
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  protected ClassPropertyDefinition getJavaClassPropertyDefinition()
+  {
+    return DebugLogPublisherCfgDefn.getInstance()
+        .getJavaClassPropertyDefinition();
+  }
+
+  /** {@inheritDoc} */
+  @Override
+  protected LoggerStorage<DebugLogPublisher<DebugLogPublisherCfg>,
+      DebugLogPublisherCfg> getStorage()
+  {
+    return loggerStorage;
+  }
+
+  /**
    * Add an debug log publisher to the debug logger.
    *
-   * @param publisher The error log publisher to add.
+   * @param publisher The debug log publisher to add.
    */
   public synchronized static void addDebugLogPublisher(
       DebugLogPublisher publisher)
   {
-    debugPublishers.add(publisher);
+    loggerStorage.addLogPublisher(publisher);
 
     updateTracerSettings();
 
@@ -118,19 +132,11 @@
   public synchronized static boolean removeDebugLogPublisher(
       DebugLogPublisher publisher)
   {
-    boolean removed = debugPublishers.remove(publisher);
-
-    if(removed)
-    {
-      publisher.close();
-    }
+    boolean removed = loggerStorage.removeLogPublisher(publisher);
 
     updateTracerSettings();
 
-    if(debugPublishers.isEmpty())
-    {
-      enabled = false;
-    }
+    enabled = !loggerStorage.getLogPublishers().isEmpty();
 
     return removed;
   }
@@ -140,12 +146,7 @@
    */
   public synchronized static void removeAllDebugLogPublishers()
   {
-    for(DebugLogPublisher publisher : debugPublishers)
-    {
-      publisher.close();
-    }
-
-    debugPublishers.clear();
+    loggerStorage.removeAllLogPublishers();
 
     updateTracerSettings();
 
@@ -153,256 +154,13 @@
   }
 
   /**
-   * Initializes all the debug log publishers.
-   *
-   * @param  configs The debug log publisher configurations.
-   * @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 initializeDebugLogger(List<DebugLogPublisherCfg> configs)
-      throws ConfigException, InitializationException
-  {
-    for(DebugLogPublisherCfg config : configs)
-    {
-      config.addDebugChangeListener(this);
-
-      if(config.isEnabled())
-      {
-        DebugLogPublisher debugLogPublisher = getDebugPublisher(config);
-
-        addDebugLogPublisher(debugLogPublisher);
-      }
-    }
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public boolean isConfigurationAddAcceptable(DebugLogPublisherCfg config,
-                                              List<Message> unacceptableReasons)
-  {
-    return !config.isEnabled() ||
-        isJavaClassAcceptable(config, unacceptableReasons);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public boolean isConfigurationChangeAcceptable(DebugLogPublisherCfg config,
-                                              List<Message> unacceptableReasons)
-  {
-    return !config.isEnabled() ||
-        isJavaClassAcceptable(config, unacceptableReasons);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public ConfigChangeResult applyConfigurationAdd(DebugLogPublisherCfg config)
-  {
-    // Default result code.
-    ResultCode resultCode = ResultCode.SUCCESS;
-    boolean adminActionRequired = false;
-    ArrayList<Message> messages = new ArrayList<Message>();
-
-    config.addDebugChangeListener(this);
-
-    if(config.isEnabled())
-    {
-      try
-      {
-        DebugLogPublisher debugLogPublisher =
-            getDebugPublisher(config);
-
-        addDebugLogPublisher(debugLogPublisher);
-      }
-      catch(ConfigException e)
-      {
-        messages.add(e.getMessageObject());
-        resultCode = DirectoryServer.getServerErrorResultCode();
-      }
-      catch (Exception e)
-      {
-
-        messages.add(ERR_CONFIG_LOGGER_CANNOT_CREATE_LOGGER.get(
-                String.valueOf(config.dn().toString()),
-                stackTraceToSingleLineString(e)));
-        resultCode = DirectoryServer.getServerErrorResultCode();
-      }
-    }
-    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public ConfigChangeResult applyConfigurationChange(
-      DebugLogPublisherCfg config)
-  {
-    // Default result code.
-    ResultCode resultCode = ResultCode.SUCCESS;
-    boolean adminActionRequired = false;
-    ArrayList<Message> messages = new ArrayList<Message>();
-
-    DN dn = config.dn();
-
-    DebugLogPublisher debugLogPublisher = null;
-    for(DebugLogPublisher publisher : debugPublishers)
-    {
-      if(publisher.getDN().equals(dn))
-      {
-        debugLogPublisher = publisher;
-      }
-    }
-
-    if(debugLogPublisher == null)
-    {
-      if(config.isEnabled())
-      {
-        // Needs to be added and enabled.
-        return applyConfigurationAdd(config);
-      }
-    }
-    else
-    {
-      if(config.isEnabled())
-      {
-        // The publisher is currently active, so we don't need to do anything.
-        // Changes to the class name cannot be
-        // applied dynamically, so if the class name did change then
-        // indicate that administrative action is required for that
-        // change to take effect.
-        String className = config.getJavaClass();
-        if(!className.equals(debugLogPublisher.getClass().getName()))
-        {
-          adminActionRequired = true;
-        }
-      }
-      else
-      {
-        // The publisher is being disabled so shut down and remove.
-        removeDebugLogPublisher(debugLogPublisher);
-      }
-    }
-
-    return new ConfigChangeResult(resultCode, adminActionRequired, messages);
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public boolean isConfigurationDeleteAcceptable(DebugLogPublisherCfg config,
-                                             List<Message> unacceptableReasons)
-  {
-    DN dn = config.dn();
-
-    DebugLogPublisher debugLogPublisher = null;
-    for(DebugLogPublisher publisher : debugPublishers)
-    {
-      if(publisher.getDN().equals(dn))
-      {
-        debugLogPublisher = publisher;
-      }
-    }
-
-    return debugLogPublisher != null;
-  }
-
-  /**
-   * {@inheritDoc}
-   */
-  @Override
-  public ConfigChangeResult
-         applyConfigurationDelete(DebugLogPublisherCfg config)
-  {
-    // Default result code.
-    ResultCode resultCode = ResultCode.SUCCESS;
-    boolean adminActionRequired = false;
-
-    DebugLogPublisher debugLogPublisher = null;
-    for(DebugLogPublisher publisher : debugPublishers)
-    {
-      if(publisher.getDN().equals(config.dn()))
-      {
-        debugLogPublisher = publisher;
-      }
-    }
-
-    if(debugLogPublisher != null)
-    {
-      removeDebugLogPublisher(debugLogPublisher);
-    }
-    else
-    {
-      resultCode = ResultCode.NO_SUCH_OBJECT;
-    }
-
-    return new ConfigChangeResult(resultCode, adminActionRequired);
-  }
-
-  private boolean isJavaClassAcceptable(DebugLogPublisherCfg config,
-                                        List<Message> unacceptableReasons)
-  {
-    String className = config.getJavaClass();
-    DebugLogPublisherCfgDefn d = DebugLogPublisherCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    try {
-      // Load the class and cast it to a DebugLogPublisher.
-      DebugLogPublisher<DebugLogPublisherCfg> publisher =
-          pd.loadClass(className, DebugLogPublisher.class).newInstance();
-      // The class is valid as far as we can tell.
-      return publisher.isConfigurationAcceptable(config, unacceptableReasons);
-    } catch (Exception e) {
-      Message message = ERR_CONFIG_LOGGER_INVALID_DEBUG_LOGGER_CLASS.get(
-              className,
-              config.dn().toString(),
-              String.valueOf(e));
-      unacceptableReasons.add(message);
-      return false;
-    }
-  }
-
-  private DebugLogPublisher getDebugPublisher(DebugLogPublisherCfg config)
-      throws ConfigException {
-    String className = config.getJavaClass();
-    DebugLogPublisherCfgDefn d = DebugLogPublisherCfgDefn.getInstance();
-    ClassPropertyDefinition pd =
-        d.getJavaClassPropertyDefinition();
-    try {
-      // Load the class and cast it to a DebugLogPublisher.
-      DebugLogPublisher<DebugLogPublisherCfg> debugLogPublisher =
-          pd.loadClass(className, DebugLogPublisher.class).newInstance();
-      debugLogPublisher.initializeLogPublisher(config);
-      // The debug publisher has been successfully initialized.
-      return debugLogPublisher;
-    }
-    catch (Exception e)
-    {
-      Message message = ERR_CONFIG_LOGGER_INVALID_DEBUG_LOGGER_CLASS.get(
-          className, config.dn().toString(), String.valueOf(e));
-      throw new ConfigException(message, e);
-    }
-  }
-
-  /**
    * Update all debug tracers with the settings in the registered
    * publishers.
    */
   static void updateTracerSettings()
   {
-    DebugLogPublisher[] publishers =
-        debugPublishers.toArray(new DebugLogPublisher[0]);
+    DebugLogPublisher<DebugLogPublisherCfg>[] publishers =
+        loggerStorage.getLogPublishers().toArray(new DebugLogPublisher[0]);
 
     for(DebugTracer tracer : classTracers.values())
     {
@@ -439,7 +197,8 @@
   public static DebugTracer getTracer()
   {
     DebugTracer tracer =
-        new DebugTracer(debugPublishers.toArray(new DebugLogPublisher[0]));
+        new DebugTracer(loggerStorage.getLogPublishers().toArray(
+            new DebugLogPublisher[0]));
     classTracers.put(tracer.getTracedClassName(), tracer);
 
     return tracer;

--
Gitblit v1.10.0