1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.schemagen.json.property;
28
29 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
30 import com.fasterxml.jackson.databind.node.ObjectNode;
31
32 import gov.nist.secauto.metaschema.core.model.INamedInstance;
33 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
34 import gov.nist.secauto.metaschema.schemagen.json.impl.JsonGenerationState;
35 import gov.nist.secauto.metaschema.schemagen.json.schema.IJsonSchema;
36
37 import edu.umd.cs.findbugs.annotations.NonNull;
38
39 public abstract class AbstractJsonProperty<I extends INamedInstance> implements IJsonProperty<I> {
40 @NonNull
41 private final I instance;
42
43 public AbstractJsonProperty(@NonNull I instance) {
44 this.instance = instance;
45 }
46
47 @Override
48 public I getInstance() {
49 return instance;
50 }
51
52 @Override
53 public String getName() {
54 return getInstance().getJsonName();
55 }
56
57 protected abstract void generateBody(
58 @NonNull ObjectNode obj,
59 @NonNull JsonGenerationState state);
60
61 protected void generateSchemaOrRef(
62 @NonNull ObjectNode obj,
63 @NonNull JsonGenerationState state) {
64 INamedInstance instance = getInstance();
65 IJsonSchema schema = state.getSchema(instance.getDefinition());
66 schema.generateSchemaOrRef(state, obj);
67 }
68
69 @Override
70 public void generateProperty(PropertyCollection properties, JsonGenerationState state) {
71 ObjectNode contextObj = ObjectUtils.notNull(JsonNodeFactory.instance.objectNode());
72
73 generateBody(contextObj, state);
74
75 String name = getName();
76 properties.addProperty(name, contextObj);
77 if (isRequired()) {
78 properties.addRequired(name);
79 }
80 }
81
82 }