public InvalidMessageTransformer(ConstraintValidatorContext constraintContext, ICollection<object> activeTags, System.Type @class, string propertyName,
		                                 object value, object entity, ValidatorDef validatorDef,
		                                 DefaultMessageInterpolatorAggregator defaultInterpolator,
		                                 IMessageInterpolator userInterpolator)
        {
            if (constraintContext == null)
            {
                throw new ArgumentNullException("constraintContext");
            }
            if (@class == null)
            {
                throw new ArgumentNullException("class");
            }
            if (validatorDef == null)
            {
                throw new ArgumentNullException("validatorDef");
            }
            if (defaultInterpolator == null)
            {
                throw new ArgumentNullException("defaultInterpolator");
            }

            this.constraintContext = constraintContext;
            this.activeTags = activeTags;
            this.@class = @class;
            this.propertyName = propertyName;
            this.value = value;
            this.entity = entity;
            this.validatorDef = validatorDef;
            this.defaultInterpolator = defaultInterpolator;
            this.userInterpolator = userInterpolator;
        }
        public void GetAttributeMessage()
        {
            var mia = new DefaultMessageInterpolatorAggregator();
            var va = new RangeValidator();
            try
            {
                mia.GetAttributeMessage(va);
            }
            catch (AssertionFailureException)
            {
                // Ok
            }
            var defrm =
                new ResourceManager(Environment.BaseNameOfMessageResource,
                                    typeof (DefaultMessageInterpolatorAggregator).Assembly);
            var custrm =
                new ResourceManager("NHibernate.Validator.Tests.Resource.Messages", Assembly.GetExecutingAssembly());
            var culture = new CultureInfo("en");

            mia.Initialize(custrm, defrm, culture);
            var a = new RangeAttribute(2, 10);
            va.Initialize(a);
            mia.AddInterpolator(a, va);
            Assert.IsFalse(string.IsNullOrEmpty(mia.GetAttributeMessage(va)));
        }
        public InvalidMessageTransformer(ConstraintValidatorContext constraintContext, 
            List<InvalidValue> results,
            System.Type @class,
            string propertyName /* nullable */,
            object value /* nullable */,
            object entity /* nullable */,
            IValidator validator,
            DefaultMessageInterpolatorAggregator defaultInterpolator,
            IMessageInterpolator userInterpolator /* nullable */)
        {
            if (constraintContext == null) throw new ArgumentNullException("constraintContext");
            if (results == null) throw new ArgumentNullException("results");
            if (@class == null) throw new ArgumentNullException("class");
            if (validator == null) throw new ArgumentNullException("valitor");
            if (defaultInterpolator == null) throw new ArgumentNullException("defaultInterpolator");

            this.constraintContext = constraintContext;
            this.results = results;
            this.@class = @class;
            this.propertyName = propertyName;
            this.value = value;
            this.entity = entity;
            this.validator = validator;
            this.defaultInterpolator = defaultInterpolator;
            this.userInterpolator = userInterpolator;
        }
        public void Interpolate()
        {
            var defrm = new ResourceManager(Environment.BaseNameOfMessageResource,
                                    typeof (DefaultMessageInterpolatorAggregator).Assembly);
            var custrm = new ResourceManager("NHibernate.Validator.Tests.Resource.Messages", Assembly.GetExecutingAssembly());
            var culture = new CultureInfo("en");

            var mia = new DefaultMessageInterpolatorAggregator();
            var dmi = new DefaultMessageInterpolator();
            mia.Initialize(custrm, defrm, culture);
            var va = new RangeValidator();
            var a = new RangeAttribute(2, 10);

            Assert.AreEqual(a.Message, mia.Interpolate(a.Message, new object(), va, dmi));

            mia.AddInterpolator(a, va);
            Assert.AreNotEqual(a.Message, mia.Interpolate(a.Message, new object(), va, dmi));
        }
        public void Serialization()
        {
            var defrm = new ResourceManager(Environment.BaseNameOfMessageResource,
                                            typeof (DefaultMessageInterpolatorAggregator).Assembly);
            var custrm = new ResourceManager("NHibernate.Validator.Tests.Resource.Messages", Assembly.GetExecutingAssembly());
            var culture = new CultureInfo("en");

            var mia = new DefaultMessageInterpolatorAggregator();

            mia.Initialize(custrm, defrm, culture);
            var a = new RangeAttribute(2, 10);
            var va = new RangeValidator();
            va.Initialize(a);
            mia.AddInterpolator(a, va);
            string originalMessage = mia.GetAttributeMessage(va);
            Assert.IsFalse(string.IsNullOrEmpty(originalMessage));
            using (var memory = new MemoryStream())
            {
                var formatter = new BinaryFormatter();
                formatter.Serialize(memory, mia);

                memory.Position = 0;
                var dmia = (DefaultMessageInterpolatorAggregator) formatter.Deserialize(memory);

                // follow instruction is what the owing a reference of interpolator must do
                dmia.Initialize(custrm, defrm, culture);

                Assert.AreEqual(originalMessage, dmia.GetAttributeMessage(va));
                /* TODO : To make the serialization of agregator really work we need a sort of
                 * "Validator ID" to make work the interpolators dictionary inside DefaultMessageInterpolatorAggregator.
                 * So far it work using the validator instance but after a deserialization the instance change
                 * so is imposible to find it again (change the reference).
                 * Consideration to create "Validator ID" are:
                 * - Each Validator is linked to a entity member
                 * - Each entity member have an instance of an attribute initialized with values.
                 * - A entity can have the same validator more than one time but with different attribute instance
                 *	(different values of Message for example).
                 *
                 * Note: if each Validator overrides Equals this test would pass, but it's too much invasive
                 */
            }
        }
示例#6
0
        /// <summary>
        /// Initialize the <see cref="ClassValidator"/> type.
        /// </summary>
        /// <param name="clazz"></param>
        /// <param name="nestedClassValidators"></param>
        private void InitValidator(System.Type clazz, IDictionary<System.Type, IClassValidator> nestedClassValidators)
        {
            entityValidators = new List<ValidatorDef>();
            membersToValidate = new List<Member>();
            childGetters = new List<MemberInfo>();
            defaultInterpolator = new DefaultMessageInterpolatorAggregator();
            defaultInterpolator.Initialize(messageBundle, defaultMessageBundle, culture);

            //build the class hierarchy to look for members in
            nestedClassValidators.Add(clazz, this);
            HashSet<System.Type> classes = new HashSet<System.Type>();
            AddSuperClassesAndInterfaces(clazz, classes);

            // Create the IClassMapping for each class of the validator
            var classesMaps = new List<IClassMapping>(classes.Count);
            foreach (System.Type type in classes)
            {
                IClassMapping mapping = factory.ClassMappingFactory.GetClassMapping(type, validatorMode);
                if (mapping != null)
                    classesMaps.Add(mapping);
                else
                    log.Warn("Validator not found in mode " + validatorMode + " for class " + clazz.AssemblyQualifiedName);
            }

            //Check on all selected classes
            foreach (IClassMapping map in classesMaps)
            {
                foreach (Attribute classAttribute in map.GetClassAttributes())
                {
                    ValidateClassAtribute(classAttribute);
                }

                foreach (MemberInfo member in map.GetMembers())
                {
                    var memberAttributes = map.GetMemberAttributes(member);
                    CreateMemberAttributes(member, memberAttributes);
                    CreateChildValidator(member, memberAttributes);

                    foreach (Attribute memberAttribute in memberAttributes)
                    {
                        IValidator propertyValidator = CreateOrGetValidator(memberAttribute);

                        if (propertyValidator != null)
                        {
                            var tagable = memberAttribute as ITagableRule;
                            membersToValidate.Add(new Member
                                                  	{
                                                  		ValidatorDef =
                                                  			new ValidatorDef(propertyValidator, tagable != null ? tagable.TagCollection : null),
                                                  		Getter = member
                                                  	});
                        }
                    }
                }
            }
        }
示例#7
0
        public ClassValidator(SerializationInfo info, StreamingContext ctxt)
        {
            var interpolatorType = (System.Type)info.GetValue("interpolator", typeof(System.Type));
            if(interpolatorType != null) userInterpolator = (IMessageInterpolator)Activator.CreateInstance(interpolatorType);
            entityType = (System.Type)info.GetValue("entityType", typeof(System.Type));
            entityValidators = (List<ValidatorDef>)info.GetValue("entityValidators", typeof(List<ValidatorDef>));
            membersToValidate = (List<Member>)info.GetValue("membersToValidate", typeof(List<Member>));
            childClassValidators = (IDictionary<System.Type, IClassValidator>)info.GetValue("childClassValidators", typeof(IDictionary<System.Type, IClassValidator>));
            childGetters = (List<MemberInfo>)info.GetValue("childGetters", typeof(List<MemberInfo>));
            membersAttributesDictionary =
                (Dictionary<MemberInfo, List<Attribute>>)
                info.GetValue("membersAttributesDictionary", typeof (Dictionary<MemberInfo, List<Attribute>>));
            defaultMessageBundle = GetDefaultResourceManager();
            messageBundle = GetDefaultResourceManager();

            culture = CultureInfo.CurrentCulture;
            defaultInterpolator = (DefaultMessageInterpolatorAggregator)info.GetValue("defaultInterpolator", typeof(DefaultMessageInterpolatorAggregator));
            defaultInterpolator.Initialize(messageBundle,defaultMessageBundle,culture);
        }