Support for custom properties in shell settings (Settings.txt) file.

--HG--
branch : 1.x
This commit is contained in:
Piotr Szmyd
2013-05-07 20:52:23 +02:00
parent 159fc5feec
commit 7d6d384806
3 changed files with 127 additions and 37 deletions

View File

@@ -68,6 +68,36 @@ namespace Orchard.Tests.Environment.Configuration {
Assert.That(text, Is.StringContaining("Quux"));
}
[Test]
public void CustomSettingsCanBeRetrieved() {
_appDataFolder.CreateFile("Sites\\Default\\Settings.txt", "Name: Default\r\nProperty1: Foo\r\nProperty2: Bar");
IShellSettingsManager loader = new ShellSettingsManager(_appDataFolder, new Mock<IShellSettingsManagerEventHandler>().Object);
Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1));
var settings = loader.LoadSettings().First();
Assert.That(settings.Name, Is.EqualTo("Default"));
Assert.That(settings["Property1"], Is.EqualTo("Foo"));
Assert.That(settings["Property2"], Is.EqualTo("Bar"));
}
[Test]
public void CustomSettingsCanBeStoredAndRetrieved() {
IShellSettingsManager loader = new ShellSettingsManager(_appDataFolder, new Mock<IShellSettingsManagerEventHandler>().Object);
var foo = new ShellSettings { Name = "Default" };
foo["Property1"] = "Foo";
foo["Property2"] = "Bar";
loader.SaveSettings(foo);
Assert.That(loader.LoadSettings().Count(), Is.EqualTo(1));
var settings = loader.LoadSettings().First();
Assert.That(settings.Name, Is.EqualTo("Default"));
Assert.That(settings["Property1"], Is.EqualTo("Foo"));
Assert.That(settings["Property2"], Is.EqualTo("Bar"));
}
[Test]
public void EncryptionSettingsAreStoredAndReadable() {
IShellSettingsManager loader = new ShellSettingsManager(_appDataFolder, new Mock<IShellSettingsManagerEventHandler>().Object);

View File

@@ -1,4 +1,7 @@
namespace Orchard.Environment.Configuration {
using System;
using System.Collections.Generic;
namespace Orchard.Environment.Configuration {
/// <summary>
/// Represents the minimalistic set of fields stored for each tenant. This
/// model is obtained from the IShellSettingsManager, which by default reads this
@@ -6,13 +9,19 @@
/// </summary>
public class ShellSettings {
public const string DefaultName = "Default";
private TenantState _tenantState;
private string[] _themes;
private readonly IDictionary<string, string> _values;
public ShellSettings() {
_values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
State = new TenantState("Invalid");
Themes = new string[0];
}
public ShellSettings(ShellSettings settings) {
_values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
Name = settings.Name;
DataProvider = settings.DataProvider;
DataConnectionString = settings.DataConnectionString;
@@ -27,61 +36,119 @@
Themes = settings.Themes;
}
/// <summary>
/// The name pf the tenant
/// </summary>
public string Name { get; set; }
public string this[string key] {
get {
string retVal;
return _values.TryGetValue(key, out retVal) ? retVal : null;
}
set { _values[key] = value; }
}
/// <summary>
/// The database provider
/// Gets all keys held by this shell settings.
/// </summary>
public string DataProvider { get; set; }
public IEnumerable<string> Keys { get { return _values.Keys; } }
/// <summary>
/// The name of the tenant
/// </summary>
public string Name {
get { return this["Name"] ?? ""; }
set { _values["Name"] = value; }
}
/// <summary>
/// The database provider for the tenant
/// </summary>
public string DataProvider {
get { return this["DataProvider"] ?? ""; }
set { _values["DataProvider"] = value; }
}
/// <summary>
/// The database connection string
/// </summary>
public string DataConnectionString { get; set; }
public string DataConnectionString {
get { return this["DataConnectionString"]; }
set { _values["DataConnectionString"] = value; }
}
/// <summary>
/// The data table prefix added to table names for this tenant
/// </summary>
public string DataTablePrefix { get; set; }
public string DataTablePrefix {
get { return this["DataTablePrefix"]; }
set { _values["DataTablePrefix"] = value; }
}
/// <summary>
/// The host name of the tenant
/// </summary>
public string RequestUrlHost { get; set; }
public string RequestUrlPrefix { get; set; }
public string RequestUrlHost {
get { return this["RequestUrlHost"]; }
set { _values["RequestUrlHost"] = value; }
}
/// <summary>
/// The request url prefix of the tenant
/// </summary>
public string RequestUrlPrefix {
get { return this["RequestUrlPrefix"]; }
set { _values["RequestUrlPrefix"] = value; }
}
/// <summary>
/// The encryption algorithm used for encryption services
/// </summary>
public string EncryptionAlgorithm { get; set; }
public string EncryptionAlgorithm {
get { return this["EncryptionAlgorithm"]; }
set { _values["EncryptionAlgorithm"] = value; }
}
/// <summary>
/// The encryption key used for encryption services
/// </summary>
public string EncryptionKey { get; set; }
public string EncryptionKey {
get { return this["EncryptionKey"]; }
set { _values["EncryptionKey"] = value; }
}
/// <summary>
/// The hash algorithm used for encryption services
/// </summary>
public string HashAlgorithm { get; set; }
public string HashAlgorithm {
get { return this["HashAlgorithm"]; }
set { _values["HashAlgorithm"] = value; }
}
/// <summary>
/// The hash key used for encryption services
/// </summary>
public string HashKey { get; set; }
public string HashKey {
get { return this["HashKey"]; }
set { _values["HashKey"] = value; }
}
/// <summary>
/// List of available themes for this tenant
/// </summary>
public string[] Themes { get; set; }
public string[] Themes {
get { return _themes ?? (Themes = (_values["Themes"] ?? "").Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)); }
set {
_themes = value;
_values["Themes"] = string.Join(";", value);
}
}
/// <summary>
/// The state is which the tenant is
/// </summary>
public TenantState State { get; set; }
public TenantState State {
get { return _tenantState; }
set {
_tenantState = value;
_values["State"] = value.ToString();
}
}
}
}

View File

@@ -1,8 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text;
namespace Orchard.Environment.Configuration {
public class ShellSettingsSerializer {
@@ -18,7 +16,7 @@ namespace Orchard.Environment.Configuration {
var settings = new StringReader(text);
string setting;
while ((setting = settings.ReadLine()) != null) {
if (string.IsNullOrWhiteSpace(setting)) continue; ;
if (string.IsNullOrWhiteSpace(setting)) continue;
var separatorIndex = setting.IndexOf(Separator);
if (separatorIndex == -1) {
continue;
@@ -26,7 +24,7 @@ namespace Orchard.Environment.Configuration {
string key = setting.Substring(0, separatorIndex).Trim();
string value = setting.Substring(separatorIndex + 1).Trim();
if (value != EmptyValue) {
if (!value.Equals(EmptyValue, StringComparison.OrdinalIgnoreCase)) {
switch (key) {
case "Name":
shellSettings.Name = value;
@@ -64,6 +62,9 @@ namespace Orchard.Environment.Configuration {
case "Themes":
shellSettings.Themes = value.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
break;
default:
shellSettings[key] = value;
break;
}
}
}
@@ -75,20 +76,12 @@ namespace Orchard.Environment.Configuration {
if (settings == null)
return "";
return string.Format("Name: {0}\r\nDataProvider: {1}\r\nDataConnectionString: {2}\r\nDataPrefix: {3}\r\nRequestUrlHost: {4}\r\nRequestUrlPrefix: {5}\r\nState: {6}\r\nEncryptionAlgorithm: {7}\r\nEncryptionKey: {8}\r\nHashAlgorithm: {9}\r\nHashKey: {10}\r\nThemes: {11}\r\n",
settings.Name,
settings.DataProvider,
settings.DataConnectionString ?? EmptyValue,
settings.DataTablePrefix ?? EmptyValue,
settings.RequestUrlHost ?? EmptyValue,
settings.RequestUrlPrefix ?? EmptyValue,
settings.State != null ? settings.State.ToString() : String.Empty,
settings.EncryptionAlgorithm ?? EmptyValue,
settings.EncryptionKey ?? EmptyValue,
settings.HashAlgorithm ?? EmptyValue,
settings.HashKey ?? EmptyValue,
String.Join(";", settings.Themes ?? new string[0])
);
var sb = new StringBuilder();
foreach (var key in settings.Keys) {
sb.AppendLine(key + ":" + (settings[key] ?? EmptyValue));
}
return sb.ToString();
}
}
}