mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2026-02-09 09:16:41 +08:00
Support for custom properties in shell settings (Settings.txt) file.
--HG-- branch : 1.x
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user