diff --git a/src/Umbraco.ModelsBuilder/BackOffice/DashboardReport.cs b/src/Umbraco.ModelsBuilder/BackOffice/DashboardReport.cs index 57afeaf069..85f7030eff 100644 --- a/src/Umbraco.ModelsBuilder/BackOffice/DashboardReport.cs +++ b/src/Umbraco.ModelsBuilder/BackOffice/DashboardReport.cs @@ -8,19 +8,21 @@ namespace Umbraco.ModelsBuilder.BackOffice internal class DashboardReport { private readonly IModelsBuilderConfig _config; - private readonly ModelsGenerator _modelsGenerator; + private readonly OutOfDateModelsStatus _outOfDateModels; + private readonly ModelsGenerationError _mbErrors; - public DashboardReport(IModelsBuilderConfig config, ModelsGenerator modelsGenerator) + public DashboardReport(IModelsBuilderConfig config, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors) { _config = config; - _modelsGenerator = modelsGenerator; + _outOfDateModels = outOfDateModels; + _mbErrors = mbErrors; } public bool CanGenerate() => _config.ModelsMode.SupportsExplicitGeneration(); - public bool AreModelsOutOfDate() => OutOfDateModelsStatus.IsOutOfDate; + public bool AreModelsOutOfDate() => _outOfDateModels.IsOutOfDate; - public string LastError() => _modelsGenerator.GetLastError(); + public string LastError() => _mbErrors.GetLastError(); public string Text() { diff --git a/src/Umbraco.ModelsBuilder/BackOffice/ModelsBuilderBackOfficeController.cs b/src/Umbraco.ModelsBuilder/BackOffice/ModelsBuilderBackOfficeController.cs index 561da0a3d6..6092c9678b 100644 --- a/src/Umbraco.ModelsBuilder/BackOffice/ModelsBuilderBackOfficeController.cs +++ b/src/Umbraco.ModelsBuilder/BackOffice/ModelsBuilderBackOfficeController.cs @@ -28,14 +28,18 @@ namespace Umbraco.ModelsBuilder.BackOffice { private readonly IModelsBuilderConfig _config; private readonly ModelsGenerator _modelGenerator; + private readonly OutOfDateModelsStatus _outOfDateModels; + private readonly ModelsGenerationError _mbErrors; private readonly DashboardReport _dashboardReport; - public ModelsBuilderBackOfficeController(IModelsBuilderConfig config, ModelsGenerator modelsGenerator) + public ModelsBuilderBackOfficeController(IModelsBuilderConfig config, ModelsGenerator modelsGenerator, OutOfDateModelsStatus outOfDateModels, ModelsGenerationError mbErrors) { //_umbracoServices = umbracoServices; _config = config; _modelGenerator = modelsGenerator; - _dashboardReport = new DashboardReport(config, modelsGenerator); + _outOfDateModels = outOfDateModels; + _mbErrors = mbErrors; + _dashboardReport = new DashboardReport(config, outOfDateModels, mbErrors); } // invoked by the dashboard @@ -60,11 +64,11 @@ namespace Umbraco.ModelsBuilder.BackOffice // EnableDllModels will recycle the app domain - but this request will end properly _modelGenerator.GenerateModels(); - _modelGenerator.ClearErrors(); + _mbErrors.Clear(); } catch (Exception e) { - _modelGenerator.ReportError("Failed to build models.", e); + _mbErrors.Report("Failed to build models.", e); } return Request.CreateResponse(HttpStatusCode.OK, GetDashboardResult(), Configuration.Formatters.JsonFormatter); @@ -75,8 +79,8 @@ namespace Umbraco.ModelsBuilder.BackOffice [System.Web.Http.HttpGet] // use the http one, not mvc, with api controllers! public HttpResponseMessage GetModelsOutOfDateStatus() { - var status = OutOfDateModelsStatus.IsEnabled - ? OutOfDateModelsStatus.IsOutOfDate + var status = _outOfDateModels.IsEnabled + ? _outOfDateModels.IsOutOfDate ? new OutOfDateStatus { Status = OutOfDateType.OutOfDate } : new OutOfDateStatus { Status = OutOfDateType.Current } : new OutOfDateStatus { Status = OutOfDateType.Unknown }; diff --git a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComponent.cs b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComponent.cs index 6a9b8e1115..6deeda40a6 100644 --- a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComponent.cs +++ b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComponent.cs @@ -22,11 +22,13 @@ namespace Umbraco.ModelsBuilder.Compose private readonly IModelsBuilderConfig _config; private readonly LiveModelsProvider _liveModelsProvider; + private readonly OutOfDateModelsStatus _outOfDateModels; - public ModelsBuilderComponent(IModelsBuilderConfig config, LiveModelsProvider liveModelsProvider) + public ModelsBuilderComponent(IModelsBuilderConfig config, LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels) { _config = config; _liveModelsProvider = liveModelsProvider; + _outOfDateModels = outOfDateModels; } public void Initialize() @@ -39,13 +41,11 @@ namespace Umbraco.ModelsBuilder.Compose FileService.SavingTemplate += FileService_SavingTemplate; - // fixme LiveModelsProvider should not be static if (_config.ModelsMode.IsLiveNotPure()) _liveModelsProvider.Install(); - // fixme OutOfDateModelsStatus should not be static if (_config.FlagOutOfDateModels) - OutOfDateModelsStatus.Install(); + _outOfDateModels.Install(); } public void Terminate() diff --git a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComposer.cs b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComposer.cs index 71250b2eb6..f2b09903f3 100644 --- a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComposer.cs +++ b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderComposer.cs @@ -20,6 +20,8 @@ namespace Umbraco.ModelsBuilder.Compose composition.Configs.Add(() => new ModelsBuilderConfig()); composition.RegisterUnique(); composition.RegisterUnique(); + composition.RegisterUnique(); + composition.RegisterUnique(); if (composition.Configs.ModelsBuilder().ModelsMode == ModelsMode.PureLive) ComposeForLiveModels(composition); diff --git a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderInitializer.cs b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderInitializer.cs index 63f2336ebf..6eb8bbb328 100644 --- a/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderInitializer.cs +++ b/src/Umbraco.ModelsBuilder/Compose/ModelsBuilderInitializer.cs @@ -6,7 +6,7 @@ using Umbraco.ModelsBuilder.Compose; namespace Umbraco.ModelsBuilder.Compose { - internal static class ModelsBuilderInitializer + public static class ModelsBuilderInitializer { public static void Initialize() { diff --git a/src/Umbraco.ModelsBuilder/ConfigsExtensions.cs b/src/Umbraco.ModelsBuilder/ConfigsExtensions.cs index c989be5aca..09314bc3f3 100644 --- a/src/Umbraco.ModelsBuilder/ConfigsExtensions.cs +++ b/src/Umbraco.ModelsBuilder/ConfigsExtensions.cs @@ -14,7 +14,7 @@ namespace Umbraco.ModelsBuilder /// Getting the models builder configuration freezes its state, /// and any attempt at modifying the configuration using the Setup method /// will be ignored. - public static ModelsBuilderConfig ModelsBuilder(this Configs configs) - => configs.GetConfig(); + public static IModelsBuilderConfig ModelsBuilder(this Configs configs) + => configs.GetConfig(); } -} \ No newline at end of file +} diff --git a/src/Umbraco.ModelsBuilder/Configuration/ModelsBuilderConfig.cs b/src/Umbraco.ModelsBuilder/Configuration/ModelsBuilderConfig.cs index caff5001a4..48a4423054 100644 --- a/src/Umbraco.ModelsBuilder/Configuration/ModelsBuilderConfig.cs +++ b/src/Umbraco.ModelsBuilder/Configuration/ModelsBuilderConfig.cs @@ -25,7 +25,7 @@ namespace Umbraco.ModelsBuilder.Configuration // ensure defaults are initialized for tests ModelsNamespace = DefaultModelsNamespace; - ModelsDirectory = IOHelper.MapPath("~/"); + ModelsDirectory = IOHelper.MapPath(DefaultModelsDirectory); DebugLevel = 0; // mode diff --git a/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProvider.cs b/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProvider.cs index 146e837dd9..19a725f85a 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProvider.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProvider.cs @@ -19,15 +19,17 @@ namespace Umbraco.ModelsBuilder.Umbraco private readonly ILogger _logger; private readonly IModelsBuilderConfig _config; private readonly ModelsGenerator _modelGenerator; + private readonly ModelsGenerationError _mbErrors; // we do not manage pure live here internal bool IsEnabled => _config.ModelsMode.IsLiveNotPure(); - public LiveModelsProvider(ILogger logger, IModelsBuilderConfig config, ModelsGenerator modelGenerator) + public LiveModelsProvider(ILogger logger, IModelsBuilderConfig config, ModelsGenerator modelGenerator, ModelsGenerationError mbErrors) { _logger = logger; _config = config ?? throw new ArgumentNullException(nameof(config)); _modelGenerator = modelGenerator; + _mbErrors = mbErrors; } internal void Install() @@ -82,7 +84,7 @@ namespace Umbraco.ModelsBuilder.Umbraco _mutex.WaitOne(timeout); // wait until it is safe, and acquire _logger.Info("Generate models now."); GenerateModels(); - _modelGenerator.ClearErrors(); + _mbErrors.Clear(); _logger.Info("Generated."); } catch (TimeoutException) @@ -91,7 +93,7 @@ namespace Umbraco.ModelsBuilder.Umbraco } catch (Exception e) { - _modelGenerator.ReportError("Failed to build Live models.", e); + _mbErrors.Report("Failed to build Live models.", e); _logger.Error("Failed to generate models.", e); } finally diff --git a/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProviderModule.cs b/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProviderModule.cs index 1dadbd41b6..aae01ea75c 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProviderModule.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/LiveModelsProviderModule.cs @@ -22,11 +22,14 @@ namespace Umbraco.ModelsBuilder.Umbraco private void App_EndRequest(object sender, EventArgs e) { + if (((HttpApplication)sender).Request.Url.IsClientSideRequest()) + return; + // here we're using "Current." since we're in a module, it is possible in a round about way to inject into a module but for now we'll just use Current if (_liveModelsProvider == null) - _liveModelsProvider = Current.Factory.GetInstance(); + _liveModelsProvider = Current.Factory.TryGetInstance(); // will be null in upgrade mode - if (_liveModelsProvider.IsEnabled) + if (_liveModelsProvider?.IsEnabled ?? false) _liveModelsProvider.GenerateModelsIfRequested(sender, e); } diff --git a/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerationError.cs b/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerationError.cs index a7cb1e11c3..3f96d2ccdf 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerationError.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerationError.cs @@ -6,7 +6,7 @@ using Umbraco.ModelsBuilder.Configuration; namespace Umbraco.ModelsBuilder.Umbraco { - internal class ModelsGenerationError + public sealed class ModelsGenerationError { private readonly IModelsBuilderConfig _config; diff --git a/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerator.cs b/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerator.cs index 4e3607c156..5ef86b50ca 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerator.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/ModelsGenerator.cs @@ -12,13 +12,13 @@ namespace Umbraco.ModelsBuilder.Umbraco { private readonly UmbracoServices _umbracoService; private readonly IModelsBuilderConfig _config; - private readonly ModelsGenerationError _errors; + private readonly OutOfDateModelsStatus _outOfDateModels; - public ModelsGenerator(UmbracoServices umbracoService, IModelsBuilderConfig config) + public ModelsGenerator(UmbracoServices umbracoService, IModelsBuilderConfig config, OutOfDateModelsStatus outOfDateModels) { _umbracoService = umbracoService; _config = config; - _errors = new ModelsGenerationError(config); + _outOfDateModels = outOfDateModels; } internal void GenerateModels() @@ -52,12 +52,7 @@ namespace Umbraco.ModelsBuilder.Umbraco "; */ - OutOfDateModelsStatus.Clear(); + _outOfDateModels.Clear(); } - - internal void ClearErrors() => _errors.Clear(); - internal void ReportError(string message, Exception e) => _errors.Report(message, e); - internal string GetLastError() => _errors.GetLastError(); - } } diff --git a/src/Umbraco.ModelsBuilder/Umbraco/OutOfDateModelsStatus.cs b/src/Umbraco.ModelsBuilder/Umbraco/OutOfDateModelsStatus.cs index 3326379871..a72ccd2fa2 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/OutOfDateModelsStatus.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/OutOfDateModelsStatus.cs @@ -7,53 +7,53 @@ namespace Umbraco.ModelsBuilder.Umbraco { public sealed class OutOfDateModelsStatus { - public OutOfDateModelsStatus() - { + private readonly IModelsBuilderConfig _config; + public OutOfDateModelsStatus(IModelsBuilderConfig config) + { + _config = config; } - private static ModelsBuilderConfig Config => Current.Configs.ModelsBuilder(); - - internal static void Install() + internal void Install() { // just be sure - if (Config.FlagOutOfDateModels == false) + if (_config.FlagOutOfDateModels == false) return; ContentTypeCacheRefresher.CacheUpdated += (sender, args) => Write(); DataTypeCacheRefresher.CacheUpdated += (sender, args) => Write(); } - private static string GetFlagPath() + private string GetFlagPath() { - var modelsDirectory = Config.ModelsDirectory; + var modelsDirectory = _config.ModelsDirectory; if (!Directory.Exists(modelsDirectory)) Directory.CreateDirectory(modelsDirectory); return Path.Combine(modelsDirectory, "ood.flag"); } - private static void Write() + private void Write() { var path = GetFlagPath(); if (path == null || File.Exists(path)) return; File.WriteAllText(path, "THIS FILE INDICATES THAT MODELS ARE OUT-OF-DATE\n\n"); } - public static void Clear() + public void Clear() { - if (Config.FlagOutOfDateModels == false) return; + if (_config.FlagOutOfDateModels == false) return; var path = GetFlagPath(); if (path == null || !File.Exists(path)) return; File.Delete(path); } - public static bool IsEnabled => Config.FlagOutOfDateModels; + public bool IsEnabled => _config.FlagOutOfDateModels; - public static bool IsOutOfDate + public bool IsOutOfDate { get { - if (Config.FlagOutOfDateModels == false) return false; + if (_config.FlagOutOfDateModels == false) return false; var path = GetFlagPath(); return path != null && File.Exists(path); } diff --git a/src/Umbraco.ModelsBuilder/Umbraco/PublishedModelUtility.cs b/src/Umbraco.ModelsBuilder/Umbraco/PublishedModelUtility.cs index 44b7aae0c0..2a8022bef8 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/PublishedModelUtility.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/PublishedModelUtility.cs @@ -41,14 +41,6 @@ namespace Umbraco.ModelsBuilder.Umbraco } } - [Obsolete("Use the overload taking IPublishedContentType instead")] - [EditorBrowsable(EditorBrowsableState.Never)] - public static IPublishedPropertyType GetModelPropertyType(PublishedContentType contentType, - Expression> selector) - { - return GetModelPropertyType((IPublishedContentType)contentType, selector); - } - public static IPublishedPropertyType GetModelPropertyType(IPublishedContentType contentType, Expression> selector) //where TModel : PublishedContentModel // fixme PublishedContentModel _or_ PublishedElementModel { diff --git a/src/Umbraco.ModelsBuilder/Umbraco/PureLiveModelFactory.cs b/src/Umbraco.ModelsBuilder/Umbraco/PureLiveModelFactory.cs index 0f888cc428..464ce92ef5 100644 --- a/src/Umbraco.ModelsBuilder/Umbraco/PureLiveModelFactory.cs +++ b/src/Umbraco.ModelsBuilder/Umbraco/PureLiveModelFactory.cs @@ -35,7 +35,7 @@ namespace Umbraco.ModelsBuilder.Umbraco private int _ver, _skipver; private readonly int _debugLevel; private BuildManager _theBuildManager; - private readonly Lazy _umbracoServices; + private readonly Lazy _umbracoServices; // fixme: this is because of circular refs :( private UmbracoServices UmbracoServices => _umbracoServices.Value; private static readonly Regex AssemblyVersionRegex = new Regex("AssemblyVersion\\(\"[0-9]+.[0-9]+.[0-9]+.[0-9]+\"\\)", RegexOptions.Compiled); @@ -43,14 +43,14 @@ namespace Umbraco.ModelsBuilder.Umbraco private static readonly string[] OurFiles = { "models.hash", "models.generated.cs", "all.generated.cs", "all.dll.path", "models.err" }; private readonly IModelsBuilderConfig _config; - private readonly ModelsGenerator _modelGenerator; + private readonly ModelsGenerationError _errors; - public PureLiveModelFactory(Lazy umbracoServices, IProfilingLogger logger, IModelsBuilderConfig config, ModelsGenerator modelGenerator) + public PureLiveModelFactory(Lazy umbracoServices, IProfilingLogger logger, IModelsBuilderConfig config) { _umbracoServices = umbracoServices; _logger = logger; _config = config; - _modelGenerator = modelGenerator; + _errors = new ModelsGenerationError(config); _ver = 1; // zero is for when we had no version _skipver = -1; // nothing to skip @@ -294,7 +294,7 @@ namespace Umbraco.ModelsBuilder.Umbraco var types = assembly.ExportedTypes.Where(x => x.Inherits() || x.Inherits()); _infos = RegisterModels(types); - _modelGenerator.ClearErrors(); + _errors.Clear(); } catch (Exception e) { @@ -302,7 +302,7 @@ namespace Umbraco.ModelsBuilder.Umbraco { _logger.Error("Failed to build models.", e); _logger.Warn("Running without models."); // be explicit - _modelGenerator.ReportError("Failed to build PureLive models.", e); + _errors.Report("Failed to build PureLive models.", e); } finally { @@ -536,6 +536,7 @@ namespace Umbraco.ModelsBuilder.Umbraco throw new InvalidOperationException($"Both types {type.FullName} and {modelInfo.ModelType.FullName} want to be a model type for content type with alias \"{typeName}\"."); // fixme use Core's ReflectionUtilities.EmitCtor !! + // Yes .. DynamicMethod is uber slow var meth = new DynamicMethod(string.Empty, typeof (IPublishedElement), ctorArgTypes, type.Module, true); var gen = meth.GetILGenerator(); gen.Emit(OpCodes.Ldarg_0); diff --git a/src/Umbraco.ModelsBuilder/Validation/ContentTypeModelValidator.cs b/src/Umbraco.ModelsBuilder/Validation/ContentTypeModelValidator.cs index fdae56be0d..d22d146553 100644 --- a/src/Umbraco.ModelsBuilder/Validation/ContentTypeModelValidator.cs +++ b/src/Umbraco.ModelsBuilder/Validation/ContentTypeModelValidator.cs @@ -35,8 +35,6 @@ namespace Umbraco.ModelsBuilder.Validation where TModel: ContentTypeSave where TProperty: PropertyTypeBasic { - private static ModelsBuilderConfig Config => Current.Configs.ModelsBuilder(); - protected override IEnumerable Validate(TModel model) { var properties = model.Groups.SelectMany(x => x.Properties)