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.IFlagInstance;
11  
12  import java.util.Set;
13  import java.util.stream.Stream;
14  
15  import edu.umd.cs.findbugs.annotations.NonNull;
16  
17  /**
18   * Supports generation of a JSON schema based on a Metaschema
19   * {@link IFlagInstance}, which can be generated inline or as a JSON schema
20   * definition.
21   */
22  public class JsonSchemaPropertyFlag
23      extends AbstractJsonSchemaPropertyNamed<IFlagInstance>
24      implements IJsonSchemaPropertyFlag {
25    private final IJsonSchemaDefinition definitionSchema;
26  
27    /**
28     * Construct a new JSON schema property.
29     *
30     * @param instance
31     *          the instance to construct the property for
32     * @param state
33     *          the JSON generation state used to get JSON schema information
34     */
35    public JsonSchemaPropertyFlag(
36        @NonNull IFlagInstance instance,
37        @NonNull IJsonGenerationState state) {
38      super(instance, instance.getJsonName());
39      this.definitionSchema = state.getFlagDefinition(instance.getDefinition());
40    }
41  
42    @Override
43    public String getName() {
44      return getInstance().getJsonName();
45    }
46  
47    @Override
48    public boolean isRequired() {
49      return getInstance().isRequired();
50    }
51  
52    @Override
53    public Stream<IJsonSchemaDefinable> collectDefinitions(
54        Set<IJsonSchemaDefinitionAssembly> visited,
55        IJsonGenerationState state) {
56      return definitionSchema.collectDefinitions(visited, state);
57    }
58  
59    @Override
60    protected void generateMetadata(ObjectNode obj, IJsonGenerationState state) {
61      IFlagInstance instance = getInstance();
62      JsonSchemaHelper.generateTitle(instance, obj);
63      JsonSchemaHelper.generateDescription(instance, obj);
64      JsonSchemaHelper.generateDefault(instance, obj);
65    }
66  
67    @Override
68    protected void generateBody(ObjectNode obj, IJsonGenerationState state) {
69      definitionSchema.generateJsonSchemaOrDefinitionRef(obj, state);
70      assert !obj.isEmpty();
71    }
72  }