docs: @Override
      public SchemaDocument get( String uri,
                                 Problems problems ) {
          if (uri == null) {
              throw new IllegalArgumentException("The 'uri' parameter may not be null");
          }
  
          // Check the cache first ...
          SchemaDocument result = schemaDocumentsByUri.get(uri);
          if (result != null) {
              return result;
          }
  
          // Find the JSON Schema document ...
          Document doc = jsonSchemaDocuments.get(uri);
          if (doc == null) {
              problems.recordError(Paths.rootPath(), "Unable to find the JSON Schema document for '" + uri + "'");
              return null;
          }
  
          // Validate the JSON document, if required ...
          String id = doc.getString("id");
          String schemaRef = doc.getString("$schema");
          if (schemaRef == null) {
              schemaRef = defaultMetaSchemaUri;
          }
          if (!schemaRef.equals(id)) {
              // This is not the meta-schema, so we need to validate it ...
              SchemaDocument schemaOfSchema = get(schemaRef, problems);
              Document schemaOfSchemaDoc = schemaOfSchema.getDocument();
              schemaOfSchema.getValidator().validate(null, null, schemaOfSchemaDoc, Paths.rootPath(), problems, this);
          }
  
          // The schema was valid ...
          URI schemaRefUri = null;
          try {
              schemaRefUri = new URI(uri);
          } catch (URISyntaxException e) {
              problems.recordWarning(Paths.path("$schema"), "The URI of the referenced schema '" + uri + "' is not a valid URI");
          }
  
          // Now build a validator for this JSON Schema (if we can) ...
          Validator validator = createFactory(schemaRefUri, problems).create(doc, Paths.rootPath());
          if (validator != null) {
              // Create the schema representation and cache it ...
              result = new SchemaDocument(schemaRef, doc, validator);
              schemaDocumentsByUri.put(uri, result);
          }
  
          return result;
      }