Beispiel #1
0
 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);
 }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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();
        }
Beispiel #7
0
        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);
            }
        }