| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 | using MediaBrowser.Common.Configuration;using MediaBrowser.Common.Implementations.Configuration;using MediaBrowser.Controller;using MediaBrowser.Controller.Configuration;using MediaBrowser.Model.Configuration;using MediaBrowser.Model.Logging;using MediaBrowser.Model.Serialization;using System;using System.IO;namespace MediaBrowser.Server.Implementations.Configuration{    /// <summary>    /// Class ServerConfigurationManager    /// </summary>    public class ServerConfigurationManager : BaseConfigurationManager, IServerConfigurationManager    {        /// <summary>        /// Initializes a new instance of the <see cref="ServerConfigurationManager" /> class.        /// </summary>        /// <param name="applicationPaths">The application paths.</param>        /// <param name="logManager">The log manager.</param>        /// <param name="xmlSerializer">The XML serializer.</param>        public ServerConfigurationManager(IApplicationPaths applicationPaths, ILogManager logManager, IXmlSerializer xmlSerializer)            : base(applicationPaths, logManager, xmlSerializer)        {            UpdateItemsByNamePath();            UpdateTranscodingTempPath();            UpdateMetadataPath();        }        /// <summary>        /// Gets the type of the configuration.        /// </summary>        /// <value>The type of the configuration.</value>        protected override Type ConfigurationType        {            get { return typeof(ServerConfiguration); }        }        /// <summary>        /// Gets the application paths.        /// </summary>        /// <value>The application paths.</value>        public IServerApplicationPaths ApplicationPaths        {            get { return (IServerApplicationPaths)CommonApplicationPaths; }        }        /// <summary>        /// Gets the configuration.        /// </summary>        /// <value>The configuration.</value>        public ServerConfiguration Configuration        {            get { return (ServerConfiguration)CommonConfiguration; }        }        /// <summary>        /// Called when [configuration updated].        /// </summary>        protected override void OnConfigurationUpdated()        {            UpdateItemsByNamePath();            UpdateTranscodingTempPath();            UpdateMetadataPath();            base.OnConfigurationUpdated();        }        /// <summary>        /// Updates the items by name path.        /// </summary>        private void UpdateItemsByNamePath()        {            ((ServerApplicationPaths) ApplicationPaths).ItemsByNamePath = string.IsNullOrEmpty(Configuration.ItemsByNamePath) ?                 null :                 Configuration.ItemsByNamePath;        }        /// <summary>        /// Updates the metadata path.        /// </summary>        private void UpdateMetadataPath()        {            ((ServerApplicationPaths)ApplicationPaths).InternalMetadataPath = string.IsNullOrEmpty(Configuration.MetadataPath) ?                null :                Configuration.MetadataPath;        }        /// <summary>        /// Updates the transcoding temporary path.        /// </summary>        private void UpdateTranscodingTempPath()        {            ((ServerApplicationPaths)ApplicationPaths).TranscodingTempPath = string.IsNullOrEmpty(Configuration.TranscodingTempPath) ?                null :                Configuration.TranscodingTempPath;        }        /// <summary>        /// Replaces the configuration.        /// </summary>        /// <param name="newConfiguration">The new configuration.</param>        /// <exception cref="System.IO.DirectoryNotFoundException"></exception>        public override void ReplaceConfiguration(BaseApplicationConfiguration newConfiguration)        {            var newConfig = (ServerConfiguration) newConfiguration;            ValidateItemByNamePath(newConfig);            ValidateTranscodingTempPath(newConfig);            ValidatePathSubstitutions(newConfig);            ValidateMetadataPath(newConfig);            base.ReplaceConfiguration(newConfiguration);        }        private void ValidatePathSubstitutions(ServerConfiguration newConfig)        {            foreach (var map in newConfig.PathSubstitutions)            {                if (string.IsNullOrWhiteSpace(map.From) || string.IsNullOrWhiteSpace(map.To))                {                    throw new ArgumentException("Invalid path substitution");                }                if (!map.From.EndsWith(":\\") && !map.From.EndsWith(":/"))                {                    map.From = map.From.TrimEnd('/').TrimEnd('\\');                }                if (!map.To.EndsWith(":\\") && !map.To.EndsWith(":/"))                {                    map.To = map.To.TrimEnd('/').TrimEnd('\\');                }                if (string.IsNullOrWhiteSpace(map.From) || string.IsNullOrWhiteSpace(map.To))                {                    throw new ArgumentException("Invalid path substitution");                }            }        }        /// <summary>        /// Replaces the item by name path.        /// </summary>        /// <param name="newConfig">The new configuration.</param>        /// <exception cref="System.IO.DirectoryNotFoundException"></exception>        private void ValidateItemByNamePath(ServerConfiguration newConfig)        {            var newPath = newConfig.ItemsByNamePath;            if (!string.IsNullOrWhiteSpace(newPath)                && !string.Equals(Configuration.ItemsByNamePath ?? string.Empty, newPath))            {                // Validate                if (!Directory.Exists(newPath))                {                    throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));                }            }        }        /// <summary>        /// Validates the transcoding temporary path.        /// </summary>        /// <param name="newConfig">The new configuration.</param>        /// <exception cref="DirectoryNotFoundException"></exception>        private void ValidateTranscodingTempPath(ServerConfiguration newConfig)        {            var newPath = newConfig.TranscodingTempPath;            if (!string.IsNullOrWhiteSpace(newPath)                && !string.Equals(Configuration.TranscodingTempPath ?? string.Empty, newPath))            {                // Validate                if (!Directory.Exists(newPath))                {                    throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));                }            }        }        /// <summary>        /// Validates the metadata path.        /// </summary>        /// <param name="newConfig">The new configuration.</param>        /// <exception cref="System.IO.DirectoryNotFoundException"></exception>        private void ValidateMetadataPath(ServerConfiguration newConfig)        {            var newPath = newConfig.MetadataPath;            if (!string.IsNullOrWhiteSpace(newPath)                && !string.Equals(Configuration.MetadataPath ?? string.Empty, newPath))            {                // Validate                if (!Directory.Exists(newPath))                {                    throw new DirectoryNotFoundException(string.Format("{0} does not exist.", newPath));                }            }        }    }}
 |