e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
110 lines
4.7 KiB
C#
110 lines
4.7 KiB
C#
namespace System.Web.UI {
|
|
using System;
|
|
using System.Collections.Concurrent;
|
|
using System.Globalization;
|
|
using System.Reflection;
|
|
using System.Web.Resources;
|
|
using System.Web.Util;
|
|
|
|
public class ScriptResourceMapping : IScriptResourceMapping {
|
|
private readonly ConcurrentDictionary<Tuple<String, Assembly>, ScriptResourceDefinition> _definitions =
|
|
new ConcurrentDictionary<Tuple<String, Assembly>, ScriptResourceDefinition>();
|
|
|
|
public void AddDefinition(string name, ScriptResourceDefinition definition) {
|
|
AddDefinition(name, assembly: AssemblyCache.SystemWebExtensions, definition: definition);
|
|
}
|
|
|
|
public void AddDefinition(string name, Assembly assembly, ScriptResourceDefinition definition) {
|
|
// dictionary indexer will update the value if it already exists
|
|
if (String.IsNullOrEmpty(name)) {
|
|
throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name");
|
|
}
|
|
if (definition == null) {
|
|
throw new ArgumentNullException("definition");
|
|
}
|
|
if (String.IsNullOrEmpty(definition.ResourceName) && String.IsNullOrEmpty(definition.Path)) {
|
|
throw new ArgumentException(AtlasWeb.ScriptResourceDefinition_NameAndPathCannotBeEmpty, "definition");
|
|
}
|
|
EnsureAbsoluteOrAppRelative(definition.Path);
|
|
EnsureAbsoluteOrAppRelative(definition.DebugPath);
|
|
EnsureAbsoluteOrAppRelative(definition.CdnPath);
|
|
EnsureAbsoluteOrAppRelative(definition.CdnDebugPath);
|
|
assembly = NormalizeAssembly(assembly);
|
|
_definitions[new Tuple<String, Assembly>(name, assembly)] = definition;
|
|
}
|
|
|
|
public void Clear() {
|
|
_definitions.Clear();
|
|
}
|
|
|
|
private void EnsureAbsoluteOrAppRelative(string path) {
|
|
if (!String.IsNullOrEmpty(path) &&
|
|
!UrlPath.IsAppRelativePath(path) && // ~/foo..
|
|
!UrlPath.IsRooted(path) && // /foo
|
|
!Uri.IsWellFormedUriString(path, UriKind.Absolute)) { // http://...
|
|
throw new InvalidOperationException(
|
|
String.Format(CultureInfo.InvariantCulture, AtlasWeb.ScriptResourceDefinition_InvalidPath, path));
|
|
}
|
|
}
|
|
|
|
public ScriptResourceDefinition GetDefinition(string name) {
|
|
return GetDefinition(name, AssemblyCache.SystemWebExtensions);
|
|
}
|
|
|
|
public ScriptResourceDefinition GetDefinition(string name, Assembly assembly) {
|
|
if (String.IsNullOrEmpty(name)) {
|
|
throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name");
|
|
}
|
|
ScriptResourceDefinition definition;
|
|
assembly = NormalizeAssembly(assembly);
|
|
_definitions.TryGetValue(new Tuple<string, Assembly>(name, assembly), out definition);
|
|
return definition;
|
|
}
|
|
|
|
public ScriptResourceDefinition GetDefinition(ScriptReference scriptReference) {
|
|
if (scriptReference == null) {
|
|
throw new ArgumentNullException("scriptReference");
|
|
}
|
|
string name = scriptReference.Name;
|
|
Assembly assembly = null;
|
|
ScriptResourceDefinition definition = null;
|
|
if (!String.IsNullOrEmpty(name)) {
|
|
assembly = scriptReference.GetAssembly();
|
|
definition = ScriptManager.ScriptResourceMapping.GetDefinition(name, assembly);
|
|
}
|
|
return definition;
|
|
}
|
|
|
|
public ScriptResourceDefinition RemoveDefinition(string name) {
|
|
return RemoveDefinition(name, AssemblyCache.SystemWebExtensions);
|
|
}
|
|
|
|
public ScriptResourceDefinition RemoveDefinition(string name, Assembly assembly) {
|
|
if (String.IsNullOrEmpty(name)) {
|
|
throw new ArgumentException(AtlasWeb.Common_NullOrEmpty, "name");
|
|
}
|
|
ScriptResourceDefinition definition;
|
|
assembly = NormalizeAssembly(assembly);
|
|
_definitions.TryRemove(new Tuple<String, Assembly>(name, assembly), out definition);
|
|
return definition;
|
|
}
|
|
|
|
#region IScriptResourceMapping Members
|
|
IScriptResourceDefinition IScriptResourceMapping.GetDefinition(string name) {
|
|
return GetDefinition(name);
|
|
}
|
|
|
|
IScriptResourceDefinition IScriptResourceMapping.GetDefinition(string name, Assembly assembly) {
|
|
return GetDefinition(name, assembly);
|
|
}
|
|
#endregion
|
|
|
|
private static Assembly NormalizeAssembly(Assembly assembly) {
|
|
if ((assembly != null) && AssemblyCache.IsAjaxFrameworkAssembly(assembly)) {
|
|
assembly = null;
|
|
}
|
|
return assembly;
|
|
}
|
|
}
|
|
}
|