public void AddTrigger(EventOperation operation, ExecutionStage stage, PluginTrigger trigger, Dictionary <EventOperation, Dictionary <ExecutionStage, List <PluginTrigger> > > register) { if (!register.ContainsKey(operation)) { register.Add(operation, new Dictionary <ExecutionStage, List <PluginTrigger> >()); } if (!register[operation].ContainsKey(stage)) { register[operation].Add(stage, new List <PluginTrigger>()); } register[operation][stage].Add(trigger); }
private void RegisterPlugin(Type basePluginType, Dictionary <string, EntityMetadata> metadata, List <MetaPlugin> plugins, Dictionary <EventOperation, Dictionary <ExecutionStage, List <PluginTrigger> > > register) { var plugin = Activator.CreateInstance(basePluginType); Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >(); if (basePluginType.GetMethod("PluginProcessingStepConfigs") != null) { // Matches DAXIF plugin registration stepConfigs.AddRange( basePluginType .GetMethod("PluginProcessingStepConfigs") .Invoke(plugin, new object[] { }) as IEnumerable <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } else { // Retrieve registration from CRM metadata var metaSteps = plugins.Where(x => x.AssemblyName == basePluginType.FullName).ToList(); if (metaSteps == null || metaSteps.Count == 0) { throw new MockupException($"Unknown plugin '{basePluginType.FullName}', please use DAXIF registration or make sure the plugin is uploaded to CRM."); } foreach (var metaStep in metaSteps) { var stepConfig = new StepConfig(metaStep.AssemblyName, metaStep.Stage, metaStep.MessageName, metaStep.PrimaryEntity); var extendedConfig = new ExtendedStepConfig(0, metaStep.Mode, metaStep.Name, metaStep.Rank, metaStep.FilteredAttributes, Guid.Empty.ToString()); var imageTuple = metaStep.Images?.Select(x => new ImageTuple(x.Name, x.EntityAlias, x.ImageType, x.Attributes)).ToList() ?? new List <ImageTuple>(); stepConfigs.Add(new Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> >(stepConfig, extendedConfig, imageTuple)); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } } // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var operation = (EventOperation)Enum.Parse(typeof(EventOperation), stepConfig.Item1.Item3); var stage = (ExecutionStage)stepConfig.Item1.Item2; var trigger = new PluginTrigger(operation, stage, pluginExecute, stepConfig, metadata); AddTrigger(operation, stage, trigger, register); } }
private void RegisterSystemPlugins(Dictionary <string, Dictionary <ExecutionStage, List <PluginTrigger> > > register, Dictionary <string, EntityMetadata> metadata) { Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <PluginStepConfig>(); foreach (var plugin in systemPlugins) { stepConfigs.AddRange(plugin.PluginProcessingStepConfigs()); pluginExecute = (provider) => plugin.Execute(provider); // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var stage = (ExecutionStage)stepConfig.StepConfig.ExecutionStage; var trigger = new PluginTrigger(stepConfig.StepConfig.EventOperation, stage, pluginExecute, stepConfig, metadata); AddTrigger(stepConfig.StepConfig.EventOperation, stage, trigger, register); } } SortAllLists(register); }
private void RegisterSystemPlugins(Dictionary <EventOperation, Dictionary <ExecutionStage, List <PluginTrigger> > > register, Dictionary <string, EntityMetadata> metadata) { Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >(); foreach (var plugin in systemPlugins) { stepConfigs.AddRange(plugin.PluginProcessingStepConfigs()); pluginExecute = (provider) => plugin.Execute(provider); // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var operation = (EventOperation)Enum.Parse(typeof(EventOperation), stepConfig.Item1.Item3); var stage = (ExecutionStage)stepConfig.Item1.Item2; var trigger = new PluginTrigger(operation, stage, pluginExecute, stepConfig, metadata); AddTrigger(operation, stage, trigger, register); } } SortAllLists(register); }
private void RegisterPlugin(Type basePluginType, Dictionary <string, EntityMetadata> metadata, List <MetaPlugin> plugins, Dictionary <string, Dictionary <ExecutionStage, List <PluginTrigger> > > register) { object plugin = null; try { plugin = Activator.CreateInstance(basePluginType); } catch (Exception ex) { if (!ex.Message.StartsWith("No parameterless constructor")) { throw; } } if (plugin == null) { return; } Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <PluginStepConfig>(); if (basePluginType.GetMethod("PluginProcessingStepConfigs") != null) { // Matches DAXIF plugin registration stepConfigs.AddRange( basePluginType .GetMethod("PluginProcessingStepConfigs") .Invoke(plugin, new object[] { }) as IEnumerable <PluginStepConfig>); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } else { // Retrieve registration from CRM metadata var pluginFullName = basePluginType.FullName; var metaSteps1 = plugins.Where(x => string.IsNullOrEmpty(x.PluginTypeAssemblyName)) .Where(x => x.AssemblyName == basePluginType.FullName) .ToList(); var metaSteps2 = plugins.Where(x => !string.IsNullOrEmpty(x.PluginTypeAssemblyName)) .Where(x => x.AssemblyName == basePluginType.FullName) .Where(x => x.PluginTypeAssemblyName == basePluginType.GetTypeInfo().Assembly.GetName().Name) .ToList(); var metaSteps = metaSteps1.Union(metaSteps2).ToList(); if (metaSteps == null || metaSteps.Count == 0) { throw new MockupException($"Unknown plugin '{basePluginType.FullName}', please use DAXIF registration or make sure the plugin is uploaded to CRM."); } foreach (var metaStep in metaSteps) { var stepConfig = new StepConfig(metaStep.AssemblyName, metaStep.Stage, metaStep.MessageName, metaStep.PrimaryEntity); var extendedConfig = new ExtendedStepConfig(0, metaStep.Mode, metaStep.Name, metaStep.Rank, metaStep.FilteredAttributes, metaStep.ImpersonatingUserId); var imageConfig = metaStep.Images?.Select(x => new ImageConfig(x.Name, x.EntityAlias, x.ImageType, x.Attributes)).ToList() ?? new List <ImageConfig>(); stepConfigs.Add(new PluginStepConfig(stepConfig, extendedConfig, imageConfig)); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; if (metaStep.MessageName.ToLower() == "setstatedynamicentity") { var stepConfig2 = new StepConfig(metaStep.AssemblyName, metaStep.Stage, "setstate", metaStep.PrimaryEntity); stepConfigs.Add(new PluginStepConfig(stepConfig2, extendedConfig, imageConfig)); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } } } // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var stage = (ExecutionStage)stepConfig.StepConfig.ExecutionStage; var trigger = new PluginTrigger(stepConfig.StepConfig.EventOperation, stage, pluginExecute, stepConfig, metadata); AddTrigger(stepConfig.StepConfig.EventOperation, stage, trigger, register); } }
public PluginManager(IEnumerable <Type> basePluginTypes, Dictionary <string, EntityMetadata> metadata, List <MetaPlugin> plugins) { registeredPlugins = new Dictionary <EventOperation, Dictionary <ExecutionStage, List <PluginTrigger> > >(); foreach (var basePluginType in basePluginTypes) { if (basePluginType == null) { continue; } Assembly proxyTypeAssembly = basePluginType.Assembly; foreach (var type in proxyTypeAssembly.GetLoadableTypes()) { if (type.BaseType != basePluginType) { continue; } var plugin = Activator.CreateInstance(type); Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >(); if (basePluginType.GetMethod("PluginProcessingStepConfigs") != null) // Matches DAXIF plugin registration { stepConfigs.AddRange( basePluginType .GetMethod("PluginProcessingStepConfigs") .Invoke(plugin, new object[] { }) as IEnumerable <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } else // Retrieve registration from CRM metadata { var metaPlugin = plugins.FirstOrDefault(x => x.AssemblyName == type.FullName); if (metaPlugin == null) { throw new MockupException($"Unknown plugin '{type.FullName}', please use DAXIF registration or make sure the plugin is uploaded to CRM."); } var stepConfig = new StepConfig(metaPlugin.AssemblyName, metaPlugin.Stage, metaPlugin.MessageName, metaPlugin.PrimaryEntity); var extendedConfig = new ExtendedStepConfig(0, metaPlugin.Mode, metaPlugin.Name, metaPlugin.Rank, metaPlugin.FilteredAttributes, Guid.Empty.ToString()); var imageTuple = new List <ImageTuple>(); stepConfigs.Add(new Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> >(stepConfig, extendedConfig, imageTuple)); pluginExecute = (provider) => { type .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var operation = (EventOperation)Enum.Parse(typeof(EventOperation), stepConfig.Item1.Item3); var stage = (ExecutionStage)stepConfig.Item1.Item2; var trigger = new PluginTrigger(operation, stage, pluginExecute, stepConfig, metadata); AddTrigger(operation, stage, trigger); } } } SortAllLists(); }
private void RegisterPlugin(Type basePluginType, Dictionary <string, EntityMetadata> metadata, List <MetaPlugin> plugins, Dictionary <string, Dictionary <ExecutionStage, List <PluginTrigger> > > register) { object plugin = null; try { plugin = Activator.CreateInstance(basePluginType); } catch (Exception ex) { if (!ex.Message.StartsWith("No parameterless constructor")) { throw; } } if (plugin == null) { return; } Action <MockupServiceProviderAndFactory> pluginExecute = null; var stepConfigs = new List <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >(); if (basePluginType.GetMethod("PluginProcessingStepConfigs") != null) { // Matches DAXIF plugin registration var configs = basePluginType .GetMethod("PluginProcessingStepConfigs") .Invoke(plugin, new object[] { }) as IEnumerable <Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> > >; stepConfigs.AddRange(configs); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } else { // Retrieve registration from CRM metadata var metaSteps = plugins .Where(x => x.AssemblyName == basePluginType.FullName && x.PluginTypeAssemblyName == basePluginType.Assembly.GetName().Name) .ToList(); // fallback for backwards compatability for old Metadata files if (metaSteps == null || metaSteps.Count == 0) { metaSteps = plugins .Where(x => x.AssemblyName == basePluginType.FullName) .ToList(); } if (metaSteps == null || metaSteps.Count == 0) { throw new MockupException($"Unknown plugin '{basePluginType.FullName}', please use DAXIF registration or make sure the plugin is uploaded to CRM."); } foreach (var metaStep in metaSteps) { var stepConfig = new StepConfig(metaStep.AssemblyName, metaStep.Stage, metaStep.MessageName, metaStep.PrimaryEntity); var extendedConfig = new ExtendedStepConfig(0, metaStep.Mode, metaStep.Name, metaStep.Rank, metaStep.FilteredAttributes, metaStep.ImpersonatingUserId); var imageTuple = metaStep.Images?.Select(x => new ImageTuple(x.Name, x.EntityAlias, x.ImageType, x.Attributes)).ToList() ?? new List <ImageTuple>(); stepConfigs.Add(new Tuple <StepConfig, ExtendedStepConfig, IEnumerable <ImageTuple> >(stepConfig, extendedConfig, imageTuple)); pluginExecute = (provider) => { basePluginType .GetMethod("Execute") .Invoke(plugin, new object[] { provider }); }; } } // Add discovered plugin triggers foreach (var stepConfig in stepConfigs) { var stage = (ExecutionStage)stepConfig.Item1.Item2; var trigger = new PluginTrigger(stepConfig.Item1.Item3, stage, pluginExecute, stepConfig, metadata); AddTrigger(stepConfig.Item1.Item3.ToLower(), stage, trigger, register); } }