1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.databind.io.json;
7   
8   import java.io.IOException;
9   import java.util.HashSet;
10  import java.util.Set;
11  
12  import dev.metaschema.core.model.IBoundObject;
13  import dev.metaschema.core.model.util.JsonUtil;
14  import dev.metaschema.databind.io.AbstractProblemHandler;
15  import dev.metaschema.databind.model.IBoundDefinitionModelComplex;
16  
17  /**
18   * This problem handler implementation handles common issues when parsing
19   * JSON-based Metaschema module instances.
20   */
21  public class DefaultJsonProblemHandler
22      extends AbstractProblemHandler
23      implements IJsonProblemHandler {
24    private static final String JSON_SCHEMA_FIELD_NAME = "$schema";
25    private static final Set<String> IGNORED_FIELD_NAMES;
26  
27    static {
28      IGNORED_FIELD_NAMES = new HashSet<>();
29      IGNORED_FIELD_NAMES.add(JSON_SCHEMA_FIELD_NAME);
30    }
31  
32    /**
33     * Construct a new problem handler with required field validation enabled.
34     */
35    public DefaultJsonProblemHandler() {
36      super();
37    }
38  
39    /**
40     * Construct a new problem handler with the specified validation setting.
41     *
42     * @param validateRequiredFields
43     *          {@code true} to validate that required fields are present,
44     *          {@code false} to skip validation
45     */
46    public DefaultJsonProblemHandler(boolean validateRequiredFields) {
47      super(validateRequiredFields);
48    }
49  
50    @Override
51    public boolean handleUnknownProperty(
52        IBoundDefinitionModelComplex classBinding,
53        IBoundObject targetObject,
54        String fieldName,
55        IJsonParsingContext parsingContext) throws IOException {
56      boolean retval = false;
57      if (IGNORED_FIELD_NAMES.contains(fieldName)) {
58        JsonUtil.skipNextValue(parsingContext.getReader(), parsingContext.getSource());
59        retval = true;
60      }
61      return retval;
62    }
63  }