private JSchema ResolvedSchema(Uri schemaId, Uri resolvedSchemaId) { ResolveSchemaContext context = new ResolveSchemaContext { ResolverBaseUri = _baseUri, SchemaId = schemaId, ResolvedSchemaId = resolvedSchemaId }; SchemaReference schemaReference = _resolver.ResolveSchemaReference(context); if (schemaReference.BaseUri == _baseUri) { // reference is to inside the current schema // use normal schema resolution return(null); } if (Cache.ContainsKey(schemaReference.BaseUri)) { // base URI has already been resolved // use previously retrieved schema JSchema cachedSchema = Cache[schemaReference.BaseUri]; return(_resolver.GetSubschema(schemaReference, cachedSchema)); } Stream schemaData = _resolver.GetSchemaResource(context, schemaReference); if (schemaData == null) { // resolver returned no data return(null); } JSchemaReaderSettings settings = new JSchemaReaderSettings { BaseUri = schemaReference.BaseUri, Resolver = _resolver }; JSchemaReader schemaReader = new JSchemaReader(settings); schemaReader.Cache = Cache; JSchema rootSchema; using (StreamReader streamReader = new StreamReader(schemaData)) using (JsonTextReader jsonReader = new JsonTextReader(streamReader)) { rootSchema = schemaReader.ReadRoot(jsonReader, false); } Cache[schemaReference.BaseUri] = rootSchema; // resolve defered schemas after it has been cached to avoid // stackoverflow on circular references schemaReader.ResolveDeferedSchemas(); return(_resolver.GetSubschema(schemaReference, rootSchema)); }
public JSchema LoadSchema(string baseUrl = null, string version = null, string shortcut = null) { string vversion = string.IsNullOrEmpty(version) ? "unversioned" : "v" + version; Uri baseUri = null; if (string.IsNullOrEmpty(baseUrl)) { baseUri = new Uri($"https://schemas.stacspec.org/{vversion}/"); } else { baseUri = new Uri(baseUrl); } Uri schemaUri = null; bool isExtension = false; if (shortcut == "item" || shortcut == "catalog" || shortcut == "collection") { schemaUri = new Uri(baseUri, $"{shortcut}-spec/json-schema/{shortcut}.json"); } else if (shortcut == "item-collection") { return(ItemCollection.GenerateJSchema(version)); } else if (!string.IsNullOrEmpty(shortcut)) { if (shortcut == "proj") { // Capture a very common mistake and give a better explanation (see #4) throw new Exception("'stac_extensions' must contain 'projection instead of 'proj'."); } schemaUri = new Uri(baseUri, $"extensions/{shortcut}/json-schema/schema.json"); isExtension = true; } else { schemaUri = baseUri; } if (!string.IsNullOrEmpty(baseUrl) && schemaMap.ContainsKey(baseUrl)) { schemaUri = schemaMap[baseUrl]; } if (schemaCompiled.ContainsKey(schemaUri.ToString())) { return(schemaCompiled[schemaUri.ToString()]); } else { Stream stream = null; try { stream = jSchemaResolver.GetSchemaResource(null, new SchemaReference() { BaseUri = schemaUri }); } catch (Exception e) { throw new Stac.Exceptions.InvalidStacSchemaException(string.Format("Error getting schema at Uri '{0}'", schemaUri), e); } var sr = new StreamReader(stream); schemaCompiled[schemaUri.ToString()] = JSchema.Parse(sr.ReadToEnd(), jSchemaResolver); return(schemaCompiled[schemaUri.ToString()]); } }