#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
}
}