--- /dev/null
+//
+// System.Web.Compilation.GlobalAsaxCompiler
+//
+// Authors:
+// Gonzalo Paniagua Javier (gonzalo@ximian.com)
+//
+// (C) 2002 Ximian, Inc (http://www.ximian.com)
+//
+using System;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using System.Text;
+using System.Web;
+using System.Web.Util;
+
+namespace System.Web.Compilation
+{
+ class GlobalAsaxCompiler : BaseCompiler
+ {
+ Hashtable options;
+ string filename;
+ string sourceFile;
+
+ private GlobalAsaxCompiler (string filename)
+ {
+ this.filename = filename;
+ }
+
+ public override Type GetCompiledType ()
+ {
+ sourceFile = GenerateSourceFile ();
+
+ CachingCompiler compiler = new CachingCompiler (this);
+ CompilationResult result = new CompilationResult ();
+ if (compiler.Compile (result) == false)
+ throw new CompilationException (result);
+
+ Assembly assembly = Assembly.LoadFrom (result.OutputFile);
+ Type [] types = assembly.GetTypes ();
+ if (types.Length != 1)
+ throw new CompilationException ("More than 1 Type in an application?", result);
+
+ result.Data = types [0];
+ return types [0];
+ }
+
+ public override string Key {
+ get {
+ return filename;
+ }
+ }
+
+ public override string SourceFile {
+ get {
+ return sourceFile;
+ }
+ }
+
+ public override string CompilerOptions {
+ get {
+ if (options == null)
+ return base.CompilerOptions;
+
+ StringBuilder sb = new StringBuilder (base.CompilerOptions);
+ string compilerOptions = options ["CompilerOptions"] as string;
+ if (compilerOptions != null) {
+ sb.Append (' ');
+ sb.Append (compilerOptions);
+ }
+
+ string references = options ["References"] as string;
+ if (references == null)
+ return sb.ToString ();
+
+ string [] split = references.Split (' ');
+ foreach (string s in split)
+ sb.AppendFormat (" /r:{0}", s);
+
+ return sb.ToString ();
+ }
+ }
+
+ public static Type CompileApplicationType (string filename)
+ {
+ CompilationCacheItem item = CachingCompiler.GetCached (filename);
+ if (item != null && item.Result != null) {
+ if (item.Result != null)
+ return item.Result.Data as Type;
+
+ throw new CompilationException (item.Result);
+ }
+
+ GlobalAsaxCompiler gac = new GlobalAsaxCompiler (filename);
+ return gac.GetCompiledType ();
+ }
+
+ string GenerateSourceFile ()
+ {
+ Stream input = File.OpenRead (filename);
+ AspParser parser = new AspParser (filename, input);
+ parser.Parse ();
+ AspGenerator generator = new AspGenerator (filename, parser.Elements);
+ generator.BaseType = typeof (HttpApplication).ToString ();
+ generator.ProcessElements ();
+ string generated = generator.GetCode ().ReadToEnd ();
+ options = generator.Options;
+
+ //FIXME: should get Tmp dir for this application
+ string csName = Path.GetTempFileName () + ".cs";
+ WebTrace.WriteLine ("Writing {0}", csName);
+ StreamWriter output = new StreamWriter (File.OpenWrite (csName));
+ output.Write (generated);
+ output.Close ();
+ return csName;
+ }
+ }
+}
+