-
Notifications
You must be signed in to change notification settings - Fork 58
/
Copy pathConfigurationService.cs
117 lines (97 loc) · 3.59 KB
/
ConfigurationService.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
using Microsoft.Maui.Devices;
using QSF.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Xml.Serialization;
namespace QSF.Services
{
/// <summary>
/// The ConfigurationService is responsible for collecting all useful data from config.xml file.
/// </summary>
public class ConfigurationService : IConfigurationService
{
private const string ResourceLocation = "QSF.config.xml";
public ConfigurationService()
{
this.Configuration = LoadConfiguration(ResourceLocation);
}
public Configuration Configuration { get; private set; }
public IEnumerable<Control> GetControlsConfiguration()
{
return this.Configuration.Controls;
}
private static Configuration LoadConfiguration(string resource)
{
var type = typeof(ConfigurationService);
var typeInfo = type.GetTypeInfo();
var assembly = typeInfo.Assembly;
using (var stream = assembly.GetManifestResourceStream(resource))
{
var serializer = new XmlSerializer(typeof(Configuration));
var configuration = (Configuration)serializer.Deserialize(stream);
UpdateConfiguration(configuration);
UpdateControlStatuses(configuration);
return configuration;
}
}
private static void UpdateControlStatuses(Configuration configuration)
{
var count = configuration.Controls.Count;
for (int index = 0; index < count; index++)
{
var control = configuration.Controls[index];
if (control.Status == StatusType.Normal
&& control.Examples.Any(e => e.Status == StatusType.New || e.Status == StatusType.Updated))
{
// If we have updated or new example we want to mark the control as updated as well.
control.Status = StatusType.Updated;
}
}
}
private static void UpdateConfiguration(Configuration configuration)
{
var count = configuration.Controls.Count;
for (int index = count - 1; index >= 0; index--)
{
var control = configuration.Controls[index];
control.Configuration = configuration;
if (IsExcluded(control.ExcludeFrom))
{
configuration.Controls.RemoveAt(index);
}
else
{
UpdateControl(control);
if (control.Examples.Count == 0)
{
configuration.Controls.RemoveAt(index);
}
}
}
}
private static void UpdateControl(Control control)
{
var count = control.Examples.Count;
for (int index = count - 1; index >= 0; index--)
{
var example = control.Examples[index];
if (IsExcluded(example.ExcludeFrom))
{
control.Examples.RemoveAt(index);
}
}
}
private static bool IsExcluded(string exclusions)
{
if (string.IsNullOrEmpty(exclusions))
{
return false;
}
var platforms = exclusions.Split(',');
return platforms.Contains(DeviceInfo.Platform.ToString(),
StringComparer.OrdinalIgnoreCase);
}
}
}