mwomack 2002/12/10 23:25:14
Added: src/java/org/apache/log4j/plugins Receiver.java
PluginSkeleton.java PluginRegistry.java Plugin.java
Log:
Moved from o.a.log4j to o.a.log4j.plugins package.
Fixed bug in PluginRegistry where stopped plugin was not removed from plugin map.
Revision Changes Path
1.1 jakarta-log4j/src/java/org/apache/log4j/plugins/Receiver.java
Index: Receiver.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file. */
package org.apache.log4j.plugins;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
/**
Defines the base class for Receiver plugins.
<p>Just as Appenders send logging events outside of the log4j
environment (to files, to smtp, to sockets, etc), Receivers bring
logging events inside the log4j environment.
<p>Receivers are primarily meant to support the receiving of
remote logging events from another process. For example,
SocketAppender "appends" a logging event to a socket, configured
for a specific host and port number. On the receiving side of
the socket can be a SocketReceiver object. The SocketReceiver
object receives the logging event, and then "posts" it to the
log4j environment (LoggerRepository) on the receiving machine, to
be handled by the configured appenders, etc. The various
settings in this environment (Logger levels, Appender filters &
thresholds) are applied to the received logging event.
<p>Receivers can also be used to "import" log messages from other
logging packages into the log4j environment.
<p>Receivers can be configured to post events to a given
LoggerRepository. If a repository is not specified, then the
default repository value returned by
LogManager.getLoggerRepository() should be used.
<p>Subclasses of Receiver must implement the isActive(),
activateOptions(), and shutdown() methods. The doPost() method
is provided to standardize the "import" of remote events into
the repository.
@author Mark Womack
@since 1.3
*/
public abstract class Receiver extends PluginSkeleton {
/**
Posts the logging event to a logger in the configured logger
repository. */
public void doPost(LoggingEvent event) {
// get the "local" logger for this event from the
// configured repository.
Logger localLogger =
getLoggerRepository().getLogger(event.getLoggerName());
// if the logger level is greater or equal to the level
// of the event, use the logger to append the event.
if(event.getLevel().isGreaterOrEqual(localLogger.getEffectiveLevel())) {
// set the logger for the event
// event.logger = localLogger;
// call the loggers appenders to process the event
localLogger.callAppenders(event);
}
}
}
1.1
jakarta-log4j/src/java/org/apache/log4j/plugins/PluginSkeleton.java
Index: PluginSkeleton.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file. */
package org.apache.log4j.plugins;
import org.apache.log4j.LogManager;
import org.apache.log4j.spi.LoggerRepository;
/**
A convienent abstract class for receiver classes that implements
the basic methods of the Plugin interface. Subclasses are required
to implement the isActive(), activateOptions(), and shutdown()
methods.
<p>Developers are not required to subclass PluginSkeleton to
develop their own plugins (they are only required to implement the
Plugin interface), but it provides a convienent base class to start
from.
Contributors: Nicko Cadell
@author Mark Womack
@since 1.3
*/
public abstract class PluginSkeleton implements Plugin {
protected String name = "";
protected LoggerRepository repository;
/**
Gets the name of the plugin. */
public String getName() {
return name;
}
/**
Sets the name of the plugin. */
public void setName(String _name) {
name = _name;
}
/**
Gets the logger repository for this plugin. If not
explicity set, returns the value of
LogManager.getLoggerRepository(). */
public LoggerRepository getLoggerRepository() {
if (repository != null) {
return repository;
} else {
return LogManager.getLoggerRepository();
}
}
/**
Sets the logger repository used by this plugin. This
repository will be used by the plugin functionality. */
public void setLoggerRepository(LoggerRepository _repository) {
repository = _repository;
}
}
1.1
jakarta-log4j/src/java/org/apache/log4j/plugins/PluginRegistry.java
Index: PluginRegistry.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file. */
package org.apache.log4j.plugins;
import java.util.Hashtable;
import java.util.Enumeration;
import org.apache.log4j.LogManager;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.LoggerRepositoryEventListener;
/**
This is a registry for Plugin instances. It provides methods to
start and stop plugin objects individually and to stop all
plugins for a repository.
@author Mark Womack
@since 1.3
*/
public class PluginRegistry {
private static Hashtable repositoryMap = new Hashtable();
private static RepositoryListener listener = new RepositoryListener();
/**
Starts a Plugin with default logger repository. */
public static Plugin startPlugin(Plugin plugin) {
return startPlugin(plugin, LogManager.getLoggerRepository());
}
/**
Starts a plugin with a given logger repository. */
public static Plugin startPlugin(Plugin plugin,
LoggerRepository repository) {
// make sure the plugin has reference to repository
plugin.setLoggerRepository(repository);
// put plugin into the repository's reciever map
synchronized(repositoryMap) {
// get plugin map for repository
Hashtable pluginMap = (Hashtable)repositoryMap.get(repository);
// if the plugin map does not exist, create one
if (pluginMap == null) {
pluginMap = new Hashtable();
repositoryMap.put(repository, pluginMap);
repository.addLoggerRepositoryEventListener(listener);
}
// existing plugin exists with the
String name = plugin.getName();
if (name == null) {
name = "";
}
Plugin existingPlugin = (Plugin)pluginMap.get(name);
if (existingPlugin != null) {
boolean isEqual = existingPlugin.equals(plugin);
// if the plugins are equivalent and the existing one
// is still active, just return the existing one now
if (isEqual && existingPlugin.isActive()) {
return existingPlugin;
} else {
existingPlugin.shutdown();
}
}
// put the new plugin into the map
pluginMap.put(name, plugin);
// start the new plugin
plugin.activateOptions();
return plugin;
}
}
/**
Stops a plugin in the default logger repository. */
public static Plugin stopPlugin(Plugin plugin) {
return stopPlugin(plugin.getName(),
LogManager.getLoggerRepository());
}
/**
Stops a plugin in the default logger repository. */
public static Plugin stopPlugin(String pluginName) {
return stopPlugin(pluginName,
LogManager.getLoggerRepository());
}
/**
Stops a plugin in the given logger repository. */
public static Plugin stopPlugin(Plugin plugin,
LoggerRepository repository) {
return stopPlugin(plugin.getName(), repository);
}
/**
Stops a plugin in the given logger repository. */
public static Plugin stopPlugin(String pluginName,
LoggerRepository repository) {
if (pluginName == null) {
pluginName = "";
}
synchronized(repositoryMap) {
Hashtable pluginMap = (Hashtable)repositoryMap.get(repository);
if (pluginMap == null)
return null;
Plugin plugin = (Plugin)pluginMap.get(pluginName);
if (plugin == null)
return null;
// shutdown the plugin
plugin.shutdown();
// remove it from the plugin map
pluginMap.remove(pluginName);
// if no more plugins, remove the plugin map from
// repository map
if (pluginMap.isEmpty()) {
repository.removeLoggerRepositoryEventListener(listener);
repositoryMap.remove(repository);
}
// return it for future use
return plugin;
}
}
/**
Stops all plugins in the default logger repository. */
public static void stopAllPlugins() {
stopAllPlugins(LogManager.getLoggerRepository());
}
/**
Stops all plugins in the given logger repository. */
public static void stopAllPlugins(LoggerRepository repository) {
synchronized(repositoryMap) {
Hashtable pluginMap = (Hashtable)repositoryMap.get(repository);
if (pluginMap == null)
return;
// remove the listener for this repository
repository.removeLoggerRepositoryEventListener(listener);
Enumeration enum = pluginMap.elements();
while(enum.hasMoreElements()) {
Plugin plugin = (Plugin)enum.nextElement();
plugin.shutdown();
}
// since no more plugins, remove plugin map from
// the repository
repositoryMap.remove(repository);
}
}
/**
Internal class used to handle listener events from repositories. */
private static class RepositoryListener
implements LoggerRepositoryEventListener {
/**
Stops all plugins associated with the repository being reset. */
public void configurationResetEvent(LoggerRepository repository) {
PluginRegistry.stopAllPlugins(repository);
}
/**
Called when the repository configuration is changed. */
public void configurationChangedEvent(LoggerRepository repository) {
// do nothing with this event
}
/**
Stops all plugins associated with the repository being shutdown. */
public void shutdownEvent(LoggerRepository repository) {
PluginRegistry.stopAllPlugins(repository);
}
}
}
1.1 jakarta-log4j/src/java/org/apache/log4j/plugins/Plugin.java
Index: Plugin.java
===================================================================
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software
* License version 1.1, a copy of which has been included with this
* distribution in the LICENSE.txt file. */
package org.apache.log4j.plugins;
import org.apache.log4j.spi.LoggerRepository;
import org.apache.log4j.spi.OptionHandler;
/**
Defines the required interface for all Plugin objects.
<p>A plugin implements some specific functionality to extend
the log4j framework. Each plugin is associated with a specific
LoggerRepository, which it then uses/acts upon. If no
repository is specified, the default repository from
LogManager.getLoggerRepository() is used.
<p>Examples of plugins are Receiver and Watchdog. Receiver plugins
allow for remote logging events to be received and processed by
a repository as if the event was sent locally. Watchdog plugins
allow for a repository to be reconfigured when some "watched"
configuration data changes.
@author Mark Womack
@author Nicko Cadell
@since 1.3
*/
public interface Plugin extends OptionHandler {
/**
Gets the name of the plugin. */
public String getName();
/**
Sets the name of the plugin. */
public void setName(String _name);
/**
Gets the logger repository for this plugin. If not
explicity set, returns the value of
LogManager.getLoggerRepository(). */
public LoggerRepository getLoggerRepository();
/**
Sets the logger repository used by this plugin. This
repository will be used by the plugin functionality. */
public void setLoggerRepository(LoggerRepository _repository);
/**
True if the plugin is active and running. */
public boolean isActive();
/**
Call when the plugin should be stopped. */
public void shutdown();
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>