using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Configuration;
using umbraco.presentation.ClientDependency.Providers;
using System.Configuration.Provider;
using System.IO;
using System.Web;
namespace umbraco.presentation.ClientDependency.Config
{
public class ClientDependencySettings
{
private ClientDependencySettings()
{
LoadProviders();
}
///
/// Singleton
///
public static ClientDependencySettings Instance
{
get
{
return m_Settings;
}
}
private static readonly ClientDependencySettings m_Settings = new ClientDependencySettings();
private object m_Lock = new object();
private ClientDependencyProvider m_Provider = null;
private ClientDependencyProviderCollection m_Providers = null;
private List m_Extensions;
private DirectoryInfo m_CompositeFilePath;
///
/// The file extensions of Client Dependencies that are file based as opposed to request based.
/// Any file that doesn't have the extensions listed here will be request based, request based is
/// more overhead for the server to process.
///
///
/// A request based JavaScript file may be a .ashx that dynamically creates JavaScript server side.
///
///
/// If this is not explicitly set, then the extensions 'js' and 'css' are the defaults.
///
public List FileBasedDependencyExtensionList
{
get
{
return m_Extensions;
}
}
public ClientDependencyProvider DefaultProvider
{
get
{
return m_Provider;
}
}
public ClientDependencyProviderCollection ProviderCollection
{
get
{
return m_Providers;
}
}
public DirectoryInfo CompositeFilePath
{
get
{
return m_CompositeFilePath;
}
}
private void LoadProviders()
{
if (m_Provider == null)
{
lock (m_Lock)
{
// Do this again to make sure _provider is still null
if (m_Provider == null)
{
ClientDependencySection section = (ClientDependencySection)WebConfigurationManager.GetSection("system.web/clientDependency");
m_Providers = new ClientDependencyProviderCollection();
// if there is no section found, then add the standard providers to the collection with the standard
// default provider
if (section != null)
{
// Load registered providers and point _provider to the default provider
ProvidersHelper.InstantiateProviders(section.Providers, m_Providers, typeof(ClientDependencyProvider));
}
else
{
//create a new section with the default settings
section = new ClientDependencySection();
PageHeaderProvider php = new PageHeaderProvider();
php.Initialize(PageHeaderProvider.DefaultName, null);
m_Providers.Add(php);
ClientSideRegistrationProvider csrp = new ClientSideRegistrationProvider();
csrp.Initialize(ClientSideRegistrationProvider.DefaultName, null);
m_Providers.Add(csrp);
}
//set the default
m_Provider = m_Providers[section.DefaultProvider];
if (m_Provider == null)
throw new ProviderException("Unable to load default ClientDependency provider");
m_Extensions = section.FileBasedDependencyExtensionList;
m_CompositeFilePath = new DirectoryInfo(HttpContext.Current.Server.MapPath(section.CompositeFilePath));
}
}
}
}
}
}