diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 9fd8703f84..e26688d8dd 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -19,6 +19,9 @@ umbraco git https://github.com/umbraco/umbraco-cms + enable + Nullable + enable diff --git a/src/JsonSchema/AppSettings.cs b/src/JsonSchema/AppSettings.cs index 0851baba2e..e80666038c 100644 --- a/src/JsonSchema/AppSettings.cs +++ b/src/JsonSchema/AppSettings.cs @@ -16,7 +16,7 @@ namespace JsonSchema /// /// Gets or sets the Umbraco /// - public UmbracoDefinition Umbraco { get; set; } + public UmbracoDefinition? Umbraco { get; set; } /// /// Configuration of Umbraco CMS and packages @@ -24,76 +24,76 @@ namespace JsonSchema internal class UmbracoDefinition { // ReSharper disable once InconsistentNaming - public CmsDefinition CMS { get; set; } + public CmsDefinition? CMS { get; set; } - public FormsDefinition Forms { get; set; } + public FormsDefinition? Forms { get; set; } - public DeployDefinition Deploy { get; set; } + public DeployDefinition? Deploy { get; set; } /// /// Configurations for the Umbraco CMS /// public class CmsDefinition { - public ActiveDirectorySettings ActiveDirectory { get; set; } + public ActiveDirectorySettings? ActiveDirectory { get; set; } - public ContentSettings Content { get; set; } + public ContentSettings? Content { get; set; } - public ExceptionFilterSettings ExceptionFilter { get; set; } + public ExceptionFilterSettings? ExceptionFilter { get; set; } - public ModelsBuilderSettings ModelsBuilder { get; set; } + public ModelsBuilderSettings? ModelsBuilder { get; set; } - public GlobalSettings Global { get; set; } + public GlobalSettings? Global { get; set; } - public HealthChecksSettings HealthChecks { get; set; } + public HealthChecksSettings? HealthChecks { get; set; } - public HostingSettings Hosting { get; set; } + public HostingSettings? Hosting { get; set; } - public ImagingSettings Imaging { get; set; } + public ImagingSettings? Imaging { get; set; } - public IndexCreatorSettings Examine { get; set; } + public IndexCreatorSettings? Examine { get; set; } - public KeepAliveSettings KeepAlive { get; set; } + public KeepAliveSettings? KeepAlive { get; set; } - public LoggingSettings Logging { get; set; } + public LoggingSettings? Logging { get; set; } - public MemberPasswordConfigurationSettings MemberPassword { get; set; } + public MemberPasswordConfigurationSettings? MemberPassword { get; set; } - public NuCacheSettings NuCache { get; set; } + public NuCacheSettings? NuCache { get; set; } - public RequestHandlerSettings RequestHandler { get; set; } + public RequestHandlerSettings? RequestHandler { get; set; } - public RuntimeSettings Runtime { get; set; } + public RuntimeSettings? Runtime { get; set; } - public SecuritySettings Security { get; set; } + public SecuritySettings? Security { get; set; } - public TourSettings Tours { get; set; } + public TourSettings? Tours { get; set; } - public TypeFinderSettings TypeFinder { get; set; } + public TypeFinderSettings? TypeFinder { get; set; } - public UserPasswordConfigurationSettings UserPassword { get; set; } + public UserPasswordConfigurationSettings? UserPassword { get; set; } - public WebRoutingSettings WebRouting { get; set; } + public WebRoutingSettings? WebRouting { get; set; } - public UmbracoPluginSettings Plugins { get; set; } + public UmbracoPluginSettings? Plugins { get; set; } - public UnattendedSettings Unattended { get; set; } + public UnattendedSettings? Unattended { get; set; } - public RichTextEditorSettings RichTextEditor { get; set; } + public RichTextEditorSettings? RichTextEditor { get; set; } - public RuntimeMinificationSettings RuntimeMinification { get; set; } + public RuntimeMinificationSettings? RuntimeMinification { get; set; } - public BasicAuthSettings BasicAuth { get; set; } + public BasicAuthSettings? BasicAuth { get; set; } - public PackageMigrationSettings PackageMigration { get; set; } + public PackageMigrationSettings? PackageMigration { get; set; } - public LegacyPasswordMigrationSettings LegacyPasswordMigration { get; set; } + public LegacyPasswordMigrationSettings? LegacyPasswordMigration { get; set; } - public ContentDashboardSettings ContentDashboard { get; set; } + public ContentDashboardSettings? ContentDashboard { get; set; } - public HelpPageSettings HelpPage { get; set; } + public HelpPageSettings? HelpPage { get; set; } - public InstallDefaultDataSettings DefaultDataCreation { get; set; } + public InstallDefaultDataSettings? DefaultDataCreation { get; set; } } /// @@ -101,24 +101,24 @@ namespace JsonSchema /// public class FormsDefinition { - public FormDesignSettings FormDesign { get; set; } + public FormDesignSettings? FormDesign { get; set; } - public PackageOptionSettings Options { get; set; } + public PackageOptionSettings? Options { get; set; } - public Umbraco.Forms.Core.Configuration.SecuritySettings Security { get; set; } + public Umbraco.Forms.Core.Configuration.SecuritySettings? Security { get; set; } - public FieldTypesDefinition FieldTypes { get; set; } + public FieldTypesDefinition? FieldTypes { get; set; } /// /// Configurations for the Umbraco Forms Field Types /// public class FieldTypesDefinition { - public DatePickerSettings DatePicker { get; set; } + public DatePickerSettings? DatePicker { get; set; } - public Recaptcha2Settings Recaptcha2 { get; set; } + public Recaptcha2Settings? Recaptcha2 { get; set; } - public Recaptcha3Settings Recaptcha3 { get; set; } + public Recaptcha3Settings? Recaptcha3 { get; set; } } } @@ -127,11 +127,11 @@ namespace JsonSchema /// public class DeployDefinition { - public DeploySettings Settings { get; set; } + public DeploySettings? Settings { get; set; } - public DeployProjectConfig Project { get; set; } + public DeployProjectConfig? Project { get; set; } - public DebugSettings Debug { get; set; } + public DebugSettings? Debug { get; set; } } } } diff --git a/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs b/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs index 54ce0fdedf..137dd551cf 100644 --- a/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs +++ b/src/JsonSchema/NamespacePrefixedSchemaNameGenerator.cs @@ -8,6 +8,6 @@ namespace JsonSchema { internal class NamespacePrefixedSchemaNameGenerator : DefaultSchemaNameGenerator { - public override string Generate(Type type) => type.Namespace.Replace(".", string.Empty) + base.Generate(type); + public override string Generate(Type type) => type.Namespace?.Replace(".", string.Empty) + base.Generate(type); } } diff --git a/src/JsonSchema/Options.cs b/src/JsonSchema/Options.cs index 9930210cd8..83a2a8ef94 100644 --- a/src/JsonSchema/Options.cs +++ b/src/JsonSchema/Options.cs @@ -8,6 +8,6 @@ namespace JsonSchema internal class Options { [Option('o', "outputFile", Required = false, HelpText = "Set path of the output file.", Default = "../../../../Umbraco.Web.UI/umbraco/config/appsettings-schema.json")] - public string OutputFile { get; set; } + public string OutputFile { get; set; } = null!; } } diff --git a/src/JsonSchema/Program.cs b/src/JsonSchema/Program.cs index 8b02068c46..98dae7ac22 100644 --- a/src/JsonSchema/Program.cs +++ b/src/JsonSchema/Program.cs @@ -31,7 +31,7 @@ namespace JsonSchema var path = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, options.OutputFile)); Console.WriteLine("Path to use {0}", path); - Directory.CreateDirectory(Path.GetDirectoryName(path)); + Directory.CreateDirectory(Path.GetDirectoryName(path)!); Console.WriteLine("Ensured directory exists"); await File.WriteAllTextAsync(path, schema); diff --git a/src/JsonSchema/UmbracoJsonSchemaGenerator.cs b/src/JsonSchema/UmbracoJsonSchemaGenerator.cs index e06189d3b4..4422436d8d 100644 --- a/src/JsonSchema/UmbracoJsonSchemaGenerator.cs +++ b/src/JsonSchema/UmbracoJsonSchemaGenerator.cs @@ -43,14 +43,14 @@ namespace JsonSchema var result = await response.Content.ReadAsStringAsync(); - return JsonConvert.DeserializeObject(result); + return JsonConvert.DeserializeObject(result)!; } private JObject GenerateUmbracoSchema() { NJsonSchema.JsonSchema schema = _innerGenerator.Generate(typeof(AppSettings)); - return JsonConvert.DeserializeObject(schema.ToJson()); + return JsonConvert.DeserializeObject(schema.ToJson())!; } } } diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj index d73e5293f7..e206cd8653 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj @@ -2,9 +2,6 @@ net6.0 - enable - enable - Umbraco.Cms.Persistence.SqlServer Umbraco.Cms.Persistence.SqlServer Adds support for SQL Server to Umbraco CMS. diff --git a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj index 8471b6db92..57055ec96b 100644 --- a/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj +++ b/src/Umbraco.Cms.Persistence.Sqlite/Umbraco.Cms.Persistence.Sqlite.csproj @@ -2,9 +2,6 @@ net6.0 - enable - enable - Umbraco.Cms.Persistence.Sqlite Umbraco.Cms.Persistence.Sqlite Adds support for SQLite to Umbraco CMS. diff --git a/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs index e01f7b2458..b99975e0e4 100644 --- a/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs @@ -42,9 +42,9 @@ namespace Umbraco.Cms.Core.Cache persistDeleted(entity); } - public TEntity[]? GetAll(TId[]? ids, Func?> performGetAll) + public TEntity[] GetAll(TId[]? ids, Func?> performGetAll) { - return performGetAll(ids)?.ToArray(); + return performGetAll(ids)?.ToArray() ?? Array.Empty(); } public void ClearAll() diff --git a/src/Umbraco.Core/Composing/TypeHelper.cs b/src/Umbraco.Core/Composing/TypeHelper.cs index 0acec4da0c..08893732a8 100644 --- a/src/Umbraco.Core/Composing/TypeHelper.cs +++ b/src/Umbraco.Core/Composing/TypeHelper.cs @@ -29,8 +29,13 @@ namespace Umbraco.Cms.Core.Composing /// Based on a type we'll check if it is IEnumerable{T} (or similar) and if so we'll return a List{T}, this will also deal with array types and return List{T} for those too. /// If it cannot be done, null is returned. /// - public static IList? CreateGenericEnumerableFromObject(object obj) + public static IList? CreateGenericEnumerableFromObject(object? obj) { + if (obj is null) + { + return null; + } + var type = obj.GetType(); if (type.IsGenericType) diff --git a/src/Umbraco.Core/Composing/TypeLoader.cs b/src/Umbraco.Core/Composing/TypeLoader.cs index ef72386135..6f4d81fc34 100644 --- a/src/Umbraco.Core/Composing/TypeLoader.cs +++ b/src/Umbraco.Core/Composing/TypeLoader.cs @@ -26,7 +26,7 @@ namespace Umbraco.Cms.Core.Composing private readonly Dictionary _types = new (); private readonly object _locko = new (); - private IEnumerable _assemblies; + private IEnumerable? _assemblies; /// /// Initializes a new instance of the class. @@ -121,11 +121,11 @@ namespace Umbraco.Cms.Core.Composing // internal for tests [Obsolete("This will be removed in a future version.")] - public Dictionary<(string, string), IEnumerable> ReadCache() => null; + public Dictionary<(string, string), IEnumerable>? ReadCache() => null; // internal for tests [Obsolete("This will be removed in a future version.")] - public string GetTypesListFilePath() => null; + public string? GetTypesListFilePath() => null; // internal for tests [Obsolete("This will be removed in a future version.")] @@ -340,7 +340,7 @@ namespace Umbraco.Cms.Core.Composing // check if the TypeList already exists, if so return it, if not we'll create it var tobject = typeof(object); // CompositeTypeTypeKey does not support null values var listKey = new CompositeTypeTypeKey(baseType ?? tobject, attributeType ?? tobject); - TypeList typeList = null; + TypeList? typeList = null; if (cache) { @@ -411,7 +411,7 @@ namespace Umbraco.Cms.Core.Composing /// public void Add(Type type) { - if (BaseType.IsAssignableFrom(type) == false) + if (BaseType?.IsAssignableFrom(type) == false) throw new ArgumentException("Base type " + BaseType + " is not assignable from type " + type + ".", nameof(type)); _types.Add(type); } diff --git a/src/Umbraco.Core/Events/CancellableEventArgs.cs b/src/Umbraco.Core/Events/CancellableEventArgs.cs index 2fb27c291f..a991f6532b 100644 --- a/src/Umbraco.Core/Events/CancellableEventArgs.cs +++ b/src/Umbraco.Core/Events/CancellableEventArgs.cs @@ -128,7 +128,7 @@ namespace Umbraco.Cms.Core.Events return AdditionalData != null ? AdditionalData.GetHashCode() : 0; } - public static bool operator ==(CancellableEventArgs left, CancellableEventArgs right) + public static bool operator ==(CancellableEventArgs? left, CancellableEventArgs? right) { return Equals(left, right); } diff --git a/src/Umbraco.Core/Events/DeleteEventArgs.cs b/src/Umbraco.Core/Events/DeleteEventArgs.cs index 0a3f76eeb8..1696e07ec6 100644 --- a/src/Umbraco.Core/Events/DeleteEventArgs.cs +++ b/src/Umbraco.Core/Events/DeleteEventArgs.cs @@ -99,7 +99,7 @@ namespace Umbraco.Cms.Core.Events /// public IEnumerable DeletedEntities { - get => EventObject; + get => EventObject ?? Enumerable.Empty(); set => EventObject = value; } @@ -108,14 +108,14 @@ namespace Umbraco.Cms.Core.Events /// public List MediaFilesToDelete { get; private set; } - public bool Equals(DeleteEventArgs other) + public bool Equals(DeleteEventArgs? other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return base.Equals(other) && MediaFilesToDelete.SequenceEqual(other.MediaFilesToDelete); } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; @@ -166,14 +166,14 @@ namespace Umbraco.Cms.Core.Events /// public int Id { get; private set; } - public bool Equals(DeleteEventArgs other) + public bool Equals(DeleteEventArgs? other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return base.Equals(other) && Id == other.Id; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; diff --git a/src/Umbraco.Core/Events/EventDefinition.cs b/src/Umbraco.Core/Events/EventDefinition.cs index b803db5989..aa6f2899cd 100644 --- a/src/Umbraco.Core/Events/EventDefinition.cs +++ b/src/Umbraco.Core/Events/EventDefinition.cs @@ -27,11 +27,11 @@ namespace Umbraco.Cms.Core.Events public class EventDefinition : EventDefinitionBase { - private readonly EventHandler _trackedEvent; + private readonly EventHandler _trackedEvent; private readonly object _sender; - private readonly TEventArgs? _args; + private readonly TEventArgs _args; - public EventDefinition(EventHandler trackedEvent, object sender, TEventArgs? args, string? eventName = null) + public EventDefinition(EventHandler trackedEvent, object sender, TEventArgs args, string? eventName = null) : base(sender, args, eventName) { _trackedEvent = trackedEvent; @@ -50,11 +50,11 @@ namespace Umbraco.Cms.Core.Events public class EventDefinition : EventDefinitionBase { - private readonly TypedEventHandler _trackedEvent; - private readonly TSender? _sender; + private readonly TypedEventHandler _trackedEvent; + private readonly TSender _sender; private readonly TEventArgs _args; - public EventDefinition(TypedEventHandler trackedEvent, TSender? sender, TEventArgs args, string? eventName = null) + public EventDefinition(TypedEventHandler trackedEvent, TSender sender, TEventArgs args, string? eventName = null) : base(sender, args, eventName) { _trackedEvent = trackedEvent; diff --git a/src/Umbraco.Core/Events/IEventDispatcher.cs b/src/Umbraco.Core/Events/IEventDispatcher.cs index 84e522761c..bef94b6d4a 100644 --- a/src/Umbraco.Core/Events/IEventDispatcher.cs +++ b/src/Umbraco.Core/Events/IEventDispatcher.cs @@ -27,7 +27,7 @@ namespace Umbraco.Cms.Core.Events /// The optional name of the event. /// A value indicating whether the cancelable event was cancelled. /// See general remarks on the interface. - bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string name = null); + bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string? name = null); /// /// Dispatches a cancelable event. @@ -38,7 +38,7 @@ namespace Umbraco.Cms.Core.Events /// The optional name of the event. /// A value indicating whether the cancelable event was cancelled. /// See general remarks on the interface. - bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string name = null) + bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string? name = null) where TArgs : CancellableEventArgs; /// @@ -50,7 +50,7 @@ namespace Umbraco.Cms.Core.Events /// The optional name of the event. /// A value indicating whether the cancelable event was cancelled. /// See general remarks on the interface. - bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string name = null) + bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string? name = null) where TArgs : CancellableEventArgs; /// @@ -61,7 +61,7 @@ namespace Umbraco.Cms.Core.Events /// The event data. /// The optional name of the event. /// See general remarks on the interface. - void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string name = null); + void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string? name = null); /// /// Dispatches an event. @@ -71,7 +71,7 @@ namespace Umbraco.Cms.Core.Events /// The event data. /// The optional name of the event. /// See general remarks on the interface. - void Dispatch(EventHandler eventHandler, object sender, TArgs args, string name = null); + void Dispatch(EventHandler eventHandler, object sender, TArgs args, string? name = null); /// /// Dispatches an event. @@ -81,7 +81,7 @@ namespace Umbraco.Cms.Core.Events /// The event data. /// The optional name of the event. /// See general remarks on the interface. - void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string name = null); + void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string? name = null); /// /// Notifies the dispatcher that the scope is exiting. diff --git a/src/Umbraco.Core/Events/PassThroughEventDispatcher.cs b/src/Umbraco.Core/Events/PassThroughEventDispatcher.cs index 0b2e72cc7f..a36368ea54 100644 --- a/src/Umbraco.Core/Events/PassThroughEventDispatcher.cs +++ b/src/Umbraco.Core/Events/PassThroughEventDispatcher.cs @@ -11,14 +11,14 @@ namespace Umbraco.Cms.Core.Events /// whatever happens, and the transaction could roll back in the end. internal class PassThroughEventDispatcher : IEventDispatcher { - public bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string eventName = null) + public bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string? eventName = null) { if (eventHandler == null) return args.Cancel; eventHandler(sender, args); return args.Cancel; } - public bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string eventName = null) + public bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string? eventName = null) where TArgs : CancellableEventArgs { if (eventHandler == null) return args.Cancel; @@ -26,7 +26,7 @@ namespace Umbraco.Cms.Core.Events return args.Cancel; } - public bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string eventName = null) + public bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string? eventName = null) where TArgs : CancellableEventArgs { if (eventHandler == null) return args.Cancel; @@ -34,17 +34,17 @@ namespace Umbraco.Cms.Core.Events return args.Cancel; } - public void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string eventName = null) + public void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string? eventName = null) { eventHandler?.Invoke(sender, args); } - public void Dispatch(EventHandler eventHandler, object sender, TArgs args, string eventName = null) + public void Dispatch(EventHandler eventHandler, object sender, TArgs args, string? eventName = null) { eventHandler?.Invoke(sender, args); } - public void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string eventName = null) + public void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string? eventName = null) { eventHandler?.Invoke(sender, args); } diff --git a/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs b/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs index 784390ebe7..43d1d417f0 100644 --- a/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs +++ b/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs @@ -20,7 +20,7 @@ namespace Umbraco.Cms.Core.Events public abstract class QueuingEventDispatcherBase : IEventDispatcher { //events will be enlisted in the order they are raised - private List _events; + private List? _events; private readonly bool _raiseCancelable; protected QueuingEventDispatcherBase(bool raiseCancelable) @@ -30,7 +30,7 @@ namespace Umbraco.Cms.Core.Events private List Events => _events ?? (_events = new List()); - public bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string eventName = null) + public bool DispatchCancelable(EventHandler eventHandler, object sender, CancellableEventArgs args, string? eventName = null) { if (eventHandler == null) return args.Cancel; if (_raiseCancelable == false) return args.Cancel; @@ -38,7 +38,7 @@ namespace Umbraco.Cms.Core.Events return args.Cancel; } - public bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string eventName = null) + public bool DispatchCancelable(EventHandler eventHandler, object sender, TArgs args, string? eventName = null) where TArgs : CancellableEventArgs { if (eventHandler == null) return args.Cancel; @@ -47,7 +47,7 @@ namespace Umbraco.Cms.Core.Events return args.Cancel; } - public bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string eventName = null) + public bool DispatchCancelable(TypedEventHandler eventHandler, TSender sender, TArgs args, string? eventName = null) where TArgs : CancellableEventArgs { if (eventHandler == null) return args.Cancel; @@ -56,19 +56,19 @@ namespace Umbraco.Cms.Core.Events return args.Cancel; } - public void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string eventName = null) + public void Dispatch(EventHandler eventHandler, object sender, EventArgs args, string? eventName = null) { if (eventHandler == null) return; Events.Add(new EventDefinition(eventHandler, sender, args, eventName)); } - public void Dispatch(EventHandler eventHandler, object sender, TArgs args, string eventName = null) + public void Dispatch(EventHandler eventHandler, object sender, TArgs args, string? eventName = null) { if (eventHandler == null) return; Events.Add(new EventDefinition(eventHandler, sender, args, eventName)); } - public void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string eventName = null) + public void Dispatch(TypedEventHandler eventHandler, TSender sender, TArgs args, string? eventName = null) { if (eventHandler == null) return; Events.Add(new EventDefinition(eventHandler, sender, args, eventName)); @@ -106,8 +106,8 @@ namespace Umbraco.Cms.Core.Events private class EventDefinitionInfos { - public IEventDefinition EventDefinition { get; set; } - public Type[] SupersedeTypes { get; set; } + public IEventDefinition? EventDefinition { get; set; } + public Type[]? SupersedeTypes { get; set; } } // this is way too convoluted, the supersede attribute is used only on DeleteEventargs to specify @@ -291,13 +291,13 @@ namespace Umbraco.Cms.Core.Events private static bool IsSuperceeded(IEntity entity, EventDefinitionInfos infos, List> entities) { //var argType = meta.EventArgsType; - var argType = infos.EventDefinition.Args.GetType(); + var argType = infos.EventDefinition?.Args.GetType(); // look for other instances of the same entity, coming from an event args that supersedes other event args, // ie is marked with the attribute, and is not this event args (cannot supersede itself) var superceeding = entities - .Where(x => x.Item2.SupersedeTypes.Length > 0 // has the attribute - && x.Item2.EventDefinition.Args.GetType() != argType // is not the same + .Where(x => x.Item2.SupersedeTypes?.Length > 0 // has the attribute + && x.Item2.EventDefinition?.Args.GetType() != argType // is not the same && Equals(x.Item1, entity)) // same entity .ToArray(); @@ -306,27 +306,27 @@ namespace Umbraco.Cms.Core.Events return false; // delete event args does NOT supersedes 'unpublished' event - if (argType.IsGenericType && argType.GetGenericTypeDefinition() == typeof(PublishEventArgs<>) && infos.EventDefinition.EventName == "Unpublished") + if ((argType?.IsGenericType ?? false) && argType.GetGenericTypeDefinition() == typeof(PublishEventArgs<>) && infos.EventDefinition?.EventName == "Unpublished") return false; // found occurrences, need to determine if this event args is superseded - if (argType.IsGenericType) + if (argType?.IsGenericType ?? false) { // generic, must compare type arguments var supercededBy = superceeding.FirstOrDefault(x => - x.Item2.SupersedeTypes.Any(y => + x.Item2.SupersedeTypes?.Any(y => // superseding a generic type which has the same generic type definition // (but ... no matter the generic type parameters? could be different?) y.IsGenericTypeDefinition && y == argType.GetGenericTypeDefinition() // or superceeding a non-generic type which is ... (but... how is this ever possible? argType *is* generic? - || y.IsGenericTypeDefinition == false && y == argType)); + || y.IsGenericTypeDefinition == false && y == argType) ?? false); return supercededBy != null; } else { // non-generic, can compare types 1:1 var supercededBy = superceeding.FirstOrDefault(x => - x.Item2.SupersedeTypes.Any(y => y == argType)); + x.Item2.SupersedeTypes?.Any(y => y == argType) ?? false); return supercededBy != null; } } diff --git a/src/Umbraco.Core/Extensions/HostEnvironmentExtensions.cs b/src/Umbraco.Core/Extensions/HostEnvironmentExtensions.cs index 658739ba93..944c9360b4 100644 --- a/src/Umbraco.Core/Extensions/HostEnvironmentExtensions.cs +++ b/src/Umbraco.Core/Extensions/HostEnvironmentExtensions.cs @@ -10,7 +10,7 @@ namespace Umbraco.Cms.Core.Extensions /// public static class HostEnvironmentExtensions { - private static string s_temporaryApplicationId; + private static string? s_temporaryApplicationId; /// /// Maps a virtual path to a physical path to the application's content root. diff --git a/src/Umbraco.Core/Mapping/MapperContext.cs b/src/Umbraco.Core/Mapping/MapperContext.cs index 3d79eaa50e..2355e9bd05 100644 --- a/src/Umbraco.Core/Mapping/MapperContext.cs +++ b/src/Umbraco.Core/Mapping/MapperContext.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; namespace Umbraco.Cms.Core.Mapping @@ -121,7 +121,7 @@ namespace Umbraco.Cms.Core.Mapping /// A list containing the target objects. public List MapEnumerable(IEnumerable source) { - return source.Select(Map).ToList(); + return source.Select(Map).Where(x => x is not null).ToList()!; } #endregion diff --git a/src/Umbraco.Core/PropertyEditors/LabelPropertyEditor.cs b/src/Umbraco.Core/PropertyEditors/LabelPropertyEditor.cs index 7986b1cc0c..c142b581d0 100644 --- a/src/Umbraco.Core/PropertyEditors/LabelPropertyEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/LabelPropertyEditor.cs @@ -2,11 +2,13 @@ // See LICENSE for more details. using System; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Web.Common.DependencyInjection; namespace Umbraco.Cms.Core.PropertyEditors { @@ -27,7 +29,7 @@ namespace Umbraco.Cms.Core.PropertyEditors [Obsolete("Please use constructor that takes an IEditorConfigurationParser instead")] public LabelPropertyEditor(IDataValueEditorFactory dataValueEditorFactory, IIOHelper ioHelper) - : base(dataValueEditorFactory) + : this(dataValueEditorFactory, ioHelper, StaticServiceProvider.Instance.GetRequiredService()) { } diff --git a/src/Umbraco.Core/PublishedCache/Internal/InternalPublishedContent.cs b/src/Umbraco.Core/PublishedCache/Internal/InternalPublishedContent.cs index fa5feac348..557d5469b6 100644 --- a/src/Umbraco.Core/PublishedCache/Internal/InternalPublishedContent.cs +++ b/src/Umbraco.Core/PublishedCache/Internal/InternalPublishedContent.cs @@ -20,6 +20,7 @@ namespace Umbraco.Cms.Core.PublishedCache.Internal Version = Guid.Empty; Path = string.Empty; ContentType = contentType; + Properties = Enumerable.Empty(); } private Dictionary? _cultures; diff --git a/src/Umbraco.Core/Services/BasicAuthService.cs b/src/Umbraco.Core/Services/BasicAuthService.cs index ebc102b093..3021768bfe 100644 --- a/src/Umbraco.Core/Services/BasicAuthService.cs +++ b/src/Umbraco.Core/Services/BasicAuthService.cs @@ -1,7 +1,9 @@ using System; using System.Net; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Umbraco.Cms.Core.Configuration.Models; +using Umbraco.Cms.Web.Common.DependencyInjection; namespace Umbraco.Cms.Core.Services.Implement { @@ -13,6 +15,7 @@ namespace Umbraco.Cms.Core.Services.Implement // Scheduled for removal in v12 [Obsolete("Please use the contructor that takes an IIpadressUtilities instead")] public BasicAuthService(IOptionsMonitor optionsMonitor) + : this(optionsMonitor, StaticServiceProvider.Instance.GetRequiredService()) { _basicAuthSettings = optionsMonitor.CurrentValue; diff --git a/src/Umbraco.Core/Services/DataTypeService.cs b/src/Umbraco.Core/Services/DataTypeService.cs index f936144769..c45bc5eade 100644 --- a/src/Umbraco.Core/Services/DataTypeService.cs +++ b/src/Umbraco.Core/Services/DataTypeService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.Events; using Umbraco.Cms.Core.Exceptions; @@ -12,6 +13,7 @@ using Umbraco.Cms.Core.PropertyEditors; using Umbraco.Cms.Core.Scoping; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Web.Common.DependencyInjection; using Umbraco.Extensions; namespace Umbraco.Cms.Core.Services.Implement @@ -32,7 +34,9 @@ namespace Umbraco.Cms.Core.Services.Implement private readonly ILocalizationService _localizationService; private readonly IShortStringHelper _shortStringHelper; private readonly IJsonSerializer _jsonSerializer; + private readonly IEditorConfigurationParser _editorConfigurationParser; + [Obsolete("Please use constructor that takes an ")] public DataTypeService( IDataValueEditorFactory dataValueEditorFactory, ICoreScopeProvider provider, ILoggerFactory loggerFactory, IEventMessagesFactory eventMessagesFactory, @@ -41,6 +45,45 @@ namespace Umbraco.Cms.Core.Services.Implement IIOHelper ioHelper, ILocalizedTextService localizedTextService, ILocalizationService localizationService, IShortStringHelper shortStringHelper, IJsonSerializer jsonSerializer) + : this( + dataValueEditorFactory, + provider, + loggerFactory, + eventMessagesFactory, + dataTypeRepository, + dataTypeContainerRepository, + auditRepository, + entityRepository, + contentTypeRepository, + ioHelper, + localizedTextService, + localizationService, + shortStringHelper, + jsonSerializer, + StaticServiceProvider.Instance.GetRequiredService()) + { + _dataValueEditorFactory = dataValueEditorFactory; + _dataTypeRepository = dataTypeRepository; + _dataTypeContainerRepository = dataTypeContainerRepository; + _auditRepository = auditRepository; + _entityRepository = entityRepository; + _contentTypeRepository = contentTypeRepository; + _ioHelper = ioHelper; + _localizedTextService = localizedTextService; + _localizationService = localizationService; + _shortStringHelper = shortStringHelper; + _jsonSerializer = jsonSerializer; + } + + public DataTypeService( + IDataValueEditorFactory dataValueEditorFactory, + ICoreScopeProvider provider, ILoggerFactory loggerFactory, IEventMessagesFactory eventMessagesFactory, + IDataTypeRepository dataTypeRepository, IDataTypeContainerRepository dataTypeContainerRepository, + IAuditRepository auditRepository, IEntityRepository entityRepository, IContentTypeRepository contentTypeRepository, + IIOHelper ioHelper, ILocalizedTextService localizedTextService, ILocalizationService localizationService, + IShortStringHelper shortStringHelper, + IJsonSerializer jsonSerializer, + IEditorConfigurationParser editorConfigurationParser) : base(provider, loggerFactory, eventMessagesFactory) { _dataValueEditorFactory = dataValueEditorFactory; @@ -54,6 +97,7 @@ namespace Umbraco.Cms.Core.Services.Implement _localizationService = localizationService; _shortStringHelper = shortStringHelper; _jsonSerializer = jsonSerializer; + _editorConfigurationParser = editorConfigurationParser; } #region Containers @@ -353,7 +397,7 @@ namespace Umbraco.Cms.Core.Services.Implement .Where(x => x.Editor is MissingPropertyEditor); foreach (var dataType in dataTypesWithMissingEditors) { - dataType.Editor = new LabelPropertyEditor(_dataValueEditorFactory, _ioHelper); + dataType.Editor = new LabelPropertyEditor(_dataValueEditorFactory, _ioHelper, _editorConfigurationParser); } } diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index 9a6cffeb97..8bcead30bb 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -8,7 +8,6 @@ Umbraco CMS Core Contains the core assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco Umbraco CMS - enable diff --git a/src/Umbraco.Examine.Lucene/LuceneIndexDiagnostics.cs b/src/Umbraco.Examine.Lucene/LuceneIndexDiagnostics.cs index d04c38ebaa..4d7ec2f23d 100644 --- a/src/Umbraco.Examine.Lucene/LuceneIndexDiagnostics.cs +++ b/src/Umbraco.Examine.Lucene/LuceneIndexDiagnostics.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Options; using Umbraco.Cms.Core; using Umbraco.Cms.Core.Hosting; using Umbraco.Extensions; +using Directory = Lucene.Net.Store.Directory; namespace Umbraco.Cms.Infrastructure.Examine { diff --git a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj index 31657ba776..bba9068dfe 100644 --- a/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj +++ b/src/Umbraco.Examine.Lucene/Umbraco.Examine.Lucene.csproj @@ -6,7 +6,6 @@ Umbraco.Examine.Lucene Umbraco.Cms.Examine.Lucene - enable true diff --git a/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs b/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs index 2afacbdfbc..7881daa593 100644 --- a/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs +++ b/src/Umbraco.Infrastructure/Media/ImageSharpDimensionExtractor.cs @@ -52,7 +52,7 @@ namespace Umbraco.Cms.Infrastructure.Media private static ushort GetExifOrientation(IImageInfo imageInfo) { - IExifValue orientation = imageInfo.Metadata.ExifProfile?.GetValue(ExifTag.Orientation); + IExifValue? orientation = imageInfo.Metadata.ExifProfile?.GetValue(ExifTag.Orientation); if (orientation is not null) { if (orientation.DataType == ExifDataType.Short) diff --git a/src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs b/src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs index ba129257c7..eb84d46f68 100644 --- a/src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs +++ b/src/Umbraco.Infrastructure/Persistence/Factories/TemplateFactory.cs @@ -5,6 +5,7 @@ using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Models.Entities; using Umbraco.Cms.Core.Strings; using Umbraco.Cms.Infrastructure.Persistence.Dtos; +using File = Umbraco.Cms.Core.Models.File; namespace Umbraco.Cms.Infrastructure.Persistence.Factories { diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs index 4fb347d448..086542d307 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs @@ -104,7 +104,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement return moveInfo; } - protected override IEnumerable? PerformGetAll(params int[]? ids) + protected override IEnumerable PerformGetAll(params int[]? ids) { var result = GetAllWithFullCachePolicy(); @@ -114,10 +114,10 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement // collections of Ids, so this is to work around that: if (ids?.Any() ?? false) { - return result?.Where(x => ids.Contains(x.Id)); + return result?.Where(x => ids.Contains(x.Id)) ?? Enumerable.Empty(); } - return result; + return result ?? Enumerable.Empty();; } protected abstract IEnumerable? GetAllWithFullCachePolicy(); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepositoryBase.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepositoryBase.cs index 02d286d7bf..4ac8adbd91 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepositoryBase.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/EntityRepositoryBase.cs @@ -179,7 +179,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement { // ensure we don't include any null refs in the returned collection! - return PerformGetByQuery(query)? + return PerformGetByQuery(query) .WhereNotNull(); } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/KeyValueRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/KeyValueRepository.cs index a1d9658e38..6fd3da008c 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/KeyValueRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/KeyValueRepository.cs @@ -64,7 +64,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement return dto == null ? null : Map(dto); } - protected override IEnumerable? PerformGetAll(params string[]? ids) + protected override IEnumerable PerformGetAll(params string[]? ids) { var sql = GetBaseQuery(false).WhereIn(x => x.Key, ids); var dtos = Database.Fetch(sql); diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs index 15774ba1bb..a918590a0c 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MacroRepository.cs @@ -131,13 +131,13 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement } } - protected override IEnumerable? PerformGetByQuery(IQuery query) + protected override IEnumerable PerformGetByQuery(IQuery query) { var sqlClause = GetBaseQuery(false); var translator = new SqlTranslator(sqlClause, query); var sql = translator.Translate(); - return Database? + return Database .FetchOneToMany(x => x.MacroPropertyDtos, sql) .Select(x => Get(x.Id)!); } diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs index 55ba96b86b..6742d2457d 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaTypeRepository.cs @@ -61,14 +61,14 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement return ids?.Any() ?? false ? all?.Where(x => ids.Contains(x.Key)) : all; } - protected override IEnumerable? PerformGetByQuery(IQuery query) + protected override IEnumerable PerformGetByQuery(IQuery query) { var baseQuery = GetBaseQuery(false); var translator = new SqlTranslator(baseQuery, query); var sql = translator.Translate(); var ids = Database.Fetch(sql).Distinct().ToArray(); - return ids.Length > 0 ? GetMany(ids)?.OrderBy(x => x.Name) : Enumerable.Empty(); + return ids.Length > 0 ? GetMany(ids).OrderBy(x => x.Name).WhereNotNull() : Enumerable.Empty(); } protected override Sql GetBaseQuery(bool isCount) diff --git a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs index 93b00bdc8f..e26e30f21b 100644 --- a/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs +++ b/src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MemberTypeRepository.cs @@ -66,7 +66,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement return CommonRepository.GetAllTypes()?.OfType(); } - protected override IEnumerable? PerformGetByQuery(IQuery query) + protected override IEnumerable PerformGetByQuery(IQuery query) { var subQuery = GetSubquery(); var translator = new SqlTranslator(subQuery, query); @@ -76,7 +76,7 @@ namespace Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement .OrderBy(x => x.SortOrder); var ids = Database.Fetch(sql).Distinct().ToArray(); - return ids.Length > 0 ? GetMany(ids)?.OrderBy(x => x.Name) : Enumerable.Empty(); + return ids.Length > 0 ? GetMany(ids).OrderBy(x => x.Name) : Enumerable.Empty(); } protected override Sql GetBaseQuery(bool isCount) diff --git a/src/Umbraco.Infrastructure/PropertyEditors/RadioButtonsPropertyEditor.cs b/src/Umbraco.Infrastructure/PropertyEditors/RadioButtonsPropertyEditor.cs index 411d6a75c2..a4fdb3562b 100644 --- a/src/Umbraco.Infrastructure/PropertyEditors/RadioButtonsPropertyEditor.cs +++ b/src/Umbraco.Infrastructure/PropertyEditors/RadioButtonsPropertyEditor.cs @@ -2,11 +2,13 @@ // See LICENSE for more details. using System; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Core.Serialization; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Strings; +using Umbraco.Cms.Web.Common.DependencyInjection; namespace Umbraco.Cms.Core.PropertyEditors { @@ -32,7 +34,7 @@ namespace Umbraco.Cms.Core.PropertyEditors IDataValueEditorFactory dataValueEditorFactory, IIOHelper ioHelper, ILocalizedTextService localizedTextService) - : base(dataValueEditorFactory) + : this(dataValueEditorFactory, ioHelper, localizedTextService, StaticServiceProvider.Instance.GetRequiredService()) { _ioHelper = ioHelper; _localizedTextService = localizedTextService; diff --git a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs index ad1622a27e..5866589c6f 100644 --- a/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs +++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs @@ -35,8 +35,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime private readonly IEventAggregator _eventAggregator; private readonly IHostingEnvironment _hostingEnvironment; private readonly IUmbracoVersion _umbracoVersion; - private readonly IServiceProvider _serviceProvider; - private readonly IHostApplicationLifetime _hostApplicationLifetime; + private readonly IServiceProvider? _serviceProvider; + private readonly IHostApplicationLifetime? _hostApplicationLifetime; private readonly ILogger _logger; private CancellationToken _cancellationToken; @@ -54,8 +54,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime IEventAggregator eventAggregator, IHostingEnvironment hostingEnvironment, IUmbracoVersion umbracoVersion, - IServiceProvider serviceProvider, - IHostApplicationLifetime hostApplicationLifetime) + IServiceProvider? serviceProvider, + IHostApplicationLifetime? hostApplicationLifetime) { State = state; @@ -86,7 +86,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime IEventAggregator eventAggregator, IHostingEnvironment hostingEnvironment, IUmbracoVersion umbracoVersion, - IServiceProvider serviceProvider) + IServiceProvider? serviceProvider) : this( state, loggerFactory, @@ -157,7 +157,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime // Just in-case HostBuilder.ConfigureUmbracoDefaults() isn't used (e.g. upgrade from 9 and ignored advice). if (StaticServiceProvider.Instance == null!) { - StaticServiceProvider.Instance = _serviceProvider; + StaticServiceProvider.Instance = _serviceProvider!; } if (isRestarting == false) @@ -221,8 +221,8 @@ namespace Umbraco.Cms.Infrastructure.Runtime if (isRestarting == false) { // Add application started and stopped notifications last (to ensure they're always published after starting) - _hostApplicationLifetime.ApplicationStarted.Register(() => _eventAggregator.Publish(new UmbracoApplicationStartedNotification(false))); - _hostApplicationLifetime.ApplicationStopped.Register(() => _eventAggregator.Publish(new UmbracoApplicationStoppedNotification(false))); + _hostApplicationLifetime?.ApplicationStarted.Register(() => _eventAggregator.Publish(new UmbracoApplicationStartedNotification(false))); + _hostApplicationLifetime?.ApplicationStopped.Register(() => _eventAggregator.Publish(new UmbracoApplicationStoppedNotification(false))); } } @@ -234,7 +234,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime private void AcquireMainDom() { - using DisposableTimer timer = _profilingLogger.DebugDuration("Acquiring MainDom.", "Acquired."); + using DisposableTimer? timer = _profilingLogger.DebugDuration("Acquiring MainDom.", "Acquired."); try { @@ -255,7 +255,7 @@ namespace Umbraco.Cms.Infrastructure.Runtime return; } - using DisposableTimer timer = _profilingLogger.DebugDuration("Determining runtime level.", "Determined."); + using DisposableTimer? timer = _profilingLogger.DebugDuration("Determining runtime level.", "Determined."); try { diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj index 8affd81c91..5b63f8a1ec 100644 --- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj +++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj @@ -6,7 +6,6 @@ Umbraco.Cms.Infrastructure Umbraco CMS Infrastructure Contains the infrastructure assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - enable diff --git a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj index 328221ed3f..0eb68b99fe 100644 --- a/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj +++ b/src/Umbraco.PublishedCache.NuCache/Umbraco.PublishedCache.NuCache.csproj @@ -6,7 +6,6 @@ Umbraco.Cms.PublishedCache.NuCache Umbraco CMS Published Cache Contains the Published Cache assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - enable diff --git a/src/Umbraco.Web.BackOffice/Controllers/UserGroupsController.cs b/src/Umbraco.Web.BackOffice/Controllers/UserGroupsController.cs index 9234ed96b4..ddad1a0a64 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UserGroupsController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UserGroupsController.cs @@ -159,7 +159,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers /// Returns all user groups /// /// - public IEnumerable GetUserGroups(bool onlyCurrentUserGroups = true) + public IEnumerable GetUserGroups(bool onlyCurrentUserGroups = true) { var allGroups = _umbracoMapper.MapEnumerable(_userService.GetAllUserGroups()) .ToList(); @@ -170,7 +170,7 @@ namespace Umbraco.Cms.Web.BackOffice.Controllers if (onlyCurrentUserGroups == false) { //this user is not an admin so in that case we need to exclude all admin users - allGroups.RemoveAt(allGroups.IndexOf(allGroups.Find(basic => basic?.Alias == Constants.Security.AdminGroupAlias))); + allGroups.RemoveAt(allGroups.IndexOf(allGroups.Find(basic => basic.Alias == Constants.Security.AdminGroupAlias)!)); return allGroups; } diff --git a/src/Umbraco.Web.BackOffice/ModelBinders/FromJsonPathAttribute.cs b/src/Umbraco.Web.BackOffice/ModelBinders/FromJsonPathAttribute.cs index 17ac03ca80..274a150465 100644 --- a/src/Umbraco.Web.BackOffice/ModelBinders/FromJsonPathAttribute.cs +++ b/src/Umbraco.Web.BackOffice/ModelBinders/FromJsonPathAttribute.cs @@ -7,6 +7,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Cms.Core; using Umbraco.Extensions; +using HttpMethod = System.Net.Http.HttpMethod; namespace Umbraco.Cms.Web.BackOffice.ModelBinders { diff --git a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj index 916cbfb1ea..13076bd50c 100644 --- a/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj +++ b/src/Umbraco.Web.BackOffice/Umbraco.Web.BackOffice.csproj @@ -7,7 +7,6 @@ Umbraco.Cms.Web.BackOffice Umbraco CMS Back Office Contains the Back Office assembly needed to run the back office of Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - enable diff --git a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs index f73fb1b0ae..6ebb825eae 100644 --- a/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs +++ b/src/Umbraco.Web.Common/AspNetCore/AspNetCoreHostingEnvironment.cs @@ -34,7 +34,7 @@ namespace Umbraco.Cms.Web.Common.AspNetCore IOptionsMonitor hostingSettings, IOptionsMonitor webRoutingSettings, IWebHostEnvironment webHostEnvironment) - : this(hostingSettings, webRoutingSettings, webHostEnvironment, serviceProvider.GetService()) + : this(hostingSettings, webRoutingSettings, webHostEnvironment, serviceProvider.GetService()!) { } diff --git a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs index 868942653b..c98cb38e82 100644 --- a/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs +++ b/src/Umbraco.Web.Common/DependencyInjection/UmbracoBuilderExtensions.cs @@ -96,7 +96,7 @@ namespace Umbraco.Extensions StaticApplicationLogging.Initialize(new SerilogLoggerFactory()); // The DataDirectory is used to resolve database file paths (directly supported by SQL CE and manually replaced for LocalDB) - AppDomain.CurrentDomain.SetData("DataDirectory", webHostEnvironment?.MapPathContentRoot(Constants.SystemDirectories.Data)); + AppDomain.CurrentDomain.SetData("DataDirectory", webHostEnvironment.MapPathContentRoot(Constants.SystemDirectories.Data)); // Manually create and register the HttpContextAccessor. In theory this should not be registered // again by the user but if that is the case it's not the end of the world since HttpContextAccessor diff --git a/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs b/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs index 398cb40980..d6e439f328 100644 --- a/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/ApplicationDiscriminatorExtensions.cs @@ -9,7 +9,7 @@ namespace Umbraco.Cms.Web.Common.Extensions /// public static class ApplicationDiscriminatorExtensions { - private static string s_applicationId; + private static string? s_applicationId; /// /// Gets an application id which respects downstream customizations. @@ -17,7 +17,7 @@ namespace Umbraco.Cms.Web.Common.Extensions /// /// Hashed to obscure any unintended infrastructure details e.g. the default value is ContentRootPath. /// - public static string GetApplicationId(this IApplicationDiscriminator applicationDiscriminator) + public static string? GetApplicationId(this IApplicationDiscriminator applicationDiscriminator) { if (s_applicationId != null) { @@ -29,7 +29,7 @@ namespace Umbraco.Cms.Web.Common.Extensions throw new ArgumentNullException(nameof(applicationDiscriminator)); } - return s_applicationId = applicationDiscriminator.Discriminator.GenerateHash(); + return s_applicationId = applicationDiscriminator.Discriminator?.GenerateHash(); } } } diff --git a/src/Umbraco.Web.Common/Extensions/ServiceCollectionExtensions.cs b/src/Umbraco.Web.Common/Extensions/ServiceCollectionExtensions.cs index f5a57161d4..4c9d7d6c26 100644 --- a/src/Umbraco.Web.Common/Extensions/ServiceCollectionExtensions.cs +++ b/src/Umbraco.Web.Common/Extensions/ServiceCollectionExtensions.cs @@ -176,7 +176,7 @@ namespace Umbraco.Extensions /// public static TypeLoader AddTypeLoader( this IServiceCollection services, - Assembly entryAssembly, + Assembly? entryAssembly, ILoggerFactory loggerFactory, IConfiguration configuration) { diff --git a/src/Umbraco.Web.Common/Hosting/UmbracoHostBuilderDecorator.cs b/src/Umbraco.Web.Common/Hosting/UmbracoHostBuilderDecorator.cs index b2f6fc112c..72fedae468 100644 --- a/src/Umbraco.Web.Common/Hosting/UmbracoHostBuilderDecorator.cs +++ b/src/Umbraco.Web.Common/Hosting/UmbracoHostBuilderDecorator.cs @@ -9,9 +9,9 @@ namespace Umbraco.Cms.Web.Common.Hosting; internal class UmbracoHostBuilderDecorator : IHostBuilder { private readonly IHostBuilder _inner; - private readonly Action _onBuild; + private readonly Action? _onBuild; - public UmbracoHostBuilderDecorator(IHostBuilder inner, Action onBuild = null) + public UmbracoHostBuilderDecorator(IHostBuilder inner, Action? onBuild = null) { _inner = inner; _onBuild = onBuild; @@ -29,10 +29,12 @@ internal class UmbracoHostBuilderDecorator : IHostBuilder public IHostBuilder ConfigureServices(Action configureDelegate) => _inner.ConfigureServices(configureDelegate); - public IHostBuilder UseServiceProviderFactory(IServiceProviderFactory factory) => + public IHostBuilder UseServiceProviderFactory(IServiceProviderFactory factory) + where TContainerBuilder : notnull => _inner.UseServiceProviderFactory(factory); - public IHostBuilder UseServiceProviderFactory(Func> factory) => + public IHostBuilder UseServiceProviderFactory(Func> factory) + where TContainerBuilder : notnull => _inner.UseServiceProviderFactory(factory); public IDictionary Properties => _inner.Properties; diff --git a/src/Umbraco.Web.Common/Logging/RegisteredReloadableLogger.cs b/src/Umbraco.Web.Common/Logging/RegisteredReloadableLogger.cs index 4bc8ac1dbc..2a6845906b 100644 --- a/src/Umbraco.Web.Common/Logging/RegisteredReloadableLogger.cs +++ b/src/Umbraco.Web.Common/Logging/RegisteredReloadableLogger.cs @@ -15,7 +15,7 @@ internal class RegisteredReloadableLogger private static object s_frozenLock = new(); private readonly ReloadableLogger _logger; - public RegisteredReloadableLogger(ReloadableLogger logger) => + public RegisteredReloadableLogger(ReloadableLogger? logger) => _logger = logger ?? throw new ArgumentNullException(nameof(logger)); public ILogger Logger => _logger; diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index d1f34f2079..a2c7dcb475 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -1,5 +1,13 @@ + + net6.0 + Library + Umbraco.Cms.Web.Common + Umbraco.Cms.Web.Common + Umbraco CMS Web + Contains the Web assembly needed to run Umbraco Cms. This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco + net6.0 Library diff --git a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj index 32eea20fed..0bb0b6c0ad 100644 --- a/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj +++ b/src/Umbraco.Web.Website/Umbraco.Web.Website.csproj @@ -7,7 +7,6 @@ Umbraco.Cms.Web.Website Umbraco CMS Website Contains the Website assembly needed to run Umbraco Cms (Front office). This package only contains the assembly, and can be used for package development. Use the template in the Umbraco.Templates package to setup Umbraco - enable