@@ -105,19 +105,41 @@ private JDefinedClass populateClass(
105
105
JDefinedClass definedClass , Optional <JType > refType , Collection <JType > unionTypes ) {
106
106
JType clazzClass = definedClass .owner ()._ref (Object .class );
107
107
108
- JFieldVar valueField =
109
- definedClass .field (
110
- JMod .PRIVATE ,
111
- clazzClass ,
112
- ruleFactory .getNameHelper ().getPropertyName ("value" , null ),
113
- null );
108
+ Optional <JFieldVar > valueField ;
109
+ if (!unionTypes .isEmpty ()) {
110
+ valueField =
111
+ Optional .of (
112
+ definedClass .field (
113
+ JMod .PRIVATE ,
114
+ clazzClass ,
115
+ ruleFactory .getNameHelper ().getPropertyName ("value" , null ),
116
+ null ));
117
+
118
+ definedClass ._implements (
119
+ definedClass .owner ().ref (GeneratorUtils .ONE_OF_VALUE_PROVIDER_INTERFACE_NAME ));
114
120
115
- definedClass ._implements (
116
- definedClass .owner ().ref (GeneratorUtils .ONE_OF_VALUE_PROVIDER_INTERFACE_NAME ));
121
+ GeneratorUtils .implementInterface (definedClass , valueField .orElseThrow ());
117
122
118
- GeneratorUtils .implementInterface (definedClass , valueField );
123
+ try {
124
+ JDefinedClass serializer = generateSerializer (definedClass );
125
+ definedClass .annotate (JsonSerialize .class ).param ("using" , serializer );
126
+ } catch (JClassAlreadyExistsException ex ) {
127
+ // already serialized aware
128
+ }
129
+
130
+ try {
131
+ JDefinedClass deserializer = generateDeserializer (definedClass , unionTypes );
132
+ definedClass .annotate (JsonDeserialize .class ).param ("using" , deserializer );
133
+ } catch (JClassAlreadyExistsException ex ) {
134
+ // already deserialized aware
135
+ }
136
+ for (JType unionType : unionTypes ) {
137
+ wrapIt (definedClass , valueField , unionType );
138
+ }
139
+ } else {
140
+ valueField = Optional .empty ();
141
+ }
119
142
120
- unionTypes .forEach (unionType -> wrapIt (definedClass , valueField , unionType ));
121
143
refType .ifPresent (
122
144
type -> {
123
145
if (type instanceof JClass ) {
@@ -126,14 +148,16 @@ private JDefinedClass populateClass(
126
148
wrapIt (definedClass , valueField , type );
127
149
}
128
150
});
151
+
129
152
if (definedClass .constructors ().hasNext ()
130
153
&& definedClass .getConstructor (new JType [0 ]) == null ) {
131
154
definedClass .constructor (JMod .PUBLIC );
132
155
}
133
156
return definedClass ;
134
157
}
135
158
136
- private JDefinedClass generateSerializer (JDefinedClass relatedClass ) {
159
+ private JDefinedClass generateSerializer (JDefinedClass relatedClass )
160
+ throws JClassAlreadyExistsException {
137
161
JDefinedClass definedClass = GeneratorUtils .serializerClass (relatedClass );
138
162
GeneratorUtils .fillSerializer (
139
163
definedClass ,
@@ -150,7 +174,8 @@ private JDefinedClass generateSerializer(JDefinedClass relatedClass) {
150
174
}
151
175
152
176
private JDefinedClass generateDeserializer (
153
- JDefinedClass relatedClass , Collection <JType > unionTypes ) {
177
+ JDefinedClass relatedClass , Collection <JType > unionTypes )
178
+ throws JClassAlreadyExistsException {
154
179
JDefinedClass definedClass = GeneratorUtils .deserializerClass (relatedClass );
155
180
GeneratorUtils .fillDeserializer (
156
181
definedClass ,
@@ -173,33 +198,28 @@ private JDefinedClass generateDeserializer(
173
198
174
199
private JDefinedClass createUnionClass (
175
200
String nodeName , JPackage container , Optional <JType > refType , Collection <JType > unionTypes ) {
176
- final String className =
177
- ruleFactory .getNameHelper ().getUniqueClassName (nodeName , null , container );
178
201
try {
179
- JDefinedClass definedClass = container ._class (className );
180
- definedClass .annotate (JsonSerialize .class ).param ("using" , generateSerializer (definedClass ));
181
- definedClass
182
- .annotate (JsonDeserialize .class )
183
- .param ("using" , generateDeserializer (definedClass , unionTypes ));
184
-
185
- return populateClass (definedClass , refType , unionTypes );
202
+ return populateClass (
203
+ container ._class (
204
+ ruleFactory .getNameHelper ().getUniqueClassName (nodeName , null , container )),
205
+ refType ,
206
+ unionTypes );
186
207
} catch (JClassAlreadyExistsException e ) {
187
208
throw new IllegalArgumentException (e );
188
209
}
189
210
}
190
211
191
- private void wrapIt (JDefinedClass definedClass , JFieldVar valueField , JType unionType ) {
212
+ private void wrapIt (JDefinedClass definedClass , Optional < JFieldVar > valueField , JType unionType ) {
192
213
final String name = unionType .name ();
193
214
JFieldVar instanceField =
194
215
definedClass .field (
195
216
JMod .PRIVATE , unionType , ruleFactory .getNameHelper ().getPropertyName (name , null ));
196
217
GeneratorUtils .buildMethod (definedClass , instanceField , ruleFactory .getNameHelper (), name );
197
218
JMethod constructor = definedClass .constructor (JMod .PUBLIC );
198
219
JVar instanceParam = constructor .param (unionType , instanceField .name ());
199
- constructor
200
- .body ()
201
- .assign (JExpr ._this ().ref (valueField ), instanceParam )
202
- .assign (JExpr ._this ().ref (instanceField ), instanceParam );
220
+ JBlock body = constructor .body ();
221
+ valueField .ifPresent (v -> body .assign (JExpr ._this ().ref (v ), instanceParam ));
222
+ body .assign (JExpr ._this ().ref (instanceField ), instanceParam );
203
223
}
204
224
205
225
private void unionType (
0 commit comments