17
17
18
18
import com .fasterxml .jackson .databind .JsonNode ;
19
19
import com .sun .codemodel .JDefinedClass ;
20
+ import com .sun .codemodel .JExpr ;
21
+ import com .sun .codemodel .JFieldVar ;
22
+ import com .sun .codemodel .JMethod ;
23
+ import com .sun .codemodel .JMod ;
24
+ import com .sun .codemodel .JType ;
20
25
import org .jsonschema2pojo .Schema ;
21
26
import org .jsonschema2pojo .rules .AdditionalPropertiesRule ;
22
27
import org .jsonschema2pojo .rules .Rule ;
28
+ import org .jsonschema2pojo .rules .RuleFactory ;
29
+ import org .jsonschema2pojo .util .NameHelper ;
23
30
24
31
public class UnevaluatedPropertiesRule extends AdditionalPropertiesRule
25
32
implements Rule <JDefinedClass , JDefinedClass > {
26
33
27
- public UnevaluatedPropertiesRule (UnreferencedFactory unreferencedFactory ) {
28
- super (unreferencedFactory );
34
+ private RuleFactory ruleFactory ;
35
+
36
+ public UnevaluatedPropertiesRule (RuleFactory ruleFactory ) {
37
+ super (ruleFactory );
38
+ this .ruleFactory = ruleFactory ;
29
39
}
30
40
31
41
public JDefinedClass apply (
@@ -35,8 +45,54 @@ public JDefinedClass apply(
35
45
|| (node == null && parent .has ("properties" ))) {
36
46
// no additional properties allowed
37
47
return jclass ;
48
+ } else if (node != null
49
+ && checkIntValue (parent , "maxProperties" , 1 )
50
+ && checkIntValue (parent , "minProperties" , 1 )) {
51
+ return addKeyValueFields (jclass , node , parent , nodeName , schema );
38
52
} else {
39
53
return super .apply (nodeName , node , parent , jclass , schema );
40
54
}
41
55
}
56
+
57
+ private JDefinedClass addKeyValueFields (
58
+ JDefinedClass jclass , JsonNode node , JsonNode parent , String nodeName , Schema schema ) {
59
+ NameHelper nameHelper = ruleFactory .getNameHelper ();
60
+ JType stringClass = jclass .owner ()._ref (String .class );
61
+ JFieldVar nameField = GeneratorUtils .addGetter (jclass , stringClass , nameHelper , "name" );
62
+ JType propertyType ;
63
+ if (node != null && node .size () != 0 ) {
64
+ String pathToAdditionalProperties ;
65
+ if (schema .getId ().getFragment () == null ) {
66
+ pathToAdditionalProperties = "#/additionalProperties" ;
67
+ } else {
68
+ pathToAdditionalProperties = "#" + schema .getId ().getFragment () + "/additionalProperties" ;
69
+ }
70
+ Schema additionalPropertiesSchema =
71
+ ruleFactory
72
+ .getSchemaStore ()
73
+ .create (
74
+ schema ,
75
+ pathToAdditionalProperties ,
76
+ ruleFactory .getGenerationConfig ().getRefFragmentPathDelimiters ());
77
+ propertyType =
78
+ ruleFactory
79
+ .getSchemaRule ()
80
+ .apply (nodeName + "Property" , node , parent , jclass , additionalPropertiesSchema );
81
+ additionalPropertiesSchema .setJavaTypeIfEmpty (propertyType );
82
+ } else {
83
+ propertyType = jclass .owner ().ref (Object .class );
84
+ }
85
+ JFieldVar valueField =
86
+ GeneratorUtils .addGetter (jclass , propertyType , nameHelper , propertyType .name ());
87
+ JMethod constructor = jclass .constructor (JMod .PUBLIC );
88
+ constructor
89
+ .body ()
90
+ .assign (JExpr ._this ().ref (nameField ), constructor .param (stringClass , nameField .name ()))
91
+ .assign (JExpr ._this ().ref (valueField ), constructor .param (propertyType , valueField .name ()));
92
+ return jclass ;
93
+ }
94
+
95
+ private boolean checkIntValue (JsonNode node , String propName , int value ) {
96
+ return node .has (propName ) && node .get (propName ).asInt () == value ;
97
+ }
42
98
}
0 commit comments