77using System . Collections . Generic ;
88using System . Linq ;
99using Microsoft . Extensions . Configuration ;
10- using Xtensive . Collections ;
1110using Xtensive . Core ;
1211using Xtensive . Orm . Configuration . Options ;
1312
1413namespace 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