/// <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); }
/// <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); }
/// <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)); }
/// <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"); } } }
/// <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"); } } }
/// <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"); } } }
/// <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); } } }
/// <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); }