Merge pull request #569 from knocte/fix_cairo_profile_versions_problem
[mono.git] / mcs / class / System.Web.Mvc / System.Web.Mvc / ViewEngineCollection.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.Collections.Generic;\r
15     using System.Collections.ObjectModel;\r
16     using System.Diagnostics.CodeAnalysis;\r
17     using System.Web.Mvc.Resources;\r
18 \r
19     public class ViewEngineCollection : Collection<IViewEngine> {\r
20 \r
21         public ViewEngineCollection() {\r
22         }\r
23 \r
24         public ViewEngineCollection(IList<IViewEngine> list)\r
25             : base(list) {\r
26         }\r
27 \r
28         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]\r
29         protected override void InsertItem(int index, IViewEngine item) {\r
30             if (item == null) {\r
31                 throw new ArgumentNullException("item");\r
32             }\r
33             base.InsertItem(index, item);\r
34         }\r
35 \r
36         [SuppressMessage("Microsoft.Security", "CA2123:OverrideLinkDemandsShouldBeIdenticalToBase")]\r
37         protected override void SetItem(int index, IViewEngine item) {\r
38             if (item == null) {\r
39                 throw new ArgumentNullException("item");\r
40             }\r
41             base.SetItem(index, item);\r
42         }\r
43 \r
44         private ViewEngineResult Find(Func<IViewEngine, ViewEngineResult> cacheLocator, Func<IViewEngine, ViewEngineResult> locator) {\r
45             ViewEngineResult result;\r
46 \r
47             foreach (IViewEngine engine in Items) {\r
48                 if (engine != null) {\r
49                     result = cacheLocator(engine);\r
50 \r
51                     if (result.View != null) {\r
52                         return result;\r
53                     }\r
54                 }\r
55             }\r
56 \r
57             List<string> searched = new List<string>();\r
58 \r
59             foreach (IViewEngine engine in Items) {\r
60                 if (engine != null) {\r
61                     result = locator(engine);\r
62 \r
63                     if (result.View != null) {\r
64                         return result;\r
65                     }\r
66 \r
67                     searched.AddRange(result.SearchedLocations);\r
68                 }\r
69             }\r
70 \r
71             return new ViewEngineResult(searched);\r
72         }\r
73 \r
74         public virtual ViewEngineResult FindPartialView(ControllerContext controllerContext, string partialViewName) {\r
75             if (controllerContext == null) {\r
76                 throw new ArgumentNullException("controllerContext");\r
77             }\r
78             if (string.IsNullOrEmpty(partialViewName)) {\r
79                 throw new ArgumentException(MvcResources.Common_NullOrEmpty, "partialViewName");\r
80             }\r
81             Func<IViewEngine, ViewEngineResult> cacheLocator = e => e.FindPartialView(controllerContext, partialViewName, true);\r
82             Func<IViewEngine, ViewEngineResult> locator = e => e.FindPartialView(controllerContext, partialViewName, false);\r
83             return Find(cacheLocator, locator);\r
84         }\r
85 \r
86         public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName) {\r
87             if (controllerContext == null) {\r
88                 throw new ArgumentNullException("controllerContext");\r
89             }\r
90             if (string.IsNullOrEmpty(viewName)) {\r
91                 throw new ArgumentException(MvcResources.Common_NullOrEmpty, "viewName");\r
92             }\r
93             Func<IViewEngine, ViewEngineResult> cacheLocator = e => e.FindView(controllerContext, viewName, masterName, true);\r
94             Func<IViewEngine, ViewEngineResult> locator = e => e.FindView(controllerContext, viewName, masterName, false);\r
95             return Find(cacheLocator, locator);\r
96         }\r
97     }\r
98 }\r