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.schema;
28
29 import com.fasterxml.jackson.databind.node.ObjectNode;
30
31 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupLine;
32 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupMultiline;
33 import gov.nist.secauto.metaschema.core.model.IDefinition;
34 import gov.nist.secauto.metaschema.schemagen.SchemaGenerationException;
35 import gov.nist.secauto.metaschema.schemagen.json.impl.JsonGenerationState;
36
37 import java.io.IOException;
38
39 import edu.umd.cs.findbugs.annotations.NonNull;
40
41 public abstract class AbstractDefinitionJsonSchema<D extends IDefinition>
42 extends AbstractDefineableJsonSchema {
43 @NonNull
44 private final D definition;
45
46 protected AbstractDefinitionJsonSchema(@NonNull D definition) {
47 this.definition = definition;
48 }
49
50 @NonNull
51 protected D getDefinition() {
52 return definition;
53 }
54
55 @Override
56 public boolean isInline(JsonGenerationState state) {
57 return state.isInline(getDefinition());
58 }
59
60 @Override
61 protected String generateDefinitionName(JsonGenerationState state) {
62 return state.getTypeNameForDefinition(definition, null);
63 }
64
65 protected abstract void generateBody(@NonNull JsonGenerationState state, @NonNull ObjectNode obj) throws IOException;
66
67 @Override
68 public void generateSchema(JsonGenerationState state, ObjectNode obj) {
69 D definition = getDefinition();
70
71 try {
72 generateTitle(definition, obj);
73 generateDescription(definition, obj);
74
75 generateBody(state, obj);
76 } catch (IOException ex) {
77 throw new SchemaGenerationException(ex);
78 }
79 }
80
81 public static void generateTitle(@NonNull IDefinition definition, @NonNull ObjectNode obj) {
82 String formalName = definition.getEffectiveFormalName();
83 if (formalName != null) {
84 obj.put("title", formalName);
85 }
86 }
87
88 public static void generateDescription(@NonNull IDefinition definition, @NonNull ObjectNode obj) {
89 MarkupLine description = definition.getDescription();
90
91 StringBuilder retval = null;
92 if (description != null) {
93 retval = new StringBuilder().append(description.toMarkdown());
94 }
95
96 MarkupMultiline remarks = definition.getRemarks();
97 if (remarks != null) {
98 if (retval == null) {
99 retval = new StringBuilder();
100 } else {
101 retval.append("\n\n");
102 }
103 retval.append(remarks.toMarkdown());
104 }
105 if (retval != null) {
106 obj.put("description", retval.toString());
107 }
108 }
109 }