public override IEnumerable <ValidationMessage> GetValidationMessages(Dictionary <string, Dictionary <string, Operation> > entity, RuleContext context) { // get all operation objects that are either of get or post type var serviceDefinition = (ServiceDefinition)context.Root; var listOperations = entity.Values.SelectMany(opDict => opDict.Where(pair => pair.Key.ToLower().Equals("get") || pair.Key.ToLower().Equals("post"))); foreach (var opPair in listOperations) { // if the operation id is already of the type _list we can skip this check if (ListRegex.IsMatch(opPair.Value.OperationId)) { continue; } var violatingPath = ValidationUtilities.GetOperationIdPath(opPair.Value.OperationId, entity).Key; if (ValidationUtilities.IsXmsPageableResponseOperation(opPair.Value)) { yield return(new ValidationMessage(new FileObjectPath(context.File, context.Path.AppendProperty(violatingPath).AppendProperty(opPair.Key).AppendProperty("operationId")), this, opPair.Value.OperationId, XmsPageableViolation)); } else if (ValidationUtilities.IsArrayTypeResponseOperation(opPair.Value, serviceDefinition)) { yield return(new ValidationMessage(new FileObjectPath(context.File, context.Path.AppendProperty(violatingPath).AppendProperty(opPair.Key).AppendProperty("operationId")), this, opPair.Value.OperationId, ArrayTypeViolation)); } } }
public override IEnumerable <ValidationMessage> GetValidationMessages(Dictionary <string, Dictionary <string, Operation> > entity, RuleContext context) { // get all operation objects that are either of get or post type var serviceDefinition = (ServiceDefinition)context.Root; foreach (var pathObj in entity) { var listOpIds = pathObj.Value // operation should be a get or post .Where(pair => (pair.Key.ToLower().Equals("get") || pair.Key.ToLower().Equals("post"))) // operation id should be of the form *_list(by) .Where(pair => (ListByRegex.IsMatch(pair.Value.OperationId) || pair.Value.OperationId.ToLower().EndsWith("_list"))) // operation is xmspageable or returns an array .Where(pair => (ValidationUtilities.IsArrayTypeResponseOperation(pair.Value, serviceDefinition)) || (ValidationUtilities.IsXmsPageableResponseOperation(pair.Value))) // select the operation id .Select(pair => pair.Value.OperationId); // if there are no operations matching our conditions, skip if (IsNullOrEmpty(listOpIds)) { continue; } // populate valid list operation names for given path List <string> opNames = GetValidListOpNames(pathObj.Key); // if url does not match any of the predefined regexes, skip if (opNames == null || opNames.Count == 0) { continue; } // find if there are any operations that violate the rule var errOpIds = listOpIds.Where(opId => !opNames.Contains(opId.ToLower())); // no violations found, skip if (IsNullOrEmpty(errOpIds)) { continue; } // aggregate suggested op names in a single readable string for the formatter var suggestedNames = string.Join(", ", opNames); foreach (var errOpId in errOpIds) { yield return(new ValidationMessage(new FileObjectPath(context.File, context.Path), this, errOpId, suggestedNames)); } } }