[asp.net] Implemented BuildManager.GetObjectFactory
authorMarek Habersack <grendel@twistedcode.net>
Mon, 17 Jan 2011 12:43:59 +0000 (13:43 +0100)
committerMarek Habersack <grendel@twistedcode.net>
Mon, 17 Jan 2011 13:47:07 +0000 (14:47 +0100)
This method is not used by Mono internally but is called by MVC v3.

mcs/class/System.Web/System.Web.Compilation/BuildManager.cs
mcs/class/System.Web/System.Web.Util/SimpleWebObjectFactory.cs [new file with mode: 0644]
mcs/class/System.Web/System.Web/HttpApplicationFactory.cs
mcs/class/System.Web/net_4_0_System.Web.dll.sources

index 31d8723dbbe0343b8a76c15ad2524675bf3c0164..5852ac5144c90fd8951c4e9a54bd05df7c97f3ce 100644 (file)
@@ -117,6 +117,10 @@ namespace System.Web.Compilation
                }
 
 #if NET_4_0
+               internal static bool CompilingTopLevelAssemblies {
+                       get; set;
+               }
+               
                internal static bool PreStartMethodsRunning {
                        get { return preStartMethodsRunning; }
                }
@@ -667,10 +671,39 @@ namespace System.Web.Compilation
                                dynamicallyRegisteredAssemblies.Add (assembly);
                }
 
-               [MonoTODO ("A no-op until we use IWebObjectFactory internally. Always returns null.")]
+               [MonoDocumentationNote ("Not used by Mono internally. Needed for MVC3")]
                public static IWebObjectFactory GetObjectFactory (string virtualPath, bool throwIfNotFound)
                {
-                       return null;
+                       if (CompilingTopLevelAssemblies)
+                               throw new HttpException ("Method must not be called while compiling the top level assemblies.");
+
+                       Type type;
+                       if (is_precompiled) {
+                               type = GetPrecompiledType (virtualPath);
+                               if (type == null) {
+                                       if (throwIfNotFound)
+                                               throw new HttpException (String.Format ("Virtual path '{0}' not found in precompiled application type cache.", virtualPath));
+                                       else
+                                               return null;
+                               }
+                               return new SimpleWebObjectFactory (type);
+                       }
+
+                       Exception compileException = null;
+                       try {
+                               type = GetCompiledType (virtualPath);
+                       } catch (Exception ex) {
+                               compileException = ex;
+                               type = null;
+                       }
+                       
+                       if (type == null) {
+                               if (throwIfNotFound)
+                                       throw new HttpException (String.Format ("Virtual path '{0}' does not exist.", virtualPath), compileException);
+                               return null;
+                       }
+                       
+                       return new SimpleWebObjectFactory (type);
                }
 #endif
                public static object CreateInstanceFromVirtualPath (string virtualPath, Type requiredBaseType)
diff --git a/mcs/class/System.Web/System.Web.Util/SimpleWebObjectFactory.cs b/mcs/class/System.Web/System.Web.Util/SimpleWebObjectFactory.cs
new file mode 100644 (file)
index 0000000..1135477
--- /dev/null
@@ -0,0 +1,49 @@
+//
+// Authors:
+//      Marek Habersack <grendel@twistedcode.net>
+//
+// (C) 2011 Novell, Inc (http://novell.com)
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+// 
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+using System;
+
+namespace System.Web.Util
+{
+       sealed class SimpleWebObjectFactory : IWebObjectFactory
+       {
+               Type type;
+               
+               public SimpleWebObjectFactory (Type type)
+               {
+                       this.type = type;
+               }
+               
+               public object CreateInstance ()
+               {
+                       if (type == null)
+                               return null;
+
+                       return Activator.CreateInstance (type);
+               }
+       }
+}
index 6a34f2d97227f3fcf1a5d4934678806bec67c873..2a46b6a8617dbbc6ba1dfd64e36da30e678e8fbd 100644 (file)
@@ -406,6 +406,7 @@ namespace System.Web
                                        }
 #if NET_4_0
                                        BuildManager.CallPreStartMethods ();
+                                       BuildManager.CompilingTopLevelAssemblies = true;
 #endif
 #if !TARGET_J2EE
                                        AppResourcesCompiler ac = new AppResourcesCompiler (context);
@@ -447,7 +448,9 @@ namespace System.Web
                                                app_browsers_files = Directory.GetFiles (app_browsers_path, "*.browser");
                                        }
 #endif
-
+#if NET_4_0
+                                       BuildManager.CompilingTopLevelAssemblies = false;
+#endif
                                        app_type = BuildManager.GetPrecompiledApplicationType ();
                                        if (app_type == null && app_file != null) {
 #if TARGET_J2EE
index 0cd8a341d594c5c5b81148336ddb0f84e5a40e30..95da5d7ba705ef647cc2e1b21fd5e20c3ea7aef8 100644 (file)
@@ -37,6 +37,7 @@ System.Web.UI.WebControls/RouteParameter.cs
 System.Web.UI.WebControls/StyleBlock.cs
 System.Web.UI.WebControls/WizardLayoutContainer.cs
 System.Web.UI.WebControls/WizardLayoutNavigationContainer.cs
+System.Web.Util/SimpleWebObjectFactory.cs
 System.Web.Util/RequestValidationSource.cs
 System.Web.Util/RequestValidator.cs