mwomack 2002/09/19 22:30:01 Added: src/java/org/apache/log4j PluginSkeleton.java PluginRegistry.java Plugin.java Log: Checkin of Plugin design/implementation. Plugins can be used to generically extend functionality of log4j. Each plugin is attached to specific LoggerRepository to affect/act upon. Revision Changes Path 1.1 jakarta-log4j/src/java/org/apache/log4j/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; import java.util.Vector; import org.apache.log4j.spi.LoggingEvent; 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/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; import java.util.Hashtable; import java.util.Enumeration; import org.apache.log4j.spi.LoggerRepository; /** 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(); /** 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); } // existing plugin exists with the Plugin existingPlugin = (Plugin)pluginMap.get(plugin.getName()); 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(plugin.getName(), 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) { 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(plugin); // if no more plugins, remove the plugin map from // repository map if (pluginMap.isEmpty()) 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; 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); } } } 1.1 jakarta-log4j/src/java/org/apache/log4j/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; import org.apache.log4j.spi.LoggingEvent; 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. <p>Contributors: Nicko Cadell @author Mark Womack @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]>