/// <summary> /// Add a method to the definition for the entity. /// </summary> /// <param name="entity"></param> /// <param name="method"></param> private static void AddMethodToEntity(OrmEntity entity, MethodDescription method) { OrmEntityMethod targetMethod = null; targetMethod = method.CreateMethod(entity); OrmMethodTarget targetStep = method.CreateTarget(AUTOWIRE_HEADER); TargetMethodCollection targetColl = null; switch (method.StepType) { case TargetStepType.PreExecute: targetColl = targetMethod.PreExecuteTargets; break; case TargetStepType.PostFlush: targetColl = targetMethod.PostFlushTargets; break; case TargetStepType.PostExecute: targetColl = targetMethod.PostExecuteTargets; break; case TargetStepType.Primary: default: targetColl = targetMethod.MethodTargets; break; } targetColl.Add(targetStep); entity.Methods.Add(targetMethod); }
/// <summary> /// Add a method to the definition for the entity. /// </summary> /// <param name="entity"></param> /// <param name="method"></param> private static void AddMethodToEntity(OrmEntity entity, MethodDescription method) { OrmEntityMethod targetMethod = null; targetMethod = method.CreateMethod(entity); OrmMethodTarget targetStep = method.CreateTarget(AUTOWIRE_HEADER); TargetMethodCollection targetColl = null; switch (method.StepType) { case TargetStepType.PreExecute: targetColl = targetMethod.PreExecuteTargets; break; case TargetStepType.PostFlush: targetColl = targetMethod.PostFlushTargets; break; case TargetStepType.PostExecute: targetColl = targetMethod.PostExecuteTargets; break; case TargetStepType.Primary: default: targetColl = targetMethod.MethodTargets; break; } targetColl.Add(targetStep); entity.Methods.Add(targetMethod); }
private static bool CleanAutowireMethodsTarget(TargetStepType targetStepType, TargetMethodCollection targetColl, List <MethodDescription> methodsToCreate) { List <OrmMethodTarget> targetsToRemove = new List <OrmMethodTarget>(); foreach (OrmMethodTarget target in targetColl) { if (IsOpenSlxTarget(target)) { MethodDescription targetMatch = methodsToCreate.FirstOrDefault(x => x.MatchTarget(target, targetStepType, AUTOWIRE_HEADER)); if (targetMatch != null) { methodsToCreate.Remove(targetMatch); } else { targetsToRemove.Add(target); } } } foreach (OrmMethodTarget target in targetsToRemove) { targetColl.Remove(target); } return(targetsToRemove.Count > 0); }
public override bool Equals(object obj) { MethodDescription right = obj as MethodDescription; if (right == null) { return(false); } return(Name == right.Name && TargetEntity == right.TargetEntity && StepType == right.StepType && DeclaringType == right.DeclaringType); }
/// <summary> /// Check for custom "AutoWire" attributes added to any (static) method in the assembly, and populate corresponding /// descriptions. /// </summary> /// <param name="file"></param> /// <param name="result"></param> private static void CollectMethodDescriptionsForAssembly(string file, List <MethodDescription> result) { Assembly asm; try { asm = Assembly.ReflectionOnlyLoadFrom(file); } catch (Exception x) { // LOG.Warn("Failed to load assembly from file " + file, x); return; } if (CustomAttributeData.GetCustomAttributes(asm).Count(x => x.Constructor.DeclaringType.FullName == typeof(AutoWireAttribute).FullName) == 0) { return; } Type componentRefType = Type.ReflectionOnlyGetType("Sage.Platform.ComponentModel.IComponentReference, Sage.Platform", false, false); foreach (Type targetType in asm.GetTypes()) { foreach (MethodInfo method in targetType.GetMethods(BindingFlags.Static | BindingFlags.Public)) { ParameterInfo[] methodParams = method.GetParameters(); if (methodParams.Length == 0 || !componentRefType.IsAssignableFrom(methodParams[0].ParameterType)) { continue; } String entityType = methodParams[0].ParameterType.Name.Substring(1); // chop initial "I" from interface name foreach (CustomAttributeData attr in CustomAttributeData.GetCustomAttributes(method)) { Type attrType = attr.Constructor.DeclaringType; if (!attrType.FullName.StartsWith("OpenSlx.Lib.AutoWire")) { continue; } MethodDescription newMethod = new MethodDescription { Name = method.Name, TargetEntity = entityType, DeclaringType = FormatType(targetType) }; // set method type and default step type according to the type of rule we have switch (attrType.Name) { case "BusinessRuleAttribute": newMethod.StepType = TargetStepType.Primary; break; case "OnBeforeInsertAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeInsert; break; case "OnBeforeUpdateAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeUpdate; break; case "OnBeforeDeleteAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeDelete; break; case "OnAfterUpdateAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.AfterUpdate; break; case "OnAfterInsertAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.AfterInsert; break; } foreach (CustomAttributeNamedArgument arg in attr.NamedArguments) { switch (arg.MemberInfo.Name) { case "StepType": newMethod.StepType = (TargetStepType)arg.TypedValue.Value; break; case "Description": newMethod.Description = (String)arg.TypedValue.Value; break; } } List <ParamDescription> newParams = new List <ParamDescription>(); for (int i = 1; i < methodParams.Length; i++) { if (methodParams[i].IsOut) { newMethod.ReturnType = methodParams[i].ParameterType.FullName; } else { newParams.Add(new ParamDescription { ParamType = methodParams[i].ParameterType.FullName, Name = methodParams[i].Name }); } } newMethod.ParameterTypes = newParams.ToArray(); result.Add(newMethod); } } } }
/// <summary> /// Check for custom "AutoWire" attributes added to any (static) method in the assembly, and populate corresponding /// descriptions. /// </summary> /// <param name="file"></param> /// <param name="result"></param> private static void CollectMethodDescriptionsForAssembly(string file, List<MethodDescription> result) { Assembly asm; try { asm = Assembly.ReflectionOnlyLoadFrom(file); } catch (Exception x) { // LOG.Warn("Failed to load assembly from file " + file, x); return; } if (CustomAttributeData.GetCustomAttributes(asm).Count(x => x.Constructor.DeclaringType.FullName == typeof(AutoWireAttribute).FullName) == 0) return; Type componentRefType = Type.ReflectionOnlyGetType("Sage.Platform.ComponentModel.IComponentReference, Sage.Platform", false, false); foreach (Type targetType in asm.GetTypes()) { foreach (MethodInfo method in targetType.GetMethods(BindingFlags.Static | BindingFlags.Public)) { ParameterInfo[] methodParams = method.GetParameters(); if (methodParams.Length == 0 || !componentRefType.IsAssignableFrom(methodParams[0].ParameterType)) continue; String entityType = methodParams[0].ParameterType.Name.Substring(1); // chop initial "I" from interface name foreach (CustomAttributeData attr in CustomAttributeData.GetCustomAttributes(method)) { Type attrType = attr.Constructor.DeclaringType; if (!attrType.FullName.StartsWith("OpenSlx.Lib.AutoWire")) continue; MethodDescription newMethod = new MethodDescription { Name = method.Name, TargetEntity = entityType, DeclaringType = FormatType(targetType) }; // set method type and default step type according to the type of rule we have switch (attrType.Name) { case "BusinessRuleAttribute": newMethod.StepType = TargetStepType.Primary; break; case "OnBeforeInsertAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeInsert; break; case "OnBeforeUpdateAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeUpdate; break; case "OnBeforeDeleteAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.BeforeDelete; break; case "OnAfterUpdateAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.AfterUpdate; break; case "OnAfterInsertAttribute": newMethod.MethodType = Sage.Platform.Orm.Entities.MethodType.CrudEvent; newMethod.StepType = TargetStepType.PostExecute; newMethod.EventType = EventType.AfterInsert; break; } foreach (CustomAttributeNamedArgument arg in attr.NamedArguments) { switch (arg.MemberInfo.Name) { case "StepType": newMethod.StepType = (TargetStepType)arg.TypedValue.Value; break; case "Description": newMethod.Description = (String)arg.TypedValue.Value; break; } } List<ParamDescription> newParams = new List<ParamDescription>(); for (int i = 1; i < methodParams.Length; i++) { if (methodParams[i].IsOut) { newMethod.ReturnType = methodParams[i].ParameterType.FullName; } else { newParams.Add(new ParamDescription { ParamType = methodParams[i].ParameterType.FullName, Name = methodParams[i].Name }); } } newMethod.ParameterTypes = newParams.ToArray(); result.Add(newMethod); } } } }