File: UI\WebParts\PersonalizationStateQuery.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="PersonalizationStateQuery.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Web.UI.WebControls.WebParts {
 
    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Web.Util;
 
    [Serializable]
    public sealed class PersonalizationStateQuery {
        private static readonly Dictionary<String, Type> _knownPropertyTypeMappings;
 
        private HybridDictionary _data;
 
        static PersonalizationStateQuery() {
            _knownPropertyTypeMappings = new Dictionary<String, Type>(StringComparer.OrdinalIgnoreCase);
            _knownPropertyTypeMappings["PathToMatch"] = typeof(string);
            _knownPropertyTypeMappings["UserInactiveSinceDate"] = typeof(DateTime);
            _knownPropertyTypeMappings["UsernameToMatch"] = typeof(string);
        }
 
        public PersonalizationStateQuery() {
            _data = new HybridDictionary(true);
 
            // VSWhidbey 357097: UserInactiveSinceDate needs to have a default value returned for the indexer property
            _data["UserInactiveSinceDate"] = PersonalizationAdministration.DefaultInactiveSinceDate;
        }
 
        public string PathToMatch {
            get {
                return (string) this["PathToMatch"];
            }
            set {
                if (value != null) {
                    value = value.Trim();
                }
                _data["PathToMatch"] = value;
            }
        }
 
        public DateTime UserInactiveSinceDate {
            get {
                object o = this["UserInactiveSinceDate"];
                Debug.Assert(o != null, "Should always have a default value!");
                return (DateTime) o;
            }
            set {
                _data["UserInactiveSinceDate"] = value;
            }
        }
 
        public string UsernameToMatch {
            get {
                return (string) this["UsernameToMatch"];
            }
            set {
                if (value != null) {
                    value = value.Trim();
                }
                _data["UsernameToMatch"] = value;
            }
        }
 
        public object this[string queryKey] {
            get {
                queryKey = StringUtil.CheckAndTrimString(queryKey, "queryKey");
                return _data[queryKey];
            }
            set {
                queryKey = StringUtil.CheckAndTrimString(queryKey, "queryKey");
 
                // VSWhidbey 436311: We need to check the value types for known properties
                if (_knownPropertyTypeMappings.ContainsKey(queryKey)) {
                    Type valueType = _knownPropertyTypeMappings[queryKey];
                    Debug.Assert(valueType != null);
                    if ((value == null && valueType.IsValueType) ||
                         (value != null && !valueType.IsAssignableFrom(value.GetType()))) {
                        throw new ArgumentException(
                            SR.GetString(SR.PersonalizationStateQuery_IncorrectValueType,
                                         queryKey, valueType.FullName));
                    }
                }
 
                _data[queryKey] = value;
            }
        }
    }
}