1   
2   
3   
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  
22  
23  
24  
25  public class JsonSchemaPropertyField
26      extends AbstractJsonSchemaPropertyNamed<IFieldInstanceAbsolute> {
27    @NonNull
28    private final IJsonSchemaModelDefinition definitionSchema;
29    private final IFlagInstance jsonKey;
30  
31    
32  
33  
34  
35  
36  
37  
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      
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  }