/// <summary> /// Finds a subschema using the given schema reference. /// </summary> /// <param name="reference">The schema reference used to get the subschema.</param> /// <param name="rootSchema">The root schema to resolve the subschema from.</param> /// <returns>The matching subschema.</returns> public virtual JSchema GetSubschema(SchemaReference reference, JSchema rootSchema) { if (reference.SubschemaId == null) { return(rootSchema); } Uri rootSchemaId = reference.BaseUri; Uri subschemaId = reference.SubschemaId; JSchemaReader resolverSchemaReader = new JSchemaReader(new JSchemaReaderSettings { Resolver = this, BaseUri = rootSchema.BaseUri }); resolverSchemaReader.RootSchema = rootSchema; JSchema subSchema = null; SchemaDiscovery.FindSchema(s => subSchema = s, rootSchema, rootSchemaId, subschemaId, resolverSchemaReader); if (subSchema != null) { resolverSchemaReader.ResolveDeferedSchemas(); return(subSchema); } return(null); }
private void ResolveDeferedSchema(DeferedSchema deferedSchema) { Uri reference = deferedSchema.ResolvedReference; bool found = SchemaDiscovery.FindSchema(s => { // additional json copied to referenced schema // kind of hacky if (deferedSchema.ReferenceSchema._extensionData != null) { foreach (KeyValuePair <string, JToken> keyValuePair in deferedSchema.ReferenceSchema._extensionData.ToList()) { s.ExtensionData[keyValuePair.Key] = keyValuePair.Value; } } deferedSchema.SetResolvedSchema(s); }, RootSchema, RootSchema.Id, reference, this, ref _schemaDiscovery); if (found) { return; } JSchema resolvedSchema; try { resolvedSchema = ResolvedSchema(deferedSchema.ReferenceSchema.Reference, deferedSchema.ResolvedReference); } catch (Exception ex) { throw JSchemaReaderException.Create(deferedSchema.ReferenceSchema, _baseUri, deferedSchema.ReferenceSchema.Path, "Error when resolving schema reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, deferedSchema.ReferenceSchema.Reference), ex); } if (resolvedSchema != null) { deferedSchema.SetResolvedSchema(resolvedSchema); return; } throw JSchemaReaderException.Create(deferedSchema.ReferenceSchema, _baseUri, deferedSchema.ReferenceSchema.Path, "Could not resolve schema reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, deferedSchema.ResolvedReference)); }
/// <summary> /// Gets the schema for a given URI. /// </summary> /// <param name="uri">The schema URI to resolve.</param> /// <returns>The resolved schema.</returns> public override JSchema GetSchema(Uri uri) { foreach (KnownSchema knownSchema in _knownSchemas) { string uriText = uri.ToString(); string knownText = (knownSchema.Id != null) ? knownSchema.Id.ToString() : string.Empty; if (uriText == knownText) { return(knownSchema.Schema); } if (uriText.StartsWith(knownText, StringComparison.Ordinal)) { string relative = uriText.Substring(knownText.Length); Uri relativeUri = new Uri(relative, UriKind.RelativeOrAbsolute); JSchemaReader resolverSchemaReader = new JSchemaReader(this) { RootSchema = knownSchema.Schema }; JSchema subSchema = null; SchemaDiscovery.FindSchema(s => subSchema = s, knownSchema.Schema, knownSchema.Id, relativeUri, resolverSchemaReader); if (subSchema != null) { resolverSchemaReader.ResolveDeferedSchemas(); return(subSchema); } } } if (_resolver != null) { return(_resolver.GetSchema(uri)); } return(null); }
/// <summary> /// Finds a subschema using the given schema reference. /// </summary> /// <param name="reference">The schema reference used to get the subschema.</param> /// <param name="rootSchema">The root schema to resolve the subschema from.</param> /// <returns>The matching subschema.</returns> public virtual JSchema?GetSubschema(SchemaReference reference, JSchema rootSchema) { if (reference.SubschemaId == null) { return(rootSchema); } Uri?rootSchemaId = reference.BaseUri; Uri subschemaId = reference.SubschemaId; JSchemaReader?resolverSchemaReader = rootSchema.InternalReader; if (resolverSchemaReader == null) { resolverSchemaReader = new JSchemaReader(new JSchemaReaderSettings { Resolver = this, BaseUri = rootSchema.BaseUri }); resolverSchemaReader.RootSchema = rootSchema; } JSchema?subSchema = null; Uri?dynamicScope = null; // Might be a problem. Should dynamic scope be passed in? SchemaDiscovery.FindSchema(s => subSchema = s, rootSchema, rootSchemaId, subschemaId, subschemaId, dynamicScope, resolverSchemaReader, ref resolverSchemaReader._schemaDiscovery); if (subSchema != null) { resolverSchemaReader.ResolveDeferedSchemas(); resolverSchemaReader.RaiseValidationErrors(); return(subSchema); } return(null); }
private void ResolveDeferedSchema(DeferedSchema deferedSchema) { Uri reference = deferedSchema.ResolvedReference; bool found = SchemaDiscovery.FindSchema(s => { // additional json copied to referenced schema // kind of hacky if (deferedSchema.ReferenceSchema._extensionData != null) { foreach (KeyValuePair <string, JToken> keyValuePair in deferedSchema.ReferenceSchema._extensionData.ToList()) { s.ExtensionData[keyValuePair.Key] = keyValuePair.Value; } } deferedSchema.SetResolvedSchema(s); }, RootSchema, RootSchema.Id, reference, this); if (!found) { throw new JsonException("Could not resolve schema reference '{0}'.".FormatWith(CultureInfo.InvariantCulture, deferedSchema.ResolvedReference)); } }