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));
        }
Пример #2
0
        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()]);
            }
        }