001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.databind.io.json;
007
008import java.io.IOException;
009import java.util.HashSet;
010import java.util.Set;
011
012import dev.metaschema.core.model.IBoundObject;
013import dev.metaschema.core.model.util.JsonUtil;
014import dev.metaschema.databind.io.AbstractProblemHandler;
015import dev.metaschema.databind.model.IBoundDefinitionModelComplex;
016
017/**
018 * This problem handler implementation handles common issues when parsing
019 * JSON-based Metaschema module instances.
020 */
021public class DefaultJsonProblemHandler
022    extends AbstractProblemHandler
023    implements IJsonProblemHandler {
024  private static final String JSON_SCHEMA_FIELD_NAME = "$schema";
025  private static final Set<String> IGNORED_FIELD_NAMES;
026
027  static {
028    IGNORED_FIELD_NAMES = new HashSet<>();
029    IGNORED_FIELD_NAMES.add(JSON_SCHEMA_FIELD_NAME);
030  }
031
032  /**
033   * Construct a new problem handler with required field validation enabled.
034   */
035  public DefaultJsonProblemHandler() {
036    super();
037  }
038
039  /**
040   * Construct a new problem handler with the specified validation setting.
041   *
042   * @param validateRequiredFields
043   *          {@code true} to validate that required fields are present,
044   *          {@code false} to skip validation
045   */
046  public DefaultJsonProblemHandler(boolean validateRequiredFields) {
047    super(validateRequiredFields);
048  }
049
050  @Override
051  public boolean handleUnknownProperty(
052      IBoundDefinitionModelComplex classBinding,
053      IBoundObject targetObject,
054      String fieldName,
055      IJsonParsingContext parsingContext) throws IOException {
056    boolean retval = false;
057    if (IGNORED_FIELD_NAMES.contains(fieldName)) {
058      JsonUtil.skipNextValue(parsingContext.getReader(), parsingContext.getSource());
059      retval = true;
060    }
061    return retval;
062  }
063}