1919import com .fasterxml .jackson .annotation .JsonAnySetter ;
2020import com .fasterxml .jackson .annotation .JsonCreator ;
2121import com .fasterxml .jackson .annotation .JsonIgnore ;
22+ import com .fasterxml .jackson .annotation .JsonIgnoreProperties ;
23+ import com .fasterxml .jackson .annotation .JsonUnwrapped ;
2224import com .fasterxml .jackson .annotation .JsonValue ;
2325import com .fasterxml .jackson .databind .Module .SetupContext ;
2426import com .fasterxml .jackson .databind .annotation .JsonDeserialize ;
4345import io .github .classgraph .TypeArgument ;
4446import io .github .classgraph .TypeSignature ;
4547import io .serverlessworkflow .annotations .AdditionalProperties ;
48+ import io .serverlessworkflow .annotations .ExclusiveUnion ;
49+ import io .serverlessworkflow .annotations .InclusiveUnion ;
4650import io .serverlessworkflow .annotations .Item ;
4751import io .serverlessworkflow .annotations .ItemKey ;
4852import io .serverlessworkflow .annotations .ItemValue ;
49- import io .serverlessworkflow .annotations .Union ;
5053import java .io .File ;
5154import java .io .IOException ;
5255import java .io .PrintStream ;
@@ -110,7 +113,8 @@ public void execute() throws MojoExecutionException, MojoFailureException {
110113 ._class ("JacksonMixInModule" )
111114 ._extends (SimpleModule .class )
112115 .method (JMod .PUBLIC , codeModel .VOID , SETUP_METHOD );
113- processAnnotatedClasses (result , Union .class , this ::buildUnionMixIn );
116+ processAnnotatedClasses (result , ExclusiveUnion .class , this ::buildExclusiveUnionMixIn );
117+ processAnnotatedClasses (result , InclusiveUnion .class , this ::buildInclusiveUnionMixIn );
114118 processAnnotatedClasses (result , AdditionalProperties .class , this ::buildAdditionalPropsMixIn );
115119 processAnnotatedClasses (result , Item .class , this ::buildItemMixIn );
116120 processAnnotatedClasses (result .getAllEnums (), this ::buildEnumMixIn );
@@ -188,7 +192,7 @@ private void buildItemMixIn(ClassInfo classInfo, JDefinedClass mixClass)
188192 GeneratorUtils .generateDeserializer (rootPackage , relClass , getReturnType (valueMethod )));
189193 }
190194
191- private void buildUnionMixIn (ClassInfo unionClassInfo , JDefinedClass unionMixClass )
195+ private void buildExclusiveUnionMixIn (ClassInfo unionClassInfo , JDefinedClass unionMixClass )
192196 throws JClassAlreadyExistsException {
193197 JClass unionClass = codeModel .ref (unionClassInfo .getName ());
194198 unionMixClass
@@ -199,13 +203,26 @@ private void buildUnionMixIn(ClassInfo unionClassInfo, JDefinedClass unionMixCla
199203 .param (
200204 "using" ,
201205 GeneratorUtils .generateDeserializer (
202- rootPackage , unionClass , getUnionClasses (unionClassInfo )));
206+ rootPackage , unionClass , getUnionClasses (ExclusiveUnion .class , unionClassInfo )));
207+ }
208+
209+ private void buildInclusiveUnionMixIn (ClassInfo unionClassInfo , JDefinedClass unionMixClass )
210+ throws JClassAlreadyExistsException {
211+ Collection <JClass > unionClasses = getUnionClasses (InclusiveUnion .class , unionClassInfo );
212+ for (MethodInfo methodInfo : unionClassInfo .getMethodInfo ()) {
213+ JClass typeClass = getReturnType (methodInfo );
214+ if (unionClasses .contains (typeClass )) {
215+ JMethod method = unionMixClass .method (JMod .ABSTRACT , typeClass , methodInfo .getName ());
216+
217+ method .annotate (JsonUnwrapped .class );
218+ method .annotate (JsonIgnoreProperties .class ).param ("ignoreUnknown" , true );
219+ }
220+ }
203221 }
204222
205223 private void buildEnumMixIn (ClassInfo classInfo , JDefinedClass mixClass )
206224 throws JClassAlreadyExistsException {
207225 mixClass .method (JMod .ABSTRACT , String .class , "value" ).annotate (JsonValue .class );
208-
209226 JMethod staticMethod =
210227 mixClass .method (JMod .STATIC , codeModel .ref (classInfo .getName ()), "fromValue" );
211228 staticMethod .param (String .class , "value" );
@@ -217,8 +234,9 @@ private JDefinedClass createMixInClass(ClassInfo classInfo) throws JClassAlready
217234 return rootPackage ._class (JMod .ABSTRACT , classInfo .getSimpleName () + "MixIn" );
218235 }
219236
220- private Collection <JClass > getUnionClasses (ClassInfo unionClassInfo ) {
221- AnnotationInfo info = unionClassInfo .getAnnotationInfoRepeatable (Union .class ).get (0 );
237+ private Collection <JClass > getUnionClasses (
238+ Class <? extends Annotation > annotation , ClassInfo unionClassInfo ) {
239+ AnnotationInfo info = unionClassInfo .getAnnotationInfoRepeatable (annotation ).get (0 );
222240 Object [] unionClasses = (Object []) info .getParameterValues ().getValue ("value" );
223241 return Stream .of (unionClasses )
224242 .map (AnnotationClassRef .class ::cast )
0 commit comments