Skip to content

Commit b5ad889

Browse files
committed
IConfigurationSectionParser -> IConfigurationSectionReader
1 parent 8d6da21 commit b5ad889

5 files changed

Lines changed: 251 additions & 114 deletions

File tree

Orm/Xtensive.Orm/Orm/Configuration/DomainConfiguration.cs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -881,20 +881,21 @@ private static DomainConfiguration LoadConfigurationFromSection(ConfigurationSec
881881
/// <exception cref="InvalidOperationException">The "domains" section is not found or domain with requested name is not found.</exception>
882882
public static DomainConfiguration Load(IConfigurationSection configurationSection, string name)
883883
{
884-
var allDomainsSection = configurationSection.GetSection("Domains");
885-
if (allDomainsSection != null && allDomainsSection.GetChildren().Any()) {
886-
var domainSection = allDomainsSection.GetSection(name);
887-
if (domainSection.GetChildren().Any()) {
888-
var parseResult = new FromJsonToDomainConfigurationParser().Parse(domainSection);
889-
if (parseResult != null)
890-
return parseResult;
891-
}
892-
else if ((domainSection = allDomainsSection.GetSection($"Domain:{name}")).GetChildren().Any()) {
893-
var parseResult = new XmlDomainConfigParser().Parse(domainSection);
894-
if (parseResult != null)
895-
return parseResult;
896-
}
897-
}
884+
ArgumentValidator.EnsureArgumentNotNull(configurationSection, nameof(configurationSection));
885+
886+
var jsonParser = new JsonToDomainConfigurationReader();
887+
var xmlParser = new XmlToDomainConfigurationReader();
888+
889+
var parseResult = jsonParser.Read(configurationSection, name);
890+
if (parseResult != null)
891+
return parseResult;
892+
parseResult = xmlParser.Read(configurationSection, name);
893+
if (parseResult != null)
894+
return parseResult;
895+
896+
throw new InvalidOperationException(string.Format(
897+
Strings.ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile, name, sectionName));
898+
}
898899

899900
throw new InvalidOperationException(string.Format(
900901
Strings.ExConfigurationForDomainIsNotFoundInApplicationConfigurationFile, name, sectionName));
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Copyright (C) 2024 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
4+
5+
6+
using Microsoft.Extensions.Configuration;
7+
8+
namespace Xtensive.Orm.Configuration
9+
{
10+
/// <summary>
11+
/// Reads certain type of configuration (DomainConfiguration, LoggingConfiguration, etc.) from IConfigurationSection API
12+
/// </summary>
13+
/// <typeparam name="TConfiguration"></typeparam>
14+
public interface IConfigurationSectionReader<TConfiguration>
15+
{
16+
/// <summary>
17+
/// Reads configuration from given configuration section.
18+
/// </summary>
19+
/// <param name="configurationSection">Root configuration section where specific configuration is placed (for domain configuration - where all domain configurations).</param>
20+
/// <returns>Instance of configuration.</returns>
21+
TConfiguration Read(IConfigurationSection configurationSection);
22+
23+
/// <summary>
24+
/// Reads configuration from given configuration section with specified name (if named configuration supported e.g. doman configuration)
25+
/// </summary>
26+
/// <param name="configurationSection">Root configuration section where specific configuration is placed (for domain configuration - where all domain configurations).</param>
27+
/// <param name="nameOfConfiguration">Name of configuration.</param>
28+
/// <returns>Instance of configuration.</returns>
29+
TConfiguration Read(IConfigurationSection configurationSection, string nameOfConfiguration);
30+
31+
/// <summary>
32+
/// Reads configuration (with default name if name is required) from default section (and with default name) from given configuration root.
33+
/// </summary>
34+
/// <param name="configurationRoot">Root of all configuration sections.</param>
35+
/// <returns>Instance of configuration.</returns>
36+
TConfiguration Read(IConfigurationRoot configurationRoot);
37+
38+
/// <summary>
39+
/// Reads configuration (with default name if name is required) from given section of given configuration root.
40+
/// </summary>
41+
/// <param name="configurationRoot">Root of all configuration sections.</param>
42+
/// <param name="sectionName">Specific section name from which configuration should be read.</param>
43+
/// <returns>Instance of configuration.</returns>
44+
TConfiguration Read(IConfigurationRoot configurationRoot, string sectionName);
45+
46+
/// <summary>
47+
/// Reads configuration with given name from given section of given configuration root.
48+
/// </summary>
49+
/// <param name="configurationRoot">Root of all configuration sections.</param>
50+
/// <param name="sectionName">Specific section name from which configuration should be read.</param>
51+
/// <param name="nameOfConfiguration">Name of configuration.</param>
52+
/// <returns>Instance of configuration.</returns>
53+
TConfiguration Read(IConfigurationRoot configurationRoot, string sectionName, string nameOfConfiguration);
54+
}
55+
}

Orm/Xtensive.Orm/Orm/Configuration/Internals/DomainConfigurationParsers.cs renamed to Orm/Xtensive.Orm/Orm/Configuration/Internals/DomainConfigurationReaders.cs

Lines changed: 84 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -7,93 +7,22 @@
77
using System.Collections.Generic;
88
using System.Linq;
99
using Microsoft.Extensions.Configuration;
10-
using Xtensive.Collections;
1110
using Xtensive.Core;
1211
using Xtensive.Orm.Configuration.Options;
1312

1413
namespace Xtensive.Orm.Configuration.Internals
1514
{
16-
internal interface IConfigurationSectionParser<TConfiguration>
15+
internal sealed class XmlToDomainConfigurationReader : DomainConfigurationReader
1716
{
18-
TConfiguration Parse(IConfiguration configuration);
19-
20-
TConfiguration Parse(IConfigurationRoot configuration, string sectionName);
21-
}
22-
23-
internal sealed class LoggingConfigurationParser : IConfigurationSectionParser<LoggingConfiguration>
24-
{
25-
private const string LoggingSectionName = "Logging";
26-
private const string LogsSectionName = "Logs";
27-
28-
private const string ProviderElementName = "Provider";
29-
private const string LogElementName = "Log";
30-
private const string LogSourceElementName = "Source";
31-
private const string LogTargerElementName = "Target";
32-
33-
public LoggingConfiguration Parse(IConfiguration configuration)
34-
{
35-
ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration));
36-
37-
if (configuration is IConfigurationRoot configurationRoot) {
38-
return Parse(configurationRoot, WellKnown.DefaultConfigurationSection);
39-
}
40-
else if (configuration is IConfigurationSection configurationSection) {
41-
return Parse(configurationSection);
42-
}
43-
throw new InvalidOperationException("");
44-
}
45-
46-
public LoggingConfiguration Parse(IConfigurationRoot configuration, string sectionName)
17+
protected override bool ValidateCorrectFormat(IConfigurationSection allDomainsSection, string domainName)
4718
{
48-
ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration));
49-
ArgumentValidator.EnsureArgumentNotNullOrEmpty(sectionName, nameof(sectionName));
50-
51-
return Parse(configuration.GetSection(sectionName));
19+
return !allDomainsSection.GetSection(domainName).GetChildren().Any()
20+
&& allDomainsSection.GetSection(string.Format(NamedDomainTemplate, domainName)).GetChildren().Any();
5221
}
5322

54-
public LoggingConfiguration Parse(IConfigurationSection configurationSection)
55-
{
56-
ArgumentValidator.EnsureArgumentNotNull(configurationSection, nameof(configurationSection));
23+
protected override IConfigurationSection GetDomainSection(IConfigurationSection allDomainsSection, string domainName) =>
24+
allDomainsSection.GetSection(string.Format(NamedDomainTemplate, domainName));
5725

58-
var ormConfigurationSection = configurationSection;
59-
60-
var loggingSection = ormConfigurationSection.GetSection(LoggingSectionName);
61-
62-
if (loggingSection != null && loggingSection.GetChildren().Any()) {
63-
var provider = loggingSection.GetSection(ProviderElementName)?.Value;
64-
var logsSection = loggingSection.GetSection(LogsSectionName);
65-
IConfigurationSection logElement;
66-
67-
if (logsSection != null && logsSection.GetChildren().Any()) {
68-
logElement = logsSection.GetSection(LogElementName);
69-
if (logElement == null || !logElement.GetChildren().Any()) {
70-
logElement = logsSection;
71-
}
72-
}
73-
else {
74-
logElement = loggingSection.GetSection(LogElementName);
75-
}
76-
77-
var configuration = new LoggingConfiguration(provider);
78-
79-
foreach (var logItem in logElement.GetSelfOrChildren()) {
80-
var source = logItem.GetSection(LogSourceElementName).Value;
81-
var target = logItem.GetSection(LogTargerElementName).Value;
82-
if (source.IsNullOrEmpty() || target.IsNullOrEmpty())
83-
throw new InvalidOperationException();
84-
configuration.Logs.Add(new LogConfiguration(source, target));
85-
}
86-
87-
return configuration;
88-
}
89-
90-
throw new InvalidOperationException(
91-
string.Format(Strings.ExSectionIsNotFoundInApplicationConfigurationFile, WellKnown.DefaultConfigurationSection));
92-
}
93-
}
94-
95-
internal sealed class XmlDomainConfigParser : DomainConfigurationParser
96-
{
9726
protected override void ProcessNamingConvention(IConfigurationSection namingConventionSection, DomainConfigurationOptions domainConfiguratonOptions)
9827
{
9928
if (namingConventionSection == null) {
@@ -245,8 +174,17 @@ private void ProcessCollectionOfOptions<TOption>(IConfigurationSection collectio
245174
}
246175
}
247176

248-
internal class FromJsonToDomainConfigurationParser : DomainConfigurationParser
177+
internal sealed class JsonToDomainConfigurationReader : DomainConfigurationReader
249178
{
179+
protected override bool ValidateCorrectFormat(IConfigurationSection allDomainsSection, string domainName)
180+
{
181+
return allDomainsSection.GetSection(domainName).GetChildren().Any()
182+
&& !allDomainsSection.GetSection(string.Format(NamedDomainTemplate, domainName)).GetChildren().Any();
183+
}
184+
185+
protected override IConfigurationSection GetDomainSection(IConfigurationSection allDomainsSection, string domainName) =>
186+
allDomainsSection.GetSection(domainName);
187+
250188
protected override void ProcessNamingConvention(IConfigurationSection namingConventionSection, DomainConfigurationOptions domainConfiguratonOptions)
251189
{
252190
if (namingConventionSection == null || !namingConventionSection.GetChildren().Any())
@@ -258,7 +196,7 @@ protected override void ProcessNamingConvention(IConfigurationSection namingConv
258196
}
259197
}
260198

261-
internal abstract class DomainConfigurationParser : IConfigurationSectionParser<DomainConfiguration>
199+
internal abstract class DomainConfigurationReader : IConfigurationSectionReader<DomainConfiguration>
262200
{
263201
protected const string RuleElementName = "Rule";
264202
protected const string KeyGeneratorElementName = "KeyGenerator";
@@ -277,31 +215,78 @@ internal abstract class DomainConfigurationParser : IConfigurationSectionParser<
277215
protected const string MappingRulesSectionName = "MappingRules";
278216
protected const string SessionsSectionName = "Sessions";
279217
protected const string NamespaceSynonymSectionName = "NamespaceSynonyms";
280-
281-
public DomainConfiguration Parse(IConfiguration configuration)
218+
protected const string DomainsSectionName = "Domains";
219+
220+
protected const string NamedDomainTemplate = "Domain:{0}";
221+
222+
/// <summary>
223+
/// Gets domain configuration with name "Default" from <see cref="WellKnown.DefaultConfigurationSection">default section</see>.
224+
/// </summary>
225+
/// <param name="configurationRoot"></param>
226+
/// <returns></returns>
227+
public DomainConfiguration Read(IConfigurationRoot configurationRoot) =>
228+
Read(configurationRoot, WellKnown.DefaultConfigurationSection, "Default");
229+
230+
/// <summary>
231+
/// Gets domain configuration with name "Default" from <paramref name="configurationRoot"/>.
232+
/// </summary>
233+
/// <param name="configurationRoot"></param>
234+
/// <param name="sectionName"></param>
235+
/// <returns></returns>
236+
public DomainConfiguration Read(IConfigurationRoot configurationRoot, string sectionName) =>
237+
Read(configurationRoot, sectionName, "Default");
238+
239+
/// <summary>
240+
/// Gets domain configuration with given name from <paramref name="configurationRoot"/>.
241+
/// </summary>
242+
/// <param name="configurationRoot"></param>
243+
/// <param name="sectionName"></param>
244+
/// <param name="nameOfConfiguration"></param>
245+
/// <returns></returns>
246+
public DomainConfiguration Read(IConfigurationRoot configurationRoot, string sectionName, string nameOfConfiguration)
282247
{
283-
if (configuration is IConfigurationRoot configurationRoot) {
284-
return Parse(configurationRoot, WellKnown.DefaultConfigurationSection);
285-
}
286-
else if (configuration is IConfigurationSection configurationSection) {
287-
return Parse(configurationSection);
288-
}
289-
throw new InvalidOperationException("");
290-
}
248+
var allDomainsSection = configurationRoot.GetSection(sectionName).GetSection(DomainsSectionName);
249+
if (allDomainsSection == null || !allDomainsSection.GetChildren().Any())
250+
return null;
291251

292-
public DomainConfiguration Parse(IConfigurationRoot configuration, string sectionName)
293-
{
294-
var context = new ConfigurationParserContext(configuration, sectionName);
295-
return ParseInternal(context);
252+
var domainConfigurationSection = GetDomainSection(allDomainsSection, nameOfConfiguration);
253+
if (domainConfigurationSection == null || !domainConfigurationSection.GetChildren().Any())
254+
return null;
255+
256+
var connectionStrings = configurationRoot.GetSection("ConnectionStrings").Get<Dictionary<string, string>>();
257+
var context = new ConfigurationParserContext(domainConfigurationSection, connectionStrings);
258+
259+
return ReadInternal(context);
296260
}
297261

298-
public DomainConfiguration Parse(IConfigurationSection domainConfiguration, Dictionary<string, string> connectionStrings = null)
262+
public DomainConfiguration Read(IConfigurationSection rootSection) =>
263+
Parse(rootSection, "Default", null);
264+
265+
public DomainConfiguration Read(IConfigurationSection rootSection, string nameOfConfiguration) =>
266+
Parse(rootSection, nameOfConfiguration, null);
267+
268+
public DomainConfiguration Parse(IConfigurationSection rootSection, Dictionary<string, string> connectionStrings)
269+
=> Parse(rootSection, "Default", connectionStrings);
270+
271+
public DomainConfiguration Parse(IConfigurationSection rootSection, string nameOfConfiguration, Dictionary<string, string> connectionStrings)
299272
{
300-
var context = new ConfigurationParserContext(domainConfiguration, connectionStrings);
301-
return ParseInternal(context);
273+
var allDomainsSection = rootSection.GetSection(DomainsSectionName);
274+
if (allDomainsSection == null || !allDomainsSection.GetChildren().Any())
275+
return null;
276+
277+
var domainConfigurationSection = GetDomainSection(allDomainsSection, nameOfConfiguration);
278+
if (domainConfigurationSection == null || !domainConfigurationSection.GetChildren().Any())
279+
return null;
280+
281+
var context = new ConfigurationParserContext(domainConfigurationSection, connectionStrings);
282+
return ReadInternal(context);
302283
}
303284

304-
private DomainConfiguration ParseInternal(ConfigurationParserContext context)
285+
protected abstract bool ValidateCorrectFormat(IConfigurationSection allDomainsSection, string domainName);
286+
287+
protected abstract IConfigurationSection GetDomainSection(IConfigurationSection allDomainsSection, string domainName);
288+
289+
private DomainConfiguration ReadInternal(ConfigurationParserContext context)
305290
{
306291
var domainByNameSection = context.CurrentSection;
307292
if (domainByNameSection == null || !domainByNameSection.GetChildren().Any()) {
@@ -357,6 +342,8 @@ protected virtual void ProcessMappingRules(IConfigurationSection mappingRulesSec
357342
protected virtual void ProcessSessions(IConfigurationSection sessionsSection, DomainConfigurationOptions domainConfiguratonOptions)
358343
{
359344
}
345+
346+
360347
}
361348

362349
internal sealed class ConfigurationParserContext

0 commit comments

Comments
 (0)