Exemplo n.º 1
0
 /// <summary>Serves as the default hash function.</summary>
 /// <returns>A hash code for the current object.</returns>
 public override int GetHashCode()
 {
     unchecked
     {
         var hashCode = SingleSchema?.GetHashCode() ?? 0;
         hashCode = (hashCode * 397) ^ (ArraySchemas?.GetCollectionHashCode() ?? 0);
         return(hashCode);
     }
 }
Exemplo n.º 2
0
 void IRefResolvable.RegisterSubschemas(SchemaRegistry registry, Uri currentUri)
 {
     if (SingleSchema != null)
     {
         SingleSchema.RegisterSubschemas(registry, currentUri);
     }
     else
     {
         foreach (var schema in ArraySchemas)
         {
             schema.RegisterSubschemas(registry, currentUri);
         }
     }
 }
Exemplo n.º 3
0
        /// <summary>
        /// Provides validation for the keyword.
        /// </summary>
        /// <param name="context">Contextual details for the validation process.</param>
        public void Validate(ValidationContext context)
        {
            if (context.LocalInstance.ValueKind != JsonValueKind.Array)
            {
                context.IsValid = true;
                return;
            }

            bool overwriteAnnotation = !(context.TryGetAnnotation(Name) is bool);
            var  overallResult       = true;

            if (SingleSchema != null)
            {
                for (int i = 0; i < context.LocalInstance.GetArrayLength(); i++)
                {
                    var item       = context.LocalInstance[i];
                    var subContext = ValidationContext.From(context,
                                                            context.InstanceLocation.Combine(PointerSegment.Create($"{i}")),
                                                            item);
                    SingleSchema.ValidateSubschema(subContext);
                    context.CurrentUri ??= subContext.CurrentUri;
                    overallResult &= subContext.IsValid;
                    if (!overallResult && context.ApplyOptimizations)
                    {
                        break;
                    }
                    context.NestedContexts.Add(subContext);
                }

                if (overwriteAnnotation)
                {
                    // TODO: add message
                    if (overallResult)
                    {
                        context.SetAnnotation(Name, true);
                    }
                }
            }
            else             // array
            {
                var maxEvaluations = Math.Min(ArraySchemas.Count, context.LocalInstance.GetArrayLength());
                for (int i = 0; i < maxEvaluations; i++)
                {
                    var schema     = ArraySchemas[i];
                    var item       = context.LocalInstance[i];
                    var subContext = ValidationContext.From(context,
                                                            context.InstanceLocation.Combine(PointerSegment.Create($"{i}")),
                                                            item,
                                                            context.SchemaLocation.Combine(PointerSegment.Create($"{i}")));
                    schema.ValidateSubschema(subContext);
                    overallResult &= subContext.IsValid;
                    if (!overallResult && context.ApplyOptimizations)
                    {
                        break;
                    }
                    context.NestedContexts.Add(subContext);
                }

                if (overwriteAnnotation)
                {
                    // TODO: add message
                    if (overallResult)
                    {
                        if (maxEvaluations == context.LocalInstance.GetArrayLength())
                        {
                            context.SetAnnotation(Name, true);
                        }
                        else
                        {
                            context.SetAnnotation(Name, maxEvaluations);
                        }
                    }
                }
            }

            context.IsValid = overallResult;
        }
Exemplo n.º 4
0
        /// <summary>
        /// Provides validation for the keyword.
        /// </summary>
        /// <param name="context">Contextual details for the validation process.</param>
        public void Validate(ValidationContext context)
        {
            context.EnterKeyword(Name);
            if (context.LocalInstance.ValueKind != JsonValueKind.Array)
            {
                context.WrongValueKind(context.LocalInstance.ValueKind);
                context.IsValid = true;
                return;
            }

            bool overwriteAnnotation = !(context.TryGetAnnotation(Name) is bool);
            var  overallResult       = true;

            if (SingleSchema != null)
            {
                context.Options.LogIndentLevel++;
                int startIndex;
                var annotation = context.TryGetAnnotation(PrefixItemsKeyword.Name);
                if (annotation == null)
                {
                    startIndex = 0;
                }
                else
                {
                    context.Log(() => $"Annotation from {PrefixItemsKeyword.Name}: {annotation}");
                    if (annotation is bool)
                    {
                        context.IsValid = true;
                        context.ExitKeyword(Name, context.IsValid);
                        return;
                    }

                    startIndex = (int)annotation;
                }

                for (int i = startIndex; i < context.LocalInstance.GetArrayLength(); i++)
                {
                    context.Log(() => $"Validating item at index {i}.");
                    var item       = context.LocalInstance[i];
                    var subContext = ValidationContext.From(context,
                                                            context.InstanceLocation.Combine(PointerSegment.Create($"{i}")),
                                                            item);
                    SingleSchema.ValidateSubschema(subContext);
                    context.CurrentUri ??= subContext.CurrentUri;
                    overallResult &= subContext.IsValid;
                    context.Log(() => $"Item at index {i} {subContext.IsValid.GetValidityString()}.");
                    if (!overallResult && context.ApplyOptimizations)
                    {
                        break;
                    }
                    context.NestedContexts.Add(subContext);
                }
                context.Options.LogIndentLevel--;

                if (overwriteAnnotation)
                {
                    // TODO: add message
                    if (overallResult)
                    {
                        context.SetAnnotation(Name, true);
                    }
                }
            }
            else             // array
            {
                if (context.Options.ValidatingAs == Draft.Draft202012)
                {
                    context.IsValid = false;
                    context.Message = $"Array form of {Name} is invalid for draft 2020-12 and later";
                    context.Log(() => $"Array form of {Name} is invalid for draft 2020-12 and later");
                    context.ExitKeyword(Name, context.IsValid);
                    return;
                }
                context.Options.LogIndentLevel++;
                var maxEvaluations = Math.Min(ArraySchemas !.Count, context.LocalInstance.GetArrayLength());
                for (int i = 0; i < maxEvaluations; i++)
                {
                    context.Log(() => $"Validating item at index {i}.");
                    var schema     = ArraySchemas[i];
                    var item       = context.LocalInstance[i];
                    var subContext = ValidationContext.From(context,
                                                            context.InstanceLocation.Combine(PointerSegment.Create($"{i}")),
                                                            item,
                                                            context.SchemaLocation.Combine(PointerSegment.Create($"{i}")));
                    schema.ValidateSubschema(subContext);
                    overallResult &= subContext.IsValid;
                    context.Log(() => $"Item at index {i} {subContext.IsValid.GetValidityString()}.");
                    if (!overallResult && context.ApplyOptimizations)
                    {
                        break;
                    }
                    context.NestedContexts.Add(subContext);
                }
                context.Options.LogIndentLevel--;

                if (overwriteAnnotation)
                {
                    // TODO: add message
                    if (overallResult)
                    {
                        if (maxEvaluations == context.LocalInstance.GetArrayLength())
                        {
                            context.SetAnnotation(Name, true);
                        }
                        else
                        {
                            context.SetAnnotation(Name, maxEvaluations);
                        }
                    }
                }
            }

            context.IsValid = overallResult;
            context.ExitKeyword(Name, context.IsValid);
        }