/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2006-2008 Sun Microsystems, Inc. * Portions copyright 2011-2013 ForgeRock AS. */ package org.opends.server.loggers; import static org.opends.messages.ConfigMessages.*; import static org.opends.server.util.StaticUtils.*; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.opends.messages.Message; import org.opends.messages.MessageDescriptor.Arg3; 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.server.LogPublisherCfg; import org.opends.server.api.LogPublisher; import org.opends.server.config.ConfigException; import org.opends.server.core.DirectoryServer; import org.opends.server.loggers.debug.DebugLogger; 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; import org.opends.server.util.StaticUtils; /** * This class defines the wrapper that will invoke all registered loggers for * each type of request received or response sent. If no log publishers are * registered, messages will be directed to standard out. * * @param
* The type of the LogPublisher corresponding to this logger
* @param , C extends LogPublisherCfg>
implements ConfigurationAddListener
* The concrete {@link LogPublisher} type
* @param ,
C extends LogPublisherCfg>
{
/**
* Defined as public to allow subclasses of {@link AbstractLogger} to
* instantiate it.
*/
public LoggerStorage()
{
super();
}
/**
* The set of loggers that have been registered with the server. It will
* initially be empty.
*/
private Collection logPublishers = new CopyOnWriteArrayList ();
/**
* Add a log publisher to the logger.
*
* @param publisher
* The log publisher to add.
*/
public synchronized void addLogPublisher(P publisher)
{
logPublishers.add(publisher);
}
/**
* Remove a log publisher from the logger.
*
* @param publisher
* The log publisher to remove.
* @return True if the log publisher is removed or false otherwise.
*/
public synchronized boolean removeLogPublisher(P publisher)
{
boolean removed = logPublishers.remove(publisher);
if (removed)
{
publisher.close();
}
return removed;
}
/**
* Removes all existing log publishers from the logger.
*/
public synchronized void removeAllLogPublishers()
{
StaticUtils.close((Collection) logPublishers);
logPublishers.clear();
}
/**
* Returns the logPublishers.
*
* @return the collection of {@link LogPublisher}s
*/
public Collection getLogPublishers()
{
return logPublishers;
}
}
/**
* Returns the logger storage for the current logger.
*
* @return the logger storage for the current logger
*/
protected abstract LoggerStorage getStorage();
/**
* Returns the java {@link ClassPropertyDefinition} for the current logger.
*
* @return the java {@link ClassPropertyDefinition} for the current logger.
*/
protected abstract ClassPropertyDefinition getJavaClassPropertyDefinition();
private final Class logPublisherClass;
private final Arg3 logPublisherClass,
final Arg3 logPublishers = getStorage().getLogPublishers();
for (P publisher : logPublishers)
{
if (publisher.getDN().equals(dn))
{
return publisher;
}
}
return null;
}
/**
* {@inheritDoc}
*/
@Override
public ConfigChangeResult applyConfigurationChange(C config)
{
// Default result code.
ResultCode resultCode = ResultCode.SUCCESS;
boolean adminActionRequired = false;
ArrayList