PageRenderTime 52ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/SharpTAL/TemplateCache/MemoryTemplateCache.cs

https://bitbucket.org/rlacko/sharptal
C# | 81 lines | 36 code | 10 blank | 35 comment | 1 complexity | a564b3f4e7bcb822320d9ba131cf42c3 MD5 | raw file
Possible License(s): Apache-2.0
  1. //
  2. // MemoryTemplateCache.cs
  3. //
  4. // Author:
  5. // Roman Lacko (backup.rlacko@gmail.com)
  6. //
  7. // Copyright (c) 2010 - 2013 Roman Lacko
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining
  10. // a copy of this software and associated documentation files (the
  11. // "Software"), to deal in the Software without restriction, including
  12. // without limitation the rights to use, copy, modify, merge, publish,
  13. // distribute, sublicense, and/or sell copies of the Software, and to
  14. // permit persons to whom the Software is furnished to do so, subject to
  15. // the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be
  18. // included in all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  21. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  23. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  24. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  25. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  26. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27. //
  28. namespace SharpTAL.TemplateCache
  29. {
  30. using System;
  31. using System.Collections.Generic;
  32. using System.Reflection;
  33. using SharpTAL.TemplateProgram;
  34. public class MemoryTemplateCache : AbstractTemplateCache
  35. {
  36. Dictionary<string, TemplateInfo> templateInfoCache;
  37. object templateInfoCacheLock;
  38. /// <summary>
  39. /// Initialize the template cache
  40. /// </summary>
  41. public MemoryTemplateCache() :
  42. base()
  43. {
  44. templateInfoCache = new Dictionary<string, TemplateInfo>();
  45. templateInfoCacheLock = new object();
  46. }
  47. public override TemplateInfo CompileTemplate(string templateBody, Dictionary<string, Type> globalsTypes, List<Assembly> referencedAssemblies)
  48. {
  49. lock (templateInfoCacheLock)
  50. {
  51. // Generate template program
  52. TemplateInfo ti = GenerateTemplateProgram(templateBody, globalsTypes, referencedAssemblies);
  53. // Generated template found in cache
  54. if (templateInfoCache.ContainsKey(ti.TemplateKey))
  55. {
  56. return templateInfoCache[ti.TemplateKey];
  57. }
  58. // Generate code
  59. ICodeGenerator codeGenerator = new CodeGenerator();
  60. ti.GeneratedSourceCode = codeGenerator.GenerateCode(ti);
  61. // Generate assembly
  62. AssemblyGenerator assemblyCompiler = new AssemblyGenerator();
  63. Assembly assembly = assemblyCompiler.GenerateAssembly(ti, true, null, null);
  64. // Try to load the Render() method from assembly
  65. ti.RenderMethod = GetTemplateRenderMethod(assembly, ti);
  66. templateInfoCache.Add(ti.TemplateKey, ti);
  67. return ti;
  68. }
  69. }
  70. }
  71. }