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); }
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; } } } }