using System; using System.Collections.Generic; using System.Linq; using System.Text; using Umbraco.Core.Logging; using Umbraco.Core.ObjectResolution; using Umbraco.Core.Persistence; using Umbraco.Core.PropertyEditors; namespace Umbraco.Core { /// /// A bootstrapper for the Umbraco application which initializes all objects for the Core of the application /// /// /// This does not provide any startup functionality relating to web objects /// internal class CoreBootManager : IBootManager { private DisposableTimer _timer; private bool _isInitialized = false; private bool _isStarted = false; private bool _isComplete = false; protected ApplicationContext ApplicationContext { get; private set; } public virtual IBootManager Initialize() { if (_isInitialized) throw new InvalidOperationException("The boot manager has already been initialized"); LogHelper.Info("Umbraco application starting"); _timer = DisposableTimer.Start(x => LogHelper.Info("Umbraco application startup complete" + " (took " + x + "ms)")); //create the ApplicationContext ApplicationContext = ApplicationContext.Current = new ApplicationContext(); //initialize the DatabaseContext DatabaseContext.Current.Initialize(); InitializeResolvers(); _isInitialized = true; return this; } /// /// Fires after initialization and calls the callback to allow for customizations to occur /// /// /// public virtual IBootManager Startup(Action afterStartup) { if (_isStarted) throw new InvalidOperationException("The boot manager has already been initialized"); if (afterStartup != null) { afterStartup(ApplicationContext.Current); } _isStarted = true; return this; } /// /// Fires after startup and calls the callback once customizations are locked /// /// /// public virtual IBootManager Complete(Action afterComplete) { if (_isComplete) throw new InvalidOperationException("The boot manager has already been completed"); //freeze resolution to not allow Resolvers to be modified Resolution.Freeze(); //stop the timer and log the output _timer.Dispose(); if (afterComplete != null) { afterComplete(ApplicationContext.Current); } _isComplete = true; return this; } /// /// Create the resolvers /// protected virtual void InitializeResolvers() { RepositoryResolver.Current = new RepositoryResolver( new RepositoryFactory()); CacheRefreshersResolver.Current = new CacheRefreshersResolver( PluginManager.Current.ResolveCacheRefreshers()); DataTypesResolver.Current = new DataTypesResolver( PluginManager.Current.ResolveDataTypes()); MacroFieldEditorsResolver.Current = new MacroFieldEditorsResolver( PluginManager.Current.ResolveMacroRenderings()); PackageActionsResolver.Current = new PackageActionsResolver( PluginManager.Current.ResolvePackageActions()); ActionsResolver.Current = new ActionsResolver( PluginManager.Current.ResolveActions()); MacroPropertyTypeResolver.Current = new MacroPropertyTypeResolver( PluginManager.Current.ResolveMacroPropertyTypes()); PropertyEditorValueConvertersResolver.Current = new PropertyEditorValueConvertersResolver( PluginManager.Current.ResolvePropertyEditorValueConverters()); //add the internal ones, these are not public currently so need to add them manually PropertyEditorValueConvertersResolver.Current.AddType(); PropertyEditorValueConvertersResolver.Current.AddType(); PropertyEditorValueConvertersResolver.Current.AddType(); } } }