Exemplo n.º 1
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);
            }
        }
Exemplo n.º 2
0
        protected PluginStepConfig RegisterPluginStep <T>(EventOperation eventOperation, ExecutionStage executionStage, Action <LocalPluginContext> action) where T : Entity
        {
            var e = Activator.CreateInstance <T>();
            //TypedPluginStepConfig stepConfig = new TypedPluginStepConfig(eventOperation, executionStage, (e as Entity).LogicalName);
            var config   = new StepConfig((e as Entity).LogicalName, (int)executionStage, Enum.GetName(typeof(EventOperation), eventOperation), (e as Entity).LogicalName);
            var extended = new ExtendedStepConfig((int)Deployment.ServerOnly, (int)ExecutionMode.Synchronous, (e as Entity).LogicalName, 1, "", null);

            var pluginStepConfig = new PluginStepConfig(config, extended, new List <ImageConfig>());

            this.PluginStepConfigs.Add(pluginStepConfig);

            this.RegisteredEvents.Add(
                new Tuple <int, string, string, Action <LocalPluginContext> >(
                    config.ExecutionStage,
                    config.EventOperation,
                    config.LogicalName,
                    new Action <LocalPluginContext>(action)));

            return(pluginStepConfig);
        }
Exemplo n.º 3
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);
            }
        }
Exemplo n.º 4
0
        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();
        }
Exemplo n.º 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 <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);
            }
        }