Пример #1
0
            private void AddIfConsistent(Type type, System.Reflection.MethodInfo method, List <PluginMethod> results, PluginMethod result, string message, int stage)
            {
                #region validate pre and post image consistancy
                switch (stage)
                {
                case 10:
                case 20:
                    /* pre image pre event */
                    if (result.HasPreimage() && message == "Create")
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Preimage", stage, message);
                    }
                    /* post image pre event */
                    if (result.HasPostimage())
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Postimage", stage, message);
                    }
                    break;

                case 40:
                case 41:
                    if (result.HasPostimage() && message == "Delete")
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Postimage", stage, message);
                    }
                    break;
                }
                #endregion

                #region validate target consistancy
                if (result.HasTargetBesideReference() && message == "Delete")
                {
                    throw new Exceptions.UnavailableImageException(type, method, "Target", stage, message);
                }

                if (result.HasTargetReference())
                {
                    var inError = true;
                    if (message == "Delete")
                    {
                        inError = false;
                    }

                    // ADD other conditions where target is relevant, ex associate

                    if (inError)
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Target", stage, message);
                    }
                }
                #endregion

                results.Add(result);
            }
Пример #2
0
            private void AddIfConsistent(Type type, System.Reflection.MethodInfo method, List <PluginMethod> results, PluginMethod result, string message, int stage)
            {
                #region validate pre and post image consistancy
                switch (stage)
                {
                case 10:
                case 20:
                    /* pre image pre event */
                    if (result.HasPreimageThatIsNotMergedImage() && message == "Create")
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Preimage", stage, message);
                    }
                    /* post image pre event */
                    if (result.HasPostimage())
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Postimage", stage, message);
                    }
                    break;

                case 40:
                case 41:
                    if (result.HasPostimage() && message == "Delete")
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Postimage", stage, message);
                    }
                    break;
                }
                #endregion

                #region validate target consistancy
                if (result.HasTargetBesideReference() && message == "Delete")
                {
                    throw new Exceptions.UnavailableImageException(type, method, "Target", stage, message);
                }

                if (result.HasTargetReference())
                {
                    var inError = true;
                    if (message == "Delete")
                    {
                        // delete always provides an entity reference as target, everything is good
                        inError = false;
                    }

                    var mess = message.Split('_');
                    if (mess.Length >= 2)
                    {
                        // this looks a lot like a custom action, it has the pattern prefix_name, bounded actions will also provide an entity reference, so we are good
                        inError = false;
                    }

                    // ADD other conditions where target is relevant, ex associate

                    if (inError)
                    {
                        throw new Exceptions.UnavailableImageException(type, method, "Target", stage, message);
                    }
                }
                #endregion

                results.Add(result);

                if (result.method.ReturnType != null)
                {
                    var outputProperties = result.method.ReturnType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
                    if (outputProperties != null && outputProperties.Length > 0)
                    {
                        var output = new Dictionary <System.Reflection.PropertyInfo, Output>();
                        foreach (var p in outputProperties)
                        {
                            var outputAttr = p.GetCustomAttribute(Types.OutputAttribute);
                            if (outputAttr != null)
                            {
                                var name = (string)outputAttr.GetType().GetProperty("LogicalName").GetValue(outputAttr);
                                var req  = (bool)outputAttr.GetType().GetProperty("Required").GetValue(outputAttr);
                                output.Add(p, new Output {
                                    LogicalName = name, Requred = req
                                });
                            }
                        }
                        if (output.Count > 0)
                        {
                            result.OutputProperties = output;
                        }
                    }
                }
            }