Merge remote-tracking branch 'origin/netcore/netcore' into feature/8651-config-options-patten

# Conflicts:
#	src/Umbraco.Core/Configuration/ModelsBuilderConfigExtensions.cs
#	src/Umbraco.ModelsBuilder.Embedded/BackOffice/ContentTypeModelValidatorBase.cs
#	src/Umbraco.ModelsBuilder.Embedded/BackOffice/ModelsBuilderDashboardController.cs
#	src/Umbraco.ModelsBuilder.Embedded/Building/ModelsGenerator.cs
#	src/Umbraco.ModelsBuilder.Embedded/Compose/ModelsBuilderComposer.cs
#	src/Umbraco.ModelsBuilder.Embedded/ModelsGenerationError.cs
#	src/Umbraco.ModelsBuilder.Embedded/OutOfDateModelsStatus.cs
#	src/Umbraco.ModelsBuilder.Embedded/PureLiveModelFactory.cs
#	src/Umbraco.Web.BackOffice/Controllers/RedirectUrlManagementController.cs
This commit is contained in:
Bjarke Berg
2020-09-10 14:01:38 +02:00
249 changed files with 6053 additions and 4380 deletions

View File

@@ -1,5 +1,4 @@
using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Composing;
using Umbraco.ModelsBuilder.Embedded.BackOffice;
using Umbraco.Web.Features;

View File

@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.AspNetCore.Routing;
using Umbraco.Configuration;
using Umbraco.Core.Configuration;
using Umbraco.Core.Composing;
@@ -11,9 +9,11 @@ using Umbraco.Core.IO;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
using Umbraco.Core.Strings;
using Umbraco.Extensions;
using Umbraco.ModelsBuilder.Embedded.BackOffice;
using Umbraco.Web;
using Umbraco.Web.Mvc;
using Umbraco.Net;
using Umbraco.Web.Common.Lifetime;
using Umbraco.Web.Common.ModelBinders;
using Umbraco.Web.WebAssets;
namespace Umbraco.ModelsBuilder.Embedded.Compose
@@ -24,14 +24,22 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose
private readonly IShortStringHelper _shortStringHelper;
private readonly LiveModelsProvider _liveModelsProvider;
private readonly OutOfDateModelsStatus _outOfDateModels;
private readonly LinkGenerator _linkGenerator;
private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime;
private readonly IUmbracoRequestLifetime _umbracoRequestLifetime;
public ModelsBuilderComponent(IModelsBuilderConfig config, IShortStringHelper shortStringHelper, LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels)
public ModelsBuilderComponent(IModelsBuilderConfig config, IShortStringHelper shortStringHelper,
LiveModelsProvider liveModelsProvider, OutOfDateModelsStatus outOfDateModels, LinkGenerator linkGenerator,
IUmbracoRequestLifetime umbracoRequestLifetime, IUmbracoApplicationLifetime umbracoApplicationLifetime)
{
_config = config;
_shortStringHelper = shortStringHelper;
_liveModelsProvider = liveModelsProvider;
_outOfDateModels = outOfDateModels;
_shortStringHelper = shortStringHelper;
_linkGenerator = linkGenerator;
_umbracoRequestLifetime = umbracoRequestLifetime;
_umbracoApplicationLifetime = umbracoApplicationLifetime;
}
public void Initialize()
@@ -39,6 +47,7 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose
// always setup the dashboard
// note: UmbracoApiController instances are automatically registered
InstallServerVars();
_umbracoApplicationLifetime.ApplicationInit += InitializeApplication;
ContentModelBinder.ModelBindingException += ContentModelBinder_ModelBindingException;
@@ -59,6 +68,11 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose
FileService.SavingTemplate -= FileService_SavingTemplate;
}
private void InitializeApplication(object sender, EventArgs args)
{
_umbracoRequestLifetime.RequestEnd += (sender, context) => _liveModelsProvider.AppEndRequest(context);
}
private void InstallServerVars()
{
// register our url - for the backoffice api
@@ -80,11 +94,8 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose
if (!(serverVars["umbracoPlugins"] is Dictionary<string, object> umbracoPlugins))
throw new ArgumentException("Invalid umbracoPlugins");
if (HttpContext.Current == null) throw new InvalidOperationException("HttpContext is null");
var urlHelper = new UrlHelper(new RequestContext(new HttpContextWrapper(HttpContext.Current), new RouteData()));
umbracoUrls["modelsBuilderBaseUrl"] = urlHelper.GetUmbracoApiServiceBaseUrl<ModelsBuilderDashboardController>(controller => controller.BuildModels());
umbracoPlugins["modelsBuilder"] = GetModelsBuilderSettings();
umbracoUrls["modelsBuilderBaseUrl"] = _linkGenerator.GetUmbracoApiServiceBaseUrl<ModelsBuilderDashboardController>(controller => controller.BuildModels());
umbracoPlugins["modelsBuilder"] = GetModelsBuilderSettings();
}
private Dictionary<string, object> GetModelsBuilderSettings()

View File

@@ -24,58 +24,29 @@ namespace Umbraco.ModelsBuilder.Embedded.Compose
public void Compose(Composition composition)
{
var isLegacyModelsBuilderInstalled = IsLegacyModelsBuilderInstalled();
if (isLegacyModelsBuilderInstalled)
{
ComposeForLegacyModelsBuilder(composition);
return;
}
composition.Components().Append<ModelsBuilderComponent>();
composition.Register<UmbracoServices>(Lifetime.Singleton);
composition.RegisterUnique<ModelsGenerator>();
composition.RegisterUnique<LiveModelsProvider>();
composition.RegisterUnique<OutOfDateModelsStatus>();
composition.RegisterUnique<ModelsGenerationError>();
if (_config.ModelsMode == ModelsMode.PureLive)
ComposeForLiveModels(composition);
else if (_config.EnableFactory)
ComposeForDefaultModelsFactory(composition);
}
private static bool IsLegacyModelsBuilderInstalled()
{
Assembly legacyMbAssembly = null;
try
{
legacyMbAssembly = Assembly.Load("Umbraco.ModelsBuilder");
}
catch (System.Exception)
{
//swallow exception, DLL must not be there
}
return legacyMbAssembly != null;
}
private void ComposeForLegacyModelsBuilder(Composition composition)
{
composition.Logger.Info<ModelsBuilderComposer>("ModelsBuilder.Embedded is disabled, the external ModelsBuilder was detected.");
composition.Components().Append<DisabledModelsBuilderComponent>();
composition.Dashboards().Remove<ModelsBuilderDashboard>();
}
private void ComposeForDefaultModelsFactory(Composition composition)
{
composition.RegisterUnique<IPublishedModelFactory>(factory =>
{
var typeLoader = factory.GetInstance<TypeLoader>();
var publishedValueFallback = factory.GetInstance<IPublishedValueFallback>();
var types = typeLoader
.GetTypes<PublishedElementModel>() // element models
.Concat(typeLoader.GetTypes<PublishedContentModel>()); // content models
return new PublishedModelFactory(types);
return new PublishedModelFactory(types, publishedValueFallback);
});
}

View File

@@ -1,28 +0,0 @@
using System.Web;
using System.Web.Compilation;
using Umbraco.ModelsBuilder.Embedded.Compose;
[assembly: PreApplicationStartMethod(typeof(ModelsBuilderInitializer), "Initialize")]
namespace Umbraco.ModelsBuilder.Embedded.Compose
{
public static class ModelsBuilderInitializer
{
public static void Initialize()
{
// for some reason, netstandard is missing from BuildManager.ReferencedAssemblies and yet, is part of
// the references that CSharpCompiler receives - in some cases eg when building views - but not when
// using BuildManager to build the PureLive models - where is it coming from? cannot figure it out
// so... cheating here
// this is equivalent to adding
// <add assembly="netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51" />
// to web.config system.web/compilation/assemblies
var netStandard = ReferencedAssemblies.GetNetStandardAssembly();
if (netStandard != null)
BuildManager.AddReferencedAssembly(netStandard);
}
}
}