using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using Spring.Objects.Factory; using Spring.Validation; using Spring.Validation.Actions; using Spring.Validation.Config; using Spring.Validation.Validators; using Sleis.Utility; using System.Web.Mvc; using Spring.Expressions; using Spring.Objects; using Sleis.ViewModels; using Sleis.Models; namespace Sleis.Validation.Spring { public class ObjectValidator : BaseValidationObject { public IValidator Validator { get; set; } public IDictionary Vars { get; set; } public new void Init() { base.Init(); ArgumentValidationUtility.ThrowOnNull(Validator, "Null AuditDao"); } public bool Validate(object obj, ModelStateDictionary state) { Log.DebugFormat("Method: {0} Args: {1}", MethodBase.GetCurrentMethod(), obj, state); //Clear all UI errors to make sure we use only spring validation here. foreach (ModelState model in state.Values) { model.Errors.Clear(); } List errors = Validate(obj); foreach (RuleError error in errors) { Log.DebugFormat("Error: {0}", error.MessageProvider); //Add to view model and replac any not set context placeholdeers state.AddModelError(error.MessageProvider, error.Message); } return state.IsValid; } public List Validate(object obj) { Log.DebugFormat("Method: {0} Arg: {1}", MethodBase.GetCurrentMethod(), obj); List resultErrors = new List(); IValidationErrors validationErrors = new ValidationErrors(); AgencyReport report = obj is ItemViewBase ? ((ItemViewBase)obj).Report : obj is ReportValidationView ? ((ReportValidationView)obj).FacilityIdentity.Report : obj is ImportSummaryViewModel ? ((ImportSummaryViewModel)obj).Report : null; FacilityModel facility = obj is ReportValidationView ? ((ReportValidationView)obj).FacilityIdentity.Facility : null; Dictionary contextParams = new Dictionary(); contextParams.Add("Report", report); contextParams.Add("Facility", facility); contextParams.Add("OriginalContext", obj); try { if (!Validator.Validate(obj, contextParams, validationErrors) && !validationErrors.IsEmpty) { foreach (string providerName in validationErrors.Providers) { Log.DebugFormat("Provider: {0}", providerName); foreach (ErrorMessage error in validationErrors.GetErrors(providerName)) { Log.DebugFormat("Error: {0} {1}", providerName, error); string errMsg = Messages.Get(error.Id); if (String.IsNullOrEmpty(errMsg) || errMsg.Trim().Length < 1) { errMsg = "Error message not defined"; } else { if (error.Parameters != null && error.Parameters.Length > 0) { errMsg = String.Format(errMsg, error.Parameters); } } Log.DebugFormat("Provider: {0} Message: {1}", providerName, errMsg); resultErrors.Add(new RuleError(providerName, errMsg)); } } } } catch (Exception ex) { Log.ErrorFormat("Validation rule bug while validating {0}", obj); throw new ApplicationException("Validation bug", ex); } return resultErrors; } } }