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/AccessLogger.java | 381 +++++++++---------------------------------------------
1 files changed, 64 insertions(+), 317 deletions(-)
diff --git a/opends/src/server/org/opends/server/loggers/AccessLogger.java b/opends/src/server/org/opends/server/loggers/AccessLogger.java
index dbd0dc5..28c085b 100644
--- a/opends/src/server/org/opends/server/loggers/AccessLogger.java
+++ b/opends/src/server/org/opends/server/loggers/AccessLogger.java
@@ -27,25 +27,16 @@
*/
package org.opends.server.loggers;
import static org.opends.messages.ConfigMessages.*;
-import static org.opends.server.loggers.debug.DebugLogger.*;
-import static org.opends.server.util.StaticUtils.*;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.Collection;
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.AccessLogPublisherCfgDefn;
import org.opends.server.admin.std.server.AccessLogPublisherCfg;
import org.opends.server.api.AccessLogPublisher;
import org.opends.server.api.ClientConnection;
-import org.opends.server.config.ConfigException;
import org.opends.server.core.*;
-import org.opends.server.loggers.debug.DebugTracer;
import org.opends.server.types.*;
@@ -53,25 +44,42 @@
* This class defines the wrapper that will invoke all registered access loggers
* for each type of request received or response sent.
*/
-public class AccessLogger implements
- ConfigurationAddListener<AccessLogPublisherCfg>,
- ConfigurationDeleteListener<AccessLogPublisherCfg>,
- ConfigurationChangeListener<AccessLogPublisherCfg>
+public class AccessLogger extends AbstractLogger
+ <AccessLogPublisher<AccessLogPublisherCfg>, AccessLogPublisherCfg>
{
- /**
- * The tracer object for the debug logger.
- */
- private static final DebugTracer TRACER = getTracer();
- // The set of access loggers that have been registered with the server. It
- // will initially be empty.
- private static CopyOnWriteArrayList<AccessLogPublisher<?>> accessPublishers =
- new CopyOnWriteArrayList<AccessLogPublisher<?>>();
+ private static LoggerStorage
+ <AccessLogPublisher<AccessLogPublisherCfg>, AccessLogPublisherCfg>
+ loggerStorage = new LoggerStorage
+ <AccessLogPublisher<AccessLogPublisherCfg>, AccessLogPublisherCfg>();
- // The singleton instance of this class for configuration purposes.
+ /** The singleton instance of this class for configuration purposes. */
private static final AccessLogger instance = new AccessLogger();
+ /**
+ * The constructor for this class.
+ */
+ public AccessLogger()
+ {
+ super((Class) AccessLogPublisher.class,
+ ERR_CONFIG_LOGGER_INVALID_ACCESS_LOGGER_CLASS);
+ }
+ /** {@inheritDoc} */
+ @Override
+ protected ClassPropertyDefinition getJavaClassPropertyDefinition()
+ {
+ return AccessLogPublisherCfgDefn.getInstance()
+ .getJavaClassPropertyDefinition();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ protected LoggerStorage<AccessLogPublisher<AccessLogPublisherCfg>,
+ AccessLogPublisherCfg> getStorage()
+ {
+ return loggerStorage;
+ }
/**
* Retrieve the singleton instance of this class.
@@ -89,9 +97,9 @@
* @param publisher The access log publisher to add.
*/
public synchronized static void addAccessLogPublisher(
- AccessLogPublisher<?> publisher)
+ AccessLogPublisher publisher)
{
- accessPublishers.add(publisher);
+ loggerStorage.addLogPublisher(publisher);
}
/**
@@ -101,16 +109,9 @@
* @return The publisher that was removed or null if it was not found.
*/
public synchronized static boolean removeAccessLogPublisher(
- AccessLogPublisher<?> publisher)
+ AccessLogPublisher<AccessLogPublisherCfg> publisher)
{
- boolean removed = accessPublishers.remove(publisher);
-
- if(removed)
- {
- publisher.close();
- }
-
- return removed;
+ return loggerStorage.removeLogPublisher(publisher);
}
/**
@@ -118,274 +119,20 @@
*/
public synchronized static void removeAllAccessLogPublishers()
{
- for(AccessLogPublisher<?> publisher : accessPublishers)
- {
- publisher.close();
- }
-
- accessPublishers.clear();
+ loggerStorage.removeAllLogPublishers();
}
/**
- * Initializes all the access log publishers.
+ * Returns all the registered access log publishers.
*
- * @param configs The access 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.
+ * @return a Collection of {@link AccessLogPublisher} objects
*/
- public void initializeAccessLogger(List<AccessLogPublisherCfg> configs)
- throws ConfigException, InitializationException
+ private static Collection
+ <AccessLogPublisher<AccessLogPublisherCfg>> getAccessLogPublishers()
{
- for(AccessLogPublisherCfg config : configs)
- {
- config.addAccessChangeListener(this);
-
- if(config.isEnabled())
- {
- AccessLogPublisher<?> AccessLogPublisher = getAccessPublisher(config);
-
- addAccessLogPublisher(AccessLogPublisher);
- }
- }
+ return loggerStorage.getLogPublishers();
}
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isConfigurationAddAcceptable(
- AccessLogPublisherCfg config,
- List<Message> unacceptableReasons)
- {
- return !config.isEnabled() ||
- isJavaClassAcceptable(config, unacceptableReasons);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isConfigurationChangeAcceptable(
- AccessLogPublisherCfg config,
- List<Message> unacceptableReasons)
- {
- return !config.isEnabled() ||
- isJavaClassAcceptable(config, unacceptableReasons);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public ConfigChangeResult applyConfigurationAdd(AccessLogPublisherCfg config)
- {
- // Default result code.
- ResultCode resultCode = ResultCode.SUCCESS;
- boolean adminActionRequired = false;
- ArrayList<Message> messages = new ArrayList<Message>();
-
- config.addAccessChangeListener(this);
-
- if(config.isEnabled())
- {
- try
- {
- AccessLogPublisher<?> AccessLogPublisher = getAccessPublisher(config);
-
- addAccessLogPublisher(AccessLogPublisher);
- }
- 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_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(
- AccessLogPublisherCfg config)
- {
- // Default result code.
- ResultCode resultCode = ResultCode.SUCCESS;
- boolean adminActionRequired = false;
- ArrayList<Message> messages = new ArrayList<Message>();
-
- DN dn = config.dn();
-
- AccessLogPublisher<?> accessLogPublisher = null;
- for(AccessLogPublisher<?> publisher : accessPublishers)
- {
- if(publisher.getDN().equals(dn))
- {
- accessLogPublisher = publisher;
- break;
- }
- }
-
- if(accessLogPublisher == 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(accessLogPublisher.getClass().getName()))
- {
- adminActionRequired = true;
- }
- }
- else
- {
- // The publisher is being disabled so shut down and remove.
- removeAccessLogPublisher(accessLogPublisher);
- }
- }
-
- return new ConfigChangeResult(resultCode, adminActionRequired, messages);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean isConfigurationDeleteAcceptable(
- AccessLogPublisherCfg config,
- List<Message> unacceptableReasons)
- {
- DN dn = config.dn();
-
- AccessLogPublisher<?> accessLogPublisher = null;
- for(AccessLogPublisher<?> publisher : accessPublishers)
- {
- if(publisher.getDN().equals(dn))
- {
- accessLogPublisher = publisher;
- break;
- }
- }
-
- return accessLogPublisher != null;
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public ConfigChangeResult applyConfigurationDelete(
- AccessLogPublisherCfg config)
- {
- // Default result code.
- ResultCode resultCode = ResultCode.SUCCESS;
- boolean adminActionRequired = false;
-
- AccessLogPublisher<?> accessLogPublisher = null;
- for(AccessLogPublisher<?> publisher : accessPublishers)
- {
- if(publisher.getDN().equals(config.dn()))
- {
- accessLogPublisher = publisher;
- break;
- }
- }
-
- if(accessLogPublisher != null)
- {
- removeAccessLogPublisher(accessLogPublisher);
- }
- else
- {
- resultCode = ResultCode.NO_SUCH_OBJECT;
- }
-
- return new ConfigChangeResult(resultCode, adminActionRequired);
- }
-
- @SuppressWarnings("unchecked")
- private boolean isJavaClassAcceptable(AccessLogPublisherCfg config,
- List<Message> unacceptableReasons)
- {
- String className = config.getJavaClass();
- AccessLogPublisherCfgDefn d = AccessLogPublisherCfgDefn.getInstance();
- ClassPropertyDefinition pd =
- d.getJavaClassPropertyDefinition();
- try {
- // Load the class and cast it to a AccessLogPublisher.
- AccessLogPublisher<AccessLogPublisherCfg> publisher =
- pd.loadClass(className, AccessLogPublisher.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_ACCESS_LOGGER_CLASS.get(
- className,
- config.dn().toString(),
- String.valueOf(e));
- unacceptableReasons.add(message);
- return false;
- }
- }
-
- private AccessLogPublisher<?> getAccessPublisher(AccessLogPublisherCfg config)
- throws ConfigException {
- String className = config.getJavaClass();
- AccessLogPublisherCfgDefn d = AccessLogPublisherCfgDefn.getInstance();
- ClassPropertyDefinition pd =
- d.getJavaClassPropertyDefinition();
- try {
- // Load the class and cast it to a AccessLogPublisher.
- AccessLogPublisher<AccessLogPublisherCfg> accessLogPublisher =
- pd.loadClass(className, AccessLogPublisher.class).newInstance();
- accessLogPublisher.initializeLogPublisher(config);
- // The access publisher has been successfully initialized.
- return accessLogPublisher;
- }
- catch (Exception e)
- {
- Message message = ERR_CONFIG_LOGGER_INVALID_ACCESS_LOGGER_CLASS.get(
- className, config.dn().toString(), String.valueOf(e));
- throw new ConfigException(message, e);
- }
- }
-
-
-
/**
* Writes a message to the access logger with information about a new client
@@ -396,7 +143,7 @@
*/
public static void logConnect(ClientConnection clientConnection)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logConnect(clientConnection);
}
@@ -418,7 +165,7 @@
DisconnectReason disconnectReason,
Message message)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logDisconnect(clientConnection, disconnectReason, message);
}
@@ -435,7 +182,7 @@
*/
public static void logAbandonRequest(AbandonOperation abandonOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logAbandonRequest(abandonOperation);
}
@@ -452,7 +199,7 @@
*/
public static void logAbandonResult(AbandonOperation abandonOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logAbandonResult(abandonOperation);
}
@@ -469,7 +216,7 @@
*/
public static void logAddRequest(AddOperation addOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logAddRequest(addOperation);
}
@@ -486,7 +233,7 @@
*/
public static void logAddResponse(AddOperation addOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logAddResponse(addOperation);
}
@@ -503,7 +250,7 @@
*/
public static void logBindRequest(BindOperation bindOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logBindRequest(bindOperation);
}
@@ -520,7 +267,7 @@
*/
public static void logBindResponse(BindOperation bindOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logBindResponse(bindOperation);
}
@@ -537,7 +284,7 @@
*/
public static void logCompareRequest(CompareOperation compareOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logCompareRequest(compareOperation);
}
@@ -554,7 +301,7 @@
*/
public static void logCompareResponse(CompareOperation compareOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logCompareResponse(compareOperation);
}
@@ -571,7 +318,7 @@
*/
public static void logDeleteRequest(DeleteOperation deleteOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logDeleteRequest(deleteOperation);
}
@@ -588,7 +335,7 @@
*/
public static void logDeleteResponse(DeleteOperation deleteOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logDeleteResponse(deleteOperation);
}
@@ -605,7 +352,7 @@
*/
public static void logExtendedRequest(ExtendedOperation extendedOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logExtendedRequest(extendedOperation);
}
@@ -622,7 +369,7 @@
*/
public static void logExtendedResponse(ExtendedOperation extendedOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logExtendedResponse(extendedOperation);
}
@@ -639,7 +386,7 @@
*/
public static void logModifyRequest(ModifyOperation modifyOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logModifyRequest(modifyOperation);
}
@@ -656,7 +403,7 @@
*/
public static void logModifyResponse(ModifyOperation modifyOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logModifyResponse(modifyOperation);
}
@@ -673,7 +420,7 @@
*/
public static void logModifyDNRequest(ModifyDNOperation modifyDNOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logModifyDNRequest(modifyDNOperation);
}
@@ -691,7 +438,7 @@
*/
public static void logModifyDNResponse(ModifyDNOperation modifyDNOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logModifyDNResponse(modifyDNOperation);
}
@@ -708,7 +455,7 @@
*/
public static void logSearchRequest(SearchOperation searchOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logSearchRequest(searchOperation);
}
@@ -728,7 +475,7 @@
public static void logSearchResultEntry(SearchOperation searchOperation,
SearchResultEntry searchEntry)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logSearchResultEntry(searchOperation, searchEntry);
}
@@ -747,7 +494,7 @@
public static void logSearchResultReference(SearchOperation searchOperation,
SearchResultReference searchReference)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logSearchResultReference(searchOperation, searchReference);
}
@@ -764,7 +511,7 @@
*/
public static void logSearchResultDone(SearchOperation searchOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logSearchResultDone(searchOperation);
}
@@ -781,7 +528,7 @@
*/
public static void logUnbind(UnbindOperation unbindOperation)
{
- for (AccessLogPublisher<?> publisher : accessPublishers)
+ for (AccessLogPublisher<?> publisher : getAccessLogPublishers())
{
publisher.logUnbind(unbindOperation);
}
--
Gitblit v1.10.0