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