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.IAssemblyInstance;
11  import gov.nist.secauto.metaschema.core.model.IAssemblyInstanceAbsolute;
12  import gov.nist.secauto.metaschema.core.model.IFlagInstance;
13  import gov.nist.secauto.metaschema.core.util.CollectionUtil;
14  import gov.nist.secauto.metaschema.core.util.ObjectUtils;
15  
16  import java.util.Set;
17  import java.util.stream.Stream;
18  
19  import edu.umd.cs.findbugs.annotations.NonNull;
20  import nl.talsmasoftware.lazy4j.Lazy;
21  
22  
23  
24  
25  
26  
27  public class JsonSchemaPropertyAssembly
28      extends AbstractJsonSchemaPropertyNamed<IAssemblyInstanceAbsolute> {
29    @NonNull
30    private final Lazy<IJsonSchemaModelDefinition> definitionSchema;
31    private final IFlagInstance jsonKey;
32  
33    
34  
35  
36  
37  
38  
39  
40  
41    public JsonSchemaPropertyAssembly(
42        @NonNull IAssemblyInstanceAbsolute instance,
43        @NonNull IJsonGenerationState state) {
44      super(instance, instance.getJsonName());
45      this.jsonKey = instance.getJsonKey();
46      this.definitionSchema = ObjectUtils.notNull(Lazy.lazy(() -> state.getAssemblyDefinition(
47          instance.getDefinition(),
48          jsonKey == null ? null : jsonKey.getQName())));
49    }
50  
51    @Override
52    public boolean isRequired() {
53      return getInstance().getMinOccurs() > 0;
54    }
55  
56    @NonNull
57    private IJsonSchemaModelDefinition getDefinitionSchema() {
58      return ObjectUtils.notNull(definitionSchema.get());
59    }
60  
61    @Override
62    protected void generateMetadata(ObjectNode obj, IJsonGenerationState state) {
63      IAssemblyInstance instance = getInstance();
64      JsonSchemaHelper.generateTitle(instance, obj);
65      JsonSchemaHelper.generateDescription(instance, obj);
66    }
67  
68    @Override
69    protected void generateBody(ObjectNode obj, IJsonGenerationState state) {
70      ICardinalityBehavior.behaviorFor(getInstance())
71          .generate(obj, getInstance(), CollectionUtil.singleton(getDefinitionSchema()), state);
72      assert !obj.isEmpty();
73    }
74  
75    @Override
76    public Stream<IJsonSchemaDefinable> collectDefinitions(
77        Set<IJsonSchemaDefinitionAssembly> visited,
78        IJsonGenerationState state) {
79      return getDefinitionSchema().collectDefinitions(visited, state);
80    }
81  }