File: FolderLevelBuildProviderCollection.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (132 lines) | stat: -rw-r--r-- 4,822 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//------------------------------------------------------------------------------
// <copyright file="FolderLevelBuildProviderCollection.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------

namespace System.Web.Configuration {
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Web.Compilation;

    // class CompilationSection

    [ConfigurationCollection(typeof(FolderLevelBuildProvider))]
    public sealed class FolderLevelBuildProviderCollection : ConfigurationElementCollection {
        private static ConfigurationPropertyCollection _properties;
        private Dictionary<FolderLevelBuildProviderAppliesTo, List<Type>> _buildProviderMappings;
        private HashSet<Type> _buildProviderTypes;

        private bool _folderLevelBuildProviderTypesSet;

        static FolderLevelBuildProviderCollection() {
            // Property initialization
            _properties = new ConfigurationPropertyCollection();
        }
        
        public FolderLevelBuildProviderCollection()
            : base(StringComparer.OrdinalIgnoreCase) {
        }

        protected override ConfigurationPropertyCollection Properties {
            get {
                return _properties;
            }
        }

        public new BuildProvider this[string name] {
            get {
                return (BuildProvider)BaseGet(name);
            }
        }
        public FolderLevelBuildProvider this[int index] {
            get {
                return (FolderLevelBuildProvider)BaseGet(index);
            }
            set {
                if (BaseGet(index) != null)
                    BaseRemoveAt(index);
                BaseAdd(index, value);
            }
        }

        public void Add(FolderLevelBuildProvider buildProvider) {
            BaseAdd(buildProvider);
        }
        
        public void Remove(String name) {
            BaseRemove(name);
        }
        
        public void RemoveAt(int index) {
            BaseRemoveAt(index);
        }
        
        public void Clear() {
            BaseClear();
        }
        
        protected override ConfigurationElement CreateNewElement() {
            return new FolderLevelBuildProvider();
        }

        protected override Object GetElementKey(ConfigurationElement element) {
            return ((FolderLevelBuildProvider)element).Name;
        }

        // Add a mapping from appliesTo to the buildProviderType
        private void AddMapping(FolderLevelBuildProviderAppliesTo appliesTo, Type buildProviderType) {
            if (_buildProviderMappings == null) {
                _buildProviderMappings = new Dictionary<FolderLevelBuildProviderAppliesTo, List<Type>>();
            }
            if (_buildProviderTypes == null) {
                _buildProviderTypes = new HashSet<Type>();
            }
            List<Type> buildProviders = null;
            if (!_buildProviderMappings.TryGetValue(appliesTo, out buildProviders)) {
                buildProviders = new List<Type>();
                _buildProviderMappings.Add(appliesTo, buildProviders);
            }
            buildProviders.Add(buildProviderType);

            _buildProviderTypes.Add(buildProviderType);
        }

        internal List<Type> GetBuildProviderTypes(FolderLevelBuildProviderAppliesTo appliesTo) {
            EnsureFolderLevelBuildProvidersInitialized();
            var buildProviders = new List<Type>();
            if (_buildProviderMappings != null) {
                foreach (var pair in _buildProviderMappings) {
                    if ((pair.Key & appliesTo) != 0) {
                        buildProviders.AddRange(pair.Value);
                    }
                }
            }
            return buildProviders;
        }

        internal bool IsFolderLevelBuildProvider(Type t) {
            EnsureFolderLevelBuildProvidersInitialized();
            if (_buildProviderTypes != null) {
                return _buildProviderTypes.Contains(t);
            }
            return false;
        }


        // Initialize the dictionary mapping appliesTo to buildProvider types
        private void EnsureFolderLevelBuildProvidersInitialized() {
            if (!_folderLevelBuildProviderTypesSet) {
                lock (this) {
                    if (!_folderLevelBuildProviderTypesSet) {
                        foreach (FolderLevelBuildProvider buildProvider in this) {
                            AddMapping(buildProvider.AppliesToInternal, buildProvider.TypeInternal);
                        }
                        _folderLevelBuildProviderTypesSet = true;
                    }
                }
            }
        }
    }
}