namespace dotless.Core.Plugins
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.IO;
using System.ComponentModel;
public static class PluginFinder
{
///
/// Gets a plugins name
///
public static string GetName(this IPlugin plugin)
{
return GetName(plugin.GetType());
}
///
/// Gets a plugins description
///
public static string GetDescription(this IPlugin plugin)
{
return GetName(plugin.GetType());
}
///
/// Gets a plugins description from its type
///
public static string GetDescription(Type pluginType)
{
DescriptionAttribute description = pluginType
.GetCustomAttributes(typeof(DescriptionAttribute), true)
.FirstOrDefault() as DescriptionAttribute;
if (description != null)
return description.Description;
else
return "No Description";
}
///
/// Gets a plugins name from its type
///
public static string GetName(Type pluginType)
{
DisplayNameAttribute name = pluginType
.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.FirstOrDefault() as DisplayNameAttribute;
if (name != null)
return name.DisplayName;
else
return pluginType.Name;
}
///
/// Gets plugin configurators for all plugins, optionally scanning referenced assemblies and
/// a plugins folder underneath the executing assembly
///
/// Look for a plugins folder and if exists, load plugins from it
///
public static IEnumerable GetConfigurators(bool scanPluginsFolder)
{
List> pluginConfigurators = new List>();
pluginConfigurators.Add(GetConfigurators(Assembly.GetAssembly(typeof(PluginFinder))));
if (scanPluginsFolder)
{
string assemblyLocation = Assembly.GetEntryAssembly().Location;
string pluginsFolder = Path.Combine(Path.GetDirectoryName(assemblyLocation), "plugins");
if (Directory.Exists(pluginsFolder))
{
DirectoryInfo pluginsFolderDirectoryInfo = new DirectoryInfo(pluginsFolder);
foreach(FileInfo pluginAssembly in pluginsFolderDirectoryInfo.GetFiles("*.dll"))
{
pluginConfigurators.Add(GetConfigurators(Assembly.LoadFile(pluginAssembly.FullName)));
}
}
}
return pluginConfigurators.Aggregate((group1, group2) => group1.Union(group2));
}
///
/// Gets plugin configurators for every plugin in an assembly
///
///
///
public static IEnumerable GetConfigurators(Assembly assembly)
{
IEnumerable types = assembly.GetTypes().Where(
type => !type.IsAbstract && !type.IsGenericType && !type.IsInterface);
IEnumerable pluginConfigurators = types
.Where(type => typeof(IPluginConfigurator).IsAssignableFrom(type))
.Select(type => (IPluginConfigurator)type.GetConstructor(new Type[] {}).Invoke(new object[]{}));
IEnumerable pluginsConfigurated = pluginConfigurators.Select(pluginConfigurator => pluginConfigurator.Configurates);
Type genericPluginConfiguratorType = typeof(GenericPluginConfigurator<>);
IEnumerable plugins = types
.Where(type => typeof(IPlugin).IsAssignableFrom(type))
.Where(type => !pluginsConfigurated.Contains(type))
.Select(type => (IPluginConfigurator)Activator.CreateInstance(genericPluginConfiguratorType.MakeGenericType(type)));
return plugins.Union(pluginConfigurators);
}
}
}