Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / FilterAttributeFilterProvider.cs
1 namespace System.Web.Mvc {
2     using System;
3     using System.Collections.Generic;
4     using System.Linq;
5     using System.Web.Mvc.Async;
6
7     public class FilterAttributeFilterProvider : IFilterProvider {
8         private readonly bool _cacheAttributeInstances;
9
10         public FilterAttributeFilterProvider()
11             : this(true) {
12         }
13
14         public FilterAttributeFilterProvider(bool cacheAttributeInstances) {
15             _cacheAttributeInstances = cacheAttributeInstances;
16         }
17
18         protected virtual IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
19             return actionDescriptor.GetFilterAttributes(_cacheAttributeInstances);
20         }
21
22         protected virtual IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
23             return actionDescriptor.ControllerDescriptor.GetFilterAttributes(_cacheAttributeInstances);
24         }
25
26         public virtual IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) {
27             ControllerBase controller = controllerContext.Controller;
28             if (controller == null) {
29                 return Enumerable.Empty<Filter>();
30             }
31
32             var typeFilters = GetControllerAttributes(controllerContext, actionDescriptor)
33                              .Select(attr => new Filter(attr, FilterScope.Controller, null));
34             var methodFilters = GetActionAttributes(controllerContext, actionDescriptor)
35                                .Select(attr => new Filter(attr, FilterScope.Action, null));
36
37             return typeFilters.Concat(methodFilters).ToList();
38         }
39     }
40 }