Skip to content

Commit c44d6df

Browse files
committed
Refactor the XmlPersistanceService to use PersistancePathProvider
1 parent 5fe9af8 commit c44d6df

File tree

5 files changed

+29
-18
lines changed

5 files changed

+29
-18
lines changed

Rubberduck.SettingsProvider/IPersistanceService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
{
33
public interface IPersistanceService<T> where T : new()
44
{
5-
void Save(T settings);
6-
T Load(T settings);
5+
void Save(T settings, string nonDefaultFilePath = null);
6+
T Load(T settings, string nonDefaultFilePath = null);
77
}
88

99
public interface IFilePersistanceService<T> : IPersistanceService<T> where T : new()

Rubberduck.SettingsProvider/PersistancePathProvider.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ static PersistancePathProvider()
1212
LazyInstance = new Lazy<IPersistancePathProvider>(() => new PersistancePathProvider());
1313
}
1414

15+
// Disallow instancing of the class except via static method
16+
private PersistancePathProvider() { }
17+
1518
public string DataRootPath => Path.Combine(
1619
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
1720
"Rubberduck");

Rubberduck.SettingsProvider/XmlContractPersistanceService.cs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,26 @@ namespace Rubberduck.SettingsProvider
1515
RootNamespace = XmlDictionaryString.Empty
1616
};
1717

18+
public XmlContractPersistanceService(IPersistancePathProvider pathProvider) : base(pathProvider) { }
19+
1820
private string _filePath;
1921
public override string FilePath
2022
{
2123
get => _filePath ?? Path.Combine(RootPath, DefaultConfigFile);
2224
set => _filePath = value;
2325
}
2426

25-
public override T Load(T toDeserialize)
27+
public override T Load(T toDeserialize, string nonDefaultFilePath = null)
2628
{
27-
if (!File.Exists(FilePath))
29+
var filePath = string.IsNullOrWhiteSpace(nonDefaultFilePath) ? FilePath : nonDefaultFilePath;
30+
if (!File.Exists(filePath))
2831
{
2932
return Cached;
3033
}
3134

3235
try
3336
{
34-
using (var stream = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
37+
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
3538
using (var reader = XmlReader.Create(stream))
3639
{
3740
var serializer = new DataContractSerializer(typeof(T));
@@ -44,11 +47,12 @@ public override T Load(T toDeserialize)
4447
}
4548
}
4649

47-
public override void Save(T toSerialize)
50+
public override void Save(T toSerialize, string nonDefaultFilePath = null)
4851
{
49-
EnsurePathExists();
52+
var filePath = string.IsNullOrWhiteSpace(nonDefaultFilePath) ? FilePath : nonDefaultFilePath;
53+
EnsurePathExists(filePath);
5054

51-
using (var stream = new FileStream(FilePath, FileMode.Create, FileAccess.Write))
55+
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
5256
using (var writer = XmlWriter.Create(stream, OutputXmlSettings))
5357
{
5458
var serializer = new DataContractSerializer(typeof(T), SerializerSettings);

Rubberduck.SettingsProvider/XmlPersistanceService.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,12 @@ namespace Rubberduck.SettingsProvider
1010
public class XmlPersistanceService<T> : XmlPersistanceServiceBase<T>
1111
where T : class, IEquatable<T>, new()
1212
{
13-
public override T Load(T toDeserialize)
13+
public XmlPersistanceService(IPersistancePathProvider pathProvider) : base(pathProvider) { }
14+
15+
public override T Load(T toDeserialize, string nonDefaultFilePath = null)
1416
{
15-
var doc = GetConfigurationDoc(FilePath);
17+
var filePath = string.IsNullOrWhiteSpace(nonDefaultFilePath) ? FilePath : nonDefaultFilePath;
18+
var doc = GetConfigurationDoc(filePath);
1619
var node = GetNodeByName(doc, typeof(T).Name);
1720
if (node == null)
1821
{
@@ -35,9 +38,10 @@ public override T Load(T toDeserialize)
3538
}
3639

3740
[SuppressMessage("Microsoft.Usage", "CA2202:Do not dispose objects multiple times")] //This is fine. StreamWriter disposes the MemoryStream, but calling twice is a NOP.
38-
public override void Save(T toSerialize)
41+
public override void Save(T toSerialize, string nonDefaultFilePath = null)
3942
{
40-
var doc = GetConfigurationDoc(FilePath);
43+
var filePath = string.IsNullOrWhiteSpace(nonDefaultFilePath) ? FilePath : nonDefaultFilePath;
44+
var doc = GetConfigurationDoc(filePath);
4145
var node = GetNodeByName(doc, typeof(T).Name);
4246

4347
using (var stream = new MemoryStream())

Rubberduck.SettingsProvider/XmlPersistanceServiceBase.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ namespace Rubberduck.SettingsProvider
2828

2929
protected T Cached { get; set; }
3030

31-
protected XmlPersistanceServiceBase()
31+
protected XmlPersistanceServiceBase(IPersistancePathProvider pathProvider)
3232
{
33-
var pathProvider = PersistancePathProvider.Instance;
3433
RootPath = pathProvider.DataRootPath;
3534
}
3635

@@ -41,9 +40,9 @@ public virtual string FilePath
4140
set => _filePath = value;
4241
}
4342

44-
public abstract T Load(T toDeserialize);
43+
public abstract T Load(T toDeserialize, string nonDefaultFilePath = null);
4544

46-
public abstract void Save(T toSerialize);
45+
public abstract void Save(T toSerialize, string nonDefaultFilePath = null);
4746

4847
protected static T FailedLoadReturnValue()
4948
{
@@ -81,9 +80,10 @@ protected static XElement GetNodeByName(XContainer doc, string name)
8180
return doc.Descendants().FirstOrDefault(e => e.Name.LocalName.Equals(name));
8281
}
8382

84-
protected void EnsurePathExists()
83+
protected void EnsurePathExists(string nonDefaultFilePath = null)
8584
{
86-
var folder = Path.GetDirectoryName(FilePath);
85+
var filePath = string.IsNullOrWhiteSpace(nonDefaultFilePath) ? FilePath : nonDefaultFilePath;
86+
var folder = Path.GetDirectoryName(filePath);
8787
if (folder != null && !Directory.Exists(folder))
8888
{
8989
Directory.CreateDirectory(folder);

0 commit comments

Comments
 (0)