using System; using System.Collections.Generic; using System.Linq; using Core.Common.Base.Workflow; using Core.Common.Utils.Reflection; namespace Core.Common.Base { public class ApplicationCore : IDisposable { private readonly ActivityRunner activityRunner; private readonly List plugins; public ApplicationCore() { plugins = new List(); activityRunner = new ActivityRunner(); if (RunningActivityLogAppender.Instance != null) { RunningActivityLogAppender.Instance.ActivityRunner = ActivityRunner; } } public IActivityRunner ActivityRunner { get { return activityRunner; } } public void AddPlugin(ApplicationPlugin applicationPlugin) { plugins.Add(applicationPlugin); applicationPlugin.Activate(); } public void RemovePlugin(ApplicationPlugin applicationPlugin) { plugins.Remove(applicationPlugin); applicationPlugin.Deactivate(); } public virtual void Dispose() { foreach (var plugin in plugins.ToList()) { RemovePlugin(plugin); } if (RunningActivityLogAppender.Instance != null) { RunningActivityLogAppender.Instance.ActivityRunner = null; } } public IEnumerable GetSupportedFileImporters(object target) { if (target == null) { return Enumerable.Empty(); } var targetType = target.GetType(); return plugins.SelectMany(plugin => plugin.GetFileImporters()) .Where(fileImporter => fileImporter.SupportedItemTypes.Any(t => t == targetType || targetType.Implements(t)) && fileImporter.CanImportOn(target)); } public IEnumerable GetSupportedFileExporters(object source) { if (source == null) { return Enumerable.Empty(); } var sourceType = source.GetType(); return plugins.SelectMany(plugin => plugin.GetFileExporters()) .Where(fileExporter => fileExporter.SourceTypes().Any(t => t == sourceType || sourceType.Implements(t)) && fileExporter.CanExportFor(source)); } public IEnumerable GetSupportedDataItemInfos(object target) { if (target == null) { return Enumerable.Empty(); } return plugins.SelectMany(p => p.GetDataItemInfos()) .Where(dataItemInfo => dataItemInfo.AdditionalOwnerCheck == null || dataItemInfo.AdditionalOwnerCheck(target)); } } }