using System;
using System.IO;
using System.Xml;
using Umbraco.Core.Logging;
using Umbraco.Core.Services;
namespace Umbraco.Web.HealthCheck.Checks.Config
{
//TODO: Add config transform for when config with specified XPath is not found
public class ConfigurationService
{
private readonly string _configFilePath;
private readonly string _xPath;
private readonly ILocalizedTextService _textService;
/// The absolute file location of the configuration file
/// The XPath to select the value
///
public ConfigurationService(string configFilePath, string xPath, ILocalizedTextService textService)
{
_configFilePath = configFilePath;
_xPath = xPath;
_textService = textService;
}
///
/// Gets a value from a given configuration file with the given XPath
///
public ConfigurationServiceResult GetConfigurationValue()
{
try
{
if (File.Exists(_configFilePath) == false)
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceFileNotFound", new[] { _configFilePath })
};
var xmlDocument = new XmlDocument();
xmlDocument.Load(_configFilePath);
var xmlNode = xmlDocument.SelectSingleNode(_xPath);
if (xmlNode == null)
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceNodeNotFound", new[] { _xPath, _configFilePath })
};
return new ConfigurationServiceResult
{
Success = true,
Result = string.Format(xmlNode.Value ?? xmlNode.InnerText)
};
}
catch (Exception exception)
{
LogHelper.Error("Error trying to get configuration value", exception);
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceError", new[] { exception.Message })
};
}
}
///
/// Updates a value in a given configuration file with the given XPath
///
///
///
public ConfigurationServiceResult UpdateConfigFile(string value)
{
try
{
if (File.Exists(_configFilePath) == false)
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceFileNotFound", new[] { _configFilePath })
};
var xmlDocument = new XmlDocument { PreserveWhitespace = true };
xmlDocument.Load(_configFilePath);
var node = xmlDocument.SelectSingleNode(_xPath);
if (node == null)
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceNodeNotFound", new[] { _xPath, _configFilePath })
};
if (node.NodeType == XmlNodeType.Element)
node.InnerText = value;
else
node.Value = value;
xmlDocument.Save(_configFilePath);
return new ConfigurationServiceResult { Success = true };
}
catch (Exception exception)
{
LogHelper.Error("Error trying to update configuration", exception);
return new ConfigurationServiceResult
{
Success = false,
Result = _textService.Localize("healthcheck/configurationServiceError", new[] { exception.Message })
};
}
}
}
}