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.ArrayNode;
30 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
31 import com.fasterxml.jackson.databind.node.ObjectNode;
32
33 import gov.nist.secauto.metaschema.core.model.IValuedDefinition;
34 import gov.nist.secauto.metaschema.core.model.constraint.IAllowedValue;
35 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
36 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
37 import gov.nist.secauto.metaschema.schemagen.AbstractGenerationState.AllowedValueCollection;
38 import gov.nist.secauto.metaschema.schemagen.json.impl.JsonGenerationState;
39
40 import java.math.BigDecimal;
41 import java.math.BigInteger;
42 import java.math.MathContext;
43
44 import edu.umd.cs.findbugs.annotations.NonNull;
45
46 public class DataTypeRestrictionDefinitionJsonSchema
47 extends AbstractDefineableJsonSchema {
48 @NonNull
49 private final IValuedDefinition definition;
50 @NonNull
51 private final AllowedValueCollection allowedValuesCollection;
52
53 public DataTypeRestrictionDefinitionJsonSchema(
54 @NonNull IValuedDefinition definition,
55 @NonNull AllowedValueCollection allowedValuesCollection) {
56 this.definition = definition;
57 CollectionUtil.requireNonEmpty(allowedValuesCollection.getValues());
58 this.allowedValuesCollection = allowedValuesCollection;
59 }
60
61 @Override
62 public void resolveSubSchemas(JsonGenerationState state) {
63
64 }
65
66 @NonNull
67 protected IValuedDefinition getDefinition() {
68 return definition;
69 }
70
71 @NonNull
72 protected AllowedValueCollection getAllowedValuesCollection() {
73 return allowedValuesCollection;
74 }
75
76 @Override
77 public boolean isInline(JsonGenerationState state) {
78 return state.isInline(getDefinition());
79 }
80
81 @Override
82 protected String generateDefinitionName(JsonGenerationState state) {
83 return state.getTypeNameForDefinition(definition, "Value");
84 }
85
86 @Override
87 public void generateSchema(JsonGenerationState state, ObjectNode obj) {
88
89 ArrayNode enumArray = JsonNodeFactory.instance.arrayNode();
90
91 AllowedValueCollection allowedValuesCollection = getAllowedValuesCollection();
92 for (IAllowedValue allowedValue : allowedValuesCollection.getValues()) {
93 switch (getDefinition().getJavaTypeAdapter().getJsonRawType()) {
94 case STRING:
95 enumArray.add(allowedValue.getValue());
96 break;
97 case BOOLEAN:
98 enumArray.add(Boolean.parseBoolean(allowedValue.getValue()));
99 break;
100 case INTEGER:
101 enumArray.add(new BigInteger(allowedValue.getValue()));
102 break;
103 case NUMBER:
104 enumArray.add(new BigDecimal(allowedValue.getValue(), MathContext.DECIMAL64));
105 break;
106 default:
107 throw new UnsupportedOperationException(getDefinition().getJavaTypeAdapter().getJsonRawType().toString());
108 }
109 }
110
111 IJsonSchema dataTypeSchema = state.getSchema(getDefinition().getJavaTypeAdapter());
112
113
114
115
116 ArrayNode ofArray;
117 if (allowedValuesCollection.isClosed()) {
118
119 ofArray = obj.putArray("allOf");
120 } else {
121
122 ofArray = obj.putArray("anyOf");
123 }
124
125
126 dataTypeSchema.generateSchemaOrRef(state, ObjectUtils.notNull(ofArray.addObject()));
127
128 ofArray.addObject()
129 .set("enum", enumArray);
130 }
131 }