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