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.IFieldInstance;
11  import gov.nist.secauto.metaschema.core.model.IFieldInstanceAbsolute;
12  import gov.nist.secauto.metaschema.core.model.IFlagInstance;
13  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
14  
15  import java.util.Set;
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 IFieldInstanceAbsolute}, which can be generated inline or as a JSON
23   * schema definition.
24   */
25  public class JsonSchemaPropertyField
26      extends AbstractJsonSchemaPropertyNamed<IFieldInstanceAbsolute> {
27    @NonNull
28    private final IJsonSchemaModelDefinition definitionSchema;
29    private final IFlagInstance jsonKey;
30  
31    /**
32     * Construct a new JSON schema property.
33     *
34     * @param instance
35     *          the instance to construct the property for
36     * @param state
37     *          the JSON generation state used to get JSON schema information
38     */
39    public JsonSchemaPropertyField(
40        @NonNull IFieldInstanceAbsolute instance,
41        @NonNull IJsonGenerationState state) {
42      super(instance, instance.getJsonName());
43      this.jsonKey = instance.getJsonKey();
44      this.definitionSchema = state.getFieldDefinition(
45          instance.getDefinition(),
46          jsonKey == null ? null : jsonKey.getQName());
47    }
48  
49    @Override
50    public boolean isRequired() {
51      return getInstance().getMinOccurs() > 0;
52    }
53  
54    @Override
55    public Stream<IJsonSchemaDefinable> collectDefinitions(
56        Set<IJsonSchemaDefinitionAssembly> visited,
57        IJsonGenerationState state) {
58      return definitionSchema.collectDefinitions(visited, state);
59    }
60  
61    @Override
62    protected void generateMetadata(ObjectNode obj, IJsonGenerationState state) {
63      IFieldInstance instance = getInstance();
64      JsonSchemaHelper.generateTitle(instance, obj);
65      JsonSchemaHelper.generateDescription(instance, obj);
66      // TODO: handle complex case?
67      JsonSchemaHelper.generateDefault(instance, obj);
68    }
69  
70    @Override
71    protected void generateBody(ObjectNode obj, IJsonGenerationState state) {
72      ICardinalityBehavior.behaviorFor(getInstance())
73          .generate(obj, getInstance(), CollectionUtil.singleton(definitionSchema), state);
74      assert !obj.isEmpty();
75    }
76  }