Implement MachineKey.Protect and MachineKey.Unprotect
[mono.git] / mcs / class / System.Web.Mvc / System.Web.Mvc / ControllerBuilder.cs
1 /* ****************************************************************************\r
2  *\r
3  * Copyright (c) Microsoft Corporation. All rights reserved.\r
4  *\r
5  * This software is subject to the Microsoft Public License (Ms-PL). \r
6  * A copy of the license can be found in the license.htm file included \r
7  * in this distribution.\r
8  *\r
9  * You must not remove this notice, or any other, from this software.\r
10  *\r
11  * ***************************************************************************/\r
12 \r
13 namespace System.Web.Mvc {\r
14     using System;\r
15     using System.Collections.Generic;\r
16     using System.Diagnostics.CodeAnalysis;\r
17     using System.Globalization;\r
18     using System.Web.Mvc.Resources;\r
19 \r
20     public class ControllerBuilder {\r
21 \r
22         private Func<IControllerFactory> _factoryThunk;\r
23         private static ControllerBuilder _instance = new ControllerBuilder();\r
24         private HashSet<string> _namespaces = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\r
25 \r
26         public ControllerBuilder() {\r
27             SetControllerFactory(new DefaultControllerFactory() {\r
28                 ControllerBuilder = this\r
29             });\r
30         }\r
31 \r
32         public static ControllerBuilder Current {\r
33             get {\r
34                 return _instance;\r
35             }\r
36         }\r
37 \r
38         public HashSet<string> DefaultNamespaces {\r
39             get {\r
40                 return _namespaces;\r
41             }\r
42         }\r
43 \r
44         [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate",\r
45             Justification = "Calling method multiple times might return different objects.")]\r
46         public IControllerFactory GetControllerFactory() {\r
47             IControllerFactory controllerFactoryInstance = _factoryThunk();\r
48             return controllerFactoryInstance;\r
49         }\r
50 \r
51         public void SetControllerFactory(IControllerFactory controllerFactory) {\r
52             if (controllerFactory == null) {\r
53                 throw new ArgumentNullException("controllerFactory");\r
54             }\r
55 \r
56             _factoryThunk = () => controllerFactory;\r
57         }\r
58 \r
59         public void SetControllerFactory(Type controllerFactoryType) {\r
60             if (controllerFactoryType == null) {\r
61                 throw new ArgumentNullException("controllerFactoryType");\r
62             }\r
63             if (!typeof(IControllerFactory).IsAssignableFrom(controllerFactoryType)) {\r
64                 throw new ArgumentException(\r
65                     String.Format(\r
66                         CultureInfo.CurrentUICulture,\r
67                         MvcResources.ControllerBuilder_MissingIControllerFactory,\r
68                         controllerFactoryType),\r
69                     "controllerFactoryType");\r
70             }\r
71 \r
72             _factoryThunk = delegate() {\r
73                 try {\r
74                     return (IControllerFactory)Activator.CreateInstance(controllerFactoryType);\r
75                 }\r
76                 catch (Exception ex) {\r
77                     throw new InvalidOperationException(\r
78                         String.Format(\r
79                             CultureInfo.CurrentUICulture,\r
80                             MvcResources.ControllerBuilder_ErrorCreatingControllerFactory,\r
81                             controllerFactoryType),\r
82                         ex);\r
83                 }\r
84             };\r
85         }\r
86     }\r
87 }\r