#region Apache License // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to you under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #endregion using System; using System.Collections; using log4net.Util; using log4net.Repository; namespace log4net.Plugin { /// /// Map of repository plugins. /// /// /// /// This class is a name keyed map of the plugins that are /// attached to a repository. /// /// /// Nicko Cadell /// Gert Driesen public sealed class PluginMap { #region Public Instance Constructors /// /// Constructor /// /// The repository that the plugins should be attached to. /// /// /// Initialize a new instance of the class with a /// repository that the plugins should be attached to. /// /// public PluginMap(ILoggerRepository repository) { m_repository = repository; } #endregion Public Instance Constructors #region Public Instance Properties /// /// Gets a by name. /// /// The name of the to lookup. /// /// The from the map with the name specified, or /// null if no plugin is found. /// /// /// /// Lookup a plugin by name. If the plugin is not found null /// will be returned. /// /// public IPlugin this[string name] { get { if (name == null) { throw new ArgumentNullException("name"); } lock(this) { return (IPlugin)m_mapName2Plugin[name]; } } } /// /// Gets all possible plugins as a list of objects. /// /// All possible plugins as a list of objects. /// /// /// Get a collection of all the plugins defined in this map. /// /// public PluginCollection AllPlugins { get { lock(this) { return new PluginCollection(m_mapName2Plugin.Values); } } } #endregion Public Instance Properties #region Public Instance Methods /// /// Adds a to the map. /// /// The to add to the map. /// /// /// The will be attached to the repository when added. /// /// /// If there already exists a plugin with the same name /// attached to the repository then the old plugin will /// be and replaced with /// the new plugin. /// /// public void Add(IPlugin plugin) { if (plugin == null) { throw new ArgumentNullException("plugin"); } IPlugin curPlugin = null; lock(this) { // Get the current plugin if it exists curPlugin = m_mapName2Plugin[plugin.Name] as IPlugin; // Store new plugin m_mapName2Plugin[plugin.Name] = plugin; } // Shutdown existing plugin with same name if (curPlugin != null) { curPlugin.Shutdown(); } // Attach new plugin to repository plugin.Attach(m_repository); } /// /// Removes a from the map. /// /// The to remove from the map. /// /// /// Remove a specific plugin from this map. /// /// public void Remove(IPlugin plugin) { if (plugin == null) { throw new ArgumentNullException("plugin"); } lock(this) { m_mapName2Plugin.Remove(plugin.Name); } } #endregion Public Instance Methods #region Private Instance Fields private readonly Hashtable m_mapName2Plugin = new Hashtable(); private readonly ILoggerRepository m_repository; #endregion Private Instance Fields } }