123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- <#@ template debug="true" hostspecific="true" language="C#" #>
- <#@ assembly name="System.Core"#>
- <#@ assembly name="System.Data.Linq"#>
- <#@ assembly name="EnvDTE"#>
- <#@ assembly name="System.Xml"#>
- <#@ assembly name="System.Xml.Linq"#>
- <#@ import namespace="System.Diagnostics" #>
- <#@ import namespace="System"#>
- <#@ import namespace="System.CodeDom"#>
- <#@ import namespace="System.CodeDom.Compiler"#>
- <#@ import namespace="System.Collections.Generic"#>
- <#@ import namespace="System.Data.Linq"#>
- <#@ import namespace="System.Data.Linq.Mapping"#>
- <#@ import namespace="System.IO"#>
- <#@ import namespace="System.Linq"#>
- <#@ import namespace="System.Reflection"#>
- <#@ import namespace="System.Text"#>
- <#@ import namespace="System.Xml.Linq"#>
- <#@ import namespace="Microsoft.VisualStudio.TextTemplating"#>
- <#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" name="$(SolutionDir)\packages\EntityFramework.6.1.3\lib\net40\EntityFramework.dll" #>
- <#@ VolatileAssembly processor="T4Toolbox.VolatileAssemblyProcessor" name="$(SolutionDir)\EMISOnline.Entities\bin\Debug\EMISOnline.Entities.dll" #>
- <#
- var manager = Manager.Create(Host, GenerationEnvironment);
- var blAssembly = Assembly.GetAssembly(typeof(EMISOnline.Entities.EMISOnlineContextContainer));
- var types = blAssembly.GetTypes().Where(x =>
- x.FullName.StartsWith("EMISOnline.Entities") &&
- !x.Name.EndsWith("Mapping") && x.Name != "TableKeyDictionary" && !x.Name.EndsWith("Context") && !x.Name.EndsWith("DbFunctions"));
- foreach(var type in types)
- {
- int startIndex = type.Name.IndexOf("_") + 1;
- int length = type.Name.Length - startIndex;
- string classShortName = type.Name.Substring(startIndex, length);
- string className = classShortName + "Repository";
- if (type.Name.StartsWith("VW"))
- {
- int secondStartIndex = classShortName.IndexOf("_") + 1;
- classShortName = "VW" + classShortName.Substring(secondStartIndex, classShortName.Length - secondStartIndex);
- className = classShortName + "Repository";
- }
- if (classShortName.StartsWith("SS_"))
- {
- continue;
- }
- manager.StartNewFile(className + ".cs");
- #>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using EMISOnline.Entities;
- namespace EMISOnline.DataLogic.Repositories
- {
- public class <#=className#> : Repository<<#=type.Name#>>
- {
- public <#=className#>(UnitOfWork unitOfWork)
- : base(unitOfWork)
- { }
- }
- }
- <#
- manager.EndBlock();
- }
- manager.Process(true);
- #>
- <#+
- // Manager class records the various blocks so it can split them up
- class Manager {
- private class Block {
- public String Name;
- public int Start, Length;
- }
- private Block currentBlock;
- private List<Block> files = new List<Block>();
- private Block footer = new Block();
- private Block header = new Block();
- private ITextTemplatingEngineHost host;
- private StringBuilder template;
- protected List<String> generatedFileNames = new List<String>();
- public static Manager Create(ITextTemplatingEngineHost host, StringBuilder template) {
- return (host is IServiceProvider) ? new VSManager(host, template) : new Manager(host, template);
- }
- public void StartNewFile(String name) {
- if (name == null)
- throw new ArgumentNullException("name");
- CurrentBlock = new Block { Name = name };
- }
- public void StartFooter() {
- CurrentBlock = footer;
- }
- public void StartHeader() {
- CurrentBlock = header;
- }
- public void EndBlock() {
- if (CurrentBlock == null)
- return;
- CurrentBlock.Length = template.Length - CurrentBlock.Start;
- if (CurrentBlock != header && CurrentBlock != footer)
- files.Add(CurrentBlock);
- currentBlock = null;
- }
- public virtual void Process(bool split) {
- if (split) {
- EndBlock();
- String headerText = template.ToString(header.Start, header.Length);
- String footerText = template.ToString(footer.Start, footer.Length);
- String outputPath = Path.GetDirectoryName(host.TemplateFile);
- files.Reverse();
- foreach(Block block in files) {
- String fileName = Path.Combine(outputPath, block.Name);
- String content = headerText + template.ToString(block.Start, block.Length) + footerText;
- generatedFileNames.Add(fileName);
- CreateFile(fileName, content);
- template.Remove(block.Start, block.Length);
- }
- }
- }
- protected virtual void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content))
- File.WriteAllText(fileName, content);
- }
- public virtual String GetCustomToolNamespace(String fileName) {
- return null;
- }
- public virtual String DefaultProjectNamespace {
- get { return null; }
- }
- protected bool IsFileContentDifferent(String fileName, String newContent) {
- return !(File.Exists(fileName) && File.ReadAllText(fileName) == newContent);
- }
- private Manager(ITextTemplatingEngineHost host, StringBuilder template) {
- this.host = host;
- this.template = template;
- }
- private Block CurrentBlock {
- get { return currentBlock; }
- set {
- if (CurrentBlock != null)
- EndBlock();
- if (value != null)
- value.Start = template.Length;
- currentBlock = value;
- }
- }
- private class VSManager: Manager {
- private EnvDTE.ProjectItem templateProjectItem;
- private EnvDTE.DTE dte;
- private Action<String> checkOutAction;
- private Action<IEnumerable<String>> projectSyncAction;
- public override String DefaultProjectNamespace {
- get {
- return templateProjectItem.ContainingProject.Properties.Item("DefaultNamespace").Value.ToString();
- }
- }
- public override String GetCustomToolNamespace(string fileName) {
- return dte.Solution.FindProjectItem(fileName).Properties.Item("CustomToolNamespace").Value.ToString();
- }
- public override void Process(bool split) {
- if (templateProjectItem.ProjectItems == null)
- return;
- base.Process(split);
- projectSyncAction.EndInvoke(projectSyncAction.BeginInvoke(generatedFileNames, null, null));
- }
- protected override void CreateFile(String fileName, String content) {
- if (IsFileContentDifferent(fileName, content)) {
- CheckoutFileIfRequired(fileName);
- File.WriteAllText(fileName, content);
- }
- }
- internal VSManager(ITextTemplatingEngineHost host, StringBuilder template)
- : base(host, template) {
- var hostServiceProvider = (IServiceProvider) host;
- if (hostServiceProvider == null)
- throw new ArgumentNullException("Could not obtain IServiceProvider");
- dte = (EnvDTE.DTE) hostServiceProvider.GetService(typeof(EnvDTE.DTE));
- if (dte == null)
- throw new ArgumentNullException("Could not obtain DTE from host");
- templateProjectItem = dte.Solution.FindProjectItem(host.TemplateFile);
- checkOutAction = (String fileName) => dte.SourceControl.CheckOutItem(fileName);
- projectSyncAction = (IEnumerable<String> keepFileNames) => ProjectSync(templateProjectItem, keepFileNames);
- }
- private static void ProjectSync(EnvDTE.ProjectItem templateProjectItem, IEnumerable<String> keepFileNames) {
- var keepFileNameSet = new HashSet<String>(keepFileNames);
- var projectFiles = new Dictionary<String, EnvDTE.ProjectItem>();
- var originalFilePrefix = Path.GetFileNameWithoutExtension(templateProjectItem.get_FileNames(0)) + ".";
- foreach(EnvDTE.ProjectItem projectItem in templateProjectItem.ProjectItems)
- projectFiles.Add(projectItem.get_FileNames(0), projectItem);
- // Remove unused items from the project
- foreach(var pair in projectFiles)
- if (!keepFileNames.Contains(pair.Key) && !(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix))
- pair.Value.Delete();
- // Add missing files to the project
- foreach(String fileName in keepFileNameSet)
- if (!projectFiles.ContainsKey(fileName))
- templateProjectItem.ProjectItems.AddFromFile(fileName);
- }
- private void CheckoutFileIfRequired(String fileName) {
- var sc = dte.SourceControl;
- if (sc != null && sc.IsItemUnderSCC(fileName) && !sc.IsItemCheckedOut(fileName))
- checkOutAction.EndInvoke(checkOutAction.BeginInvoke(fileName, null, null));
- }
- }
- } #>
|