/// <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> /// Create a new method or return existing method if appropriate /// </summary> /// <param name="entity"></param> /// <returns></returns> public OrmEntityMethod CreateMethod(OrmEntity entity) { if (MethodType == Sage.Platform.Orm.Entities.MethodType.Rule) { OrmEntityMethod method = new OrmEntityMethod { ActionType = ActionType.None, ReturnType = ReturnType, MethodName = Name, MethodType = MethodType }; if (ParameterTypes != null && ParameterTypes.Length > 0) { //MethodParameterCollection paramColl = new MethodParameterCollection(method); foreach (ParamDescription p in ParameterTypes) { method.MethodParameters.Add(new OrmEntityMethodParam { ParamName = p.Name, ParamType = p.ParamType }); } } return(method); } else if (MethodType == Sage.Platform.Orm.Entities.MethodType.CrudEvent) { switch (EventType) { case AutoWire.EventType.BeforeUpdate: return(entity.OnBeforeUpdateMethod); case AutoWire.EventType.AfterUpdate: return(entity.OnAfterUpdateMethod); case AutoWire.EventType.BeforeInsert: return(entity.OnBeforeInsertMethod); case AutoWire.EventType.AfterInsert: return(entity.OnAfterInsertMethod); case AutoWire.EventType.BeforeDelete: return(entity.OnBeforeDeleteMethod); default: throw new Exception("Invalid event type " + EventType + " for AutoWire method " + DeclaringType + "." + Name); } } else { throw new Exception("Unsupported method type " + MethodType + " for AutoWire method " + DeclaringType + "." + Name); } }
/// <summary> /// Create a new method or return existing method if appropriate /// </summary> /// <param name="entity"></param> /// <returns></returns> public OrmEntityMethod CreateMethod(OrmEntity entity) { if (MethodType == Sage.Platform.Orm.Entities.MethodType.Rule) { OrmEntityMethod method = new OrmEntityMethod { ActionType = ActionType.None, ReturnType = ReturnType, MethodName = Name, MethodType = MethodType }; if (ParameterTypes != null && ParameterTypes.Length > 0) { //MethodParameterCollection paramColl = new MethodParameterCollection(method); foreach (ParamDescription p in ParameterTypes) { method.MethodParameters.Add(new OrmEntityMethodParam { ParamName = p.Name, ParamType = p.ParamType }); } } return method; } else if (MethodType == Sage.Platform.Orm.Entities.MethodType.CrudEvent) { switch (EventType) { case AutoWire.EventType.BeforeUpdate: return entity.OnBeforeUpdateMethod; case AutoWire.EventType.AfterUpdate: return entity.OnAfterUpdateMethod; case AutoWire.EventType.BeforeInsert: return entity.OnBeforeInsertMethod; case AutoWire.EventType.AfterInsert: return entity.OnAfterInsertMethod; case AutoWire.EventType.BeforeDelete: return entity.OnBeforeDeleteMethod; default: throw new Exception("Invalid event type " + EventType + " for AutoWire method " + DeclaringType + "." + Name); } } else { throw new Exception("Unsupported method type " + MethodType + " for AutoWire method " + DeclaringType + "." + Name); } }
private static void AttachSnippet( OrmEntityMethod entityMethod, string methodBodyTemplate, string relationshipProperty, string localProperty, string foreignProperty, params string[] usings) { string methodName = string.Format("{0}_Set{1}", entityMethod.MethodName, localProperty); OrmMethodTargetSnippet snippet = (OrmMethodTargetSnippet) CollectionUtils.Find( entityMethod.PostExecuteTargets, delegate(OrmMethodTarget item) { return (item is OrmMethodTargetSnippet && StringUtils.CaseInsensitiveEquals(item.TargetMethod, methodName)); }); if (snippet == null) { snippet = new OrmMethodTargetSnippet(entityMethod, MethodTargetType.PostExecute); entityMethod.PostExecuteTargets.Add(snippet); } string namespaceName = CodeSnippetManager.GetConfiguration().DefaultNamespace; string className = entityMethod.Entity.Name + "BusinessRules"; CodeSnippetTemplateContext context = new CodeSnippetTemplateContext( namespaceName, className, methodName, "void"); foreach (string use in usings) { context.Usings.Add(use); } context.Usings.Add("NHibernate"); string targetInstance = entityMethod.Entity.Name.ToLowerInvariant(); context.AddParameter(entityMethod.Entity.InterfaceName, targetInstance); context.AddParameter("ISession", "session"); if (!(snippet.CodeSnippet is CodeSnippetCSharp)) { if (snippet.CodeSnippet != null) { snippet.CodeSnippet.Delete(); } snippet.CodeSnippet = new CodeSnippetCSharp(entityMethod, context); } snippet.CodeSnippet.Header.Name = methodName; snippet.CodeSnippet.Header.AssemblyReferences.Add( new AssemblyReference( "Sage.Entity.Interfaces.dll", Path.Combine("%BASEBUILDPATH%", @"interfaces\bin\Sage.Entity.Interfaces.dll"))); snippet.CodeSnippet.Header.AssemblyReferences.Add( new AssemblyReference( "Sage.Platform.dll", Path.Combine("%BASEBUILDPATH%", @"assemblies\Sage.Platform.dll"))); snippet.TargetMethod = methodName; snippet.TargetType = string.Format("{0}.{1}, {2}", namespaceName, className, snippet.CodeSnippet.Header.Assembly); string code = snippet.CodeSnippet.Code; int pos = code.IndexOf(methodName); if (pos >= 0) { pos = code.IndexOf("// TODO: ", pos); if (pos >= 0) { int pos2 = code.IndexOfAny(new char[] {'\r', '\n'}, pos); if (pos2 >= 0) { Hashtable contexts = new Hashtable(4); contexts.Add("targetInstance", targetInstance); contexts.Add("relationshipProperty", relationshipProperty); contexts.Add("localProperty", localProperty); contexts.Add("foreignProperty", foreignProperty); ITemplateEngine engine = new NVelocityTemplateEngine(); ITemplate template = engine.CreateTemplate(methodBodyTemplate, contexts); snippet.CodeSnippet.Code = code.Replace( code.Substring(pos, pos2 - pos), template.ApplyTemplate()); } } } entityMethod.Validate(); entityMethod.Save(); }