Пример #1
0
        /// <summary>
        /// Kääntää scriptin ja luo siitä ScriptAssembly olion.
        /// </summary>
        private ScriptAssembly CompileAssembly(ResolverWorkItem resolverWorkItem)
        {
            ScriptBuilder scriptBuilder = resolverWorkItem.ScriptBuilder;

            ScriptCompiler scriptCompiler = new ScriptCompiler(scriptDepencyContainer.ScriptDepencies)
            {
                LoggingMethod = LoggingMethod
            };

            // Kääntää scriptin ja luo käännöksen perusteella uuden ScriptAssemblyn.
            Assembly       assembly       = scriptCompiler.CompileScript(resolverWorkItem.FullName);
            ScriptAssembly scriptAssembly = null;

            // Logataan errori jos kääntäminen ei onnistunut.
            if (assembly == null)
            {
                resolverWorkItem.ResolverErrorLogger.LogError("Compiler could not compile the given script");
            }
            else
            {
                scriptAssembly = MakeScriptAssembly(assembly, resolverWorkItem);
            }

            return(scriptAssembly);
        }
Пример #2
0
        /// <summary>
        /// Luo uuden ScriptAssembly olion Assemblyn ja ResolverAtributes
        /// oliojen perusteella.
        /// </summary>
        private ScriptAssembly MakeScriptAssembly(Assembly assembly, ResolverWorkItem resolverWorkItem)
        {
            ScriptAssembly scriptAssembly = new ScriptAssembly(assembly,
                                                               resolverWorkItem.ScriptBuilder.ScriptName,
                                                               resolverWorkItem.FullName);

            scriptAssemblyContainer.AddAssembly(scriptAssembly);

            return(scriptAssembly);
        }
Пример #3
0
        /// <summary>
        /// Aloittaa scriptin resolvauksen ja palauttaa
        /// resolvatun scriptin.
        /// </summary>
        protected virtual T StartResolving <T>(ScriptBuilder scriptBuilder) where T : IScript
        {
            ResolverWorkItem resolverWorkItem = new ResolverWorkItem()
            {
                ResolvedScript      = default(T),
                ScriptBuilder       = scriptBuilder,
                ResolverErrorLogger = new ResolverErrorLogger(LoggingMethod)
            };

            return(TryResolve <T>(resolverWorkItem));
        }
Пример #4
0
        /// <summary>
        /// Resolvaa scriptin assemblyn ja antaa sen resolverille.
        /// </summary>
        private void ResolveAssembly(ResolverWorkItem resolverWorkItem)
        {
            // Ei edes yritetä resolvata assemblyä jos erroreita on ilmennyt.
            if (!resolverWorkItem.ResolverErrorLogger.HasErrors)
            {
                // Hakee suoraan assembly containerista assemblyä, jos se palauttaa nullin, yrittää kääntää halutun scriptin.
                resolverWorkItem.ScriptAssembly = scriptAssemblyContainer.GetAssembly(a => a.ScriptName == resolverWorkItem.ScriptBuilder.ScriptName) ?? CompileAssembly(resolverWorkItem);

                if (resolverWorkItem.ScriptAssembly == null)
                {
                    resolverWorkItem.ResolverErrorLogger.LogError("Script assembly could not be resolved");
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Resolvaa scriptin koko nimen (path + name + extension) ja antaa sen resolveratributes oliolle.
        /// </summary>
        private void ResolveFullname(ResolverWorkItem resolverWorkItem)
        {
            // Ei edes yritetä resolvata koko nimeä jos erroreita on ilmennyt.
            if (!resolverWorkItem.ResolverErrorLogger.HasErrors)
            {
                // Hakee nimen suoreen path containerilta.
                resolverWorkItem.FullName = scriptPathContainer.ResolveFullScriptName(resolverWorkItem.ScriptBuilder.ScriptName);

                // Jos nimi jää saamatta, logataan errori.
                if (string.IsNullOrEmpty(resolverWorkItem.FullName))
                {
                    resolverWorkItem.ResolverErrorLogger.LogError("Full name could not be resolved");
                }
            }
        }
Пример #6
0
        /// <summary>
        /// Yrittää resolvata tyypin resolveratributesin assemblystä.
        /// </summary>
        /// <param name="resolverWorkItem"></param>
        private void ResolveType(ResolverWorkItem resolverWorkItem)
        {
            // Ei edes yritetä resolvata tyyppiä jos erroreita on ilmennyt.
            if (!resolverWorkItem.ResolverErrorLogger.HasErrors)
            {
                // Haetaan tyypit assemblystä ja etsitään resolveratributes oliolle tyyppi näistä tyypeistä.
                resolverWorkItem.Type = resolverWorkItem.ScriptAssembly.GetTypeFromAssembly(resolverWorkItem.ScriptBuilder.ClassName);

                // Jos tyyppiä ei löydy, logataan errori.
                if (resolverWorkItem.Type == null)
                {
                    resolverWorkItem.ResolverErrorLogger.LogError("Type could not be resolved");
                }
            }
        }
Пример #7
0
 /// <summary>
 /// Yrittää luoda scriptin resolveratributesin tyypistä.
 /// </summary>
 private void MakeScript <T>(ResolverWorkItem resolverWorkItem) where T : IScript
 {
     // Ei edes yritetä resolvata scriptiä jos erroreita on ilmennyt.
     if (!resolverWorkItem.ResolverErrorLogger.HasErrors)
     {
         // Try catch blokki jotta voidaan tehdä instanssi säikeessä oikein.
         try
         {
             // Luodaan activaattorilla uusi instanssi scriptistä.
             resolverWorkItem.ResolvedScript = (T)Activator.CreateInstance(resolverWorkItem.Type, resolverWorkItem.ScriptBuilder.ScriptArguments);
         }
         catch (Exception e)
         {
             // Logataan errorit jos sellaisia ilmenee.
             resolverWorkItem.ResolverErrorLogger.LogError("Could not instantiate type");
             resolverWorkItem.ResolverErrorLogger.LogError(e.Message);
         }
     }
 }
Пример #8
0
        /// <summary>
        /// Yrittää resoltava halutun tyyppisen scriptin annetuilla atribuuteilla.
        /// </summary>
        /// <returns>Resolvattu skripti, skripti voi olla null jos sitä ei pystytty resolvaamaan.</returns>
        protected T TryResolve <T>(ResolverWorkItem resolverWorkItem) where T : IScript
        {
            // Resolvaa ensiki skriptin koko nimen jos erroreita ei ole ilmennyt.
            ResolveFullname(resolverWorkItem);

            // Resolvaa scriptin assemblyn jos erroreita ei ole ilmennyt.
            ResolveAssembly(resolverWorkItem);

            // Resolvaa tyypin assemblystä jos erroreita ei ole ilmennyt.
            ResolveType(resolverWorkItem);

            // Luo skriptin resolvattujen tietojen perusteella jos erroreita ei ole ilmennyt
            MakeScript <T>(resolverWorkItem);

            // Jos erroreita on ilmennyt, näytetään ne käyttäjälle.
            if (resolverWorkItem.ResolverErrorLogger.HasErrors)
            {
                resolverWorkItem.ResolverErrorLogger.ShowErrors(resolverWorkItem.ScriptBuilder);
            }

            // Palauteteen resolvattu skripti.
            return((T)resolverWorkItem.ResolvedScript);
        }