/// <summary> /// Verify the code rule /// </summary> /// <param name="context">Service context</param> /// <param name="info">out paramater 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; // for each entry within the collection (feed) // to check its __metadata.etag value (if existent) is the same as ETag header in the single entry response that would have been requested JObject feed; context.ResponsePayload.TryToJObject(out feed); ODataVersion version = JsonParserHelper.GetPayloadODataVersion(feed); var entries = JsonParserHelper.GetEntries(feed); int indexEntry = 0; int count = entries.Count; foreach (JObject e in entries) { var etag = e.GetPropertyOfElement("__metadata", "etag"); bool etagInPlace = etag != null; if (etagInPlace) { var targetSingleEntry = e.GetPropertyOfElement("__metadata", "uri"); // get the ETag header value for the entry var etagInSingleEntry = WebResponseHelper.GetETagOfEntry(targetSingleEntry, Constants.AcceptHeaderAtom); JSconSchemaBuilder builder; if (version == ODataVersion.V2) { builder = new JSconSchemaBuilder(jschemaV2Header, jschemaV2Tail); } else { builder = new JSconSchemaBuilder(jschemaV1Header, jschemaV1Tail); } for (int i = 0; i < indexEntry; i++) { builder.AddItem("{},"); } var etagLiteral = StringHelper.ToLiteral(etagInSingleEntry); string entryCore = string.Format(entryCoreFormat, etagLiteral); builder.AddItem(entryCore); for (int i = indexEntry + 1; i < count; i++) { builder.AddItem(",{}"); } var jSchema = builder.GetProduct(); RuleEngine.TestResult result = null; passed = JsonParserHelper.ValidateJson(jSchema, context.ResponsePayload, out result); if (!passed.Value) { info = new ExtensionRuleViolationInfo(this.ErrorMessage, context.Destination, context.ResponsePayload, result != null ? result.LineNumberInError : -1); break; } } indexEntry++; } return passed; }
/// <summary> /// Verify the code rule /// </summary> /// <param name="context">Service context</param> /// <param name="info">out paramater 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; // for each entry within the collection (feed) // to check its __metadata.etag value (if existent) is the same as ETag header in the single entry response that would have been requested JObject feed; context.ResponsePayload.TryToJObject(out feed); ODataVersion version = JsonParserHelper.GetPayloadODataVersion(feed); var entries = JsonParserHelper.GetEntries(feed); int indexEntry = 0; int count = entries.Count; foreach (JObject e in entries) { var etag = e.GetPropertyOfElement("__metadata", "etag"); bool etagInPlace = etag != null; if (etagInPlace) { var targetSingleEntry = e.GetPropertyOfElement("__metadata", "uri"); // get the ETag header value for the entry var etagInSingleEntry = WebResponseHelper.GetETagOfEntry(targetSingleEntry, Constants.AcceptHeaderAtom); JSconSchemaBuilder builder; if (version == ODataVersion.V2) { builder = new JSconSchemaBuilder(jschemaV2Header, jschemaV2Tail); } else { builder = new JSconSchemaBuilder(jschemaV1Header, jschemaV1Tail); } for (int i = 0; i < indexEntry; i++) { builder.AddItem("{},"); } var etagLiteral = StringHelper.ToLiteral(etagInSingleEntry); string entryCore = string.Format(entryCoreFormat, etagLiteral); builder.AddItem(entryCore); for (int i = indexEntry + 1; i < count; i++) { builder.AddItem(",{}"); } var jSchema = builder.GetProduct(); RuleEngine.TestResult result = null; passed = JsonParserHelper.ValidateJson(jSchema, context.ResponsePayload, out result); if (!passed.Value) { info = new ExtensionRuleViolationInfo(this.ErrorMessage, context.Destination, context.ResponsePayload, result != null ? result.LineNumberInError : -1); break; } } indexEntry++; } return(passed); }