/// <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);
        }