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;
}
}
}
}
}
}
|