/// <summary>
 /// Loads the associated Assembly
 /// </summary>
 /// <returns>Assembly reference</returns>
 public Assembly LoadAssembly()
 {
     //if (!LoadedAssembly.ContainsKey(_assembly))
     //    LoadedAssembly.Add(_assembly, Assembly.Load(_assembly));
     //return LoadedAssembly[_assembly];
     return(ToolkitScriptManagerHelper.GetAssembly(_assembly));
 }
Esempio n. 2
0
        /// <summary>
        /// Get all types of controls referenced by control bundle names.
        /// If control bundle names is empty then default control bundle defined in AjaxControlToolkit.config will be use to retrieved control types.
        /// If AjaxControlToolkit.config file is not found then all standard control types of AjaxControlToolkit will be retrieved and if control bundle names is defined exception will thrown.
        /// </summary>
        /// <param name="context">Current HttpContext.</param>
        /// <param name="bundles">Control bundle names. Will be ignored if AjaxControlToolkit.config file is not found.</param>
        /// <returns></returns>
        public virtual List <Type> GetControlTypesInBundles(HttpContextBase context, string[] bundles, out ScriptReference[] addedScriptReferences, out ScriptReference[] removedScriptReferences)
        {
            var registeredControls = new List <Type>();
            var registeredBundles  = new List <string>();
            var fileName           = context.Server.MapPath(ConfigFileName);

            addedScriptReferences   = null;
            removedScriptReferences = null;

            if (!File.Exists(fileName))
            {
                // No configuration config (AjaxControlToolkit.config) is specified

                // Bundle names specified, but AjaxControlToolkit.config is not provided then exception should be thrown
                if (bundles != null && bundles.Length > 0)
                {
                    throw new Exception("Can not resolve requested control bundle since " + ConfigFileName +
                                        " file is not defined.");
                }

                // Parse all controls type name in ControlDependencyTypeMaps
                var allControlTypesName = new List <string>();
                foreach (var map in ControlDependencyTypeMaps)
                {
                    allControlTypesName.AddRange(map.Value);
                }

                // Load all AjaxControlToolkit controls if there is no bundle specified neither the config file
                registeredControls.AddRange(allControlTypesName.Select(c => Type.GetType(c))
                                            .ToList());
            }
            else
            {
                var actConfig = ParseConfiguration(fileName);
                if (actConfig.ScriptsSections != null && actConfig.ScriptsSections.Length > 0)
                {
                    var addScripts    = new List <ScriptReference>();
                    var removeScripts = new List <ScriptReference>();
                    var actAssembly   = Assembly.GetCallingAssembly().ToString();

                    foreach (var scriptsSection in actConfig.ScriptsSections)
                    {
                        if (scriptsSection.AddScripts != null)
                        {
                            foreach (var script in scriptsSection.AddScripts)
                            {
                                addScripts.Add(new ScriptReference(script.Name,
                                                                   string.IsNullOrEmpty(script.Assembly) ? actAssembly : script.Assembly));
                            }
                        }

                        if (scriptsSection.RemoveScripts != null)
                        {
                            foreach (var script in scriptsSection.RemoveScripts)
                            {
                                removeScripts.Add(new ScriptReference(script.Name,
                                                                      string.IsNullOrEmpty(script.Assembly) ? actAssembly : script.Assembly));
                            }
                        }
                    }

                    addedScriptReferences   = addScripts.ToArray();
                    removedScriptReferences = removeScripts.ToArray();
                }

                if (actConfig.ControlBundleSections != null && actConfig.ControlBundleSections.Length > 0)
                {
                    // Iterate all control bundle sections. Normaly, there will be only 1 section.
                    foreach (var bundle in actConfig.ControlBundleSections)
                    {
                        if (bundle != null && bundle.ControlBundles != null && bundle.ControlBundles.Length > 0)
                        {
                            // Iterate all control bundles in a section.
                            foreach (var controlBundle in bundle.ControlBundles)
                            {
                                // Only add control types if ...
                                if (

                                    // ... bundle contains control(s) and ...
                                    (controlBundle.Controls != null && controlBundle.Controls.Length > 0) && (

                                        // ... this is default control bundle and requested bundle not specified.
                                        (string.IsNullOrEmpty(controlBundle.Name) &&
                                         (bundles == null || bundles.Length == 0)) ||

                                        // .. or this is not default bundle and its specified in requested bundle
                                        (bundles != null && bundles.Contains(controlBundle.Name))
                                        ))
                                {
                                    // Iterate all controls registered in control bundle. Determining control types is works here.
                                    foreach (var control in controlBundle.Controls)
                                    {
                                        if (string.IsNullOrEmpty(control.Assembly) ||
                                            control.Assembly == "AjaxControlToolkit")
                                        {
                                            // Processing AjaxControlToolkit controls
                                            var controlName = "AjaxControlToolkit." + control.Name;

                                            // Verify that control is a standard AjaxControlToolkit control
                                            if (!ControlDependencyTypeMaps.ContainsKey(controlName))
                                            {
                                                throw new Exception(
                                                          string.Format(
                                                              "Could not find control '{0}'. Please make sure you entered the correct control name in AjaxControlToolkit.config file.",
                                                              control.Name));
                                            }

                                            registeredControls.AddRange(ControlDependencyTypeMaps[controlName]
                                                                        .Select(c => Type.GetType(c)));
                                        }
                                        else
                                        {
                                            // Processing custom controls
                                            registeredControls.Add(
                                                ToolkitScriptManagerHelper.GetAssembly(control.Assembly)
                                                .GetType(control.Assembly + "." + control.Name));
                                        }
                                    }

                                    // Mark that bundle is registered for future verification
                                    registeredBundles.Add(controlBundle.Name);
                                }
                            }
                        }
                    }
                }

                // Verify, is there any control in bundle that not registered yet
                if (bundles != null)
                {
                    foreach (var bundle in bundles)
                    {
                        if (!registeredBundles.Contains(bundle))
                        {
                            throw new Exception(string.Format("Could not resolve bundle {0}.", bundle));
                        }
                    }
                }
            }

            // Return unique types
            return(registeredControls.Distinct().ToList());
        }
 protected static void AppendCharAsUnicode(StringBuilder builder, char c)
 {
     ToolkitScriptManagerHelper.AppendCharAsUnicode(builder, c);
 }
 protected static string QuoteString(string value)
 {
     return(ToolkitScriptManagerHelper.QuoteString(value));
 }
        /// <summary>
        /// Outputs the combined script file requested by the HttpRequest to the HttpResponse
        /// </summary>
        /// <param name="context">HttpContext for the transaction</param>
        /// <returns>true if the script file was output</returns>
        public bool OutputCombinedScriptFile(HttpContextBase context)
        {
            // Initialize
            var request = context.Request;

            // Determine is there any combine script request in http context
            var combinedScripts = ToolkitScriptManagerHelper.GetRequestParamValue(request,
                                                                                  ToolkitScriptManager.CombinedScriptsParamName);

            if (string.IsNullOrEmpty(combinedScripts))
            {
                return(false);
            }

            // This is a request for a combined script file
            var response = context.Response;

            response.ContentType = "application/x-javascript";

            var cache = response.Cache;

            // Set the same (~forever) caching rules that ScriptResource.axd uses
            cache.SetCacheability(HttpCacheability.Public);
            cache.VaryByParams[ToolkitScriptManager.CombinedScriptsParamName] = true;
            cache.VaryByParams[ToolkitScriptManager.HiddenFieldParamName]     = true;
            cache.VaryByParams[ToolkitScriptManager.CacheBustParamName]       = true;
            cache.VaryByParams[ToolkitScriptManager.EnableCdnParamName]       = true;
            cache.SetOmitVaryStar(true);
            cache.SetExpires(DateTime.Now.AddDays(365));
            cache.SetValidUntilExpires(true);
            cache.SetLastModifiedFromFileDependencies();

            // Get the stream to write the combined script to (using a compressed stream if requested)
            // Note that certain versions of IE6 have difficulty with compressed responses, so we
            // don't compress for those browsers (just like ASP.NET AJAX's ScriptResourceHandler)
            var outputStream = response.OutputStream;

            if (!request.Browser.IsBrowser("IE") || (6 < request.Browser.MajorVersion))
            {
                foreach (
                    string acceptEncoding in (request.Headers["Accept-Encoding"] ?? "").ToUpperInvariant().Split(','))
                {
                    if ("GZIP" == acceptEncoding)
                    {
                        // Browser wants GZIP; wrap the output stream with a GZipStream
                        response.AddHeader("Content-encoding", "gzip");
                        outputStream = new GZipStream(outputStream, CompressionMode.Compress);
                        break;
                    }

                    if ("DEFLATE" == acceptEncoding)
                    {
                        // Browser wants Deflate; wrap the output stream with a DeflateStream
                        response.AddHeader("Content-encoding", "deflate");
                        outputStream = new DeflateStream(outputStream, CompressionMode.Compress);
                        break;
                    }
                }
            }


            // Output the combined script
            using (var outputWriter = new StreamWriter(outputStream)) {
                var hash = ToolkitScriptManagerHelper.GetRequestParamValue(request,
                                                                           ToolkitScriptManager.CacheBustParamName);
                var bundlesParam = ToolkitScriptManagerHelper.GetRequestParamValue(request,
                                                                                   ToolkitScriptManager.ControlBundleParamName);
                var enableCdn = bool.Parse(ToolkitScriptManagerHelper.GetRequestParamValue(request, ToolkitScriptManager.EnableCdnParamName));

                string[] bundles = null;
                if (!string.IsNullOrEmpty(bundlesParam))
                {
                    bundles = bundlesParam.Split(new[] { ToolkitScriptManager.QueryStringBundleDelimiter },
                                                 StringSplitOptions.RemoveEmptyEntries);
                }

                var js = GetCombinedScriptContent(context, hash, bundles, enableCdn);


                var minifyResult = _helper.MinifyJS(js);
                if (minifyResult.ErrorList.Count > 0)
                {
                    _helper.WriteErrors(outputWriter, minifyResult.ErrorList);
                }
                else
                {
                    // Write minified scripts
                    _helper.WriteToStream(outputWriter, minifyResult.Result);
                    // Write the ASP.NET AJAX script notification code
                    _helper.WriteToStream(outputWriter,
                                          "if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();");
                }
            }
            return(true);
        }
 /// <summary>
 /// Helper class to provide combine and minification for ToolkitScriptManager.
 /// This API supports the AjaxControlToolkit infrastructure and is not intended to be used directly from your code.
 /// </summary>
 /// <param name="toolkitScriptManagerConfig"></param>
 /// <param name="helper"></param>
 public ToolkitScriptManagerCombiner(ToolkitScriptManagerConfig toolkitScriptManagerConfig,
                                     ToolkitScriptManagerHelper helper)
 {
     _scriptManagerConfig = toolkitScriptManagerConfig;
     _helper = helper;
 }
        /// <summary>
        /// Writes scripts (including localized script resources) to the specified stream
        /// </summary>
        /// <param name="scriptEntries">list of scripts to write</param>
        /// <param name="outputWriter">writer for output stream</param>
        private void WriteScripts(List <ScriptEntry> scriptEntries, TextWriter outputWriter, bool enableCdn)
        {
            foreach (ScriptEntry scriptEntry in scriptEntries)
            {
                if (!scriptEntry.Loaded)
                {
                    var combineStatus = IsScriptCombinable(scriptEntry, enableCdn);

                    if (combineStatus == ScriptCombineStatus.NotCorrespondingWebResourceAttribute)
                    {
                        throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture,
                                                                      "Combined script request includes uncombinable script \"{0}\".",
                                                                      scriptEntry.Name));
                    }

                    if (combineStatus == ScriptCombineStatus.Combineable)
                    {
                        // This script hasn't been loaded by the browser, so add it to the combined script file
                        string script = scriptEntry.GetScript();
                        if (WebResourceRegex.IsMatch(script))
                        {
                            // This script uses script substitution which isn't supported yet, so throw an exception since it's too late to fix
                            throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture,
                                                                          "ToolkitScriptManager does not support <%= WebResource/ScriptResource(...) %> substitution as used by script file \"{0}\".",
                                                                          scriptEntry.Name));
                        }
                        outputWriter.WriteLine(script);

                        // Save current culture and set the specified culture
                        CultureInfo currentUiCulture = Thread.CurrentThread.CurrentUICulture;
                        try {
                            try {
                                Thread.CurrentThread.CurrentUICulture = new CultureInfo(scriptEntry.Culture);
                            }
                            catch (ArgumentException) {
                                // Invalid culture; proceed with default culture (just as for unsupported cultures)
                            }

                            // Write out the associated script resources (if any) in the proper culture
                            Assembly scriptAssembly = scriptEntry.LoadAssembly();
                            foreach (
                                ScriptResourceAttribute scriptResourceAttribute in
                                GetScriptResourceAttributes(scriptAssembly))
                            {
                                if (scriptResourceAttribute.ScriptName == scriptEntry.Name)
                                {
#pragma warning disable 0618 // obsolete members of ScriptResourceAttribute are used but necessary in the 3.5 build
                                    // Found a matching script resource; write it out
                                    outputWriter.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0}={{",
                                                                         scriptResourceAttribute.TypeName));

                                    // Get the script resource name (without the trailing ".resources")
                                    string scriptResourceName = scriptResourceAttribute.ScriptResourceName;
                                    if (scriptResourceName.EndsWith(".resources", StringComparison.OrdinalIgnoreCase))
                                    {
                                        scriptResourceName = scriptResourceName.Substring(0,
                                                                                          scriptResourceName.Length - 10);
                                    }
#pragma warning restore 0618

                                    // Load a ResourceManager/ResourceSet and walk through the list to output them all
                                    System.Resources.ResourceManager resourceManager =
                                        new System.Resources.ResourceManager(scriptResourceName, scriptAssembly);
                                    using (
                                        System.Resources.ResourceSet resourceSet =
                                            resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, true)) {
                                        bool first = true;
                                        foreach (System.Collections.DictionaryEntry de in resourceSet)
                                        {
                                            if (!first)
                                            {
                                                // Need a comma between all entries
                                                outputWriter.Write(",");
                                            }
                                            // Output the entry
                                            string name  = (string)de.Key;
                                            string value = resourceManager.GetString(name);
                                            outputWriter.Write(string.Format(CultureInfo.InvariantCulture,
                                                                             "\"{0}\":\"{1}\"", ToolkitScriptManagerHelper.QuoteString(name),
                                                                             ToolkitScriptManagerHelper.QuoteString(value)));
                                            first = false;
                                        }
                                    }
                                    outputWriter.WriteLine("};");
                                }
                            }
                        }
                        finally {
                            // Restore culture
                            Thread.CurrentThread.CurrentUICulture = currentUiCulture;
                        }

                        // Done with this script
                        // This script is now (or will be soon) loaded by the browser
                        scriptEntry.Loaded = true;
                    }
                }
            }
        }
        /// <summary>
        /// Get all types of controls referenced by control bundle names.
        /// If control bundle names is empty then default control bundle defined in AjaxControlToolkit.config will be use to retrieved control types.
        /// If AjaxControlToolkit.config file is not found then all standard control types of AjaxControlToolkit will be retrieved and if control bundle names is defined exception will thrown.
        /// </summary>
        /// <param name="context">Current HttpContext.</param>
        /// <param name="bundles">Control bundle names. Will be ignored if AjaxControlToolkit.config file is not found.</param>
        /// <returns></returns>
        public virtual List <Type> GetControlTypesInBundles(HttpContextBase context, string[] bundles)
        {
            var registeredControls = new List <Type>();
            var registeredBundles  = new List <string>();
            var fileName           = context.Server.MapPath(ConfigFileName);

            if (!File.Exists(fileName))
            {
                // No configuration config (AjaxControlToolkit.config) is specified

                // Bundle names specified, but AjaxControlToolkit.config is not provided then exception should be thrown
                if (bundles != null && bundles.Length > 0)
                {
                    throw new Exception("Can not resolve requested control bundle since " + ConfigFileName +
                                        " file is not defined.");
                }

                // Parse all controls type name in ControlDependencyTypeMaps
                var allControlTypesName = new List <string>();
                foreach (var map in ControlDependencyTypeMaps)
                {
                    allControlTypesName.AddRange(map.Value);
                }

                // Load all AjaxControlToolkit controls if there is no bundle specified neither the config file
                registeredControls.AddRange(allControlTypesName.Select(c => Type.GetType(c))
                                            .ToList());
            }
            else
            {
                // Bundle configuration (AjaxControlToolkit.config) specified
                // Try read config content from cache
                var configContent = _cacheProvider.Get <string>(CacheConfigName);
                if (string.IsNullOrEmpty(configContent))
                {
                    using (StreamReader sr = File.OpenText(fileName)) {
                        // Retrieve config content from file and caching it
                        configContent = sr.ReadToEnd();
                        _cacheProvider.Set(CacheConfigName, configContent, fileName);
                    }
                }

                // Deserialize bundle configuration
                var bundleConfig = (Config.Settings)(new XmlSerializer(typeof(Config.Settings)))
                                   .Deserialize(new StringReader(configContent));

                // Iterate all control bundle sections. Normaly, there will be only 1 section.
                foreach (var bundle in bundleConfig.ControlBundleSections)
                {
                    // Iterate all control bundles in a section.
                    foreach (var controlBundle in bundle.ControlBundles)
                    {
                        // Only add control types if ...
                        if (
                            // ... this is default control bundle and requested bundle not specified.
                            (string.IsNullOrEmpty(controlBundle.Name) && (bundles == null || bundles.Length == 0)) ||

                            // .. or this is not default bundle and its specified in requested bundle
                            (bundles != null && bundles.Contains(controlBundle.Name)))
                        {
                            // Iterate all controls registered in control bundle. Determining control types is works here.
                            foreach (var control in controlBundle.Controls)
                            {
                                if (string.IsNullOrEmpty(control.Assembly) || control.Assembly == "AjaxControlToolkit")
                                {
                                    // Processing AjaxControlToolkit controls
                                    var controlName = "AjaxControlToolkit." + control.Name;

                                    // Verify that control is a standard AjaxControlToolkit control
                                    if (!ControlDependencyTypeMaps.ContainsKey(controlName))
                                    {
                                        throw new Exception(
                                                  string.Format(
                                                      "Could not find control '{0}'. Please make sure you entered the correct control name in AjaxControlToolkit.config file.",
                                                      control.Name));
                                    }

                                    registeredControls.AddRange(ControlDependencyTypeMaps[controlName]
                                                                .Select(c => Type.GetType(c)));
                                }
                                else
                                {
                                    // Processing custom controls
                                    registeredControls.Add(
                                        ToolkitScriptManagerHelper.GetAssembly(control.Assembly)
                                        .GetType(control.Assembly + "." + control.Name));
                                }
                            }

                            // Mark that bundle is registered for future verification
                            registeredBundles.Add(controlBundle.Name);
                        }
                    }
                }

                // Verify, is there any control in bundle that not registered yet
                if (bundles != null)
                {
                    foreach (var bundle in bundles)
                    {
                        if (!registeredBundles.Contains(bundle))
                        {
                            throw new Exception(string.Format("Could not resolve bundle {0}.", bundle));
                        }
                    }
                }
            }

            // Return unique types
            return(registeredControls.Distinct().ToList());
        }