private string GetCacheFileName(DslEngine engine, string[] urls)
		{
			string fileName = storage.GetChecksumForUrls(engine.GetType(), urls) + ".boocache";
            string engineName = engine.EngineName;
            if (engineName != null)
            {
                fileName = string.Format("{0}_{1}", engineName, fileName);
            }
			return Path.Combine(Path.GetTempPath(), fileName);
		}
Example #2
0
        private string[] GetUrlsFromDslEngine(DslEngine engine, ref string path)
        {
            string[]      matchingUrls = engine.Storage.GetMatchingUrlsIn(BaseDirectory, ref path);
            List <string> urls         = new List <string>(matchingUrls ?? new string[0]);

            // even if the path is in the cache, we still return the it
            // so we will get a new version
            if (urls.Exists(GetMatchPathPredicate(path)) == false &&
                engine.Storage.IsValidScriptUrl(path))
            {
                urls.Add(path);
            }
            return(urls.ToArray());
        }
Example #3
0
        /// <summary>
        /// Creates instances of all the DSL that are located directly under the parent URL.
        /// </summary>
        /// <typeparam name="TDslBase">The type of the DSL base.</typeparam>
        /// <param name="parentUrl">The parent URL.</param>
        /// <param name="parameters">The parameters.</param>
        /// <returns></returns>
        public TDslBase[] CreateAll <TDslBase>(string parentUrl, params object[] parameters)
        {
            DslEngine engine = GetEngine <TDslBase>();

            List <TDslBase> instances = new List <TDslBase>();

            engine.Cache.ReadLock(delegate
            {
                foreach (string dsl in GetUrlsFromDslEngine(engine, ref parentUrl))
                {
                    instances.Add(Create <TDslBase>(dsl, parameters));
                }
            });
            return(instances.ToArray());
        }
Example #4
0
        private TDslBase CreateInternal <TDslBase>(ScriptNotFoundBehavior notFoundBehavior, string url, object[] parameters)
        {
            DslEngine engine = GetEngine <TDslBase>();
            Type      type   = null;

            engine.Cache.ReadLock(delegate
            {
                type = engine.Cache.Get(engine.CanonizeUrl(url));
                if (type == null)
                {
                    bool recompilation;
                    string[] urls      = GetUrls(engine, ref url, out recompilation);
                    bool existsInArray = engine.Storage.IsUrlIncludeIn(urls, BaseDirectory, url);
                    if (existsInArray == false)
                    {
                        if (notFoundBehavior == ScriptNotFoundBehavior.Throw)
                        {
                            throw new InvalidOperationException("Could not find DSL script: " + url);
                        }
                        return;
                    }
                    CompilerContext compilerContext;
                    try
                    {
                        compilerContext = engine.Compile(urls);
                    }
                    catch (Exception)
                    {
                        // if we fail to compile with batch, we will try just the current url
                        urls            = new string[] { url };
                        compilerContext = engine.Compile(urls);
                    }
                    Assembly assembly = compilerContext.GeneratedAssembly;
                    RegisterBatchInCache(engine, urls, assembly);
                    //find the type that we searched for
                    //we may have a race condition with the cache, so we force
                    //it to go through the assemly instead of the cache
                    type = engine.GetTypeForUrl(assembly, url);
                    RaiseCompilationEvent(recompilation);
                }
            });
            if (type == null)
            {
                return(default(TDslBase));
            }
            return((TDslBase)engine.CreateInstance(type, parameters));
        }
		/// <summary>
		/// Returns cached instance if any, or null if none
		/// </summary>
		/// <param name="engine"></param>
		/// <param name="urls"></param>
		/// <returns></returns>
		public CompilerContext GetCached(DslEngine engine, string[] urls)
		{
			if (urls == null || urls.Length == 0) throw new ArgumentNullException("urls");

			string cacheFileName = GetCacheFileName(engine, urls);
			CompilerContext context = LoadCompilerContext(cacheFileName);

			if (context == null)
			{
				context = engine.ForceCompile(urls,cacheFileName);
				WriteLock(delegate
				{
					assemblyCache[cacheFileName] = context.GeneratedAssembly;
					AssemblyLoaded(cacheFileName, context.GeneratedAssembly, false);
				});
			}

			return context;
		}
Example #6
0
 private string[] GetUrls(DslEngine engine, ref string url, out bool recompilation)
 {
     string[] urls;
     // we need to compile this separatedly, instead of
     // in a batch. This is usually happening when a script
     // has changed
     recompilation = false;
     if (standAloneCompilation.Contains(url))
     {
         standAloneCompilation.Remove(url);
         urls          = new string[] { url };
         recompilation = true;
     }
     else
     {
         urls = GetUrlsFromDslEngine(engine, ref url);
     }
     return(urls);
 }
Example #7
0
 private void RegisterBatchInCache(DslEngine engine, IEnumerable <string> urls, Assembly compiledAssembly)
 {
     engine.Cache.WriteLock(delegate
     {
         foreach (string batchUrl in urls)
         {
             Type type = engine.GetTypeForUrl(compiledAssembly, batchUrl);
             if (type == null)
             {
                 throw new InvalidOperationException("Could not find the generated type for: " + batchUrl);
             }
             engine.Cache.Set(batchUrl, type);
         }
         engine.Storage.NotifyOnChange(urls, delegate(string invalidatedUrl)
         {
             engine.Cache.Remove(invalidatedUrl);
             standAloneCompilation.Add(invalidatedUrl);
         });
     });
 }
        /// <summary>
        /// Returns cached instance if any, or null if none
        /// </summary>
        /// <param name="engine"></param>
        /// <param name="urls"></param>
        /// <returns></returns>
        public CompilerContext GetCached(DslEngine engine, string[] urls)
        {
            if (urls == null || urls.Length == 0)
            {
                throw new ArgumentNullException("urls");
            }

            string          cacheFileName = GetCacheFileName(engine, urls);
            CompilerContext context       = LoadCompilerContext(cacheFileName);

            if (context == null)
            {
                context = engine.ForceCompile(urls, cacheFileName);
                WriteLock(delegate
                {
                    assemblyCache[cacheFileName] = context.GeneratedAssembly;
                    AssemblyLoaded(cacheFileName, context.GeneratedAssembly, false);
                });
            }

            return(context);
        }
		private string GetCacheFileName(DslEngine engine, string[] urls)
		{
			string fileName = storage.GetChecksumForUrls(engine.GetType(), urls) + ".boocache";
			return Path.Combine(Path.GetTempPath(), fileName);
		}
Example #10
0
 ///<summary>
 /// Register a new DSL engine that is tied to a specific base type
 ///</summary>
 public void Register <TDslBase>(DslEngine engine)
 {
     typeToDslEngine.Add(typeof(TDslBase), engine);
 }
        private string GetCacheFileName(DslEngine engine, string[] urls)
        {
            string fileName = storage.GetChecksumForUrls(engine.GetType(), urls) + ".boocache";

            return(Path.Combine(Path.GetTempPath(), fileName));
        }