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