/// <summary> /// Verify Common.Core.4017 /// </summary> /// <param name="context">Service context</param> /// <param name="info">out parameter to return violation information when rule fail</param> /// <returns>true if rule passes; false otherwise</returns> public override bool?Verify(ServiceContext context, out ExtensionRuleViolationInfo info) { if (context == null) { throw new ArgumentNullException("context"); } bool?passed = null; info = null; if (context.ResponseHttpHeaders.Contains(context.Version == ODataVersion.V4 ? Constants.V4OdataStreaming : Constants.OdataStreaming + @"=true")) { JObject jObj; context.ResponsePayload.TryToJObject(out jObj); List <XElement> normalProps = MetadataHelper.GetAllPropertiesOfEntity(context.MetadataDocument, context.EntityTypeShortName, MatchPropertyType.Normal); List <string> normalPropNames = (from normaP in normalProps select normaP.Attribute("Name").Value).ToList(); List <JProperty> annotations = new List <JProperty>(); JsonParserHelper.GetAnnotationsFromResponsePayload(jObj, context.Version, AnnotationType.ArrayOrPrimitive, ref annotations); foreach (var a in annotations) { passed = null; if (a.Name.Contains(Constants.OdataNavigationLinkPropertyNameSuffix) || a.Name.Contains(Constants.OdataAssociationLinkPropertyNameSuffix)) { passed = true; var prop = a.Next; while (prop != null) { if (prop.Type == JTokenType.Property && null != normalPropNames.Find(n => { return(n.Contains(a.Name)); })) { passed = false; break; } prop = prop.Next; } if (passed == false) { info = new ExtensionRuleViolationInfo(this.ErrorMessage, context.Destination, context.ResponsePayload); break; } } } } return(passed); }
/// <summary> /// Verify Common.Core.4122 /// </summary> /// <param name="context">Service context</param> /// <param name="info">out parameter to return violation information when rule fail</param> /// <returns>true if rule passes; false otherwise</returns> public override bool?Verify(ServiceContext context, out ExtensionRuleViolationInfo info) { if (context == null) { throw new ArgumentNullException("context"); } bool?passed = null; info = null; JObject jObj; context.ResponsePayload.TryToJObject(out jObj); List <JProperty> anns = new List <JProperty>(); JsonParserHelper.GetAnnotationsFromResponsePayload(jObj, context.Version, AnnotationType.Object, ref anns); foreach (JProperty ann in anns) { passed = null; if (ann.Parent.Type == JTokenType.Object) { passed = true; } else { passed = false; info = new ExtensionRuleViolationInfo(this.ErrorMessage, context.Destination, context.ResponsePayload); break; } } return(passed); }