1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.schemagen.json.impl;
7   
8   import com.fasterxml.jackson.databind.node.ObjectNode;
9   
10  import java.util.List;
11  import java.util.stream.Collectors;
12  import java.util.stream.Stream;
13  
14  import dev.metaschema.core.model.IFieldDefinition;
15  import dev.metaschema.core.model.IFieldInstanceGrouped;
16  import dev.metaschema.core.util.ObjectUtils;
17  import edu.umd.cs.findbugs.annotations.NonNull;
18  
19  /**
20   * Supports generation of a JSON schema based on a Metaschema
21   * {@link IFieldInstanceGrouped}, which can be generated inline or as a JSON
22   * schema definition.
23   */
24  public class JsonSchemaPropertyGroupedField
25      extends AbstractJsonSchemaPropertyGrouped<IFieldInstanceGrouped>
26      implements IJsonSchemaDefinitionField {
27    @NonNull
28    private final IDataTypeJsonSchema fieldValueDataType;
29    @NonNull
30    private final List<? extends IJsonSchemaPropertyNamed> nonValueProperties;
31  
32    /**
33     * Construct a new JSON schema property.
34     *
35     * @param instance
36     *          the instance to construct the property for
37     * @param state
38     *          the JSON generation state used to get JSON schema information
39     */
40    public JsonSchemaPropertyGroupedField(
41        @NonNull IFieldInstanceGrouped instance,
42        @NonNull IJsonGenerationState state) {
43      super(instance, state);
44      this.fieldValueDataType = state.getDataTypeSchemaForDefinition(instance.getDefinition());
45      this.nonValueProperties = ObjectUtils.notNull(Stream.concat(
46          getFlagProperties().stream(),
47          Stream.of(new DiscriminatorProperty()))
48          .collect(Collectors.toUnmodifiableList()));
49    }
50  
51    @Override
52    public IFieldDefinition getDefinition() {
53      return getInstance().getDefinition();
54    }
55  
56    @Override
57    public List<? extends IJsonSchemaPropertyNamed> getNonValueProperties() {
58      return nonValueProperties;
59    }
60  
61    @Override
62    public IDataTypeJsonSchema getFieldValue() {
63      return fieldValueDataType;
64    }
65  
66    @Override
67    public void generateBody(ObjectNode node, IJsonGenerationState state) {
68      JsonSchemaHelper.generateFieldBody(this, node, state);
69    }
70  }